C语言编写一个通讯录管理系统的源代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*定义保存通迅录的信息*/
structfriends
{
charname[20]/*名字*/
charprovince[20]/*省份*/
charcity[20]/*所在城市*/
charnation[20]/*民族*/
charsex[2]/*性别M/F*/
intage/*年龄*/
}
扩展资料
1、在C++中应该使用inline内连函数替代宏调用,这样既可达到宏调用的目的,又避免了宏调用的弊端。
2、在C语言两个函数的名称不能相同,否则会导致编译错误。在C++中,函数名相同而参数不同的两个函数被解释为重载。
3、在大型程序中,使函数名易于管理和使用,不必绞尽脑汁地去处理函数名。
#include<stdio.h>#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define header1 "|---------------------电话簿-----------------------|\n"
#define header2 "| num | name | phonenum| address |\n"
#define header3 "|-------|----------|---------------|---------------|\n"
#define end "|----------------------结束------------------------|"
#define N 100
typedef struct tele
{
int num
char name[10]
char phonenum[15]
char address[20]
}
telebook
void menu()
{
system("cls")
system("color 1F")
printf("\n\n\n") /*输出主菜单*/
printf("\t\t|* **** 欢迎进入电话薄管理系统! **** *|\n")
printf("\t\t|********************menu********************|\n")
printf("\t\t||\n")
printf("\t\t| 1 增加 2 读取 |\n")
printf("\t\t||\n")
printf("\t\t| 3 查找 4 修改 |\n")
printf("\t\t||\n")
printf("\t\t| 5 删除 6 排序 |\n")
printf("\t\t||\n")
printf("\t\t| 0 退出|\n")
printf("\t\t|********************************************|\n")
}
void printheader() /*输出菜单头*/
{
printf(header1)
printf(header2)
printf(header3)
}
int add(telebook temp[])
{
int iint m=0
FILE *fp
system("cls")
if((fp=fopen("D:\\rex.txt","ab+"))==NULL)
{
printf("打开文件有误!")
exit(0)
}
printf("每次输入一百个人的信息!\n")
printf("如果输入0推出输入!\n")
for(i=mi<(100+m)i++)
{
printf("num:")
scanf("%d",&temp[i].num)
if(temp[i].num==0)
break
printf("name:")
scanf("%s",&temp[i].name)
printf("phonenum:")
scanf("%s",&temp[i].phonenum)
printf("address:")
scanf("%s",&temp[i].address)
fwrite(&temp[i],sizeof(struct tele),1,fp)
}
m+=100
fclose(fp)
system("cls")
return 0
}
int read(telebook temp[])
{
int count,i
FILE *fp
system("cls")
if((fp=fopen("D:\\rex.txt","ab+"))==NULL)
{
printf("打开文件有误!")
exit(0)
}
printheader()
for(count=0fread(&temp[count],sizeof(struct tele),1,fp)==1count++)/*读取文件内信息的个数。*/
if(count==0)
printf("\n\n\n\t\t文件内没有信息!\n\n\n")
for(i=0i<counti++) /*读取文件内的信息*/
printf("|%-7d|%-10s|%-15s|%-15s|\n",temp[i].num,temp[i].name,temp[i].phonenum,temp[i].address)
printf(end)
fclose(fp)
return 0
}
int find1(telebook temp[]) /*电话号码查询*/
{
int i,count,t=0 char n[20]
FILE *fp
system("cls")
read(temp)
printf("\n")
if((fp=fopen("D:\\rex.txt","ab+"))==NULL)
{
printf("打开文件有误!")
exit(0)
}
printf("输入要查找的号码:")
scanf("%s",n)
printf("\n\n")
printheader()
getchar()
for(count=0fread(&temp[count],sizeof(struct tele),1,fp)==1count++)/*读取文件内信息的个数。*/
for(i=0i<counti++)
{
if(strcmp(temp[i].phonenum,n)==0)
{
t=1
printf("|%-7d|%-10s|%-15s|%-15s|\n",temp[i].num,temp[i].name,temp[i].phonenum,temp[i].address)
/*输出查询到的信息*/
}
}
if(t==0)
{
printf("\a\n\n\t\t没有要查找的信息..........!\n\n\n")
printf(end)
return 0
}
printf(end)
fclose(fp)
return 0
}
int find2(telebook temp[]) /*姓名查询*/
{
int i,count ,t=0
char a[20]
FILE *fp
system("cls")
read(temp)
printf("\n")
if((fp=fopen("D:\\rex.txt","ab+"))==NULL)
{
printf("打开文件有误!")
exit(0)
}
printf("输入要查找的名字:")
scanf("%s",a)
getchar()
printf("\n\n")
printheader()
for(count=0fread(&temp[count],sizeof(struct tele),1,fp)==1count++)/*读取文件内信息的个数。*/
for(i=0i<counti++)
{
if(strcmp(temp[i].name,a)==0)
{
t=1
printf("|%-7d|%-10s|%-15s|%-15s|\n",temp[i].num,temp[i].name,temp[i].phonenum,temp[i].address)
/*输出查询到的信息*/
}
}
if(t==0)
{
printf("\a\n\n\t\t没有要查找的信息..............!\n\n\n")
printf(end)
return 0
}
printf(end)
fclose(fp)
return 0
}
void find()
{
int n
telebook message1[20]
system("cls")
system("color 4F")
printf("\n")
while(1)
{/*输出查找函数主菜单*/
printf("\n\n\n\n")
printf(" |-------查找功能------|\n")
printf(" | |\n")
printf(" | 1 按电话号码查找 |\n")
printf(" | |\n")
printf(" | 2 按姓名查找|\n")
printf(" | |\n")
printf(" | 0 退出 |\n")
printf(" | |\n")
printf(" |---------结束--------|\n")
printf("输入您的查找方式:")
scanf("%d",&n)
switch(n)
{
case 1:find1(message1)break
case 2:find2(message1)break
case 0:returnbreak
}
getchar()
system("cls")
}
}
int change(telebook temp[])
{
int i,count,t=0
FILE *fp
struct tele ne[10]
system("cls")
read(temp)
printf("\n")
printf("按序号修改\n")
if((fp=fopen("D:\\rex.txt","ab+"))==NULL)
{
printf("打开文件有误!")
exit(0)
}
printf("输入新内容:\n")
printf("num:")
scanf("%d",&ne[0].num)
printf("name:")
scanf("%s",&ne[0].name)
printf("phonenum:")
scanf("%s",&ne[0].phonenum)
printf("address:")
scanf("%s",&ne[0].address)
for(count=0fread(&temp[count],sizeof(struct tele),1,fp)==1count++)/*读取文件内信息的个数。*/
fclose(fp)
for(i=0i<counti++) /*查找与新信息相同的信息*/
{
if(temp[i].num==ne[0].num) /*用新信息替换*/
{
t=1
temp[i].num=ne[0].num
strcpy(temp[i].name,ne[0].name)
strcpy(temp[i].phonenum,ne[0].phonenum)
strcpy(temp[i].address,ne[0].address)
getchar()
printf("\n\n\t\t\t修改成功..........!")
}
}
if(t==0)
{
getchar()
printf("\n\n\t\t\t没有要修改的信息.........!")
return 0
}
fp=fopen("D:\\rex.txt","wb+")
for(i=0i<counti++)
fwrite(&temp[i],sizeof(struct tele),1,fp)
fclose(fp)
return 0
}
int del(telebook temp[])
{
int i,j,count,t=0char name1[20]
FILE *fp
system("cls")
read(temp)
printf("\n")
if((fp=fopen("D:\\rex.txt","ab+"))==NULL)
{
printf("打开文件有误!")
exit(0)
}
printf("输入要删除的人名:")
scanf("%s",name1)
for(count=0fread(&temp[count],sizeof(struct tele),1,fp)==1count++)/*读取文件内信息的个数。*/
fclose(fp)
for(i=0i<counti++) /*查找要删除的信息*/
{
if(strcmp(temp[i].name,name1)==0)
{
for(j=ij<countj++)
{ /*删除找到的信息*/
t=1
temp[j].num=temp[j+1].num
strcpy(temp[j].name,temp[j+1].name)
strcpy(temp[j].phonenum,temp[j+1].phonenum)
strcpy(temp[j].address,temp[j+1].address)
}
count--
printf("\n\n\n\t\t\t删除成功..................!")
}
}
if(t==0)
{
getchar()
printf("\a\n\n\n\t\t\t没有要删除的信息..................!")
return 0
}
getchar()
fp=fopen("D:\\rex.txt","wb+")
for(i=0i<counti++)
fwrite(&temp[i],sizeof(struct tele),1,fp)
fclose(fp)
return 0
}
int paixu(telebook temp[])
{
int i,j,count
telebook tmp
FILE *fp
system("cls")
read(temp)
printf("\n")
fp=fopen("D:\\rex.txt","ab+")
for(count=0fread(&temp[count],sizeof(struct tele),1,fp)==1count++)/*读取文件内信息的个数。*/
fclose(fp)
for(i=0i<count-1i++)/*对文件内的信息的序号进行排序*/
{
for(j=count-2j>=ij--)
if(temp[j+1].num<temp[j].num)
{
tmp=temp[j+1]
temp[j+1]=temp[j]
temp[j]=tmp
}
}
fp=fopen("D:\\rex.txt","wb+")
for(i=0i<counti++)
fwrite(&temp[i],sizeof(struct tele),1,fp)
fclose(fp)
read(temp)
return 0
}
void main()
{
telebook message[N]
int n
while(1)
{
menu()
printf("输入您的选择:")
scanf("%d",&n)
getchar()
switch(n)
{
case 1:add(message)break
case 2:read(message)break
case 3:find()break
case 4:change(message)break
case 5:del(message)break
case 6:paixu(message)break
case 0:exit(0)break
}
getchar()
}
printf("press enter continue...............")
}
#include <string.h>
#include <stdio.h>
#include<stdlib.h>
int cntAddr=0,i,j
char in[12]
const char * strFmt="\n%d\t%s\t%s\t%s\t%s\n"
typedef struct ADDRESSD {
int ID
char name[12]
char workPlace[12]
char teleOff[12]
char teleHome[12]
}ADDRESS
ADDRESS addrTmp[100],adTmp
int load(ADDRESS adr[]){
FILE *fp
if((fp=fopen("c:\\txl.txt","r"))!=NULL){
cntAddr=0
while(!feof(fp)){
fscanf(fp,"%d %s %s %s %s ",&(adr[cntAddr].ID),adr[cntAddr].name,adr[cntAddr].workPlace,adr[cntAddr].teleOff,adr[cntAddr].teleHome)
++cntAddr
}
}
fclose(fp)
return cntAddr
}
void list(ADDRESS addr[],int length){
for(i=0i<length++i)printf(strFmt,addr[i].ID,addr[i].name,addr[i].workPlace,addr[i].teleOff,addr[i].teleHome)
}
void display(ADDRESS addr[]){
for(i=0i<cntAddr++i)addrTmp[i]=addr[i]
for(i=0i<cntAddr-1++i)for(j=i+1j<cntAddr++j)if(addrTmp[i].ID>addrTmp[j].ID){adTmp=addrTmp[i]addrTmp[i]=addrTmp[j]addrTmp[j]=adTmp}
for(i=0i<cntAddr++i)printf(strFmt,addrTmp[i].ID,addrTmp[i].name,addrTmp[i].workPlace,addrTmp[i].teleOff,addrTmp[i].teleHome)
}
void namesort(ADDRESS addr[],int length){
for(i=0i<length++i)addrTmp[i]=addr[i]
for(i=0i<length-1++i)for(j=i+1j<length++j)if(strcmp(addrTmp[i].name,addrTmp[j].name)>0){adTmp=addrTmp[i]addrTmp[i]=addrTmp[j]addrTmp[j]=adTmp}
for(i=0i<length++i)printf(strFmt,addrTmp[i].ID,addrTmp[i].name,addrTmp[i].workPlace,addrTmp[i].teleOff,addrTmp[i].teleHome)
}
void save(ADDRESS adr[],int length){
FILE *fp
fp=fopen("c:\\txl.txt","w")
for(i=0i<cntAddr++i)fprintf(fp,"%d %s %s %s %s ",adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome)
fclose(fp)
}
void unitssort(ADDRESS addr[],int length){
for(i=0i<length++i)addrTmp[i]=addr[i]
for(i=0i<length-1++i)for(j=i+1j<length++j)if(strcmp(addrTmp[i].workPlace,addrTmp[j].workPlace)>0){adTmp=addrTmp[i]addrTmp[i]=addrTmp[j]addrTmp[j]=adTmp}
for(i=0i<length++i)printf(strFmt,addrTmp[i].ID,addrTmp[i].name,addrTmp[i].workPlace,addrTmp[i].teleOff,addrTmp[i].teleHome)
}
void namesearch(ADDRESS addr[],int length){
printf("请输入姓名:\n")
scanf("%s",&in)
for(i=0i<length++i)if(strcmp(addr[i].name,in)==0)printf(strFmt,addr[i].ID,addr[i].name,addr[i].workPlace,addr[i].teleOff,addr[i].teleHome)
}
void unitssearch(ADDRESS adr[],int length){
printf("请输入工作单位:\n")
scanf("%s",&in)
for(i=0i<length++i)if(strcmp(adr[i].workPlace,in)==0)printf(strFmt,adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome)
}
void officenumbersearch(ADDRESS adr[],int length){
printf("请输入办公电话:\n")
scanf("%s",&in)
for(i=0i<length++i)if(strcmp(adr[i].teleOff,in)==0)printf(strFmt,adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome)
}
void homenumbersearch(ADDRESS adr[],int length){
printf("请输入家庭电话:\n")
scanf("%s",&in)
for(i=0i<length++i)if(strcmp(adr[i].teleHome,in)==0)printf(strFmt,adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome)
}
int delet(ADDRESS adr[],int length){
printf("要修改第几条记录:\n")
scanf("%d",&j)
for(i=ji<length-1++i)adr[i]=adr[i+1]
return --length
}
void rewrite(ADDRESS adr[],int length){
printf("要修改第几条记录:\n")
scanf("%d",&j)
printf("请输入ID:\n")
scanf("%d",&i)
adr[j].ID=i
printf("请输入姓名:\n")
scanf("%s",in)
strcpy(adr[j].name,in)
printf("请输入工作单位:\n")
scanf("%s",in)
strcpy(adr[j].workPlace,in)
printf("请输入办公电话:\n")
scanf("%s",in)
strcpy(adr[j].teleOff,in)
printf("请输入家庭电话:\n")
scanf("%s",in)
strcpy(adr[j].teleHome,in)
}
int add(ADDRESS adr[],int length){
printf("请输入ID:\n")
scanf("%d",&i)
adr[length].ID=i
printf("请输入姓名:\n")
scanf("%s",in)
strcpy(adr[length].name,in)
printf("请输入工作单位:\n")
scanf("%s",in)
strcpy(adr[length].workPlace,in)
printf("请输入办公电话:\n")
scanf("%s",in)
strcpy(adr[length].teleOff,in)
printf("请输入家庭电话:\n")
scanf("%s",in)
strcpy(adr[length].teleHome,in)
return ++cntAddr
}
void copy(){
FILE *fp,*fc
printf("请输入新文件名(路径中的反斜杠用\\表示)\n")
scanf("%s",&in)
if((fp=fopen("c:\\txl.txt","r"))!=NULL){
fc=fopen(in,"w")
while(!feof(fp)){
fscanf(fp,"%d %s %s %s %s ",&(adTmp.ID),adTmp.name,adTmp.workPlace,adTmp.teleOff,adTmp.teleHome)
fprintf(fc,"%d %s %s %s %s ",adTmp.ID,adTmp.name,adTmp.workPlace,adTmp.teleOff,adTmp.teleHome)
}
fclose(fc)
}
fclose(fp)
}
int enter(ADDRESS adr[]){
cntAddr=0
printf("请按次序输入数据,结束按CTRL+z:\n")
while(1){
printf("请输入ID:\n")
if(scanf("%d",&i)==EOF)break
adr[cntAddr].ID=i
printf("请输入姓名:\n")
if(scanf("%s",in)==EOF)break
strcpy(adr[cntAddr].name,in)
printf("请输入工作单位:\n")
if(scanf("%s",in)==EOF)break
strcpy(adr[cntAddr].workPlace,in)
printf("请输入办公电话:\n")
if(scanf("%s",in)==EOF)break
strcpy(adr[cntAddr].teleOff,in)
printf("请输入家庭电话:\n")
if(scanf("%s",in)==EOF)break
strcpy(adr[cntAddr].teleHome,in)
++cntAddr
}
return cntAddr
}
void showpaixu(ADDRESS adr[],int length)
{
int choice
menu1:
system("cls")
printf("\n\n\n\n *************************通讯录信息管理系统*************************\n\n")
printf(" 1. 全部显示通讯录信息\n\n")
printf(" 2. 按序号显示通讯录信息\n\n")
printf(" 3. 按姓名排序\n\n")
printf(" 4. 按工作单位排序\n\n")
printf(" 0. 返回上一级菜单\n\n")
printf(" ********************************************************************\n")
printf(" 请选择(0~4)\n ")
scanf("%d",&choice)
switch(choice)
{
case 1:
list(adr,length)
printf(" 请按任意键返回...\n")
system("pause")
break/*显示全部记录*/
case 2:
display(adr)
printf(" 请按任意键返回...\n")
system("pause")break/*按序号显示记录*/
case 3:
namesort(adr,length)
printf(" 请按任意键返回...\n")
system("pause")
break/*按姓名排序*/
case 4:
unitssort(adr,length)
printf(" 请按任意键返回...\n")
system("pause")
break/*按工作单位排序*/
case 0: return
}
goto menu1
}
/*通讯录信息查找功能*/
void chazhao(ADDRESS adr[],int length)
{
int choice
menu2:
system("cls")
printf("\n\n\n\n *************************通讯录信息管理系统*************************\n\n")
printf(" 1. 通过姓名查找\n\n")
printf(" 2. 通过工作单位查找\n\n")
printf(" 3. 通过办公电话查找\n\n")
printf(" 4. 通过家庭电话查找\n\n")
printf(" 0. 返回上一级菜单\n\n")
printf(" ********************************************************************\n")
printf(" 请选择(0~4)\n ")
scanf("%d",&choice)
switch(choice)
{
case 1:
namesearch(adr,length)
printf(" 请按任意键返回...\n")
system("pause")
break/*按姓名查找记录*/
case 2:
unitssearch(adr,length)
printf(" 请按任意键返回...\n")
system("pause")
break/*按工作单位查找记录*/
case 3:
officenumbersearch(adr,length)
printf(" 请按任意键返回...\n")
system("pause")
break/*按办公电话查找记录*/
case 4:
homenumbersearch(adr,length)
printf(" 请按任意键返回...\n")
system("pause")
break/*按住宅电话查找记录*/
case 0: return
}
goto menu2
}
/*通讯录信息变更功能*/
void biangeng(ADDRESS adr[],int length)
{
int choice
menu3:
system("cls")
printf("\n\n\n\n *************************通讯录信息管理系统*************************\n\n")
printf(" 1. 删除记录\n\n")
printf(" 2. 修改记录\n\n")
printf(" 3. 添加记录\n\n")
printf(" 0. 返回上一级菜单\n\n")
printf(" ********************************************************************\n")
printf(" 请选择(0~3)\n ")
scanf("%d",&choice)
switch(choice)
{
case 1:
length=delet(adr,length)
save(adr,length)
printf(" 请按任意键返回...\n")
getchar()
break/*删除记录*/
case 2:
rewrite(adr,length)
save(adr,length)
printf(" 请按任意键返回...\n")
getchar()
break/*修改记录*/
case 3:
length=add(adr,length)
save(adr,length)
printf(" 请按任意键返回...\n")
getchar()
break/*插入记录*/
case 0: return
}
goto menu3
}
int wenjian(ADDRESS adr[],int length)
{
int choice
menu4:
system("cls")
printf("\n\n\n\n *************************通讯录信息管理系统*************************\n\n")
printf(" 1. 导入文件到通讯录\n\n")
printf(" 2. 把当前文件复制到新文件上\n\n")
printf(" 0. 返回上一级菜单\n\n")
printf(" ********************************************************************\n")
printf(" 请选择(0~2)\n ")
scanf("%d",&choice)
switch(choice)
{
case 1: length=load(adr)
printf("您已经成功的导入文件到通讯录!\n")
printf(" 请按任意键返回...\n")
system("pause")break
case 2: copy()
printf("复制成功!\n")
printf(" 请按任意键返回...\n")
system("pause")break
case 0: return length
}
goto menu4
}
/*关于*/
void about()
{
system("color 87")
system("cls")
printf("\n\n\n\n 《通讯录信息管理系统》\n\n\n")
printf(" *****************************************\n\n\n")
printf(" 版权所有(C) 2009-2010 DIY软件\n\n\n")
printf(" 制作人:西北民族大学计算机科学与信息09级计算机3班 王元波\n\n\n")
printf(" *****************************************\n\n\n")
printf(" 请按任意键返回主菜单...")
system("pause")
}
/******主函数开始*******/
void main()
{
int choice
int length/*保存记录长度*/
ADDRESS adr[100] /*定义结构体数组*/
menu:
system("color f9")
system("cls")
printf("\n\n\n\n *************************通讯录信息管理系统*************************\n\n")
printf(" 请选择以下通讯录管理功能:\n\n")
printf(" 1. 通讯录信息输入\n\n")
printf(" 2. 通讯录信息浏览及排序\n\n")
printf(" 3. 通讯录信息查询\n\n")
printf(" 4. 通讯录信息更改\n\n")
printf(" 5. 通讯录及文件操作\n\n")
printf(" 6. 关于通讯录信息管理系统\n\n")
printf(" 0. 退出通讯录管理系统\n\n")
printf(" ********************************************************************\n")
printf(" 请选择(0~6)\n ")
scanf("%d",&choice)
switch(choice)
{
case 1: length=enter(adr)
save(adr,length)
printf("\n 请按任意键返回...\n")
system("pause")break/*输入记录*/
case 2: showpaixu(adr,length)break
case 3: chazhao(adr,length)break
case 4: biangeng(adr,length)break
case 5: length=wenjian(adr,length)break
case 6: about()break/*关于*/
case 0: return/*如返回值为则程序结束*/
}
goto menu
}
拓展资料
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。