学生档案管理系统c语言

更新时间:2023-10-12 10:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

学生档案管理系统

1 内容与要求

【问题描述】

设计一个学生档案管理系统,对学生档案进行管理。每个学生的信息包括:学号、姓名、性别、出生年月、是否党员、手机号码、家庭住址、各门课成绩(每门课包括课程名与成绩)。系统要求包含如下功能:

1。创建功能:初始输入每个学生的信息(学号、姓名、性别、出生年月、是否党员、手机号码、家庭住址)并保存。

2。显示功能:显示全部学生的信息(包括各门课的成绩)。

3。输入某课程成绩功能:按学号、成绩输入选修某门课的所有学生的成绩(说明:并不是所有学生都选同一门课,每个学生选的课可不一样)。

4。统计平均成绩功能:计算每个学生的平均成绩。 5。查找功能:按姓名或学号查找学生记录,并显示。 6。排序功能:按学号或平均成绩进行排序,并显示。 7。插入功能:插入一条学生记录。 8。删除功能:删除指定学生的记录。

要求提供一个界面来调用各个功能,界面应尽可能清晰美观。 【具体要求】

1。系统应以菜单方式工作,举例如下: 程序运行后显示如下主界面:

**************************************** 1--------------创建 2--------------显示 3--------------输入成绩 4--------------统计成绩 5--------------查找 6--------------排序 7--------------插入 8--------------删除 9--------------退出

**************************************** 通过选择1-9来确定要做哪一个操作。

若选5,则出现如下界面:

**************************************** 1----------按学号查询 2----------按姓名查询

****************************************

2。要求采用顺序存储结构存储学生基本信息,每个学生的信息是一个数据元素,而其中每个学生各门课的成绩用单链表存储结构存储。 【实现提示】

顺序表每个数据元素包括学号、姓名、性别、出生年月、是否党员、手机号码、家庭住址、成绩链表的头指针;成绩链表每个结点的数据域包括课程名与成绩。

【测试数据】

自己设计,报告上要求给出各种情况的数据测试结果。 【实现说明】

有能力的同学在完成上述功能的基础上,可以充分发挥自己的想象力增加并完善该系统的功能,如采用文件来存储学生信息,增加输出某门课的成绩记录单功能等等。

2 总体设计 一、设计步骤

分析问题,给出数学模型,设计相应的数据结构。

(1)按照课程要求,可以将学生基本信息以顺序存储方式存放在一数组中,而学生基本信息由于有多个项目,可以将单个学生的信息以结构体的方式存储; (2)输入的成绩可以在每个通过在结构体中加入一链表来实现存储多门课程的目的,为避免每插入一门课程就需要遍历一次链表,此处应以队列的方式来存储课程;

(3)统计成绩计算出成绩之后为方便后续的显示平均成绩及排序须在每个学生的信息中再加入平均成绩一项; 二.功能模块及调用关系说明

(1)创建基本信息:通过fopen()以读的方式打开“basedata.dat”文件, 再用fscanf()将文档中的基本信息存储到p1数组中;

(2)显示学生信息:可以通过遍历数组p1来进行输出,若基本信息为空,则提示先创建信息,若学生课程信息未存入则不进行显示,若课程信息已存入,则在遍历数组的基础上再对每个数组元素中的链表进行遍历输出;

(3)输入成绩:先输入课程代号,通过strcmp()字符串比较判断再同(1)打开相应文件并将信息写入一中间变量里,再通过中间变量中写入的学号查找到

该学生,并将这条课程信息用EnQueue()存到该学生的课程链表中,若该课程已存在与该学生的课程链表中则不进行重复写入,其中用isExitcNo()判断是否存在该课程;

(4)统计成绩:通过遍历每个学生的课程链表计算并存储每个学生的平均成绩,若未录入基本信息则提示先创建基本信息,若课程链表为空,则提示先输入成绩;

(5)查找:1.按学号查询:建立一个for循环,通过输入的学号找到相应的学生,并输出该学生的信息,

2.按姓名查询:建立一个for循坏,通过输入的姓名找到相应学生,并输出该学生的信息,

若并未创建基本信息,则提示先创建基本信息;

(6)排序:1.按学号排序:先将学号用sscanf()转化为int型,再用插入排序法对数组进行排序;

2.按平均成绩排序:利用插入排序法对数组元素中的平均值比较从而对数组进行排序;

若并未创建基本信息,则提示先创建基本信息; (7)插入:

先输入一个学号,用isNo()判断输入的是否为数字,若输入的并不为数字,则提示其重新输入,输入学号后,若该学号已经存在,则提示重新输入;

在学号输入正确无误的前提下,再输入姓名,再输入性别,用isGender()判断输入的是否是性别,若不为性别,则提示重新输入,再输入出生日期,用isNo判断是否为数字,若不为数字则提示重新输入,再输入是否为党员用isYN()判断格式是否正确,若格式错误则提示重新输入,再输入手机号码,并用isNo()判断是否为数字,若不为数字则提示重新输入,最后再输入地址; 学生基本信息输入完成后再输入课程信息,课程信息记录到数组元素的课程链表中;

输入完成后再用InsertFile()将学生信息写回到学生基本信息文档及课程文档中;

(8)删除:

若学生信息为空,则提示先创建学生信息,学生信息不为空,则输入学号,再通过输入的学号查找到相应的学生并删除数组中该条学生信息,若无法找到该学号则提示无该学生,要求其重新输入;

删除成绩后再用reWFile()将数组中的信息重新写回到学生基本信息文档及课程文档中;

(9)退出程序。

3 详细设计

1)实现概要设计中定义数据的存储结构 struct student{ char No[10]; char name[10];

//学生信息 //学生学号 //学生姓名

char gender[5]; //学生性别 char brithday[8]; //学生生日 char tpartym[5]; //是否为党员 char phoneNo[15]; //手机号码 char addr[20];

//学生地址

courses *front; //学生课程队列的队首 courses *rear; int average; }

struct courses{ char cNo[15]; char sNo[10]; int degree;

//课程信息 //课程代号 //课程中学生学号 //相应学号学生的成绩 //学生课程队列的队首 //学生所有课程的平均成绩

courses *next;} 2)函数的算法实现

(1)InitQueue(student &Q)函数的实现(初始化队列)

形参为队列名称;在函数中将用new生成新的节点,并将队头和对位指向此节点,再将头节点的指针域置空。

(2)EnQueue(student &Q,courses e)入队函数的实现

形参一个为队列名称,另一个为插入元素;先为入队元素分配节点空间并用指针p指向该节点,再将节点的数据域置为e然后将新节点插入到队尾并修改队尾指针,使队尾指针指向下一个节点。

(3)GetLine(student Q)输出队列函数的实现

形参为队列名称;先设一个中间变量r作为节点指针,当对首与队尾相等时,即队列为空,则提示课程信息为空,当对列不为空时,将r赋值为队首所指向的指针域,在while循环中当r不为空时分别输出课程名称及对应课程的成绩,再将r指向下一个节点,当r为空时即遍历对列完成则结束循环。

(4)CalculateAve(student &Q)计算平均成绩的实现

形参为队列名称,即为单个数组元素;设置一个变量n并置初值为0用于课程数的计数,设一个中间变量r作为节点指针,将r赋值为队首所指向的指针域,在while循环中当r不为空时将每门课程成绩相加,加完所有成绩之后再将总成绩除以课程数并将所得平均成绩赋值给数组元素。

(5)isExitcNo(student Q,char *cNo)判断该课程是否存在于数组元素队列中

设一个flag做为标志值设置初值为0,在for循环中对每个数组元素进行遍历,在循环过程中用strcmp()将该数组元素中已有课程代号与输入课程代号进行比较,若有相等的课程,则将flag值置为1,并直接结束循环,最后返回flag

(6)isNo(char *No)判断是否为数字

若字符串全为数字,则函数返回1,若字符串中有一个不为数字,则返回0. (7)isGender(char *gender) 判断是否为性别

若字符串判断为“男“或”女“,则函数返回1,反之则返回0. (8)InsertFile(student Q)插入文件

将文件用fopern()以添加的方式打开,用fprintf()将插入的信息写入文件 (9) reWFile(student *p1,int i)写回文件

将文件用fopen()以写的方式打开,用fprintf()将删除信息后的数组重新写回到文件中

3)创建基本信息的算法实现

先用fopen()以读方式打开学生基本信息文档,并将返回地址赋值给文件指针型变量fp,若打开文件错误则提示文件打开错误,用feof()判断是否为文件结尾,用fscanf()将文档中读出的信息赋值分别赋值给p1[i]中的各项数据项,用fscanf()!=EOF防止读入文件中的回车空白行,读入信息后用isExistNo()判断该学号是否已经存在,若存在则不读入该行信息,若不重复则用InitQueue()初始化每个数组元素的队列,读完所有信息后提示创建成功并用fclosef()关闭前面打开的基本信息文件; 4)显示学生信息的算法实现

先通过判断数组长度i来判断学生信息数组是否为空,若i为0,即数据为空,则提示“信息为空,请先创建基本信息\,若数据不为空,则利用for循环对每个数组元素的数据信息进行输出,分别输出p1[j].No,p1[j].name,p1[j].gender p1[j].brithday,p1[j].phoneNo,p1[j].tpartym,p1[j].addr,再在每次循环中用GetLine(p1[j])对该学生的各门课程名及成绩进行输出;若还未存储成绩则 不对课程成绩进行输出; 5)输入成绩的算法实现

本文来源:https://www.bwwdw.com/article/20qf.html

Top