C语言博客作业--一二维数组
一、PTA实验作业
题目1:出生年
1. 本题PTA提交列表
2. 设计思路
定义year, n, i, count = 1, j,sum=0,x
输入year,n
定义长度为4的数组a
for i=year to 10000
定义长度为10的数组b,并初始化为0
sum=0;
把年份的每位数分别存进数组a里
for j=0 to 3
b[a[j]]++; end
for j=0 to 9
if b[j]不为0
sum++;//判断年份里有几位不相同 end
if sum与n相等
x=i; break;
end
输出x-year与x
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
刚开始接触此题时,我想了很久都没有想到该如何判断年份里有几位数字不同,后来过来一段时间,我突然想到可以用另一个数组来判断,后面的题目中我也多次运用了此方法;写完过后,发现如下图错误;于是我就去输3000进去,发现答案错误,是一堆乱码,再认真看了一下题目,发现我循环的边界设置的太小了,只是设成了初始年份的范围,把范围改大,这问题就迎刃而解。
题目2:判断上三角矩阵
1. 本题PTA提交列表
2. 设计思路
定义变量t,n,i,j,k,count
输入t;
for i=1 to t
count=0
输入n
定义二维数组a
for j=0 to n-1
for k=0 to n-1
输入待测矩阵
end
for j=1 to n-1
for k=0 to j-1
if a[j][k](下三角)不为0
count++;
end
如果count等于0
输出YES
否则,输出NO
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
本题比较简单,思路清晰,一遍就过,并无调试问题
题目3:装箱问题
1. 本题PTA提交列表
2. 设计思路
定义n,i,j
输入n
定义长度为n的数组s,长度为1002的数组capacity
for i=0 to n-1
输入每个物品的大小放入数组s
for i=0 to 1000
把capacity数组初始化为100
for i=0 to n-1
for j=1 to n
if s[i]小于等于capacity[j]//能放进去
输出s[i],j
计算此箱子剩余容量capacity[j]=capacity[j]-s[i]
break;
for i=1 to 1001
if capacity[i]为100
输出i-1 break
end
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
问题出现在我对数组的初始化上,这样子对箱子初始化,没有完全初始化,下面的判断就会出错,导致最坏情况和最小n的情况出现问题,只需把数组单独拿出来初始化就可解决问题。
二、截图本周题目集的PTA最后排名
PTA排名
三、同学代码结对互评
1.互评同学名称
周炳辉
2.我的代码、互评同学代码截图
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
我的代码用的方法是先找出每行的最大数放在数组里,再找出每列的最小数放在数列里,在判断有没有交叉点,从而找出鞍点;而周炳辉的代码则是找出一行的最大值后就去比较这一个数符不符合所在列的最小数;我更喜欢周炳辉的代码,因为他的代码并不用再设两个数组,比较方便,看起来比较明了,而且代码长度也比我的短。
四、本周学习总结
1.你学会了什么?
1.1 C中如何存储字符串?
字符串可以存放在字符数组中,数组长度至少是字符串的有效长度+1,尾部 有个结束符'\0'
1.2 字符串的结束标志是什么,为什么要结束标志?
字符串的结束标志是结束符'\0';因为字符串并没有显示地给出有效字符的个数,只能通过结束符'\0'来控制循环
1.3 字符串输入有哪几种方法?
- 1.用scanf("%s",a)来输入字符串
- 2.用getchar()搭配循环输入字符串
- 3.用gets直接输入字符串
1.4 数字字符怎么转整数,写个伪代码?
定义变量i,number
定义字符数组str[10]
输入字符串,初始化i
while str[i]不等于回车符
i++
str[i]='\0';作为结束标志
初始化number
for i=0 to str[i+1]=='\0'
判断是否为数字字符
number=number*10+str[i]-'0'//是则转换成数字
输出number
1.5 16进制、二进制字符串如何转10进制?写伪代码?
16进制:
定义变量i,number
初始化number为0
定义数组hexad来存放16进制数
for i=0 to hexad[i]!='\0'
if hexad[i]为0到9之间的数
number=number*16+hexad[i]-'0'
if hexad[i]为A到F
number=number*16+hexad[i]-'A'+10;
if hexad[i]为a到f
number=number*16+hexad[i]-'a'+10;
输出number
2进制:
定义变量i,number
初始化number为0
定义数组hexad来存放2进制数
for i=0 to hexad[i]!='\0'
number=number*2+hexad[i]-'0';
输出number
2.本周的内容,你还不会什么?
这一题做的时候我不知道该如何填if里面的 那一空,就填了个str1[j+1]!=str2[k+1];后来发现这样子是不可行的,并不能判断整个字符串是否出现,上课讲完之后我恍然大悟。
这一题我做的时候是没错的,但我用编译器编译出来的答案却不一样,后来我选择了相信编译器的答案,所以以后还是要多加仔细分析,编译器可能会有某些我还不懂的设定。
这一题本来int i后面没有分号,所以我发现了六个错误,后来我还是选了加分号这个错误,舍弃掉一个错误。
3.期中考试小结
3.1 你认为为什么没考好?
- 1.我有些基础知识没掌握好,做选择题时有点犹豫;
- 2.没有认真审题,例如第一题读代码写运行结果,我就忽略了前面还有输出,就只写了后面的一个输出
- 3.对于手写代码还有点不习惯,手写代码时感觉有点怪,写的很慢
- 4.做题速度太慢,有一些题目都没时间做,导致失分
3.2 罗列错题
这一题当时做的时候太粗心大意了,没发现x,y都为浮点数,认为是整型的,所以选错了
这一题当时做的也是太粗心了,以为在前面ch已经赋值了,不过其实就算是赋值了也应该用数组,所以就写了个ch;正确做法是((ch=getchar))
这一题当时看了一遍过去没有发现特别明显的错误,后来时间不足,就没有找出所有错误;
正确做法:n应该要赋初值:n=1;double型变量输入时要用%lf;term=-termxx/(n+1)*(n+2)后面要括号起来,否则会导致答案错误;sum=term应该是sum+=term;n++应为n+=2;
#include<stdio.h>
#include<math.h>
int main (){
float a,b,c;
double delta, re, im;
printf("输入 a,b,c:");
scanf("%f,%f,%f",&a,&b,&c);
if (a==0&&b==0) /*a=0 且 b=0 时*/
printf("方程无根\n");
else if(a==0) /*a=0 且 b!=0 时*/
printf("方程有一个根:%.6lf\n",-(double)c/b);
else{
delta=b*b-4*a*c;
re=-(double)b/(2*a);
im=sqrt(fabs(delta))/(2*a);
if (delta<0){
printf(" 有 两 个 不 同 复 根 x1=%.6lf+%.6lfi ,x2=%.6lf-%.6lfi\n",re,im,re,im);
}
else if(delta>0){
printf("有两个不同实根:");
printf("x1=%.6lf,x2=%.6lf\n",re+im,re-im);
}
else{
printf("有两个相同实根:%.6lf\n",re);
}
}
}
这一题因为当时不会求复根,而且代码写的有点乱,没有注释,所以得分较低
3.3 下半学期要怎么调整C的学习?
经过这次期中考试,我发现了我许多学习的薄弱点;下半学期我要加强对基础知识的了解,课堂派的错题要琢磨透彻,理解为什么要这样做;加强阅读代码的能力,做到不仅会写代码,而且还会读代码;加强手写代码的能力,从这次期中考试可以发现自己对于手写代码还有点不习惯,所以平常写代码时可以在纸上先用笔手写一遍,这样子就能加强手写代码能力。