问题 | 回答 |
---|---|
这个做业属于哪一个课程 | C语言程序设计 |
这个做业要求在哪里 | 第九周做业 |
我在这个课程的目标是 | 了解并熟练掌握结构体的使用方法 |
这个做业在哪一个具体方面帮助我实现目标 | 此次的pta上的做业都有用结构体 |
参考文献 | C语言程序设计 |
#基础做业 ##按等级统计学生成绩 本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。 ###函数接口定义: int set_grade( struct student *p, int n ); 其中p是指向学生信息的结构体数组的指针,该结构体的定义为: struct student{ int num; char name[20]; int score; char grade; }; n是数组元素个数。学号num、姓名name和成绩score均是已经存储好的。set_grade函数须要根据学生的成绩score设置其等级grade。等级设置:85-100为A,70-84为B,60-69为C,0-59为D。同时,set_grade还须要返回不及格的人数。 ###裁判测试程序样例:编程
#include <stdio.h> #define MAXN 10 struct student{ int num; char name[20]; int score; char grade; }; int set_grade( struct student *p, int n ); int main() { struct student stu[MAXN], *ptr; int n, i, count; ptr = stu; scanf("%d\n", &n); for(i = 0; i < n; i++){ scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score); } count = set_grade(ptr, n); printf("The count for failed (<60): %d\n", count); printf("The grades:\n"); for(i = 0; i < n; i++) printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade); return 0; } /* 你的代码将被嵌在这里 */
###输入样例: 10 31001 annie 85 31002 bonny 75 31003 carol 70 31004 dan 84 31005 susan 90 31006 paul 69 31007 pam 60 31008 apple 50 31009 nancy 100 31010 bob 78 ###输出样例: The count for failed (<60): 1 The grades: 31001 annie A 31002 bonny B 31003 carol B 31004 dan B 31005 susan A 31006 paul C 31007 pam C 31008 apple D 31009 nancy A 31010 bob B数组
###1)实验代码app
int set_grade( struct student *p, int n ) { int sum=0,i; for(i=0;i<n;i++){ if(p[i].score<=100&&p[i].score>=85){ p[i].grade='A'; } if(p[i].score<=84&&p[i].score>=70){ p[i].grade='B'; } if(p[i].score<=69&&p[i].score>=60){ p[i].grade='C'; } if(p[i].score<=59&&p[i].score>=0){ p[i].grade='D'; sum++; } } return sum; }
###2)流程图 函数
###3)本题调试过程碰到的问题及解决办法 无 ###4)运行结果截图 学习
###5)评价 感想:这道题目仍是比较简单的,就是指针的自定义函数 用时:20分钟测试
##一帮一 “一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工做,即在获得全班学生的排名后,在当前还没有分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。 ###输入格式: 输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每一个学生的性别(0表明女生,1表明男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,而且没有并列名次。 ###输出格式: 每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。 ###输入样例: 8 0 Amy 1 Tom 1 Bill 0 Cindy 0 Maya 1 John 1 Jack 0 Linda ###输出样例: Amy Jack Tom Linda Bill Maya Cindy John设计
###1)实验代码指针
#include<stdio.h> #define MAXN 50 struct student{ int num; char name[9]; }; int main(void) { struct student stu[MAXN]; int n,i,j,l,count,sum[25],k=0; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d %s\n",&stu[i].num,&stu[i].name); } for(i=0;i<n/2;i++){ for(j=n-1;j>=n/2;j--){ if(stu[i].num!=stu[j].num&&stu[j].num!=2){ printf("%s %s\n",stu[i].name,stu[j].name); stu[j].num=2; break; } } } return 0; }
###2)流程图 调试
###3)本题调试过程当中碰到的问题及解决办法 code
问题:一方面是名字的那个字符串定义范围小了,没有留‘\0’的位置,另外一方面是我在想那个不同性别的组合时,怎么控制那个后面学生不重复输出,想要一次性跳出第二个循环 解决办法:第一个是根据那个提交时的提示字符串边界,另外一个是我在寻找如何一次性跳出两个循环的时候,看到了一个用标记的方法来判断循环 ###4)运行结果截图
###5)评价 感想:就是思路太过于局限,想问题的思路不够简洁 用时:一小时
##考试座位号 每一个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常状况下,考生在入场时先获得试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生须要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。 ###输入格式: 输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字组成,座位从 1 到 N 编号。输入保证每一个人的准考证号都不一样,而且任什么时候候都不会把两我的分配到同一个座位上。 考生信息以后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。 ###输出格式: 对应每一个须要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。 ###输入样例: 4 3310120150912233 2 4 3310120150912119 4 1 3310120150912126 1 3 3310120150912002 3 2 2 3 4 ###输出样例: 3310120150912002 2 3310120150912119 1
###1)实验代码
#include<stdio.h> struct student{ long int num; int a; int b; }; int main(void) { struct student stu[1000]; int i,N,M,j,a1[1000]; scanf("%d",&N); for(i=0;i<N;i++){ scanf("%ld %d %d\n",&stu[i].num,&stu[i].a,&stu[i].b); } scanf("%d\n",&M); for(i=0;i<M;i++){ scanf("%d ",&a1[i]); } for(i=0;i<M;i++){ for(j=0;j<N;j++){ if(a1[i]==stu[j].a){ printf("%ld %d\n",stu[j].num,stu[j].b); break; } } } return 0; }
###2)流程图
###3)本题调试过程碰到的问题及解决办法
问题:一个是没有注意输出格式,还有就是太粗心了,把那个座位输进数组的时候写成了范围,应该是a1[i] 解决办法:就是反复的调试,查看
###4)运行结果截图
###5)评价 感想:题不是很难,主要是老是出一些小错误,无奈 用时:一个小时
#预习做业 问题:什么是递归? 在我看来,递归就是先想一个问题的最直接的解决办法,也就是说最特殊的状况,即跳出循环的那种状况,而后就是不断的简化问题,找出规律,能够不停的套用同时使用函数循环 优势:使得代码更加的精简,而且减小了咱们的思考量相对状况下的,就是说咱们只须要简单的想大的运行计算,相对的内部运算不用太过去想,像课本中的汉诺塔问题 缺点:就是对于找递归式子很差找,还有就是代码看起来彷佛不是那么好理解 问题:如何概括出递归式? 我的以为,找递归式仍是须要靠作题来练的吧,主要是找出里面的规则,多作题,有了那个思惟就行了吧 ###学习进度条 |周/日期|这周所花的时间|代码行数|学到的知识点简介|目前比较迷惑大问题| |----------|---------------------|------------|---------------------------------|-----------------------------| |4/22-4/26|15个小时|200行|结构体的使用,递归法,一些头文件|汉诺塔问题| ####累计代码行数和博客字数 |时间|博客字数|代码行数| |-------|-----------|------------| |第一周|0|80| |第二周|100|180| |第三周|400|330| |第四周|600|480| |第五周|900|720| |第六周|1250|890| |第七周|1610|1065| |第八周|2010|1295| |第九周|2480|1495|
###学习感悟 1)老是莫名其妙的写错一些不应写错的地方,可能仍是由于不够专一吧 2)疑惑:对于此次预习的内容,那个汉诺塔问题的那个递归,我不是特别明白他是怎么搬运的那个盘子,还有那个本身定义头文件是要把他存在哪里我不是特别清楚 ###结对编程 过程:就是一块儿思考该怎么作,讨论解题的的思路 优势:1.能够更加的清楚思路,就是对程序更加的熟悉和清楚 2.能够更有效的交流,在交流的过程当中本身的思路会更加的清楚,能够解决更多的问题,以及本身自己忽略的问题 3.相互学习,传递经验 4.能够督促学习 缺点:经验不足!