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

好的,以下是一个简单的 C 语言程序,可以实现你的需求: ```c #include <stdio.h> #include <string.h> struct student { char id[20]; char name[20]; float score1; float score2; float score3; float total_score; }; int main() { struct student stu[10]; int i, max_index; float max_score = 0; // 输入学生信息 for (i = 0; i < 10; i++) { printf("请输入第%d个学生学号:", i+1); scanf("%s", stu[i].id); printf("请输入第%d个学生姓名:", i+1); scanf("%s", stu[i].name); printf("请输入第%d个学生的第一门课程成绩:", i+1); scanf("%f", &stu[i].score1); printf("请输入第%d个学生的第二门课程成绩:", i+1); scanf("%f", &stu[i].score2); printf("请输入第%d个学生的第三门课程成绩:", i+1); scanf("%f", &stu[i].score3); stu[i].total_score = stu[i].score1 + stu[i].score2 + stu[i].score3; } // 求总分最高的学生 for (i = 0; i < 10; i++) { if (stu[i].total_score > max_score) { max_score = stu[i].total_score; max_index = i; } } // 输最高分学生的信息 printf("总分最高的学生是:\n"); printf("学号:%s\n", stu[max_index].id); printf("姓名:%s\n", stu[max_index].name); printf("第一门课程成绩:%.2f\n", stu[max_index].score1); printf("第二门课程成绩:%.2f\n", stu[max_index].score2); printf("第三门课程成绩:%.2f\n", stu[max_index].score3); printf("总分:%.2f\n", stu[max_index].total_score); return 0; } ``` 程序中定义了一个结构体 `student`,用来存储每个学生的信息,包括学号姓名三门课程成绩总分。程序先循环输入十个学生的信息,然后再循环求出总分最高的学生,最后输学生的信息即可。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值