C语言博客作业04--数组

| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C语言博客作业04--数组 |
| 这个作业的目标 | 学习数组相关内容 |
| 姓名 | 雷正伟 |

0.PTA得分

1.本章学习总结

1.1 学习内容总结

1.11 查找数据

二分法查找
二分法查找

  • 优点:查找效率高
  • 缺点:要求数组必须有序

顺序法(普通)查找
普通法查找

  • 优点:数组不要求有序
  • 缺点:数组数据较大时,查找效率低

1.12 插入数据

PTA题目:简化的插入排序
简化的插入排序
代码以及调试结果
简化的插入排序

1.12 删除数据

**PTA题目:数组元素的删除 **
数组元素的删除
代码实现

#include<stdio.h>
#define max 100
int main()
{
    int a[max], n, m, num, flag;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    scanf("%d", &num);
    flag = num;
    while (num--)
    {
        scanf("%d", &m);
        for (int i = m - 1; i < n; i++)
        {
            a[i] = a[i + 1];
        }
    }
    for (int i = 0; i < n - flag; i++)
    {
        if (i == n - flag - 1)
        {
            printf("%d", a[i]);
        }
        else
        {
            printf("%d ", a[i]);
        }
    }
    return 0;
}

1.12 数组的排序

冒泡法排序

原理:
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数
  3. 针对所有的元素重复以上的步骤,除了最后一个
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
  • 这里引用一个GIF图更清晰的理解冒泡法排序
    冒泡法排序

PTA题目:冒泡法排序
冒泡法排序
代码实现

#include <stdio.h>
int main()
{
	int N, K, i, j;
	int count = 0;
	int temp;
	int a[100];
	scanf("%d %d", &N, &K);
	for (i = 0;i < N;i++)
	{
		scanf("%d", &a[i]);
	}
	for (i = 0;i < N;i++)      //重复比较至排序结束
	{
		for (j = 0;j < N - i - 1;j++)    //比较元素大小
		{
			if (a[j + 1] < a[j])
			{                     //前一个比第二个元素大则交换
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
		count++;
		if (count == K)
			break;
	}
	for (i = 0;i < N;i++)
	{
		if (i < N - 1)
			printf("%d ", a[i]);
		else
			printf("%d", a[i]);
	}
	return 0;
}

但是当一个数组的数据较多时冒泡法排序就会很不实用

选择法排序

  • GIF图举例
    选择法排序
    PTA题目:选择法排序
    选择法排序
    代码实现
#include<stdio.h>  
int main()
{
    int n, i, index, temp;
    int a[11];
    scanf("%d", &n);
    for (i = 0;i < n;i++)
        scanf("%d", &a[i]);
    for (i = 1;i < n;i++)
    {
        for (index = 0;index < n - i;index++)
        {
            if (a[index] < a[index + 1])
            {                 //后一个数比前一个数大则交换
                temp = a[index];
                a[index] = a[index + 1];
                a[index + 1] = temp;
            }
        }
    }
    for (i = 0;i < n;i++)
    {
        if (i < n - 1)
        {
            printf("%d ", a[i]);
        }
        else
        {
            printf("%d\n", a[n - 1]);
        }
    }
    return 0;
}

1.13哈希数组

PTA题目:有重复的数据I
有重复的数据I
代码实现

#include<stdio.h>
#define MAX 100001
int SameData(int n);
int main()
{
	int n;
	scanf("%d", &n);
	if (SameData(n))
	{
		printf("YES");
	}
	else
	{
		printf("NO");
	}
	return 0;
}

int SameData(int n)
{
	static int a[MAX];
	int i, data;
	for (i = 1;i <= n;i++)
	{
		scanf("%d", &data);
		if (a[data] == 1)
		{
			return 1;
		}
		else
		{
			a[data] = 1;
		}
	}
	return 0;
}

1.14字符数组

字符数组的存储

字符串可以存放在一维数组中,例如:

static char s[6]={'H','a','p','p','y','\0'};

也可以使用字符串常量,例如上述代码等价于:

static char s[6]={"Happy"};

static char s[6]="Happy";

将字符串存入数组时,由于它有一个结束符'\0',数组长度至少是字符串的有效长度+1。如果数组长度大于字符串的有效长度+1,则数组中除了存入的字符串,还有其他内容,即字符串只占用数组的一部分。

  • 字符串由有效字符和字符串结束符'\0'组成

字符输入的函数

fgets()函数

描述:C 库函数 char *fgets(char *str, int n, FILE *stream) 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

函数声明
char *fgets(char *str, int n, FILE *stream) 
posted @ 2020-12-13 22:12  Lzwx2  阅读(190)  评论(0编辑  收藏  举报