c语言及数据结构与算法课程设计报告.doc
福建工程学院软件学院c语言及数据结构与算法课程设计题目 : 学生信息管理系统 专 业: 物联网工程1401班 姓 名: 学 号: 同组其他学生(学号): 26 56 57 2015年6月24 日目 录一、需求分析3二、总体设计3三、详细设计3四、调试与测试3五、测试结果3六、用户手册3七、附录3一、需求分析问题描述学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一学生信息管理系统,使之能提供以下功能:n 系统以菜单方式工作n 学生信息录入功能-输入n 学生信息浏览功能-输出n 查询、排序功能-算法按学号查询、按姓名查询、学生信息的删除与修改(可选项)(2)功能要求界面比较美观;有一定的容错能力,比如输入的成绩不在0100之间,就提示不合法,要求重新输入;最好用链表的方式实现。二、总体设计开始主菜单主菜单选择语句switch(a)删除学生信 息退出系 统修改学生信 息查询学生信 息浏览学生信 息录入学生信息函 数0542311录入信息 按提示,录入学生信息选择是否继续输入学生信息 Y N返回主菜单 2浏览学生信息 输出之前保存的所有学生信息返回主菜单3查询学生信息 输入已保存的学生学号提示输入有误输入是否正确N Y 输出符合学号的学生信息返回主菜单删除学生信息4输入已保存的学生学号输入是否正确Y提示输入有误删除已保存的学生信息N返回主菜单5修改学生信息输入已保存的学生学号提示输入有误输入是否正确N Y选择修改的内容修改的新内容直至取消修改返回主菜单三、详细设计各调用函数的设计与运行情况:(/录入学生信息void record () struct student *p0; p0 = (struct student *)malloc(LEN); printf ("请输入学生的姓名:"); scanf ("%s",p0->name); printf ("请输入学生的学号:"); scanf ("%ld",&p0->num); printf ("请输入学生的性别:"); scanf ("%s",p0->sex); printf ("请输入学生的年龄:"); scanf ("%d",&p0->age); printf ("请输入学生的地址:"); scanf ("%s",p0->address); printf ("请输入学生的电话:"); scanf ("%lf",&p0->tele_num); printf ("请输入学生的E-mail:"); scanf ("%s",p0->E_mail); insert (p0); printf ("该学生的信息为:n"); printf ("-n"); printf ("姓名t学号t年龄t性别t地址tt电话ttE-mailn"); display (p0);void 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+;void display (struct student *p) printf ("%st%ldt%dt%st%st%.0ft%sn", p->name, p->num, p->age, p->sex, p->address, p->tele_num, p->E_mail);/浏览学生信息void displayAll() struct student *p; printf("学生总数:%dn", TOTAL_NUM); p = head; if (head != NULL) printf("n姓名t学号t年龄t性别t地址tt电话ttE-mailn"); printf("-n"); do display(p); p = p->next; while(p != NULL); printf ("n");/按学号查询学生信息void query_by_num () int num; 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 ("姓名t学号t年龄t性别t地址tt电话ttE-mailn"); printf ("-n"); display (p1); else printf ("没有该学生记录,请核对!");/删除学生信息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_NUM-; 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; do printf("请选择您要修改的学生的信息内容: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: return; case 1: printf("请输入新姓名:"); scanf("%s", p->name); break; case 2: printf("请输入新学号:"); scanf("%d", &p->num); break; case 3: printf("请输入新性别:"); scanf("%s", p->sex); break; case 4: printf("请输入新年龄:"); scanf("%s", &p->age); break; case 5: printf("请输入新地址:"); scanf("%s", p->address); break; case 6: printf("请输入新电话:"); scanf("%lf", &p->tele_num); break; case 7: printf("请输入新E-mail:"); scanf("%s", p->E_mail); break; default: printf("n无效选项!"); break; while(choice != 0);模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等)四、调试与测试设计一个程序,错误是难免不了的。但我们可以根据编辑系统给出的一些提示去查看程序错误。对不敢肯定正确的,翻翻书,看一下这一知识。对难度大的就和同学们一起讨论,问一问老师。 开发一个系统,耐心是必要的,认真也很重要,构思要明确。认为是哪里错误的,有时用“/* */”注释起来进行,看看是否还有错误。常错有以下几种情况: 1.使用变量,但未有定义,则先定义。2.不该用分号的,用到了,把它去掉。3.行最后若有分号则删除,中间若有分号则改成逗号 4.若错误行中有if、while、for则要特别注意条件表达式的错误。 5.若条件表达式中只有一个等于号,则改成两个等于号。6.for中要用分号分隔表达式,而不是用逗号 7.缺少分号,若错误行中有语句没有用分号结束,则加上分号。 8.大小写不对,若错误行中有大写字母则一般都改成小写字母。 9.若有return语句则函数的类型必须与return后变量的类型一致。调试方法,测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施五、测试结果测试数据运行结果详见“三·具体设计”(程序运行的截图)六、用户手册按提示输入数据。七、附录源程序代码#include <stdio.h>#include <malloc.h>#include <string.h>#include <stdlib.h>#define NULL 0#define LEN sizeof(struct student)struct student char name20; long int num; char sex4; int age; char address30; double tele_num; char E_mail20; 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_by_num (); /按学号查询学生信息void readData (); /读取文件里学生的信息void writeData (); /向文件写入学生信息void freeAll (); /清空链表内容void del (); /删除学生信息void change (); /更改学生信息void devise (struct student *p); /选择更改内容int main (void) welcome (); /显示主菜单 mainmenu (); return 0;/显示欢迎信息void welcome () printf ("tn"); printf ("t n"); printf ("t 欢迎使用福建工软物联网1401班学生信息管理系统 n"); printf ("t n"); printf ("tn");/系统主菜单void mainmenu () int choice; choice = -1; readData (); printf("ntt请先创建database.txt文件以便于保存学生数据"); do printf ("nnn"); printf ("tt-n"); printf ("tt| 工软物联网1401班学生信息管理系统 |n"); printf ("tt-n"); printf ("tt| 1-录入学生信息 |n"); printf ("tt| 2-浏览学生信息 |n"); printf ("tt| 3-查询学生信息 |n"); printf ("tt| 4-删除学生信息 |n"); printf ("tt| 5-修改学生信息 |n"); printf ("tt| 0-退出系统 |n"); printf ("tt|*·*·*·*·*·*·*·*·*·*·*·*·*·*·*|n"); printf ("tt-n"); printf ("请根据您的需要输入对应的编号:"); scanf ("%d", &choice); switch (choice) case 0: writeData (); freeAll (); exit (0); case 1: record (); break; case 2: displayAll (); break; case 3: query_by_num (); break; case 4: del (); break; case 5: change (); break; default: printf ("n无效选项!"); break; while (choice != 0);/录入学生信息void record () struct student *p0; p0 = (struct student *)malloc(LEN); printf ("请输入学生的姓名:"); scanf ("%s",p0->name); printf ("请输入学生的学号:"); scanf ("%ld",&p0->num); printf ("请输入学生的性别:"); scanf ("%s",p0->sex); printf ("请输入学生的年龄:"); scanf ("%d",&p0->age); printf ("请输入学生的地址:"); scanf ("%s",p0->address); printf ("请输入学生的电话:"); scanf ("%lf",&p0->tele_num); printf ("请输入学生的E-mail:"); scanf ("%s",p0->E_mail); insert (p0); printf ("该学生的信息为:n"); printf ("-n"); printf ("姓名t学号t年龄t性别t地址tt电话ttE-mailn"); display (p0);void 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+;void display (struct student *p) printf ("%st%ldt%dt%st%st%.0ft%sn", p->name, p->num, p->age, p->sex, p->address, p->tele_num, p->E_mail);/浏览学生信息void displayAll() struct student *p; printf("学生总数:%dn", TOTAL_NUM); p = head; if (head != NULL) printf("n姓名t学号t年龄t性别t地址tt电话ttE-mailn"); printf("-n"); do display(p); p = p->next; while(p != NULL); printf ("n");/按学号查询学生信息void query_by_num () int num; 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 ("姓名t学号t年龄t性别t地址tt电话ttE-mailn"); printf ("-n"); display (p1); else printf ("没有该学生记录,请核对!");/写入文件void writeData () FILE* fp;/文件指针 struct student *p; fp = fopen("database.txt", "w"); if (!fp) printf("文件打开错误!"); return; fprintf(fp,"%dn", TOTAL_NUM); for(p = head; p!= NULL; p= p->next) fprintf(fp,"%st%ldt%st%dt%st%.0ft%sn", p->name, p->num, p->sex, p->age, 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("database.txt", "r"); if (!fp) printf("文件打开错误!"); return; fscanf(fp,"%dn", &TOTAL_NUM); head = p1 = p2 = (struct student *)malloc(LEN); fscanf(fp,"%st%ldt%st%dt%st%lft%sn", p1->name, &p1->num, p1->sex, &p1->age, p1->address, &p1->tele_num, p1->E_mail); while(!feof(fp) p1 = (struct student *)malloc(LEN); fscanf(fp,"%st%ldt%st%dt%st%lft%sn", p1->name, &p1->num, p1->sex, &p1->age, 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_NUM-; 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; do printf("请选择您要修改的学生的信息内容: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: return; case 1: printf("请输入新姓名:"); scanf("%s", p->name); break; case 2: printf("请输入新学号:"); scanf("%d", &p->num); break; case 3: printf("请输入新性别:"); scanf("%s", p->sex); break; case 4: printf("请输入新年龄:"); scanf("%s", &p->age); break; case 5: printf("请输入新地址:"); scanf("%s", p->address); break; case 6: printf("请输入新电话:"); scanf("%lf", &p->tele_num); break; case 7: printf("请输入新E-mail:"); scanf("%s", p->E_mail); break; default: printf("n无效选项!"); break;