一、作业
6-7 删除字符串中数字字符
1 设计思路
(1)主要描述题目算法
第一步:用for循环和if语句,一个一个字符判断,找到数字字符就跳过去判断下一个,否则使指针指向不是(已判断过的)数字字符的字符(替换它)。
第二步:添加结束字符。
2.实验代码
void delnum(char *s) { int i=0,j=0; for(i=0;*(s+i)!='\0';i++) { if(*(s+i)>='0'&&*(s+i)<='9') { continue; } else { *(s+j)=*(s+i); j++; } } *(s+j)='\0'; }
(2) 本题调试过程碰到问题及解决办法
错误:
原因:未加*(s+j)='\0',字符串是以\0为结束标志,找不到\0会越界访问,结果未知。
6-8 统计子串在母串出现的次数
1 设计思路
(1)主要描述题目算法
第一步:用外循环控制趟数,再用for循环,令j=i,k=0,退出内循环的条件为子串中的字符不为母串中的字符。
第二步:在内循环中,用if语句判断子串下一个是否为结束符,如果是,说明已经判断完一次,次数加1,跳出内循环。
第三步:从母串的下一个字符重新判断。
2.实验代码
int fun(char *str,char *substr) { int i=0,j=0,k=0,count=0; for(i=0;*(str+i)!='\0';i++) { for(j=i,k=0;*(str+j)==*(substr+k);j++,k++) { if(*(substr+k+1)=='\0') { count++; break; } } } return count; }
(2) 本题调试过程碰到问题及解决办法
无。
3.流程图
6-9 字符串中除首尾字符外的其余字符按降序排列
1 设计思路
(1)主要描述题目算法
第一步:用外循环控制趟数,num个数组字符选num-1趟(首尾字符不比较)。
第二步:再用for循环和if语句判断下一个字符的ASCI码I是否大于前一个字符的ASCII码,如果是就交换。
2.实验代码
int fun(char *s,int num) { int i,j; char t; for(i=1;i<num-1;i++) { for(j=1;j<num-2;j++) { if(*(s+i)>*(s+j)) { t=*(s+j); *(s+j)=*(s+i); *(s+i)=t; } } } }
(2) 本题调试过程碰到问题及解决办法
无。
7-1 输出学生成绩
1 设计思路
(1)主要描述题目算法
第一步:输入学生人数,使用动态分配。
第二步:用for循环输入学生成绩,并把它们相加。
第三步:令max、min等于数组的第一个元素。
第四步:用for循环,如果下一个数组元素大于max,就交换max。如果小于min,就交换min。
2.实验代码
#include<stdio.h> #include<stdlib.h> int main() { int *a,n,i; double max,min,sum=0; scanf("%d",&n); if((a=(int *)malloc(n*sizeof(int)))==NULL) exit(1); for(i=0;i<n;i++) { scanf("%d",a+i); sum=sum+*(a+i); } max=*a;min=*a; for(i=0;i<n;i++) { if(*(a+i)<min) min=*(a+i); if(*(a+i)>max) max=*(a+i); } printf("average = %.2f\nmax = %.2f\nmin = %.2f",sum/n,max,min); free(a); return 0; }
(2) 本题调试过程碰到问题及解决办法
错误:输入样例按回车程序崩溃。
原因:未使用动态内存分配语句。
本周第一次PTA作业提交列表:
7-1 计算职工工资
1 设计思路
(1)主要描述题目算法
第一步:定义结构体。
第二步:用for循环输入n个员工的姓名 基本工资 浮动工资 支出。
第三步:计算并输出。
2.实验代码
#include<stdio.h> struct person{ char name[100]; float w; float w1; float account; }person1; int main() { int n,i; float pay; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s %f %f %f",&person1.name,&person1.w,&person1.w1,&person1.account); pay=person1.w+person1.w1-person1.account; printf("%s %.2f\n",person1.name,pay); } return 0; }
(2) 本题调试过程碰到问题及解决办法
错误:
在编译器运行时结果跟输出样例一样,但是PTA判断我答案错误。
原因:在我仔细的审过题目后,我发现我漏掉了这一点 把定义的变量类型改为float后答案正确。
7-2 计算平均成绩
1 设计思路
(1)主要描述题目算法
第一步:定义结构体。
第二步:用for循环输入学号 姓名 成绩,并将成绩相加。
第三步:计算平均值,并输出。
第四步:用for循环和if语句判断每个人的成绩是否小于平均值,是就输出学生的姓名和学号。
2.实验代码
#include<stdio.h> struct student{ char num[6]; char name[10]; int grade; }student1[10]; int main() { int n,i; double aver=0,sum=0; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s %s %d",student1[i].num,student1[i].name,&student1[i].grade); sum=sum+student1[i].grade; }aver=sum/n; printf("%.2f\n",aver); for(i=0;i<n;i++) { if(student1[i].grade<aver) printf("%s %s\n",student1[i].name,student1[i].num); } return 0; }
(2) 本题调试过程碰到问题及解决办法
错误:
原因:定义char类型的学号数组(由5个数字组成的字符串)的字符个数大于数组长度,没有结束字符,找不到\0会越界访问,结果未知。
char num[5]改为char num[6]。
3.流程图
本周第二次PTA作业提交列表:
8-1 按等级统计学生成绩
设计思路
(1)主要描述题目算法
第一步:用for循环再用if语句判断学生成绩的等级,如果学生成绩小于60分,count的值加1。
第二步:返回count的值到主函数。
2.实验代码
int set_grade( struct student *p, int n ) { int k,count=0; for(k=0;k<n;k++) { if(p[k].score>=85&&p[k].score<=100) p[k].grade='A'; else if(p[k].score>=70&&p[k].score<=84) p[k].grade='B'; else if(p[k].score>=60&&p[k].score<=69) p[k].grade='C'; else { p[k].grade='D'; count++; } } return count; }
(2) 本题调试过程碰到问题及解决办法
错误:输出乱码。
原因:将return count语句写进了for循环里,改正后答案正确。
3.流程图
6-2 结构体数组按总分排序
设计思路
(1)主要描述题目算法
第一步:用两个for循环,外循环为第i个人的成绩总值,内循环为计算第i个人的成绩总值。
第二步:用冒泡法排序,按总分从大到小交换。
2.实验代码
void calc(struct student *p,int n) { int i,j; p->sum=0; for(i=0;i<n;i++,p++) { for(j=0;j<3;j++) { p->sum=p->sum+p->score[j]; } } } void sort(struct student *p,int n) { int i,j; struct student t; for(i=0;i<n;i++) { for(j=0;j<n-1-i;j++) { if((p+j)->sum<(p+j+1)->sum) { t=*(p+j+1); *(p+j+1)=*(p+j); *(p+j)=t; } } } }
(2) 本题调试过程碰到问题及解决办法
错误:将t定义为int类型,编译器报错。
原因:t是作为交换p指针所指的结构体数组的学生数据的“空瓶子”,定义类型要与结构体数组一样。
本周第二次PTA作业提交列表: