A | Q |
---|---|
这个作业属于那个课程 | C语言程序设计II |
这个作业要求在哪里 | 2019春第九周作业 |
我在这个课程的目标是 | 了解并且应用结构体和数组的知识 |
这个作业在那个具体方面帮助我实现目标 | 掌握了数组的简单编程及应用,了解了结构体 |
参考文献 | C语言chap3和C语言chap9 |
一、本周完成的作业
题目1.6-1 按等级统计学生成绩 (20 分)
本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。
函数定义接口:
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 10struct 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).实验代码
int set_grade( struct student *p, int n )
{
int count=0,i;
for(i=0;i<n;i++)
{ if((*p).score<60) { (*p).grade='D'; count++; } else if((*p).score>=60&&(*p).score<=69) {(*p).grade='C'; } else if((*p).score>=70&&(*p).score<=84) {(*p).grade='B'; }else {(*p).grade='A';} p++;
}
return count;
}
2) .设计思路
mermaid
flowchat
st=>start: 函数声明,定义相关变量,声明结构体
op=>operation: 利用if和else-if来进行成绩在不同阶层的分级
op1=>operation: 统计不及格人数
e=>end: return count;st->op->op1->e
3).本题调试过程碰到问题及解决办法
问题:老实说这道题对我来说不算很南,难的只有在指针上的部分,还有些许粗心。
解决方法:查阅书籍,调试代码。
4).运行结果截图
题目2.7-1 一帮一 (15 分)
“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
输入第一行给出正偶数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>
#include<string.h>struct student { int sex;char name[10];int flag; };
int main(){ struct student s[100]; int n;int count=0;scanf("%d",&n);for(int i=0;i<n;i++) {scanf("%d %s",&s[i].sex,&s[i].name);s[i].flag=0;} for(int i=0;i<n/2;i++) {for(int k=n-1;k>=n/2;k--){if((s[i].sex!=s[k].sex)&&s[i].flag==0&&s[k].flag==0){s[i].flag =1;s[k].flag =1;count=count+2;printf("%s %s\n",s[i].name ,s[k].name );}}if(count==n)break;}
}
2) 设计思路
mermaid
flowchat
st=>start: 编译预处理函数,定义结构体
op=>operation: 定义相关变量,申明结构体
io=>inputoutput: 利用一个循环来输入样例
op1=>operation: 在利用for的双重嵌套循环来进行分配任务
cond=>condition: 是异性且还没有分配?
op3=>operation: 排除未配对统计已配对
cond1=>condition: count==n?
io1=>inputoutput: 输出配对表
e=>endst->op->io->op1->cond
cond(yes,right)->op3->io1->cond1
cond(no)->op1
cond1(no)->op1
cond1(yes)->e
3).本题调试过程碰到问题及解决办法
问题:提交pta之后老师答案部分正确,我就在想是不是少了什么,从答案的测试点出发进行调试。
解决方法:在最后在多定义一个flag来作为标记是否已分配,提交后答案正确。
4).运行结果截图
题目3.*7-2 考试座位号 (15 分**)
每个 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>
#include<string.h>
struct student { char num[20];int x,y; };
int main(){ struct student s[1100]; int n,m;scanf("%d\n",&n);for(int i=0;i<n;i++) {scanf("%s %d %d\n",&s[i].num,&s[i].x,&s[i].y);} scanf("%d\n",&m);int b[m];for(int i=0;i<m;i++) {scanf("%d",&b[i]);} for(int i=0;i<m;i++) {for(int k=0;k<n;k++){if(s[k].x==b[i]) {printf("%s %d\n",s[k].num,s[k].y);}}}
}
2) 设计思路
mermaid
flowchat
st=>start: 声明结构体,定义相关变量和数组
io=>inputoutput: 输入n,并且利用循环输入学号和座位号
io2=>inputoutput: 输入m,并且利用for循环输入座位号
op=>operation: 利用for的二重循环来进行在座位号的比较
cond=>condition: s[k].x==b[i]?
io3=>inputoutput: 输出学号座位号
e=>end: 结束函数st->io->io2->op->cond
cond(yes)->io3->e
cond(no)->op
2) 本题调试过程中碰到问题及解决办法
问题:pta提交答案错误,软件上运行无法输出
解决方法:仔细寻找发现原来是数组b[m]的位置没放对应当放在输入m之后。
4) 运行结果截图
题目4.思考题
1.什么是递归函数?
答:调用自己定义的函数也可以觉递归函数,这是我自己比较浅显的理解,具体参考:什么是递归函数?
2..递归函数的优缺点。
答: 我怕觉得吧优点在于实现比较简单,缺点的话就是比较麻烦,调用的耗时长,效率也可能很低,占用空间也会大一些。这是我的理解。
3..如何归纳出递归式?
答: 我觉得递归式都是前人总结的,没有足够的经验是没有成型的总结式。我仔细阅读过这篇文章,这就是我得出的体会。参考:C语言递归操作总结
二、学习进度统计和学习感悟
1).学习进度统计
2).学习感悟
本次作业让我感觉难度非凡,深深的感到自己在结构体知识匮乏到了什么程度,几天的时间才能完成作业,思路也不多太难了呀,耗时长,题目难,所幸在这个过程中还是又学习到一些东西的。
(1)本周你学习哪些内容?有哪些收获?
本周学习了结构体和指针和数组的结合,三者的结合,难度误以又提高了一个难度,难上加难。掌握了结构体的简单应用,至少基础作业做出来了。
(2)本周所学内容中你觉得哪些地方是难点?对此你做了哪些措施去客服这些难点?
我觉得都挺难的,主要看知识量和操作量的积累。我也精良去多做一些编程题目,题目太难的也不会去设计,都是先尝试少量又相对简单的编程题目。
三、结对编程的过程及优缺点
关于结对编程
本次结对编程地点在寝室,本次结对与室友搭档,过程还是依然比较愉快的,结对编程中我们讨论了第九周基础作业第三题中代码总是在软件上运行无法输出,我们进行了长时间的调试和讨论分别的除了不一样的结果。
结对编程的优缺点:
优点:1.结对编程更适用于解决一些方向性的问题;2.结对编程中,双方的互动目的在于开启思路,避免单独编程时思维容易阻塞的情况。3.多双眼睛,少点 bug,也能增加不一样的编程经验
缺点:拍照编程还是有些让人觉得不太自然。