大家好,欢迎来到IT知识分享网。
期末了,真的挺忙的,不过忙完这一段时间也就空了不少。
趁着这段时间来好好刷一下题,锻炼一下手感,今天我做的题目是PAT乙级1004。
这道题啊,乍一眼看上去很简单,可实际上在做的时候还是会出现不少错误。
小伙伴们可不能像我一样这么马虎。
我们先来看一看这道题目的要求:
输入n个学生的姓名、学号、成绩,分别输出成绩最高和成绩最低的学生的姓名和学号。
题目真的非常简短,但是我们也不能疏忽。
照惯例,首先是审题分析,理清逻辑。
每次在做编程题与算法题的时候,我始终把这一基本要求放在首位。
审题分析,理清逻辑,流程图
1、输入的第一行为正整数n,那这里一般是要用到一个scanf了。
2、之后分别输入n个学生的姓名、学号和成绩。
3、之后是比较所有学生的成绩大小,再分别输出最高成绩学生的姓名和学号与最低成绩学生的姓名与学号。
流程图如下图所示:
用一个流程图就能非常直观地看出这道题目的逻辑。
接下来就是代码的实现。
代码的实现
代码的实现其实难度不大,关键在于C语言中非常重要的一个数据类型。
那就是结构体,如果不掌握结构体,那么这道题做起来将会非常困难。
可是一旦掌握结构体,这道题目做起来就简单了许多。
如下图所示,这就是用来存储学生姓名、学号和成绩的一个结构体,而且可以存储不同类型的数据,真的非常方便,如果想要调用这些数据,也可以直接进行初始化定义然后调用即可。
struct student { char name[100]; char ID[100]; int score; };
比方说以这道题为例
那要调用这些数据,就可以直接st[i].name即可,其他两种数据的调用也是如此。
好,针对流程图给出的逻辑一步一步来实现。
1、n个学生,那很简单,直接一个scanf规定输入n即可。
2、要分别输入n个学生的信息,只需要一个for循环,然后把这些信息依次输出即可。
3、判断大小,这是这道题最为关键的地方,因为我们只需要输出最高成绩和最低成绩学生的姓名和学号,也就是说,我们只需要比较成绩即可,不需要思考额外的东西。
那么,只需要调用结构体中的第三种数据score来比较大小即可。
要得到一个最高成绩,需要遍历整个数组,从第一个数据开始比较过去,每次比较后得到的数据位置给记录下来,如果要得到一个最低成绩,同理,只是从第一个数据开始比较过去要取小的那一部分。
这里要用到一个条件语句来进行判断才行。
最后再把最高成绩和最低成绩学生的姓名和学号单独输出即可,把他们的成绩给省略。
接下来给出我的代码部分。
Xcode正确,但是在PAT编译器中错误
这里我一开始在做的时候,先直接初始化了三个结构体,最后在编译器中跑的时候是能够得到正确结果的,可是在PAT编译器中却是错误的,在gcc和clang编译器中跑的时候,它只能够跳出一个结果,到现在我也还没解决这个问题,就蛮奇怪的。
我回来了,后来又去查阅了一些资料,发现问题就出在分配地址上面。
MAX分配的地址为-1,而MIN分配的地址都被占用了,所以得不到MIN的结果了。
所以,当我把MIN的地址分配到101的时候,诶,结果就出来了,就编译正确了。
#include <stdio.h> #include <string.h> struct student { char name[100]; char ID[100]; int score; }; int main() { struct student st[100], MAX, MIN; MAX.score = -1; MIN.score = 101; int n = 0; scanf("%d", &n); for(int i = 0;i < n; i++){ scanf("%s %s %d", st[i].name,st[i].ID,&st[i].score); } for(int i = 0;i<n;i++){ if(st[i].score > MAX.score){ MAX = st[i]; } } for(int i = 0;i<n;i++){ if(st[i].score < MIN.score){ MIN = st[i]; } } printf("%s %s\n%s %s\n", MAX.name,MAX.ID, MIN.name,MIN.ID); return 0; }
之前是因为没有解决这个问题,所以我选择了另一种方式,干脆不初始化定义这么多结构体,直接在结构体数组中进行更改不就行了吗,于是我重新定义了max和min两个数据,就是专门来得到最高成绩和最低成绩在数组中的位置,代码如下所示。
#include <stdio.h> #include <string.h> struct student { char name[100]; char ID[100]; int score; }; int main() { struct student st[100]; int max = 0; int min = 0; int n = 0; scanf("%d", &n); for(int i = 0;i < n; i++){ scanf("%s %s %d", st[i].name,st[i].ID,&st[i].score); } for(int i = 0;i<n;i++){ if(st[i].score > st[max].score){ max = i; } if(st[i].score < st[min].score){ min = i; } } printf("%s %s\n", st[max].name,st[max].ID); printf("%s %s\n", st[min].name,st[min].ID); return 0; }
这里产生了一个问题,运行时发生错误,我去查了查相关的资料,发现在gcc编译器中,需要对scanf进行一个返回判断。
于是,我在PAT平台上选择了clang编译器进行编译,结果就没有报错了。
总结
难度不大,但是要小心谨慎,一定要仔细。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/48598.html