成绩排名
描述
读入n名学生的姓名、身份证号、成绩,分别输出成绩最高和成绩最低学生的姓名和身份证号。注意:学生名单中可能缺考,没有成绩,表示为n/a.
输入
每个测试输入包含1个测试用例,格式为
第1行:正整数n (1<=n<=100)
第2行:第1个学生的姓名 学号 成绩
第3行:第2个学生的姓名 学号 成绩
第n+1行:第n个学生的姓名 学号 成绩
其中姓名为不超过10个字符的字符串,身份证是标准18位,成绩为0到100之间的一个整数。
输入中至少有一位学生有成绩。
输出
对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是成绩最低学生的姓名和学号,项与项之间有1个空格。如果成绩最高的学生有多个,输出姓名字典序最小的那个,如果成绩最低的有多个,输出姓名字典序最大的那个。
姓名为不超过10个字符的字符串,中间有没有空格。。
题目上面说的是身份证号,下面怎么变成学号了。。。
用身份证号的代码:
代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
typedef struct _student
{
char name[12]; //姓名
char id[20]; //身份证号
int score; //成绩,缺考设为0
}Student;
//判断字符是否是数字字符
int isNumber(char c)
{
if (c >= '0' && c <= '9')
return 1;
else
return 0;
}
//解析字符串
void parse(char* buf, Student* s)
{
int i = 0, j = 0;
//过滤前面的空格--以防万一
while (buf[i] != '\0' && buf[i] == ' ')
i++;
//录入名字
while (buf[i] != '\0' && isNumber(buf[i]) == 0)
{
s->name[j] = buf[i];
i++;
j++;
}
//删除多余的空格
s->name[j] = 0;
j--;
while (j >= 0)
{
if (s->name[j] == ' ')
{
s->name[j] = 0;
j--;
}
else
break;
}
//读取身份证
j = 0;
for (; j < 18; j++)
s->id[j] = buf[i++];
s->id[j] = 0;
//过滤空格--以防万一
while (buf[i] != '\0' && buf[i] == ' ')
i++;
s->score = 0;
if (buf[i] == 'n')
return;
while (buf[i] != '\0')
{
s->score = s->score * 10 + (buf[i] - '0');
i++;
}
}
int main()
{
Student stu[1000];
char tmp[100], ch;
int i, n;
int maxIndex = 0, minIndex = 0; //最大和最小成绩学生在数组中的下标
scanf("%d", &n); //读取学生个数
getchar(); //吸收回车符
for (i = 0; i < n; i++)
{
scanf("%[^\n]%c", tmp, &ch);
parse(tmp, &stu[i]);
if (i > 0)
{
//找成绩最大的
if (stu[i].score > stu[maxIndex].score)
maxIndex = i;
else if (stu[i].score == stu[maxIndex].score) //成绩相等
{
if (strcmp(stu[i].name, stu[maxIndex].name) < 0) //名字字典序最小的
maxIndex = i;
}
//找成绩最小的
if (stu[i].score != 0) //跳过缺考的
{
if (stu[i].score < stu[minIndex].score)
minIndex = i;
else if (stu[i].score == stu[minIndex].score) //成绩相等
{
if (strcmp(stu[i].name, stu[minIndex].name) > 0) //名字字典序最大的
minIndex = i;
}
}
}
}
printf("%s %s\n", stu[maxIndex].name, stu[maxIndex].id);
printf("%s %s\n", stu[minIndex].name, stu[minIndex].id);
return 0;
}
这里有代码可以提供给您参考下:
#include<stdio.h>
typedef struct
{
char name[11];
char id[11];//学号
int score;
}grade;
grade Get (grade *m);//输入数据
int find (grade a[],int n);//找出最大值的下标
int findd (grade a[],int n);//找出最小值的下标
int main()
{
int n;
int maxid,minid;
scanf("%d",&n);
grade a[n];
for(int i=0;i<n;i++)
{
Get(&a[i]);
}
maxid=find(a,n);
printf("%s %s\n",a[maxid].name,a[maxid].id);
minid=findd(a,n);
printf("%s %s",a[minid].name,a[minid].id);
}
grade Get (grade *m)
{
scanf("%s%s%d",&m->name,&m->id,&m->score);
}
int find (grade a[],int n)
{
int maxid=0;
for(int i=1;i<n;i++)
{
if(a[maxid].score<a[i].score)
{
maxid=i;
}
}
return maxid;
}
int findd (grade a[],int n)
{
int minid=0;
for(int i=1;i<n;i++)
{
if(a[minid].score>a[i].score)
{
minid=i;
}
}
return minid;
}
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String[][] aStrings = new String[n][3];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 3; j++) {
aStrings[i][j] = scanner.next().trim();
// System.out.println(aStrings[i][j]);
}
}
int[] temp = new int[n];
for (int i = 0; i < n; i++) {
// System.out.println(aStrings[i][2]);
temp[i] = Integer.parseInt(aStrings[i][2]);
}
String min, max, s, s2 = "";
Arrays.sort(temp);
int[] arr = new int[n];
for (int i = temp.length - 1, j = 0; i >= 0 & j <= n; i--, j++) {
arr[j] = temp[i];
// System.out.println(arr[j]);
}
max = arr[0] + "";
min = arr[n - 1] + "";
for (int i = 0; i < n; i++) {
if (max.equals(aStrings[i][2])) {
s = aStrings[i][0];
s2 = aStrings[i][1];
System.out.println(s+" "+ s2);
}
}
for (int i = 0; i < n; i++) {
if (min.equals(aStrings[i][2])) {
s = aStrings[i][0];
s2 = aStrings[i][1];
System.out.println(s+" "+ s2);
}
}
}
}
望采纳
以下是一个简单的 C 语言代码示例,使用了一个结构体来存储学生的信息,其中包括姓名、身份证号和成绩。
#include <stdio.h>
#include <string.h>
#define MAX_STUDENTS 100
#define MAX_NAME_LEN 10
#define MAX_ID_LEN 18
// 定义一个学生信息的结构体
struct student {
char name[MAX_NAME_LEN + 1]; // 姓名
char id[MAX_ID_LEN + 1]; // 身份证号
int score; // 成绩
};
int main()
{
// 定义一个学生数组,用于存储学生信息
struct student students[MAX_STUDENTS];
// 定义变量 n,表示学生数量
int n;
// 使用 scanf 读入 n
scanf("%d", &n);
// 定义变量 i 用于循环
int i;
// 定义变量 max_score 和 min_score 用于记录最高成绩和最低成绩
int max_score = -1;
int min_score = 101;
// 定义字符串 max_name 和 min_name 用于记录成绩最高和成绩最低学生的姓名
char max_name[MAX_NAME_LEN + 1] = "";
char min_name[MAX_NAME_LEN + 1] = "";
// 定义字符串 max_id 和 min_id 用于记录成绩最高和成绩最低学生的身份证号
char max_id[MAX_ID_LEN + 1] = "";
char min_id[MAX_ID_LEN + 1] = "";
// 使用循环读入学生的信息
for (i = 0; i < n; i++) {
// 使用 scanf 读入学生的姓名、身份证号和成绩
scanf("%s %s %d", students[i].name, students[i].id, &students[i].score);
// 如果学生的成绩大于当前的最高成绩
if (students[i].score > max_score) {
// 更新最高成绩
max_score = students[i].score;
// 更新最高成绩学生的姓名和身份证号
strcpy(max_name, students[i].name);
strcpy(max_id, students[i].id);
}
// 如果学生的成绩小于当前的最低成绩
if (students[i].score < min_score) {
// 更新最低成绩
min_score = students[i].score;
// 更新最低成绩学生的姓名和身份证号
strcpy(min_name, students[i].name);
strcpy(min_id, students[i].id);
}
}
// 输出成绩最高学生的姓名和身份证号
printf("%s %s\n", max_name, max_id);
// 输出成绩最低学生的姓名和身份证号
printf("%s %s\n", min_name, min_id);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!