【c语言】求出每位学生的三门课程的总分,然后按总分由高到低排序,并将排序结果按学号、姓名、数学成绩、语文成绩、英语成绩、总分和名次打印输出到屏幕和文件

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输入用地址,否则用实体)