求以下问题的完整代码

成绩排名
描述
读入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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632