• 第十四,十五周作业


    【1】

    题目一 数组中偶数的和

    1.实验代码

    #include<stdio.h>
    int main()
    {
      int i,sum=0;
      int a[10];
      for(i=0;i<10,i++)
      {
        scanf("%d",&a[i]);
        if(a[i]%2==0){
        sum=sum+a[i];}
      }
      printf("s=%d",sum);
      return 0;
    }
    

    2.设计思路
    (1)主要描述题目算法
    第一步:本题要求十个数组中的偶数和,首先要定义一个数值为十的数组a[10],然后还要定义一个循环所需的变量i,以及所求的偶数和sum。
    第二步:利用for循环实现十个数组的输入,如果某个数组除以二取余为零,则证明其为偶数,进行累加。
    第三步:当i大于10后结束循环,输出sum的值。
    (2)流程图

    3.本题调试过程碰到问题及解决办法
    本题在设计思路上并没有什么问题,只在编译时出现了一些小的失误,通过错误提示改正。

    4.本题PTA提交列表

    题目二输出小于均值的数

    1.实验代码

    #include<stdio.h>
    int main()
    {
      int i,sum=0;
      double average;
      int a[10];
      for(i=0;i<10;i++)
      {
        scanf("%d",&a[i]);
        sum=sum+a[i];}
      average=sum/10;
      for(i=0;i<10;i++){
      if(a[i]<average)
             printf("%d ",a[i]);}
      
      printf("
    ");
      return 0;
    }
    

    2.设计思路
    (1)主要描述题目算法
    第一步:本题要求输入10个整数,计算这些数的平均值,再输出所有小于平均值的数。
    第二步:先定义一个数值为十的数组a[10],再定义一个循环所需的变量i,以及一个数组和sum和平均数average。
    第三步:利用for循环实现数组的输入以及和的累加计算出平均数。
    第四步:如果某个数大于平均数就进行输出。注意输出的格式每个数字后面必须有一个空格,即“%d "。
    (2)流程图

    3.本题调试过程碰到问题及解决办法
    本题和老师在课上讲的才不多,我觉得将两个for循环并到一起写应该没什么影响,但提交后显示答案错误。通过调试发现平均数是不能进入循环的,所以必须使用两个for循环。

    4.本题PTA提交列表

    题目三 将数组中的数逆序存放

    1.实验代码

     #include <stdio.h> 
     int main()
     {    
       int i,n,x;
       int a[10];    
       scanf("%d
    ",&n);   
       for (i=0;i<n;i++)     
       scanf("%d", &a[i]);    
          for (i=0;i<n/2;i++)  
        {     
            x = a[i];     
            a[i] = a[n-1-i];      
            a[n-1-i]=x;    
            }
         for(i=0;i<n-1;i++){   
            printf("%d ",a[i]);}
        printf("%d
    ",a[n-1]);
        return 0;
      } 
    

    2.设计思路
    (1)主要描述题目算法
    第一步:本题将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。
    第二步:先定义一个循环所需的变量i,输入数值的个数n,以及一个替换变量x。再定义一个大小为10的数组a[10]。
    第三步:先利用for输出所有的数组,在利用for循环对原数组进行逆序存放,此循环作用是将对称的元素的值互换,然后按要求输出所有的数组。
    注:要求行末不得有多余空格,所以在输出最后一个数组的时候应该以printf("%d",a[n-1])这种情况输出。
    (2)流程图

    3.本题调试过程碰到问题及解决办法
    本题开始没有注意到输出的格式没有考虑到最后没有空格的情况。

    在老师给的c-7数组中找到了问题的所在,进行了改正。
    4.本题PTA提交列表

    题目四fibonacci数列

    1.实验代码

    #include<stdio.h>
    int main()
    {
      int i;
      int fib[12]={1,1};
      for (i=2;i<12;i++)
        fib[i]=fib[i-1]+fib[i-2];
      for(i=0;i<12;i++)
      {
        printf("%6d",fib[i]);
        if((i+1)%3==0)
           printf("
    ");
      }
      return 0;
    }
    

    2.设计思路
    (1)主要描述题目算法
    第一步:本题要求用数组计算fibonacci数列的前12个数,并按每行打印3个数的格式输出。即前两个数相加得第三个数。
    第二步:先定义一个数值为十二的数组,给出前两个数的数值,再定义一个循环所需的变量i。
    第三步:利用for循环依次算出十二个数值,注意:因为前两个数值的大小已经给出,所以i要从2开始。
    第四步:本题要求使用%6d的格式输出,所以输出格式为“%6d"。
    第五步:要求在输出最后一个数字后,有一个换行,所以i加1等于数组的个数后进行除3取余,实现三个数换行。
    (2)流程图

    3.本题调试过程碰到问题及解决办法
    本题和老师讲的基本一样,只是更改了每行的个数,只在编译上出了点小问题,看错了每行的个数以及误将for循环中的分号打成了句号。

    4.本题PTA提交列表

    题目五 求最大值及其下标

    1.实验代码

    #include <stdio.h>
    int main()
    {
        int i, index, max, n;
        int N = 10;
        int a[N];
        scanf("%d",&n); 
        for(i = 0; i < n; i++) 
    	{
    		scanf("%d", &a[i]);
    	} 
        max = a[0]; index = 0;
        for(i = 1; i < n; i++)   
        {
        	if(a[i] > max) 
        	{
        		max = a[i];
        		index = i;
    	}
        }        
        printf("%d %d", max , index);
        return 0;
    }
    

    2.设计思路
    (1)主要描述题目算法
    第一步:本题要求在给出的n个数中找到最大值及其下标。
    第二步:先定义出所需的字符,i代表循环所需的变量,index代表下标,max代表最大值,n代表输入数值的个数。同时还要定义一个数组a[N],按要求N最大为10。
    第三步:首先利用for循环输入所有的数组值,然后假设a[0]为最大值,其下标也为0。
    第四步:将所有的数组与最大值max比较大小,如果给出的数组a[i]比max大,就进行交换,使max永远保持最大,利用for循环实现所有数组的比较。
    第五步:按要求输出最终的结果。
    (2)流程图

    3.本题调试过程碰到问题及解决办法
    本题在思路上还是比较清晰的,出现了一些小的问题,在编译上还是会粗心丢三落四的,没有注意到输出方式。

    经过逐步的更改和调试最终才得到正确的答案。

    4.本题PTA提交列表

    题目六 交换最小值和最大值

    1.实验代码

    #include <stdio.h>
    int main ()
    {
      const int N=10;
      int n,i,a[N],max,min,j,m;
      int t,y;
      scanf("%d",&n);
      for(i=0;i<n;i++)
      {
        scanf("%d",&a[i]);
      }
      min=0;
      max=n-1;
      for(j=0;j<n;j++)
      {
        if(a[j]<a[min])
         min=j;
      }
        if(min!=0){
    	y=a[0];
            a[0]=a[min];
            a[min]=y;}
      for(m=0;m<n;m++)
      {
        if(a[max]<a[m])
        max=m;
      }
      if(max!=n-1)
      {
        t=a[n-1];
        a[n-1]=a[max];
        a[max]=t;
        }
        for(i=0;i<n;i++)
        {
          printf("%d ",a[i]);
        }
    }
    
    

    2.设计思路
    (1)主要描述题目算法
    第一步:先定义好所需的相关变量,数组个数n,循环所需变量i,j,m,数组a[N]以及最大值max和最小值min。(N=10)
    第二步:先利用一个for循环输入所有的数组值,假设第一个数组值为最小的,利用for循环将所有的数组与第一个数比较,找到数组中的最小值,进行交换,同时实现下标的交换。
    第三步:如果最小值不是第一个,就将其换到相应的位置,定义一个交换所需的变量y进行交换。
    第四步:最大值的交换与最小值的类似,将最后一个数假定为最大的,之后的重复二,三步的操作。
    第五步:最后利用for循环输出所有的数组。
    (2)流程图

    3.本题调试过程碰到问题及解决办法
    本题在思路上有些混乱,老师在课上讲了最小值的替换,类似的题型,我就按照老师个的c-7数组中的进行了编译,但由于最大值与最小值替换同时进行产生错误。

    重复修改了几遍后仍然没有找到问题的所在,看见群里有编译此题时遇见了相同的困难,就请教了她是如何解决的,错误的点在哪里,然后进行了改正。

    4.本题PTA提交列表

    题目七 选择法排序

    1.实验代码

    #include<stdio.h>
    int main()
    {
     int i,k,a[10],N,t,max;
     scanf("%d",&N);
     for(i=0;i<N;i++){
      scanf("%d",&a[i]);
     }
     for(k=0;k<N-1;k++){
      max=k;
      for(i=k+1;i<N;i++){
      if(a[max]<a[i]){
      max=i;
      t=a[max];
      a[max]=a[k];
      a[k]=t;}
       }
     }
     for(i=0;i<N;i++){
      if(i+1==N)
      printf("%d",a[i]);
      else
      printf("%d ",a[i]); 
     }
     return 0;
    }
    

    2.设计思路
    (1)主要描述题目算法
    第一步:本题要求将给定的n个整数从大到小排序后输出。
    第二步:先定义编译所需的变量,循环所需的变量i,t,数组a[10],输入的数组个数N以及交换大小的变量t。
    第三步:利用for循环输入所有的数组。假设最大值的下标max=k,利用for循环,如果最大值a[max]小于数组a[i],就进行交换,让max=i,将最大值换给a[k],直到完成所有的排序结束循环。
    第四步:本题要求行末不得有多余空格,所以最后一个值的输出格式应为 printf("%d ",a[i])。
    (2)流程图

    3.本题调试过程碰到问题及解决办法
    本题先按照老师上课时讲的打出了一部分,但是后续的就不会打了,对一些循环的条件的意义有些不理解,通过百度进行逐句地解释,再通过不断的调试,然后解决了本道题
    (由于思路完全跑偏,就没有进行错误截图)
    4.本题PTA提交列表

    题目八 求矩阵各行元素之和

    1.实验代码

    #include<stdio.h>
    int main()
    {
      int m,n,i,j,sum=0;
      scanf("%d %d",&m,&n);
      int a[m][n];
      for(i=0;i<m;i++)
      {
        for(j=0;j<n;j++)
        {
          scanf("%d",&a[i][j]);
        }
      }
      for(i=0;i<m;i++)
      {
        for(j=0;j<n;j++)
        {
          sum=sum+a[i][j];
          
        }
            printf("%d
    ",sum);
            sum=0;
      }
      return 0;
    }
    

    2.设计思路
    (1)主要描述题目算法
    第一步:本题要求矩阵各行元素之和,要将每行的两个数相加求和,再依次输出。
    第二步:先定义此数组有m行n列,再定义循环所需的变量为i,j,所求的和为sum,初始值为0。定义矩阵数组为a[m][n]。
    第三步:利用for的双层循环输入矩阵数组的所有值。外循环代表行,内循环代表列。
    第四步:再利用for的双层循环依次求出每行的和。
    (2)流程图

    3.本题调试过程碰到问题及解决办法
    在编译此题时,我习惯性的将所有所需的变量定义出来,然后才输入的m,n的值,导致出现了段错误的情况。

    通过错误提示的提醒,纠正了错误,也意识到有些题所需的条件是有先后顺序的,要注意逻辑思路。

    4.本题PTA提交列表

    题目九 方阵左下三角元素的和

    1.实验代码

    
    #include<stdio.h>
    int main()
    {
      int i,j,sum=0;
      int a[4][4];
      for(i=0;i<4;i++)
      {
        for(j=0;j<4;j++)
        {
          scanf("%d",&a[i][j]);
        }
      }
      for(i=0;i<4;i++)
      {
        for(j=0;j<4;j++)  \for(j=0;j<=i;j++)
        {
          sum=a[0][0]+a[1][0]+a[1][1]+a[2][0]+a[2][1]+a[2][2]+a[3][0]+a[3][1]+a[3][2]+a[3][3];  \sum=sum+a[i][j];
        }
      }
      printf("%d",sum);
      return 0;
    }
    

    2.设计思路
    (1)主要描述题目算法
    第一步:本题要求方阵左下三角元素的和,首先要输入规定的方阵的行列,在写出要加和的数组。
    第二步:先定义循环所需的变量i,j,以及所求的和sum。同时定义出要求的四行四列的数组a[4][4]。
    第三步:利用for的双层循环输出所有的数组,再利用for的双层循环列出所有要加和的数,进行累加。内循环使j<=i,使得输出的值都在对角线的下半部分,通过循环进行累加。
    第四步:最后输出和sum。

    (2)流程图

    3.本题调试过程碰到问题及解决办法
    本题没有遇到问题。

    4.本题PTA提交列表

    题目十 求整数序列中出现次数最多的数

    1.实验代码

    #include<stdio.h>  
    int main()  
    {  
        int i,j,n,N=1000;  
        scanf("%d",&n);
            int a[N],b[N];  
            for(i=0;i<n;i++)  
                scanf("%d",&a[i]);  
            for(i=0;i<n;i++)  
            {  
                for(j=0;j<n;j++)  
                {  
                    if(a[i]==a[j])  
                      b[i]=b[i]+1;  
                }  
            }  
          int x;  
            for(i=0;i<n;i++)  
            { 
               if(x<b[i]){
                 x=b[i];  
                 j=i; 
               }
            }    
            printf("%d %d",a[j],x);  
        return 0;  
    }  
    

    2.设计思路
    (1)主要描述题目算法
    第一步:本题要求整数序列中出现次数最多的数,需要利用循环找出重复次数最多的数。
    第二步:先定义出所需的变量,循环所需的变量i,j,输出的个数你,数组个数N=1000,以及数组a[N],b[N]。
    第三步:输入n后,再利用for循环输入所有的数组值。
    第四步:利用for的双层循环找出相等的数组,同时实现个数的累加。
    第五步:在定义一个中间变量x,考虑到如果x小于相同数组的个数就让x=b[i],同时实现下标的转换,利用for循环排除所有的这种情况。
    (2)流程图

    3.本题调试过程碰到问题及解决办法
    本题刚开始没有理解透题意,没有将输出的个数定义成数组,导致陷入了误区。

    通过百度知道了输出个数同样也要定义成数组。同时以进一步理解了每个循环代表的意义,具体如设计思路中所说。

    4.本题PTA提交列表


    【2】

    1.git地址:
    https://git.coding.net/sunna1/text.git
    2.git截图:

    【3】

    个人总结

    (1)学习内容:近两周,先学习了数组。这其中包括什么是数组,如何使用,定义数组,二位数组的元素的存放方式。之后通过数组延伸到排序问题,最为经典的是冒泡排序。还学习了矩阵相关的一些编译问题。变换各种题型进行了练习。
    收获:除了对新学的知识有所收获以外,对编程有了更深的认识。感觉编程很神奇,不同的代码可以编译成不同的东西,千变万化,值得去探究。
    (2)难点:我觉得选择排序以及冒泡排序比较难,过程很复杂,利用for的双层循环加大了理解难度。
    不明白:对于冒泡排序理解的还是不透彻,有些循环的概念有一些模糊。

    互评和学习进度:

    点评作业:

    (1)陈雨秋:

    http://www.cnblogs.com/cyq66992152/p/7946077.html

    (2)孙佳钰:

    http://www.cnblogs.com/SR1011/p/7965948.html

    (3)马宇欣:

    http://www.cnblogs.com/mayuxin/p/7900356.html

    表格及折线图

    1.表格

    2.折线图

  • 相关阅读:
    python 数据结构与算法 day04 冒泡排序
    阿里代码扫描插件安装 (IDEA)
    Kafka
    女生赛训练 2
    2019 DISCS PrO High School Division
    计算机安全之密码安全 从 Hash 到 MD5
    CodeForces Round #559 Div.2
    CodeForces Round #558 Div.2
    CodeForces Round #560 Div.3
    NCD 2019 (AK)
  • 原文地址:https://www.cnblogs.com/sun-na-/p/7875394.html
Copyright © 2020-2023  润新知