C语言博客作业--一二维数组
一、PTA实验作业
题目1:7-4 简化的插入排序
1. 本题PTA提交列表
2.设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
初始代码为
但提交后显示
没有考虑到最大N,插在尾和N等于0的情况,然后改过之后,但忘记如果N为0插在头,或者x>a[n-1]应插在尾,输出x后结束程序,导致答案错误
题目2:7-8 加法口诀表
1. 本题PTA提交列表
2.设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
开始时不知道加数和被加数要怎么输出,以为可以单独输出,故写出以下的代码,
输出错误,后问了同学,说第一行的+和加数可以单独输出,和存放在数组中和列数的被加数循环输出
但还是输出错误,发现题目要求的是输出下三角,故因加上判断条件i<j;但编译后格式错误
重新读题后发现行末不能有空格,所以当i=n-1时因单独输出
题目3:7-11 二分查找法
1. 本题PTA提交列表
2.设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
编译时输入偶数时,都显示not found,但是输入奇数又可以找到,但是位置多了一,输入在数组以外的数字,输出正确
在pta上提交后显示输出YES的答案错误
这样二分法查找,其中间值m的大小即是所在位置,不用加一,改过之后答案正确
二、截图本周题目集的PTA最后排名
三、同学代码结对互评(1分)
1.互评同学名称
互评同学:田亚琴
互评题目:7-4 简化的插入排序
2.我的代码、互评同学代码截图(此处截图核心代码就好,不一定截图全部代码,图上指明是谁的代码。)
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
我和亚琴的代码 最大的不同是:
1.亚琴一开始就将x赋值给a[n],x从已经排好序的整数最后一位开始比较
2.我是考虑各种情况(1)n=0;(2)n=1&&a[0]<x;(3)x>a[n-1] (4)a[i]>x分了四种情况来讨论
各自优势:亚琴的代码简洁,并且比较好理解;我觉得相比之下我的代码过于繁琐,并且有时还会弄错
我更喜欢亚琴的代码,以后好好向他学习这方面的能力
四、本周学习总结
1.你学会了什么?
1.1 C中如何存储字符串?
1.字符串的存储--数组初始化,例如:
static char s[6] = {'h','a','p','p',y,'\0'},数组s中就存放了字符串“happy”
(字符串由有效字符和字符串结束符‘\0’组成)
2.字符串的存储--赋值和输入
例如:static char s [80];
s[0] = 'a';
s[1] = '\0';
采用赋值的方法将字符串“a”存入数组s;且其等价于 static char s [80] = “a”;
1.2 字符串的结束标志是什么,为什么要结束标志?
字符串的结束标志是'\0',因为字符串并没有显示地给出有效字符的个数,只规定在字符串结束符'\0'之前的字符都是字符串的有效字符,一般通过比较数组元素的值是否等于'\0'来决定 是否结束循环,即用结束符'\0'来控制循环
1.3 字符串输入有哪几种方法?
1.直接输入:scanf("%s",str1)
2.gets(str1)
3.使用循环while((str1=getchar())!='\0')
1.4 数字字符怎么转整数,写个伪代码?
定义number,i,用于存放转换成的整数,定义数组str[]用于存放数字字符
i=0;
while((str[i]=getchar()!='\n') i++; str[i]='\0'; //输入字符串
for(i=0;str[i]!='\0';i++) // 循环条件:str[i]不等于'\n'
number=number*10+str[i]-'0' / /转换成数字
输出number
1.5 16进制、二进制字符串如何转10进制?写伪代码?
16进制字符串转10进制
定义i,定义数组hexad[80]用于存放16进制字符串,定义number存放转为十进制的结果,number=0;
i=0;
输入字符串while((hexad[i] = getchar())!='#')//假设‘#’为结束符
i++;
hexad[i]='\0' //将字符串结束符也存入数组
for(i=0;hexad[i]!='\0';i++)遍历整个数组,逐个转换
if(hexad[i]>='0'&&hexad[i]<='9' // 如果是0~9的数字字符
number=number16+hexad[i] -'0'
else if(hexad[i]>='A'&&hexad[i]<='F' ) //如果是A~F的大写字母
number=number16+hexad[i] - 'A'+10;
else if(hexad[i]>='a'&&hexad[i]<='f' ) //如果是a~f的小写字母
number=number*16+hexad[i] - 'a'+10;
输出number
2进制字符串转10进制
定义i,定义数组str[80]用于存放2进制数,定义number存放转换为十进制的结果
i=0;
输入字符串 while((str[i]=getchar())!='\0')i++;
遍历数组str[i]
for(i=0;str[i]!='\0';i++)
number=number*2+pow(i,2)
输出十进制数字number
2.本周的内容,你还不会什么?
1.对于二维数组的使用还不是很好,各进制之间的转换还不是很熟练,
2.课堂派上的错题
输入时过于粗心,少打了&;数组中的前n-1数依次比较大小,故i<n-1;如果a[min]>a[i],则交换位置,将下标j赋值给min
定义的c为字符型,输入时用c=getchar();i=0,输出 的大写字母用i+65,表示ASII 码值
给j附初始值,j=0;sent是字符串,输入时用gets(sent);i<80改为sent[i];当输入的字符不是c,则将这个字符存入另一个数组中,sent[j++]=sent[i];将字符串结束符也存入数组sent[j]中;
3.期中考试小结
3.1 你认为为什么没考好?
- 1.选择题:对课本的基础知识掌握的还不够牢固,对于各进制之间的转换概念不清晰,
- 2分析程序:平时对代码的阅读量太少,导致离开编译器要自己读程序会理解错程序的意思
- 3.填空和改错:还是平时的代码练习太少了,不能很好的反应过来程序需要表达的意思
- 4.编程:写得程序结构混乱,平时很少用手写代码,没有了编译器提示错误点,导致错误也未知,还有平时写完代码后没有很好的复习,导致曾经做过的题也做错
其实这次考试考不好的最主要原因还是在于自己平时的学习方法不对,对预习作业不够认真,导致基础的知识掌握的很不牢固,对于老师说过的题目没有及时的复习,自己做错过的题目有时也会忘记去订正,导致犯同样的错误,平时的编程量和代码的阅读量太少,以至于拿到一道题目会思考很久;平时调试一道题目会花上很多时间,做题效率太低
3.2 罗列错题。
- 选择题:2.将十六进制数(1EB)16转换为十进制数;
十六进制数中A表示10,则B表示11,E表示14;故这个十六进制数是(11416)16,转换为十进制数为11616+1416+111=491; - 填空题:4.输入以后字符,统计并输入其中英文字母、数字和其他字符的个数
考试考虑忘记英文字母还有大写字母,只考虑了小写字母,所以弄错,重新作答1.char 2.(ch=getchar()) 3.(ch>'a'&&ch<='z'||ch>='A'&&ch<='Z') - 改错题:1.设计一个函数MaxCommonFactor(),利用欧几里得算法,即辗转相除法计算两个正整数的最大公约数
考试时读题不仔细,导致很多错误没有发现
1.int MaxCommonFactor (int a ,int b)是函数声明,应该在末尾加分号
2.scanf("%d%d",a,b)输入时表示要加&,即scanf(“%d%d”,&a,&b)
3.x=MaxCommonFactor(int a,int b)此处为调用函数,不是定义函数,应改x=MaxCommonFacor(int a,int b)
4.do while循环时满足条件才会进入循环,所以当余数不等于0时才进入循环,所以while(r==0)应改为while(r!= 0)
5.最后是将b赋值给了a,r赋值给了b,所以循环结束后,a表示被除数,即此时的最大公约数,b表示余数 - 编程题:3.编写一个函数,求从n个不同的数中取r个数的所有选择的个数,其个数值为:
考试时,手写的代码结构太过混乱,导致得分很低
3.3 下半学期要怎么调整C的学习?
认真对待每一次的预习作业,把基础知识掌握好,自己的错题或不会做的题及时订正,增加代码的练习量和阅读量,还有平时养成多看博客的习惯,参考别人的思路,借鉴学的好的同学的学习方法和解题思路,不要在一道题上花太多的时间,如果很久没有思路,可以参考同学的思路,按照自己的理解重新写代码,提高学习效率