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

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

0.展示PTA总分


1.本章学习总结

1.1 学习内容总结

数组中如何查找数据,有哪些做法
顺序查找:不需要排序,遍历所有数组元素,查找时间较长。
二分法查找:需要对所有数据进行排序,适合顺序结构。因为每次都是和中间值比较,如果大于选中间值后面的部分继续二分查找,如果小于中间值则选前面的部分继续执行。例如:

#include <stdio.h>
#define M 10
void main()
{
  static int a[M]={-12,0,6,16,23,56,80,100,110,115};
  int n,low,mid,high,found;
  low=0;
  high=M-1;
  found=0;
  printf("Input a number to be searched:");
  scanf("%d",&n);
  while(low<=high)
    {
     mid=(low+high)/2;
     if(n==a[mid]) {found=1;break;}
     else if(n>a[mid]) low=mid+1;
          else high=mid-1;
    }
  if(found==1) printf("The index of %d is %d",n,mid);
  else printf("There is not %d",n);
}

分块查找:需要按照数值大小进行排序分块,虽然每个块中的大小可以不排序,但是块的取值区间是排序的。

数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法
例如在一个由小到大排好序的数列中插入一个数值:

#include <stdio.h>
int main()
{
    int a[11];
    int i, k, x;
    printf("请您输入一个数组中的10个数字:\n");
    for (i = 0; i <= 9; i++)
    {
        scanf("%d", &a[i]);
    }
    printf("请您输入一个要插入的数字:\n");
    scanf("%d", &x);
    for (i = 0; i <= 9; i++) 
    {
        if (x < a[i])   //找到第一个比x大的数据
            break;
    }
    k = i;        //跳出来记住位置
    for (i = 9; i >= k; i--)  /*自第k个数据之后的所有数据后移*/
    {        
        a[i + 1] = a[i];
    }
    a[k] = x;                      //将x插入一定要在for循环外面,在里面会把后面的数据覆盖
    for (i = 0; i <= 10; i++) 
    {
        printf("%d ", a[i]);
    }
    return 0;
}

数组中如何删除数据,这个有多种做法,请一一展示
方法一:对原数组进行对应删除

#include<stdio.h>
#define N 10
void main()
{
	int a[N], num, i, n = N;
	int j;
	/*输入N个数到数组中;*/
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &num);
		a[i] = num;
	}
	/*在数组a中删除指定的zhi数num;*/
	for (i = 0; i < n; i++)
	{
		if (a[i] == num)
		{
			//a[i]=a[n];//如果不保留原数组里的顺序,此一句即可代替下边2行语句,同时省掉变量j
			for (j = i; j < n - 1; j++)
			{
				a[j] = a[j + 1];
			}
			n--;
		}
	}
	/*输出删除了num后的数组a;*/
	for (i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	getchar();
}

方法二:建立新数组

#include <stdio.h>
#define SIZE 100
int deleteData(int*, int, int);
int main()
{
    int n = 10;
    int i, j, locate;
    int a[SIZE] = { 12,15,79,4,6,52,16,1,9,19 };
    for (j = 0; j < n; j++)
    {
        printf(" %d", a[j]);
    }
    printf("\n请输入数组a[10]需要删除的元素位置序号:");
    scanf("%d", &locate);
    n = deleteData(a, n, locate);
    for (i = 0; i < n; i++)
    {
        printf(" %d", a[i]);
    }
    printf("\n");
    return 0;
}
int deleteData(int arr[], int len, int loc)
{
    int i = loc;
    while (i < len - 1)
    {
        arr[i] = arr[i + 1];
        i++;
    }
    len--;
    return len;
}

数组中目前学到排序方法,主要思路?
冒泡排序法:对数组进行多次的扫描并排序,所需时间长

#include<stdio.h>
int main() {
    int i;
    int j;
    int n;
    int num[100];
    int k;
    int temp;
    scanf("%d %d", &n,&k);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &num[i]);
    }
    for (i = 0; i < k; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (num[j] < num[j - 1]) 
            {
                int temp = num[j - 1];
                num[j - 1] = num[j];
                num[j] = temp;

            }
        }
    }
    for (i = 0; i < n; i++)
    {
       
        if (i != 0)
        {
            printf(" ");
        }
        printf("%d", num[i]);
    }
    return 0;
}

选择排序法:选择出需要排序的数组中的数据对其进行排序,所需时间短

#include<stdio.h>
int main() {
    int i;
    int j;
    int n;
    int num[10];
    int temp;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &num[i]);
    }
    for (i = 0; i < n-1; i++)
    {
        for (j = 0; j < n-i-1; j++)
        {
            if (num[j] < num[j + 1]) 
            {
                temp = num[j];
                num[j] = num[j + 1];
                num[j + 1] = temp;
            }
        }
    }
    for (i = 0; i < n; i++)
    {
       
        if (i != 0)
        {
            printf(" ");
        }
        printf("%d", num[i]);
    }
    return 0;
}

数组做枚举用法,有哪些案例?
PTA题目:调查电视节目受欢迎程度,查找整数等,附上查找整数的代码

#include<stdio.h>
int main() {
    int i;
    int n;
    int num[20];
    int X;
    int temp=0;
    scanf("%d %d", &n,&X);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &num[i]);
    }
    for (i = 0; i < n; i++)
    {
        if (num[i] == X)
        {
            printf("%d", i);
            temp = 1;
        }
    }
    if (temp == 0)
    {
        printf("Not Found");
    }
    return 0;
}

哈希数组用法,目前学过哪些案例,举例展示
PTA题目:

代码:

#include<stdio.h>
int panduan(int n);
int main()
{
	int a[100001];
	int n;
	int m;
	int i;
	int flag = 0;

	scanf("%d", &n);
	if (panduan(n) == 1)
	{
		printf("YES");
	}
	else
	{
		printf("NO");
	}
	return 0;
}

int panduan(int n)
{
	int static b[100001];
	int i;
	int x;
	for (i = 1; i <= n; i++)
	{
		scanf("%d", &x);
		if (b[x] == 1)
		{
			return 1;
		}
		else
		{
			b[x] = 1;
		}
	}

建立哈希函数来进行判断数组是否符合要求,然后进行返回。
字符数组、字符串特点及编程注意事项。

  • gets识别换行符\n,也就是不识别空格,可以输入一行数据, puts输出后,会自动加上一个换行符
  • 如果不是使用scanf函数的%s格式,或者是使用gets函数输入字符串,记得一定需要在最后面加一个'\0'.例如:使用scanf函数的%c格式,或者使用getchar,一定要在后面加上一个'\0'
  • scanf函数输入时,然后整数换行时,输入直接闪退,这个时候需要在%d后面加上\n换行

2.PTA实验作业

2.1 有重复的数据

2.1.1 伪代码

int main
{
scanf n //得知输入数值数量
if panduan=1 //利用函数来判断输出值
      printf YES //证明有重复数据
else 
      printf NO //证明没有重复数据
}
int panduan
{
int static b[100001]//设置静态数组
int x
for  
      scanf x
      if (b[x] == 1) 返回返回值1 
      else b[x] = 1//利用数值来作为数组下标,如果下标出现两次则说明有重复数据
end for
}

2.1.2 代码截图


2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。

同学代码:

特点:我运用了分装函数的方法来让代码更清晰可读,做法都是运用了哈希数组。

2.2 找鞍点

2.2.1 伪代码

定义数组和max数组
for
     if (a[i][j] >= a[i][maxi]) //判断行最大数并记录位置到max数组中
            {
                maxi = j;
            } 
      max[i] = maxi;
end for
for
      //判断上述已经是行最大数的数是否为列最大数
      if(不是) break//跳出循环
      if (是)  printf("%d %d\n", j, max[j]);//输出鞍点位置,并结束程序
end for
输出无鞍点

2.2.2 代码截图


2.2.3 请说明和超星视频做法区别,各自优缺点

稍微借鉴了超星视频的做法,思路一致,不同的是视频运用了分装函数的办法让整个过程更加清晰明了

2.3 切分表达式

2.3.1 伪代码

定义字符数组
get(字符数组)
for
      if (所获取为0~9的数值)
             while (((ch[i] >= '0' && ch[i] <= '9') || ch[i] == '.') && ch[i] != '\0')//判断下一位是为0~9数值或为小数点,记录对应下标
             for  printf("%c", ch[j]);//输出对应下标的数
      if (所获取为‘-’字符)
             if (ch[i - 1] >= '0' && ch[i - 1] <= '9' || ch[i + 1] == '(')//数组前一位是数字或者下一位是前括号
                  {
                   putchar('-');
                   putchar('\n');//减号单独输出一行
                  }
             else
                  {
                   putchar('-');//只输出减号
                  }      
      if (所获取为‘+’)
             if(i == 0)//正号为起始,仅输出正号
                  {
                   putchar('+');
                  }
             else//正号单独输出一行
                  {
                   putchar('-');
                   putchar('\n')
                  }
      else//其余的单独输出一行
      {
            printf("%c", ch[i]);
            putchar('\n');
      }
end for

2.3.2 代码截图


2.3.3 请说明和超星视频做法区别,各自优缺点。

超星视频运用了封装函数的方法,且有提前结束循环的设置可以缩短代码运行时间,代码可读性和所需时间得到提升,我的代码比较直白,但也考虑了特殊情况,细节抓得住

posted @ 2020-12-13 22:09  山无垢山城  阅读(109)  评论(0编辑  收藏  举报