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=number16+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的学习?
- 巩固基础知识,不仅要加强编程的训练,还要扎实基础;
- 对于编程,后续代码量将增加很多,要再纸上先写,找出规律,还有就是学会用伪代码写设计思路;
- 对错题要收集总结;
- 对做过或者做错的题目要反复复习,加强印象;
- 编程过程中遇到困难,要独立寻找问题;