《编程实习》报告
洪珊珊 20xx年09月13日 学院:专业:班级:学号:姓名:导师:
一、功能分析
1.1 需求概述
设计并实现一个通讯录管理工具软件,管理用户通信联系人的名片信息。名片包 含的主要信息有:姓名、地址、固定电话、手机、QQ等。
1.2 功能需求
1、系统启动时,如果不存在名片文件则视为首次运行,名片文件产生,此时需要输
入注册号(本设计中注册号采用设计者的学号),文件头包含用户注册号(8位)和名片数量。否则,需自动加载名片信息,并显示“欢迎(注册号),您共有N张名片!”的信息,其中“注册号”为注册号码,“N”为实际的名片数量。
2、显示全部名片功能。
3、添加新名片功能。添加新名片时,需要输入姓名的拼音缩写,如“张雨生”缩写
为“ZYS”。新名片信息中,姓名和单位是必须输入的。系统必须保证不会出现相同E-Mail的名片。
4、查询功能。可通过姓名查询,以及号码查询,显示时自动依次编号,如1、2、3、??。
在查询时,也可以显示所有的名片信息。
5、删除功能。对查询的结果,可以选择名片(输入编号)来删除该名片,删除前需
要确认。
6、修改功能。对查询的结果,可以选择名片(输入编号)来修改该名片。修改时逐
项修改,最后需要确认。
7、系统完成每个名片的添加、删除和修改后,需要及时保存到名片文件中,以防数
据的丢失。
8、采用文本文件自动记录操作日志。日志中包括3类操作:系统的启动和停止、用
户选择的功能、名片的操作。日志中的时间格式为:YYYY-MM-DD hh24:mm:ss。要求系统运行期间,日志文件依然能够打开查看。
1.3 功能的设计
1.1功能结构图
2
二、主要技术设计
2.1名片文件操作的实现技术
1、 Readfile:读取名片信息
2、 menu_select:显示主菜单
3、 Delete:将指定的名片从文件中删除
4、 onedelete:按姓名删除单个名片
5、 alldelete:删除全部名片
6、 Change:修改指定名片信息
7、 namechange:按姓名查找后修改名片信息
8、 telchange:按电话查找后修改名片信息
9、 addschange:按地址查找后修改名片信息 10、
11、
12、
13、
14、
15、
16、 Input:添加新名片 Find:按照用户的要求进行查询 namefind:按姓名查询名片 telind:按电话查询名片 addsfind:按地址查询名片 Display:显示所有通讯录信息 Save:对通讯录信息进行保存
2.2 通讯录内存的表示结构
struct Data
{
char name[10];
char tel[15]; char age[8]; char adds[20];
char qq[20];
};Data dat[200];
3
2.3 人机交互的设计技术
菜单选择界面:
格式化输出界面:
4
三、详细设计
3.1 名片文件的设计
数据项
姓名 char name[10]
电话 char tel[15]
年龄 char age[8]
地址 char adds[20]
QQ号 char qq[20]
3.2 系统启动的设计
3.1系统启动程序流程图
首先通过if((fp=fopen("cards.Dat","rb"))==NULL)判断是否是新用户。若是,在输入注册码后,建立新的通讯录。否则,自动加载名片信息,进入主菜单,并显示“欢迎(注册号),您共有N张名片!”的信息,其中“注册号”为注册号码,“N”为实际的名片数量。
5
3.3 添加名片的设计
3.2添加名片程序流程图
进入添加界面根据提示输入姓名,电话,年龄,地址及QQ号码,通讯录联系人数增加一个,完成后回答是否继续添加名片,回答Y进行循环,回答N返回主菜单。
6
3.4名片查询的设计
3.3名片查询程序流程图
细分为按姓名,电话和地址三种方式来进行查询名片,并能对查询记录不存在进行提示,遍历所有结构体找出符合的输出。 查询完成后提示是否继续查询,是则继续原来方式查询,否则返回主菜单。
7
3.5
首先选择单个删除或全部删除,单个删除要判断用户要删除的成员姓名是否存在,进行相
应的系统提示,然后遍历所有记录找出符合的删除,并将后面的所有数据向前移动一个位
置,记录数减一并返回。全部删除一次性删除所有名片,返回n为0.
8
3.6 修改名片的设计
3.5修改名片程序流程图
首先选择通过何种方式查找要修改的名片,以姓名为例,先判断用户要修改的成员姓名是否存在,进行相应的系统提示,然后遍历所有记录找出符合的,按照菜单选择不同的修改项目进行修改,返回记录值不变(没增加也没减少),修改结束后提示是否继续,Y为继续,N返回主菜单。
9
3.7 保存信息的设计
3.6保存信息程序流程图
每次名片信息变化就运行一次保存函数,先判断是否打开文件,再判断输入方式是否正确,保存完成后进入主菜单界面。
四、程序编码和调试
4.1 编译链接错误及其解决方法
错误一:
error C2601: 'Change' : local function definitions are illegal
error C2601: 'Readfile' : local function definitions are illegal
error C2601: 'Save' : local function definitions are illegal
error C2601: 'main' : local function definitions are illegal
由于粗心少加了个“}”,导致了一系列函数错误
10
错误二:
error C2562: 'Delete' : 'void' function returning a value
see declaration of 'Delete'
warning C4390: ';' : empty controlled statement found; is this the intent? warning C4390: ';' : empty controlled statement found; is this the intent? warning C4390: ';' : empty controlled statement found; is this the intent? 删除函数定义错误,应该用“int”,而不是“void”
4.2 系统错误及其调试方法
每次选择子程序操作完毕后,想要返回主菜单,却总是直接退出程序。
后来在主函数里添加了一个无限循环“for(;;){ }”,这个问题就解决了。
五、心得体会
通过此次的C++编程实习课学到了很多,对C语言也有了更好的了解,同时对C程序的操作和调试也有了进一步的掌握。尽管程序中的一部分是从网上复制过来的,但其中都加入了自己手动修改的元素,并且把一些以前不懂的弄懂了。
编译过程中经常出现各种各样的错误,以上罗列的只是其中很小的一部分,有的小错误却导致运行不出结果,使我纠结了半天,后来还是请教实验室的同学才解决的。我深切感受到调试程序的经验不足,在输入源代码时一定要仔细、认真。几天过后我对C语言渐渐的不再感到陌生,许多大一学的知识也都回忆起来了,后来调试中出现的错误基本都可以自己解决了。通讯录最基本的功能基本都实现了,但是还有很多需要完善的地方,比如说系统日志没有添加,只能说我能力不够,其他的功能也存在或多或少不尽如人意的地方。通过深切的感受到编程的辛苦,一个问题解决后又会冒出另一个问题,没有问题后又会去想给如何完善程序的各种功能,感觉永远都编不完似的。
一个星期很快就过去了,C++编程实习课也接近尾声了,我在发现问题然后解决问题的过程中体会到了不一样的快乐,特别是自己发现并解决的时候会有一种小小的成就感!虽然有时会为了一个小小的错误苦恼不已,但当解决后却是异常的兴奋!
现在回想来看这个通讯录程序并不是很复杂,但我却不能很顺利的完成,因此我还要好好的学习C语言,只有做了多了才会熟练。
11
六、源程序
#include<stdio.h> //标准输入、输出函数
#include<stdlib.h> //常用函数库
#include<string.h> //字符串处理函数
#include<conio.h>
struct Data
{
char name[10]; //姓名
char tel[15]; //电话 char age[8]; //年龄 char adds[20]; //地址 char qq[20]; //QQ号
};Data dat[200];
char c;
char Key[20];
int n=0; /*n为联系人个数*/ FILE *fp; /*指向文件的指针*/ char menu_select(); /*主菜单函数*/ int Input(Data dat[],int n); /*添加新联系人*/
void Display(Data dat[],int n); /*显示联系人*/
int Delete(Data dat[],int n); /*删除联系人*/
int onedelete(Data dat[],int n); /*删除单个联系人*/ int alldelete(Data dat[],int n); /*删除全部联系人*/
void Find(Data dat[],int n); /*查询联系人*/
void Change(Data dat[],int n); /*修改联系人信息*/ void Readfile(); /*读取文件*/
void Save(int n); /*保存文件*/
void namefind(Data dat[],int n); /*姓名查询联系人*/ void telfina(Data dat[],int n); /*电话查询联系人*/ void addsfind(Data dat[],int n); /*地址查询联系人*/ 12
void namechange(Data dat[],int n); /*按姓名查找后修改*/
void telchange(Data dat[],int n); /*按电话查找后修改*/
void addschange(Data dat[],int n); /*按地址查找后修改*/
/*************************主菜单*************************/
char menu_select()
{
}
/*************************添加新联系人函数*************************/ int Input(Data dat[],int n)
{
do{ system("cls"); printf("\n\t\t欢迎%s,您的通讯录中共有%d张名片\n",Key,n); printf("\n\t\t*******通讯录******* \n"); 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│ 0.退出程序 │\n"); printf("\t\t└────────┘\n"); printf("\t\t********************\n"); printf("\t\t请您选择(0-6):"); c=getchar(); }while(c<'0'||c>'6'); return(c-'0'); int i=0,j=0; char s[10]; 13
char ch,m; while(ch!='n'&&ch!='N') { printf("*********************添加新联系人**********************\n"); printf("\t姓名:"); scanf("\t%s",s); while(strcmp(dat[j].name,s)!=0&&j<n) } if(j==n) { strcpy(dat[n+i].name,s); printf("\t电话:"); scanf("\t%s",&dat[n+i].tel); printf("\t年龄:"); 14 j++; if(strcmp(dat[j].name,s) == 0) { printf("\n\t通讯录中已有此人!\n"); printf("\n\t是否继续添加?(Y/N)"); scanf("\t%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { } if(m!='n'&&m!='N') { } return(n); Input(dat,n); printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m);
} } } scanf("\t%s",&dat[n+i].age); printf("\t地址:"); scanf("\t%s",&dat[n+i].adds); printf("\tQQ号:"); scanf("\t%s",&dat[n+i].qq); i++; printf("\n\t是否继续添加?(Y/N)"); scanf("\t%c",&ch); while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y') { } printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&ch); printf("\n\t添加成功!\n"); return(n+i);
/*************************显示联系人函数*************************/
void Display(Data dat[],int n)
{
printf("***************************
**************************\n",n);
printf("┌─────────────────────────────┐共%d条记录int i; if(n!=0) { \n");
printf("│ 姓名 │ 电话 │ 年龄 │ 地址 │ QQ │15
\n");
printf("└─────────────────────────────┘\n");
for(i=0;i<n;i++) {
printf("%-13s%-15s%-10s%-11s%-10s\n",dat[i].name,dat[i].tel,dat[i].age,dat[i].adds,dat[i].qq);
}
printf("***************************************************************\n");
} else printf("\n名片数为0!\n");
printf("\n按任意键返回主菜单:");
}
/*************************删除联系人函数*************************/
int onedelete(Data dat[],int n)
{
getch(); //按任意键退出 return; char s[20],r; /*要删除记录的姓名*/ int i=0,j; printf("**************************************************************\n"); printf("\t请输入想删除联系人的姓名:"); scanf("%s",&s); while(strcmp(dat[i].name,s)!=0&&i<n) i++; /*对比字符,查找要删除的记录姓名*/ if(i==n) { printf("\n\t通讯录中没有此人!\n"); 16
} return(n); if(strcmp(dat[i].name,s) == 0) { printf("┌─────────────────────────────┐\n");
printf("│ 姓名 │ 电话 │ 年龄 │ 地址 │ QQ │\n");
printf("└─────────────────────────────┘\n");
q);
printf("**************************************************************\n"); } printf("%-13s%-15s%-10s%-11s%-10s\n",dat[i].name,dat[i].tel,dat[i].age,dat[i].adds,dat[i].q
printf("\t确认删除?(Y/N):");
scanf("\t%c",&r); while(r!='n'&&r!='N'&&r!='y'&&r!='Y') { } printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&r); if(r=='y'||r=='Y') { for(j=i;j<n-1;j++) //数据交换 { strcpy(dat[j].name,dat[j+1].name); //依次将下一条信息复制到上一条的位置
strcpy(dat[j].tel,dat[j+1].tel); 17
} } } n--; strcpy(dat[j].age,dat[j+1].age); strcpy(dat[j].adds,dat[j+1].adds); strcpy(dat[j].qq,dat[j+1].qq); printf("\n\t已经成功删除!\n"); return(n); if(r=='n'||r=='N') { return(n); }
/*************************全部删除函数*************************/ int alldelete(Data dat[],int n)
{
char r; int j; printf("\n\t确认删除?(Y/N):"); scanf("\t%c",&r); while(r!='n'&&r!='N'&&r!='y'&&r!='Y') { } printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&r); if(r=='y'||r=='Y') { for(j=1;n=0;j=1) //数据交换 { strcpy(dat[j].name,dat[j+1].name); //依次将下一条信息复制到上一18
条的位置
}
/*************************删除联系人函数*************************/
int Delete(Data dat[],int n)
{
int m; } if(r=='n'||r=='N') { return(n); } } printf("\n\t已经成功删除全部名片!\n"); return(n); strcpy(dat[j].tel,dat[j+1].tel); strcpy(dat[j].age,dat[j+1].age); strcpy(dat[j].adds,dat[j+1].adds); strcpy(dat[j].qq,dat[j+1].qq); n--;
printf("**************************************************************\n"); printf("\n\t请选择删除方式:\n");
printf("\t┌──────┐\n");
printf("\t│1--单个删除 │\n");
printf("\t│2--全部删除 │\n");
printf("\t│0--返回菜单 │\n");
printf("\t└──────┘\n");
printf("\t请选择(0-2):");
scanf("%d",&m); while(m!=1&&m!=2&&m!=0) { 19
} } printf("\n\t输入错误,请重新选择:"); scanf("%d",&m); if(m==1) { } if(m==2) { } if(m==0) { } return(n); alldelete(dat,n); onedelete(dat,n);
/*************************姓名查询联系人函数*************************/ void namefind(Data dat[],int n)
{
char s[20]; int i=0; char m; printf("\n*************************按姓名查找**************************\n"); printf("\n\t请输入想查询的姓名:"); scanf("\t%s",&s); while(strcmp(dat[i].name,s)!=0&&i<n) i++; if(i==n) { printf("\n\t通讯录中没有此人!\n"); 20
} printf("\n\t是否继续查询?(Y/N)"); scanf("\t%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { } if(m!='n'&&m!='N') { } return; namefind(dat,n); printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m); if(strcmp(dat[i].name,s) == 0) { printf("┌─────────────────────────────┐\n");
printf("│ 姓名 │ 电话 │ 年龄 │ 地址 │ QQ │\n");
printf("└─────────────────────────────┘\n");
q);
printf("%-13s%-15s%-10s%-11s%-10s\n",dat[i].name,dat[i].tel,dat[i].age,dat[i].adds,dat[i].q printf("**************************************************************\n"); printf("\n\t查询完成!\n"); printf("\n\t是否继续查询?(Y/N)"); scanf("\t%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') 21
} } { } if(m!='n'&&m!='N') { } return; namefind(dat,n); printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m);
/*************************电话查询联系人函数*************************/ void telfina(Data dat[],int n)
{
char s[20]; int i=0; char m; printf("\n*************************按电话查找**************************\n"); printf("\n\t请输入想查询的电话:"); scanf("\t%s",&s); while(strcmp(dat[i].tel,s)!=0&&i<n) i++; if(i==n) { printf("\n\t通讯录中没有此人!\n"); printf("\n\t是否继续查询?(Y/N)"); scanf("\t%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n\t输入错误!请重新输入:"); 22
} } scanf("\t%c",&m); if(m!='n'&&m!='N') { } return; telfina(dat,n); if(strcmp(dat[i].tel,s) == 0) { printf("┌─────────────────────────────┐\n");
printf("│ 姓名 │ 电话 │ 年龄 │ 地址 │ QQ │\n");
printf("└─────────────────────────────┘\n");
q);
printf("%-13s%-15s%-10s%-11s%-10s\n",dat[i].name,dat[i].tel,dat[i].age,dat[i].adds,dat[i].q printf("**************************************************************\n"); printf("\n\t查询完成!\n"); printf("\n\t是否继续查询?(Y/N)"); scanf("\t%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { } if(m!='n'&&m!='N') 23 printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m);
} } { } return; telfina(dat,n);
/*************************地址查询联系人函数*************************/ void addsfind(Data dat[],int n)
{
char s[20]; int i=0; char m; printf("\n*************************按地址查找**************************\n"); printf("\n\t请输入想查询的地址:"); scanf("\t%s",&s); while(strcmp(dat[i].adds,s)!=0&&i<n) i++; if(i==n) { printf("\n\t通讯录中没有此人!\n"); printf("\n\t是否继续查询?(Y/N)"); scanf("\t%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { } if(m!='n'&&m!='N') { addsfind(dat,n); 24 printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m);
} } return; if(strcmp(dat[i].adds,s) == 0) { printf("┌─────────────────────────────┐\n");
printf("│ 姓名 │ 电话 │ 年龄 │ 地址 │ QQ │\n");
printf("└─────────────────────────────┘\n");
q);
printf("%-13s%-15s%-10s%-11s%-10s\n",dat[i].name,dat[i].tel,dat[i].age,dat[i].adds,dat[i].q printf("**************************************************************\n"); } 25 printf("\n\t查询完成!\n"); printf("\n\t是否继续查询?(Y/N)"); scanf("\t%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { } if(m!='n'&&m!='N') { } return; addsfind(dat,n); printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m);
}
/*************************查询联系人函数*************************/
void Find(Data dat[],int n)
{
int m;
printf("**************************************************************\n"); printf("\n\t请选择查询方式:\n");
printf("\t┌──────┐\n");
printf("\t│1------姓名 │\n");
printf("\t│2------电话 │\n");
printf("\t│3------地址 │\n");
printf("\t│0------返回 │\n");
printf("\t└──────┘\n");
printf("\t请选择(0-3):");
scanf("%d",&m); while(m!=1&&m!=2&&m!=3&&m!=0) { } if(m==1) { } if(m==2) { } if(m==3) { 26 printf("\n\t输入错误,请重新选择:"); scanf("%d",&m); namefind(dat,n); telfina(dat,n);
} } addsfind(dat,n); if(m==0) { } menu_select();
/*************************按姓名查找后修改函数*************************/ void namechange(Data dat[],int n)
{
char s[20]; char m,ch; int i=0,k; printf("**************************************************************\n"); printf("\n\t请输入想修改的联系人的姓名:"); scanf("%s",&s); while(strcmp(dat[i].name,s)!=0&&i<n) i++; if(i==n) { printf("\n\t通讯录中没有此人!\n"); printf("\n\t是否继续修改?(Y/N)"); scanf("\t%s",&ch); while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y') { } if(ch!='n'&&ch!='N') { 27 printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&ch);
} } namechange(dat,n); return; if(strcmp(dat[i].name,s) == 0) { printf("┌─────────────────────────────┐\n");
printf("│ 姓名 │ 电话 │ 年龄 │ 地址 │ QQ │\n");
printf("└─────────────────────────────┘\n");
q);
printf("%-13s%-15s%-10s%-11s%-10s\n",dat[i].name,dat[i].tel,dat[i].age,dat[i].adds,dat[i].q printf("**************************************************************\n"); 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.修改QQ号 │\n"); printf("\t\t│ 0.返回菜单 │\n"); printf("\t\t└────────┘\n"); printf("\t\t请您选择(0-5):"); scanf("%d",&k); while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0) { printf("\n\t\t输入错误,请重新选择:"); 28
} scanf("%d",&k); switch(k) { } printf("\n\t修改成功!\n"); printf("\n\t是否继续修改?(Y/N)"); scanf("\t%s",&m); 29 case 1: printf("\n\t\t请输入新的姓名:"); scanf("\t\t%s",&dat[i].name); break; case 2: printf("\n\t\t请输入新的电话:"); scanf("\t\t%s",&dat[i].tel); break; case 3: printf("\n\t\t请输入新的年龄:"); scanf("\t\t%s",&dat[i].age); break; case 4: printf("\n\t\t请输入新的地址:"); scanf("\t\t%s",&dat[i].adds); break; case 5: printf("\n\t\t请输入新的QQ号:"); scanf("\t\t%s",&dat[i].qq); break; case 0: return;
while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { } for(m;m=='y'||m=='Y';){ printf("\t\t请您选择(0-5):"); scanf("%d",&k); while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0) { } switch(k) { case 1: printf("\n\t\t请输入新的姓名:"); scanf("\t\t%s",&dat[i].name); break; printf("\n\t\t输入错误,请重新选择:"); scanf("%d",&k); printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m); case 2: printf("\n\t\t请输入新的电话:"); scanf("\t\t%s",&dat[i].tel); break; case 3: printf("\n\t\t请输入新的年龄:"); scanf("\t\t%s",&dat[i].age); break; case 4: printf("\n\t\t请输入新的地址:"); scanf("\t\t%s",&dat[i].adds); 30
} } } } break; case 5: printf("\n\t\t请输入新的QQ号:"); scanf("\t\t%s",&dat[i].qq); break; case 0: return; printf("\n\t修改成功!\n"); printf("\n\t是否继续修改?(Y/N)"); scanf("\t%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { } printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m); if(m=='n'||m=='N'); return;
/*************************按电话查找后修改函数*************************/ void telchange(Data dat[],int n)
{
char s[20]; char m,ch; int i=0,k; printf("**************************************************************\n"); printf("\n\t请输入想修改的联系人的电话:"); 31
scanf("%s",&s); while(strcmp(dat[i].tel,s)!=0&&i<n) i++; if(i==n) { } if(strcmp(dat[i].tel,s) == 0) { printf("┌─────────────────────────────printf("\n\t通讯录中没有此人!\n"); printf("\n\t是否继续修改?(Y/N)"); scanf("\t%s",&ch); while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y') { } if(ch!='n'&&ch!='N') { } return; telchange(dat,n); printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&ch); ┐\n");
printf("│ 姓名 │ 电话 │ 年龄 │ 地址 │ QQ │\n");
printf("└─────────────────────────────┘\n");
q);
32 printf("%-13s%-15s%-10s%-11s%-10s\n",dat[i].name,dat[i].tel,dat[i].age,dat[i].adds,dat[i].q
printf("**************************************************************\n"); 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.修改QQ号 │\n"); printf("\t\t│ 0.返回菜单 │\n"); printf("\t\t└────────┘\n"); printf("\t\t请您选择(0-5):"); scanf("%d",&k); while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0) { } switch(k) { case 1: printf("\n\t\t请输入新的姓名:"); scanf("\t\t%s",&dat[i].name); break; printf("\n\t\t输入错误,请重新选择:"); scanf("%d",&k); case 2: printf("\n\t\t请输入新的电话:"); scanf("\t\t%s",&dat[i].tel); break; case 3: printf("\n\t\t请输入新的年龄:"); scanf("\t\t%s",&dat[i].age); 33
} break; case 4: printf("\n\t\t请输入新的地址:"); scanf("\t\t%s",&dat[i].adds); break; case 5: printf("\n\t\t请输入新的QQ号:"); scanf("\t\t%s",&dat[i].qq); break; case 0: return; printf("\n\t修改成功!\n"); printf("\n\t是否继续修改?(Y/N)"); scanf("\t%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { } for(m;m=='y'||m=='Y';){ printf("\t\t请您选择(0-5):"); scanf("%d",&k); while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0) { } switch(k) { 34 printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m); printf("\n\t\t输入错误,请重新选择:"); scanf("%d",&k);
} case 1: printf("\n\t\t请输入新的姓名:"); scanf("\t\t%s",&dat[i].name); break; case 2: printf("\n\t\t请输入新的电话:"); scanf("\t\t%s",&dat[i].tel); break; case 3: printf("\n\t\t请输入新的年龄:"); scanf("\t\t%s",&dat[i].age); break; case 4: printf("\n\t\t请输入新的地址:"); scanf("\t\t%s",&dat[i].adds); break; case 5: printf("\n\t\t请输入新的QQ号:"); scanf("\t\t%s",&dat[i].qq); break; case 0: return; printf("\n\t修改成功!\n"); printf("\n\t是否继续修改?(Y/N)"); scanf("\t%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m); 35
} } } } if(m=='n'||m=='N'); return;
/*************************按地址查找后修改函数*************************/ void addschange(Data dat[],int n)
{
char s[20]; char m,ch; int i=0,k; printf("**************************************************************\n"); printf("\n\t请输入想修改的联系人的电话:"); scanf("%s",&s); while(strcmp(dat[i].adds,s)!=0&&i<n) i++; if(i==n) { printf("\n\t通讯录中没有此人!\n"); printf("\n\t是否继续修改?(Y/N)"); scanf("\t%s",&ch); while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y') { } if(ch!='n'&&ch!='N') { 36 printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&ch);
} } addschange(dat,n); return; if(strcmp(dat[i].adds,s) == 0) { printf("┌─────────────────────────────┐\n");
printf("│ 姓名 │ 电话 │ 年龄 │ 地址 │ QQ │\n");
printf("└─────────────────────────────┘\n");
q);
printf("%-13s%-15s%-10s%-11s%-10s\n",dat[i].name,dat[i].tel,dat[i].age,dat[i].adds,dat[i].q printf("**************************************************************\n"); 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.修改QQ号 │\n"); printf("\t\t│ 0.返回菜单 │\n"); printf("\t\t└────────┘\n"); printf("\t\t请您选择(0-5):"); scanf("%d",&k); while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0) { printf("\n\t\t输入错误,请重新选择:"); 37
} scanf("%d",&k); switch(k) { } printf("\n\t修改成功!\n"); printf("\n\t是否继续修改?(Y/N)"); scanf("\t%s",&m); 38 case 1: printf("\n\t\t请输入新的姓名:"); scanf("\t\t%s",&dat[i].name); break; case 2: printf("\n\t\t请输入新的电话:"); scanf("\t\t%s",&dat[i].tel); break; case 3: printf("\n\t\t请输入新的年龄:"); scanf("\t\t%s",&dat[i].age); break; case 4: printf("\n\t\t请输入新的地址:"); scanf("\t\t%s",&dat[i].adds); break; case 5: printf("\n\t\t请输入新的QQ号:"); scanf("\t\t%s",&dat[i].qq); break; case 0: return;
while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { } for(m;m=='y'||m=='Y';){ printf("\t\t请您选择(0-5):"); scanf("%d",&k); while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0) { } switch(k) { case 1: printf("\n\t\t请输入新的姓名:"); scanf("\t\t%s",&dat[i].name); break; printf("\n\t\t输入错误,请重新选择:"); scanf("%d",&k); printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m); case 2: printf("\n\t\t请输入新的电话:"); scanf("\t\t%s",&dat[i].tel); break; case 3: printf("\n\t\t请输入新的年龄:"); scanf("\t\t%s",&dat[i].age); break; case 4: printf("\n\t\t请输入新的地址:"); scanf("\t\t%s",&dat[i].adds); 39
} } } } break; case 5: printf("\n\t\t请输入新的QQ号:"); scanf("\t\t%s",&dat[i].qq); break; case 0: return; printf("\n\t修改成功!\n"); printf("\n\t是否继续修改?(Y/N)"); scanf("\t%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { } printf("\n\t输入错误!请重新输入:"); scanf("\t%c",&m); if(m=='n'||m=='N'); return;
/*************************修改联系人信息函数*************************/ void Change(Data dat[],int n)
{
int m;
printf("**************************************************************\n"); printf("\n\t请选择查询方式:\n");
printf("\t┌──────┐\n");
printf("\t│1------姓名 │\n");
40
printf("\t│2------电话 │\n");
printf("\t│3------地址 │\n");
printf("\t│0------返回 │\n");
printf("\t└──────┘\n");
printf("\t请选择(0-3):");
}
/*************************读取文件函数*************************/ void Readfile()
41 scanf("%d",&m); while(m!=1&&m!=2&&m!=3&&m!=0) { } if(m==1) { } if(m==2) { } if(m==3) { } if(m==0) { } return; addschange(dat,n); telchange(dat,n); namechange(dat,n); printf("\n\t输入错误,请重新选择:"); scanf("%d",&m);
{ if((fp=fopen("Key.Dat","rb"))!=NULL) { } fclose(fp); if((fp=fopen("Cards.Dat","rb"))==NULL) //以只读方式打开二进制文件 { fscanf(fp,"%s",Key); printf("\n\t\t通讯录文件不存在!"); //如果文件打开失败 if ((fp=fopen("Cards.Dat","wb"))==NULL) //不存在则进行创建 { } else { if ((fp=fopen("Key.Dat","wb"))==NULL) //不存在则进行创建 { } else { printf("\n\t\t输入注册号(8位数):"); gets(Key); while(strlen(Key)!=8) { } 42 printf("\n\t\t建立失败"); exit(0); printf("\n\t\t建立失败"); exit(0); printf("\n\t\t注册号输入错误!请重新输入:"); gets(Key);
} } } fprintf(fp,"%8s",Key); fclose(fp); printf("\n\t\t通讯录文件已建立\n"); printf("\n\t\t按任意键进入主菜单"); getch(); return; exit(0); //退出 fseek(fp,0,2); //文件位置指针移动到文件末尾 if (ftell(fp)>0) //文件不为空,获取的是文件长度 { fseek(fp,0,0); //文件位置指针移动到文件开始位置 for (n=0; !feof(fp) && fread(&dat[n],sizeof(struct Data),1,fp);n++); //从文件流中读取数据,以Data结构体接收读取的数据,并由n记录下文件中联系人个数
}
/*************************保存文件函数*************************/
void Save(int n)
{
43 printf("\n\t\t文件导入成功\n"); printf("\n\t\t按任意键进入主菜单:"); getch(); return; } printf("\n\t\t文件导入成功\n"); printf("\n\t\t文件中没有数据\n"); printf("\n\t\t按任意键进入主菜单:"); getch();//按任意键退出 return;
int i;
if ((fp=fopen("cards.Dat","wb"))==NULL)
{
printf("\n\t\t文件打开失败");
}
for (i=0;i<n;i++)
{
if (fwrite(&dat[i],sizeof(struct Data),1,fp)!=1)
{
printf("\n\t\t文件保存错误!\n");
}
}
fclose(fp);
printf("\n\t按任意键返回主菜单:");
getch();//按任意键退出
return;
}
/*************************主函数*************************/
void main()
{
Readfile();
for(;;)
{
switch(menu_select())
{
case 1:system("cls");printf("\n添加名片到通讯录\n");n Input(dat,n);Save(n);break;
case 2:system("cls");printf("\n显示所有名片\n");Display(dat,n);break;
case 3:system("cls");printf("\n从通讯录中删除名片\n");n Delete(dat,n);Save(n);break;
44 = =
case 4:system("cls");printf("\n在通讯录中查找名片\n");Find(dat,n);break; case 5:system("cls");printf("\n修改通讯录中的名片\n");Change(dat,n);Save(n);break;
}
特别注意!主菜单页面输入111这类数字,进入相应页面,但会才出现错误。
子菜单页面选择时输入字母会出现刷屏??
} } case 6:system("cls");printf("\n\t文件保存成功!\n");Save(n);break; case 0:printf("\n\t\t谢谢使用,再见!\n");exit(0); default:menu_select();
45