题目描述:
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。 输入格式: 每个测试输入包含 1 个测试用例,格式为 第 1 行:正整数 n 第 2 行:第 1 个学生的姓名 学号 成绩 第 3 行:第 2 个学生的姓名 学号 成绩 ... ... ... 第 n+1 行:第 n 个学生的姓名 学号 成绩 其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。 输出格式: 对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。 输入样例: 3 Joe Math990112 89 Mike CS991301 100 Mary EE990830 95 输出样例: Mike CS991301 Joe Math990112
本人AC代码:
// PAT_1 成绩排名 # include <stdio.h> # include <stdlib.h> // 将学生结构体定义为指针类型 typedef struct student { char Name[11]; char Number[11]; int Score; }*Student; int main(void) { int n; // 代表学生人数 scanf("%d",&n); Student S; // 指针类型 int i; int flag_min, flag_max; // 仅用下标代表最大最小值项 // 动态分配内存? // ************************************************* // 此处存在很大问题 S = (Student)malloc(n*40*sizeof(Student)); // 判断内存是否分配成功 if (NULL == S) { // 内存分配失败! exit(-1); } for (i=0; i<n; i++) { scanf("%s%s %d",S[i].Name, S[i].Number, &S[i].Score); } // 注:在输入字符串的时候可以考虑以下输入方法 // scanf ("%s%d %c%s", stu[i].name, &stu[i].age, &stu[i].sex, stu[i].num); // %c前面要加空格, 不然输入时会将空格赋给%c // 对学生成绩进行排名 // 找出最小值 flag_min = 0; flag_max = 0; for (i=1; i<n; i++) { // 比较完成绩移动谁? if (S[flag_min].Score > S[i].Score) flag_min = i; if (S[flag_max].Score < S[i].Score) flag_max = i; } printf("%s %s\n",S[flag_max].Name,S[flag_max].Number); printf("%s %s\n",S[flag_min].Name,S[flag_min].Number); free(S); // 释放指针 return 0; }
原文地址:https://www.cnblogs.com/Robin5/p/10905457.html
时间: 2024-10-22 10:57:39