C-语言第二次作业(大一下)
要求一、设计过程
作业(1)
1.提交列表
6-7 删除字符串中数字字符
2.设计思路(6分)
(1)主描述题目算法。
第一步:设出字符char *srt,char*substr;
第二步:使用for循环语句和if语句,判断是否数字字符;
第三步: 循环寻找或结束语句。
(2)流程图
主函数调用:
返回主函数:
3.实验代码
void delnum(char *s) { int i,m=0; for(i=0;*(s+i)!='\0';i++) { if(*(s+i)>='0'&&*(s+i)<='9') { }else { *(s+m)=*(s+i); m++; } } *(s+m)='\0'; }
4.本题调试过程碰到问题及解决办法。
改正方法:并且符号是两个&&。
6-8 统计子串在母串出现的次数
(1)描述题目算法
第一步:列出char*str,并使用函数char str[81]="asdasas";
第二步:使用for语句和if语句统计字符出现字数,令str依次srt+i,str+i+1...;
第三步:返回函数。
3.实验代码(2分)
int fun(char *str,char *substr){ int i,count=0; for(i=0;*(str+i)!='\0';i++){ if(*(str+i)==*(substr)){ if(*(str+i+1)==*(substr+1)){ if(*(str+i+2)==*(substr+2)){ count++; } } } } return count; }
4.本题调试过程碰到问题及解决办法(4分)
改正方法:‘\0'忘记加\,字符串是以\0为结束标志,找不到\0会越界访问。
.
6-9 字符串中除首尾字符外的其余字符按降序排列
(1)描述题目算法
第一步:设出指针,用外循环控制循环数,num-1次;
第二步:用for循环和if语句判断字符ASCII大小;
第三步:判断后交换大小。
3.实验代码
int fun(char *s,int num){ int i,j,k,temp; for(i=1;i<num-2;i++){ k=i; for(j=i+1;j<num-1;j++){ if((int)(*(s+k))<(int)(*(s+j))){ k=j; } } if(k!=i){ temp=*(s+i);*(s+i)=*(s+k);*(s+k)=temp; } } return 0; }
4.本题调试过程碰到问题及解决办法
改正方法:第一次限制循环未控制在num-1次。
7-1 输出学生成绩
(1)描述题目算法
第一步:输入学生人数,动态分配;
第二步:用for循环相加成绩;
第三步:令max,min,等于数组第一个元素,比较大小,并用for循环交换。
3.实验代码
#include <stdio.h> #include <stdlib.h> int main() { int i,n; float sum=0,average,max,min; scanf("%d",&n); float *p=(float *)malloc(n); for(i=0;i<n;i++){ scanf("%f",(p+i)); sum+=*(p+i); } min=*(p+0);max=*(p+0); for(i=0;i<n;i++){ if(min>*(p+i)){ min=*(p+i); } if(max<*(p+i)){ max=*(p+i); } } printf("average = %.2f\n",sum/n*1); printf("max = %.2f\n",max); printf("min = %.2f\n",min); return 0; }
4.本题调试过程碰到问题及解决办法
错误原因:min=*(p);max=*(p);输出后与列子不同。
改正方法:min=*(P+0);max=*(p+0);表示依次加。
作业(2)
1.提交列表
.
2.设计思路(6分)
7-1 计算职工工资
(1)描述题目算法。
第一步:设出变量,使用结构算法;
第二步:用for循环语句,保证正确输出;
第三步:令实际工资=s1.j+s1.f-s1.z,输出。
(2)流程图
3.实验代码
#include <stdio.h> struct clerk { float j,f,z; char name[10]; }; int main() { int i,n; float pay; scanf("%d",&n); struct clerk s1; for(i=1;i<=n;i++) { scanf("%s %f %f %f",s1.name,&s1.j,&s1.f,&s1.z); pay=s1.j+s1.f-s1.z; printf("%s %.2f\n",s1.name,pay); } return 0; }
4.本题调试过程碰到问题及解决办法。
错误原因:第一次使用数组的方法,麻烦且没有成功。
改正方法:使用简单的for循环,数据结构就很容易编写。
7-2 计算平均成绩
(1)描述题目算法。
第一步:定义结构;
第二步:计算平均值 ,输出;
第三步:用for循环,if语句,判断每人成绩是否小于平均值;若是。则输出,学生和学号。
3.实验代码
#include <stdio.h> struct student { char num[6]; char name[10]; int grade; double average; }; int main() { int i,N,sum = 0; double average; scanf("%d",&N); struct student s[N]; for(i=0;i<N;i++) { scanf("%s %s %d",s[i].num,s[i].name,&s[i].grade); sum = sum + s[i].grade; } average = (double)(sum/N); printf("%.2f\n",average); for(i=0;i<N;i++) { if(s[i].grade<average) { printf("%s %s\n",s[i].name,s[i].num); } } return 0; }
4.本题调试过程碰到问题及解决办法。
解决方法:'\n'一直打成'/n',令答案错误。
作业(3)
1.提交列表
2.设计思路(6分)
6-1 按等级统计学生成绩
(1)描述题目算法。
第一步:列出指针;
第二步:用for循环,if语句判断学生成绩是否小于60;
第三步:count 在每次又小于60的同学,逐渐+1;
第四步:返回count的值到主函数。
(2)流程图
3.实验代码
int set_grade( struct student *p, int n ){ int i,q=0; for(i=0;i<n;i++,p++){ if(p->score<60){ q++; } if((p->score>=85)&&(p->score<=100)){ p->grade ='A'; }else if((p->score>=70)&&(p->score<=84)){ p->grade ='B'; }else if((p->score>=60)&&(p->score<=69)){ p->grade='C'; }else{ p->grade='D'; } } return q; }
4.本题调试过程碰到问题及解决方法。
解决方法:要定义n。
6-2 结构体数组按总分排序
(1)描述题目算法。
第一步:列出指针,结构体;
第二步:用for循环,一个循环第n个人的成绩总数值,一个计算第n个人的成绩总值;
第三步:用冒泡法排序,按总成绩大小排序,交换。
3.实验代码
void calc(struct student *p,int n){ int i; for(i=0;i<n;i++){ (p+i)->sum=(p+i)->score[0]+(p+i)->score[1]+(p+i)->score[2]; } } void sort(struct student *p,int n){ int i,j,t; struct student temp; for(i=0;i<n-1;i++){ t=i; for(j=i;j<n;j++){ if(((p+t)->sum)<((p+j)->sum)){ t=j; } } if(t!=i){ temp=*(p+i);*(p+i)=*(p+t);*(p+t)=temp; } } }
4.本题调试过程碰到问题及解决办法(4分)
错误原因:if((p+t)->sum)<((p+j)->sum)),少加一个括号。
改正方法:加上即可。
要求二、学习总结和进度
1、总结两周里所学的知识点有哪些学会了?哪些还没有学会?
在这两周学习了结构和在结构体中使用指针。将结构和两个结构的写法听的很清楚明白并感觉对for循环和if语句又有了更清楚的认识。没有学习明白指针在结构的使用,还是对函数有些苦恼,会尽快弄明白。
2、GIT:https://git.coding.net/GUANCHENG/101.git
3、点评3个同学的本周作业。
张心悦:http://www.cnblogs.com/zxy980612/p/8696690.html
丰大为:http://www.cnblogs.com/DavidPark/p/8664273.html
王姝雯:http://www.cnblogs.com/phsudie/p/8661686.html
4、折线图。