一、PTA实验作业
题目1.简化的插入排序
1. 本题PTA提交列表
2. 设计思路
定义数组a[10],x为插入的整数,n存放n个整数,i为循环变量,temp为中间值;
输入数据n
for(i=0;i<n;i++)
将输入的数据赋值给数组元素
输入要插入的数x
for(i=0;i<n;i++){
如果x<a[i],
temp=a[i];
a[i]=x;
x=temp;
}
循环结束后将最后一个值赋给a[i]
for(i=0;i<n+1;i++)
输出数组元素
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
①初步代码,3插入序列中,但最后一个7输出错误。
②初步改正,循环结束后将x赋给最后一个数组元素,题目中一组数据验证正确。
③贴到pta中,提示错误,将0和8代入验证发现错误。
④最后一个数组元素赋值错误,应该将x赋值给它,而不是temp。
⑤修改后验证正确。
题目2.出生年
1. 本题PTA提交列表
2. 设计思路
定义数组a[4],循环变量i,j,year1,year2备份年份,old为岁数,year为年份,n为规定不同数字个数,count存放实际不同数字个数;
赋值count=4;
输入年份year,不同数字个数n;
备份year,year2=year;
while(year2>0){
备份year2,year1=year2;
for(i=0;i<4;i++)
将年份的各位数赋给数组元素;
for(i=0;i<4;i++)
for(j=i+1;j<4;j++)
算出不同数字的个数:
如果a[i]==a[j],count--;跳出循环;
如果count==n
年龄old=year2-year;
输出年龄和年份;
跳出循环;
否则
年份year2递增继续循环
count重新赋值为4进行循环
}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
①初步代码,输出结果错误。
②先修改输出格式,上网查询了如何在输出结果前加上0并初步修改代码。
③初步修改后输出格式正确,但答案错误,通过调试发现数组元素为0时反复比较,使count重复递减。
④应该在比较a[i]等于a[j],count减一后跳出循环进行下一组数据的比较,同一个a[i]与几个a[j]比较会使count递减重复进行。
题目3.加法口诀表
1. 本题PTA提交列表
2. 设计思路
定义数组a[11][11],i,j,k为循环变量,n为整数个数,repeat为循环次数;
输入repeat;
for(k=1;k<=repeat;k++){
输入n表示整数个数
for(i=0;i<=n;i++){
for(j=0;j<=n;j++){
如果i==j==0,输出加号;跳过后面的语句继续循环
如果是第一行的加数,
a[0][j]=j
否则,
如果是第一列的被加数,
a[i][0]=i
否则
a[i][j]=i+j
如果是下三角的数或第一行的数,
如果是一行的最后一个数,输出每行最后一个数后面没有空格
否则,输出数组元素,占四列
}
输出换行
}
}
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
①初步代码,输出答案错误。
②调试后发现在输出加号后程序继续进行并输出,此处错误。
③加上break使程序在输出加号后跳出此循环继续下一个循环,发现改完后第一行的加数没有输出。
④把break改成continue,仅跳过后面的语句,不跳出循环,改完后输出正常。
⑤提交后提示格式错误,于是在每行最后一个数的输出后面加#号输出,发现第一行最后一个数没有考虑到。
⑥代码中加上第一行最后一个数后面不加空格的条件。
二、截图本周题目集的PTA最后排名。
PTA排名
PTA提交列表
三、同学代码结对互评
互评同学名称:田亚琴
互评题目:出生年
2.我的代码、互评同学代码截图
我的代码
同学的代码
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
不同:
①将年份的各位数赋给数组元素中。田亚琴同学的是通过一个个算出后赋值;我是通过循环得出后赋值。
②找出有几个数字不同中。田亚琴同学另外定义一个数组存放0~9的数,再统计出现不同数字的个数;我是通过双重循环统计相同数字的个数。
各自优势:
我目前还比较少碰到需要定义两组数组的题,田亚琴同学的思路值得学习,比如a[num[i]]++的用法。
四、本周学习总结
1.你学会了什么?
1.1 C中如何存储字符串?
字符串可以存放在一维字符数组中。
- ①字符串的储存——数组初始化
例:static char s[6]={'H','a','p','p','y','\0'};→static char s[6]={''Happy''};
→static char s[6]=''Happy'';- ②字符串的储存——赋值和输入
例:static char s[80]; s[0]='a'; s[1]='\0'; →static char s[80]="a";
1.2 字符串的结束标志是什么,为什么要结束标志?
- 结束标志:'\0'
- 字符串没有显式地给出有效字符的个数,只规定在字符串结束符'\0'之前的字符都是字符串的有效字符,一般通过比较数组元素的值是否等于'\0'来决定是否结束循环,即用结束符'\0'来控制循环。
1.3 字符串输入有哪几种方法?
ch=getchar();
scanf("%s",s); //假设s为字符型数组
注:该函数遇回车或空格输入结束,并自动将输入的数据和字符串结束符'\0'送入数组中。gets(s);
注:函数gets()输入的字符串允许带空格,遇回车输入结束。
1.4 数字字符怎么转整数,写个伪代码?
定义字符数组str[10],number为输入的数,i为循环变量;
赋值i=0;
while((str[i]=getchar())!='\0')
i++;
遍历数组str[i]
赋值number=0;
for(i=0;str[i]!='\0';i++)
如果str[i]>='0'&&str[i]<='9'
number=number*10+str[i];
输出number;
1.5 16进制、二进制字符串如何转10进制?写伪代码?
16进制字符串转10进制
定义变量number存放十进制数,a [ i ]存放十六进制字符串,i为循环变量;
number=0;
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;
二进制字符串转10进制
定义数组str[80]存放2进制数,number存放十进制数,i为循环变量;
i=0;
输入字符串
while((str[i]=getchar())!='\0')
i++;
遍历数组str[i]
赋值number=0;
for(i=0;str[i]!='\0';i++)
number=number*2+pow(i,2)
输出十进制数number
2.本周的内容,你还不会什么?
PTA
图书馆一题,对题意的理解还不太清晰,没想出具体思路,因此还没写。
课堂派
预习时对字符串的输入输出方式等一些知识点没有理解透,导致改错题时有的明显错误没改出来。
比如题目提示有多个单词,单词之间有空格隔开,因此应该用gets(sent)。
3.期中考试小结
3.1 你认为为什么没考好?
- 平时做题过于依赖编译器,自己寻找代码错误点及手写代码的能力不足,在平时课堂互动时手写代码就有困难,但平时做题都用devc可以调试,所以没太注重这个问题,到考试时写编程题就力不从心。
- 选择题中考到的一些基础知识点不熟悉,比如进制转化、基础概念。导致选择题花的时间多,正确率不高。
- 平时做课堂派的预习作业时,碰到一些要求填写输出结果的题,遇到不会做的就把代码打到devc中运行出结果,缺乏自身的思考,因此这次期中考分析程序的题目耗时长,得分低。
- 第一次考试,对如何分配时间没有一个正确的概念,到编程题时没时间写。
3.2 罗列错题。
-
选择题
不熟悉运算符的用法,本题中结合方向应该是从右向左。
-
分析程序
ASCII码不熟悉,本题中输出的应该是ASCII码对应的大写字母,而我输出的是ASCII码。
-
阅读程序填空
没有认真思考,t为double类型,i为int类型,因此应该是1.0不是1。
-
改错题
分析程序时间花太多,本题改错题没用太多时间看,因此有些错误点没找出来。
正确答案
-
编程题
不知道如何做到产生随机数,写代码的时候没有先写伪代码打草稿,写出来的代码拼拼凑凑也没有注释。
3.3 下半学期要怎么调整C的学习?
- 逐渐锻炼阅读代码的能力,在做课堂派预习作业时,尽量自己阅读代码得出结果,实在不会再用devc运行,得出结果后再此阅读代码验证答案,如果还不懂可以借助调试器观察其变量变化过程。
- 经常翻看博客园中的知识总结,巩固书中的基础知识、概念。
- 尝试写代码前先写在纸上,再打到devc中运行,锻炼手写代码的能力。