作业要求二
题目6-7删除字符中数字字符
1、设计思路:
(1)第一步:本题要求是删除字符中的数字字符,我的主要思路是通过数组遍历若遇到数字,就把其删除,把之后的非数字的字符向前移动;
第二步:根据此思路,首先定义两个循环变量i,j;通过while条件语句来进行判断数字字符,之后再逐一删除,前移;
2、实验代码:#include "stdio.h" void delnum(char *s) { int i = 0,j = 0; while(s[i] != ‘\0‘) { if (!(s[i] >= ‘0‘ && s[i] <= ‘9‘)) { s[j] = s[i]; j++; } i++; } s[j] = ‘\0‘; }
3、本题调试过程碰到问题及解决办法 本题是字符问题,当我在遇到这个问题的时候,只是有想法,知道怎么去做,但是却不知道怎么去用if条件来判断出数组中的是否含有数字字符。简单的说我只会构思,不会去写成代码。其主要问题是在
就是不会写这个条件;
改正方法:我去网站上找了下这个题,看了许多的大佬的程序,他们的代码方式写的有很多中,之后我自己找到了这个条件,之后就顺利写出这个题目了。
题目6-8 统计子串在母串出现的次数
1、设计思路:
(1)第一步:首先要遍历数组,若要找出子串在母串的出现次数,在遍历数组的时候,利用if条件语句进行逐一的判断;
第二步:在遍历的过程中,循环变量要逐一的相加,而不是看子串的字符个数,这样才能较为准确的去查找出现次数;(自我感觉自己的算法比较麻烦,但是实在是想不出简单的算法,就只能将就着用)
2、实验代码#include<stdio.h> int fun(char *str,char *substr) { int result=0,i=0; for(i=0;str[i]!=‘\0‘;i++) { if(substr[0]==str[i]&&substr[1]==str[i+1]&&substr[2]==str[i+2]) { result++; } } return result; }
3、本题调试过程碰到问题及解决办法 本题没有问题;
题目6-9字符串中除首尾字符外的其余字符按降序排列
1、设计思路:
(1)第一步:本题可按照之前的非字符的冒泡排序的方法去来实现这个问题,只是在遍历数组的时候,出去首尾两项;
第二步:根据这个思路,首先定义循环变量,之后遍历数组(注:在遍历数组的时候要注意不要包括首尾两项)之后再按照冒泡的方法进行排序即可;
2、实验代码#include <stdio.h> int fun(char *s,int num) { int i=1,j=1,max; for(i=1;i<num-3;i++) { for(j=1;j<num-2;j++) { if(s[j]<s[j+1]) { char swap; swap=s[j];s[j]=s[j+1];s[j+1]=swap; } } } }
3、本题调试过程碰到问题及解决办法 本题没有问题;
题目7-1输出学生成绩
1、设计思路
(1)第一步:根据题意,首先要定义一些相关的变量,例如学生人数n,循环变量i,等等;
第二步:之后在创建内存动态存储;(这个我之后按照老师上课讲的照抄照搬,自己当时听懂的内容也是不是很多,后来我也去上网查了许多的有关动态存储的相关的教程,也算是略有了解,但还是理解的不够深刻)
第三步:在创建动态存储之后,之后就开始在数组中存储内容(成绩),在存储的同时可以进行求和,以便进行之后的求平均值的操作;
第四步:存储之后,求平均值,之后遍历数组进行找最大值和最小值;(此时应把最大值和最小值变量先初始化为数组的首地址元素,方便比较)之后根据数组遍历来找出最大值和最小值;
第五步:最后便可按照题目要求进行输出;
(2)流程图:2、实验代码
#include<stdio.h> #include<stdlib.h> int main() { int n=0,i=0,*p,sum=0,max=0,min=0; double average=0; scanf("%d",&n); if((p=(int*)calloc(n,sizeof(int)))==NULL) { printf("Not able to allocate memory.\n"); exit(1); } for(i=0;i<n;i++) { scanf("%d",p+i); sum=sum+*(p+i); } average=(double)(sum*1.0/n*1.0); max=*p;min=*p; for(i=0;i<n;i++) { if(max<*(p+i)) { int swap=0; swap=max;max=*(p+i);*(p+i)=swap; } } for(i=0;i<n;i++) { if(min>*(p+i)) { int tmp=0; tmp=min;min=*(p+i);*(p+i)=tmp; } } printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf",average,(double)max,(double)min); free(p); return 0; }
3、本题调试过程碰到问题及解决办法 错误信息1:
这个问题是我把max和min的初始化都放到了for循环里面了,导致在提交的时候总是有一个点过不去;
改正方法:在出现这个错误之后,当时我也很纳闷,因为我在输入例题啥的都正确但就是不能过那个点。之后我也尝试了老师所说的进行单步调试,在调试的过程中我发现了,每次在进行for循环的时候都会把max和min在初始化依次,当时只是略有怀疑,因为我还是很惯性的认为即使初始化也没啥问题,因为输出的结果还是正确的。但是它总是过不去这个点,之后我就去询问同学,在同学帮助下,也是指出了这个问题,最终我把max和min初始化放到了for之前了最后通过了。