C语言课题设计----学生学籍信息管理系统(附打包下载)

目录

写在前面

程序设计要求

概要设计

主菜单模块

​编辑 

录入/增加信息模块

查找信息模块

删除基本信息模块

 删除学生成绩模块

 展示学生信息模块

展示学生成绩模块

 学生信息排序模块

源码

 实验报告源码流程图下载链接


写在前面

本文为本人大一程序设计课选题代码,文章开头末尾附带源码和实验报告及流程图下载,欢迎关注评论留言。

链接:https://pan.baidu.com/s/1CyxfN4hxRw6KDftwmeXO8w?pwd=1234 
提取码:1234

程序设计要求

1、需求分析

学生基本信息、学生成绩基本信息要存入文件当中,因而要提供文件的输入输出操作;查询功能要求提供查找和显示操作;删除功能要求实现删除操作;排序功能要求实现排序操作;另外还应该提供键盘式选择菜单以实现功能选择。

2、总体设计

整个系统可以设计为数据录入模块、数据查询模块、数据删除模块和数据排序模块。

3、详细设计

(1)数据录入模块

学生基本信息文件可以在磁盘建立,采用写文件方式录入学生成绩基本信息。综合成绩和实得学分通过计算得到。

(2)查询模块

通过菜单选择查询功能,再选择学生基本情况查询和成绩查询

若选择前者,再通过菜单选择学号、姓名或宿舍号码,按照基本查找算法查找A.TXT,然后把查找结果输出

若选择后者,则先在A.TXT中查找学号对应的姓名,再在B.TXT中查找该学生的课程情况,并统计科目和实得总学分,输出结果。(fread和查找算法的应用)

(3)删除模块

通过菜单选择删除学生的功能,输入要删除学生的学号,则分别在A.TXT和B.TXT中查找该生信息,删除之;或者输入学生的姓名,先在A.TXT中得到该生的学号,删除该生信息,再在B.TXT中删除该学号对应的信息。注意:C语言中没有直接删除信息的函数,需要自己实现,可以采取读出数据,判断数据(如果不删除,则进入缓冲区,否则删除),写入数据(把缓冲区中的数据写入文件)的步骤进行。

(4)排序模块

通过菜单选择排序依据,采用排序算法(冒泡、插入、选择等)对数据进行排序并输出结果。首先要读文件(fread)。

struct 
{
  char  stuNo[15];     //学号
  char  name[20];   //姓名
  char  sex[3];     //性别
  char  domNum[10];   //宿舍号 
  char  tel[12];        //电话号码 
}StuInfo[N];   //学生基本信息结构体

struct
{
  char  stuNo[15];     //学号
  char  courseNo[10];  //课程编号
  char  courseName[20];  //课程名称
  int  creditHour;  //学分
int  triGrade;  //平时成绩
int  experiGrade;  //实验成绩
int  examGrade;  //卷面成绩
float  totalGrade;  //综合成绩
float  finalCreHour;  //实得学分
}StuGraInfo[N];   //学生成绩基本信息结构体

以上为题目要求,下面是具体代码实现,分为各个模块实现,最后附有全部代码。

概要设计

C语言课题设计----学生学籍信息管理系统(附打包下载)_第1张图片

主菜单模块

C语言课题设计----学生学籍信息管理系统(附打包下载)_第2张图片

enum option
{    exit,             //退出
	add,             //增加
	search,           //搜索
	delInfo,          //删除基本信息
	delGrade,        //删除成绩信息
	showinfor,       //展示基本信息
	showgrade,      //展示成绩信息
	order,           //排序
};

int main()
{
	int input =1;
	menu();
	do 
	{
		printf("请选择:-->");
		scanf("%d", &input);
		switch (input)  //初始界面进行选择
		{
		case add:
			Add();break;
		case search:
			Search();break;
		case delInfo:
			DelInfo();break;
		case delGrade:
			DelGrade();break;
		case showinfor:
			showInfor();break;
		case showgrade:
			showGrade();break;
		case order:
			Order();break;
		case exit:break;
		default:printf("输入格式错误");
		}
	} while (input);
	return 0;
}

录入/增加信息模块

首先创建或打开文件,若失败则返回错误提示信息,再提示用户输入Y/N进行是否输入用户基本信息和用户成绩信息,如此做可使得用户自主选择输入所需的信息进行存储,每次结束输入时再提示用户是否继续输入,可提供多次输入。 

C语言课题设计----学生学籍信息管理系统(附打包下载)_第3张图片

void Add()
{
	int i, m = 0,n=0;
	char ch[2]={'\0'};
	printf("进行学生基本信息录入:\n");
	FILE* fp1;
	FILE* fp2;
	if ((fp1 = fopen("A.txt", "wb")) == NULL)
	{
		printf("无法打开学生基本信息\n");
	}
	for (i = 0; i < m; i++)
	{
		fwrite(&stu[i], LEN, 1, fp1);
	}
	printf("请进行选择-->(y/n):");
	scanf("%s", ch);
	while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
	{
		printf("学号:"); 
		scanf("%s", &stu[m].stuNo);
		printf("姓名:");
		scanf("%s", stu[m].name);
		printf("性别:");
		scanf("%s", &stu[m].sex);
		printf("宿舍号:");
		scanf("%s", &stu[m].domNum);
		printf("电话号码:"); 
		scanf("%s", &stu[m].tel);
		if (fwrite(&stu[m], LEN, 1, fp1) != 1)
		{
			printf("无法保存!"); 
		}
		else 
		{ 
			printf("%s 保存成功!\n", stu[m].name); 
			m++; 
		}
		printf("是否继续存储?(y/n):");
		scanf("%s", ch);
	}
	fclose(fp1);
	printf("进行学生成绩基本信息录入:\n");
	if ((fp2 = fopen("B.txt", "wb")) == NULL)
	{
		printf("无法打开学生成绩基本信息\n");
	}
	for (i = 0; i < n; i++)
	{
		fwrite(&stu2[i], LEN2, 1, fp2);
	}
	printf("是否进行信息录入(y/n):");
	scanf("%s", ch);
	while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
	{
		printf("学号:");
		scanf("%s", &stu2[n].stuNo);
		printf("课程编号:");
		scanf("%s", stu2[n].courseNo);
		printf("课程名称:");
		scanf("%s", &stu2[n].courseName);
		printf("学分:");
		scanf("%d", &stu2[n].creditHour);
		printf("平时成绩:");
		scanf("%d", &stu2[n].triGrade);
		printf("实验成绩:");
		scanf("%d", &stu2[n].experiGrade);
		printf("卷面成绩:");
		scanf("%d", &stu2[n].examGrade);
		printf("综合成绩:");
		scanf("%f", &stu2[n].totalGrade);
		printf("实得学分:");
		scanf("%f", &stu2[n].finalCreHour);
		if (fwrite(&stu2[n], LEN2, 1, fp2) != 1)
		{
			printf("保存失败!");
		}
		else
		{
			printf("%s 成绩保存成功!\n", stu[n].name);
			n++;
		}
		printf("是否继续录入?(y/n):");
		scanf("%s", ch);
	}
	fclose(fp2);
	printf("录入完毕!\n");
}

查找信息模块

实现查找模块代码首先要确认查找哪部分信息,其次要确认查找的依据是什么,则首先打开对应的文件,首先判断是否有信息和打开情况,无误后进行查找,再将查找的结果显示到显示屏上,提示用户找到与否和是否输出,即可完成该模块的代码实现。 

 C语言课题设计----学生学籍信息管理系统(附打包下载)_第4张图片

void Search()
{
	char str[20] = { '\0' };
	int num = 0;
	printf("1.学生信息查询      2.学生成绩查询");
	printf("请选择你的查询方式:-->");
	scanf("%d",&num);
	FILE* fp;
	int snum, i, m = 0;
	char ch[2];
	if ((fp = fopen("A.txt", "rb")) == NULL)
	{
		printf("无法打开\n"); 
		return;
	}
	while (!feof(fp))  
		if (fread(&stu[m], LEN, 1, fp) == 1)
			m++;
	fclose(fp);
	if (m == 0) 
	{
		printf("无信息记录!\n"); 
		return; 
	}
	if (num == 1)
	{
		int op = 0;
		printf("1.学号  2.姓名  3.宿舍号码");
		printf("请选择你的查询方式-->");
		scanf("%d", &op);
		switch (op)
		{
		case 1:
			printf("请输入要查找的学号:");
			scanf("%s", &str);
			for (i = 0; i < m; i++)
				if (strcmp(stu[i].stuNo, str) == 0)
				{
					printf("找到了,是否显示?(y/n)");
					scanf("%s", ch);
					if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
					{
						printf("%-8s%-8s%-8s%-8s%-8s%\n",
							stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
						break;
					}
				}
			if (i == m)
				printf("未找到该学生信息!\n");
			break;

		case 2:
			printf("请输入要查找的姓名:");
			scanf("%s", &str);
			for (i = 0; i < m; i++)
				if (strcmp(stu[i].name, str) == 0)
				{
					printf("找到了,是否显示?(y/n)");
					scanf("%s", ch);
					if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
					{
						printf("%-8s%-8s%-8s%-8s%-8s%\n",
							stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
						break;
					}
				}
			if (i == m)
				printf("未找到该学生信息!\n");
			break;

		case 3:
			printf("请输入要查找的宿舍号:");
			scanf("%s", &str);
			for (i = 0; i < m; i++)
				if (strcmp(stu[i].domNum, str) == 0)
				{
					printf("找到了,是否显示?(y/n)");
					scanf("%s", ch);
					if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
					{
						printf("%-8s%-8s%-8s%-8s%-8s%\n",
							stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
						break;
					}
				}
			if (i == m)
				printf("未找到该学生信息!\n");
			break;
		}
	}
	else if (num == 2)
	{
		char stunum[20];
		printf("请输入要查找的学号:");
		scanf("%s", &str);
		for (i = 0; i < m; i++)
			if (strcmp(stu[i].stuNo, str) == 0)
			{
				strcpy(stunum, stu[i].stuNo);
			}
		if (i == m)
			printf("未找到该学生信息!\n");
		FILE* fp2;
		int snum2, i2, m2 = 0;
		char ch2[2];
		if ((fp2 = fopen("B.txt", "rb")) == NULL)
		{
			printf("无法打开\n"); return;
		}
		while (!feof(fp))  
			if (fread(&stu2[m2], LEN2, 1, fp2) == 1) 
				m2++;
		fclose(fp);
		if (m2 == 0) 
		{
			printf("无信息记录!\n");
			return; 
		}
		for (i = 0; i < m; i++)
			if (strcmp(stunum,stu2[i].stuNo)==0)
			{
				printf("找到了,是否显示?(y/n)");
				scanf("%s", ch);
				if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
				{
					printf("课程名称\t实得学分\t\n");
					printf("%-8s-8f%",stu2[i].courseName, stu2[i].finalCreHour);
					break;
				}
			}
		if (i == m) 
			printf("无法找到该学生!\n");
	}
	else
		printf("输入格式错误,请重新输入\n");
}

删除基本信息模块

基本思路为让用户输入一个学号,再到信息库中寻找,找到了把它删除,找不到反馈用户,则首先要打开文件,然后提示用户输出一个学号,再将学号与信息库中的所有项目进行比较,如果找到了询问用户是否删除,删除后提示用户删除成功,若失败则反馈失败原因。 

 C语言课题设计----学生学籍信息管理系统(附打包下载)_第5张图片

void DelInfo()
{
	FILE* fp1;
	FILE* fp2;
	char snum[20];
	int i, j, m = 0;
	char ch[2];

	if ((fp1 = fopen("A.txt", "r+")) == NULL)
	{
		printf("无法打开\n"); 
		return;
	}
	while (!feof(fp1))  
		if (fread(&stu[m], LEN, 1, fp1) == 1)
			m++;
	fclose(fp1);
	if (m == 0)
	{
		printf("无内容,请先添加!\n");
		return;
	}
	printf("请输入要删除的学号:");
	scanf("%s", &snum);
	for (i = 0; i < m; i++)
		if (strcmp(snum,stu[i].stuNo)==0)
			break;
	printf("找到了,是否删除?(y/n)");
	scanf("%s", ch);
	if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
		for (j = i; j < m; j++)
			stu[j] = stu[j + 1];
	m--;
	if ((fp1 = fopen("A.txt", "wb")) == NULL)
	{
		printf("无法打开文件\n"); 
		return;
	}
	for (j = 0; j < m; j++)
		if (fwrite(&stu[j], LEN, 1, fp1) != 1)
			printf("无法存储!\n");
	fclose(fp1);
	printf("删除成功!\n");
}

 删除学生成绩模块

基本思路为让用户输入一个学号,再到信息库中寻找,找到了把它删除,找不到反馈用户,则首先要打开文件,然后提示用户输出一个学号,再将学号与信息库中的所有项目进行比较,如果找到了询问用户是否删除,删除后提示用户删除成功,若失败则反馈失败原因。

C语言课题设计----学生学籍信息管理系统(附打包下载)_第6张图片

void DelGrade()  //删除成绩信息 和学生信息模块相似
{
	FILE* fp2;
	int i, j, n = 0;
	char snum[20];
	char ch[2];
	if ((fp2 = fopen("B.txt", "r+")) == NULL)
	{
		printf("无法打开\n"); 
		return;
	}
	while (!feof(fp2))  
		if (fread(&stu2[n], LEN2, 1, fp2) == 1) 
			n++;
	fclose(fp2);
	if (n == 0)
	{
		printf("找不到记录!\n");
		return;
	}
	printf("请输入要删除的学号:");
	scanf("%s", snum);
	for (i = 0; i < n; i++)
		if (strcmp(snum,stu2[i].stuNo)==0)
			break;
	printf("找到了,是否删除?(y/n)");
	scanf("%s", ch);
	if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
		for (j = i; j < n; j++)
			stu[j] = stu[j + 1];
	n--;
	if ((fp2 = fopen("data.txt", "wb")) == NULL)
	{
		printf("无法打开文件\n"); 
		return;
	}
	for (j = 0; j < n; j++)
		if (fwrite(&stu2[j], LEN2, 1, fp2) != 1)
		{
			printf("无法存储!\n");
		}
	fclose(fp2);
	printf("删除成功!\n");
}

 展示学生信息模块

只需要利用一个循环结构将文件中的数据都读取出来然后输出即可,则只需要先读取文件然后按格式输出信息即可。

C语言课题设计----学生学籍信息管理系统(附打包下载)_第7张图片

void showInfor()
{
	FILE* fp1;
	int i, m = 0;
	fp1 = fopen("A.txt", "rb");
	while (!feof(fp1))
	{
		if (fread(&stu[m], LEN, 1, fp1) == 1) m++;
	}
	fclose(fp1);
	printf("学号\t姓名\t性别\t宿舍号\t电话号\t\n");
	for (i = 0; i < m; i++)
	{
		printf("%-8s%-8s%-8s%-8s%-8s\n",
			stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].domNum,stu[i].tel);
	}
}

展示学生成绩模块

只需要利用一个循环结构将文件中的数据都读取出来然后输出即可,则只需要先读取文件然后按格式输出信息即可。 

 C语言课题设计----学生学籍信息管理系统(附打包下载)_第8张图片

void showGrade()
{
	FILE* fp2;
	int i, m = 0;
	fp2 = fopen("B.txt", "rb");
	while (!feof(fp2))
	{
		if (fread(&stu2[m], LEN2, 1, fp2) == 1)
			m++;
	}
	fclose(fp2);
	printf("学号\t课程编号\t课程名称\t学分\t平时成绩\t实验成绩\t卷面成绩\t综合成绩\t实得学分\t\n");
	for (i = 0; i < m; i++)
	{
		printf("%-8s%-8s%-8s%-8d%-8d%-8d%-8d%-8f%-8f\n",
			stu2[i].stuNo,stu2[i].courseNo,stu2[i].courseName,stu2[i].creditHour,
		stu2[i].triGrade,stu2[i].experiGrade,stu2[i].examGrade,stu2[i].totalGrade,stu2[i].finalCreHour);
	}
}

 学生信息排序模块

首先进行选择,选择需要的排序方式,接着读取文件中的信息,引入一个冒泡排序进行排序,最后提示用户排序完成,用户可选择展示功能查看排序完成后的结果。

 C语言课题设计----学生学籍信息管理系统(附打包下载)_第9张图片

void Order()
{
	int option = 0;
	printf("1.平时成绩         2.实验成绩\n");
	printf("3.卷面成绩         4.综合成绩\n");
	printf("请选择排序依据:-->");
	scanf("%d", &option);
	FILE* fp2;
	struct stu_grade t;
	int i = 0, j = 0, m = 0;
	if ((fp2 = fopen("B.txt", "r+")) == NULL)
	{
		printf("无法打开!\n");
		return;
	}
	while (!feof(fp2))
		if (fread(&stu2[m], LEN2, 1, fp2) == 1)
			m++;
	fclose(fp2);
	if (m == 0)
	{
		printf("无输入记录!\n");
		return;
	}
	if ((fp2 = fopen("B.txt", "wb")) == NULL)
	{
		printf("无法打开\n");
		return;
	}
	switch (option)
	{
	case 1:
		for (i = 0; i < m - 1; i++)
			for (j = i + 1; j < m; j++)
				if (stu2[j].triGrade > stu2[j+1].triGrade)
				{
					t = stu2[i];
					stu2[i] = stu2[j];
					stu2[j] = t;
				}
		break;
	case 2:
		for (i = 0; i < m - 1; i++)
			for (j = i + 1; j < m; j++)
				if (stu2[i].experiGrade <= stu2[j].experiGrade)
				{
					t = stu2[i]; 
					stu2[i] = stu2[j]; 
					stu2[j] = t;
				}
		break;
	case 3:
		for (i = 0; i < m - 1; i++)
			for (j = i + 1; j < m; j++)
				if (stu2[i].examGrade<= stu2[j].examGrade)
				{
					t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t;
				}
		break;
	case 4:
		for (i = 0; i < m - 1; i++)
			for (j = i + 1; j < m; j++)
				if (stu2[i].totalGrade <= stu2[j].totalGrade)
				{
					t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t;
				}
		break;
	default:
		printf("输入格式错误,请重新输入");
	}
	if ((fp2 = fopen("B.txt", "wb")) == NULL)
	{
		printf("无法打开\n");
		return;
	}
	for (i = 0; i < m; i++)
		if (fwrite(&stu2[i], LEN2, 1, fp2) != 1)
		{
			printf("%s 无法存储!\n");
		}
	fclose(fp2);
	printf("存储成功\n");
}

源码

#define _CRT_SECURE_NO_WARNINGS

#include   //输入输出必须头文件
#include   //用于计算分配内存的头文件 strlen函数

struct stu_info 
{
	char  stuNo[15];     //学号
	char  name[20];   //姓名
	char  sex[3];     //性别
	char  domNum[10];   //宿舍号 
	char  tel[12];        //电话号码 
};   //学生基本信息结构体

struct stu_grade 
{
	char  stuNo[15];     //学号
	char  courseNo[10];  //课程编号
	char  courseName[20];  //课程名称
	int  creditHour;  //学分
	int  triGrade;  //平时成绩
	int  experiGrade;  //实验成绩
	int  examGrade;  //卷面成绩
	float  totalGrade;  //综合成绩
	float  finalCreHour;  //实得学分
};   //学生成绩基本信息结构体

struct stu_info stu[80];
int LEN = sizeof(struct stu_info);

struct stu_grade stu2[80];
int LEN2 = sizeof(struct stu_grade);

void menu() //主菜单函数
{
	printf("***********************************************\n");
	printf("*** 1.录入学生信息          2.搜索学生信息  ***\n");
	printf("*** 3.删除基本信息          4.删除成绩信息  ***\n");
	printf("****5.展示基本信息          6.展示成绩信息  ***\n");
	printf("****7.学生信息排序          0.退出管理系统  ***\n");
	printf("***********************************************\n"); //打印菜单的模式图
}

void showInfor() //展示学生信息模块
{
	FILE* fp1;
	int i, m = 0;
	fp1 = fopen("A.txt", "rb");  //打开已经创建好的存储学生信息的文件
	while (!feof(fp1))
	{
		if (fread(&stu[m], LEN, 1, fp1) == 1)  //读取文件函数信息
			m++;
	}
	fclose(fp1);
	printf("学号\t姓名\t性别\t宿舍号\t电话号\t\n");
	for (i = 0; i < m; i++)
	{
		printf("%-8s%-8s%-8s%-8s%-8s\n",   //循环结构打印学生信息
			stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].domNum,stu[i].tel);
	}
}

void showGrade()   //展示学生成绩信息
{
	FILE* fp2;
	int i, m = 0;
	fp2 = fopen("B.txt", "rb");  //打开已经存储好的成绩文件
	while (!feof(fp2))
	{
		if (fread(&stu2[m], LEN2, 1, fp2) == 1)   //读取文件
			m++;  //m为存储信息的条数
	}
	fclose(fp2);  //关闭文件
	printf("学号\t课程编号\t课程名称\t学分\t平时成绩\t实验成绩\t卷面成绩\t综合成绩\t实得学分\t\n");
	for (i = 0; i < m; i++)
	{
		printf("%-8s%-16s%-16s%-8d%-16d%-16d%-16d%-16.2f%-16.2f\n", //循环打印成绩信息
			stu2[i].stuNo,stu2[i].courseNo,stu2[i].courseName,stu2[i].creditHour,
		stu2[i].triGrade,stu2[i].experiGrade,stu2[i].examGrade,stu2[i].totalGrade,stu2[i].finalCreHour);
	}
}

void Add()  //增加学生信息的模块
{
	int i, m = 0,n=0;
	char ch[2]={'\0'};
	printf("进行学生基本信息录入:\n");
	FILE* fp1; //学生成绩和学生信息两个模块
	FILE* fp2;
	if ((fp1 = fopen("A.txt", "wb")) == NULL)  //如果打不开则返回错误
	{
		printf("无法打开学生基本信息\n");
	}
	for (i = 0; i < m; i++)
	{
		fwrite(&stu[i], LEN, 1, fp1);  //写入学生信息 LEN为大小
	}
	printf("请进行选择-->(y/n):");
	scanf("%s", ch);  //给用户一定的选择权
	while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)  //防止出现大小写问题
	{
		printf("学号:");   //依次提示用户输入相关的信息
		scanf("%s", &stu[m].stuNo);
		printf("姓名:");
		scanf("%s", stu[m].name);
		printf("性别:");
		scanf("%s", &stu[m].sex);
		printf("宿舍号:");
		scanf("%s", &stu[m].domNum);
		printf("电话号码:"); 
		scanf("%s", &stu[m].tel);
		if (fwrite(&stu[m], LEN, 1, fp1) != 1)
		{
			printf("无法保存!"); 
		}
		else 
		{ 
			printf("%s 保存成功!\n", stu[m].name); 
			m++; 
		}
		printf("是否继续存储?(y/n):");  //给予用户选择的权力
		scanf("%s", ch);
	}
	fclose(fp1);
	printf("进行学生成绩基本信息录入:\n");
	if ((fp2 = fopen("B.txt", "wb")) == NULL)  //打开文件失败返回错误信息
	{
		printf("无法打开学生成绩基本信息\n");
	}
	for (i = 0; i < n; i++)
	{
		fwrite(&stu2[i], LEN2, 1, fp2);  //写入一个LEN2的大小文件
	}
	printf("是否进行信息录入(y/n):");
	scanf("%s", ch);
	while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
	{
		printf("学号:");  //依次写入用户信息 存储
		scanf("%s", &stu2[n].stuNo);
		printf("课程编号:");
		scanf("%s", stu2[n].courseNo);
		printf("课程名称:");
		scanf("%s", &stu2[n].courseName);
		printf("学分:");
		scanf("%d", &stu2[n].creditHour);
		printf("平时成绩:");
		scanf("%d", &stu2[n].triGrade);
		printf("实验成绩:");
		scanf("%d", &stu2[n].experiGrade);
		printf("卷面成绩:");
		scanf("%d", &stu2[n].examGrade);
		printf("综合成绩:");
		scanf("%f", &stu2[n].totalGrade);
		printf("实得学分:");
		scanf("%f", &stu2[n].finalCreHour);
		if (fwrite(&stu2[n], LEN2, 1, fp2) != 1)  //用户信息存储失败返回错误
		{
			printf("保存失败!");
		}
		else
		{
			printf("%s 成绩保存成功!\n", stu[n].name);
			n++;
		}
		printf("是否继续录入?(y/n):");
		scanf("%s", ch);
	}
	fclose(fp2);

	printf("录入完毕!\n");
}

void DelInfo()   //删除学生信息模块
{
	FILE* fp1;
	FILE* fp2;
	char snum[20];
	int i, j, m = 0;
	char ch[2];

	if ((fp1 = fopen("A.txt", "r+")) == NULL)  //打开失败返回错误信息
	{
		printf("无法打开\n"); 
		return;
	}
	while (!feof(fp1))  
		if (fread(&stu[m], LEN, 1, fp1) == 1)  //读取学生文件错误信息
			m++;
	fclose(fp1);
	if (m == 0)
	{
		printf("无内容,请先添加!\n");  //没有信息则返回错误信息
		return;
	}
	printf("请输入要删除的学号:");  //提示用户输入要删除的字符串
	scanf("%s", &snum);
	for (i = 0; i < m; i++)
		if (strcmp(snum,stu[i].stuNo)==0)
			break;
	printf("找到了,是否删除?(y/n)");
	scanf("%s", ch);
	if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
		for (j = i; j < m; j++)
			stu[j] = stu[j + 1];
	m--;
	if ((fp1 = fopen("A.txt", "wb")) == NULL)  //在对应文件中找寻信息
	{
		printf("无法打开文件\n"); 
		return;
	}
	for (j = 0; j < m; j++)
		if (fwrite(&stu[j], LEN, 1, fp1) != 1)
		{
			printf("无法存储!\n");
		}
	fclose(fp1);
	printf("删除成功!\n"); //提示删除成功
}

void DelGrade()  //删除成绩信息 和学生信息模块相似
{
	FILE* fp2;
	int i, j, n = 0;
	char snum[20];
	char ch[2];
	if ((fp2 = fopen("B.txt", "r+")) == NULL)
	{
		printf("无法打开\n"); 
		return;
	}
	while (!feof(fp2))  
		if (fread(&stu2[n], LEN2, 1, fp2) == 1) 
			n++;
	fclose(fp2);
	if (n == 0)
	{
		printf("找不到记录!\n");
		return;
	}
	printf("请输入要删除的学号:");
	scanf("%s", snum);
	for (i = 0; i < n; i++)
		if (strcmp(snum,stu2[i].stuNo)==0)
			break;
	printf("找到了,是否删除?(y/n)");
	scanf("%s", ch);
	if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
		for (j = i; j < n; j++)
			stu[j] = stu[j + 1];
	n--;
	if ((fp2 = fopen("data.txt", "wb")) == NULL)
	{
		printf("无法打开文件\n"); 
		return;
	}
	for (j = 0; j < n; j++)
		if (fwrite(&stu2[j], LEN2, 1, fp2) != 1)
		{
			printf("无法存储!\n");
		}
	fclose(fp2);
	printf("删除成功!\n");
}

void Order()  //学生排序模块信息
{
	int option = 0;
	printf("1.平时成绩         2.实验成绩\n");
	printf("3.卷面成绩         4.综合成绩\n");
	printf("请选择排序依据:-->");
	scanf("%d", &option);  //选择进入循环选择
	FILE* fp2;
	struct stu_grade t;
	int i = 0, j = 0, m = 0;
	if ((fp2 = fopen("B.txt", "r+")) == NULL)  
	{
		printf("无法打开!\n");  //错误则返回错误信息
		return;
	}
	while (!feof(fp2))
		if (fread(&stu2[m], LEN2, 1, fp2) == 1)
			m++;
	fclose(fp2);
	if (m == 0)
	{
		printf("无输入记录!\n");
		return;
	}
	if ((fp2 = fopen("B.txt", "wb")) == NULL)
	{
		printf("无法打开\n");
		return;
	}
	switch (option)  //选择对应的根据进行冒泡排序
	{
	case 1:
		for (i = 0; i < m - 1; i++)  //经典的冒泡排序结构进行排序
			for (j = i + 1; j < m; j++)
				if (stu2[j].triGrade > stu2[j+1].triGrade)
				{
					t = stu2[i];
					stu2[i] = stu2[j];
					stu2[j] = t;
				}
		break;  //结束则跳出循环
	case 2:
		for (i = 0; i < m - 1; i++)
			for (j = i + 1; j < m; j++)
				if (stu2[i].experiGrade <= stu2[j].experiGrade)
				{
					t = stu2[i]; 
					stu2[i] = stu2[j]; 
					stu2[j] = t;
				}
		break;
	case 3:
		for (i = 0; i < m - 1; i++)
			for (j = i + 1; j < m; j++)
				if (stu2[i].examGrade<= stu2[j].examGrade)
				{
					t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t;
				}
		break;
	case 4:
		for (i = 0; i < m - 1; i++)
			for (j = i + 1; j < m; j++)
				if (stu2[i].totalGrade <= stu2[j].totalGrade)
				{
					t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t;
				}
		break;
	default:
		printf("输入格式错误,请重新输入");
	}
	if ((fp2 = fopen("B.txt", "wb")) == NULL)
	{
		printf("无法打开\n");
		return;
	}
	for (i = 0; i < m; i++)
		if (fwrite(&stu2[i], LEN2, 1, fp2) != 1)
		{
			printf("%s 无法存储!\n");  //存储失败返回错误信息
		}
	fclose(fp2);
	printf("存储成功\n");
}

void Search()  //查找功能模块
{
	char str[20] = { '\0' };
	int num = 0;
	printf("1.学生信息查询      2.学生成绩查询\n");
	printf("请选择你的查询方式:-->");
	scanf("%d",&num);
	FILE* fp;
	int  i, m = 0;
	char ch[2];
	if ((fp = fopen("A.txt", "rb")) == NULL)
	{
		printf("无法打开\n"); 
		return;
	}
	while (!feof(fp))  
		if (fread(&stu[m], LEN, 1, fp) == 1)  //读取文件信息
			m++;
	fclose(fp);
	if (m == 0) 
	{
		printf("无信息记录!\n"); 
		return; 
	}
	if (num == 1)
	{
		int op = 0;
		printf("1.学号  2.姓名  3.宿舍号码\n");
		printf("请选择你的查询方式-->");
		scanf("%d", &op);
		switch (op)
		{
		case 1:
			printf("请输入要查找的学号:");
			scanf("%s", &str);
			for (i = 0; i < m; i++)
				if (strcmp(stu[i].stuNo, str) == 0)
				{
					printf("找到了,是否显示?(y/n)");
					scanf("%s", ch);
					if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
					{
						printf("学号\t姓名\t性别\t宿舍号\t电话号\t\n");
						printf("%-8s%-8s%-8s%-8s%-8s%\n",
							stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
						break;
					}
				}
			if (i == m)
				printf("未找到该学生信息!\n");
			break;

		case 2:
			printf("请输入要查找的姓名:");
			scanf("%s", &str);
			for (i = 0; i < m; i++)
				if (strcmp(stu[i].name, str) == 0)
				{
					printf("找到了,是否显示?(y/n)");
					scanf("%s", ch);
					if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
					{
						printf("学号\t课程编号\t课程名称\t学分\t平时成绩\t实验成绩\t卷面成绩\t综合成绩\t实得学分\t\n");
						printf("%-8s%-8s%-8s%-8s%-8s%\n",
							stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
						break;
					}
				}
			if (i == m)
				printf("未找到该学生信息!\n");
			break;

		case 3:
			printf("请输入要查找的宿舍号:");
			scanf("%s", &str);
			for (i = 0; i < m; i++)
				if (strcmp(stu[i].domNum, str) == 0)
				{
					printf("找到了,是否显示?(y/n)");
					scanf("%s", ch);
					if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
					{
						printf("%-8s%-8s%-8s%-8s%-8s%\n",
							stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel);
						break;
					}
				}
			if (i == m)
				printf("未找到该学生信息!\n");
			break;
		}
	}
	else if (num == 2)
	{
		char stunum[20];
		printf("请输入要查找的学号:");
		scanf("%s", &str);
		for (i = 0; i < m; i++)
			if (strcmp(stu[i].stuNo, str) == 0)
			{
				strcpy(stunum, stu[i].stuNo);
			}
		if (i == m)
			printf("未找到该学生信息!\n");
		FILE* fp2;
		int m2 = 0;
		if ((fp2 = fopen("B.txt", "rb")) == NULL)
		{
			printf("无法打开\n"); 
			return;
		}
		while (!feof(fp))  
			if (fread(&stu2[m2], LEN2, 1, fp2) == 1) 
				m2++;
		fclose(fp);
		if (m2 == 0) 
		{
			printf("无信息记录!\n");
			return; 
		}
		for (i = 0; i < m; i++)
			if (strcmp(stunum,stu2[i].stuNo)==0)
			{
				printf("找到了,是否显示?(y/n)");
				scanf("%s", ch);
				if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
				{
					printf("课程名称\t实得学分\t\n");
					printf("%-8s-8f%",stu2[i].courseName, stu2[i].finalCreHour);
					break;
				}
			}
		if (i == m) 
			printf("无法找到该学生!\n");
	}
	else
		printf("输入格式错误,请重新输入\n");

}

enum option  //枚举结构 增加代码可读性
{
	exit,
	add,
	search,
	delInfo,
	delGrade,
	showinfor,
	showgrade,
	order,
};

int main()
{
	int input =1; //模块选择变量
	menu();
	do
	{
		printf("请选择:-->");
		scanf("%d", &input);
		switch (input)
		{
		case add:
			Add();
			break;
		case search:
			Search();
			break;
		case delInfo:
			DelInfo();
			break;
		case delGrade:
			DelGrade();
			break;
		case showinfor:
			showInfor();
			break;
		case showgrade:
			showGrade();
			break;
		case order:
			Order();
			break;
		case exit:
			break;
		default:
			printf("输入格式错误");
		}
	} while (input);
	return 0;
}

 实验报告源码流程图下载链接

链接:https://pan.baidu.com/s/1CyxfN4hxRw6KDftwmeXO8w?pwd=1234 
提取码:1234

你可能感兴趣的:(简单实验实践,c语言,c语言,笔记)