python C C++

输入n(1<n<=100)个学生的信息,包括学号、姓名、语文、数学和英语。学号为4位数字组成,成绩为整数,如果不满足此条件,出现异常,如果输入的n不是数字或者 n<=1或n>100,出现异常,输出“输入的人数必须是数字,大于0并且小于等于100”。要求根据3门功课的平均成绩从高分到低分输出每个学生的学号、姓名、3门功课成绩及平均成绩,若平均成绩相同则按语文成绩从高到低排序。
输入格式:
每组测试数据首先输入一个正整数n(1<n<=100),表示学生人数;然后是n行信息,分别表示学生的学号、姓名(长度不超过10且由英文字母构成的字符串)和3门课成绩(正整数)。

输出格式:
如果n出现错误,出现异常。如果n输入正确,输出排序后的学生信息,每行一个学生信息:学号、姓名、语文、数学、英语、平均成绩(保留2位小数),上面每个数据之间留一个空格。

输入样例:
在这里给出多组。例如:

3
0001 zhangsan 80 95 65
0002 lisi 65 52 56
0003 wangwu 87 86 95
输出样例:
在这里给出相应的输出,文件中与输出一样。例如:

0003 wangwu 87 86 95 89.33
0001 zhangsan 80 95 65 80.00
0002 lisi 65 52 56 57.67


while True:
    try:
        n = int(input())
        if n<=1 or n>100:
            raise Exception("输入的人数必须是数字,大于0并且小于等于100")
        break
    except ValueError:
        print("输入的人数必须是数字,大于0并且小于等于100")
          
students = []  # 存储学生信息的列表

for i in range(n):
    try:
        info = input().split()
        if len(info[0]) != 4 or not info[0].isdigit():
            raise Exception("学号格式错误")
        if len(info[1]) > 10 or not info[1].isalpha():
            raise Exception("姓名格式错误")
        for j in range(2, 5):
            if int(info[j]) < 0 or int(info[j]) > 100:
                raise Exception("成绩必须在0到100之间")
        students.append(info)
    except Exception as e:
        print("第" + str(i+1) + "个学生信息有误:", e)

# 根据平均成绩和语文成绩排序
students.sort(key=lambda x: (-sum(map(int, x[2:]))/3, -int(x[2])))

# 输出结果
for s in students:
    avg_score = sum(map(int, s[2:])) / 3
    print(s[0], s[1], s[2], s[3], s[4], "{:.2f}".format(avg_score))
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
char id[5];
char name[11];
int chinese;
int math;
int english;
double average;
} Student;

int main() {
int n;
char input[100];
Student students[100];
char *p;
while (fgets(input, 100, stdin) != NULL) {//每组数据
input[strlen(input) - 1] = '\0';
n = strtol(input, &p, 10);
if (*p != '\0' || n <= 1 || n > 100) {//n不是数字或者不在范围内
printf("输入的人数必须是数字,大于0并且小于等于100\n");
continue;
}
for (int i = 0; i < n; ++i) {//读入每个学生信息
fgets(input, 100, stdin);
input[strlen(input) - 1] = '\0';
char *q = input;
for (int j = 0; j < 5; ++j) {//读入学号
students[i].id[j] = *q++;
}
students[i].id[4] = '\0';
q++;//跳过空格
int k = 0;
while (*q != '\0') {//读入名字
students[i].name[k++] = *q++;
}
students[i].name[k] = '\0';
int score[3];
for (int j = 0; j < 3; ++j) {//读入3门成绩
while (*q == ' ') q++;//跳过空格
char *r = q;
while (*q != ' ') q++;
*q = '\0';
score[j] = strtol(r, NULL, 10);
}
students[i].chinese = score[0];
students[i].math = score[1];
students[i].english = score[2];
students[i].average = (score[0] + score[1] + score[2]) / 3.0;
}
//排序
for (int i = 0; i < n - 1; ++i) {
for (int j = 0; j < n - 1 - i; ++j) {
if (students[j].average < students[j + 1].average
|| (students[j].average == students[j + 1].average && students[j].chinese < students[j + 1].chinese)) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
//输出
for (int i = 0; i < n; ++i) {
printf("%s %s %d %d %d %.2lf\n", students[i].id, students[i].name, students[i].chinese, students[i].math, students[i].english, students[i].average);
}
}
return 0;
}


```c++
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

struct stu{
char id[5], name[11];
int score[3], sum;
}student[110];

bool cmp(stu a, stu b) {
if (a.sum != b.sum) return a.sum > b.sum;
else return strcmp(a.id, b.id) < 0;
}

int main(){
int n;
cin >> n;
if (n <= 1 || n > 100) {
cout << "输入的人数必须是数字,大于0并且小于等于100";
return 0;
}
for (int i = 0; i < n; i++) {
cin >> student[i].id >> student[i].name;
for (int j = 0; j < 3; j++) {
cin >> student[i].score[j];
if (student[i].score[j] < 0 || student[i].score[j] > 100) {
cout << "输入的成绩必须是0-100之间的数字";
return 0;
}
student[i].sum += student[i].score[j];
}
}
sort(student, student + n, cmp);
for (int i = 0; i < n; i++) {
printf("%s %s %d %d %d %.2lf\n", student[i].id, student[i].name, student[i].score[0], student[i].score[1], student[i].score[2], (double)student[i].sum / 3.0);
}
return 0;
}

```

供参考:

#include <stdio.h>
#define N 101
struct student {
    char  id[5];
    char  name[10];
    int   C, M, E;
    float avg;
}stu[N], tmp;
int main()
{
    int    i, j, n;
    while (1) {
        scanf("%d", &n);
        if (n < 1 || n > 100){
            printf("输入的人数必须是数字,大于0并且小于等于100");
            break;
        }
        else{
            for (i = 0; i < n; i++)
            {
                scanf("%s %s %d %d %d", stu[i].id, stu[i].name, &stu[i].C, &stu[i].M, &stu[i].E);
                stu[i].avg = (stu[i].C + stu[i].M + stu[i].E) / 3.0;
            }
            for (i = n - 1; i > 0; i--){
                for (j = 0; j < i; j++){
                    if (stu[j].avg < stu[j+1].avg ||
                        stu[j].avg == stu[j+1].avg && stu[j].C < stu[j+1].C){
                        tmp = stu[j]; stu[j] = stu[j+1]; stu[j+1] = tmp;
                    }
                }
            }
            for (i = 0; i < n; i++)
                printf(i ? "\n%s %s %d %d %d %.2f" : "%s %s %d %d %d %.2f",
                      stu[i].id, stu[i].name, stu[i].C, stu[i].M, stu[i].E, stu[i].avg);
        }
    }
    return 0;
}

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7806360
  • 除此之外, 这篇博客: 习题 9.5 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。中的 习题 9.5 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 代码块:

    方法1:

    #include <stdio.h>
    struct student
    {
        int num;
        char name[10];
        float score[3];
        float aver;
    } stu[10];
    void input(struct student s[], int n);
    void average(struct student s[], int n);
    void high_score(struct student s[], int n);
    int main()
    {
        input(stu, 10);
        average(stu, 10);
        high_score(stu, 10);
        return 0;
    }
    void input(struct student s[], int n)
    {
        int i, j;
        for (i=0; i<n; i++){
            printf("Please enter No.%d student num name score: ", i+1);
            scanf("%d %s", &s[i].num, s[i].name);
            for (j=0; j<3; scanf("%f", &s[i].score[j++]));
        }
    }
    void average(struct student s[], int n)
    {
        int i, j;
        float sum;
        for (i=0, sum=0.0; i<n; i++)
            for (j=0; j<3; sum+=s[i].score[j++]);
        printf("Average=%.2f\n", sum/n);
    }
    void high_score(struct student s[], int n)
    {
        int i, j;
        float sum;
        struct student temp;
        for (i=0; i<n; i++){
            for (j=0, sum=0.0; j<3; sum+=s[i].score[j++]);
            s[i].aver=sum/3;
        }
        for (i=0; i<n; i++)
            for (j=i+1; j<n; s[i].aver<s[j].aver ? temp=s[i], s[i]=s[j], s[j]=temp, j++ : j++);
        printf("The highest student info: %d %-5s ", s[0].num, s[0].name);
        for (i=0; i<3; printf("%.2f ", s[0].score[i++]));
        printf("%.2f\n", s[0].aver);
    }

    方法2:

    #include <stdio.h>
    #include <stdlib.h>
    struct Student{
        int num; 
        char name[20];
        float score[3];
    };
    void input(Student *st);
    void print(Student *st);
    int main()
    {
        Student *stu=(Student*)malloc(3*sizeof(Student));
        input(stu);
        print(stu);
        system("pause");
        return 0;
    }
    void input(Student *st)
    {
        int i;
        Student *p;
        for (p=st, i=0; p<st+3; p++, i++){
            printf("Please enter No.%d student info: ", i+1);
            scanf("%d %s", &p->num, p->name);
            for (i=0; i<3; scanf("%f", &p->score[i++]));
        }
    }
    void print(Student *st)
    {
        int i, j;
        float aver, sum[3], total, max;
        Student *p;
        for (p=st, i=0, total=0; p<st+3; p++, i++){
            for (j=0, sum[i]=0; j<3; sum[i]+=p->score[j++]);
            total+=sum[i]/3;
        }
        aver=total/3;
        printf("Total Average: %.2f\n", aver);
        for (i=0, max=sum[i]; i<3; i++)
            if (sum[i]>max){
                max=sum[i];
                j=i;
            }
        printf("The highest score student info: %d %s ", (st+j)->num, (st+j)->name);
        for (i=0; i<3; printf("%.2f ", (st+j)->score[i++]));
        printf("\n");
    }
  • 以下回答由chatgpt基于相关博客总结生成:
    n = input()
    if not n.isdigit() or int(n) <= 1 or int(n) > 100:
        print("输入的人数必须是数字,大于0并且小于等于100")
    else:
        students = []
        for _ in range(int(n)):
            student = input().split()
            if len(student) != 5 \
                    or not student[0].isdigit() or len(student[0]) != 4 \
                    or not student[1].isalpha() \
                    or not student[2].isdigit() \
                    or not student[3].isdigit() \
                    or not student[4].isdigit():
                print("输入的数据格式错误,请重新输入")
                break
            else:
                students.append(student)
        else:
            students = [[eval(x) if i > 1 else x for i, x in enumerate(student)] for student in students]
            students.sort(key=lambda x: (-(x[2] + x[3] + x[4]) / 3, -x[2], x[0]))
            for student in students:
                print("%s %s %d %d %d %.2f" % (student[0], student[1], student[2], student[3], student[4], sum(student[2:]) / 3))
    

到底你是python还是c还是c++,怎么复杂的程序,难道还要写3个?
参考下这个吧