1题目与要求
1.1 问题提出
本人计划用C语言设计出模拟手机通信录管理系统,实现对手机中的通信录进行管理。
1.2 本系统涉及的知识点
结构、数组、循环、函数、分支
1.3 功能要求
我计划用C语言设计出模拟手机通信录管理系统,实现对手机中的通信录进行管理。(1)增加功能:能录入新数据(一个结点包括:姓名、电话号码、分类、电子邮件)。例如
杨春 135******** 商务类 chuny@https://www.doczj.com/doc/a59894230.html,
当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过200条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
(2)查看功能:选择此功能时,列出下列三类选择:
A 办公类
B 个人类
C 商务类,当选中某类时,显示出此类所有数据中的姓名和电话号码)
用户可以进一步根据序号或者姓名选择具体记录。
(3)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改。
(4)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
(5)存盘功能:对当前已经录入的通信录信息保存为通信录文件,同时还可以用户根据用户的选择对文件进行备份,并且所用提示词语很友好。
(6)打开文件:打开已经存在的通信录文件。
(7)采用DOS环境下的文本菜单界面。
2 功能设计
2.1 算法设计
利用void语句设计如图所示主菜单:
(1)光标模块。我的程序支持方向键控制光标,先定义,再利用指针做到。
(2)键盘模块。先定义Back、Esc、Enter等(具体请见程序),再用指针解决。(3)读文件模块。若不存在则新建并写入初始化后的数组,返回记录个数。涉及fopen、fclose和fread函数。
(4)增加记录模块。任意位置按Esc键退出,返回记录总数,并于主菜单显示增加的个数。
(5)删除记录模块。姓名重复则输入序号字符串再转化为整数,由于情况简单直接讨论。
(6)排序。涉及关系运算,循环语句,条件语句等。可按姓名或电话按升序排序,
图1
(7)修改记录。姓名重复输入序号字符串再转化为整数。
(8)显示所有。在程序开头部分已经声明,由pgup、pgdn、home、end键及上下键控制。
(9)查找记录。直接输入姓名或电话,则显示匹配内容,姓名为纯数字者不显示。(10)保存记录。若磁盘故障或已满则退出。在退出时显示友好提示字符。
图2
2.2 部分模块流程图
3 程序代码设计
1 读文件
(1)函数原形:readrecord(struct person psn[]),
(2)功能:利用if和for语句来编辑,逐个读入。
(3)变量及类型:int n,整形变量,记录通信录中的人数
struct person psn[],读取人名
(4)说明:此模块读文件,若不存在则新建并写入初始化后的数组,返回记录个数。
4 C程序设计总结
1 程序运行成功。
2 我在此次设计中学到很多以前不懂的知识,以及一些技巧。但是在其中也遇到了很多困难,比如循环方面的语句出错,多亏老师和同学的指导和帮助,以及查阅了一些资料,最终所有问题都解决了。
5 结束语
我真诚的感谢申艳梅老师,她以丰富的专业知识和耐心细致的教学态度展示了一个大学优秀教师的形象。每次我向她请教,她都不厌其烦真诚以待,让我记忆犹新。
参考文献
[1] 谭浩强,C程序设计(第二版),北京:清华大学出版社,2001.1
[2] 况湘玲,陈利,王祥编。C语言程序设计实训。北京:中国水利水电出版社,2001
[3] 张基温编著。新概念C语言程序设计。北京:中国铁道出版社,2003
[4] 顾元刚编著。C语言程序设计教程。北京:机械工业出版社,2004.6
附录:程序清单
#include
#include
#define Back 8
#define Enter 13
#define Esc 27
#define home 71
#define end 79
#define upkey 72
#define dnkey 80
#define pgup 73
#define pgdn 81
struct person{
char name[20];
char tel[20];
char eml[25];
char dpmnt[25];
};
int savstate=1;
int barup(int y)
{
if(y>=8)
{
int i;struct{unsigned char ch;unsigned char attr;}t;
for(i=4;i<=30;i++)
{ gettext(i,y,i,y,&t);t.attr=0x07;puttext(i,y,i,y,&t);}
y=y-2;
for(i=4;i<=30;i++)
{ gettext(i,y,i,y,&t);t.attr=0x70;puttext(i,y,i,y,&t);} }
return y;
}
int bardn(int y)
{
if(y<=18)
{
int i;struct{unsigned char ch;unsigned char attr;}t;
for(i=4;i<=30;i++)
{ gettext(i,y,i,y,&t);t.attr=0x07;puttext(i,y,i,y,&t);}
y=y+2;
for(i=4;i<=30;i++)
{ gettext(i,y,i,y,&t);t.attr=0x70;puttext(i,y,i,y,&t);} }
return y;
}
int rtnstr(char ary[],int l,int m)
{
int i,x,y; char ch;
for(i=0;i<=m;i++)
{ x=wherex();y=wherey();
if(i if(ary[i]==0) {getch(); i=i-1; continue;} } clreol(); if(i==m) do{ ch=getch(); if(ch==0)getch(); if(ch==Esc)return 0; if(ch==Enter){ary[m]='\0'; return 1;} if(ch==Back)break; gotoxy(x+m-i,y) ;clreol(); cprintf(" # Can't be more than %d letters.",m); gotoxy(x,y); }while(1); if(ary[i]==Esc)return 0; if(ary[i]==Back&&i==0) {i=i-1;continue;} if(ary[i]==Enter) { if(i>=l){ary[i]='\0';return 1;} else{ gotoxy(x+m-i,y); clreol(); cprintf(" # Can't be less than %d letters.",l); gotoxy(x,y); i=i-1; continue; } } if(ary[i]==Back&&i>0||ch==Back) {gotoxy(x-1,y); clreol(); i=i-2; ch=0; continue;} if(m==3||(l==7&&m==12)){if(ary[i]<48||ary[i]>57){i=i-1;continue;}} putchar(ary[i]); } } int readrecord(struct person psn[],int n) { int i,rcd=1; FILE *fp; if((fp=fopen("C:\\zhyx.c","rb"))==NULL) { rcd=0;if((fp=fopen("C:\\zhyx.c","wb"))==NULL) { printf(" Cannot open file!"); return n; } } if(rcd==0) for(i=0;i<200;i++)fwrite(&psn[i],sizeof(struct person),1,fp); else for(i=0;i<200;i++) { fread(&psn[i],sizeof(struct person),1,fp);if(psn[i].name[0]=='\0')break;n++; } fclose(fp); printf(" There are %d records now.\n Records in C://TelephoneBook.c",n); return n; } int add(struct person psn[],int n) { int i,cnt=1;int t=n; while(n<100) { clrscr(); printf("\n\nAdded %d.\nPlease input the information,Esc back to menu:\n\n\n\n",n-t); printf("name:"); cnt=rtnstr(psn[n].name,2,20);if(cnt==0)break; printf("\n\nphonenumber:"); cnt=rtnstr(psn[n].tel,7,20);if(cnt==0)break; printf("\n\nemail:"); cnt=rtnstr(psn[n].eml,7,25);if(cnt==0)break; printf("\n\ndepartment:"); cnt=rtnstr(psn[n].dpmnt,2,25);if(cnt==0)break; printf("\n\nRecord added successfully!"); n++; }if(n==200){ printf("\n\nThe record number has reached 200,can't add any more!");getch(); } clrscr();if(cnt==0)psn[n]=psn[n+1]; if(t!=n){savstate=0;if(n-t!=1) printf(" Added %d records.\n",n-t);else printf(" Added a new record.\n");} return n; } int delete(struct person psn[],int n) { int i,indx,num=0,cnt=1; char ch; char str[14]; printf("\n\n\n\nDelete name:"); cnt=rtnstr(str,2,13);str[13]='\0'; if(cnt==0) {clrscr();return n;} printf("\n"); for(i=0;i { num++; printf("\n%-2d %-14s %-15s %-23s %-22s",i,psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt); if(num==1)indx=i; } if(num==1){ printf("\n\nFind a record. Delete it(Y/N)?:"); do{ ch=getch(); if(ch=='Y'||ch=='y'){ clrscr();printf(" Deleted a record! name: %s",str); for(i=indx;i } else if(ch=='N'||ch=='n'){clrscr();return n;} }while(1); } if(num>1){ printf("\n\nFind %d recods.Input the number before a record to delete it:\n\n",num); cnt=rtnstr(str,1,3);if(cnt==0){clrscr();return n;} cnt=strlen(str);if(cnt==3) {clrscr();printf(" Index error!");return n;} if(cnt==1)cnt=str[0]-48; else if(cnt==2)cnt=(str[0]-48)*10+str[1]-48; if(cnt { clrscr();printf(" Deleted a record! name: %s",psn[indx].name); for(i=cnt;i } else {clrscr(); printf(" Index error!"); return n;} } clrscr(); printf(" The name %s do not exist!",str); return n; } void order(struct person psn[],int n) { char ch; printf("\n\npress F to order by name,S by phonenumber.\n"); do { ch=getch(); if(ch==Esc)break; }while(ch!='f'&&ch!='F'&&ch!='s'&&ch!='S'); if(ch=='f'||ch=='F') { int i,j,k; struct person temp; for(i=0;i { k=i;for(j=i+1;j if(k!=j){temp=psn[i];psn[i]=psn[k];psn[k]=temp;} }clrscr(); printf("\n Ordered by name."); savstate=0;return; } if(ch=='s'||ch=='S') { int i,j,k; struct person temp; for(i=0;i { k=i;for(j=i+1;j if(k!=j){temp=psn[i];psn[i]=psn[k];psn[k]=temp;} }clrscr(); printf("\n Ordered by phonenumber."); savstate=0;return; }clrscr(); } void modify(struct person psn[],int n) { int i,indx,num=0,cnt=1; char str[14]; struct person temp; printf("\nPlease input the friend's name:"); cnt=rtnstr(str,2,13);str[13]='\0'; if(cnt==0) {clrscr();return;} printf("\n"); for(i=0;i { num++; printf("\n%-2d %-14s %-15s %-23s %-22s",i,psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt); if(num==1)indx=i; } if(num==1) { temp=psn[indx]; printf("\n\nPlease input new information,Esc back to menu:\n\n"); printf("name:"); cnt=rtnstr(psn[indx].name,2,13);if(cnt==0){psn[indx]=temp;clrscr();return;} printf("\n\nphonenumber:"); cnt=rtnstr(psn[indx].tel,7,12);if(cnt==0){psn[indx]=temp;clrscr();return;} printf("\n\nemail:"); cnt=rtnstr(psn[indx].eml,7,21);if(cnt==0){psn[indx]=temp;clrscr();return;} printf("\n\ndepartment:"); cnt=rtnstr(psn[indx].dpmnt,2,21);if(cnt==0){psn[indx]=temp;clrscr();return;} } if(num>1){ printf("\n\nFind %d recods.Input the number before a record to modify it:\n\n",num); cnt=rtnstr(str,1,3);if(cnt==0){clrscr();return;} cnt=strlen(str);if(cnt==3) {clrscr();printf(" Index error!");return;} temp=psn[indx]; if(cnt==1)indx=str[0]-48; if(cnt==2)indx=(str[0]-48)*10+str[1]-48; if(indx { temp=psn[indx]; printf("\n\nPlease input new information,Esc back to menu:\n\n"); printf("name:"); cnt=rtnstr(psn[indx].name,2,13);if(cnt==0){psn[indx]=temp;clrscr();return;} printf("\n\nphonenumber:"); cnt=rtnstr(psn[indx].tel,7,12);if(cnt==0){psn[indx]=temp;clrscr();return;} printf("\n\nemail:"); cnt=rtnstr(psn[indx].eml,7,21);if(cnt==0){psn[indx]=temp;clrscr();return;} printf("\n\ndepartment:"); cnt=rtnstr(psn[indx].dpmnt,2,21);if(cnt==0){psn[indx]=temp;clrscr();return;} } else {clrscr(); printf(" Index error!"); return;} } clrscr(); if(num>0){printf(" Modified a record! name:%s->%s",https://www.doczj.com/doc/a59894230.html,,psn[indx].name);savstate=0;n--;} else printf(" The name %s do not exist!",str); } void print(struct person psn[],int n) { int i,k=0,l=0,j=n/10+(n%10?1:0); char ch; do { printf("\n name:: phonenumber:: email:: department::\n\n"); for(i=k*10+l;i<(k+1)*10+l;i++) { if(i==n)break; printf(" %-14s %-15s %-23s %-22s\n\n",psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt); } if(l%10==0) {gotoxy(1,24);cprintf(" Press Esc back to menu. page %d / %d ",k+l/10+1,j);} else {gotoxy(1,24);cprintf(" Press Esc back to menu. (%d pages)",j);} do { ch=getch(); if(ch==0) { ch=getch(); if(ch==pgdn&&((k+1)*10+l if(ch==pgup&&(k*10+l>=10))k--;else if(ch==pgup)ch=home; if(ch==home){k=0;l=0;} if(ch==end){k=j-1;l=0;} if(ch==upkey&&(k*10+l>0))l--; if(ch==dnkey&&(k*10+l break; } }while(ch!=Esc); if(ch==Esc) break;clrscr(); }while(1);clrscr(); } void find(struct person psn[],int n) { int i,num=0,cnt=1; char str[15]; printf("\n\n\n Please input the name or phonenumber you want to find:\n\n"); printf(" name or phone:"); cnt=rtnstr(str,2,14);str[14]='\0'; if(cnt==0)return; for(i=0;str[i]!='\0';i++) if(str[i]<48||str[i]>57) { for(i=0;i if(strcmp(psn[i].name,str)==0) { num++; if(num==1)printf("\n\n name:: phonenumber:: email:: department::\n\n"); printf(" %-14s %-15s %-23s %-22s\n\n",psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt); } if(num==0) {clrscr();printf("Can't find any record in accordance with %s!",str);return;} gotoxy(2,24); cprintf("Press any key to cotinue."); getch(); clrscr(); return; } for(i=0;i if(strcmp(psn[i].tel,str)==0) { num++; if(num==1)printf("\n\n name:: phonenumber:: email:: department::\n\n"); printf(" %-14s %-15s %-23s %-22s\n\n",psn[i].name,psn[i].tel,psn[i].eml,psn[i].dpmnt); } if(num==0) {clrscr();printf("Can't find any record in accordance with %s!",str);return;} gotoxy(2,24); cprintf("Press any key to cotinue."); getch(); clrscr(); return; } void save(struct person psn[],int n) { FILE *fp; int i; if(savstate==1)return; if((fp=fopen("C:\\zhyx.c","wb"))==NULL) { printf(" Cannot open file!");return; } for(i=0;i<=n;i++) if(fwrite(&psn[i],sizeof(struct person),1,fp)!=1) {printf(" File error!");fclose(fp);return;} savstate=1;printf(" Records saved!"); fclose(fp); } main() {int i,n=0,ex=0,y=8; char ch; struct person psn[100]; for(i=0;i<100;i++) { strcpy(psn[i].name,"\0"); strcpy(psn[i].tel,"\0"); strcpy(psn[i].eml,"\0"); strcpy(psn[i].dpmnt,"\0"); } n=readrecord(psn,n); do { gotoxy(2,4); cprintf("################################# D"); gotoxy(2,5); cprintf("# # e"); gotoxy(2,6); cprintf("# A: add new records. # s "); gotoxy(2,7); cprintf("# # i "); gotoxy(2,8); cprintf("# D: delete certain records. # g"); gotoxy(2,9); cprintf("# # n H L"); gotoxy(2,10);cprintf("# O: order them. # e a i"); gotoxy(2,11);cprintf("# # d n C n"); gotoxy(2,12);cprintf("# M: modify a record. # b h Q "); gotoxy(2,13);cprintf("# # y u l i "); gotoxy(2,14);cprintf("# P: print all. # a i n "); gotoxy(2,15);cprintf("# # n a g "); gotoxy(2,16);cprintf("# F: find certaen records. # n "); gotoxy(2,17);cprintf("# # g "); gotoxy(2,18);cprintf("# S: save. # ^_^ ^o^"); gotoxy(2,19);cprintf("# #"); gotoxy(2,20);cprintf("# Esc: exit. #"); gotoxy(2,21);cprintf("# #"); gotoxy(2,22);cprintf("#################################"); y=8;y=barup(y); gotoxy(2,24);cprintf("Please choose a menu from the table above."); do { ch=getch(); if(ch==0) {ch=getch(); switch(ch) { case upkey: y=barup(y);ch=0;break; case dnkey: y=bardn(y);ch=0; } } if(ch==Enter) {switch(y) { case 6: ch='a';break; case 8: ch='d';break; case 10: ch='o';break; case 12: ch='m';break; case 14: ch='p';break; case 16: ch='f';break; case 18: ch='s';break; case 20: ch=Esc;break; } } switch(ch) { case 'a': case 'A': { clrscr(); n=add(psn,n); ch=Enter; break; } case 'd': case 'D': { clrscr(); n=delete(psn,n); ch=Enter; break; } case 'o': case 'O': { clrscr(); order(psn,n); ch=Enter; break; } case 'm': case 'M': { clrscr(); modify(psn,n); ch=Enter; break; } case 'p': case 'P': { clrscr(); print(psn,n); ch=Enter; break; } case 'f': case 'F': { clrscr(); find(psn,n); ch=Enter; break; } case 's': case 'S': { clrscr(); save(psn,n); ch=Enter; break;