C语言 学生成绩管理系统(基于文件读写操作及单向动态链表的创建,遍历和排序)

C语言 学生成绩管理系统(基于文件读写操作及单向动态链表的创建,遍历和排序)

本程序为作者的大一下学期的c语言期末作业,用编译器VS2019写成,如有问题和不足,欢迎大家指出共同探讨。
程序主要实现的功能有:学生信息的录入(动态链表创建),输出所有学生信息(链表遍历),输出排名(单向链表排序),以及一系列基于链表操作的查询,修改,添加学生成绩和求平均分,统计分数区域人数等功能。
程序流程图
总体思路:读取文件,创建单向动态链表储存文件中已有的学生成绩。通过对链表的操作,继续录入学生成绩,并且实现输出,修改等功能。在退出程序之前用"w+"模式新建文件重新写入链表中的学生成绩和信息来覆盖原文件。这种方法避免了对文件的直接操作,如在文件中查找删除或修改某个值,转为对链表节点的操作,相对而言更加简便。但这种方法不适用于大量数据的操作。

//函数声明和结构体
为方便修改,本程序中宏定义科目数N为4

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define N 4

//函数声明
void add_stu(int stu_num, struct student* head);//存储学生信息
void menu(struct student* p);//菜单
void list_initi(struct student* p);//链表初始化
void present_all(struct student* p);//展示全部学生成绩
void present_one(struct student* p);//输出某学生成绩
void score_analy(struct student* p);//分析学生成绩
void score_zone(struct student* p);//统计不同分数区域学生人数
struct student* search(struct student* head);//通过姓名或学号查找某个学生信息,返回指向该学生指针
void sort(struct student* head);//显示成绩排名
void revise(struct student* p);//选择修改或添加学生信息
void reinput(struct student* p);//修改信息
void upfile(struct student* p);//更新文件
void back_menu(struct student* p);//返回初始菜单
struct student
{
   
	long ID;
	char name[20];
	char sex[20];
	double score[N];
	struct student* next;
};

//主函数部分
创建头结点,调用list_initi()读取文件内容储存到链表中,调用menu()菜单供用户进行功能选择。当menu()函数执行完即用户选择退出后,选择是否更新文件,调用upfile()来新建文件覆盖原文件。

int main(void)
{
   
	char ch;
	struct student* head = (struct student*)malloc(sizeof(struct student));//头结点
	head->next = NULL;
	list_initi(head);
	menu(head);
	printf("是否更新文件?Y/N\n");
	getchar();
	scanf_s("%c", &ch, 1);
	if (ch == 'y' || ch == 'Y')
		upfile(head);
	return 0;
}

//读取文件,链表初始化
while (fgets(line, sizeof(line), fpRow))用于计算文件行数,防止读入空行产生无效节点。
while (!feof(fp) && j < row)循环,一边创建链表节点,一边将读出的值赋给节点

void list_initi(struct student* head)//链表初始化
{
   

	FILE* fpRow;
	fopen_s(&fpRow, "1班学生成绩信息.txt", "r+");
	char line[1024];
	int row = 0;	//行数
	while (fgets(line, sizeof(line), fpRow))
	{
   
		if (line[0] == '\n' || line[0] == '\r') // 判断空行
		{
   
			break; // 跳出
		}
		else
		{
   
			row++;
		}
	}
	fclose(fpRow);

	int j = 0;
	int i;
	FILE* fp;
	fopen_s(&fp, "1班学生成绩信息.txt", "r+");
	struct student* p = head;
	if (fgetc(fp) != EOF)
	{
   
		rewind(fp);
		while (!feof(fp) && j < row)
		{
   
			struct student* q = (struct student*)malloc(sizeof(struct student));//构建新节点存放下一个学生信息
			fscanf_s(fp, "%s", &q->name, 20);
			fscanf_s(fp, "%d", &q->ID);
			fscanf_s(fp, "%s", &q->sex, 20);
			for (i = 0; i < N; i++)
			{
   
				fscanf_s(fp, "%lf", &q->score[i]);
			}
			p->next = q;//原p指向新节点
			q->next = NULL;
			p = q;//q代替原p成为链表尾部
			j++;
		}

	}
	fclose(fp);
}

//调用主菜单
用switch跳转到对应功能模块

void menu(struct student* head)//主菜单
{
   
	struct student* temp = NULL;
	system("cls");
	int cho, stu_num = 0;

	printf("-------------------------------------------------------------\n");
	printf("\t\t1.录入学生信息\n\n");
	printf("\t\t2.显示全部学生各科成绩\n\n");
	printf("\t\t3.各科成绩统计分析\n\n")</
  • 23
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
C语言学生成绩管理系统(以包含文件的形式写的),结构体,链表,数组,以下是main.c #include #include #include #define m 3/*宏定义m的值为3*/ struct node/*链表初始化*/ { char name[20]; int no; float score[m]; float sum; float avg; struct node *next; }; char ch[m+4][20]={{"学号"},{"姓名"},{"语文"},{"数学"},{"英语"},{"总分"},{"平均分"}};/*定义并初始化一个全局二维字符数组*/ #include "save.c"/*包含保存文件*/ #include "read.c"/*包含读取文件*/ #include "output.c"/*包含打印文件*/ #include "set.c"/*包含录入文件*/ #include "demand.c"/*包含查询文件*/ #include "sort.c"/*包含排序文件*/ #include "modified.c"/*包含修改文件*/ #include "add.c"/*包含添加文件*/ #include "del.c"/*包含删除文件*/ void main() { int n; printf("\n\t\t\t欢迎使用学生成绩管理系统\n\n"); printf("\t\t\t\t\t\t制 作: XIA XIA\n"); do { printf("\n\n1:学生成绩录入,并保存\n"); printf("2:学生成绩查询\n"); printf("3:学生成绩排序\n"); printf("4:学生成绩的修改\n"); printf("5:学生成绩的打印\n"); printf("6:学生信息的添加\n"); printf("7:学生信息的删除\n"); printf("0:退出学生成绩管理系统\n\n\n"); printf("输入你要执行操作的相应序号\n"); scanf("%d",&n);/*输入相就的操作的序号*/ switch (n) { case 1: set();break;/*调用录入函数*/ case 2: demand();break;/*调用查询函数*/ case 3: sort();break;/*调用排序函数*/ case 4: modified();break;/*调用修改函数*/ case 5: output();break;/*调用打印函数*/ case 6: add();break;/*调用添加函数*/ case 7: del();break;/*调用删除函数*/ case 0: printf("正在退出学生成绩管理系统......\n");exit(0);/*直到输入“0”退出学生成绩管理系统*/ default:printf("输入错误码,请重新输入\n"); } }while(1); }
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值