算法与数据结构课程设计(学生成绩管理系统.C)

目录

一、目标

二、开发环境

三、任务要求

四、考评方式

五、代码部分:

PPT部分:

 课程设计报告(资源不包含课程设计报告):


一、目标

1. 数据结构课程利用项目化教学模式符合现代教学改革需要,也适合数据结构课程改革需求,提高学生实践技能,为企业培养需要的应用型高级技术人才。

2. 通过互联网在线学习方式,使学生能够掌握数据结构的基本知识和技巧,同时熟悉数据结构在实际问题中应用的基本知识,达到能独立使用合适的数据结构实现数据保存与操作的能力。

3. 提供运用数据结构知识以及高级编程语言解决非数值实际问题的能力。

4. 在完成基本知识教学的同时,通过实践环节,强化对学生动手能力的培养与训练。

二、开发环境

技术指标

技术参数

开发工具

Vscode/dev-c++

使用技术

C语言

三、任务要求

3.1.1任务

要求完成一个小型系统的建设,具体内容如下:

题目1:学生成绩管理系统

(1)任务:要求实现对学生资料的录入、浏览、插入和删除等功能。

输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩,设学生成绩至少 3 门以上。存储结构:采用线性链式结构。

(2)详细设计

LinkList *create() : 输入学生成绩记录函数;

void print(LinkList *head) : 显示全部记录函数

LinkList *Delete(LinkList *head) : 删除记录函数

LinkList *Insert(LinkList *head) : 插入记录函数

void menu_select() : 菜单选择

void ScoreManage() : 函数界面

(3) 程序流程图

(4)程序模块及其接口描述

该程序可以分为以下几个模块:

a菜单选择: void menu_select();

提 供 五 种 可 以 选 择的 操作 , 在 main 函 数 中 通 过 switch 语句 调 用 菜 单

menu_select() 函数,进入不同的功能函数中完成相关操作。

b输入功能: LinkList *create();

通过一个 for 循环语句的控制, 可以一次完成无数条记录的输入。 并将其存入表。

c输出功能: void print(LinkList *head);

通过一个 while 的循环控制语句,在指针 p!=NULL时,完成全部学生记录的显示。知道不满足循环语句,程序再次回到菜单选择功能界面。

d删除功能: LinkList *Delete(LinkList *head);

按想要删除的学生的学号首先进行查找,通过指针所指向结点的下移来完成,如果找到该记录, 则完成前后结点的连接, 同时对以查找到的结点进行空间的释放,最后完成对某个学生记录进行删除,并重新存储。

e插入功能: LinkList *Insert(LinkList *head) ;

输入你想插入的位置,通过指针所指向结点的下移,找到该位置, 将该新的学生记录插入到该结点,并对该结点后面的指针下移。链表长度加一,重新存储。

f 程序的输入与输出描述

输入:调用 LinkList *create() 函数,输入学生的姓名、学号、三门功课的成绩;

输出:调用 void print(LinkList *head) 函数,输出学生的记录。

四、考评方式

学生成绩管理系统

评分点

分数

说明

搭建项目

5

搭建项目

创建结构体

5

创建学生成绩结构体

输入模块

10

输入学生成绩记录

输出模块

10

显示全部记录函数

删除模块

10

删除记录函数

增加模块

10

插入记录函数

主菜单

5

菜单选择

函数界面

5

函数界面

项目整体

10

项目正常运行部署,业务板块基本正常,设计功能整体实现

课程设计报告

30

符合一般论文格式规范。

五、代码部分:

#include<stdio.h>
#include<stdlib.h>
#include<String.h>
#include <time.h>
//------------------------------------------------------------------------------ 
typedef struct UserLogin {
	char UserName[20];
	char Code[20];
}user;
typedef struct stu { //学号和各门课程的成绩,设学生成绩至少 3 门以上
	char Student_ID[20];
	char name[20];
	int Chinese;
	int math;
	int English;
	struct stu* pnext;
}stu;
stu* phead; //phead为链表首地址
char fileuser[50] = "user.txt";//用户记录文件相对地址  
char filename[50] = "111.txt";//文件默认的相对地址
char ch[1];//清除缓冲数据
int x = -1;//菜单选择(变量) 
int n = 0;//n存着信息条数
int power=0;//0查看权限1管理员权限 
char* user1;//用户登录名称 
time_t t;//时间函数
//------------------------------------------------------------------------------ 
char* register_user(){ //用户使用记录
	user* login = (user*)malloc(sizeof(user));
	system("cls");
	printf("高校教学管理与服务平台 (V8.2.0)");
	printf("\n****************************************\n用户名:");
	scanf("%s",login->UserName);
	printf("管理员密码为:00000\n密码:");
	scanf("%s",login->Code);
	gets(ch); 
	if(!strcmp("00000",login->Code)){//用户权限,"00000"为管理员权限 
		power=1;
	} else{
		power=0;
	} 
FILE *w;//文件指针
		w = fopen(fileuser, "a+"); //找不到文件就创建文件 
		fprintf(w, "%s ", login->UserName); //数据存入到文件
		fprintf(w, "%s %ld", login->Code,time(&t));
		fprintf(w, "%s", "\r\n"); //换行
		fclose(w);	//关闭文件
		return login->UserName;
}
//------------------------------------------------------------------------------ 
int menu_select() { // 菜单选择
	system("cls");
	printf("高校教学管理与服务平台 (V8.2.0)");
	printf("\n****************************************\n");
	printf("欢迎("); 
	if(power){
		printf(" 管理员:"); 
	}else{
		printf(" 用户:"); 
	} 
	printf("%s )登录成绩管理系统\n%s",user1,ctime(&t),time(&t));    
	printf("****************************************");
	printf("\n	菜单选择(当前文件目录%s)",filename);
	printf("\n****************************************");
	printf("\n\t0.修改文件路径");
	printf("\n\t1.输入学生记录");printf("\t(仅管理员使用)");
	printf("\n\t2.输出学生记录"); 
	printf("\n\t3.删除学生记录");printf("\t(仅管理员使用)"); 
	printf("\n\t4.插入学生记录");printf("\t(仅管理员使用)"); 
	printf("\n\t5.退出用户登录");
	printf("\n\t6.退出程序");
	printf("\n****************************************");
		printf("\n请输入您的选择:");
	scanf("%d", &x);
	gets(ch);
	return x; 
}
//------------------------------------------------------------------------------ 
void filePath() {//0.修改文件路径 
	printf("是否进行修改文件路径?0保持,1修改\n");
	scanf("%d", &x);
	if (x == 1){
		printf("输入文件所在路径及名称<需要加文件后缀.txt>:"); 
		scanf("%s", filename); /*输入文件所在路径及名称*/
		printf("修改成功");
	}gets(ch);//清除多余字符 
}
//------------------------------------------------------------------------------ 
void save();
void Create() { //1.输入学生记录
int f=1;
	printf("输入人数为: ");
	scanf("%d", &n);
	stu *pend, *pnew; //尾节点,新节点
	pend = phead = (stu*)malloc(sizeof(stu)); //分配内存给首节点
	phead->pnext=pend;//头节点指向第一条记录; 
	if(n){
	printf("\t学号\t姓名\t语文\t数学\t英语\n");
	}
	for (int i = 0; i < n&&f; i++){
		pnew = (stu*)malloc(sizeof(stu)); //分配新节点
		pend->pnext = pnew; //原来的尾节点指向新节点
		pnew->pnext = NULL; //新节点的指针为NULL
		printf("NO.%d: ", i+1);
		scanf("%s",pend->Student_ID);//输入数据存到链表中
		scanf("%s",pend->name);
		scanf("%d",&pend->Chinese);
		scanf("%d",&pend->math);
		scanf("%d",&pend->English);
		pend = pnew; //赋值后指向尾节点
		printf("是否继续输入<0结束1继续>");
		scanf("%d",&f);
	}pend->pnext=NULL;
	free(pnew);//循环结束后释放pnew内存
	save();
}
void save() { //1.1存到文件内
	FILE *w;//文件指针
	if ((w = fopen(filename, "a+")) == NULL) {  /*二进制只写打开文件*/
		printf("无法打开文件\n");
		exit(1);
	}
	for (int i = 0; phead->pnext; i++) { //链表数据循环输入到文件里
		fprintf(w, "%s ", phead->Student_ID); //数据存入到文件
		fprintf(w, "%s ", phead->name);
		fprintf(w, "%d ", phead->Chinese);
		fprintf(w, "%d ", phead->math);
		fprintf(w, "%d", phead->English);
		fprintf(w, "%s", "\r\n"); //换行
		phead = phead->pnext; //指向下一个节点
	}fclose(w);	//关闭文件
}
//------------------------------------------------------------------------------ 
void print() { //2.输出学生记录
	FILE *fp;//文件指针
	if ((fp = fopen(filename, "rb")) == NULL) {  /*二进制只读打开文件*/
		printf("无法打开文件\n");
		exit(1);
	}
	stu *pend, *pnew; //尾节点,新节点
	pend = phead = (stu*)malloc(sizeof(stu)); //分配内存给首节点
	phead->pnext=pend;//头节点指向第一条记录;  		
	printf("序号\t学号\t姓名\t语文\t数学\t英语\n");
	int i=0;//计数 
	while(1) {
		pnew = (stu*)malloc(sizeof(stu)); //分配新节点
		pend->pnext = pnew; //原来的尾节点指向新节点
		pnew->pnext = NULL; //新节点的指针为NULL
		fscanf(fp, "%s", &(pend->Student_ID)); //输出数据到数组
		fscanf(fp, "%s", &(pend->name));
		fscanf(fp, "%d", &(pend->Chinese));
		fscanf(fp, "%d", &(pend->math));
		fscanf(fp, "%d", &(pend->English));
		char ch;
		if (ch = fgetc(fp) == EOF) {//结束的标志 
			if (feof(fp)) {
				printf("共%d行\n",i);
				break;
			}
		}
		printf("%2d. %s\t%s\t%d\t%d\t%d\n",++i,pend->Student_ID,
		pend->name,pend->Chinese,pend->math,pend->English); //输出数据到屏幕
		if(!(i%200)){//每200行数据按任意键继续 
			system("pause");
		}
		pend = pnew; //赋值后指向尾节点
	}pend->pnext=NULL;
	free(pnew);//循环结束后释放pnew内存
	fclose(fp);//关闭文件
}
//------------------------------------------------------------------------------ 
int query(){//3.1.查询对应的学号 
	int f=0;
	char ID[20];
	print(filename);//打印学生信息 
	stu *pend;//读取第一条记录
	printf("请输入查找的学号");
	scanf("%s",ID);
	int i=1;
	for(pend=phead;pend;pend=pend->pnext,i++){
		if(!strcmp(ID,pend->Student_ID)){
			f=1;
			break;
		}	
	}
	if(f==1){
		printf("%d查找到了学号\t%s\n",i,pend->Student_ID);
	}else{
		printf("没有找到该学号\n");
		i=0;
	}	
	return i;
}

int Delete() {//3.删除学生记录
	n=query();
	if(n==0){//没找到该同学; 
		return 0;
	}
	char buf[1024]; //每读取一行,都将内容放到该数组中
	FILE* fp = fopen(filename, "r"); //filename里是原内容
	FILE* fpt = fopen("temp.txt", "w"); //将filepath文件第n行内容删除后存入temp.txt中
	int i = 0;
	while (!feof(fp)) {
		i++;
		fgets(buf, sizeof(buf), fp);
		if (i != n&&!feof(fp)) { //删掉第n行
		fprintf(fpt, "%s", buf);
		}
	}
	fclose(fp);
	fclose(fpt);
	fpt = fopen("temp.txt", "r");
	fp = fopen(filename, "wb"); 
	while (!feof(fpt)) {
		fgets(buf, sizeof(buf), fpt);
		if(!feof(fpt)) {
		fprintf(fp, "%s", buf);	
		}
	}
	fclose(fp);
	fclose(fpt);
	system("ERASE temp.txt"); //删除文件temp.txt
	print(filename);
	return 1;
}

int Insert(){//4.插入学生记录 
	n=query();
	if(n==0){//没找到该同学; 
		return 0;
	}
	char buf[1024]; //每读取一行,都将内容放到该数组中
	FILE* fp = fopen(filename, "r"); //filename里是原内容
	FILE* fpt = fopen("temp.txt", "w"); 
	int i = 0;
	while (!feof(fp)) {
		i++;
		fgets(buf, sizeof(buf), fp);
		if(!feof(fp)) {
		fprintf(fpt, "%s", buf);
		}
		if (i == n&&!feof(fp)) {
			stu *pend;
		 	pend = (stu*)malloc(sizeof(stu));
		 	printf("\t学号\t姓名\t语文\t数学\t英语\n");
		 	printf("NO.%d: ", i+1);
		 	scanf("%s",pend->Student_ID);
			scanf("%s",pend->name);
			scanf("%d",&pend->Chinese);
			scanf("%d",&pend->math);
			scanf("%d",&pend->English);
			fprintf(fpt, "%s ", pend->Student_ID); //数据存入到文件
			fprintf(fpt, "%s ", pend->name);
			fprintf(fpt, "%d ", pend->Chinese);
			fprintf(fpt, "%d ", pend->math);
			fprintf(fpt, "%d", pend->English);
			fprintf(fpt, "%s", "\r\n"); //换行
		}
	}
	fclose(fp);
	fclose(fpt);
	fpt = fopen("temp.txt", "r");
	fp = fopen(filename, "wb"); 
	while (!feof(fpt)) {
		fgets(buf, sizeof(buf), fpt);
		if(!feof(fpt)) {
		fprintf(fp, "%s", buf);	
		}
	}
	fclose(fp);
	fclose(fpt);
	system("ERASE temp.txt"); //删除文件temp.txt
	print(filename);
}
//------------------------------------------------------------------------------ 
void ScoreManage(){//函数选择
if(!power){//普通用户权限 
		switch (x) {
			case 0:
				filePath();//修改文件地址 
				break;
			case 1:
				printf("权限不足");				
				break;// 输入学生成绩记录函数;//调用函数建立链表存文件
			case 2:
				print();
				break;// 显示全部记录函数//调用函数存到文件
			case 3:
				printf("权限不足");							
				break ;// 删除记录函数
			case 4:
				printf("权限不足");			
				break ;// 插入记录函数
			case 5:
				strcpy(user1,register_user());
				break ;// 退出登录 
			case 6:
				exit(1);//退出 
			default:;
		}
}else{//管理员权限 
		switch (x) {
			case 0:
				filePath();//修改文件地址 
				break;
			case 1:
				Create();
				break;// 输入学生成绩记录函数;//调用函数建立链表存文件
			case 2:
				print();
				break;// 显示全部记录函数//调用函数存到文件
			case 3:
				Delete();				
				break ;// 删除记录函数
			case 4:
				Insert();				
				break ;// 插入记录函数
			case 5:
				strcpy(user1,register_user());
				break ;// 退出登录 
			case 6:
				exit(1);//退出 
			default:;
		}
}
		system("pause");
		system("cls");
} 
//------------------------------------------------------------------------------ 
int main() {
	user1=register_user(); //用户登录界面返回用户名称 
	while (1) {	
		ScoreManage(menu_select());//函数选择(菜单选择) 
	}
	return 0;
} 

PPT部分:

 课程设计报告(资源不包含课程设计报告):

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
任 务 书 "题目:学生成绩管理系统 " "设计容与要求: " "1.课程设计任务容 " "设计一个简易的学生成绩管理系统,能够完成学生成绩的增加、删除、查找、 " "修改、统计等操作,数据信息保存文件保存。要求系统具有菜单和提示,界面 " "友好。 " "2.课程设计要求 " "实现学生成绩的管理和保存。 " "开发环境:vc++6.0 " "实现目标: " "熟悉的运用c语言程序编写代码。 " "能够理清整个程序的运行过程并绘画流程图 " "了解如何定义局部变量和整体变量; " "学会上机调试程序,发现问题,并解决 " "学习使用C++程序来了解程序原理。 " "学习用文档书写程序说明 " 摘 要 管理信息系统正在向着网络化、智能化和集成化等趋势发展。学生成绩管理系统是 为了更好的管理学生考试成绩而开发的数据管理软件。它对于一个学校是不可缺少的重 要部分,它的容对于学校的决策者和管理者来说都至关重要。学生成绩管理管理系统为 用户提供充足的信息和快捷的查询手段,实现学生基本信息、成绩的录入,删除,查询 ,维护以与成绩的统计分析等几方面的功能,是现实问题的迫切要求。 本系统开发的总体任务是实现学生成绩管理的系统化、规化、自动化。达到提高学 生成绩管理效率的目的。与传统管理方法相比有明显的优点:查找方便,可靠性高,性 好,成本低。彻底改变了以前繁杂的管理模式,实现全面的、相对集中的、职能化的信 息综合管理。 计算机被用到信息管理系统的环境正是适应了当今时代飞速发展的信息时代。人们 深刻的认识到了计算机功能的强大,对于复杂的信息管理,计算机充分发挥着它的优越 性。检索迅速、查找方便、可靠性高、存储量大、性好、寿命长、成本低,这些优点极 减轻了学院教学人员的工作量,缩小开支,提高了学生档案管理的效率和准确性,能够 合理的安排时间,学生能够尽快的知道自己的考试成绩。同时,学生管理系统的应用也 为今天的教育在未来市场的竞争力有所提高。 目 录 1.引 言5 2.课题分析7 3.具体设计过程8 3.1设计思路8 3.2程序设计流程图8 3.3.函数实现说明10 4.程序运行结果13 5.软件使用说明14 6.结论14 参 考 文 献16 附录:源代码16 1.引 言 数据结构在计算机科学界至今没有标准的定义。个人根据各自的理解的不同而有不同 的表述方法: Sartaj Sahni在他的《数据结构算法与应用》一书中称:"数据结构是数据对象,以与存在于该 对象的实例和组成实 例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。"他将数据对 象(data object)定义为"一个数据对象是实例或值的集合"。Clifford A.Shaffer在《数据结构算法分析》一书中的定义是:"数据结构是 ADT(抽象数据类型Abstract Data Type) 的物理实现。" Lobert L.Kruse在《数据结构与程序设计》一书中,将一个数据结构设计过程分成抽象层、数据 结构层和实现层。其中,抽象层是指抽象数据类型层,它讨论数据的逻辑结构与其运算 ,数据结构层和实现层讨论一个数据结构的表示和在计算机的存储细节以与运算的实现 。数据结构具体指同一类数据元素中,各元素之间的相互关系,包括三个组成成分,数 据的逻辑结构,数据的存储结构和数据运算结构。 1.1. 重要意义 一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。对数据元素间 逻辑关系的描述称为数据的逻辑结构;数据必须在计算机存储,数据的存储结构是数据 结构的实现形式,是其在计算机的表示;此外讨论一个数据结构必须同时讨论在该类数 据上执行的运算才有意义。 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大 型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选 择了最优的数据结构。许多时候,确定了数据结构后,算法就容易得到了。有些时候事 情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适 的数据结构都是非常重要的。 选择了数据结构算法也随之确定,是数据而不是算法是系统构造的关键因素。这种 洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是 其中之一。 1.2. 研究容 在计算机科学中,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象 (数据元素)以与它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的 新结构仍然是原来的结构类型。 "数据结构"作为一门独立的课程在国外是从1968年才开始设立的。 1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技 巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构与其

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值