2018第二次作业。
作业要求一
1)C高级第二次PTA作业(1)
1.1删除字符串中数字字符
设计思路
1:使用for循环和if语句,一个一个字符判断,找到数字字符就跳过去判断下一个字符,否则使指针指向不是数字字符的字符来替换。
实验代码
void delnum(char *s) { int i = 0,k = 0; while(s[i] != '\0') { if(s[i] >= '0' && s[i] <= '9') { for(k = i;s[k] != 0;k ++) s[k] = s[k+1]; } else i ++; } }
本题调试过程碰到问题及解决办法
无
流程图
1.2 统计子串在母串出现的次数
设计思路
1:使用外循环控制次数,再用for循环,令j=i,k=0,退出内循环的条件为子串中的字符不为母串中的字符。
2:在内循环中,用if语句判断子串下一个是否为结束符,如果是,说明已经判断完一次,次数加1,跳出内循环。
3:从母串的下一个字符重新进行判断。
实验代码
int fun(char *str,char *substr) { int n = 0,i = 0,k = 0,flag = 0; for(;str[i] != '\0';i ++) { for(k = 0;substr[k] != '\0';k ++) { if(substr[k] == str[i+k]) flag = 1; else flag = 0; } if(flag == 1) { n ++; flag = 0; } } return n; }
本题调试过程碰到问题及解决办法
无
流程图
1.3字符串中除首尾字符外的其余字符按降序排列
设计思路
1:使用外循环控制次数,num个数组字符选num-1趟,首尾字符不比较。
2:再使用for循环和if语句判断下一个字符的ASCII码值是否大于前一个字符的ASCII码值,如果是就交换。
实验代码
int fun(char *s,int num) { int i,min = (num-2),k; for(i = 1;i <= (num-2);i ++) { if(s[min] > s[i]) { k = s[min]; s[min] = s[i]; s[i] = k; } } if(num > 0) { num --; fun(s,num); } }
本题调试过程碰到问题及解决办法
无
1.4 输出学生成绩
设计思路
1:输入学生人数(使用动态分配)。
2:用for循环输入学生成绩,并把它们相加,令max、min等于数组的第一个元素。
3: 用for循环,如果下一个数组元素小于min,就交换min;如果大于max,就交换max。
实验代码
#include<stdio.h> int main() { double avg = 0,max = 0,min = 101; int i = 0,*s,n; scanf("%d",&n); if((s=(int *)malloc(n*sizeof(int)))==NULL) exit(1); for(i =0 ;i < n;i ++) { scanf("%d",s+i); if(s[i] > max) max = s[i]; if(s[i] < min) min = s[i]; avg = avg + s[i]; } avg = avg / n; free(s); printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf",avg,max,min); }
本题调试过程碰到问题及解决办法
无
2)C高级第二次PTA作业(2)
2.1 计算职工工资
设计思路
1:用for循环输入n个员工的姓名,基本工资,浮动工资支出。
2:计算并输出。
实验代码
#include<stdio.h> struct people { char name[10]; float jiben,fudong,zhichu; float m; }; int main() { int i = 0,n; scanf("%d",&n); struct people s[n]; for(i = 0;i < n;i++) { scanf("%s %f %f %f",&s[i].name,&s[i].jiben,&s[i].fudong,&s[i].zhichu); s[i].m = (s[i].jiben + s[i].fudong - s[i].zhichu); } for(i = 0;i < n;i ++) { printf("%s %.2f\n",s[i].name,s[i].m); } }
本题调试过程碰到问题及解决办法
无
流程图
2.2 计算平均成绩
设计思路
1:使用for循环输入学号 姓名 成绩,并将成绩相加。
2:计算平均值,并输出。
3:使用for循环和if语句判断每个人的成绩是否小于平均值,若是就输出学生的姓名和学号。
实验代码
#include<stdio.h> struct student { char num[6],name[10]; int s; }; int main() { int i = 0,n; double avg = 0; 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].s); avg = avg + s[i].s; } avg/=n; printf("%.2lf\n",avg); for(i = 0;i < n;i ++) { if(s[i].s<avg) printf("%s %s\n",s[i].name,s[i].num); } }
本题调试过程碰到问题及解决办法
无
流程图
3)C高级第二次PTA作业(3)
3.1 按等级统计学生成绩
设计思路
1:用for循环再用if语句判断学生成绩的等级,如果学生成绩小于60分,count的值增加1。
2:返回count的值到主函数。
实验代码
int set_grade( struct student *p, int n ) { int count = 0, i = 0; for(;i < n;i ++,p ++){ if(p -> score < 60){ p -> grade = 'D'; count ++; } else if((p -> score < 70)&&(p -> score >= 60)){ p -> grade = 'C'; } else if((p -> score < 85)&&(p -> score >= 70)){ p -> grade = 'B'; } else if((p -> score >= 85)){ p -> grade = 'A'; } } return count; }
本题调试过程碰到问题及解决办法
无
3.2 结构体数组按总分排序
设计思路
1:用两个for循环镶嵌,外循环为第i个人的成绩总值,内循环为计算第i个人的成绩总值。
2:用排序法,按总分从大到小交换。
实验代码
void calc(struct student *p,int n) { int i = 0; 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 = 0,min = 0; struct student k; for(i = 0;i < n;i ++) { if((p + i) -> sum < (p + min) -> sum) { min = i; } } k = *(p + min); *(p + min)=*(p + n - 1); *(p + n - 1) = k; if(n > 1) { n --; sort(p,n); } }
本题调试过程碰到问题及解决办法
无
4)C高级第二次PTA作业(4)
并无本次作业
作业要求二
1、总结两周里所学的知识点有哪些学会了?(可记录每道作业题目所用的知识点)哪些还没有学会?
这两周的学习,让我在c语言的学习中有了较大进展,也获得了许多新知识,比如结构体struct,如何定义变量类型,还有如何使用已定义的变量类型定义变量,如何多变的使用指针等。而对于指针的使用还不是很熟悉,现在我的思路不太全面,并不能快速的解题,在脑内构成解题的程序,常常需要他人提醒,我还需要勤加练习,希望以后能有所突破。
2、将PTA作业的源代码使用git提交到托管平台上。
GIT:https://git.coding.net/ShiWithZhou/HI.git
3、点评3个同学的本周作业(在作业中给出被点评同学博客的链接),并邀请3名同学点评你的作业,无点评作业(你的作业未被3人点评)/或者没有回复同学或老师的点评都倒扣该题分数。
徐铭博 http://www.cnblogs.com/xmb1547828350/p/8657376.html
流淌的时之沙 http://www.cnblogs.com/archeralter/p/8746738.html
冯子旋 http://www.cnblogs.com/fengzx/p/8735254.html
4、请用表格和折线图呈现你本周(3/26 8:00~4/9 8:00)的代码行数和所用时间、博客字数和所用时间。