C语言博客作业--一二维数组

一、PTA实验作业

题目1:7-3 出生年

1. 本题PTA提交列表

2. 设计思路

  • 定义整型数组a[4]={0},b[10]={0},数组a[]用来装年份的各个数,b[]用来装对应数字的个数,
    定义变量year,n,first,sum=0,i,j,k,year为输入年份,n为不同数字的个数,first用来
    存放初始年份year,sum用于存放不同数的个数;
  • 输入year,n; 并令first=year;
  • 进入循环,首先算出每一位的数字,依次赋给a[]
    a[0]=year/1000;
    a[1]=year/100%10;
    a[2]=year/10%10;
    a[3]=year%10;
  • for (i=0 ; i<4 ; i++)
    令b数组中对应下标a[i]的值加1 b[a[i]]++;
  • for (k=0 ; k<10 ; k++)
    若b[k]大于等1,说明有这个数,sum++;
  • 如果sum==n;跳出整个循环;
  • 用for循环将b数组的元素重新赋为0;
  • year++;sum=0
  • 直到sum==0,输出结果;

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 首次提交用for循环对数组a进行赋值,提示运行超时和答案错误,可能对于此题不适用循环赋值,后该为逐个赋值;


  • 改正后为部分正确,对样例1 2输出的结果不正确,对于不足四位数的前面要补零,将年份输出该为%04d,得到正确结果


题目2:7-5 数组循环左移

1. 本题PTA提交列表

2. 设计思路

  • int n,m,i,j,k,r,l=0;其中k用于表示左移位数
    int a[100]={0},b[100]={0} 数组b存放左移后的数组
  • 输入n,m
  • 输入n个元素的数组a
  • 如果m>=n&&m%n==0 直接输出原数组
  • 如果m>n&&m%n!=0 求左移位数k,m=m%n; k=n-m;
    for(j=0;j<m;j++){ //用于记录左移后,下标从k到m-1的元素的值
    for(;😉{
    b[k]=a[j];
    k++;
    break;
    }
    }
    for(r=m;r<n;r++){ //用于记录左移后,下标从0到k-1的元素的值
    for(;😉{
    b[l]=a[r];
    l++;
    break;
    }
    }
    输出结果
  • 如果m<n 求k=n-m;
    同上

3.代码截图


4.本题调试过程碰到问题及PTA提交列表情况说明

  • 刚开始,判断m与n的关系都用了if语句,在m<n的情况下结果是错误的,发现执行了两个if语句

  • 改成if的多分支结构后,满足条件只能进入一个分支,在m<n和m>n&&m%n!=0的情况下都需要独立去执行,于是,在求出移位数k之后,在两个条件下都用了同一段代码,用来求左移后的数列;


题目3:7-7 找鞍点

1. 本题PTA提交列表

2. 设计思路

  • int n,i,j; int max,jmax,flag1=0,flag2=1;max用于存放行最大值,jmax用于记录行最大的列标 int a[6][6]
  • 输入n,和n阶矩阵
  • for(i=0;i<n;i++)
    max=a[i][0];
    jmax=0;
    for(j=1;j<n;j++) 找出i行最大的,并记录列标jmax
    设置标志flag1=1
    for(j=0;j<n&&flag1;j++) 判断max是否为所在列最小的,不是令flag1=0
    如果flag1==1,printf("%d %d",i,jmax);flag2=0;
  • 如果flag2==1,printf("NONE");

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 一开始只设置一个标志flag,当不存在鞍点是不会输出NONE
  • 改用两个标志后,提交显示部分正确,有并列值时以后面为准,将max<a[i][j]改为max<=a[i][j],得到正确结果

二、截图本周题目集的PTA最后排名

三、同学代码结对互评

1.互评同学名称

  • 朱杰伟

2.我的代码、互评同学代码截图

  • 我的代码
  • 杰伟的代码

3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题

  • 不同点:我只定义了一个数组,将数组元素从下标大到小反向输出,而杰伟定义了两个数组,将原数组的元素从下标大到小依次赋给另一个数组,然后再依次输出用于存放的数组;
  • 对于这题,我更喜欢自己的代码,因为感觉更简洁,简单;
  • 整体来说没存在什么问题,主要是代码量和简洁度的问题

四、本周学习总结

1.你学会了什么?

1.1 C中如何存储字符串?

  • 字符串可以存放在一维字符数组中,例如:static char s[6]={'H','a','p','p','y','\0'};等价于static char s[6]={''Happy''};或者static char s[6]=''Happy'';字符串由有效字符和字符串结束符组成

1.2 字符串的结束标志是什么,为什么要结束标志?

  • 结束标志为'\0',用结束符来控制循环,有利于代码的执行

1.3 字符串输入有哪几种方法?

  • scanf(''%s'',s) 读入时,遇到空白字符,包括空格,制表符,换行符时均会停止输入
  • gets(s) 读入一行,并将换行符转换为字符串结束符
  • 循环输入,这种方法注意后面要加一个语句 s[i]='\0'

1.4 数字字符怎么转整数,写个伪代码?

  • 定义字符变量c,整型变量number
  • 输入数字字符c
  • number=c-‘0’
  • 输出number

1.5 16进制、二进制字符串如何转10进制?写伪代码?

  • 定义变量number=0存放10进制数,a[]为十六进制字符串,i
    for i=0 ; a[i]!='\0' ; i++
    如果a[i]属于字符0到9,number=number16+a[i]-'0'
    如果a[i]属于字符A到Z,number=number
    16+a[i]-'A'+10
    如果a[i]属于字符a到z,number=number*16+a[i]-'a'+10
    输出number
  • 定义变量number=0存放10进制数,a[n]为二进制字符串
    for i=0 ; i<n ; i++
    number=number+a[i]*pow(2,n-1-i);
    输出number

2.本周的内容,你还不会什么?

  • PTA前十题中,第6题阅览室的还不会,对题目不是很了解;
  • 对字符串的处理和字符转成十进制数字的运算还不熟练,特别是二进制,八进制,十六进制间的转换
  • 对三种排序方法的区分和理解还不是太完整

3.期中考试小结

3.1 你认为为什么没考好?

  • 基础知识不扎实,对一些进制转换、计算机工作原理等太不熟练
  • 对代码的理解能力太差,在程序填空这题花费太多时间,阅读代码的能力有待提高
  • 时间把握得不好,基础题耗费太多时间,导致做后面的编程题有些着急,遗漏太多
  • 卷面不整洁,编程题没有注释,导致很凌乱,看不到得分点

3.2 罗列错题


  • 忽略了一个完整的C语言语句,要包括分号

  • 忘记了static 变量不会改变导致第二个答案错误

  • 忽略x应为浮点型变量,输入应用%lf,

  • 语法错误,k>=6


  • 卷面太乱,格式不清晰,没有注释,以后笔试编程题要记得注释

3.3 下半学期要怎么调整C的学习?

  • 巩固基础知识,不仅要加强编程的训练,还要扎实基础;
  • 对于编程,后续代码量将增加很多,要再纸上先写,找出规律,还有就是学会用伪代码写设计思路;
  • 对错题要收集总结;
  • 对做过或者做错的题目要反复复习,加强印象;
  • 编程过程中遇到困难,要独立寻找问题;
posted @ 2017-12-03 00:00  晴天*  阅读(708)  评论(4编辑  收藏  举报