西安郵電學院C语言课程设计报告书系部名称通信工程系学生姓名王子源专业名称通信工程专业班级通工0901班学号03091001指导教师衡霞2010年06月07日至时间2010年06月18日实验题目学生宿舍管理系统一、实验目的通过进行计算机实践,更加系统地理解和掌握C语言的基本概念、语言特点和编程技巧。
利用系统提供的标准函数和自定义函数进行程序设计,培养利用C语言设计综合程序的能力。
二、实验内容在熟练掌握C语言的基本知识:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。
进一步掌握各种函数的应用。
三、需求分析本学生信息管理系统包含输入记录,显示记录,按房间号排序并显示,按学号排序并显示,插入一条记录按学号排序并显示,按姓名查找,删除一条记录,查找并显示一个记录,查找并修改一个记录,从文件中读入数据,循环写入数据等功能.需求分析:输入记录(Input)显示记录(Display)按房间号排序并显示(Sort_by_roomnum)按学号排序并显示(Sort_by_num)插入一条记录按学号排序并显示(Insert_a_record)按姓名查找,删除一条记录(Delete_a_record)查找并显示一个记录(Query_a_record)查找并修改一个记录(Change_a_record)从文件中读入数据(AddfromText)循环写入数据(WritetoText)四.概要设计1.系统分析功能模块图:总目录以及下属的各个模块,这样可以使得程序的书写脉络清晰流畅。
程序结构图2、模块功能说明(1)输入记录模块(Input):用于输入学生的各项信息(2)显示记录模块(Display):按照输入的顺序显示出每个学生的各项信息(3)按房间号排序并显示模块(Sort_by_roomnum):按照房间号顺序显示每个学生信息(4)按学号排序并显示模块(Sort_by_num):按照学号顺序显示每个学生信息(5)插入一条记录按学号排序并显示模块(Insert_a_record):插入一条记录并按学号显示出所有记录。
(6)按姓名查找,删除一条记录模块(Delete_a_record):查找一个姓名,并删除该模块(7)查找并显示一个记录模块(Query_a_record):查找一条记录并显示该记录(8)查找并修改一个记录模块(Change_a_record):按姓名查找并修改某个其中一个记录模块(9)从文件中读入数据模块(AddfromText):用fscanf语句从文件读取信息(10)循环写入数据模块(WritetoText):用fprintf语句向已知(未知)文件读取信息,并返回读取信息五.详细设计及运行结果主程序流程图函数调用关系按房间号排序并显示按学号排序并显示插入一条记录并按学号排序按姓名查找删除一条记录查找并显示一个记录查找并修改一个记录从文件中读入数据循环写入数据源代码以及运行结果:程序设计编码见附录详细运行结果1)登陆界面输入密码:错误了,成功输入界面2)进入主菜单3)输入记录后显示记录4)按房间号排序5)学号排序6)插入记录并按学号排序7)删除记录8)查找并显示9)查找并修改记录修改成功文件及内容保存成功!文件读取成功!六、调试情况,设计技巧及体会测试数据原始数据:房间号床位号学号姓名班级性别146 045 03091002 haha 0908 man103 045 03091005 huha 0901 man235 004 03091033 dfgh 0902 woman102 045 03091055 woyu 0901 man165 008 03091065 tata 0904 man105 004 03091068 tagi 0902 woman113 008 03091088 jijk 0904 man458 008 03091089 aabb 0904 man404 004 03098656 shaz 0985 woman按房间号排序后数据:房间号床位号学号姓名班级性别102 045 03091055 woyu 0901 man103 045 03091005 huha 0901 man105 004 03091068 tagi 0902 woman113 008 03091088 jijk 0904 man146 045 03091002 haha 0908 man165 008 03091065 tata 0904 man235 004 03091033 dfgh 0902 woman404 004 03098656 shaz 0985 woman458 008 03091089 aabb 0904 man按学号排序后数据:房间号床位号学号姓名班级性别146 045 03091002 haha 0908 man103 045 03091005 huha 0901 man235 004 03091033 dfgh 0902 woman102 045 03091055 woyu 0901 man165 008 03091065 tata 0904 man105 004 03091068 tagi 0902 woman113 008 03091088 jijk 0904 man458 008 03091089 aabb 0904 man404 004 03098656 shaz 0985 woman个人总结通过这次的C语言程序设计,从总共两个星期的时间,其中选题花了我将近3天的时间,最终还是决定选择学生宿舍管理系统,紧接着就确定了功能模块,总共确立了十个功能模块,相对比较繁琐,但是由于时间还是比较紧的,所以没有能进一步修改。
这次程序设计过程中,我觉得最难的就是每个模块的逻辑分析过程,尤其是函数的返回值问题,例如,在数据添加后,用以下函数int Input(Student room[],int n) /*输入若干条记录*/{int i=0;char sign; /*x[10]为清除多余的数据所用*/while(sign!='n'&&sign!='N') /*判断*/{system("cls");printf("\t\t房间号:"); /*交互输入*/scanf("\t\t%s",&room[n+i].roomnum);printf("\t\t床位号:");scanf("\t\t%s",&room[n+i].bednum);printf("\t\t学号:");scanf("\t\t%s",&room[n+i].num);printf("\t\t班级:");scanf("\t\t%s",&room[n+i].classnum);printf("\t\t姓名:");scanf("\t\t%s",&room[n+i].name);printf("\t\t性别:");scanf("\t\t%s",&room[n+i].sex);printf("\t\t是否继续输入?(Y/N)");scanf("\t\t%c",&sign); /*输入判断*/i++;}return(n+i);}其中返回值是的是i还是i++我花费了很长时间才分析出来,最后还是在纸笔的计算下,完成了这个模块。
其次,在程序模块简化过程中,我也意识到了要熟练掌握C语言各项基本只是才能简化,例如,在排序模块中,一开始我用的是以下代码{strcpy(t,room[j+1].roomnum);strcpy(room[j+1].roomnum,room[j].roomnum);strcpy(room[j].roomnum,t);strcpy(t,room[j+1].bednum);strcpy(room[j+1].bednum,room[j].bednum);strcpy(room[j].bednum,t);strcpy(t,room[j+1].num);strcpy(room[j+1].num,room[j].num);strcpy(room[j].num,t);strcpy(t,room[j+1].name);strcpy(room[j+1].name,room[j].name);strcpy(room[j].name,t);strcpy(room[j+1].classnum,room[j].classnum);strcpy(room[j].classnum,t);strcpy(room[j+1].sex,room[j].sex);strcpy(room[j].sex,t);}然后再老师的提醒下,我才发现,可以定义另一个结构体Student t;然后用T= room[j];room[j]= room[j+1];room[j+1]=t简单三行就解决了上面的麻烦,这更让我领会到了C语言的魅力..另外,还学习到了system(“pause”);语句就是在屏幕上按任意键继续的意思,相当与{printf(“按任意键继续”);getch();}所以,我还有许多要改进的地方。
当然,我还更加体会到了团队的力量,当我有问题的时候要勇于和同学探讨问题,自己也要能帮助不明白的同学,在这样的情况下,大家才能更加熟练地学习自己还不懂得知识。
所以,这更是一个团队互相帮助的成果。
以后,要想把计算机方面的知识学好,一定要更加努力!!结束语这次C语言程序实习让我渐渐体会到了编程的乐趣,但是也意识到了自己的不足,一个人的成功是靠努力换来的,只有付出了,才会有收获!参考文献:《C语言程序设计》(第二版)王曙燕科学出版社最后,感谢机房各位老师对我的监督辅导!七、源程序清单(略)#include<stdio.h> /*引用库函数*/#include<stdlib.h>#include<ctype.h>#include<string.h>#include<conio.h>typedef struct /*定义结构体数组*/{char roomnum[4]; /*房间号*/char bednum[4]; /*床位号*/char classnum[10]; /*班级*/char num[10]; /*学号*/char name[20]; /*姓名*/char sex[10]; /*性别*/}Student;Student room1[1000]; /*结构体数组变量*/int menu_select() /*菜单函数*/{int c;do{system("cls"); /*运行前清屏*/printf("\t\t★★★★★★学生宿舍管理系统★★★★★★\n"); /*菜单选择*/printf("\t\t§1. 输入记录§\n");printf("\t\t§2. 显示记录§\n");printf("\t\t§3. 按房间号排序并显示§\n");printf("\t\t§4. 按学号排序并显示§\n");printf("\t\t§5. 插入一条记录按学号排序并显示§\n");printf("\t\t§6. 按姓名查找,删除一条记录§\n");printf("\t\t§7 查找并显示一个记录§\n");printf("\t\t§8 查找并修改一个记录§\n");printf("\t\t§9. 从文件中读入数据§\n");printf("\t\t§10. 循环写入数据§\n");printf("\t\t§0. 结束程序§\n");printf("\t\t★★★★★★★★★★★★★★★★★★★★\n");printf("\t\t请选择您要运行的选项按(0-10):");scanf("%d",&c); /*读入选择*/}while(c<0||c>10);return(c); /*返回选择*/}int Input(Student room[],int n) /*输入若干条记录*/{int i=0;char sign; /*x[10]为清除多余的数据所用*/while(sign!='n'&&sign!='N') /*判断*/{system("cls");printf("\t\t房间号:"); /*交互输入*/scanf("\t\t%s",&room[n+i].roomnum);printf("\t\t床位号:");scanf("\t\t%s",&room[n+i].bednum);printf("\t\t学号:");scanf("\t\t%s",&room[n+i].num);printf("\t\t班级:");scanf("\t\t%s",&room[n+i].classnum);printf("\t\t姓名:");scanf("\t\t%s",&room[n+i].name);printf("\t\t性别:");scanf("\t\t%s",&room[n+i].sex);printf("\t\t是否继续输入?(Y/N)");scanf("\t\t%c",&sign); /*输入判断*/i++;}return(n+i);}void Display(Student room[],int n) /*显示所有记录*/{int i;printf("\t\t------------------------------------------------------------\n"); /*格式头*/printf("\t\t房间号床位号学号姓名班级性别\n");printf("\t\t------------------------------------------------------------\n");for(i=1;i<n+1;i++) /*循环输入*/{printf("\t\t%-10s%-10s%-10s%-10s%-10s%-20s\n",room[i-1].roomnum,room[i-1].bednum,room[i-1].num,room[i-1].name,room[i-1].classnum,room[i-1].sex);}printf("\t\t");system("pause");}void Sort_by_num(Student room[],int n) /*按学号排序*/{int i,j;Student t;for(i=0;i<n-1;i++) /*冒泡法排序*/for(j=0;j<n-i-1;j++)if(strcmp(room[j].num,room[j+1].num)>0){t=room[j+1];room[j+1]=room[j];room[j]=t;}}void Sort_by_roomnum(Student room[],int n) /*按房间号排序*/{int i,j;Student t;for(i=0;i<n-1;i++) /*冒泡法排序*/for(j=0;j<n-1-i;j++)if(strcmp(room[j].roomnum,room[j+1].roomnum)>0){t=room[j+1];room[j+1]=room[j];room[j]=t;}}int Insert_a_record(Student room[],int n) /*插入一条记录*/{printf("\t\t学生房间号:"); /*交互式输入*/scanf("\t\t%s",&room[n].roomnum);printf("\t\t学生床位号:");scanf("\t\t%s",&room[n].bednum);printf("\t\t学生学号:");scanf("\t\t%s",&room[n].num);printf("\t\t学生姓名:");scanf("\t\t%s",&room[n].name);printf("\t\t学生班级:");scanf("\t\t%s",&room[n].classnum);printf("\t\t学生性别:");scanf("\t\t%s",&room[n].sex);n++;printf("\n");system("pause");Sort_by_num(room,n); /*调用排序函数*/printf("\t\t插入记录成功!\n"); /*返回成功信息*/return(n);}int Delete_a_record(Student room[],int n) /*按姓名查找,删除一条记录*/{char s[20];int i=0,j;printf("\t\t输入他(她)的姓名:"); /*交互式问寻*/scanf("%s",s);while(strcmp(room[i].name,s)!=0&&i<n) i++; /*查找判断*/if(i==n){printf("\t\t对不起没找到该学生!\n"); /*返回失败信息*/return(n);}for(j=i;j<n-1;j++) /*删除操作*/{room[j]=room[j+1];}printf("\t\t删除记录成功!\n"); /*返回成功信息*/return(n-1);}void Query_a_record(Student room[],int n) /*查找并显示一个记录*/{char s[20];int i=0;printf("\t\t输入他(她)的姓名:"); /*输入*/scanf("\t\t%s",&s);while(strcmp(room[i].name,s)!=0&&i<n) i++; /*查找判断*/if(i==n){printf("\t\t对不起没找到该学生!\n"); /*输入失败信息*/return;}printf("\t\t他(她)的房间号:%s\n",room[i].roomnum); /*输出该学生信息*/printf("\t\t他(她)的床位号:%s\n",room[i].bednum);printf("\t\t他(她)的学号:%s\n",room[i].num);printf("\t\t他(她)的班级:%s\n",room[i].classnum);printf("\t\t他(她)的性别:%s\n",room[i].sex);}void Change_a_record(Student room[],int n) /*查找并修改一个信息*/{ char s[20],m[4];int i=0;int c;printf("\t\t输入他的姓名:");scanf("\t\t%s",&s);while(strcmp(room[i].name,s)!=0&&i<n) i++;if(i==n){printf("\t\t对不起没找到该学生!\n");system("pause");return;}//dosystem("cls");printf("\t\t★★★★★★修改项目内容信息★★★★★★\n"); /*菜单选择*/printf("\t\t§1. 房间号§\n");printf("\t\t§2. 床位号§\n");printf("\t\t§3. 学号§\n");printf("\t\t§4. 姓名§\n");printf("\t\t§5. 班级§\n");printf("\t\t§6. 性别§\n");printf("\t\t★★★★★★★★★★★★★★★★★★★★\n");printf("\t\t请选择您要修改的选项按(0-6):");scanf("%d",&c); /*读入选择*/switch(c){case 1: printf("\t\t请输入你要修改后的房间号:");scanf("%s",&m);/*录入选择*/strcpy(room[i].roomnum,m);/*覆盖信息*/printf("恭喜你,修改成功!\n");system("pause");break;case 2: printf("\t\t请输入你要修改后的床位号:");scanf("%s",&m);strcpy(room[i].bednum,m);printf("恭喜你,修改成功!\n");system("pause");break;case 3: printf("\t\t请输入你要修改后的学号:");scanf("%s",&m);strcpy(room[i].num,m);printf("恭喜你,修改成功!\n");system("pause");break;case 4: printf("\t\t请输入你要修改后的姓名:");scanf("%s",&m);strcpy(room[i].name,m);printf("恭喜你,修改成功!\n");system("pause");break;case 5: printf("\t\t请输入你要修改后的班级:");scanf("%s",&m);strcpy(room[i].classnum,m);printf("恭喜你,修改成功!\n");system("pause");break;case 6: printf("\t\t请输入你要修改后的性别:");scanf("%s",&m);strcpy(room[i].sex,m);printf("恭喜你,修改成功!\n");system("pause");break;case 0: printf("\t\t安全退出修改系统!");system("pause");break;}}int AddfromText(Student room[],int n) /*从文件中读入数据*/ {int i=0;FILE *fp; /*定义文件指针*/char filename[20]; /*定义文件名*/printf("\t\t输入文件名:");scanf("\t\t%s",&filename); /*输入文件名*/if((fp=fopen(filename,"rt"))==NULL) /*打开文件*/{printf("\t\t无法打开该文件\n"); /*打开失败信息*/printf("\t\t");system("pause");return(n);}while(fscanf(fp,"%s%s%s%s%s%s",room[n+i].roomnum,room[n+i].bednum,r oom[n+i].num,room[n+i].name,room[n+i].classnum,room[n+i].sex)!=EOF)/*循环读入数据*/{i++;}fclose(fp); /*关闭文件*/printf("\t\t读入成功!\n");printf("\t\t");system("pause");return(n+i);}void WritetoText(Student room[],int n) /*将所有记录写入文件*/{int i=0;FILE *fp; /*定义文件指针*/char filename[100]; /*定义文件名*/ printf("\t\t输入文件名:"); /*输入文件名*/scanf("\t\t%s",&filename);if((fp=fopen(filename,"w"))==NULL) /*打开文件*/{printf("\t\t无法打开该文件\n");system("pause");return;}while(i<n){fprintf(fp,"%-10s%-10s%-10s%-10s%-10s%-10s\n",room[i].roomnum,room[i]. bednum,room[i].num,room[i].name, room[i].classnum,room[i].sex);i++;}fclose(fp); /*关闭文件*/printf("写入成功!\n"); /*返回成功信息*/}void main() /*主函数*/{int n=0,i,j;int c[3];for(i=0;i<3;i++){printf(" \n\n\n\t\t★★★★★★★★★★★★★★\n");printf(" \t\t============================\n\n");printf(" \t\t欢迎您进入学生宿舍管理系统!\n\n");printf(" \t\t请输入管理员密码(三位):");for(j=0;j<3;j++){c[j]=getch();printf("*");}getch();if (c[0]=='1'&&c[1]=='2'&&c[2]=='3'){printf("\n\t\t恭喜你登陆成功!");printf("\n");system("pause");break;}else{if(2-i==0){printf("对不起,错误达到三次,程序自动退出!");printf("\n");exit(1);}elseprintf("\n");printf("\n\t\t对不起,账号密码输入错误,请重新输入!(你还有%d 次机会)\n",2-i);system("pause");system("cls");}}for(;;){switch(menu_select()) /*选择判断*/{case 1:printf("\t\t输入记录\n"); /*输入若干条记录*/n=Input(room1,n);break;case 2:printf("\t\t显示记录\n"); /*显示所有记录*/Display(room1,n);break;case 3:printf("\t\t按房间号排序并显示\n");Sort_by_roomnum(room1,n); /*按房间号排序*/printf("\t\t排序成功!\n");Display(room1,n);printf("\t\t");break;case 4:printf("\t\t按学号排序并显示\n");Sort_by_num(room1,n); /*按学号排序*/printf("\t\t\t排序成功!\n");Display(room1,n);printf("\t\t");break;case 5:printf("\t\t插入一条记录按学号排序并显示\n");n=Insert_a_record(room1,n); /*插入一条记录*/system("cls");Display(room1,n);printf("\t\t");break;case 6:printf("\t\t按姓名查找,删除一条记录\n");n=Delete_a_record(room1,n); /*按姓名查找,删除一条记录*/printf("\t\t");system("pause");break;case 7:printf("\t\t查找并显示一个记录\n");Query_a_record(room1,n); /*查找并显示一个记录*/printf("\t\t");system("pause");break;case 8:printf("\t\t查找并修改一个记录\n");Change_a_record(room1,n);printf("\t\t"); /*查找并修改一个记录*/break;case 9:printf("\t\t从文件中读入数据\n");n=AddfromText(room1,n); /*从文件中读入数据*/printf("\t\t");break;case 10:printf("\t\t循环写入数据\n");WritetoText(room1,n); /*循环写入数据*/printf("\t\t");system("pause");break;case 0:printf("\t\t谢谢使用,祝您好运,再见!\n"); /*结束程序*/printf("\t\t");exit(0);}}}。