作业要求一

PTA作业的提交列表

第一次作业

第二次作业

第三次作业

作业要求二

题目1.删除字符串中数字字符(函数题)

1.设计思路

- (1)算法

第一步:调用定义的函数。

第二步:定义i=0、j=0,i为原字符数组角标,j为删除后字符数组角标。使用循环语句读取字符数组元素,当字符数组元素为数字字符'0'~'9'时不进行操作,当字符数组元素为其它字符元素时,吧s[i]赋值给s[j],并让j加一。当s[i]为结束字符'\0'时,循环结束,并添加结束字符。

第三步:结果返回主函数。

- (2)流程图

2.实验代码

  1. void delnum(char *s)
  2. {
  3. int i,j;
  4. for(i = 0, j = 0; s[i] != '\0'; i++)
  5. {
  6. if (!s[i] >= '0' && s[i] <= '9')
  7. {
  8. s[j] = s[i];
  9. j++;
  10. }
  11. }
  12. s[j] = '\0';
  13. return;
  14. }

完整代码

  1. #include <stdio.h>
  2. void delnum(char *s);
  3. int main ()
  4. {
  5. char item[80];
  6. gets(item);
  7. delnum(item);
  8. printf("%s\n",item);
  9. return 0;
  10. }
  11. void delnum(char *s)
  12. {
  13. int i,j;
  14. for(i = 0, j = 0; s[i] != '\0'; i++)
  15. {
  16. if (!s[i] >= '0' && s[i] <= '9')
  17. {
  18. s[j] = s[i];
  19. j++;
  20. }
  21. }
  22. s[j] = '\0';
  23. return;
  24. }

3.本题调试过程碰到问题及解决办法

本题未遇到问题。

题目2.统计子串在母串出现的次数

1.设计思路

- (1)算法

第一步:调用定义的函数。

第二步:定义i、j、n,使用双重循环结构,外层循环用来遍历数组元素,内层循环判断字符数组元素是否相等,完全相等时,可遍历子串,则次数加一。

第三步:结果返回主函数。

- (2)流程图:略。

2.实验代码

  1. int fun(char *str,char *substr)
  2. {
  3. int i,j,n=0;
  4. for(i = 0; *(str+i) != '\0'; i++)
  5. {
  6. int a=0;
  7. for(j = 0, a = i; *(str+a) == *(substr+j); j++, a++)
  8. {
  9. if(*(substr+j+1) == '\0')
  10. n++;
  11. }
  12. }
  13. return n;
  14. }

完整代码

  1. #include<stdio.h>
  2. int fun(char *str,char *substr);
  3. int main()
  4. {
  5. //char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
  6. char str[81],substr[4];
  7. gets(str);
  8. gets(substr);
  9. int n;
  10. n=fun(str,substr);
  11. printf("n=%d\n",n);
  12. return 0;
  13. }
  14. int fun(char *str,char *substr)
  15. {
  16. int i,j,n=0;
  17. for(i = 0; *(str+i) != '\0'; i++)
  18. {
  19. int a=0;
  20. for(j = 0, a = i; *(str+a) == *(substr+j); j++, a++)
  21. {
  22. if(*(substr+j+1) == '\0')
  23. n++;
  24. }
  25. }
  26. return n;
  27. }

3.本题调试过程碰到问题及解决办法

解题没有什么错误,但是我自己有两个小问题。

(1)当我写完代码后,发现自己解题并没有使用指针的思想,于是想尝试重新用指针的方式解题,但是却没有什么好的思路,最多就是将a[i]和*(a+i)进行替换,所以我现在还是不能较好的使用指针。

(2)PTA题目所给出的主函数只能应用于题目所给出的案例,不好验证代码的正确性,所以我将主函数内直接给出的字符串改成输入进行运行调试。

题目3.字符串中除首尾字符外的其余字符按降序排列

1.设计思路

- (1)算法

第一步:调用定义的函数。

第二步:定义i、j,使用双重循环结构,外层循环用来遍历字符串中除首尾字符外的其余字符,内层循环判断字符数组元素大小(选择排序法)。

第三步:结果返回主函数。

- (2)流程图:略。

2.实验代码

  1. int fun(char *s,int num)
  2. {
  3. int i,j;
  4. for(i = 1; *(s+i+2) != '\0'; i++)
  5. {
  6. for(j = i; *(s+j+2) != '\0'; j++)
  7. {
  8. if(*(s+i) < *(s+j+1))
  9. {
  10. int t;
  11. t = *(s+i);
  12. *(s+i) = *(s+j+1);
  13. *(s+j+1) = t;
  14. }
  15. }
  16. }
  17. return *s;
  18. }

完整代码

  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,10);
  8. printf("%s",s);
  9. return 0;
  10. }
  11. int fun(char *s,int num)
  12. {
  13. int i,j;
  14. for(i = 1; *(s+i+2) != '\0'; i++)
  15. {
  16. for(j = i; *(s+j+2) != '\0'; j++)
  17. {
  18. if(*(s+i) < *(s+j+1))
  19. {
  20. int t;
  21. t = *(s+i);
  22. *(s+i) = *(s+j+1);
  23. *(s+j+1) = t;
  24. }
  25. }
  26. }
  27. return *s;
  28. }

3.本题调试过程碰到问题及解决办法

同上一题,PTA题目所给出的主函数可应用范围很小。

题目4. 输出学生成绩

1.设计思路

- (1)算法

第一步:定义所需变量,输入学生人数。

第二步:使用动态内存分配语句。

第三步:使用循环结构,对学生成绩进行输入,并计算平均成绩。使用冒泡排序法,将成绩从大到小排列。

第四步:输出结果。

- (2)流程图:略

2.实验代码

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int N, a[N];
  5. float sum, average;
  6. scanf("%d",&N);
  7. if ((a[N] = (float *)malloc(N*sizeof(float))) == NULL)
  8. {
  9. printf("Not able to allocate memory. \n");
  10. exit (1);
  11. }
  12. int i, j, k;
  13. for(i = 0; i < N; i++)
  14. {
  15. scanf("%d",&a[i]);
  16. sum = sum + a[i];
  17. }
  18. average = sum / N;
  19. for(j = 0; j < N - 1; j++)
  20. {
  21. for(k = 0; k < N - 1 - j; k++)
  22. {
  23. int t = 0;
  24. if(a[k] > a[k+1])
  25. {
  26. t = a[k];
  27. a[k] = a[k+1];
  28. a[k+1] = t;
  29. }
  30. }
  31. }
  32. printf("average = %.2f\nmax = %.2f\nmin = %.2f",average,(float)a[N-1],(float)a[0]);
  33. return 0;
  34. }

3.本题调试过程碰到问题及解决办法

第一次提交未使用动态内存分配,不过提交通过了,之后经提醒添加使用了动态内存分配语句。

题目5. 计算职工工资

1.设计思路

- (1)算法

第一步:定义结构体变量,成员包括——姓名、基本工资、浮动工资、支出和实发工资。

第二步:输入人数n,引用结构体变量。

第三步:使用循环结构,输入姓名、基本工资、浮动工资、支出,计算实发工资,并输出姓名和实发工资。

- (2)流程图

2.实验代码

  1. #include<stdio.h>
  2. struct clerk
  3. {
  4. char name[10];
  5. float wages, floating, pay, wage;
  6. }c1;
  7. int main()
  8. {
  9. int n, i;
  10. scanf("%d",&n);
  11. struct clerk c[n];
  12. for(i = 0; i < n; i++)
  13. {
  14. scanf("%s %f %f %f",c[i].name, &c[i].wages, &c[i].floating, &c[i].pay);
  15. c[i].wage = c[i].wages + c[i].floating - c[i].pay;
  16. printf("%s %.2f\n",c[i].name, c[i].wage);
  17. }
  18. }

3.本题调试过程碰到问题及解决办法

无。

题目6. 计算平均成绩

1.设计思路

- (1)算法

第一步:定义结构变量,成员包括——学号、姓名和成绩。

第二步:输入人数N,引用结构体变量。

第三步:使用循环结构,输入学号、姓名和成绩,计算总成绩。

第四步:计算平均成绩并输出。

第五步:使用循环结构,选择成绩低于平均的并输出。

- (2)流程图:略。

2.实验代码

  1. #include<stdio.h>
  2. struct student
  3. {
  4. char id[6], name[10];
  5. int achievement;
  6. }s1;
  7. int main()
  8. {
  9. int N, i;
  10. double sum = 0, average = 0;
  11. scanf("%d",&N);
  12. struct student s[N];
  13. for(i = 0; i < N; i++)
  14. {
  15. scanf("%s %s %d",s[i].id,s[i].name,&s[i].achievement);
  16. sum = s[i].achievement + sum;
  17. }
  18. average = sum / N;
  19. printf("%.2f\n",average);
  20. for(i = 0; i < N; i++)
  21. {
  22. if(s[i].achievement < average)
  23. printf("%s %s\n",s[i].name,s[i].id);
  24. }
  25. }

3.本题调试过程碰到问题及解决办法

本题出现了一个小错误,输入时成绩没有加“&”符号,导致程序无法运行。要时刻保持认真的态度,不要犯这样的错误。

题目7.按等级统计学生成绩(函数题)

1.设计思路

- (1)算法

第一步:调用定义函数。

第二步:使用循环结构,循环判断每个学生的等级,N为不及格人数,当学生为D等级时,N加一。

第三步:结果返回主函数。

- (2)流程图

2.实验代码

  1. int set_grade( struct student *p, int n )
  2. {
  3. int i,N = 0;
  4. for(i = 0; i < n; i++)
  5. {
  6. if((p+i)->score <= 100 && (p+i)->score >= 85)
  7. (p+i)->grade = 'A';
  8. else if((p+i)->score <= 84 && (p+i)->score >= 70)
  9. (p+i)->grade = 'B';
  10. else if((p+i)->score <= 69 && (p+i)->score >= 60)
  11. (p+i)->grade = 'C';
  12. else if((p+i)->score <= 59 && (p+i)->score >= 0)
  13. {
  14. (p+i)->grade = 'D';
  15. N++;
  16. }
  17. }
  18. return N;
  19. }

完整代码

  1. #include <stdio.h>
  2. #define MAXN 10
  3. struct student{
  4. int num;
  5. char name[20];
  6. int score;
  7. char grade;
  8. };
  9. int set_grade( struct student *p, int n );
  10. int main()
  11. { struct student stu[MAXN], *ptr;
  12. int n, i, count;
  13. ptr = stu;
  14. scanf("%d\n", &n);
  15. for(i = 0; i < n; i++)
  16. scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
  17. count = set_grade(ptr, n);
  18. printf("The count for failed (<60): %d\n", count);
  19. printf("The grades:\n");
  20. for(i = 0; i < n; i++)
  21. printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
  22. return 0;
  23. }
  24. int set_grade( struct student *p, int n )
  25. {
  26. int i,N = 0;
  27. for(i = 0; i < n; i++)
  28. {
  29. if((p+i)->score <= 100 && (p+i)->score >= 85)
  30. (p+i)->grade = 'A';
  31. else if((p+i)->score <= 84 && (p+i)->score >= 70)
  32. (p+i)->grade = 'B';
  33. else if((p+i)->score <= 69 && (p+i)->score >= 60)
  34. (p+i)->grade = 'C';
  35. else if((p+i)->score <= 59 && (p+i)->score >= 0)
  36. {
  37. (p+i)->grade = 'D';
  38. N++;
  39. }
  40. }
  41. return N;
  42. }

3.本题调试过程碰到问题及解决办法

错误一:本题出现了编译错误,后发现我将题目中完整代码进行了提交。

错误二:本次有测试点出现错误,错误提示为warning: ignoring return value of ‘scanf’。

解决方法:使用原输入值n对循环进行判断,问题解决。

题目8.结构体数组按总分排序(函数题)

1.设计思路

- (1)算法

第一步:调用calc函数,使用双重循环结构,内层循环通过循环计算单个学生总成绩,外层循环通过循环改变学生。

第二步:调用sort函数,通过对sum的比较使用冒泡排序法对学生进行排序。

- (2)流程图:略。

2.实验代码

  1. void calc(struct student *p,int n)
  2. {
  3. int i, j;
  4. for(i = 0; i < n; i++)
  5. {
  6. for(j = 0; j < 3; j++)
  7. {
  8. p->sum = p->score[j] + p->sum;
  9. }
  10. p++;
  11. }
  12. }
  13. void sort(struct student *p,int n)
  14. {
  15. int i, j;
  16. struct student t;
  17. for(i = 1; i < n; i++)
  18. for(j = 0; j < n - i; j++)
  19. if(p[j].sum < p[j+1].sum){
  20. t = p[j];
  21. p[j] = p[j+1];
  22. p[j+1] = t;
  23. }
  24. }

完整代码

  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. }
  34. void calc(struct student *p,int n)
  35. {
  36. int i, j;
  37. for(i = 0; i < n; i++)
  38. {
  39. for(j = 0; j < 3; j++)
  40. {
  41. p->sum = p->score[j] + p->sum;
  42. }
  43. p++;
  44. }
  45. }
  46. void sort(struct student *p,int n)
  47. {
  48. int i, j;
  49. struct student t;
  50. for(i = 1; i < n; i++)
  51. for(j = 0; j < n - i; j++)
  52. if(p[j].sum < p[j+1].sum){
  53. t = p[j];
  54. p[j] = p[j+1];
  55. p[j+1] = t;
  56. }
  57. }

3.本题调试过程碰到问题及解决办法

本题在void函数中添加了返回语句,删除即可解决问题。

作业要求三

1、学习总结

所学知识点:对指针的复习,动态内存分配,定义结构体变量及结构体变量的引用,以及数组、指针、结构的结合使用。

有关动态内存的分配,老师讲述较为简单,不过网上有很多相关资料,在这里分享一篇我找到的较为详尽的文章:《C语言中手把手教你动态内存分配》

存在问题:不能较好的使用指针。

2、我的Git地址

3、点评链接(待添加)

链接一

链接二

链接三

4、图表





C语言——第二次作业(2)的更多相关文章

  1. C语言--第二周作业

    ****学习内容总结**** 1.Git和编辑器截图 2.MOOC截图 3.阅读<提问的智慧>感想 读完<提问的智慧>之后,我认为在提问时,要根据以下步骤: 谨慎明确的描述症状 ...

  2. C语言第二次作业 ,

    一:修改错题 1输出带框文字:在屏幕上输出以下3行信息. 将源代码输入编译器 运行程序发现错误 错误信息1: 错误原因:将stido.h拼写错误 改正方法:将stido.h改为stdio.h 错误信息 ...

  3. c++语言第二次作业

    一题目7-1统计学生成绩 1实验代码 #include<stdio.h> int main(void) { int i,n,grade,A,B,C,D,E; A=B=C=D=E=; sca ...

  4. C语言--第二周作业评分和总结(5班)

    作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1026 一.评分要求 要求1 阅读指定博客+阅读收获+例子.(5分) 要求2 ...

  5. C语言第二次作业-----顺序结构

    一:改错题 (1)输出指定信息: 将给定源代码输入编译器: 执行编译命令,发现编译器报错,错误信息如下: 经检查,发现源程序将"stdio.h"误拼为"stido.h&q ...

  6. c语言第二次作业2

    ---恢复内容开始--- (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. 源程序 对源程序进行编译 错误信息1: 错误原因:stdio.h输入错误 改正方法:i和d互换位置 错误信息2: ...

  7. 2018C语言第二次作业

    一.学习内容总结 1.指针是一种数据类型,同样占有空间,其存储的是内存地址: 2.定义指针变量要在变量名之前加“*”字符表示: 3.“&”是取地址运算符,“*”是间接运算符: (注:声名和使用 ...

  8. 网络1712--c语言第二次作业总结

    1.作业亮点 1.1在调试问题方面有明显进步,变量声明方面有所改变,没有发现大面积抄袭现象. 1.2 以下几位同学博文写的较为优秀,可作为范例供大家参考 田亚琴--代码格式良好,思路清晰,调试部分图文 ...

  9. C语言第二次作业

    一.PTA实验作业 题目1:7-1 计算分段函数[2] 1.实验代码 double x,y; scanf("%lf",&x); if (x>=0) { y=sqrt( ...

随机推荐

  1. img 标签 访问图片 返回403 forbidden问题

    之前在项目里,本地调试的时候,图片src引用了第三方网站的图片资源,导致控制台出现了如下的报错: 403 forbidden,说明了这个网络资源这样获取是被拒绝的,那么通过简单的百度,找到了相关的解决 ...

  2. RAM

    1.     前记 我们知道,不同的计算机结构对RAM 的使用方式是有区别的,典型的计算机结构有两个,冯诺依曼结构和哈佛结构,而两大阵营的领军人物就是传说中的Intel X86系列的8086和51单片 ...

  3. 三:Linux 的基本命令、

    Ubuntu切换用户 su root sudo passwd root 使用管理员提权修改root 登录密码 连续输入两次即可..... 重置root 用户密码 例:当前登录用户为:ubuntu,但是 ...

  4. springboot入门的一点基础

    什么是SpringBoot java问世20年由于,发展到现在从技术角度来说已经很成熟,开发过程中我们总是在想如何去提高团队开发规范性.减少重复配置.避免低效开发.部署发布时流程的复杂度以及第三方技术 ...

  5. 【Luogu1291】百事世界杯之旅(动态规划,数学期望)

    [Luogu1291]百事世界杯之旅(动态规划,数学期望) 题面 洛谷 题解 设\(f[i]\)表示已经集齐了\(i\)个名字的期望 现在有两种方法: 先说我自己的: \[f[i]=f[i-1]+1+ ...

  6. FFT \ NTT总结(多项式的构造方法)

    前言.FFT  NTT 算法 网上有很多,这里不再赘述. 模板见我的代码库: FFT:戳我 NTT:戳我 正经向:FFT题目解题思路 \(FFT\)这个玩意不可能直接裸考的..... 其实一般\(FF ...

  7. 某厂java算法题实现及改进【有n个人成一圈,顺序排号(编号为1到n),从第一个人开始报数1到3报数】

    一.第一种实现: 实现比较简单,直接贴现成的代码了,第一种实现: /** * 总人数 * * @param d */ private static void sortQuerry1(int d) { ...

  8. python—day02

    python的版本与基本类型... 第一: 讲了计算机的基础的补充,讲解了什么是操作系统,计算机硬件,应用程序之间的关系: 操作系统是一个能协调管理计算机软件与硬件的软件程序: 能帮我们发送指令集到C ...

  9. 将["a"=1,"b"=2] 转为对象

    var obj = {}; var arr = ["a=1","b=2","c=3"]; for (var x in arr){ var s ...

  10. 关于eclipse安装Genymotion插件的方法

    其实Genymotion的安装方法也有两种:在线安装和离线安装,不过推荐使用在线安装,这个更快.这里我只说在线安装的方法. 打开eclipse,点击help-install new software ...