第2次作业
一,作业要求:
https://edu.cnblogs.com/campus/hljkj/Cprogramming_2018Autumn_CST2018_4/homework/2502
二,PTA作业
(1):计算机18秋-函数:6-1 统计个位数字
1:实验代码:
int Count_Digit ( const int N, const int D ){ int result=0; int i, x,y,z; y=N; z=D; if(y<0) { y=-y; } if(y>0) { for(i=1;i<=9;i++) { x=y%10; y=y/10; if(x==z) { result++; } } } else { result=1; } return result; }
2.解题思路:
(1):
第一步:定义变量 result=0; 定义i,x,y,z;
第二步:将使y=N;z=D;
第三步:判断y的值是>0或<0或=0
第四步:设置对应判断下面的值if(y<0);y=-y;
if(y>0) ;x=y%10; y=y/10,辗转相除法求对应位数的值;
第六步:在y>0的情况下再设定if(x==z);result++;来确定各个部位数字出现的次数;
第七步:设置独特情况下的result值即y=0;result=1;
第八步:输出result值并输出结果。
(2)流程图:
3.本题调试过程碰到问题及解决办法
错误截图与断点:
问题:
(1):由提示可知当N=0,且输出1的情况没有考虑,而且在这种情况下尝试输入0 0,答案却是9。思考分析当输入为0 0时,0出现的次数应该正如提示所指出的1,
(2):sample,数字<0且不连续出现
解决方法:
(1). 所以我设置了利用if进行判断如果输入值为0,则直接将1的值返还给result。且在做题时没有按照顺序写程序导致程序出错,我先将 if(y>0)写在前,if(y<0)写在后当输入为负数时就直接不执行if(y>0),所以说语句的逻辑顺序很重要。
(2).不断地在if判断语句和for循环各个中插入printf{“%d”,y)查看输入值在不同位置的数值变量,找到问题的所在,发现y的正负,是否为0会影响结果于是做了如上设计。
(2),计算机18秋-数组1:7-2 输出数组元素
1:实验代码:
#include<stdio.h> int main(void) { int i,n; int a[10]; int b[10]; scanf("%d", &n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=0; i<n; i++) { b[i] =a[i+1]-a[i]; } for(i=0; i<n-1; i++) { if((i+1)%3!=0){ if(i==n-2){ printf("%d", b[i]); }else{ printf("%d ", b[i]); } } if((i + 1) % 3 == 0) { printf("%d\n",b[i]); } } return 0; }
2.解题思路:
(1):
第一步:进行函数声明,定义循环变量i,定义数组a[i],b[i];
第二步:初始化数组a[i];
第三步:使用数组a[i],使b[i] =a[i+1]-a[i],并初始化数组b[i];
第四步:构造b[i]数组的输出格式,按每行三个元素的格式输出结果,通过判断if((i+1)%3==0或!=0)来进行格式的塑造;
第五步:设计在换行的情况下不出现空格:if((i + 1) % 3 == 0);printf("%d\n",b[i])无空格;
第六步:设计在不换时最后一位数后面也不出现空格的情况;在if((i+1)%3!=0)的情况下再进行判断if(i==n-2);printf("%d", b[i]);无空格
第七步:使用数组b[i];
第八步:输出结果。
(2):流程图
3.本题调试过程碰到问题及解决办法
错误截图与断点:
遇到问题时:
1.格式错误和输出的个数出错;
2.满足三个字符换行设计出现问题;
3.不满三个数字的时候最后一位数后面空格出错错误;
解决方法:
1.翻阅书本查阅书籍,翻看老师上课留下的ppt和设计文本;学到了一些技巧在需要设置空格的那一处设置显眼特殊的标志‘*’进行观察 ,以此分析是否出现了空格,进行正确的程序设定;
2.仔细审题发现输出的数应该比输入的数少一项,设定循环减少一次;
3.利用if(i==n-2)进行判断是否到了最后一项对最后一项的输出进行特殊处理不输出空格。
(3),计算机18秋-数组2:7-4 选择法排序
1:实验代码:
# include <stdio.h> int main(void) { int i,index,k,temp; int a[10]; for(i = 0; i<10; i++) { scanf("%d", &a[i]); } int cnt=0; for(k = 0; k<10-1; k++){ index = k; for(i = k + 1; i<10; i++) { if(cnt<3){ if(a[i] < a[index]) { index = i; cnt++; } } else{ break; } } temp = a[index]; a[index] = a[k]; a[k] = temp; } for(i = 0; i<10; i++) { printf("%5d", a[i]); } printf("\n"); return 0; }
2.解题思路
(1):
第一步:进行函数声明,定义循环变量i,k,最小下标index,临时变量temp;,定义数组a[10];
第二步:初始化数组a[10];
第三步:定义计算次数 cnt=0,来计下排序的轮数;
第四步:用选择法对10个整数按升序排序,循环比较数的大小,并依次排序;
第五步:在选择排序法中插入计数变量cnt,来判断排序的轮数if(cnt<3),则继续执行下面程序排序;else,break,跳出循环;
第六步:使用数组a[i];
第七步:输出结果。
(2):流程图:
3.本题调试过程碰到问题及解决办法
错误截图与断点:
遇到的问题
1.起初没有在第一个大循环给index在每一次循环后定义新的初值即index = k;导致前几位数正确后几位发生错乱;
2.刚开始的时候没有考虑到排序的轮数;
2.排序三次后循环终止时break的位置不对,起初放在大的循环下面但是结果不对;
解决方法:
(1):通过在各个循环中插入printf("%d",index)来检查index的值最后发现了这个问题将index=k;放在第一个大循环的下面第二个小循环的上面;
(2):反复审题后了解到只排序三轮所以设计一个计数量cnt再用if判断排序次数是否到了三次;
(3):利用插入printf在各个循环里面检查变量是否正确,发现只有插入到小的循环里才能运行出正确答案;输入的空格字符有五个字符 翻阅书籍,了解利用5%d可以进行设定空格长度;
三,个人总结:
(1):学习内容
数组
1.一维数组的定义与使用。
2.区分数组的定义和数组元素 的引用
3.学会使用一堆数组编程;计算fibonacci数列
;数组的查询;选择排序法;冒泡排序法;二分法查找
5.数组的内存结构;学习使用一维数组进行编程
6.矩阵与二维数组:方阵转置;日期的计算
收获:1.对数组的理解更加的深刻,更深层次学会到数组的定义,初始化,运行与使用
2.博客园,pta作业做起来更加得心应手,流程图画的准确。
3.对c语言的了解更加的加深了,运用的更到位
4.对各种c程序了解的更加深刻,运用越发自如。
1.遇到问题时难以正确的对数组进行正确的程序设计;
2.二维数组的设计与运用相对比较困难,较为复杂;
3.方阵与数组的混合运用比较复杂,数组的转置还是令人头晕目眩;
措施:
1.对上课所学习的知识进行反复巩固与复习;
2.与同学进行交流,分享自己的见解;
3.在mooc上学习视频并在讨论区交流;
4.上网搜索相关资料,在博客园中学习;
5.不断地在pta中反复训练与加强理解。
周数 | 周代码行数(行) | 周代码时长(时) | 周写博客字数 | 周写博客时长(时) | 累积周代码行数 | 累积博客字数 | 累计代码时长(时) | 累积博客时长(时) |
第14周 | 900 | 6 | 400 | 1 | 900 | 400 | 6 | 1 |
第15周 | 1000 | 7 | 300 | 2 | 1900 | 700 | 13 | 3 |
第16周 | 1100 | 8 | 100 | 1.5 | 3000 | 800 | 21 | 4.5 |
第17周 | 1000 | 6 | 1000 | 12 | 4000 | 1800 | 27 | 16.5 |