C语言博客作业--字符数组

一、PTA实验作业

题目1:统计一行文本的单词个数

1.本题PTA提交列表

  • ![](http://images2017.cnblogs.com/blog/1232035/201712/1232035-20171209201441618-127297001.png)
    

2..设计思路

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 问题:部分正确:判断最后一个字符的条件忽略了全为空格的输入方式,所以没有判断最后一个字符是空格的情况,只判断是回车的情况
  • 解决方法:把全为空格的情况考虑进去,判断最后一个字符为空格时就结束,不需要再有回车为结束标志

题目2:找最长的字符串

1.本题PTA提交列表

2.设计思路

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 最大的问题还是段错误,之前定义都是给字符数组和普通数组确定的数组长度
  • 解决办法:后来提交发现段错误,说明N可能比我给的数组长度还要打,就马上回去思考数组的长度,结果发现根据N来给数组长度是最好的
    所以不管N是多少,都可以满足,提交答案正确

题目3.字符串的冒泡排序

1.本题PTA提交列表

2.设计思路

     定义变量N为输入多少行的字符串
                    i,j存放循环次数,temp用于普通数组元素间交换,n判断N是否为100,k为冒泡次数
    for j=0 to N-1
            存放每行的字符串
     end for
    for i=0 to N-1
            用普通数组b[i]存放每行字符串的长度
     end for
    for i=1 to k
            for j=n to N-i-1
                   普通数组b[i]的冒泡排序
                    if(b[j]>b[j+1]){
				temp=b[j];
				b[j]=b[j+1];
				b[j+1]=temp;
                     同时用普通数组的下标进行二维字符串的冒泡排序
                       strcpy(buff,a[j]);
    			strcpy(a[j],a[j+1]);
    			strcpy(a[j+1],buff);
                end for
     end for
     for i=0 to N-1
            输出排序后二维数组每行的字符串
     end for
     return 0

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 部分正确:
    这里错误了,所以设计了n让N为100时,能完成倒序,但是并没什么用
  • 解决方法:我自己打了100行的字符串去尝试,发现可以实现倒序-(这些都是在没有理解题目的基础上进行的错误判断)-


    有了舍友的提示,发现题目理解错误,题目要求的是比较字符串第一个不同字符ASCII码的大小,而我却理解为字符串长度来冒泡排序
    所以后面使用了strcmp函数来进行冒泡排序
    答案正确

二、截图本周题目集的PTA最后排名

三、同学代码结对互评

1.互评同学名称

  • 谢国庆

2.我的代码、互评同学代码截图

  • 我的核心代码:
  • 国庆同学的核心代码:

3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。

  • 不同:首先谢同学调用string可以使用多种函数,而我没有。其次,谢同学还用getchar()排除输入n之后回车的干扰,很好。
    再者我使用二维字符数组,计算每个字符串的长度,将每个长度的值赋予一个普通数组b,谢同学是每次输入一个一维字符数组,让字符串最后一个字符的下标作为长度值
    如果上一次输入的字符串最后一个字符的下标大于下一次输入的字符串最后一个字符的下标,那就把上一次输入的字符串全部赋予一个新的字符数组,所以如果有下标相同的两个字符串,新的字符串还是前一个出现的字符串,不会被重新
    赋值,而我是先判断普通数组里哪个最大,(同样两个最大还是取前一个,因为相同并没有大于),再用最大值对应的下标去对应二维字符数组的行标去输出。我认为的我的方法比较容易理解但是没有谢同学的巧妙,希望谢同学核心代码部分能注释多一点
    不然要花较长时间去理解。
  • 我喜欢我自己的代码风格,虽然算不上巧妙但是容易理解,谢同学的代码在我目前看来没有错误。

四、本周学习总结

1.你学会了什么?

1.1指针变量如何定义?

    如果在程序中声明一个变量并使用地址作为该变量的值,那么这个变量就是指针变量
    定义的一般形式为:
    指针类型+ *+指针名称

1.2 指针加法运算运用在哪种情况,2个指针变量能否相加?

  • 指针加法运算住要运用在I+j,这是i,j所指地址代表的值相加
  • 0<=i<10 int *j, j+i,这是j 所指地址所在单元格下移i格
  • 2个指针变量不能相加

1.3指针不赋初值,直接使用,会出现什么情况,请用DEVC验证,并截图展示?

  • 程序会崩溃,一定要给指针赋初值再使用

1.4课堂派上关于分离浮点数的整数部分和小数部分那题,请用DEVC验证实现,并在此贴图展示,同时说明哪句是指针变量做函数形参,函数实参应该怎么表示。指针变量做函数形参有什么用处?

  • splitfloat(float x,int *intpart,float *fracpart) 这一句是指针变量做函数形参,函数实参应该是主函数里变量的地址,或者数组的首地址 例如:splitfloat(number, &intpart ,&fracpart)

  • 指针变量做函数形参能取主函数里变量的地址,从而对主函数里的变量进行赋值,改变它原有的值,而且还能使函数返回多个值。

1.5请把课本的冒泡排序的函数改成指针变量做形参格式,并把代码写在底下,注意用markdown语法渲染.

.
int bubble( int *a, int n);
int main (void){
	int i,n,a[8];
	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;
}
int bubble ( int *a, int n){
	int *i,*j,*k,temp,count;
	for(i=a;i<a+n-1;i++){/*遍历数组*/ 
		count=0;
		for(j=i+1;j<a+n-count;j++){/*如果发现自身比下一项大,则交换位置*/ 
			if(*i>*j){
				temp=*i;
				*i=*j;
				*j=temp;
			}
		}
		count++;/*count用于下个循环减少比较一个元素*/
	}
}
.

1.6 如何定义一个指针变量指向数组,如何用指针变量表示数组元素?

  • 举例:定义一个整型指针p int *p,定义一个整型数组a[9],并且输入数字
    一个指针变量指向数组:p=a,让整型指针变量p等于数组a的首地址
    指针变量表示数组元素: 定义一个整型变量i,for(i=0;i<9;i++) *(p+i);

1.7 如何定义字符指针指向字符串?指针指向字符串后,初始位置在哪里?

  • 举例:定义一个字符型指针p char *p ,定义一个字符数组b[9],并且输入字符串
    字符指针指向字符串 :p=b,让字符指针变量p等于字符数组b的首地址
    初始位置:在b[0]所在的地址

1.8利用字符指针操作字符串,如设计函数实现字符串连接,请在此贴图展示代码。说明指针表示字符的方法好处是什么?


  • 指针表示字符的方法好处:通过自定义函数里定义的指针表示主函数里的字符就可以在自定义的函数里改变主函数里定义的字符数组,使用指针能使自定义的函数返回多个值。

2.本周你不会内容有什么?

2.1 课堂派错题罗列及如何订正


  • 指针变量x应该指向变量a的地址,而不是变量a的值,本题中的变量a要在指针变量x之前定义,否则指针变量x将会没有初值,程序就会崩溃
  • 为什么错:没有认识指针对单个变量和数组的区别,以为int *x=a,是让指针变量x指向变量a的首地址,跟指针指向数组用法混淆

2.2 其他不会的?打算怎么解决

  • 其他不会的准备问舍友和班里学习成绩拔尖的同学

3.数组上机考试小结

3.1 那题错了,请罗列?

3.2 错题如何订正,为什么错了?

  • 我不针对哪题而是针对所有的错题,我认为错题订正首先要认清自己的思路,思路不清楚了怎么调试都没有用,你可能都不知道程序下一步要怎么走,
    第二就是调试,跟着思路进行调试,哪里变化与思路不同,就是哪里出现了问题,进行改正,直至出现你想要的结果,以此类推,就可以订正好
  • 为什么错了,上面罗列的这一题没时间去做,随便思考一会就写代码了,要是有充足的时间可以写对。
posted @ 2017-12-10 18:16  朱杰伟  阅读(306)  评论(3编辑  收藏  举报