第二学期第二次作业
一.PTA作业
C高级第一次PTA作业(1)
1-1.删除字符串中数字字符
1.设计思路
(1)
第一步:设a为原数组的角标,b为所删除数字字符数组角标,令b=0;遍历数组a,当字符数组在‘0’~‘9’时不做运算,超过时,将所要删除的数字字符赋值给数 组b;
第二步:当a为结束字符时停止,添加结束字符;
第三步:返回主函数
(2)流程图
2.实验代码
部分代码:
1 void delnum(char *s) 2 { 3 int a,b=0; 4 for(a=0;*(s+a)!='\0';a++) 5 { 6 if(*(s+a)>='0'&&*(s+a)<='9') 7 {}else 8 { 9 *(s+b)=*(s+a); 10 b++; 11 } 12 } 13 *(s+b)='\0'; 14 }
全部代码:
1 #include "stdio.h" 2 void delnum(char *s); 3 int main () 4 { char item[80]; 5 gets(item); 6 delnum(item); 7 printf("%s\n",item); 8 return 0; 9 } 10 void delnum(char *s) 11 { 12 int a,b=0; 13 for(a=0;*(s+a)!='\0';a++) 14 { 15 if(*(s+a)>='0'&&*(s+a)<='9') 16 {}else 17 { 18 *(s+b)=*(s+a); 19 b++; 20 } 21 } 22 *(s+b)='\0'; 23 }
3.本题调试中遇到的问题
错误信息1:
在进行遍历数组过程中,由于马虎,把‘\0’写成了‘0’;
解决办法:把‘0’改成‘0’即可;
1-2统计子串在母串出现的次数
1.设计思路
第一步:根据主函数中输入的母串str,子串substr,遍历母串数组,找出子串中的字母,并且计算数目。
第二步:被调函数中设c为子串在母串中出现的数目,利用if条件句求出str中出现的substr。
第三步:返回主函数,输出n;
2.实验代码
部分代码:
1 int fun(char *str,char *substr) 2 { 3 int a,c=0; 4 for(a=0;*(str+a)!='\0';a++) 5 { 6 if(*(str+a)==*(substr)) 7 { 8 if(*(str+a+1)==*(substr+1)) 9 { 10 if(*(str+a+2)==*(substr+2)) 11 { 12 c++; 13 } 14 } 15 } 16 } 17 return c; 18 } 19
全部代码:
1 #include<stdio.h> 2 int fun(char *str,char *substr); 3 int main() 4 { char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd"; 5 int n; 6 n=fun(str,substr); 7 printf("n=%d\n",n); 8 return 0; 9 } 10 int fun(char *str,char *substr) 11 { 12 int a,c=0; 13 for(a=0;*(str+a)!='\0';a++) 14 { 15 if(*(str+a)==*(substr)) 16 { 17 if(*(str+a+1)==*(substr+1)) 18 { 19 if(*(str+a+2)==*(substr+2)) 20 { 21 c++; 22 } 23 } 24 } 25 } 26 return c; 27 } 28
3.本题调试过程碰到问题及解决办法
错误信息1:
本题调试中,与上一题出现的问题相同,‘\0’写成了‘0’;忘记了返回值c;
解决方法:将‘0’改成‘、‘\0’即可,后面加上return c;
1-3字符串中除首尾字符外的其余字符按降序排列
1.设计思路
第一步:根据主函数设出被调用函数fun;输入s;运行被调函数;
第二步:利用for循环,if条件句,根据字符大小进行排序;
第三步:若*(s+c)< *(s+b),则把b的值赋给c,若c不等于a,则进行交换。
第四步:返回主函数。
2.实验代码
部分代码:
1 int fun(char *s,int num) 2 { 3 int a,b,c,temp; 4 for(a=1;a<num-2;a++) 5 { 6 c=a; 7 for(b=a+1;b<num-1;b++) 8 { 9 if((int)(*(s+c))<(int)(*(s+b))) 10 { 11 c=b; 12 } 13 } 14 if(c!=a) 15 { 16 temp=*(s+a); 17 *(s+a)=*(s+c); 18 *(s+c)=temp; 19 } 20 } 21 }
全部代码:
1 #include <stdio.h> 2 int fun(char *s,int num); 3 int main() 4 { 5 char s[10]; 6 gets(s); 7 fun(s,7); 8 printf("%s",s); 9 return 0; 10 } 11 int fun(char *s,int num) 12 { 13 int a,b,c,temp; 14 for(a=1;a<num-2;a++) 15 { 16 c=a; 17 for(b=a+1;b<num-1;b++) 18 { 19 if((int)(*(s+c))<(int)(*(s+b))) 20 { 21 c=b; 22 } 23 } 24 if(c!=a) 25 { 26 temp=*(s+a); 27 *(s+a)=*(s+c); 28 *(s+c)=temp; 29 } 30 } 31 }
3.本题调试过程碰到问题及解决办法
错误信息1;
进行大小比较的时候,忘记对*(s+c)和*(s+b)的值进行强制转换成int类型;
解决方法:将*(s+c)和*(s+b)强制成int型。
1-4输出学生成绩
1.设计思路
第一步:设需要用到的数据,输入学生的数量;设sum,average,max,min为float型;
第二步:对p的数据进行动态分配内存的操作;
第三步:使用for循环,指针型p接受数据,计算sum的值。
第四步:再使用for循环,min,max均为p+0;与其他数据进行比较,最后输出结果。
2.实验代码
1 #include <stdio.h> 2 int main() 3 { 4 int i,n; 5 float sum=0; 6 float average,max,min; 7 scanf("%d",&n); 8 float *p=(float *)malloc(n); 9 for(i=0;i<n;i++) 10 { 11 scanf("%f",(p+i)); 12 sum=sum+*(p+i); 13 } 14 min=*(p+0);max=*(p+0); 15 for(i=0;i<n;i++) 16 { 17 if(min>*(p+i)) 18 { 19 min=*(p+i); 20 } 21 if(max<*(p+i)) 22 { 23 max=*(p+i); 24 } 25 } 26 printf("average = %.2f\n",sum/n*1.0); 27 printf("max = %.2f\n",max); 28 printf("min = %.2f\n",min); 29 }
3.本题调试过程碰到问题及解决办法
错误信息1;
在定义数据类型的时候,sum的类型与average,max,min不同;
解决办法:把sum,average,max,min的类型都定义成double或者float。
C高级第一次PTA作业(2)
2-1计算职工工资
1.设计思路
(1)
第一步:构建一个数据结构,并在主函数中引用;
第二步:运用for循环输入结构的内容,并且计算所求值;
第三步:对所求值进行输出,结束;
(2)流程图
2.实验代码
1 #include <stdio.h> 2 struct clerk 3 { 4 char name[10]; 5 float b,r,f; 6 float s; 7 }; 8 9 int main() 10 { 11 12 int i,N; 13 struct clerk s1; 14 scanf("%d",&N); 15 for(i=1;i<=N;i++) 16 { 17 scanf("%s %f %f %f\n",s1.name,&s1.b,&s1.r,&s1.f); 18 s1.s =(s1.b + s1.r - s1.f); 19 printf("%s %.2lf\n",s1.name,s1.s); 20 } 21 22 return 0; 23 }
3.调试中遇到的问题及解决方法;
错误信息1:
问题,在解题中,忽略了b,r,f,s的类型,以至于答案错误,
解决方法:把b,r,f,s都定义为float即可。
1-2 计算平均成绩
1.设计思路
第一步:构建数据结构,并在主函数中引用;
第二步:新设立双精度浮点数average;整数grade;利用for循环,输入数据,并计算所有人成绩的总和grade;求出avergage,并输出;
第三步:利用for循环输出要输出的数据,结束;
2.实验代码
1 #include <stdio.h> 2 struct student 3 { 4 char num[6]; 5 char name[10]; 6 int grade; 7 double average; 8 }; 9 int main() 10 { 11 int i,N,grade,j; 12 double average; 13 scanf("%d",&N); 14 struct student si[N]; 15 grade = 0; 16 for(i=0;i<N;i++) 17 { 18 scanf("%s %s %d",si[i].num,si[i].name,&si[i].grade); 19 grade = grade +si[i].grade; 20 } 21 average = (double)(grade /N); 22 printf("%.2f\n", average); 23 for(i=0;i<N;i++) 24 { 25 if(si[i].grade<average) 26 { 27 printf("%s %s\n",si[i].name,si[i].num); 28 } 29 } 30 return 0; 31 }
3.本题调试过程碰到问题及解决办法
错误信息1;
问题:本题中忽略了数组的表示方法,和average是输出时是以两个小数点的形式输出的;
解决方法:把si→si[i]即可,%lf→%.2lf即可。
C高级第一次PTA作业(3)
1.按等级统计学生成绩
1.设计思路
第一步:读题;利用for循环写出条件,设j为整形,同时以j表示不及格同学的数量。
第二步:利用if,else if条件句评定等级;
第三步:返回主函数;
2.实验代码
部分代码:
1 int set_grade( struct student *p, int n ) 2 { 3 int i,j=0; 4 for(i=0;i<n;i++,p++) 5 { 6 if(p->score <60) 7 { 8 j++; 9 } 10 if((p->score >=85)&&(p->score <=100)) 11 { 12 p->grade = 'A'; 13 } 14 else if((p->score >=70)&&(p->score <=84)) 15 { 16 p->grade = 'B'; 17 } 18 else if((p->score >=60)&&(p->score <=69)) 19 { 20 p->grade = 'C'; 21 }else 22 { 23 p->grade = 'D'; 24 } 25 } 26 return j; 27 }
全部代码:
1 #include <stdio.h> 2 #define MAXN 10 3 4 struct student{ 5 int num; 6 char name[20]; 7 int score; 8 char grade; 9 }; 10 11 int set_grade( struct student *p, int n ); 12 13 int main() 14 { struct student stu[MAXN], *ptr; 15 int n, i, count; 16 17 ptr = stu; 18 scanf("%d\n", &n); 19 for(i = 0; i < n; i++){ 20 scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score); 21 } 22 count = set_grade(ptr, n); 23 printf("The count for failed (<60): %d\n", count); 24 printf("The grades:\n"); 25 for(i = 0; i < n; i++) 26 printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade); 27 return 0; 28 } 29 int set_grade( struct student *p, int n ) 30 { 31 int i,j=0; 32 for(i=0;i<n;i++,p++) 33 { 34 if(p->score <60) 35 { 36 j++; 37 } 38 if((p->score >=85)&&(p->score <=100)) 39 { 40 p->grade = 'A'; 41 } 42 else if((p->score >=70)&&(p->score <=84)) 43 { 44 p->grade = 'B'; 45 } 46 else if((p->score >=60)&&(p->score <=69)) 47 { 48 p->grade = 'C'; 49 }else 50 { 51 p->grade = 'D'; 52 } 53 } 54 return j; 55 }
3.本题调试过程碰到问题及解决办法
错误信息1:
本题中,在对学生成绩进行评定的时候,对p所代表的学生没有进行逐一检查,只排查了一名学生;
解决办法:在i++后面加上p++即可。
2.结构体数组按总分排序
1.设计思路
(1)
第一步:本题有两个函数,第一个函数目的是计算学生的总成绩,设立新的结构sum表示学生的总成绩,利用for循环进行计算;
第二步:第二个函数的目的是把学生数据按总分降序排序。新设立结构temp进行交换,利用for循环比较学生成绩的大小并且进行排序;
第三步:返回主函数;
(2)流程图
主函数:
被调函数calc
被调函数sort
2.实验代码
部分代码:
1 void calc(struct student *p,int n) 2 { 3 struct student sum; 4 int i,j=0; 5 for(i=0;i<n;i++) 6 { 7 for(j=0;j<3;j++) 8 { 9 (p+i)->sum =(p+i)->sum + (p+i)->score[j]; 10 } 11 } 12 13 } 14 15 void sort(struct student *p,int n) 16 { 17 int i,j,a; 18 struct student temp; 19 for(i=0;i<n-1;i++) 20 { 21 a=i; 22 for(j=i;j<n;j++) 23 { 24 if(((p+a)->sum)<((p+j)->sum)) 25 { 26 a=j; 27 } 28 } 29 if(a!=i) 30 { 31 temp=*(p+i); 32 *(p+i)=*(p+a); 33 *(p+a)=temp; 34 } 35 } 36 }
全部代码:
1 #include <stdio.h> 2 struct student 3 { 4 int num; 5 char name[15]; 6 float score[3]; 7 float sum; 8 }; 9 void calc(struct student *p,int n); 10 void sort(struct student *p,int n); 11 int main() 12 { 13 struct student stu[5]; 14 int i,j; 15 float f; 16 for(i=0;i<5;i++) 17 { 18 scanf("%d%s",&stu[i].num,stu[i].name); 19 for(j=0;j<3;j++) 20 { 21 scanf("%f",&f); 22 stu[i].score[j]=f; 23 } 24 } 25 calc(stu,5); 26 sort(stu,5); 27 for(i=0;i<5;i++) 28 { 29 printf("%5d%15s",stu[i].num,stu[i].name); 30 printf(" %.1f %.1f %.1f %.1f\n",stu[i].score[0],stu[i].score[1],stu[i].score[2], stu[i].sum); 31 } 32 return 0; 33 void calc(struct student *p,int n) 34 { 35 struct student sum; 36 int i,j=0; 37 for(i=0;i<n;i++) 38 { 39 for(j=0;j<3;j++) 40 { 41 (p+i)->sum =(p+i)->sum + (p+i)->score[j]; 42 } 43 } 44 45 } 46 47 void sort(struct student *p,int n) 48 { 49 int i,j,a; 50 struct student temp; 51 for(i=0;i<n-1;i++) 52 { 53 a=i; 54 for(j=i;j<n;j++) 55 { 56 if(((p+a)->sum)<((p+j)->sum)) 57 { 58 a=j; 59 } 60 } 61 if(a!=i) 62 { 63 temp=*(p+i); 64 *(p+i)=*(p+a); 65 *(p+a)=temp; 66 } 67 } 68 }
3.本题调试过程碰到问题及解决办法
错误信息1:
在本题中,对学生成绩进行相加时,出现了错误。
解决办法:把p→p+i即可。
二.学习总结和进度
1.总结
这两周老师讲述了malloc,realloc,calloc及他们的应用;
学习了结构的构建和应用,用结构输入并按程序排序学生名词,利用指针进行被调用函数运算;
2.git
1.git地址:https://git.coding.net/smj031915/dexqdeczy.git
2.上传的截图:
3.点评的同学(点评我的同学)
王姝雯:http://www.cnblogs.com/phsudie/p/8661686.html
张心悦:http://www.cnblogs.com/zxy980612/p/8696690.html
吴晓明:http://www.cnblogs.com/phsudie/p/8661686.html#3945506
点评我的同学:
王姝雯:http://www.cnblogs.com/phsudie/p/8661686.html
张心悦:http://www.cnblogs.com/zxy980612/p/8696690.html
董雅洁:http://www.cnblogs.com/exo123/p/8663311.html
4.表格:
5.折线图: