一、第六次PTA作业
题目1.7-4 打印菱形图案
1.本题PTA提交列表
2.设计思路
- 声明函数ling(定义整型变量n)
- 定义函数main(void)
- 定义整型变量n
- 输入n
- 使用函数ling
- 定义函数ling(定义整型变量n)
- 定义整型变量i和j
- 使用大循环for(i=1;i<=(n+1)/2;i++)控制前半部分的格式
- 使用小循环for(j=1;j<=(n+1)/2-i;j++)来输出空格
- 输出两个空格
- 使用小循环for(j=1;j<=2i-1;j++)来输出
- 输出一个*和一个空格
- 大循环最后输出回车
- 使用大循环for(i=1;i<=(n-1)/2;i++)控制后半部分的格式,比第一个大循环少一步
- 使用小循环for(j=1;j<=i;j++)来输出空格
- 输出两个空格
- 使用小循环for(j=1;j<=n-2i;j++)来输出
- 输出一个*和一个空格
- 大循环最后输出回车
3.代码截图
4.本题调试碰到问题及解决办法
- 最开始想思路的时候把号后面的空格也考虑了进去,然后导致代码非常繁琐而且格式一直出错,这题只需考虑三个地方的输出即前面的空格、中间的号和最后的回车,而其中运用for来依次输出便可,但我发现我存在对for中何时停止循环判断非常慢,经常需要反复尝试才能成功,这可能和我数学基础较差有关,同时也和我没有一个非常清晰的思路有关,在这题我感觉到实现写好一个设计思路对后面编程帮助非常大,思路对了之后改代码的次数明显减少,所以还是要多练习多思路的锻炼和书写。
题目2.7-5 BCD解密
1.本题PTA提交列表
2.设计思路
- 定义主函数main
- 定义整型变量x,n,i
- 输入x
- 令i等于x除以16的余数
- 令n等于x除以16后乘以10后加上i的数
- 输出n
3.代码截图
4.本题调试碰到问题及解决办法
- 这道题题目我读不懂,想了很久到最后还是没看懂到底要我们做什么,代码是按照他给出的例子一步一步直接套出来的,所以看着就那几步,这题贴上来是希望有谁能跟我解释一下题目的意思或者说说自己是怎么解这道题的
题目3.7-10 简单计算器
1.本题PTA提交列表
2.设计思路
- 定义主函数main
- 定义整型变量i和sum
- 定义整型变量x=0
- 定义字符变量sign
- 运算符sign初始值为'0'
- 输入sum值
- 当字符sign不为字符=时进入循环
- 输入字符变量sign
- 如果字符sign为符号=时退出循环
- 输入i
- 题目要求不考虑计算优先级,可以从左到右顺序计算,我们可以依次判断每一个运算符号
- 如果字符sign为+号时sum=sum+i
- 如果字符sign为-号时sum=sum-i
- 如果字符sign为号时sum=sumi
- 除法运算较为特殊,需要判断分母是否为0的情况
- 如果字符sign为/号时
- 如果分母不为0则sum=sum/i
- 否则设置一个出错后的判断量x且令x=1
- 如果输入除了上述的符号以外的字符时判断出错则令x=1
- 在循环外判断x,如果x等于1
- 输出ERROR
- 否则输出最后数值sum
3.代码截图
4.本题调试碰到问题及解决办法
- 这题我觉得难点主要在最后判断是否出错的点上,因为现在我对于循环的部分有点分不清楚,思路有点混乱,所以会将输出放错位置,此题的运算符号输出错误的printf总共试了3个位置才正确
第一是直接在判断分母的地方输出错误
第二次是在循环最后输出
这两个地方结果都是错误的,应该在循环外输出错误才对,还有一开始一直少判断了分母是否为0的状况导致错误,刚做时还考虑了是否要按优先级计算但是没做出来,编译不出。
二、截图本周题目集的PTA最后排名。
三、本周学习总结
1.你学会了什么
这次练习对于各个循环格式和对循环何时停止的判断思路更加清晰
1.1一维数组如何定义、初始化?
定义, int a[输入数组内个数个数];
初始化 int a[]={分别输入数组内的数,用逗号隔开};
1.2一维数组在内存中结构?可画图说明。数组名表示什么?
一维数组在内存中结构是连续且线性的,数组名为指针,表示该数组首元素的地址
1.3为什么用数组?
可以通过数组名+索引号简单快捷的操作大量数据,更加方便快捷
1.4介绍选择法、冒泡法、直接插入排序如何排序?伪代码展示
冒泡排序:
设计思路
第一步:定义变量int a[10],i,j,k
第二步:运用for(i=0;i<10;i++) 依次输入各个数值来存入数组a
第三步:运用for(i=0;i<9;i++) 来令第四步反复进行
第四步:for(j=0;j<10-i;j++)
第五步:如果数组a中j大于它后一个数的值则交换这两个数
第六步:运用for循环依次输出a[10]中每个数
插入排序:
设计思路
第一步 : 从第一个元素开始,该元素可以认为已经被排序
第二步:运用循环for( j=i-1 ; j>=0 && t>a[j] ; j-- )依次 取出下一个元素,在已经排序的元素序列中从后向前扫描
第三步:即如果这个已经过排序的元素大于新元素,将该元素移到下一位置即a[j+1]=a[j]
第四步:重复第三步,直到找到已排序的元素小于或等于新元素的位置
第五步:将新元素插入到下一位置中即a[j+1]=a[j];
第六步:重复第二步到第五步
选择插入:
设计思路
第一步:先给数组赋值,n为数组长度
第二步:运用循环for(k=0;k<n-1;k++),令最小值下标 index等于k
第三步:运用循环for(i=k++;i<n;i++)
第四步:如果a[i]小于最小值,则最小值与下标为k的值交换
第五步:输出数组
1.5介绍什么是二分查找法?它和顺序查找法区别?
二分查找法就是从表中间开始查找目标元素。如果找到一致元素,则查找成功。如果中间元素比目标元素小,则仍用二分查找方法查找表的后半部分(表是递增排列的),反之中间元素比目标元素大,则查找表的前半部分。
它相比按照循序一步一步查下去的循序查找法来讲在某些查找量大的情况下会更加方便快捷
1.6二维数组如何定义、初始化?
二维数组定义:类型名 数组名 [行长度][列长度]
二维数组的初始化:类型名 数组名 [行长度][列长度] = { {}, ... ,{}, ...}
1.7 矩阵转置怎么实现?方阵中:下三角、上三角、对称矩阵的行标i列标j的关系?请说明。
对换对角的行数与列数的值
1.8 二维数组一般应用在哪里?
当数组中变量不止一个时即需要某年的某个数的增长量时
2.本周的内容你还不会什么
pta中的7-8 判断合法标识符与7-9 切分表达式——写个tokenizer吧没做出来,对于较为复杂的代码就开始有点力不从心。