c 语言及数据结构与算法课程设计
题目: 学生信息管理系统
专业:
姓名:
学号:
同组其他学生(学号):
2013 年月日
目录
一、需求分析 . (3)
二、总体设计 . (4)
三、详细设计 . (5)
四、调试与测试 . (6)
五、测试结果 . (7)
六、用户手册 . (9)
七、附录 . (9)
一、需求分析
每年九月份都有大量新生来到学校报道,使学校管理学生工作量增大,为此我们设计一学生信息管理系统,学生信息包括:学号,姓名,年龄,性别,出生年月,地址,,E-mail 等。使之能提供以下功能:
(1)系统以菜单方式工作
(2)学生信息录入功能--- 输入
(3)学生信息浏览功能--- 输出
(4)查询、排序功能--- 算法按学号查询、按姓名查询、学生信息的删除
与修改(可选项)
二、总体设计
组成框图
主菜单欢迎界面录入
按姓名
Y
主菜单
3-- 查询学生信息
退出结束
流程
图
开
始
密码是否正确
入
1录入学生信息
2浏览学生信息
Y 密码是否正确
删除 4 - 删除学生信
息
5 - 修改学生信
录入
浏览修改查询
0 - 退出系
录
入开始
申请新空
间浏览
开
始
输入各项数据
指针 p 指向头结
点
输出指针的数据P=p->next
显示数据
结束
N P==NULL?
结束
查询
修改&删
除
输入姓名或学号
输入要删除
或修改的学
号
P指针的学号与
姓名是否与输 N 入的相同?
P=p->next
P 指针的学号
与输入的是否N 相同
输出数据
结束
三、详细设计
主函数通过在while 循环结构中嵌入switch 分支结构实现操作选择功能。
(1)Record 录入函数
建立一个包含学生全部信息的结构体,申请空间,其指针为p0,存入学生各项
对应的数据。
(2)Insert 插入函数:
按输入的数据存储在一个stu 类型的指针里,若原来链表里没有元素,则将此作为第一个元素;若原来的链表里有元素,则将指向头结点指
结束
针存储的学号与头指针下一个的学号大小进行比较,小的在前大的在
后,之后指向头结点处的指正后
移,进行比较,直到尾结点为止在进行比较的while 函数,每比较一次,计算总人数的TOTAL_NU自M加。
(3)Display 浏览函数:
将传给Display 函数的指针P 所指向的结构体的各项数据输出以便核对信息。
(4)DisplayAll 浏览函数:
指针指向链表头结点,在if 语句中嵌套do-while 语句将学生信息按学号从大到小进行逐一输出。
(5)Query 查询函数:
首先使用switch 语句生成菜单,实现操作选择功能。分三个部分按学号查询、按姓名查询和取消返回上一层。按学号查询时调用while 语句对学号检索,再调用if 语句进行判断,最后输出想要查询的信息。按姓名查询的方法跟按学号查询的一样。
(6)Del 删除函数:
使用while 语句进行检索,直接删除学生信息。
(7)Change修改函数:
建立devise 函数,生成菜单,用switch 语句进行分叉选择功能,选择项目进行相应的信息输入。在Change 函数中使用while 语句进行检索后再调用devise 函数修改信息。实现学生信息修改。
四、调试与测试
1、进行多次运行,发现那栏的一打长就会显示一样的数字,打短的数字就可以。我们原本是使用长整型来定义,想说空间不够,后来改用
字符型,用字符串记录
程序运行结果正确
2、程序设计初就在考虑退出与返回有什么差别,如果返回了主菜单那退出用什么,关于这个问题看了许多网上的资料,发现许多程序都有exit ( 0)的函数,所以去查了不少关于exit 的函数容,最后退出就用了exit(0), 但是又提醒说要编写exit 函数,之后发现要加入
3、程序在180 行显示说readData 函数不可以返回值,所以在if 条件
句中将return 0 删除了,不过这个程序在学校的机房即使不删return 0 也是可以运行的,关于这点很是不解,还有待解决。
五、测试结果
1、进入系统界面,输入密码,超过三次会自动退出。
2、选 1 时录入学生信息,编辑完后会继续显示菜单
3、选 2 浏览学生信息,之后继续返回菜单界面,为节省空间菜单界面暂不截图
4、选择 3 查询学生信息会有按学号与按姓名查询。下图是先按学号查询的截图。
5、按姓名查询时,如果查无此人会显示“没有该学生信息,请核对。”之后返回上一层,按姓名查询。显示学生信息后可以选择取消返回主菜单。
6、选择 4 删除学生,输入学号删除学生的信息。之后会返回主菜单
7 选择 5 修改学生信息,按学号输入,之后按显示输入即可。
用几组测试数据进行测试算法设计的正确性。(附上程序运行的截图)
六、用户手册
1 程序一开始会显示欢迎界面,按要求输入密码, 3 次错误会退出程序
2 密码正确后会显示主菜单,按要求输入您的需求。
七、附录
源程序清单和结果:源程序要加注释。结果要包括测试数据和运行结果。/* Note:Your choice is C IDE */
#include
#include
#include
#define LEN sizeof ( struct student) #define FILE_DATA_PATH"
c:\student.txt" struct student
{ long int num;
char name[20];
int age;
char sex[4];
char birthday[10];
char address[30];
char tele_num[13];
char E_mail[20];
struct student * next; };
int TOTAL_NUM= 0;
struct student *head = NULL;
void welcome();
void mainmenu();
void record();
void insert( struct student * stu); void display( struct student *
stu); void displayAll(); void query();
void query_by_num(); void query_by_name();
void readData();
void writeData();
void freeAll();
void del();
void change();
void devise( struct student *p); int main() {
char userPWD[7]; int i; welcome();
for (i = 0;
< 3; i ++) {
i
printf( "\n 密码为123\n" );
printf( "\n 请输入您的密码:" );
scanf( "%s", userPWD);
if (strcmp(userPWD, "123" )==0)
密码正确,显示主菜单
{//
mainmenu(); break ; }
else
{ if (i < 2)
{ // 用户名或密码错误,提示用户重新输入printf( "
密码错误,请重新输入!" ); }
else { // 连续3次输错用户名或密
码,退出系统
print f( " 您已连续 3 次将密码输错,系统将退出!" );
}}
return 0; }// 显示欢迎
信息
void welcome()
{
printf( "+~~~~~~~~~~~~~~~~~~~~~~~~~~~+\n);
"
printf( "| |\n
"
)
;
printf( "| 欢迎使用学生信息管理系统|\n" );
printf( "| |\n
"
)
;
printf( "+~~~~~~~~~~~~~~~~~~~~~~~~~~~+\n);" }// 系统主
菜单
void mainmenu() { int choice; choice = -1;
readData()
;
温馨提示:为保证您的操作得到保存,请按正常顺
序退出系统
^_^\n" );
do
{printf
(
"\n\n\
n" );
printf
(
"\t\t\
t ----- ---------- \n"
printf
(
"\t\t\
t+
学生信息管理
系统
|\
n" printf
(
"\t\t\
t ----- ---------- \n"
printf
(
"\t\t\
t+ 1 -
录入学生信息
|\n" printf
(
"\t\t\
t+ 2 -
浏览学生信息
|\n" printf
(
"\t\t\
t+
3 - 查询学生信息|\n"
printf( "\ n
) ; ) ; ) ; ) ; ) ; ) ;
printf(
" 请输入学生的姓
名 :" );
Word 文档资料
printf( "\t\t\t+ 5 修改学生信息 |\n" );
printf( "\t\t\t+ 0 退出系统 |\n" ); printf( "\t\t\t ---------------- \n" ); printf( " 请输入您的选择: "); scanf( "%d", &choice); switch (choice) {
case 0: writeData(); freeAll();
exit(0);
case 1: record(); break ;
case 2: displayAll(); break ; case 3:
query();
break ;
case 4: del();
break ; case 5: change();
break ; defaul t : printf( "\n 无效选项 !"
);
break ; } }
while (choice != 0); }// 录入学生信息
p0 = ( struct student * )malloc(LEN);
printf( " 请输入学生的学号 :" ); scanf(
"%ld" , &p0-> num);
printf( "\t\t\t+ 4
删除学生信
息 |\n " )
;
void record() { struct student *p0;
void insert( struct student *stu) // 根据学号对学生进行排序 //
Word 文档资料
scanf( "%s",p0 -> name); printf( " 请输入学生的年
龄 :" ); scanf(
"%d", &p0-> age); printf( " 请输入学生的性
别 :" ); scanf(
"%s",p0 -> sex);
printf( " 请输入学生的出生年
月 :" ); scanf(
"%s",p0 -> birthday); printf( " 请输入学生的地
址 :" ); scanf( "%s",p0 -> address); printf( " 请输入学生的 :" ); scanf(
"%s",p0 -> tele_num);
printf( " 请输入学生的 E-mail:" );
scanf( "%s",p0 -> E_mail);
insert(p0);
printf(
" 该学生的信息为 :\n" );
printf( ^^^^^^^^^^^^^^^^^^^" );
printf(
"学号\t 姓名\t 年龄\t 性别\t 出生年月 \t\t 地址
\t\tE-mail\n" );
display(p0); }
struct student *p0, *p1, *p2; p1 = head;
p0 = stu;
if (head == NULL) { head = p0; p0 -> next = NULL; }
else { while ((p0 ->num > p1 -> num)&&(p1 -> next != NULL))
{ p2 = p1; p1 = p1 -> next; }
if (p0 -> num <= p1 ->
{ if (head == p1) head = p0;
num)
else p2 -> next = p0;
p0 -> next = p1; }
else { p1 -> next = p0; p0 -> next = NULL; } } TOTAL_NU+M+; }
void display( struct student *p){
printf( "%ld\t%s\t%d\t%s\t%s\t%s\t%s\t%s\n" , p-> num, p-> name, p-> age, p-> sex, p -> birthday, p -> address, p -> tele_num, p ->
E_mail); }// 浏览学生信
void displayAll() {
struct student *p;
printf( "学生总数:%d\n" , TOTAL_NUM);
p = head;
if (head != NULL) {
\t\tE-mail\n" );
printf( "\n 学号\t 姓名\t 年龄\t 性别\t 出生年月\t 地址
printf( "\n 学号\t 姓名\t 年龄\t 性别\t 出生年月 \t 地址
Word 文档资料
);
do { display(p); p
printf( "\n" ); }// 查询学生信
息 void query() { int choice;
choice = -1;
case 1:query_by_num(); break ; case 2:query_by_name(); break ; default : printf( "\n 无效选
项!" ); break ; } }
while (choice != 0); }// 按学号查询学生信息 void query_by_num() {
int num;
{
printf( "\n" ); printf ( "+ ---------- +\n" printf ( "| 按学号查询
请按 1
|\n" printf ( "| 按姓名查询
请按 2
|\n printf ( "| 取消 请按 0
|\n
printf ( "+ ---------- --+\n" printf (
" 请输入您的选择: "); scanf(
"%d",
&choice);
switc h (choice)
{ case
0:
do
)
; ); ); ); );
return
;
printf(
= p -> next; } while (p != NULL); }
struct student *p1;
printf( " 请输入学生的学号:");
scanf( "%ld" , &num);
if (head ==NULL) { printf( " 无学生记录!\n" ); return ; }
p1=head;
while (num!= p1-> num && p1 -> next != NULL) p1 =p1-> next;
if (num == p1 -> num) {
printf( "\n 学号\t 姓名\t 年龄\t 性别\t 出生年月\t 地址\t\tE-mail\n" );
printf( ^^^^^^^^^^^^^^^^^^^" );
display(p1); } else printf( "没有该学生记录,请核对!"); }// 按姓名查询学生信息
void query_by_name() { char name[20]; struct student *p1; printf( "请输入学生的姓名:");
scanf( "%s", name); if (head ==NULL) { printf( " 无学生记录!
\n" ); return ; } p1 =head;
while (strcmp(name, p1 -> name) && p1 -> next != NULL) p1 =p1-> next;
if ( ! strcmp(name, p1 -> name)) {