47.对文件中的结构体数组进行排序

该程序使用学生结构体,包含学号、姓名和三门课程成绩,将数据以二进制形式写入文件。通过fun函数实现从指定文件读取学生数据,按学号升序排序,然后将排序后的数据重新以二进制形式写回文件,覆盖原有内容。
摘要由CSDN通过智能技术生成

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩,所有学生数据均以二进制方式输出到文件中。函数fun的功能是从形参filename所指的文件中读取学生数据,并按照学号从小到大排序后,再用二进制方式白排序后的学生数据输出到filename所指的文件中覆盖原来的内容。


#include<stdio.h>
#define N 5
typedef struct student
{
	long  sno;
	char name[10];
	float score[3];

}STU;
void fun(char *filename)
{
	errno_t err;
	FILE * fp;
	int i, j;
	STU s[N], t;
	err = fopen_s(&fp,filename,"rb");
	fread(s, sizeof(STU), N, fp);
	fclose(fp);
	for (i = 0;i < N - 1;i++)
		for (j = i + 1;j < N;j++)
		if (s[i].sno>s[j].sno)
		{
			t = s[i];
			s[i] = s[j];
			s[j] = t;

		}
	err = fopen_s(&fp,filename, "wb");
	fwrite(s, sizeof(STU), N, fp);
	fclose(fp);

}

int main()
{
	errno_t err;
	STU t[N] = { {10005,"Zhangsan",95,80,88},{10003,"LiSi",85,70,78},{10002,"CaoKai",75,60,88},{10004,"FangFang",90,82,87},{10001,"MaCh
好的,以下是一个简单的C语言实现学生成绩信息管理系统的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STUDENT_NUM 100 // 最大学生数 #define MAX_NAME_LEN 20 // 姓名最大长度 // 学生信息结构体 typedef struct { char id[10]; // 学号 char name[MAX_NAME_LEN]; // 姓名 int chinese; // 语文成绩 int math; // 数学成绩 int english; // 英语成绩 int total; // 总分 } Student; // 学生信息数组 Student students[MAX_STUDENT_NUM]; int student_num = 0; // 学生数 // 函数声明 void add_student(); void sort_student_by_total(); void sort_student_by_name(); void delete_student(); void modify_student(); void save_students(); void load_students(); void print_students(); // 主函数 int main() { int choice; do { printf("请输入数字选择功能:\n"); printf("1. 学生信息录入\n"); printf("2. 按总分排序\n"); printf("3. 按姓名排序\n"); printf("4. 学生信息删除\n"); printf("5. 学生信息修改\n"); printf("6. 保存学生信息到文件\n"); printf("7. 从文件读取学生信息\n"); printf("8. 显示学生信息\n"); printf("0. 退出\n"); scanf("%d", &choice); switch (choice) { case 1: add_student(); break; case 2: sort_student_by_total(); break; case 3: sort_student_by_name(); break; case 4: delete_student(); break; case 5: modify_student(); break; case 6: save_students(); break; case 7: load_students(); break; case 8: print_students(); break; case 0: printf("退出程序\n"); break; default: printf("输入错误,请重新输入\n"); break; } } while (choice != 0); return 0; } // 添加学生信息 void add_student() { if (student_num >= MAX_STUDENT_NUM) { printf("学生数已满,不能再添加\n"); return; } Student s; printf("请输入学生信息:\n"); printf("学号:"); scanf("%s", s.id); printf("姓名:"); scanf("%s", s.name); printf("语文成绩:"); scanf("%d", &(s.chinese)); printf("数学成绩:"); scanf("%d", &(s.math)); printf("英语成绩:"); scanf("%d", &(s.english)); s.total = s.chinese + s.math + s.english; students[student_num] = s; student_num++; printf("添加成功!\n"); } // 按总分排序 void sort_student_by_total() { if (student_num <= 1) { printf("学生数不足,无法排序\n"); return; } // 冒泡排序 for (int i = 0; i < student_num - 1; i++) { for (int j = 0; j < student_num - i - 1; j++) { if (students[j].total < students[j + 1].total) { Student temp = students[j]; students[j] = students[j + 1]; students[j + 1] = temp; } } } printf("按总分排序成功!\n"); } // 按姓名排序 void sort_student_by_name() { if (student_num <= 1) { printf("学生数不足,无法排序\n"); return; } // 冒泡排序 for (int i = 0; i < student_num - 1; i++) { for (int j = 0; j < student_num - i - 1; j++) { if (strcmp(students[j].name, students[j + 1].name) > 0) { Student temp = students[j]; students[j] = students[j + 1]; students[j + 1] = temp; } } } printf("按姓名排序成功!\n"); } // 删除学生信息 void delete_student() { if (student_num <= 0) { printf("学生数为0,无法删除\n"); return; } char id[10]; printf("请输入要删除的学生学号:"); scanf("%s", id); int index = -1; for (int i = 0; i < student_num; i++) { if (strcmp(students[i].id, id) == 0) { index = i; break; } } if (index == -1) { printf("找不到要删除的学生\n"); } else { for (int i = index; i < student_num - 1; i++) { students[i] = students[i + 1]; } student_num--; printf("删除成功!\n"); } } // 修改学生信息 void modify_student() { if (student_num <= 0) { printf("学生数为0,无法修改\n"); return; } char id[10]; printf("请输入要修改的学生学号:"); scanf("%s", id); int index = -1; for (int i = 0; i < student_num; i++) { if (strcmp(students[i].id, id) == 0) { index = i; break; } } if (index == -1) { printf("找不到要修改的学生\n"); } else { printf("请输入修改后的学生信息:\n"); printf("学号:"); scanf("%s", students[index].id); printf("姓名:"); scanf("%s", students[index].name); printf("语文成绩:"); scanf("%d", &(students[index].chinese)); printf("数学成绩:"); scanf("%d", &(students[index].math)); printf("英语成绩:"); scanf("%d", &(students[index].english)); students[index].total = students[index].chinese + students[index].math + students[index].english; printf("修改成功!\n"); } } // 保存学生信息到文件 void save_students() { FILE *fp; fp = fopen("student.txt", "w"); if (fp == NULL) { printf("文件打开失败\n"); return; } fprintf(fp, "%d\n", student_num); for (int i = 0; i < student_num; i++) { fprintf(fp, "%s %s %d %d %d %d\n", students[i].id, students[i].name, students[i].chinese, students[i].math, students[i].english, students[i].total); } fclose(fp); printf("学生信息保存成功!\n"); } // 从文件读取学生信息 void load_students() { FILE *fp; fp = fopen("student.txt", "r"); if (fp == NULL) { printf("文件打开失败\n"); return; } fscanf(fp, "%d", &student_num); for (int i = 0; i < student_num; i++) { fscanf(fp, "%s %s %d %d %d %d", students[i].id, students[i].name, &(students[i].chinese), &(students[i].math), &(students[i].english), &(students[i].total)); } fclose(fp); printf("学生信息读取成功!\n"); } // 显示学生信息 void print_students() { if (student_num <= 0) { printf("学生数为0,无法显示\n"); } else { printf("学号\t姓名\t语文\t数学\t英语\t总分\n"); for (int i = 0; i < student_num; i++) { printf("%s\t%s\t%d\t%d\t%d\t%d\n", students[i].id, students[i].name, students[i].chinese, students[i].math, students[i].english, students[i].total); } } } ``` 这是一个简单的学生成绩信息管理系统,实现了学生信息的录入、排序、删除、修改、保存到文件、从文件读取和显示等功能。需要注意的是,这只是一个示例代码,还有很多可以优化和改进的地方。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值