C语言博客作业--一二维数组
一、PTA实验作业(4分)
题目1:求整数序列中出现次数最多的数
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(用代码表示扣分)
定义number为要输入的数字个数,count[1000]存放重复出现的数字次数,a[1000]存放输入的N个整数,循环变量i,j,n存放数字重复次数最多的次数
输入number
将count[i]全部赋值为0
将序列存放到a[i]中for(i=0;i<number;i++){
scanf("%d",&a[i]);}
if(a[i]==a[j])
count[i]=count[i]+1;//出现重复数字count数组将累加1
for(i=0;i<number;i++){
if(count[i]>n){
n=count[i];
j=i;}}//将重复次数最多的数的下标赋给j
输出a[j]和n
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.本题调试过程碰到问题及PTA提交列表情况说明。
-
1.一开始当a[i]==a[j]时我直接用n来累加次数,结果每次都出现随机数。
-
解决办法:看到运行结果之后我就知道了问题所在,不只是一个数可以重复出现,可以几个数都有重复出现过而我要把这些数都记下来然后再比较哪个数出现次数最多,可是我的n只能存放一个数,这个时候我有想到用数组来解决,但是我不知道数组要怎么累加,所以就去百度了一下,最后得到了结果count[i]=count[i]+1,这样重复数字出现时就可以累加多组数据。
-
2.用了数组count来计数后出现次数最多的数字的次数是对了,但是出现次数最多的数字还是没法正确输出,输出的还是一个随机数。
-
解决办法:后来我仔细回去检查一下代码发现我输出的n和对应的最多数是不对应的,所以后来我就加了一条语句让出现次数最多的数的下标赋给j防止被更改然后输出a[i]就对了。
题目2:简化的插入排序
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(用代码表示扣分)
定义变量x为要插入序列的数,N为输入整数个数,i为循环变量,数组a[100]
输入N,X
输入数组scanf("%d",&a[i]); if(a[i]>=a[i-1]);}//保证输入的序列是有序的
a[i]=x;
for(i=N-1;i>=0;i--){
if(a[i]>x){//将x插入序列中
a[i+1]=a[i];
a[i]=x;}}
输出a[i];
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.本题调试过程碰到问题及PTA提交列表情况说明。
-
1.插入排序时x插入到序列中后,后面的数都被更改了
-
解决办法:当x比a[i]小时插入序列中同时a[i]=a[i+1],a[x]=x这样就不会被更改。
-
2.序列没有被更改但是输出还是不对
-
解决办法:看来看去没有发现什么问题,用devc调试后发现我的循环条件好像有问题,我之前的循环条件是for(i=0;i<N;i++){所以就让x=a[i]然后将循环条件改成for(i=N-1;i>=0;i--)就对了。
题目3:判断上三角矩阵
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(用代码表示扣分)
定义T为待测矩阵的个数,n为矩阵的行数和列数,i,j,k为循环变量,flag用来判断矩阵是否为上三角矩阵,a[i][j]存放矩阵
输入T
for(k=1;k<=T;k++){
输入n和数组a[i][j]
flag=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i>j&&a[i][j]!=0) flag=0;//对下三角进行判断
}
如果flag=1;输出YES,否则输出NO
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.本题调试过程碰到问题及PTA提交列表情况说明。
- 1.一开始没有注意还要输入几个矩阵,当时的程序无法输入多个矩阵进行判断
- 解决办法:在开头加上条件for(k=1;k<=T;k++)将接下来的程序都放入这个循环中就可以了。
- 2.第二个出现的问题比较蠢,,,,题目说是上三角矩阵的判断我就直接用i<j了,根本没有在意题目真正想要我们判断的是下三角。。。。。
- 解决办法:将i<j改成i>j就好了
- 3.不管我输入的矩阵是不是上三角矩阵,程序输出的都是YES
- 解决办法:这个问题我真的找了好久都不知道哪里错了,在调试的过程中无意将flag=1;的条件放在判断下三角矩阵的循环前面然后就可以正常输出了,可是我一直不知道为什么,直到后来经过室友提醒才知道,flag=1放在最前面定义变量的位置时第一次循环是没有问题的,但是输入第二个矩阵时flag的值就没办法变化导致第二个矩阵无法进行正确的判断。
二、截图本周题目集的PTA最后排名。(2分)
三、同学代码结对互评(1分)
1.互评同学名称
郭锐倩
2.我的代码、互评同学代码截图(此处截图核心代码就好,不一定截图全部代码,图上指明是谁的代码。)
-
我的代码
-
锐倩的代码
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
- 我的代码思想是将数组最后一个元素提出,然后把数组的其他所有元素后移,再把数组最后那个元素赋给数组的第一个位置,锐倩的代码是将要移动的数字个数整个一起移动,用另一个数组来存放原数组中的元素,然后输出修改后的数组和原数组的前一部分。我比较喜欢锐倩的代码吧,因为我一开始的思路也是这样的,只是因为我对这个不太熟练没法用两个数组做题,实在是调不出来才换了思路,而且同学一直说好像我的思路有点难懂,还是同学的那种思路比较容易想到吧。
四、本周学习总结(3分)
1.你学会了什么?
1.1 C中如何存储字符串?
- C将字符串作为一个特殊的一维字符数组来处理存储内容如下:
1.2 字符串的结束标志是什么,为什么要结束标志?
- 结束标志是‘\0’,结束标志用来控制是否结束循环
1.3 字符串输入有哪几种方法?
- 有三种,char a[6]={'H','A','P','P','Y','\0'},char a[6]={"HAPPY"},char a[6]="HAPPY"
1.4 数字字符怎么转整数,写个伪代码?
定义变量i,字符数组a[10],number为整数数字
输入字符串
i=0;
while((a[i]=getchar()!='\n')
i++;a[i]='\0';
for(i=0;a[i]!='\0';i++)
if(a[i]>='0'&&a[i]<='9')
number=number*10+a[i]-'0';
输出number
1.5 16进制、二进制字符串如何转10进制?写伪代码?
定义变量i,十进制数number,16进制字符串a[100],
输入字符串
i=0;
while((a[i]=getchar()!='\n')
i++;a[i]='\0';
number=0;
for(i=0;a[i]!='\0';i++)
if(a[i]>='0'&&a[i]<='9')
number=number*16+a[i]-'0';如果是转为二进制就改为number=number*2+a[i]-'\0'
if(a[i]>='A'&&a[i]<='Z')
number=number*16+a[i]-'A'+10;如果是转为二进制就改为number=number*2+a[i]-'A'+10
if(a[i]>='a'&&a[i]<='z')
number=number*16+a[i]-'a'+10;如果是转为二进制就改为number=number*2+a[i]-'a'+10
输出十进制数number
2.本周的内容,你还不会什么?
- 1.如何灵活的在一个题目中运用一个数组来存放另一个数组里的元素,不是很清楚。就像这次pta中数组循环左移这题,我本来的思路是要左移m位,那就先将m位以后的数输出在将原本在m以前的数放在后面输出,这个时候就想到了用另一个数组先存放a[i]中的元素,因为前面输出m以后的数后a[i]已经被改变了,我的确可以做到将a[i]的值给另一个数组,但是当要输出另一个数组中的前m位时就怎么也不对,最后不得不放弃这个思路。
- 2.输出这样形状的数,还是有些不会
- 之前不用数组时好像懂得了一点门道,可是要用数组输出就不会了
3.期中考试小结
3.1 你认为为什么没考好?
- 我这次主要是选择题失分特别严重,虽然其他题也没得多少分,,,,但是选择题这次得分就得了几分,才对了三分之一。明显的可以看出基础非常薄弱,也因为不是对这些知识点很熟练,在选择题上就花了太多时间,导致后面两题编程题都没有时间写,而第一题编程题也是虽然做过却还是不能全对。还有一点就是阅读代码的能力太弱了,就像分析程序的第一题,都没有看出来它是要多次输出sum的,这几个方面的缺陷都很明显,也很严重。
3.2 罗列错题。
- 选择题
将十六进制数(1EB)转化成十进制数,那个时候对十六进制的数一点也不熟
解法应该是: E=16进制中的14,B=16进制中的11,所以十进制数位11616+14*16+11=491 - 填空题
阅读程序的第四题,当时看的太急了,没有看到题目调用了两次函数,而且我现在也不知道当时明明没有看到有两个函数调用,我为什么还会输出两个数,,,,,
题目:
#include<stdio.h>
int main()
{
int k=4,m=1,p;
p=func(k,m);printf("%d",p);
p=func(k,m);printf("%d\n",p);
return 0;
}
func(int a,int b){
static int m=0,i=2;
i+=m+1;
m=i+a+b;
return m;
}
调用函数func,i=i+m+1,此时的m=0,i=2,运行后i=3,所以m=3+4+1=8,第二次调用函数因为是静态变量所以此时i=3,m=8,i=8+1+3=12,m=12+4+1=17
- 改错题
这次改错题没有错那么多,就是第三个程序,第七空那里那个空是这样的while( !='\n'),我当时直接就把ch填进去了,根本没有想到ch是无法输入的,应该填的是ch=getchar() - 编程题
第一个编程题猜数字
这是我考试时写的代码,确实可以正常执行,也可以猜数,但是不能多次猜,猜了一次就退出循环了,而且不可以产生随机数,要猜的数是自己输入的。
#include<stdio.h>
int main(void)
{
int yournumber,mynumber,i,count=0;
for(i=1;i<=10;i++){
scanf("%d",&mynumber);
scanf("%d",&yournumber);
count++;
printf("your guess is %d",yournumber);
if(yournumber==mynumber)
printf("You are right"); break;
if(yournumber!=mynumber){
if(yournumber>mynumber)
printf("your guess is lager than num,try again: ");
count++;
if(yournumber<mynumber)
printf("your guess is smaller than num,try again: ");
count++;
}
}printf("guess %d times",count);
return 0;
}
- 下面是我修改过后的代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int yournumber,mynumber,j,count=0;
mynumber=rand()%100+1;
for(j=1;j<=10;j++){
scanf("%d",&yournumber);
printf("your guess is %d",yournumber);
count++;
if(yournumber==mynumber)
printf("You are right");
if(yournumber!=mynumber){
if(yournumber>mynumber)
printf("your guess is lager than num,try again: ");
if(yournumber<mynumber)
printf("your guess is smaller than num,try again: ");
if(count>10) break;
}}
printf("guess %d times",count);
return 0;
}
- 运行结果如下图
3.3 下半学期要怎么调整C的学习?
- 1.现在我自己可以明显的感觉到自己学习C语言要比其他人吃力,所以比起其他同学要去攻克难题,我自己还是要先把基础学好。从这次考试就可以看出我真的有些最基础的东西都不知道,这样的情况下不可能可以做出什么难题。
- 2.我的学习效率真的不是很高,有时候一道挺简单的题目都可以调一个小时,难一些的还条过一两天也调不出来的。以后我会控制自己做题的时间不能在一题上磨叽太久,如果连思路都没有的题会先跳过,后面再回来做,如果最后实在是没有什么思路再去请教同学这题的思路究竟是怎样的,然后再试着用这样的思路看看能不能调出来。