输入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;
}
代码块:
方法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");
}
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))