.C语言上机实践报告专业:冶金工程班级:冶金1102姓名:学号:任课教师:丽华时间:2012年8月一、题目学生信息管理系统设计●学生信息包括:学号,姓名,年龄,性别,出生年月,地址,,E-mail等。
●试设计一学生信息管理系统,使之能提供以下功能:a)系统以菜单方式工作b)学生信息录入功能(学生信息用文件保存)---输入c)学生信息浏览功能---输出d)查询、排序功能---算法(1) 按学号查询(2) 按姓名查询e)学生信息的删除与修改(可选项)一、系统功能模块结构图二、数据结构设计及用法说明#include"stdio.h"#include"stdlib.h"#include"string.h"/*定义结构体用作创建链表*/typedef struct z1{char no[11]; //学生学号char name[15]; //学生姓名int age; //学生年龄char sex; //学生性别char birthday[8]; //学生出生年月char address[20]; //学生住址char tel[12]; //学生联系char e_mail[20]; //学生e-mailstruct z1 *next; //指向下一链表}STUDENT;/*声明用户自定义函数*/STUDENT *init();STUDENT *create();STUDENT *del(STUDENT *h);STUDENT *insert(STUDENT *h);STUDENT *revise(STUDENT *h);void print(STUDENT *h);void search1(STUDENT *h);void search2(STUDENT *h);void save(STUDENT *h);int menu_select();void inputs(char *prompt,char *s,int count);/*主函数,用于选择功能*/void main(){STUDENT *head;head=init(); //初始化链表表头for(;;){switch(menu_select()){case 0:head=init();break; //初始化case 1:head=create();break; //创建列表case 2:head=insert(head);break; //插入节点case 3:save(head);break; //以文件形式保存case 4:print(head);break; //显示case 5:search1(head);break; //搜索学号case 6:search2(head);break; //搜索姓名case 7:head=del(head);break; //删除case 8:head=revise(head);break; //修改case 9:exit(0); //退出程序}}}/*目录选择函数,返回用户输入的数字*/int menu_select(){char *menu[]={"************菜单************","0. 初始化链表","1. 输入学生信息","2. 插入学生信息","3. 保存学生信息","4. 显示学生信息","5. 按学号查找学生信息","6. 按姓名查找学生信息","7. 删除指定学号的学生信息","8. 修改指定学号的学生信息","9. 退出系统"};int c,i;for(i=0;i<=11;i++)printf(" %s\n",menu[i]);do{printf("\n请选择0~9中的某一个选项:\n");scanf("%d",&c);}while(c<0||c>10);return c;}/*初始化函数,作用是返回空指针初始化链表*/ STUDENT *init(){return NULL;}/*创建函数,输入学生信息*/STUDENT *create(){STUDENT *h=NULL,*info;for(;;){info=(STUDENT *)malloc(sizeof(STUDENT));if(!info){printf("\n存不足");return NULL;}inputs("输入学号:",info->no,11);if(info->no[0]=='@')break;inputs("输入姓名:",info->name,15);printf("输入年龄:");scanf("%d",&info->age);printf("输入性别编号(0.男1.女):");scanf("%s",&info->sex);printf("输入出生年月(XXXX/XX):");scanf("%s",info->birthday);inputs("输入地址:",info->address,20);inputs("输入:",info->tel,12);inputs("输入E-mail:",info->e_mail,20);info->next=h;h=info;}return h;}/*输入函数,用于判断输入的字符是否超出程序定义避免数据溢出*/ void inputs(char *prompt,char *s,int count){char p[255];do{printf(prompt);scanf("%s",p);if(strlen(p)>count)printf("\n太长了!\n");}while(strlen(p)>count);strcpy(s,p);}/*插入函数,插入学生成绩*/STUDENT *insert(STUDENT *h){STUDENT *p,*q,*info;char s[11];printf("请输入插入点的学生学号\n");scanf("%s",s);printf("\n请输入新的学生信息\n");info=(STUDENT *)malloc(sizeof(STUDENT));inputs("输入学号:",info->no,11);inputs("输入姓名:",info->name,15);printf("输入年龄:");scanf("%d",&info->age);printf("输入性别编号(0.男1.女):");scanf("%s",&info->sex);printf("输入出生年月(XXXX/XX):");scanf("%s",info->birthday);inputs("输入地址:",info->address,20);inputs("输入:",info->tel,12);inputs("输入E-mail:",info->e_mail,20);info->next=NULL;p=h;q=h;while(strcmp(p->no,s)&&p!=NULL){q=p;p=p->next;}if(p==NULL)if(p==h)h=info;elseq->next=info;else if(p==h){info->next=p;h=info;}else{info->next=p;q->next=info;}printf("\n已经插入了%s这个学生\n",info->name); return(h);}/*保存函数,以文件的形式保存学生信息*/void save(STUDENT *h){FILE *fp;STUDENT *p;char outfile[50];printf("请输入保存文件的文件名,例如c:\\f1\\te.txt:\n");scanf("%s",outfile);if((fp=fopen(outfile,"wb"))==NULL){printf("不能打开文件\n");exit(1);}printf("\n正在保存......\n");p=h;while(p!=NULL){fwrite(p,sizeof(STUDENT),1,fp);p=p->next;}fclose(fp);printf("------保存成功!!!------\n");}/*显示函数,显示学生信息*/void print(STUDENT *h){int i=0;STUDENT *p;p=h;printf("\n\n\n********************************学生*************************************\n");printf("|学号| 姓名|年龄|性别|出生年月| 地址| | E-mail |\n");printf("|--------|--------|----|----|--------|--------------|-----------|-------------|\n" );while(p!=NULL){i++;printf("|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|\n",p->no,p->name,p->age,p-> sex,p->birthday,p->address,p->tel,p->e_mail);p=p->next;}printf("***************************************end************************************ *\n");}/*搜索函数,按学号搜索学生信息并显示*/void search1(STUDENT *h){STUDENT *p;char s[11];printf("请输入你要查找的同学的学号\n");scanf("%s",s);p=h;while(strcmp(p->no,s)&&p!=NULL)p=p->next;if(p==NULL)printf("'n没有学号为%s的学生\n",s);else{printf("\n\n\n****************************找到了***************************************\n");printf("|学号| 姓名|年龄|性别|出生年月| 地址| | E-mail |\n");printf("|--------|--------|----|----|--------|--------------|-----------|-------------|\n" );printf("|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|\n",p->no,p->name,p->age,p-> sex,p->birthday,p->address,p->tel,p->e_mail);printf("***********************************end**************************************** *\n");}}/*搜索函数,按姓名搜索学生信息并显示*/void search2(STUDENT *h){STUDENT *p;char s[15];printf("请输入你要查找的同学的姓名\n");scanf("%s",s);p=h;while(strcmp(p->name,s)&&p!=NULL)p=p->next;if(p==NULL)printf("'n没有姓名为%s的学生\n",s);else{printf("\n\n\n*******************************找到了************************************\n");printf("|学号| 姓名|年龄|性别|出生年月| 地址| | E-mail |\n");printf("|--------|--------|----|----|--------|--------------|-----------|-------------|\n" );printf("|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|\n",p->no,p->name,p->age,p-> sex,p->birthday,p->address,p->tel,p->e_mail);printf("**************************************end************************************* *\n");}}/*删除函数,删除指定学号的学生信息*/STUDENT *del(STUDENT *h){STUDENT *p,*q;char s[11];printf("请输入要删除的学生的学号\n");scanf("%s",s);q=p=h;while(strcmp(p->no,s)&&p!=NULL){q=p;p=p->next;}if(p==NULL)printf("\n链表中没有学号为%s的学生\n",s);else{printf("\n\n\n********************************找到了***********************************\n");printf("|学号| 姓名|年龄|性别|出生年月| 地址| | E-mail |\n");printf("|--------|--------|----|----|--------|--------------|-----------|-------------|\n" );printf("|%-8s|%-8s|%4d|%4c|%8s|%14s|%11s|%13s|\n",p->no,p->name,p->age,p-> sex,p->birthday,p->address,p->tel,p->e_mail);printf("***************************************end************************************ *\n");printf("请按任意键删除\n");getchar();if(p==h)h=p->next;elseq->next=p->next;free(p);printf("\n已经删除学号为%s的学生\n",s);}return h;}/*修改函数,修改指定学号的学生信息*/STUDENT *revise(STUDENT *h){STUDENT *p,*q;char s[11];printf("请输入您希望修改的学生学号\n");scanf("%s",s);printf("\n 请输入新的学生信息\n");p=h;q=h;while(strcmp(p->no,s)&&p!=NULL){q=p;p=p->next;}inputs("输入学号:",p->no,11);inputs("输入姓名:",p->name,15);printf("输入年龄:");scanf("%d",&p->age);printf("输入性别编号(0.男1.女):");scanf("%s",&p->sex);printf("输入出生年月(XXXX/XX):");scanf("%s",p->birthday);inputs("输入地址:",p->address,20);inputs("输入:",p->tel,12);inputs("输入E-mail:",p->e_mail,20);return (h);}三、程序结构create()函数流程图menu_select()函数流程图init()函数的流程图inputs()函数流程图insert()函数流程图save()函数流程图search1()函数流程图del()函数流程图revise()函数流程图四、各模块的功能1)主函数:循环进行目录选择2)目录选择函数:输出目录,将用户输入的选择项返回给主函数3)初始化函数:返回空指针,对链表指针进行初始化4)创建函数:建立链表,输入学生信息5)输入函数:判断输入的字符是否超出数组定义避免数据溢出6)插入函数:在指定学号后建立新的结点插入新的学生信息7)保存函数:将链表中的信息以二进制文件的形式保存8)显示函数:以表格形式显示学生信息9)搜索函数1:按学号搜索学生信息并显示10)搜索函数2:按姓名搜索学生信息并显示11)删除函数:删除指定学号的学生信息12)修改函数:修改指定学号的学生信息五、试验结果1)初始界面2)输入学生信息3)显示学生信息4)插入学生信息5)删除学生信息6)修改学生信息7)按学号查找学生信息8)按姓名查找学生信息9)保存学生信息10)初始化链表11)退出系统六、设计中涉及的知识点●变量的定义、初始化和使用●结构体的定义、初始化和使用●数组的定义、初始化和使用●函数的定义、声明和使用●链表的创建、初始化、修改、删除和使用●文件的创建和使用●指针的使用●for循环、do while 循环、while 循环和switch 语句的使用●if语句的使用七、体会这是我第一次编写具有菜单功能的C程,所以参考了学生成绩管理系统的源程序。