C语言课程设计学生信息管理系统

  • 格式:docx
  • 大小:75.64 KB
  • 文档页数:25

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->nextP 指针的学号与输入的是否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 函数,之后发现要加入<stdlib.h> 的头文件,程序可以正常运行。

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 <stdio . h>#include <malloc .h> #include <string .h> #include <io. h>#include <stdlib .h> #define NULL 0#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 ++) {iprintf( "\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); pprintf( "\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|\nprintf ( "+ ---------- --+\n" printf (" 请输入您的选择: "); scanf("%d",&choice);switc h (choice){ case0: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)) {printf( "\n 学号\t 姓名\t 年龄\t 性别\t 出生年月 \t 地址Word 文档资料);display(p1); }else printf( "没有该学生记录,请核对! "); }// 写入文件 voidwriteData(){ FILE * fp; // 文件指针struct student *p;fp = fopen(FILE_DATA_PATH, "w");if ( ! fp) { printf( " 文件打开错误! "); fprintf(fp, "%d\n" , TOTAL_NUM);for (p = head; p != NULL; p = p -> next) {fprintf(fp, "%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); }fclose(fp); } void freeAll() { struct student *p1, *p2; p1=p2=head;while (p1) { p2 =p1-> next; free(p1); p1 =p2; } }// 读取文件 void readData() { FILE * fp; // 文件指针struct student *p1, *p2;fp = fopen(FILE_DATA_PATH, "r" );if ( ! fp) { printf( " 文件打开错误! "); }\t\tE-mail\n" );printf(return ; }fscanf(fp, "%d\n" , &TOTAL_NUM);head = p1 = p2 = ( struct student * )malloc(LEN);fscanf(fp, "%ld\t%s\t%d\t%s\t%s\t%s\t%s\t%s\n" , &p1-> num, p1-> name, &p1-> age, p1 -> sex, p1 -> birthday, p1 -> address, &p1-> tele_num, p1-> E_mail);while ( ! feof(fp)){ p1 = ( struct student * )malloc(LEN);fscanf(fp, "%ld\t%s\t%d\t%s\t%s\t%s\t%s\t%s\n" ,&p1-> num, p1 -> name, &p1-> age, p1 -> sex, p1 -> birthday, p1 -> address, &p1-> tele_num, p1 -> E_mail); p2 -> next = p1; p2 = p1; }p2-> next = NULL; fclose(fp); }// 删除学生信息void del(){ struct student *p1, *p2;long int num;if (head == NULL){ printf (" 无学生记录!\n" );return ; }printf( " 请输入您要删除的学生的学号:"); scanf( "%ld" , &num);p1 = head;while (num != p1 -> num && p1 -> next != NULL) { p2 =p1;p1=p1-> next; }if (num==p1-> num){ if (p1 ==head)head=p1-> next;else p2 -> next =p1-> next;free(p1);TOTAL_NU--M; }else printf( " 没有该学生记录,请核对!\n" ); }// 修改学生信息void change() { struct student *p1, *p2; long int num;if (head == NULL){ printf( " 无学生记录!\n" );return ; }printf( " 请输入您要修改的学生的学号:");scanf( "%ld" , &num);p1 =head;while (num != p1-> num && p1 -> next != NULL){ p2 =p1; p1 =p1-> next; }if (num==p1-> num) devise(p1);else printf( " 没有该学生记录,请核对!\n" ); }void devise( struct student *p){ int choice;choice =-1;别:);scanf(%s", p -> sex);break ;Word 文档资料do " 请选择您要修改的学生的信息容: \n" );printf( "+ ------------- -- +\n"printf( "| 姓名 请按 1 |\nprintf( "| 年龄 请按 2|\nprintf( "| 性别请按 3|\nprintf( "| 出生年月 请按 4|\n printf( "| 地址 请按 5|\nprintf( "| 请按 6|\n" );printf( "| E-mail 请按 7|\nprintf("| 取消请按 0|\nprintf( "+------------- -- +\n" printf( " 请输入您的选择: ");scanf( "%d",&choice);switc h(choice){scanf( "%s", p -> name); break ; printf(); ); ); ); ); );); ); );case 1: printf(名: );case 0: return请输入新姓 case 2: printf(请输入新年 龄: ); scanf (%d", &p-> age); break ;case 3: printf(请输入新性 case 4: printf(请输入新出case 5: printf("请输入新地址:"); scanf( "%s", p -> address);break ;case 6: printf( "请输入新:"); scanf( "%s", &p-> tele_num);break ;case 7:printf("请输入新 E-mail :"); scanf( "%s", p -> E_mail);break ;default :printf("\n 无效选 项!" );break ; }} while (choice != 0); }生年月: ");scanf("%s", p -> birthday);break ;。