• 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
    ",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 不同之处

    • 同学的代码运用了函数来计算,但步骤和变量很多,显得很复杂。
    • 相较之下,我的代码虽然简单,但是表达的逻辑并不清晰
  • 相关阅读:
    dockerfile 踩坑记录
    Windows安装配置xampp
    docker 容器中设置 mysql lampp php软链接
    linux 软件连接 创建/查看/删除
    mysql 远程连接权限
    linux设置静态获取ip
    android 自定义控件中获取属性的三种方式(转)
    android 自定义组件-带图片的textView
    CodeIgniter 3之Session类库(3)(转)
    CodeIgniter 3之Session类库(2)(转)
  • 原文地址:https://www.cnblogs.com/cosmosss/p/10087964.html
Copyright © 2020-2023  润新知