C语言博客作业--字符数组
一、PTA实验作业(4分)
题目1:7-1 字符串转换成十进制整数
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(伪代码或流程图)
定义i,j,k为循环变量,flag用来判断输入符号是否为负数,f用来判断输入字符是否为十六进制字符,再定义ten存放十进制数,数组a[80],str[80];存放字符串
flag=1,f=1;
输入字符串a[i]
k=0;
for(i=0;a[i]!='\0';i++){
如果a[i]属于字符‘0’到‘9’或者‘a'到'z'或者'A'到’Z'
str[k++]=a[i];f=0;
如果f=1&&a[i]=='-' flag=0;}
ten=0;
for(k=0;str[k]!='\0';k++){
将十六进制字符转化为十进制数字}
if(flag==0&&ten==0) printf("0");//当输入-0时应输出0
if(flag==1)
printf("%ld\n",ten);//输入字符中无负号
if(flag==0&&ten!=0) printf("-%ld",ten)//输入字符中有负号
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.本题调试过程碰到问题及PTA提交列表情况说明。
- 1.题目要求说如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。说明只有在第一个十六进制数之前的符号才算,中间的都不算,但是我的程序不知道为什么无法输出负值。
- 解决办法:我后来用devc调试运行发现,不知道为什么运行到判断a[i]是不是‘-’这句时程序直接跳出循环,然后直接运行到循环外判断输出条件那一句,所以判断a[i]=‘-’再使flag=0作为输出条件这一句怎么也不会被执行到,也没法输出负值。
最后我也不知道到底具体是哪一句有问题,所以就稍微换了个思路去改程序,我之前是用语句if(a[i]>='0'&&a[i]<='9'||a[i]>='a'&&a[i]<='f'||a[i]>='A'&&a[i]<='F'||a[i]'-'||a[i]'+')来判断字符是否属于十六进制数的字符,后来我改成了 if(a[i]>='0'&&a[i]<='9'||a[i]>='a'&&a[i]<='f'||a[i]>='A'&&a[i]<='F')然后在用语句if(a[i]=='-') flag=0;来判断输入字符是不是负号。
- 2.题目要求说负号在中间时不算,但是我的程序还是把他计算进去了。
- 解决办法:将判断语句if(a[i]'-') flag=0;改为if(a[i]'-'&&f=1) flag=0;表示负号在输入的十六进制字符之前才可以进入这个循环。
题目2:7-2 统计一行文本的单词个数
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(伪代码或流程图)
定义count累加单词个数,word=0判断是否已经是一个单词,ch为输入的字符串
while((ch=getchar())!='\n')
如果ch=‘ ’,令word=0;
else if word==0; word=1;count++;
输出count
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.本题调试过程碰到问题及PTA提交列表情况说明。
-
1.我一开始得想法是输入一个数组,再判断数组中两个相连的字符是否为一个空格和一个字符。这个程序虽然可以计算有多少个单词个数,但是输入空格时程序却输出1
-
解决办法:找来找去也找不到我的思维漏洞在哪里,所以后来就不用数组做了改为一个个输入再判断什么时候断成一个单词
-
2.不管我输入了多长的字符串,输出都是1
-
解决办法:调试时发现程序执行完第一个if后马上就执行第二个if,之后程序就就结束了,所以每次都只执行一次,count=1,因此我在在第二个if前面加上else,这样循环不会马上执行下来,而是先判断完if之后又重新返回最前面然后才进入else if语句,这样就可以实现我之前预想的计算单词长度了。
题目3:7-3 找最长的字符串
1. 本题PTA提交列表(要提交列表,不是结果)
2. 设计思路(伪代码或流程图)
- 定义i,j,为循环变量,count用于判断最长字符串,n为要判断的字符串个数,a[80];存放字符串,str[80],存放最长字符串。
3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)
4.本题调试过程碰到问题及PTA提交列表情况说明。
-
1.连续输入问题,一开始我准备用for循环和gets来连续输入,可是后来我发现gets输入是一次将整个字符串都输入,后续我就不知道该怎样计算字符串的长度。
-
解决办法:后来借鉴了同学的思路,用while循环来一个个的输入,再用另一个变量count来判断最长字符串。
-
2.程序可以实现计数,但是每次输出的最大数总不是第一次出现的最大数。
-
解决办法:经过devc调试发现运行过程中我用来存放最长字符串的变量count每次都会随着存放字符串长度的变量j变化而变化,后来就将第二个循环中的k改为j代替,并且将判断条件和循环换个位置就好了。
二、截图本周题目集的PTA最后排名。
三、同学代码结对互评(1分)
1.互评同学名称
郭锐倩
2.我的代码、互评同学代码截图(此处截图核心代码就好,不一定截图全部代码,图上指明是谁的代码。)
-
我的代码
-
同学代码
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。
- 同学的代码运用了数组来做,我的直接在输入的字符进行判断。其实我更喜欢我的代码,因为比较简短,又容易看懂,但是我没有用上数组,好像不符合题意,,,,
感觉同学的代码有点绕弯子,大概是我的阅读能力不太好,刚开始也没看懂她最后一段语句到底是怎么做到计数的,直到最后问了她才懂。
四、本周学习总结(3分)
1.你学会了什么?
1.1指针变量如何定义(设计代码可以用markdown代码符号渲染)?
- 类型名 *指针变量名 如int *p.
1.2 指针加法运算运用在哪种情况,2个指针变量能否相加?
- 加法用在指针加上一个整数表示地址的上移。两个指针变量不能相加
1.3 指针不赋初值,直接使用,会出现什么情况,请用DEVC验证,并截图展示?
- 会导致系统崩溃
1.4 课堂派上关于分离浮点数的整数部分和小数部分那题,请用DEVC验证实现,并在此贴图展示,同时说明哪句是指针变量做函数形参,函数实参应该怎么表示。指针变量做函数形参有什么用处?
- int *intpart,float *fracpart是用指针做函数形参,函数实参表示为int intpart;float fracpart,x;指针做函数形参可以直接改变传进去的变量的值,使程序更简洁,效率更高。
1.5 请把课本的冒泡排序的函数改成指针变量做形参格式,并把代码写在底下,注意用markdown语法渲染。
include<stdio.h>
void bubble(int *p,int n);
int main()
{
int n,a[8];
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
bubble(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
void bubble(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 a[i],p; p=a;表示指针指向数组,p=a;用指针变量表示数组元素。
1.7 如何定义字符指针指向字符串?指针指向字符串后,初始位置在哪里?
- 如char *p="point",初始位置在‘p'这个位置。
1.8 利用字符指针操作字符串,如设计函数实现字符串连接,请在此贴图展示代码。说明指针表示字符的方法好处是什么?
2.本周你不会内容有什么?
2.1 课堂派错题罗列及如何订正。
- 阅读程序,说出程序存在问题。
#include <stdio.h>
int main()
{
int *p,a[5],i;
p=a;
for(i=0;i<5;i++) scanf("%d",p++);
printf("\n");
for(i=0;i<5;i++,p++) printf("%d ",*p);
return 0;
}
- 这题一开始我以为是输入的P有问题所以就把scanf里的p改成了&a[i],后来上课老师讲解之后才知道这两个表示的是同一个东西,不需要改。真正需要修正的地方是p输入完之后已经到了临界点,程序并没有给他归回原位还继续增加导致p越界,所以正确改法应该是在 printf("\n");后加上p=a;
2.2 其他不会的?打算怎么解决
- 对于新学的指针还有好多地方不懂,比如什么时候应该用指针地址,什么时候用指针指向的变量的值,一直用混,也经常忘记赋初值导致系统崩溃。有时候又觉得使用指针比不用更麻烦而且指针也用的不熟,经常半天调不出来。重点是现在阅读代码的能力很差,经常代码复杂一点就不知道哪句哪句是用来干嘛的了。还是要多练吧,练习多了自然就会对它熟悉了,以后也会找一些优秀代码来读以便提高代码阅读能力。
3.数组上机考试小结
- 考试时比如说第一题,和我们之前做过的差不多,然后我就没有看题目,然后那题不管怎么调试提交都不对,直到后来考完试同学说那题是数组右移,不是左移,,,,,,当时对数组并不是很掌握,字符数组当时也没有调试过,不知道到底应该要怎样。
3.1 那题错了,请罗列?
- 第一题数组循环右移
3.2 错题如何订正,为什么错了
- 订正
- 当时没有看清楚题目要求,太着急了,以为又是左移,所以不管怎么调试都不对。