C语言博客作业--字符数组
一、PTA实验作业。
题目1:7-1 字符串转换成十进制整数
1.本题PTA实验结果
2.设计思路
3.代码截图
4.本题调试过程碰到问题及解决办法
-
碰到的问题:
- ![](http://images2017.cnblogs.com/blog/1232112/201712/1232112-20171210173052849-2040589433.png)![](http://images2017.cnblogs.com/blog/1232112/201712/1232112-20171210173552255-591153004.png)![](http://images2017.cnblogs.com/blog/1232112/201712/1232112-20171210173628755-1462783721.png)应该再输出‘-’时应该跳出循环但直接下去了,这样所有的负号都会输出 - ![](http://images2017.cnblogs.com/blog/1232112/201712/1232112-20171210173911521-12300074.png)在下面应该加一个当其数字前有负号时应该将其输出
-
解决办法:添加个判断第一个负号进入下一个数组,但以后的均不进入下一数组,在输出时如果有负号则先输出负号,在输出数字。
题目2:7-4 查验身份证
1.本题PTA实验结果
2.设计思路
-
1.定义数组a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2},b[100]={0};z[11]={0,1,2,3,4,5,6,7,8,9,10}定义字符数组 m[11]={'1','0','X','9','8','7','6','5','4','3','2'};ch[100][100];定义变量N,x=0,r
-
2.输入N的值,并定义i,j=0,sum=0,count=0;
-
3.for(i=0;i<N;i++){j=0,输入ch[i][j]直到输入的为‘\n’时,j++;直至外层循环循环结束
-
- for(i=0;i<N;i++){sum=0;r=0;x=0;
for(j=0;j<18;j++){如果ch[i][j]不为16进制所代表数或字母,则x=1,退出内循环;
- for(i=0;i<N;i++){sum=0;r=0;x=0;
-
5.如果(j<17,sum=sum+(ch[i][j]-'0')*a[j];执行上述内循环直至结束;
-
6.如果x!=1,r=sum%11计算出r模值;for(j=0;j<11;j++){如果z[j]r并且m[j]ch[i][17],count++;b[i]=1;退出这个循环。
-
- 如果count==N){printf("All passed",否则输出每个身份证,注意若其中的b[i]值为0,则直接进入下一次循环,每次内循环结束后都要换行。
3.代码截图
4.本题调试过程碰到问题及解决办法
-
碰到的问题:
- ![](http://images2017.cnblogs.com/blog/1232112/201712/1232112-20171210175012724-28493980.png)![](http://images2017.cnblogs.com/blog/1232112/201712/1232112-20171210175024677-1823910401.png)应该输入17个数之后进入下一循环,而他刚循环16个数就直接输出了 - ![](http://images2017.cnblogs.com/blog/1232112/201712/1232112-20171210175343818-90206111.png)![](http://images2017.cnblogs.com/blog/1232112/201712/1232112-20171210175518802-1010222276.png)输出值N=100时,直接停止运行,范围出了问题
-
解决办法:将范围重新划定。
题目3:7-10 正整数A+B
1.本题PTA实验结果
2.设计思路
-
1.定义字符数组a[1001]={0},op[2]={0};,定义数组b[2]={0};定义变量i=0,sum=0,j=0,time=1,x=0;
-
2.输入a[i],while(a[i]!='\n',如果为数字,则‘sum=sum*10+a[i]-'0';’如果不为数字和空格,则x=1;如果(a[i]==' '&&time!=1,x=1;
-
3.如果(a[i]' '&&time1,如果(x==1,op[j]='?';否则如果(sum<=0||sum>1000),op[j]='?',否则b[j]=sum;然后再j++;sum=0;time++;x=0
-
4.i++;输入a[i],进入下一次循环直至退出循环。
-
5.如果(x==1,op[j]='?';否则如果(sum<=0||sum>1000),op[j]='?',否则b[j]=sum;
-
6.如果op[0]'\0'&&op[1]'\0',输出("%d + %d = %d",b[0],b[1],b[0]+b[1]);
如果(op[0]!='\0'&&op[1]'\0'),输出("? + %d = ?",b[1]),
如果(op[0]'\0'&&op[1]!='\0',输出printf("%d + ? = ?",b[0]);
如果(op[0]!='\0'&&op[1]!='\0'输出printf("? + ? = ?");
3.代码截图
4.本题调试过程碰到问题及解决办法
-
碰到的问题:
- 这些都与所需不同
-
解决办法:首先加一个判断'.','-'的语句,在将值大于1000.和小于1的都判断为'?'.
二、截图本周题目集的PTA最后排名。
1.PTA排名
三、同学代码结对互评(1分)
1.互评同学名称
陆勇治
2.我的代码、互评同学代码截图(此处截图核心代码就好,不一定截图全部代码,图上指明是谁的代码。)
-
我的:
-
他的:
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
-
我是做了二轮筛选,第一次是将除了开头的负号和数字还有一些字母之外的所有其他字符全都舍去,第二次才开始求值,因而我的代码量比他的大一些。
-
他是直接一边判断是否是数字,一边进行计算,最后是负号的直接将最后值乘上-1就可以了。
相较之下,他的代码比较简便,而我是一步一步的筛选,因为这样可以更好的理清思路,减少犯错率。当然我也会向陆勇治同学学习,学习他如何将代码变得更简便。
四、本周学习总结
1.你学会了什么?
1.1指针变量如何定义
int a,*p;char b,*q;
p=&a;q=&b;
1.2 指针加法运算运用在哪种情况,2个指针变量能否相加?
-
可以用于改变指针指向元素的值,或者改变指向数组的位置;
-
不能相加;
1.3 指针不赋初值,直接使用,会出现什么情况,请用DEVC验证,并截图展示?
用没有初始化的指针可能会使程序崩溃。
1.4 课堂派上关于分离浮点数的整数部分和小数部分那题,请用DEVC验证实现,并在此贴图展示,同时说明哪句是指针变量做函数形参,函数实参应该怎么有什么用处?
-
形参*intpart,float *fracpart
-
实参作地址,便于能将其放进自定义函数内。
1.5 请把课本的冒泡排序的函数改成指针变量做形参格式,并把代码写在底下,注意用markdown语法渲染。
void bubblde(int *p,int n)
{
int i,j,t;
for(i=1;i<=n;i++)
for(j=0;j<n-i;j++)
if(*(p+j)>*(p+j+1)){
t=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=t;
}
}
1.6如何定义一个指针变量指向数组,如何用指针变量表示数组元素?
int *p,a[2];
p=a;(p=&a[0];)
1.7如何定义字符指针指向字符串?指针指向字符串后,初始位置在哪里?
char *p,op[]={ab};
p=op;
初始位置在op[0]
1.8 利用字符指针操作字符串,如设计函数实现字符串连接,请在此贴图展示代码。说明指针表示字符的方法好处是什么?
方便数组里的值从主函数到自定义函数。
2.本周的内容,你还不会什么?
2.1课堂派错题罗列及如何订正。
-
我选的那个,是定义了指针但没有指向某个变量而直接将a的值赋给指针。所以错了。应该将其定义并指向,如*p=&a即可
-
理解错误,应该是先判断p1==&m成不成立,不成立则为0;所以为0;
2.2 其他不会的?打算怎么解决
研究哪里错了,然后学习课堂派上用的比较好的代码。
3.数组上机考试小结
3.1 那题错了,请罗列?
-
6-1 数组循环右移
-
6-2 jmu-c-二维数组转置并按列排序
-
7-1 IP地址转换
-
7-2 jmu-c-十进制转16进制
-
7-3 jmu-c-输出字符间的字符子串
-
7-4 数组元素的删除
3.2 错题如何订正,为什么错了?
-
6-1 数组循环右移:m>n的情况没有考虑,而且当n和m超过10时,代码显示显示错误;应该先不考虑情况,一个一个的换,而不是统一换,这样就没有这些错误了。
-
6-2jmu-c-二维数组转置并按列排序;我就把下面的换了,而上面的没换,导致错误;应该用一个变量存放下面的值再将下面的值变为上面的值,在最后将变量的值赋给上面就可以了。
-
7-1 IP地址转换:范围弄错了,应该输入32个数,我最后一个数弄成了‘\0’.
-
7-2 jmu-c-十进制转16进制:直接将其输出,最后那个字母是小写字母,应该用字符数组,当其为小写字母时,自动转为大写字母;
-
7-3 jmu-c-输出字符间的字符子串:当结束字符在开始字符前的时候也输出了字串,应要判断结束字符所在的位置必须在开始字符后。
-
7-4 数组元素的删除:本来10个数字删完之后,输出的时候依旧是10个数,后面的数字都是8和10;不用for循环而改为while循环,并且将每次删完一个数,移动后在倒数第i+1个数加‘\0’;