C语言博客作业--字符数组
2017-12-10 16:52
183 查看
一、PTA实验作业
题目1:统计一行文本的单词个数
1.本题PTA提交列表
2.设计思路
定义字符数组存放输入的字符 定义整形变量count存放单词个数,len存放字符长度 输入字符串 计算字符个数 if 开头的字符是空格 count=0 else count=1 for i=0 to len-1 if 前一个字符是空格后一个字符非空格 count加一 end for 输出count的值
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
遇到的问题:数组长度定义不够大导致数组越界解决方法:将数组长度由原来的80增加到1000即可
题目2:统计大写辅音字母
1.本题PTA提交列表
2.设计思路
定义字符数组str存放输入的字符串,ch存放从B到Z的大写字母 定义整型数组count存放辅音字母个数,i,j为循环变量 输入字符串 for i=0 to str[i] for j=0 to ch[j] if 输入的字符中含有辅音字母 count加一 end for end for 输出count的值后换行
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
遇到的问题:空字符串判断条件错误解决方法:刚开始自己的写法判断条件有缺漏,判断范围只局限在大写字母内,不能判断% 、\等字符,后来参考的同学的判断思路,更改了自己的写法,精简了许多
题目3:删除字符串中的字串
1.本题PTA提交列表
2.设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
遇到的问题:解决方法:
二、截图本周题目集的PTA最后排名
三、同学代码结对互评
1.互评同学名称
徐宏伟2.我的代码、互评同学代码截图
我的代码同学的代码
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题
首先,我和同学的思路基本相同,都是判断字符和连续空格问题;其次,我和同学的判断条件各有千秋,我是直接判断整个字符串和连续空格问题,而同学是拆分字符串,到字符为空格时停止再开始下次判断;我的思路比较剑走偏锋,如果中间条件一个判断错可能导致全部代码作废重写,而同学的思路就比较稳妥一点,拆分成一段一段的判断,比较不容易犯错;我个人比较喜欢效率高一点的代码,我更喜欢我的代码
四、本周学习总结
1.你学会了什么?
1.1指针变量如何定义
定义指针变量要使用指针声明符*,如int i,*p int *p 代表指向整型变量 char *p 代表指向字符型变量 float *fp 代表指向单精度实型变量 double *dpl 代表指向双精度实型变量
1.2 指针加法运算运用在哪种情况,2个指针变量能否相加?
指针加法只要运用在地址的偏移,如*p=a+1 两个指针变量不能相加,否则会出现编译错误
1.3 指针不赋初值,直接使用,会出现什么情况,请用DEVC验证,并截图展示?
指针不赋初值就会出现运行错误,且容易使程序崩溃1.4 课堂派上关于分离浮点数的整数部分和小数部分那题,请用DEVC验证实现,并在此贴图展示,同时说明哪句是指针变量做函数形参,函数实参应该怎么表示。指针变量做函数形参有什么用处?
void splitfloat(float x,int *intpart,float *fracpart)是指针变量做函数形参 splitfloat(number,&integral,&decimal)函数实参应该这样表示 指针变量做函数形参,不可以改变实参的值,但是可以改变指针指向变量的值
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("%3d",a[i]); } return 0; } void bubble(int *p,int n) { int *i,*j,t; for(i=1+p;i<p+n;i++) for(j=p;j<p+n-1;j++) if(*j>*(j+1)) { t=*j; *j=*(j+1); *(j+1)=t; } }
1.6 如何定义一个指针变量指向数组,如何用指针变量表示数组元素?
int a[10],i,*p; p=a; for(i=0;i<10;i++) *(p+i)=i; 或者 int a[10],i,*p p=a; for(i=0;i<10;i++) *p=i;
1.7 如何定义字符指针指向字符串?指针指向字符串后,初始位置在哪里?
const char *p代表定义一个字符指针指向字符串,指向字符串的第一个字符
1.8 利用字符指针操作字符串,如设计函数实现字符串连接,请在此贴图展示代码。说明指针表示字符的方法好处是什么?
#include <stdio.h> #include<string.h> int fun(char *p,char *s); int main() { char a[80],b[80]; scanf("%s%s",a,b); printf("%s",fun(a,b)); } int fun(char *p,char *s) { strcat(p,s); }
指针表示字符好处是字符不会被覆盖
2.本周你不会内容有什么?
2.1 课堂派错题罗列及如何订正
刚开始以为这是找不同等式,后来才发现是找表达式错误
c选择中的*&point不是地址
2.2 其他不会的?打算怎么解决
对于指针作为函数形参的应用还不熟悉,经常写得格式错误,如p=&a经常写成*p=&a之类的;还有对指针的概念理解得还不是非常透彻,需要多多翻书打代码,多做一点相关的题目巩固一下自己的知识点
3.数组上机考试小结
3.1 那题错了,请罗列?
错题1:jmu-c-输出字符间的字符子串错题2:数组循环右移
错题3:删除数组中的元素
3.2 错题如何订正,为什么错了?
错题1:将起始字符和终止字符定义成数组,当进入循环时,相应的内容会发生改变,不再是开始输入的那个字符,对比不出结果,这个致命错误直接导致当时考试输出不了结果
改正后
#include<stdio.h> int main() { char ch[80]; char start[80],end[80]; int i,j,k,index1=0,index2=0,flag1=0,flag2=0; gets(ch); gets(start); gets(end); for(i=0;ch[i];i++) { if(start[i]==ch[i]) { index1=i; break; } else if(start[i]!=ch[i]&&ch[i]=='\0') flag1=1; } for(j=0;ch[j];j++) { if(end[j]==ch[j]) { index2=j; break; } else if(end[j]!=ch[j]&&ch[j]=='\0') flag2=1; } if(flag1==1||flag2==1) printf("no sub string!"); else { for(k=index1;k<index2;k++) printf("%c",ch[k]); } }
错题2:数组越界和值被覆盖
改正前
int ArrayShift( int a[], int n, int m ) { int i,j,k=m,index=0; char b[80]; for(i=0;i<m;i++) //将数储存在另一个数组 { b[i]=a[i]; } for(j=0;j<m;j++) //后面的数移动到前面 { a[j]=b[n-m]; m--; } for(i=k;i<n;i++) //前面的数移动到后面 { a[i]=b[index]; index++; } }
改正后
int ArrayShift( int a[], int n, int m ){ int i,j,temp; for(i=1;i<=m;i++){ temp=a[n-1]; for(j=n-1;j>0;j--){ a[j]=a[j-1]; } a[0]=temp; } }
错题3:没时间做最后一题,回来做了一遍
#include<stdio.h> int main() { int i,j,n,del1,del2; scanf("%d",&n); int num ; for(i=0;i<n;i++) scanf("%d",&num[i]); scanf("%d",&del1); for(i=0;i<deln;i++) { scanf("%d",&del2); for(j=del2-1;j<n;j++) { num[j]=num[j+1]; } n--; } for(i=0;i<n;i++) { if(i==0)printf("%d",num[i]); else printf(" %d",num[i]); } return 0; }