C语言博客作业--字符数组
一、PTA实验作业
题目1:7-2 统计一行文本的单词个数
1. 本题PTA提交列表
2. 设计思路(流程图)
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 答案错误,判断单词代码不对,结果输出数字,没有考虑到在一个单词结束后的空格和逗号处理;
- 调试发现在判断完一个单词后就开始出错,结果i在循环3次后就结束;
题目2:7-3 找最长的字符串
1. 本题PTA提交列表
2. 设计思路
定义循环变量i=0,n,k,初始longest=0,标记变量flag=0;
char s[1000][1000];
读入行数 n
当满足i<n
读入字符串gets(s[i])
累加i i++
for i=0 to n-1
for k=0 to 条件s[i][k]!='\0'
如果 k>longest
longest赋予新值
标记行数
输出
end
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 思路问题:输入字符串时无法分行全部输出,还有一开始不知如何先进行每个字符串间的标志,再分开一一进行比较,需要先花时间整理思路,弄清楚每个小的步骤怎么能够实现,再进行devc编写;
- 答案错误:输出成了字符个数;输出每个字符串出问题;
- 请教同学,可以采用字符串的二维数组实现,解决;
- 出现部分正确,多种错误,格式错误等,发现是关于数组的越界问题,把数组存储扩大化,解决;
题目3:7-6 Jack cheng的烦恼2
1. 本题PTA提交列表
2. 设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
-
一开始思路复杂出错,请教同学,发现简单的解题思路;
-
编程中的错误,运行不下去,调试修改循环条件,还有上一步读入n时的回车符得吸收掉;
二、截图本周题目集的PTA最后排名
三、同学代码结对互评
1.互评同学名称:徐宏伟
2.我的代码、互评同学代码截图
我的代码:
徐宏伟同学代码:
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题
- 我和同学的代码在思路上有些区别,刚开始的时候字符串的输入方式就不相同,我直接使用gets( )相对来说代码数可减少,但是在考虑回车这些时又会有限制,所以他的又会比较严谨,各有思考;
- 在查找最长字符串时他采用的是每找到一个就进入新的数组存放,然后直接输出,而我的是利用标记 flag = i 对其相应行数进行保存,最后再利用数组对相应行数的字符串输出;
- 他的代码里注释的简洁但又清楚,而我的注释总会注释太多看起来不好又影响阅读,他的这一点值得学习;
- 我相对来说会喜欢他的代码,注释清楚,拿到后读起来方便,思路也容易想得到;
四、本周学习总结
1.你学会了什么?
1.1指针变量如何定义
对指针变量的定义包括三个内容:
(1) 指针类型说明,即定义变量为一个指针变量;
(2) 指针变量名;
(3) 变量值(指针)所指向的变量的数据类型;
一般格式:类型说明符 *变量名;
* 表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型;
例如: int *p1;
p1是一个指针变量,其值是某个整型变量的地址,或者说p1指向一个整型变量;至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定;
再如:int *p2; p2是指向整型变量的指针变量
float *p3; p3是指向浮点变量的指针变量
char *p4; p4是指向字符变量的指针变量
【注意】一个指针变量只能指向同类型的变量,如 P3 只能指向浮点变量,不能时而指向一个浮点变量,时而又指向一个字符变量;
1.2 指针加法运算运用在哪种情况,2个指针变量能否相加?
(1)对于指向数组的指针变量,可以加上或减去一个整数 n:设 p是指向数组a的指针变量,则 p+n,p-n,p++,++p,p--,--p 运算都是合法的;
指针变量加或减一个整数n的意义是把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置;
【注意】数组指针变量向前或向后移动一个位置和地址 加1 或 减1 在概念上不同的;
因为数组可以有不同的类型, 各种类型的数组元素所占的字节长度是不同的;
如指针变量加1,即向后移动 1 个位置表示指针变量指向下一个数据元素的首地址,而不是在原地址基础上加1;
例如: int a [ 5 ],*p;
p = a; p 指向数组a,也是指向a [ 0 ];
p = p + 2;; p 指向a [ 2 ],即 p 的值为&p[ 2 ];
(2)指针变量的加减运算只能对数组指针变量进行, 对指向其它类型变量的指针变量作加减运算是毫无意义的;
(3)两个指针变量之间的运算只有指向同一数组的两个指针变量之间才能进行运算, 否则运算毫无意义;
【注意】两个指针变量不能进行加法运算;
【原因】指针变量是种特殊的变量,指针变量的值存放的是所指向变量的地址,两个地址相加并不能保证结果为一个有效的地址值,C 中指针变量相加是非法的;
1.3 指针不赋初值,直接使用,会出现什么情况,请用DEVC验证,并截图展示
通常,一个没有赋值的指针可能指向任意地址,使用没有初始化的指针将发生无法预料的结果,如果此时对指针执行了解除引用(即*pointer)操作,则可能改写内存中的信息,这可能导致正在引用该内存区的程序崩溃,严重时,程序将退出,但不会破坏程序本身;
1.4 课堂派上关于分离浮点数的整数部分和小数部分那题,请用DEVC验证实现,并在此贴图展示,同时说明哪句是指针变量做函数形参,函数实参应该怎么表示。指针变量做函数形参有什么用处?
- 如果将某个变量的地址作为函数的实参,相应的形参就是指针;
- 13行里是指针变量做形参,实参表示:void splitfloat(float num, int z, float x);
- 指针变量做函数形参可以使函数返回多个值;
1.5 请把课本的冒泡排序的函数改成指针变量做形参格式,并把代码写在底下,注意用markdown语法渲染
#include<stdio.h>void bubble(int *p,int n);int main(){
int i,n,t,k,count=0,flag = 0;
int s[5]={1,6,8,5,3};
int *p = s;
for(i=0;i<5;i++)
printf("%d ",*(p+i));
bubble(p,5);
printf("\n");
for(i=0;i<5;i++)
printf("%d ",*(p+i));
return 0;
} void bubble(int *p,int n){
int t;
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n-1;j++){
if(*(p+j)>*(p+j+1)){
t=*(p+j);
*(p+j) = *(p+j+1);
*(p+j+1) = t;
}
}
}
}
1.6 如何定义一个指针变量指向数组,如何用指针变量表示数组元素?
数组指针用于指向一个数组;如:int (p)[ 10 ];
用指针变量表示数组元素:
(1)p++; p;
(2)p++;等价于(p++);因为++和的优先级一样,故结合方向是从右向左;
(3)(p++);和(++p);二者是有区别的,前者是先取p的值,然后p加1;后者是先p加1,再取p的值;即如果p指向的是数组a元素a[0],则前者得到a[0]的值,后者得到a[1]的值;
(4)++(*p);将p指向的元素的值加1;
(5)如果p指向元素a [ i ]:
*(p--); 先得到p指向的地址的元素a [ i ],然后 p 减1;
*(++p);执行结果得到a [ i+1 ],p加1;
*(–p);执行结果得到a [ i-1 ],p减1;
1.7 如何定义字符指针指向字符串?指针指向字符串后,初始位置在哪里?
定义一个指针
char *p;
char str[10] = "afjkfdhsjk";
p = str;
指针p指向字符串str的首地址
1.8 利用字符指针操作字符串,如设计函数实现字符串连接,请在此贴图展示代码。说明指针表示字符的方法好处是什么?
指针表示字符的方法好处:使用灵活,在所传的实际数据太大时,利用指针可以直接传数据地址,既提高传输速度,又节省内存;
#include <stdio.h>char *strmcat( char *str1, char *str2 );//使用const来约束strSrc,提高程序的健壮性。如果函数体内的语句试图改动str2的内容,编译器将指出错误。
int main(){
char s[80],t[80];
int m;
char *p=s,*q=t;
gets(s);
gets(t);
printf("%s",strmcat(p,q));
return 0;
}char *strmcat( char *str1, char *str2 ){
int i=0,j=0;
while(*(str1+i)!='\0') i++;//找到字符串的末尾
while(*(str2+j)!='\0'){//进行拼接
*(str1+i)=*(str2+j);
i++;
j++;
}
*(str1+i)!='\0'; //结束
return str1;
}
2.本周你不会内容有什么?
2.1 课堂派错题罗列及如何订正
课堂派错题及订正:
7、单选题 :Among the following assignments or initializations, __ is wrong.
A、 char str[10]; str="string";
B、 char str[]="string";
C、 char p="string";
D、 char p; p="string";
我的作答:D
参考答案:A
解析:字符数组、字符指针处理字符串;
字符数组在内存中占用连续的单元,确定地址,每个数组元素放字符串的一个字符,字符串就存放在数组中;
字符指针只占用一个可以存放地址的内存单元,存放字符串首字符的地址,而不是将字符串放到字符指针变量中去;
2.2 其他不会的?打算怎么解决
- 其他不会的在课下里查资料自己先尝试解决问题,实在不能解决,就要找会写的大佬们进行咨询,弄懂,理解,然后自己尝试再编写一遍或者找相似的例题训练;
3.数组上机考试小结
- 数组上机考试题目明显较之前的来说会更难些,没有在纸上简单拟下思路就开始写程序,就会导致程序太乱,或者根本就行不通;
- 对平时老师讲的内容没有做到完全理解,或者有些题本身就没有听懂但没有及时找老师或者同学弄明白,结果在上机考里考到就又立刻不会了;
- 课后没去进行一定的编程锻炼,导致编程能力一直无法提高甚至很差;
- 查错能力还不行,总是查不出来或者是查的很慢;
- 总结:教材例题要理解后去尝试编程,课堂不能只停留在听懂阶段,错的题也要学会去把正确思路吸收,并自己去编程,多次改错,不断尝试才可能真正理解,还要多读优秀代码,真正理解代码思路,自己也要尝试学着使用,先要能能读懂代码,查起错来才相对会快;
3.1 哪题错了,请罗列
- 上机考试写了但不对的题罗列:
3.2 错题如何订正,为什么错了?
- 还没开始订正,先写了PTA上面的相似题,看了老师讲过的题,再去改错会比较好;
- 错的原因:见上面总结;