一、设计目的学会用C语言编程实现小区管理系统;能熟练的掌握各个功能函数的熟练编写和理解;二、设计内容小区管理系统设计:小区管理系统包括小区成员的所住单元、住户号、工作单位姓名、电话号码等信息;——小区管理系统主要提供以下功能:1.系统的登录界面(主要包括用户名、密码的设置、新用户的创建、密码的修改等);2.系统以菜单方式工作3.住户信息录入功能——输入4.住户信息浏览功能——显示5.住户信息查询、修改、增加功能(1)按姓名(2)按电话号码6.住户信息删除功能7.住户信息以文件方式保存、读取8.住户信息的统计三、概要设计1.功能模块图依据程序的数据结构和功能,遵照“自顶向下”原则,采用基于函数的逐步求精法,描述该程序的层次结构:main()主函数菜单(登录界面、主菜单)输入显示查询修改添加删除退出按姓名按号码信息保存信息读取排序2.各个模块功能的详细描述主函数:main();登录菜单:⑴.进入主菜单:menu();⑵.修改密码函数:repassword();⑶.登录界面函数:print1();⑷创建用户函数:usercreat();主菜单:⑴输入函数:head=create();⑵输出函数:print(head);⑶住户信息文件的保存函数:save_inf(head);⑷住户信息文件的读取函数:head=read_inf();⑸住户信息的查找函数:find(head);⑹住户信息的修改函数:re(head);⑺住户信息的删除函数:delete(head);⑻住户信息的添加函数:add(head);⑼信息的排序:sort(head);⑽住户信息的统计:count(head);四、详细设计1.功能函数的调用关系图Main()Print1()Menu()Repassword()Login()Usercreat()head=creat()print(head)find(head)re(head)delete(head)add(head)sort(head)save_inf()read_inf()count(head)2.各功能函数的数据流程图①输出函数print()的流程图○2输入函数create()的流程图开始执行while循环语句执行printf()语句结束开始Printf()提示语句;Scanf()语句输入数据执行While()语句○3执行查找函数find()流程图依次查找链表再执行scanf()语句结束开始执行while循环语句执行if判断语句结束○4执行修改函数re()的流程图○5执行删除函数delete的流程图开始执行while语句进行查找执行if语句进行判断执行while语句进行选择要修改的内容结束执行while进行查找要删除的节点开始If语句判断节点是否为空○6添加函数add的流程图结束开始执行scanf语句输入要添加的信息执行while语句查找添加的位置结束○7执行排序sort函数的流程图○63.重点设计及编码1)密码输入函数(实现密码能够再输错的情况下修改);编码:开始执行for循环统计节点的数目执行for循环节点一到尾部执行for循环找最大节点执行for循环给最后尾节点排序结束printf(\n\n**-----------请输入密码(6位)loginin:);for(i=0;i7;i++){mima[i]=getch();if(mima[i]=='\r')break;if(mima[i]=='\b'){printf(\b\b);i=i-2;}elseif(mima[i]!='\r')printf(*);}mima[i]='\0';2)从文件中实现一次读取:编码:fp=fopen(mima.txt,rt);while(fscanf(fp,%s%s,n,a)!=EOF){if(strcmp(mima,a)==0&&strcmp(root,n)==0)//进行判断是否一致{printf(\n\n***********恭喜你登录成功!***********\n);lead();break;}}fclose(fp);if(fp==NULL){printf(\n\n*-----抱歉登录指令错误,请选择(3)重新登录!-------*\n);}3)登录函数实现与主体函数的链接:编码:lead(){printf(***************-----欢迎进入登录界面-----*************************\n\n);printf(*-------------------------1.进入主菜单--------------------------------*\n);printf(*-------------------------2.修改密码----------------------------------*\n);printf(*-------------------------3.重新登录----------------------------------*\n);printf(*-------------------------4.创建用户----------------------------------*\n);printf(*-------------------------0.退出系统----------------------------------*\n);printf(***********************************************************************\n);}4)输入函数找准链表节点进行输入:编码:structperson*head,*p1,*p2;head=p2=(structperson*)malloc(N);/*head*p2都指向头结点*/printf(请输入:单元号户号姓名性别工作单位电话号码(输入户号0结束)\n);p1=(structperson*)malloc(N);scanf(%s%ld%s%s%s%s,p1-num,&p1-num1,p1-name,p1-sex,p1-com,p1-tel);while(p1-num1!=0){p2-next=p1;/*将新结点连接到表尾*/p2=p1;/*p2指向新的表尾*/p1=(structperson*)malloc(N);/*p1指向新申请的结点*/scanf(%s%ld%s%s%s%s,p1-num,&p1-num1,p1-name,p1-sex,p1-com,p1-tel);}p2-next=NULL;/*表尾结点next域置空*/free(p1);/*释放无效空间*/returnhead;}5)文件的保存函数与读取函数要保持一致:编码:for(stu=h-next;stu!=NULL;stu=stu-next)fprintf(fp,%s%ld%s%s%s%s\n,stu-num,stu-num1,stu-name,stu-sex,stu-com,stu-tel);/*格式化字符串写函数*/printf(\n文件已成功保存,按任意键返回!\n);getch();/*从键盘上输入一个字符但不会现在屏幕上*/fclose(fp);/*将文件所指的指针FP关闭*/}fscanf(fp,%s%ld%s%s%s%s\n,stu-num,&stu-num1,stu-name,stu-sex,stu-com,stu-tel);/*格式化字符读函数*/r-next=stu;r=stu;}r-next=NULL;/*尾指针置空*/fclose(fp);6)排序函数关键在找最大节点的位置时能记录前一节点的位置:编码:structperson*p,*pre1,*pre2,*r,*s;intcount=0,i;for(s=h;s-next!=NULL;s=s-next)/*统计节点数*/{count++;}for(s=h;s-next!=NULL;s=s-next);/*循环体语句为空,找尾节点*/for(i=1;icount;i++){pre1=h;/*pre1指向r前的一个节点*/pre2=h-next;/*pre2指向p前的一个节点*/r=pre1-next;p=pre2-next;while(p!=s)//不等于尾节点{if(p-num1r-num1){pre1=pre2;/*指针r始终指向数据较大的节点*/r=p;}pre2=pre2-next;//依次往下查找p=p-next;}pre1-next=r-next;//释放最大的节点r-next=s-next;//给s节点附上新的节点s-next=r;}for(p=s-next,pre1=s;s-num1p-num1;pre1=pre1-next,p=p-next);//给s节点后的进行排序h-next=s-next;//找到插入的位置s-next=p;pre1-next=s;printf(按任意键继续\n);getch();7)修改函数中要实现能对修改选项的选择:编码:while(p-next!=NULL){p=p-next;/*继续查找*/if(strcmp(p-name,name)==0){while(choice!=0)/*进行选择修改信息*/{printf(请输入要修改的选项:1.单位号2.房户号3.工作单位4.电话号码0:退出\n);printf(请选择(0--4):);scanf(%d,&choice);if(choice==1){printf(请输入新的单位号:);scanf(%s,p-num);}if(choice==2){printf(请输入新的房户号:);scanf(%ld,&p-num1);}if(choice==3){printf(请输入新的工作单位:);scanf(%s,p-com);}if(choice==4){printf(请输入新的电话号码:);scanf(%s,p-tel);}}}return1;}return0;8)删除函数关键在找要删除节点的位置:编码:while(p!=NULL){if(strcmp(p-name,name)==0)/*找到要删除的节点*/{p0-next=p-next;/*后续结点链接到前驱结点之后*/free(p);return1;}p0=p;/*移向指针继续查找*/p=p-next;9)添加函数关键在找到要添加的位置:编码:while(p0-next!=NULL&&p0-next-name==p-name)p0=p0-next;/*继续查找添加的位置*/if(p0-next!=NULL&&p0-next-name==p-name){free(p);/*释放新结点的存储空间*/return0;/*不添加就返回0*/}p-next=p0-next;/*后续结点连接到新结点之后*/p0-next=p;/*新节点连接到前驱接点之后*/10)统计函数在于实现住户单元号相同与不同的情况下的记录:编码:structperson*p;sort(h);i=0,j=0,dcount=0;drcount[j]=0;for(p=h-next,d[i]=p-num,dcount=1;p!=NULL;p=p-next){count++;//统计总人数if(d[i]!=p-num)//楼号不相等则继续查找{i++;d[i]=p-num;dcount++;j++;drcount[j]=1;//该栋楼人数加为1}elsedrcount[j]++;//统计每栋住户楼的人数}五、测试数据及结果1.正常数据及运行结果○1登录界面○2主菜单○3从文件中读取信息○4从键盘中输入信息○5住户信息的查找○6住户信息的删除○7住户信息的修改○8住户信息的添加2.异常测试数据及运行结果六.调试情况,设计技巧及体会1