Question:
输入n个学生的学号、姓名、数学成绩、语文成绩和英语成绩,求出每位学生的三门课程的总分,然后按总分由高到低排序,并将排序结果按学号、姓名、数学成绩、语文成绩、英语成绩、总分和名次打印输出到屏幕和文件 student.dat中。要求用结构体描述学生信息,输出打印时每位学生信息占一行且上下列对齐,总分相同时名次相同,例如,假设有四个成绩为280、275、275、250,则对应的名次为1、2、2、4。
Code:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student
{
int id; // 学号
char name[20]; // 姓名
int math; // 数学成绩
int chinese; // 语文成绩
int English; // 英语成绩
}a[5];
// 输入学生的相关信息
void input(){
for(int i=0; i<4; i++){
scanf("%d %s %d %d %d", &a[i].id, a[i].name, &a[i].math, &a[i].chinese, &a[i].English);
}
}
// 对学生的成绩进行排排名
void sort(){
for(int i=0; i<4; i++){
for(int j=i; j<4; j++){
if((a[i].math+a[i].chinese+a[i].English) < (a[j].math+a[j].chinese+a[j].English)){
a[5].id=a[j].id; strcpy(a[5].name, a[j].name); a[5].math=a[j].math; a[5].chinese=a[j].chinese; a[5].English=a[j].English;
a[j].id=a[i].id; strcpy(a[j].name, a[i].name); a[j].math=a[i].math; a[j].chinese=a[i].chinese; a[j].English=a[i].English;
a[i].id=a[5].id; strcpy(a[i].name, a[5].name); a[i].math=a[5].math; a[i].chinese=a[5].chinese; a[i].English=a[5].English;
}
}
}
}
// 将程序进行输入并写入到文件中
int print(){
int rank; // 排名
FILE *fp; // 定义文件指针
fp = fopen("student.dat", "w"); // 将文件指针指向文件
// 判断磁盘中的文件是否存在
if(fp == NULL)
{
printf("磁盘中文件不存在!");
exit(0);
}
fprintf(fp, "学号: %d 姓名: %s 数学成绩: %d 语文成绩: %d 英语成绩: %d 总分: %d 名次: 1\n", a[0].id, a[0].name, a[0].math, a[0].chinese, a[0].English, a[0].math+a[0].chinese+a[0].English);
for(int i=1; i<4; i++){
rank=i+1;
if((a[i].math+a[i].chinese+a[i].English) == (a[i-1].math+a[i-1].chinese+a[i-1].English)){
rank=i;
}
fprintf(fp, "学号: %d 姓名: %s 数学成绩: %d 语文成绩: %d 英语成绩: %d 总分: %d 名次: %d\n", a[i].id, a[i].name, a[i].math, a[i].chinese, a[i].English, a[i].math+a[i].chinese+a[i].English, rank);
}
fclose(fp);
printf("\n\n");
printf("学号: %d 姓名: %s 数学成绩: %d 语文成绩: %d 英语成绩: %d 总分: %d 名次: 1\n", a[0].id, a[0].name, a[0].math, a[0].chinese, a[0].English, a[0].math+a[0].chinese+a[0].English);
for(int i=1; i<4; i++){
rank=i+1;
if((a[i].math+a[i].chinese+a[i].English) == (a[i-1].math+a[i-1].chinese+a[i-1].English)){
rank=i;
}
printf("学号: %d 姓名: %s 数学成绩: %d 语文成绩: %d 英语成绩: %d 总分: %d 名次: %d\n", a[i].id, a[i].name, a[i].math, a[i].chinese, a[i].English, a[i].math+a[i].chinese+a[i].English, rank);
}
}
int main(){
int i, j; // 两个for循环用到的i, j, 定义的排名变量rank
printf("请输入学生的相关信息:\n");
input(); // 信息输入
sort(); // 成绩排名
print(); // 将成绩信息打印到屏幕和文件
return 0;
}
测试数据:
100 张三 99 98 97
101 李四 89 88 87
102 王五 79 78 77
103 赵六 99 98 97
Result:
Get:
1、c语言的写入文件的方式(定义指针-> 指向文件 -> 判断文件存在 -> fprintf)
2、熟悉结构体定义以及调用的方式(scanf输入用地址,否则用实体)