C语言学生信息管理系统.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流C语言学生信息管理系统.精品文档.C语言课程设计报告学生姓名:田俊学生学号:0909090610所在班级: 电气信息0906课程设计题目: 学生信息管理系统一、 课程设计目标和要求: 巩固和加强C语言程序设计课程的理论知识。 掌握C语言的基本概念语法语义和数据类型的使用特点 学习并掌握C语言定义函数的基本方法、声明函数及调用函数的方法和过程。掌握文件和文件指针的概念以及文件的定义方法,认识文件打开、关闭、读、写等文件基本操作函数。了解指针和链表的概念,掌握指针的定义和使用指针变量的方法以及链表的正确用法。灵活使用链表来储存学生信息。掌握数组的定义、引用以及输入输出的方法、通过字符数组存储字符串,进一步使用字符串培养创新能力和创新思维培养良好的程序设计风格二、 课程设计报告的需求分析 设计出来的学生信息管理系统要实现以下功能:A 系统以菜单方式工作;B学生信息的录入(并用文件保存)C 学生信息的浏览功能D 查询(包括按学号和按姓名查询)E学生信息的查询和修改F 有一定容错能力,在输入错误时提示不合法,并要求重新输入。三、 程序的实现过程1 总体的设计通过菜单的形式,利用switch函数,将程序要实现的功能分为6个模块进行,然后分别对信息的录入,浏览,查询,修改,删除,和对出进行编写,并将信息写入文件,最后退出系统。2 模块功能的说明在设计的程序中,共设计了 Struct student/学生的结构体 welcome 通过一系列的输出函数,显示字符,以现实欢迎界面 main menu 通过 switch 函数 以选项的形式实现程序以菜单形式工作 record实现录入信息功能,分配内存空间,分别对 student 的结构体成员进行赋值并用链表指向这些成员 display 输出 学生的信息 displayAll 通过 do while 循环 分别输出所有学生的全部信息 query 实现查询的功能,通过switch 函数,进行选择(分别按学号进行查询调用 query_by_num 函数,按姓名进行查询,调用query_by_name 函数)Read data 读取文件Write data 通过链表,将信息写入文件Del 实现删除 学生信息的功能,并提示错误信息,(通过链表实现)Change 提示错误信息,用if else 实现,通过switch 函数 选择按 学号的方式修改或是通过( 调用devise函数)Tuichxitong 实现退出时的欢迎界面,并将学生信息存入文件,退出系统。流程图:调试与测试:如图, 首先,进入欢迎界面然后进入主界面:显示菜单选项然后录入信息浏览信息查询信息删除信息后重新录入信息后再修改后浏览,得到修改后的信息,最后退出系统。测试结果:经过上机调试,发现程序基本的功能都已实现,输入学生的信息,然后,修改,修改信息后存储到文件之中,删除信息等都得到了很好的实现。当然,程序本身还存在一些细节问题:比如在输入学号的时候,当学号前第一个数字是0 的时候,在输出的时候没有显示0,其次,在显示学生信息时,学生的各个信息并没有严格地对齐,使得界面不够美观。心得体会:在本次C语言课程设计的过程中,感受最深的是,我们培养了一种共同协作的能力。在刚开始大家都还没有头绪的时候,大家都会抽出时间一起学习有关链表和文件的内容,共同探讨一些弄不懂的地方。为之后程序的设计打下了一个很好的基础。接下来是各个模块的实现,大家首先是针对各自比较熟悉的模块部分提出了自己的见解,写出自己的代码,然后马不停蹄地上机调试,对于自己一个人没能弄懂的地方,在自己提出来之后,大家都会很友好地提出自己所认为的解决方案,并相互磋商,在大家的共同努力下,终于完整地实现了学生管理系统的全部功能。解决问题的能力得到了提高:自然,做任何事,都或多或少难免会碰到些自己没办法解决的问题,同样,在整个程序设计的过程中,我也遇到了些不小的麻烦,首先就是有关文件的部分,由于在一开始自学文件整个部分时候,并没有将课本读的很透彻,以至在想办法将输入的信息以文件形式存储的时候,总是出现一些错误,本想着和小组里的同学讨论下该怎么解决这个问题,可是,想了想,觉得或许自己可以独立解决这个问题,于是硬着头皮,将课本上文件部分的内容又翻来翻去地看了好几遍,才发觉其实是自己的疏忽造成的。其实,有些时候,看似很难的问题,其实,多一点独立思考,也许就解决了。另外,为了使整个程序趋于完美,我们也从网上找来了些类似 的程序,通过比较分析,发现了一些美中不足之处,然后,参照一些比较美观的程序界面做出了一些改进,使得学生管理系统的操作体验更好。这也使我明白,有时候,需要通过不断地比较才能从中找到差距,从而,不断改进,使得程序日趋完善。四、 附录:源程序如下:#include <stdio.h> #include <stdlib.h>#include <malloc.h> #include <string.h> #include <io.h> #define NULL 0 #define LEN sizeof(struct student) #define FILE_DATA_PATH "student.txt" struct student /建立一个学生的结构long int num; /学生人数char name20; /学生姓名int age; /年龄char sex4; /性别char birthday10; /生日char address30; /地址long int score; /成绩char E_mail20; /邮箱struct student *next; /指针指向学生结构int TOTAL_NUM = 0; /初始化总人数为0struct student *head = NULL; /指针指向的结构的首位为空 welcome(); mainmenu(); tuichuxitong(); record(); insert(struct student *stu); display(struct student *stu); displayAll(); query(); query_by_num(); query_by_name(); readData(); writeData(); freeAll(); del(); change(); devise(struct student *p); main() welcome(); mainmenu(); welcome() /显示欢迎信息 system("color 2e");printf("nnnnnnn");printf(" -【学生信息管理系统】-n");printf("n");printf("n");printf(" 制作人: 第一小组 n");printf("=n");printf(" welcome n");printf("n");printf(" n");printf("nnn"); printf("ttt+-+-+-+-+-+-+-+-+-+-+-+-+n"); printf("nnnnnnnnn");system("pause");system("cls"); mainmenu() /系统主菜单 system("color 3e");int choice; choice = -1; readData(); printf("nnn 温馨提示:为保证您的操作得到保存,请按正常顺序退出系统_n"); do printf("nnttt-n"); printf("ttt| 学生信息管理系统 |n"); printf("ttt-n"); printf("ttt| 1-录入学生信息 |n"); printf("ttt| 2-浏览学生信息 |n"); printf("ttt| 3-查询学生信息 |n"); printf("ttt| 4-删除学生信息 |n"); printf("ttt| 5-修改学生信息 |n"); printf("ttt| 0-退出系统 |n"); printf("ttt|*·*·*·*·*·*·*·*·*·*·|n"); printf("ttt-n"); printf("请输入您的选择:"); scanf("%d", &choice); switch(choice) case 0: writeData(); freeAll(); tuichuxitong();exit(0); case 1: record(); break; case 2: displayAll(); break; case 3: query(); break; case 4: del(); break; case 5: change(); break; default: printf("n无效选项!"); break; while(choice != 0); record() /录入学生信息 system("cls");struct student *p0; p0 = (struct student *)malloc(LEN); printf("nnn");printf(" 请输入学生的学号:"); scanf("%ld",&p0->num); printf("n");printf(" 请输入学生的姓名:"); scanf("%s",p0->name); printf("n");printf(" 请输入学生的年龄:"); scanf("%d",&p0->age); printf("n");printf(" 请输入学生的性别:"); scanf("%s",p0->sex); printf("n");printf(" 请输入学生的出生年月:"); scanf("%s",p0->birthday); printf("n");printf(" 请输入学生的地址:"); scanf("%s",p0->address); printf("n");printf(" 请输入学生的成绩:"); scanf("%ld",&p0->score); printf("n");printf(" 请输入学生的E-mail:"); scanf("%s",p0->E_mail); insert(p0); printf(" 该学生的信息为:n"); printf("-"); display(p0); system("pause");system("cls");mainmenu(); insert(struct student *stu) 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->num) if(head = p1) head = p0; else p2->next = p0; p0->next = p1; else p1->next = p0; p0->next = NULL; TOTAL_NUM+; display(struct student *p) printf("学号t 姓名t 年龄t 性别t 出生年月t 地址t 成绩t E-mailn"); printf("%ldt %st %dt %st %st %st %ldt %sn", p->num, p->name, p->age, p->sex, p->birthday, p->address, p->score, p->E_mail); displayAll() /浏览学生信息 struct student *p; system("cls");printf("nnn");printf(" 学生总数:%dn", TOTAL_NUM); p = head; if(head != NULL) printf("-"); do display(p); p = p->next; while(p != NULL); printf("n"); system("pause");system("cls");mainmenu(); query() /查询学生信息int choice; choice = -1; system("cls");do printf("nnn"); printf("tt+-+n"); printf("tt| 1-按学号查询 |nn"); printf("tt| 2-按姓名查询 |nn"); printf("tt| 0-取 消 |n"); printf("tt+-+nn"); printf("tt请输入您的选择:"); scanf("%d", &choice); switch(choice) case 0: system("cls");mainmenu();case 1: query_by_num(); system("pause");system("cls");query(); case 2: query_by_name(); system("pause");system("cls");query(); default: printf("n无效选项!"); break; while(choice != 0); query_by_num() /按学号查询学生信息 int num; struct student *p1; printf("请输入学生的学号:"); scanf("%ld", &num);if(head=NULL)printf("无学生记录!n"); p1=head; while(num!=p1->num && p1->next!=NULL) p1=p1->next; if(num = p1->num) printf("-"); display(p1); else printf("没有该学生记录,请核对!"); query_by_name() /按姓名查询学生信息 char name20; 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("-"); display(p1); else printf("没有该学生记录,请核对!"); writeData() /写入文件 FILE* fp;struct student *p; fp = fopen(FILE_DATA_PATH, "w"); if (!fp) return; fprintf(fp,"%dn", TOTAL_NUM); for(p = head; p!= NULL; p= p->next) fprintf(fp,"学号%ldt姓名%st年龄%dt性别%st出生年月%st地址%st成绩%ldtE-mail%sn", p->num, p->name, p->age, p->sex, p->birthday, p->address, p->score, p->E_mail); fclose(fp); freeAll() struct student *p1, *p2; p1=p2=head; while(p1) p2=p1->next; free(p1); p1=p2; readData() /读取文件 FILE* fp; struct student *p1, *p2; fp = fopen(FILE_DATA_PATH, "r"); if (!fp) return; fscanf(fp,"%dn", &TOTAL_NUM); head = p1 = p2 = (struct student *)malloc(LEN); fscanf(fp,"%ldt%st%dt%st%st%st%ldt%sn", &p1->num, p1->name, &p1->age, p1->sex, p1->birthday, p1->address, &p1->score, p1->E_mail); while(!feof(fp) p1 = (struct student *)malloc(LEN); fscanf(fp,"%ldt%st%dt%st%st%st%ldt%sn", &p1->num, p1->name, &p1->age, p1->sex, p1->birthday, p1->address, &p1->score, p1->E_mail); p2->next = p1; p2 = p1; p2->next = NULL; fclose(fp); del() /删除学生信息 struct student *p1, *p2; long int num; if(head = NULL) printf("无学生记录!n"); return; printf("nnt请输入您要删除的学生的学号:"); 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_NUM-; else printf("没有该学生记录,请核对!n"); system("cls"); change() /修改学生信息 struct student *p1, *p2; long int num; system("cls");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"); devise(struct student *p) int choice; choice = -1; do printf("n 请选择您要修改的学生的信息内容:n"); printf("+-+n"); printf("* 姓名 _请按 1 *n"); printf("* 年龄 _请按 2 *n"); printf("* 性别 _请按 3 *n"); printf("* 出生年月 _请按 4 *n"); printf("* 地址 _请按 5 *n"); printf("* 成绩 _请按 6 *n"); printf("* E-mail _请按 7 *n"); printf("* 取消 _请按 0 *n"); printf("+-+n"); printf("请输入您的选择:"); scanf("%d", &choice); switch(choice) case 0: system("cls");mainmenu();case 1: printf("nn 请输入新姓名:"); scanf("%s", p->name); system("pause");system("cls");break;case 2: printf("请输入新年龄:"); scanf("%d", &p->age); system("pause");system("cls");break;case 3: printf("请输入新性别:"); scanf("%s", p->sex); system("pause");system("cls");break;case 4: printf("请输入新出生年月:"); scanf("%s", p->birthday); system("pause");system("cls");break;case 5: printf("请输入新地址:"); scanf("%s", p->address); system("pause");system("cls");break;case 6: printf("请输入新成绩:"); scanf("%ld", &p->score); system("pause");system("cls");break;case 7: printf("请输入新E-mail:"); scanf("%s", p->E_mail); system("pause");system("cls");break;default: printf("n无效选项!"); break; while(choice != 0); tuichuxitong() system("cls");system("COLOR 3f");printf("nnnnn -【学生信息管理系统】-n");printf("n");printf("n");printf(" 制作人: 第一小组 n");printf("=n");printf(" Bye-Byen");printf("n");printf(" n");printf("n");printf(" n");printf(" n");printf("n");printf(" n");printf(" n");printf(" 中 电 n");printf(" 气 n");printf(" 南 信 n");printf(" 息 n");printf(" 大 0 n");printf(" 9 n");printf(" 学 0 n");printf(" 6 n");printf(" nnnn");printf(" 谢谢使用n");