c语言数据结构课程设计——学生成绩管理系统的实现

         纯属分享一下课程设计代码,仅供参考 欢迎大佬指正!!!!!


软件:vs2017(在devc++中有些许地方要改一下也可以运行,如有需要私聊我。

#define _CRT_SECURE_NO_WARNINGS;
#ifndef LyStudenT_H
#define LyStudenT_H
#define Maxsize 10
#define GMaxsize 3
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//链表结构
typedef struct Student {
	char Xh[Maxsize];//学号
	char name[Maxsize];//姓名
	float grade[GMaxsize];//成绩
	int length;//长度
	struct Student *next;
}Student, *StudentList;
 
//菜单栏
void Option() {
	printf("------------------------------------------------------------------------------------------------------------------------\n");
	printf("             1).成绩信息录入功能.\n");
	printf("             2)成绩信息浏览功能.\n");
	printf("             3)查询功能:按学号查询和按成绩段查询.\n");
	printf("             4)成绩信息的删除:按学号进行删除某学生的成绩.\n");
	printf("             5)成绩信息的修改:按成绩修改,把55~59分之间的成绩都加上5分.\n");
	printf("             6)退出.\n");
	printf("------------------------------------------------------------------------------------------------------------------------\n");
}
 
//初始化链表
void Initlist(StudentList &L) {
	L = (StudentList)malloc(sizeof(Student)); //向内存申请空间 
	L->next = NULL; //初始化将头结点指向NULL 
	L->length = 0;//长度为0 
}
//输出链表
void Pr_list(StudentList &L) {
	if (L->length > 0)
	{
		printf("目前有%d条信息。\n", L->length);
		Student *p; //申请一个临时节点用来指向数据 
		p = L->next;
		for (int i = 0; i < L->length; i++)
		{
			printf("第%d位姓名和学号是:%s %s \n", i + 1, p->name, p->Xh);
			printf("第%d位同学的三门成绩%.2f, %.2f, %.2f \n", i + 1, p->grade[0], p->grade[1], p->grade[2]);
			if (p->next != NULL)
			{
				p = p->next; //如果不是最后一个的话就指向下一个 
			}
		}
		printf("查询成功\n");
	}
	else {
		printf("目前没有信息。\n");
	}
}
//尾插法 结构是使用单链表尾插法进行插入
bool Sc_listwc(StudentList &L) {
	Student *s, *w;
	w = L;
	int x;
	printf("请输入有几条信息:");
	scanf_s("%d", &x);
	FILE *fp;  //定义一个FILE指针 
	fopen_s(&fp, "C:\\Structshixun\\wbout.txt", "a");
	if (x > 0)
	{
		for (int i = 0; i < x; i++)
		{
			s = (Student*)malloc(sizeof(Student));
			printf("请输入第%d位同学的姓名和学号(小于5位)空格隔开:", i + 1);
			scanf_s("%s", &s->name, 10);
			scanf_s("%s", &s->Xh, 10);
			printf("请输入三个成绩空格隔开:");
			scanf_s("%f %f %f", &s->grade[0], &s->grade[1], &s->grade[2]);
			s->next = w->next;
			w->next = s;
			w = s;
			//将写入的信息格式化,然后在末尾换行
			fprintf(fp, "姓名:%s,学号:%s,成绩分别是:%.2f %.2f %.2f.\n", s->name, s->Xh, s->grade[0], s->grade[1], s->grade[2]);
		}
		L->length += x;
		fclose(fp); //写入成功,关闭文件 
		return true;
	}
	fclose(fp);//写入失败,关闭文件 
	return false;
}
//修改成绩
bool Update_grade(StudentList &L) {
	Student *p;
	p = L->next; //让p指针指向头结点的下一个
	if (p == NULL) {
		printf("目前没有学生成绩。\n");//当p指向空时即当前是空链表或为最后一个
		return false;
	}
	for (int i = 0; i < L->length; i++) {
		if (p->grade[0] >= 55 && p->grade[0] <= 59)
		{
			p->grade[0] += 5;
			p = p->next;
		}
	}
	printf("第一门成绩为55-59区间的分数添加成功。\n");
	return true;
}
//比较字符串
int strStr(char* haystack, char* needle) {
	int len1 = strlen(haystack), len2 = strlen(needle);//获取两个字符串的长度 
	if (len1 != len2) { //长度不同则不用比较 
		return false;
	}
	int i = 1;
	while (i <= len1) {
		if (haystack[i - 1] == needle[i - 1]) { //两两比较 
			i++;
		}
		else {
			return false;
		}
	}
	return true;
}
//删除元素
bool Delete_id(StudentList &L) {
	char num[5] = "\0";
	printf("请输入要删除的学生学号:");
	scanf_s("%s", &num, 5);
	Student *w = L;
	while (1) {
		Student *p = w->next;
		if (w->next == NULL) {
			printf("没有此学号。\n");
			return false;
		}
		if (strStr(p->Xh, num)) {
			w->next = p->next;
			L->length--;
			free(p);
			printf("已删除.\n");
			w = L;
			return true;
		}
		else {
			p = p->next;
			w = w->next;
		}
	}
}//按学号查询
bool List_xuehao(StudentList &L) {
	char num[5] = "\0";
	printf("请输入要查询成绩的学号:");
	scanf_s("%s", &num, 5);
	Student *p;
	if (L->next == NULL) {
		printf("没有信息.\n");
		return false;
	}
	p = L->next;
	for (;;) {
		if (strStr(p->Xh, num)) {
			printf("此学生姓名是:%s,学号:%s,", p->name, p->Xh);
			printf("此学生的三门成绩分别是:%.2f %.2f %.2f. \n", p->grade[0], p->grade[1], p->grade[2]);
			return true;
		}
		else {
			if (p->next == NULL) {
				printf("没有此学号。\n");
				return false;
			}
			p = p->next;
		}
	}
}

//按成绩查询
bool List_grade(StudentList &L) {
	//a和b用于存储要查询的范围起始与终止 
	int a, b, num = 0;
	printf("请输入要查询的成绩范围起始:");
	scanf_s("%d", &a);
	printf("请输入要查询的成绩范围终止:");
	scanf_s("%d", &b);
	Student *p;
	if (L->next == NULL) { //判断是否为空 
		printf("没有信息.\n");
		return false;
	}
	p = L->next;
	for (;;) {
		if (p->grade[0] >= a && p->grade[0] <= b) {
			printf("此学生姓名是:%s,学号:%s,", p->name, p->Xh);
			printf("此学生所在范围成绩的是:%.2f. \n", p->grade[0]);
			printf("此学生的其他两门成绩分别是:%.2f %.2f. \n", p->grade[1], p->grade[2]);
			num++;
		}
		p = p->next;
		if (p == NULL) {
			printf("查找完毕,共有%d条信息.\n", num);
			return false;
		}
	}
	return true;
}
#endif // !LyStudenT_H
 
int main() {
	StudentList L;
	Initlist(L);
	int option, xz;
	//菜单栏
	printf("                                欢迎使用学生成绩管理系统!\n");
	Option();
	printf("请输入功能序号:");
	scanf_s("%d", &option);
	while (option != 6) {
		switch (option) {
		case 1://录入信息
			Sc_listwc(L);
			break;
		case 2://输出信息
			Pr_list(L);
			break;
		case 3://按学号或成绩查询
			printf("1.按学号查询;2.按成绩查询;");
			scanf_s("%d", &xz);
			switch (xz) {
			case 1:
				List_xuehao(L);
				break;
			case 2:
				List_grade(L);
				break;
			}
			break;
		case 4://按学号删除某学生的成绩
			Delete_id(L);
			break;
		case 5://修改成绩,将55——59分的成绩加5分
			Update_grade(L);
			break;
		}
		//本次运行结束后再次弹出菜单窗口 
		Option();
		printf("请输入功能序号:");
		scanf_s("%d", &option);
	}
	printf("欢迎下次使用。");
	return 0;
}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 一、系统介绍 1 二、总体设计 1 2.1程序模块 1 2.2.函数分析 1 2.3.总体结构 2 三.主要模块的实现 3 四.程序调试 6 五.总结与体会 13 六.源程序清单 14 一、系统介绍 成绩管理系统主要管理学生考试成绩的基本信息。在系统中,每个学生是一条记 录,包括姓名、学号、所选课程,而每个学生对应课程有相应成绩。系统要对一个有 N个学生的班级所选课程成绩统一进行管理。包括了学生成绩的录入、显示、修改、 排序、保存等操作。 二、总体设计 2.1程序模块 主界面 void homepage(); 显示全部成绩 void display(); 录入 插入 void input(); 删除记录 void del(); 排序 void sort(); 等待界面 void waiting(); 退出界面 void quit(); 2.2.函数分析 主函数 :调用所定义的函数,实现本系统要求的功能 主界面函数 :显示主页面,并连接其它函数模块 显示函数 : 显示按要求查询的信息 录入 插入函数 :录入或插入所需信息 删除记录函数 : 删除数据中原有的信息 排序函数 : 按照要求排列出信息的顺序 等待界面函数 : 在显示期间一个缓冲页面 退出界面函数 : 退出现有页面并返回子菜单 2.3.总体结构 . 三.主要模块的实现 主函数(main) 通过对函数的调用实现录入、显示、修改、排序、保存等功能,有机的联系了所有的模 块,是整个系统正常完整的运行。 主页面函数void homepage() 这个函数主要利用了printf输出了完整的主页面,并且通过函数的调用使这个页面和本 程序的其他功能模块连接了起来! 显示全部成绩函数void display() 这个函数主要通过printf输出提示,操作者输入所查找方向,调用先前建立的数组中的 存储数据,再通过printf函数按照一定的顺序全部完整的输出出来。完成了整个成绩的 输出,显示。 录入插入函数void input() 这个函数先用到if语句判断输入成绩是否正确,for语句判断学号是否正确,然后用到f or,printf,scanf三的函数完成了对所有学生信息的录入,并且保存到系统中,又用if, else判断输入数量是否超出数组的容纳量 删除记录函数void del() 这个函数先用for,if来判断所输入信息是否属于该系统信息,找到信息后用del()函数删 除掉原有的信息,并且用if,else选择是否继续。 排序函数void sort() 这个函数用printf输出操作提示,可以用for,if来实现对每一种方式的排序,在按数字 时用通过函数的调用地方法完成进入每一种排序的页面。 退出界面函数void quit() 这个函数主要通过printf输出"谢谢是由本程序",完成对整个程序运行结束的提醒。 删除模式 输入信息 四.程序调试 五.总结与体会 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能 力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新 日异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说 掌握计算机开发技术是十分重要的。回顾起此次课程设计,至今我仍感慨颇多,的确, 从从拿到题目到完成整个编程,从理论到实践,在一个多星期的日子里,我学到很多很 多的的东西,同时不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到 过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识 是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真 正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到 问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时 在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得 不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识重新温故 。 这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指 导下,终于完成课程设计。同时,我也学得到很多实用的知识,在次,对给予过我帮助 的各位指导老师和所有同学表示忠心的感谢! 参考文献 《C语言程序设计案例教程》 张基温 编著 清华大学出版社 C程序设计 (第三版) 谭浩强 著 清华大学出版社 《C语言程序设计方法》 邓文新 张宏烈 著 哈尔滨工业大学出版社 《C语言课程设计案例精编》 中国水利水电出版社 六.源程序清单 #include<stdio.h> #include<string.h> #include<windows.h> #include<conio.h> void ho

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值