基于C语言(数据结构)的学生奖金管理系统课程设计和文件的操作(附源码)

需要源代码:

1、私聊博主

2、看主页联系

3、完整代码访问以下链接:

腾讯文档腾讯文档-在线文档https://docs.qq.com/doc/p/71239d69a76f56cf1521717ae6b22c27cf876f10

该项目所用到的知识点:

链表、结构体、函数调用的实现、文件的生成(对录入好的学生成绩写到.txt文本)、文件的读写操作、排序算法、数据的增删查

文章先讲原理再看代码实现,文章比较长,希望耐心看完,代码接近500多行!!

一、 设计任务目的与要求

1、 进一步掌握和利用C语言进行程设计的能力;

2、 进一步理解和运用结构化程设计的思想和方法;

3、 初步掌握开发一个小型实用系统的基本方法;

4、 学会调试一个较长程序的基本方法;

5、 学会利用流程图或N-S图表示算法;

6、 掌握书写程设计开发文档的能力(书写课程设计报告);

二、 设计内容

2.1 总体设计

说明包含几大功能模块

画出系统功能模块结构图和系统流程图

数据结构设计及用法说明

2.2 详细设计

函数名字:

函数功能:

数据结构设计描述,参数说明

实现过程:写算法或解决思路,贴(NS图或流程图)

学生奖学金管理系统流程图如下:

使用到的结构体变量

struct Student

{   

   char Sid[10];
   char Sclass[20];
   char Sname[20];
   int Math;
   int English;
   int Physic;
   int Sum;
   int rank;
   struct Student;

}; 

 简介:以上的结构体为学生奖学金管理系统的核心部分,是贯穿整个系统的灵魂。存储和读取都是以结构体的形式进行的,每个结构体包含着丰富的信息。

第一板块:学生成绩的录入

使用到的函数有:

Ø int main();(控制主流程)

Ø void ShowMenu();(显示主菜单)

Ø struct Student in_stuNode(); (从键盘中输入的数据创建链表)

Ø void Record(struct Student *head); (从链表中的数据写入文件)

函数简介先把用户输入的数据用链表储存起来,然后链表遍历,并写入文件中。

程序流程图分别如下

函数 3( 创建stu链表):用户输入表中相关信息(格式如流程图所示),输入学号为@输入结束。

 函数 4( stu链表写入文件):成功写入文件, 在屏幕中输出录入成功!)

第二板块:显示全部学生成绩信息

使用到的函数有:

Ø int main();(控制主流程)

Ø void Show_stuNode();(从链表中输出到屏幕)

Ø struct Student \ File_stuNode();(从文件中读取数据,建立链表)

函数简介由于要经常对文件中数据操作,为了方便,把文件的数据存储到链表中,对链表的操作就是对文件中数据操作。

函数 2简介:

程序流程图分别如下:

函数 3简介:

第三板块:条件查询学生信息

使用到的函数有:

Ø int main();(控制主流程)

Ø void Search();(Search主菜单,控制流程)

Ø void SearchByRank();(按名次查询某学生的个人成绩)

Ø void SearchByClass();(按班级查询班级前3名学生的个人成绩)

Ø void SearchByScore();(按成绩段查询某学生的个人成绩)

Ø void SearchBySid() NEW :ADD FILE

Ø void SearchByName() NEW :ADD FILE

Ø struct Student * File_stuNode();(从文件中读取数据,建立链表)

程序流程图分别如下

函数 3简介:

 函数 4简介:

 函数 5简介:

第四板块:条件统计学生信息

使用到的函数有:

Ø int main()**;(控制主流程)**

Ø void Statistics()**;(统计主菜单,控制流程)**

Ø void StatByStu()**;(按学生统计所有人的总分)**

Ø void StatByClass()**;(按班统计每个班的总分)**

Ø void StatByProject()**; NEW :ADD FILE**

Ø struct Student * File_stuNode();**(从文件中读取数据,建立链表)**

函数3简介

 函数4简介

第五板块:删除学生信息

使用到的函数有:

Ø int main();(控制主流程)

Ø struct Student * File_stuNode();(从文件中读取数据,建立链表)

Ø void Delete();(删除学生信息)

Ø void Record(struct Student *head); (从链表中的数据写入文件)

函数 3简介

第六板块:添加学生信息

使用到的函数有:

Ø int main()**;(控制主流程)

Ø void Add()**;(调用其他函数,完成添加功能)

Ø struct Student * in_stuNode(); (从键盘中输入的数据创建链表)

Ø struct Student * File_stuNode();(从文件中读取数据,建立链表)

Ø void Record(struct Student *head); (从链表中的数据写入文件)

函数简介

第七板块:按条件排序

使用到的函数有:

Ø int main();(控制主流程)

Ø struct Student * File_stuNode();(从文件中读取数据,建立链表)

Ø void ShowSort();( 控制sort 流程)

Ø void ShowSortBy()(调用 sort 函数,显示结果)

Ø struct Student SortByRank(struct Student *head)(按名次排序)

Ø struct Student * SortBySid(struct Student *head)(按学号排序)

Ø void Record(struct Student *head); (从链表中的数据写入文件)

函数 5 简介

第八板块:保存文件

使用到的函数有:

Ø int main();(控制主流程)

Ø void SaveFile();(调用函数,保存文件)

Ø struct Student * File_stuNode();(从文件中读取数据,建立链表)

函数简介

第九板块:复制文件

使用到的函数有:

Ø int main();(控制主流程)

Ø void CopyFile()**;(将文件1复制到文件2)

函数简介

三、 实验结果与代码分析

运行程序主页面:

 菜单函数代码:

void ShowMenu()
{
	printf("\n**********   需要源代码看主页联系QQ   **********\n\n");
	printf("\t欢迎登录学生奖学金管理系统\n\n");
	printf("\t1-------------- 录入\n");
	printf("\t2-------------- 显示所有信息\n");
	printf("\t3-------------- 查询\n");
	printf("\t4-------------- 数据统计\n");
	printf("\t5-------------- 删除\n");
	printf("\t6-------------- 添加\n");
	printf("\t7-------------- 排序\n");
	printf("\t8-------------- 保存文件\n");
	printf("\t9-------------- 复制文件\n");
	printf("\t10------------- 退出\n\n");
	printf("\n**********   需要源代码联系 +QQ:3125841747   **********\n\n");
}

当txt文件内无内用时:显示为空的信息:

代码实现:

void Show_stuNode()
{
	printf("---------------------------STUDENT------------------------------------\n");
	printf("需要源代码 +Q:3125841747")
    printf("|编号	|班级	|姓名	|分数1	|分数2	|分数3    |总分 	| 排名 |\n");
	printf("----------------------------------------------------------------------\n");
	struct Student *p, *head;
	head = File_stuNode();     调用 File_stuNode()

	p = head;
	while(p != NULL)
	{
		printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p->Sid, p->Sclass, p->Sname, p->Math, p->English, p->Physic, p->Sum, p->rank);

		p = p->next;
	}

}

 非法输入时:

实现代码:

do
	{
		ShowMenu();
        printf("\n**********   **********\n\n");
		printf("\t请选择: ");
		scanf("%d", &option);
		getchar();

		switch(option)
		{
			case 1: Record(in_stuNode()); break;

			case 2: Show_stuNode(); break;

			case 3: Search(); break;

			case 4: Statistics(); break;

			case 5: Delete(); break;

			case 6: Add(); break;

			case 7: ShowSort(); break;

			case 8: SaveFile();break;

			case 9: CopyFile();break;

			case 10: break;

			default : printf("输入错误!");

		}
	}while(option != 10);

 录入学生信息及成绩:@为结束标记

 代码实现:

struct Student * in_stuNode()
{
	struct Student * head, * p1, * p2;
	int n = 0;
	p1 = p2 = (struct Student *)malloc(SIZE);

	head = NULL;

	scanf("%s",  p1->Sid);
	while(p1->Sid[0] != '@')
	{
		scanf("%s%s%d%d%d", p1->Sclass, p1->Sname, &p1->Math, &p1->English, &p1->Physic);
		p1->Sum = 0; p1->rank = 0;
		n++;
		if(n == 1)
		{
			head = p1;
		}else
		{
			p2->next = p1;
		}
		p2 = p1;

		p1 = (struct Student *)malloc(SIZE);
		scanf("%s",  p1->Sid);
	}
	p2->next = NULL;
	return head;
}

//从链表中的数据 写入文件
void Record(struct Student *head)
{
	FILE *fp;
	struct Student  *p1;
	p1 = head;

	if((fp = fopen("D:\\Course\\student.txt", "w")) == NULL)
	{
		printf("无法打开此文件\n");
		return;
	}

	while(p1 != NULL)
	{
		fprintf(fp, "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p1->Sid, p1->Sclass, p1->Sname, p1->Math, p1->English, p1->Physic, p1->Sum, p1->rank);
/*		if(fwrite(p1, SIZE, 1, fp) != 1)
			{
				printf("file write error\n");
			}
*/
		p1 = p1->next;

	}

	if(p1 == NULL){
	printf("已记录!!\n");
	}

	free(p1);
	free(head);
	fclose(fp);

}

 必须要先进行排名再去查询数据:

void SortRank()
{
	struct Student *p1, *head, *p2;
	int i;
	head = File_stuNode();

	p1 = head;

	while(p1 != NULL)
	{
		i = 1;
		p2 = head;
		while(p2 != NULL)
		{
			if(p1->Sum < p2->Sum)
			{
				i++;
			}
			p2 = p2->next;
		}
		p1->rank = i;
		p1 = p1->next;

	}

	Record(head);
}

void SearchByRank()
{
	struct Student *p1, *head;
	int number;
	head = File_stuNode();
	p1 = head;

	if(p1->rank == 0)
	{
		printf("你还没有排名呢?请返回主菜单执行操作7\n");
		return;
	}
	printf("请输入要查询的名次:");

	scanf("%d", &number);

	while(p1 != NULL)
	{
		if(p1->rank == number)
		{
			printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p1->Sid, p1->Sclass, p1->Sname, p1->Math, p1->English, p1->Physic, p1->Sum, p1->rank);
		}
		p1 = p1->next;
	}

	free(p1);
	free(head);

}

查找:

void SearchByClass()
{

	int i = 1;
	char Class[10] = {0};
	struct Student *p1, *head, *p2;

	printf("请输入要查询的班级: \n");
	scanf("%s", Class);

	head = File_stuNode();
	p1 = head;

	while(p1 != NULL)
	{
		if(strcmp(Class, p1->Sclass) == 0)
		{
			i = 1;
			p2 = head;
			while(p2 != NULL)
			{
				if(strcmp(Class, p2->Sclass) == 0)
				{
					if(p1->Sum < p2->Sum)
						{
							i++;
						}
				}
				p2 = p2->next;
			}

			if(i <= 3)
			{
				printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p1->Sid, p1->Sclass, p1->Sname, p1->Math, p1->English, p1->Physic, p1->Sum, p1->rank);
			}
			else if(i > 3)
			{
				break;
			}
		}
		p1 = p1->next;
	}

	free(p1);
	free(head);

}

功能按钮4:

void ShowMenu4()
{
	printf("\t****************************************\n");

	printf("\t1-------------- 总计\n");

	printf("\t2-------------- 分班统计\n");

	printf("\t3--------------退出\n");
    
	printf("\t****************************************\n");
    
    printf("需要源代码 +Q:3125841747");

}
void StatByStu()
{
	struct Student *head, *p1;

	head = File_stuNode();

	p1 = head;
	while(p1 != NULL)
	{
		p1->Sum = p1->Math + p1->English + p1->Physic;

		p1 = p1->next;
	}

	Record(head);

}

void StatByClass()
{
	char Class[10][10] = {0};
	int ClassSum[10] = {0};
	FILE *fp;
	struct Student *head, *p1;
	int i = 0;  //  记录class总数
	int j;
	int tag = 1;

	head = File_stuNode();
	p1 = head;

	while(p1 != NULL)
	{
		tag = 1;
		for(j = 0; j < i; j++)
		{
			if(strcmp(Class[j] , p1->Sclass) == 0)
			{
				tag = 0; break;
			}
		}
		if(tag == 1)
		{
			strcpy(Class[i++], p1->Sclass);
		}
		p1 = p1->next;
	}

	p1 = head;
	while(p1 != NULL)
	{
		for(j = 0; j < i; j++)
		{
			if(strcmp(p1->Sclass, Class[j]) == 0)
			{
				ClassSum[j] += p1->Sum;
			}
		}
		p1 = p1->next;
	}



	if((fp = fopen("D:\\Course\\student1.txt", "w+")) == NULL)
	{
		printf("无法打开此文件\n");
		return;
	}

	for(j = 0; j < i; j++)
	{
		printf("%s %d\n", Class[j], ClassSum[j]);
	}
}
void Statistics()
{
	int op;
	do
	{
		ShowMenu4();
		printf("\t请选择: ");
		scanf("%d", &op);

		switch(op)
		{
			case 1: StatByStu(); break;

			case 2: StatByClass(); break;

			case 3: break;

			default : printf("出入错误!\n");
		}
	}while(op != 3);

}

删除:

 代码实现:

void Delete()
{
	struct Student *p1, *head, *p2;
	char stuid[10] = {0};
	int tag = 0;

	head = File_stuNode();

	printf("请输入要删除的stuSid:\n");
	scanf("%s", stuid);

	p1 = head;
	p2 = NULL;
	while(p1 != NULL)
	{
		if(strcmp(p1->Sid, stuid) == 0)
		{
			if(p2 == NULL)
			{
				head = p1->next; // 删除是 head 结点
				tag = 1;
				break;
			}else{

				if(p1->next == NULL)
				{
					p2->next = NULL; // 删除是 尾节点
				    tag = 1;
					break;
				}
				p2->next = p1->next;
				tag = 1;
				break;
			}
		}
		p2 = p1;
		p1 = p1->next;
	}
	if(tag == 0)
	{
		printf("没找到学生!\n");
	}else{
		Record(head);
	}

}

学生的插入:

 实现代码:

void  Add()
{
	struct Student * head1, *head2, *p1, *head;

	head1 = File_stuNode();
	head2 = in_stuNode();

	p1 = head1;
	if(p1 != NULL)
	{
		while(p1->next != NULL)
		{
			p1 = p1->next;
		}
		head = head1;
		p1->next = head2;

	}
	else
	{
		head = head2;
	}
	if(head == NULL){
		printf("Y");}
	Record(head);

}

排序:这个功能可以对等级排序和学生的id排序,学生的id排序时,可以自己结算总分,排名!

 代码实现:

void ShowSort()
{
	int op;
	do
	{
		printf("\t****************************************\n");

		printf("\t1----------对所有学生按等级排序\n");

		printf("\t2----------按Sid为所有学生排序\n");

		printf("\t3----------退出!\n");

		printf("\t****************************************\n");

		printf("\t请选择:: ");
		scanf("%d", &op);

		switch(op)
		{
			case 1: ShowSortBy(op); break;

			case 2: ShowSortBy(op); break;

			case 3: break;

			default : printf("输入错误!\n");
		}
	}while(op != 3);

}

当你看到这里时,说明你真的很有耐心,接下来才是亮点!因为可以实现对txt文件的操作,保存文件和复制文件,看接下来的演示:

保存文件:输入 你想保存的的文件的文件名以及文件保存位置,即可导出文件。文件的后缀名是自己自定义,生成.c之类的都可以!下面图作为示例:生成.c和.txt文件。

 即可生成文件:

将student.txt文件作为备份,拷贝一份新的文件:

 实现代码:

//复制文件
void CopyFile(){
	FILE *fp, *fp1;
	char filename[30] = {0};
	char filename1[30] = {0};
	struct  Student *p1, stu;

	printf("请输入文件名\n");
	scanf("%s", filename);

	getchar();
	printf("请输入文件名路径\n");
	scanf("%s", filename1);
	getchar();

	if((fp = fopen(filename, "r")) == NULL)
	{
		printf("文件打开失败");
		return;
	}

	if((fp1 = fopen(filename1, "w")) == NULL)
	{
		printf("打开文件错误");
		return;
	}

	p1 = &stu;

	while(!feof(fp))
	{
		fscanf(fp, "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d", p1->Sid, p1->Sclass, p1->Sname, &p1->Math, &p1->English, &p1->Physic, &p1->Sum, &p1->rank);
		fprintf(fp1, "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p1->Sid, p1->Sclass, p1->Sname, p1->Math, p1->English, p1->Physic, p1->Sum, p1->rank);
	}

	fclose(fp);
	fclose(fp1);
}

//保存的路径
void SaveFile()
{
	FILE *fp;
	char filename[30] = {0};
	struct  Student *head, *p1;

	scanf("%s", filename);
	getchar();
	if((fp = fopen(filename, "w")) == NULL)
	{
		printf("打开文件错误");
		return;
	}

	head = File_stuNode();

	p1 = head;
	while(p1 != NULL)
	{
		fprintf(fp, "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n", p1->Sid, p1->Sclass, p1->Sname, p1->Math, p1->English, p1->Physic, p1->Sum, p1->rank);

		p1 = p1->next;
	}

	free(head);
	free(p1);
	fclose(fp);
}

 正常退出程序:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白不会debug

需要源码打个赏呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值