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

1. 本章学习总结

1.1 思维导图

1.2 本章学习体会及代码量

1.2.1 学习体会

学习了数组,指针,结构之后,不懂的东西成倍增长,因为总是会用到以前的知识,导致了恶性循环。
数组可以用于解决之前一些需要大量代码的问题,让代码量下降,比如循环。
运用数组时,需要主义开头以及结尾,下标不可越界,定义数组时不可使用变量等。

1.2.2 代码累计

2. PTA总分

2.1 一维数组,二维数组排名得分


2.2 我的总分:

134+55=189

3. 实验作业

3.1 PTA题目1

  • 用二分法在一个有序数列{1,2,3,4,5,6,7,8,9,10}中查找key值,若找到key则输出其在数组中对应的下标,否则输出not found。

3.1.1算法分析

   int num;
	int i;
	int right=9,left=0; 左边的数的下标为0,右边为9
    int b[]={1,2,3,4,5,6, 7,8,9,10};
    int a;
    scanf("%d",&num); 循环输入数组
    while(right>left)
    {
    	a=(right+left)/2; 使用二分法,找到新下标的位置
    	if(num==b[a]){
    		printf("weizhi:%d",a); 正确即输出weizhi
    		break;
    		} 
    		else if(num>b[a]) 当数字大于新的数时,左边下标+1,循环上述的操作
			{
				left=a+1;
				 
			} 
			else 
			{
				right=a-1; 当小于时,右边下标-1,循环上述操作
			}
		}
		if(num>10||num<1){
			printf("not found"); 超出范围,输出not found
		}

3.1.2 代码截图

3.1.3 PTA提交列表及说明

  • Q1:一开始不知道何为二分法,以为和数学中定义一样。导致错误
  • A1:后经同学指正,理解了二分法。

3.2 PTA题目2

  • 求整数序列中出现次数最多的数
    本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

3.2.1算法分析

 int m=0,n,i,j;
  int max;
  int b[1000]={0}; 定义数组,初始为0 
  scanf("%d",&n);
  int a[n];
  for(i=0;i<n;i++)
  {
    scanf(" %d",&a[i]);
  }
  
  for(i=0;i<n;i++) 用数组b来存放数组a中的每一个数的出现次数,数组b的次数与数组a的数字对应
  {
    for(j=0;j<n;j++)
    {
      if(a[i]==a[j])
      {
        b[m]++;
      }
    }
    m++;
  }
  
  max=0; 在数组b找出最大的次数,这个次数的下标对应数组a的数
  for(i=0;i<m;i++)
  {
    if(b[max]<b[i])
    {
      max=i;
    }
  }
  printf("%d %d\n",a[max],b[max]);
  return 0;

3.2.2 代码截图

3.2.3 PTA提交列表及说明

  • Q1:一开始没有想到如何去记录出现的次数,导致用简单的a++、b++,在某些地方出错。
  • A1:上网查找之后意识到可以使用数组去记录出现次数。
  • Q2:在b[m]++后,没有m++,导致数组的下标和数组a中的数字没有对应
  • A2:百度一下后改正。

3.3 PTA题目3

  • 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
    本题要求编写程序,求一个给定的n阶方阵的鞍点。

3.3.1算法分析

int a[6][6];定义二维数组
    int n;
    scanf("%d",&n); 定义
    int i,j;
    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
        {
            scanf("%d",&a[i][j]); 输入
        }
    int k=0,y=0,flag=1,p=0;
    if(n==1)
        printf("0 0"); 只有一个点时,一定是鞍点
    else
    {
        for(i=0; i<n; i++)
        {
            y=i;
            for(p=0; p<n; p++)  找行最大值
            {
                if(a[i][k]<=a[i][p]) 数组元素之间比较,若比a[i][k]大,则将数组列标赋给k
                {
                    k=p;
                }
            }
            for(j=0; j<n; j++) 判断是否为列最小值
            {
                if(a[y][k]>a[j][k]) 若此行最大值不是列所在最小值,把小的行标赋给y
                {
                    y=j;
                    break;
                }
            }
            if(i==y) 行最大且列最小,判断条件行标不改变
            {
                flag=0;
                break;
            }
        }
        if(flag==0)
            printf("%d %d",i,k);
        else printf("NONE");
    }
    return 0;

3.3.2 代码截图

3.3.3 PTA提交列表

  • Q1:在只有一个数字时,没有考虑此情况。
  • A1:在百度后解决。
  • Q2:在找到一列最大数字时,不知如何如何去继续找一行的最小数字。
  • A2:经过同学的指点 if(a[y][k]>a[j][k]),找到最小数字之后赋值给y。

4.代码互评

4.1 代码截图

  • 同学的代码

  • 我的代码

4.2 不同之处

  • 同学的代码运用了函数来计算,但步骤和变量很多,显得很复杂。
  • 相较之下,我的代码虽然简单,但是表达的逻辑并不清晰
posted on 2018-12-08 17:46  Cosmosss  阅读(679)  评论(1编辑  收藏  举报