C语言博客作业--一二维数组
一、PTA实验作业
题目1:判断上三角矩阵
1. 本题PTA提交列表:
2. 设计思路
定义整形变量n存放判断矩阵个数,number存放几阶矩阵,i,j,k控制循环,flag判断是否为上三角矩阵标志,b存放输入一个数时的特殊情况的数值
定义整型数组a[10][10]存放矩阵
输入矩阵个数n
for(k=1;k<=n;k++){
输入矩阵阶数为n
if(number==1)
输入一阶矩阵的数字b
输出“YES”
else(不是一阶矩阵的时候)
for(i=0;i<number;i++)
for(j=0;j<number;j++)遍历数组
输入n阶矩阵的数值
for(i=0;i<number;i++)
for(j=0;j<number;j++)
if(i>j)如果行下标大于列下标
if(a[i][j]!=0)
flag=0 如果该情况下有一个数不为0则不是上三角矩阵
else
flag=1
if(flag==1)
输出"YES"
else
输出"NO"
flag=0;
}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
这题基本上是一个一个点过的,思路原先是如果下三角有一个数不为0就退出循环,结果只退出了一层循环,这种情况时答案错误,再是搞不懂最小矩阵的测试点,询问同学后直到还有1阶矩阵的情况,修改后第三点过了。
题目2:杨辉三角
1. 本题PTA提交列表:
2. 设计思路
定义整型变量repeat存放运算次数,n存放加数和被加数的最大值,i,j,k控制循环
输入循环次数repeat
for(k=1;k<=repeat;k++){ 循环repeat次
输入加数和被加数的最大值n
定义整型变量a[n+1][n+1]存放首行首列加数与被加数的数值
for(i=0;i<=n;i++){
for(j=0;j<=n;j++)遍历数组
if(i==0||j==0)
首行数值为下标值
首列数值为下标值
首行首列交点初值为0
else
数值为行列下表和;
}
输出第一个字符“+”,左对齐,占4个空间
for(j=1;j<=n;j++)(第一行)
if(j==n)
输出数值并换行
else
输出数值
for(i=0;i<=n;i++)(后几行)
for(j=0;j<=n;j++)
if(i>j)
输出下三角的数值
else if(i==j)
if(i!=0&&j!=0)
输出分界线的数值并换行
}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
答案错误:不知道第二行哪里出来的0,一步步调试发现i==j的时候没有排除下标为0.0的情况,而上面又对下标0.0的数组赋了0的初值,分类即可。
题目3:找鞍点
1. 本题PTA提交列表:
2. 设计思路
定义整型变量i,j控制循环,n为矩阵阶数,max存放最大值,min存放最小值,flag=0用来判断是否有鞍点
输入阶数n
定义整型变量a[n][n]来存放n阶矩阵的数值
for(i=0;i<n;i++)
for(j=0;j<n;j++)
输入n阶矩阵数值
for(i=0;i<n;i++){
最大值初值为0
for(j=1;j<n;j++){
if(a[i][j]>=a[i][max]){
最大值为j}
最小值初值为0
for(j=1;j<n;j++){
if(a[j][max]<=a[min][max])
最小值为j
if(i==min){行最大,列最小的数的行数相同时
flag=1;
退出循环
}
}
if(flag==0)
输出"NO"
else
输出"YES"
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
这题写了很久,一开始思路错了,没有像后来注释上写的那样,以为找行最大的数字时是列不变,行变,导致结果错误,后来调试改正。这题思路总体比较混乱,看了同学代码才理清是通过判断行最大的行数和列最小的行数是否相同来判断此点是否为鞍点,还需多练习。
二、截图本周题目集的PTA最后排名
三、同学代码结对互评
1.互评同学名称
龚顺德
2.我的代码、互评同学代码截图
龚顺德
我的
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
总体思路上,我和顺德的思路有很大不同。
- 我是用数组来存放各位数字,而顺德是用a,b,c,d四个变量来存放数值,我觉得用一个数组会更方便。
- 我是通过遍历数组来判断有几个数字相同,反过来验证有几个数字不相同,而顺德是通过对每一个数字比较的得出几个数字不同,我更喜欢我的方法。
- 输出方面,我是通过下标从大到小输出数组各位数字,而顺德是直接输出循环的年份i,而我的是对年龄进行循环,我觉得用顺德的方法直接对年进行循环,再减去初始年得到年龄的方法更简便,可以减少变量数量。
四、本周学习总结
1.你学会了什么?
- 1.1 C中如何存储字符串?
可以用while((str[i]=getchar())!=‘\0’)循环存储字符串,'\0'为字符串结束标志
- 1.2 字符串的结束标志是什么,为什么要结束标志?
'\0',‘\0’可以用来控制字符数组的输入与输出
- 1.3 字符串输入有哪几种方法?
1.使用gets()直接吸收整个字符串
2.循环:while((str[i]=getchar())!=‘\0’)或者定义数组和循环变量,用循环结构for(i=0;i<n;i++) str[i]=getchar()即可
3.scanf("%s",str)
- 1.4 数字字符怎么转整数,写个伪代码?
定义整型变量number存放输入的数,i为循环变量
定义字符数组str[10]存放字符串
i=0
while((str[i]=getchar())!=‘\0’)
每次循环完i的值加一
number=0
for(i=0;str[i]!=‘\0’;i++)
if(str[i]>=‘0’&&str[i]<=‘9’)
number=number*10+str[i]-'0'
输出number
- 1.5 16进制、二进制字符串如何转10进制?写伪代码?
定义整型循环变量i,k
定义字符数组str[80]
定义长整型变量number存放十进制数
i=0
while((hexad[i]=getchar())!=‘\0’)
每次循环结束后i的值加一
number=0
for(i=0;hexad[i]!=‘\0’;i++)
如果数组hexad[i]为0~9的字符
number=number16+hexad[i]-‘0’
如果数组hexad[i]为A~F的字符
number=number16+hexad[i]-'A'+10
如果数组hexad[i]为a~f的字符
numbe=number*16+hexad[i]-‘a’+10
输出十进制的值number
2.本周的内容,你还不会什么?
错题:
i<80 ->sent[i]
scanf("%s",sent); ->gets(sent);忘记老师上课讲过的输入字符串间有空格时不能用scanf语句输入,应用gets()输入,因为scanf语句中' '为结束符号也是老师上课讲过的判断语句内容不能为数组长度,因为数组后面可能为空;sent[i]=0;-> sent[j]='\0';这个点是前面没改改正,没注意到对最后一个数组赋结束字符
3.期中考试小结
- 3.1 你认为为什么没考好?
1.平时书上的基本知识学过没及时复习,考前很多模糊的知识也没过一遍,过了的知识点也没有自己算一遍只是看看就过了,记不牢,像进制转换那题就是
2.读程序题得分很低,对字母所对应的ASC码没记熟,像第二题的大写字母写成小写字母很不应该。还有就是对步骤书写规范没有概念,没有认真复习上次的试卷,导致只得了答案分
3.最大败笔是程序题得分可怜,一个是不习惯在纸上写程序,还有一个是时间没把握好,对写过的第三题来不及看题目就交卷了,第一题讲过思路还是不清晰,以后上课要更专注一些,会的题目也要认真跟老师再梳理一遍,加深记忆,还有就是程序题看上去有把握的得先做。
- 3.2 罗列错题。
1.选择题:第四题:概念不熟悉,A字节是byte,位才是bit ;B广泛使用的pentium机字长是32个字节;C:计算机不是所有数的运算均为补码计算(正确);D:计算机的字长一定是byte(字节)的整数倍
2.填空题:第四题:粗心错,K小于等于6小于号和等于号没有分开写
3.改错题:第一题:少了两个错误找不到,最后return b改成return a来不及找数字带进去验证,还有就是对while的判断条件没看仔细,没发现是r!=0,题目写反了
4.程序题:第一题:刚开始在纸上写程序题,涂涂改改,思路混乱,没想好就开始写,时间也很紧,头脑混乱,上课讲过的没有记牢。
- 3.3 下半学期要怎么调整C的学习?
1.上课要更专注一些,会的题目也要认真跟老师再梳理一遍,加深记忆。
2.尝试手写代码,课堂派上的题先自己阅读,再用编译器验证想的答案,不要看到长代码就怕。
3.对书上的经典例题要熟悉并自己打一遍,加深记忆,理清思路。
4.半期考选择丢了一半分也让我认识到C不仅是打代码,还有对基础知识的认识,作为专业学生基础知识掌握不牢很惭愧,有空要多多弥期中前的基础知识漏洞,看看课堂派上的错题。
5.加强阅读代码的能力,平时多看看博客园其他优秀同学的代码,吸取他们的优点。
6.提高做题效率,调整心态。(随着题目难度加大,做题效率真的越来越低了)