电子通讯录功能如下:
Function choose
1.Read
2.Append
3.Delete
4.Search
5.Save and exit
6.Quit
说明:上图是电子通讯录的主菜单,利用它,将能够轻松地录入一个朋友的电话号
码,通讯地址和出生日期,而且它还提供了检索和删除功能。在后面还将提供按生
日先后排序的功能,这些都有助于该通讯录的治理。
电子通讯录是采用线性表作为程序的基本结构的。
设计思想:
1。用顺序表设计电子通讯录的结构
为了表示较为复杂的数据内容,一般用结构这种数据类型,第一步就是在结构中定
义所需要的各项信息。
一般的通讯录都包括姓名,性别,出生年月,通讯地址和联系电话这几项,而
在这几项中,出生年月又包括年份,月份和日期三项,通讯地址包括邮编和家庭地
址二项,我们把这些联系较为紧密的内容又用单独的结构表示,这样就产生了电子
通讯录的基本结构:
struct addr /*通讯地址结构定义*/
{ char post_num[10]; /*邮编*/
char addr[40]; /*家庭地址*/
};
struct birth /*出生年月结构定义*/
{ int year; /*年份*/
int month; /*月份*/
int day; /*日期*/
};
struct friend /*电子通讯录结构定义*/
{ int number; /*序号*/
char name[20] /*姓名*/
char sex; /*性别*/
struct birth birth; /*出生年月*/
struct addr addr; /*通信地址*/
char telephone[13]; /*联系电话*/
};
定义的主结构friend包含了前述的五项内容 name,sex,和telephone分别代表
了姓名,性别和联系电话。为了让结构中的各项组分更加清楚,定义了二个
小结构birth 和addr分别代表出生年月和通讯地址,因此实际上friend包含了
8项内容。
有了结构定义后,我们可以很轻松地构造出电子通讯录的主体:
stryct friend friends[50];
采用一维数组 friends[50],正是用到了顺序表这种最简单的数据结构来表示
问题。
2.增添电子通讯录中的内容
对于电子通讯录这样一张顺序表来说,内容的录入是必不可少的操作。由
于采用的是顺序存储结构。这项工作很简单,只需要在把输入的信息按顺序放
在空的friends数组元素中即可。函数Data_Input完成了信息的录入工作:
void Data_input(int j)
{
friends[j].number=j;
printf("\n\n\n\tNo %d record",j);
printf("\n\n\tName:"); /*读入姓名*/
scanf("%s",friends[j].name);
printf("\n\tSex(m/f):"); /*读入姓别*/
scanf("%c",&friends[j].sex);
printf("\n\tbirthday:"); /*读入出生年月*/
printf("\n\t\tyear:");
scanf("%d",&friends[j].birth.year);
printf("\n\t\tmonth");
scanf("%d",&friends[j].birth.month);
printf("\n\t\tday");
scanf("%d",&friends[j].birth.day);
printf("\n\tPost number:"); /*读入邮编*/
scanf("%s",friends[j].addr.post_num);
printf("\n\tAddress:"); /*读入家庭地址*/
scanf("%s",friends[j].addr.addr);
printf("\n\ttelephone:"); /*读入联系电话*/
scanf("%s",friends[j].telephone);
}
录入完毕后典型的一份信息如下所示:
NO: 1
Name: 张三
Sex: m
Birthday(y/m/d): 1980 5 12
Postnum: 100034
Address: Beijing University
Tele: (010)62005200
3.电子通讯录记录的维护(插入与删除)
在实际使用中,数据资料输入后,还需要不断的更新和维护操作,最常见的是数
据的插入与删除。作为顺序表来说,如何在插入与删除数据资料后仍然能保持
原有数据之间的关系,是需要考虑的要害问题。
电子通讯录的插入算法如下:
printf("\n\tInsert No:"); /*录入插入位置*/
scanf("%d",&k);
for(j=i+1;j>k;j--) /*插入位置后的元素顺序后移*/
{ strcpy(friends[j].name,friends[j-1].name); /*交换元素内容*/
friends[j].sex=friends[j+1].sex;
friends[j].birth.year=friends[j-1].birth.year;
friends[j].birth.month=friends[j-1].birth.month;
friends[j].birth.day=friends[j-1].birth.day;
strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j-1].addr.addr);
strcpy(friends[j].telephone,friends[j-1].telephone);
}
Data_Input(k); /*插入位置上填入待插入元素*/
i++; /*总元素个数增1*/
删除算法如下:
printf("\n\tDelete No:"); /*读入删 除位置*/
scanf("%d",&k);
for(j=k;j<i;j++) /*删 除位置前的元素顺序前移*/
{
strcpy(frinds[j].name,frinds[j+1].name);
friends[j].sex=frinds[j+1].sex;
friends[j].birth.year=friends[j+1].birth.year;
friends[j].birth.month=friends[j+1].birth.month;
frinds[j].birth.day=friends[j+1].birth.day;
strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
strcpy(friends[j].telephone,friends[j+1].telephone);
}
i--; /*元素总数减1*/
函数search的代码如下:
search()
{
printf("\n\tPlease input name:"); /*提示输入要查询的姓名*/
gets(search_name);
for(j=1;j<=i;j++)
{ if(strcmp(search_name,friends[j].name)==0) /*比较二个串*/
{ Data_Show(j); /*查询成功,打印记录,结束循环*/
break;
}
}
if(j>1) /*查询失败,给出提示信息*/
printf("\n\t No such records");
}
文件存盘代码如下
FILE *fp;
void Data_Save()
{
int j;
fp=fopen("friend.txt,"w"); /*c以可写方式打开或创建文件friend.txt*/
for(j=1;j<=i;j++)
fwrite(&friends[j],sizeof(struct friend),1,fp);
fclose(fp);
}
处理有关的文件操作,最轻易忽视的就是关闭文件的操作..假如不及时关闭,轻易造成
文件内容的丢失,或者占用大量的内存,导至程序的执行速度下降。
从文件friend.txt读取记录的代码如下:
void Data_Load()
{
int j;
long k;
fp=fopen("friend.txt","r+t); /*打开文件friend.txt*/
if(fp!=NULL)
{ for(i=1;i<50;i++)
{ if(j=fgetc(fp)==EOF) /*判定是否到了文件尾*/
return;
k=i-1;
fseek(fp,k*sizeof(struct friend),SEEK_SET);
fread(&friends[i],sizeof(struct friend),1,fp); /*从文件中读一条记录*/
}
}
else /*假如文件不存在*/
{ fp=fopen(friend.txt","w");
i=1;
}
}
6.完成电子通讯录的主函数
在前面五个步聚的基础上开始进行程序主函数的设计。主函数首先调用初始化函数
Data_Load从已有文件friend.txt读取记录,假如是第一次使用,那么该文件不存在就创建
一个新文件,接下来程序进入一个无限循环,首先用一系列printf语句打印出各功能的选择
菜单,并提示按下数字键调用相应的功能。这里使用了switch分
支结构来处理按键消息,这
是一种典型的用法,当选择了‘quit''''菜单后,程序给出是否存盘的提示。
/*---------全部源代码如下-------------------*/
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<dos.h>
struct addr /*通讯地址结构定义*/
{ char post_num[10]; /*邮编*/
char addr[40]; /*家庭地址*/
};
struct birth /*出生年月结构定义*/
{ int year; /*年份*/
int month; /*月份*/
int day; /*日期*/
};
struct friend1 /*电子通讯录结构定义*/
{ int number; /*序号*/
char name[20]; /*姓名*/
char sex; /*性别*/
struct birth birth; /*出生年月*/
struct addr addr; /*通信地址*/
char telephone[13]; /*联系电话*/
}friends[50];
FILE *fp;
int i;
void Data_Load()
{ int j;
long k;
fp=fopen("friend.txt","r+t"); /*打开文件friend.txt*/
if(fp!=NULL)
{ for(i=1;i<50;i++)
{ j=fgetc(fp);
if(j==EOF) /*判定是否到了文件尾*/
return;
k=i-1;
fseek(fp,k*sizeof(struct friend1),SEEK_SET);
fread(&friends[i],sizeof(struct friend1),1,fp);/*从文件中读取一条记录*/
}
}
else
{ fp=fopen("friend.txt","w");
i=1;
}
}
void Data_Show(int j) /*打印记录的具体资料*/
{
printf("\n\n\tNo:%3d\n",friends[j].number);
printf("\n\tBirthday(y/m/d):%4d%2d%2d",friends[j].birth.year,friends[j].birth.month,friends[j].birth.day);
printf("\n\tPostnum:%-10s",friends[j].addr.post_num);
printf("\n\taddress:%-40s",friends[j].addr.addr);
printf("\n\tTele%-13s",friends[j].telephone);
}
void Data_Input(int j) /*记录插入函数*/
{
fflush(stdin);
friends[j].number=j;
printf("\n\n\n\tNo %d record",j);
printf("\n\n\tName:"); /*读入姓名*/
scanf("%s",friends[j].name);
fflush(stdin);
printf("\n\tSex(m/f):"); /*读入性别*/
scanf("%c",&friends[j].sex);
printf("\n\t---birthday---"); /*读入出生年月*/
printf("\n\tyear:");
scanf("%d",&friends[j].birth.year);
printf("\n\t\tmonth:");
scanf("%d",&friends[j].birth.month);
printf("\n\t\tday:");
scanf("%d",&friends[j].birth.day);
printf("\n\tPost_number:"); /*读入邮编*/
scanf("%s",friends[j].addr.post_num);
printf("\n\tAddress:"); /*读入家庭地址*/
scanf("%s",friends[j].addr.addr);
printf("\n\ttelephone:"); /*读入联系电话*/
scanf("%s",friends[j].telephone);
}
void Data_Save()
{
int j;
fp=fopen("friend.txt","w");
for(j=1;j<=i;j++)
{ fwrite(&friends[j],sizeof(struct friend1),1,fp);
}
}
void main()
{
int j,k;
char ch;
char *search_name;
clrscr();
Data_Load();
i--;
do
{ printf("\n\n\n\tFunction choose:");
printf("\n\t1.Read");
printf("\n\t2.Append");
printf("\n\t3.Delete");
printf("\n\t4.Search");
printf("\n\t5.Insert");
printf("\n\t6.Save and Exit");
printf("\n\t7.Quit");
printf("\n\n");
printf("\tChoice:");
ch=getche();
switch(ch)
{ case '1': j=1; /*显示通讯录中的所有记录*/
while(getch()!=0x1b&&j<=i) Data_Show(j++);
if(j>i) printf("\n\tEnd of e_note\n");
break;
case '2': /*增加通讯录中的记录*/
while(getch()!=0x1b&&i<50)
{ i++;
Data_Input(i);
}
if(i==50)printf("\n\te_note is filled\n");
break;
case '3': /*删除通讯录中的记录*/
if(i<1)
{ printf("\n\tNo records\n");
break;
}
printf("\n\tDelete No:"); /*读入删除位置*/
scanf("%d",&k);
for(j=k;j<i;j++) /*删除位置前的元素顺序前移*/
{ strcpy(friends[j].name,friends[j+1].name);
friends[j].sex=friends[j=1].sex;
friends[j].birth.year=friends[j+1].birth.year;
friends[j].birth.month=friends[j+1].birth.month;
friends[j].birth.day=friends[j+1].birth.day;
strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
strcpy(friends[j].telephone,friends[j+1].telephone);
}
i--; /*元素总数减1*/
break;
case '4': /*通讯录查询功能*/
printf("\n\tPlease input name:");
gets(search_name);
for(j=1;j<=i;j++)
{
if(strcmp(search_name,friends[j].name)==0) /*比较字符串*/
{ Data_Show(j); /*查询成功,打印记录结束循环*/
break;
}
}
if(j>1) /*查询失败*/
printf("\n\t No such records");
break;
case '5':
printf("\n\tInsert No:"); /*录入插入位置*/
scanf("%d",&k);
for(j=i+1;j<k;j++) /*插入位置后的元素顺序后移*/
{ strcpy(friends[j].name,friends[j-1].name); /*交换元素内容*/
friends[j].sex=friends[j-1].sex;
friends[j].birth.year=friends[j-1].birth.year;
friends[j].birth.month=friends[j-1].birth.month;
friends[j].birth.day=friends[j-1].birth.day;
strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j-1].addr.addr);
strcpy(friends[j].telephone,friends[j-1].telephone);
}
Data_Input(k);
i++;
break;
case '6': Data_Save();
exit(0); break;
case '7': printf("\n\tDo you want to save e_note:(y/n)");
ch=getch();
if(ch=='y') Data_Save();
fclose(fp);
exit(0);
default: printf("Please choose num 1-4\n");
}
}while(1);
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |