通讯录源代码详解
通讯录源代码

#include<stdio.h>#include<string.h> //字符串处理//#include<conio.h>#define MY1 printf("\n姓名地址邮政编码电话\t")#define MY2 printf("\n%s %4s %s %s\n",s[i].name,s[i].address,s[i].code,s[i] .tel)#define MAX 20int i;int sum;/*时间结构体类型*/struct s_message{char name[20];char address[50];char code[15];char tel[15];}s[MAX];/*保存通讯录信息*/void save_message(int sum){int i;FILE *fp; //声明fp是指针,用来指向FILE类型的对象//if((fp=fopen("D:\\s.txt","wb"))==NULL){printf("文件有误!\n");return;}for (i=0;i<sum;i++){if(fwrite(&s[i],sizeof(struct s_message),1,fp)!=1) //fwite写一个数据块//printf("writing file is wrong!\n");}fclose(fp);}/*读取通讯录信息*/int read_message(){FILE *fp;int i=0;if((fp=fopen("D:\\s.txt","rb"))==NULL){printf("\n\n***********暂时无任何库存信息,按回车键进入主菜单选择基本信息的录入!***********\n");return 0;}while(feof(fp)==0) /*feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为1,否则为0。
用c语言编写一个通讯录代码详解

⽤c语⾔编写⼀个通讯录代码详解⽬录实现通讯录的思路如下:总结实现通讯录的思路如下:1.程序运⾏起来时⽤户⾸先要看到菜单栏选项并且对应菜单栏所给出的选项做出选择,这⾥我们简单设计⼀个Menu()函数可以让⽤户看见可选项⽬;2.⽤户可选的范围应该是1~7,为了避免⽤户做出超出范围的选择我们可以⽤switch语句来判断⽤户的选择若⽤户输⼊的数字⾮法还可以让⽤户继续选择,⽽继续选择这个动作需要⽤到while语句,⽤户对通讯录的不断操作也需要⽤到while语句;3.⽤户选择不同的选项,程序就要调⽤对应的函数来实现其功能并且我们对switch语句进⾏优化,如果直接对输⼊的数字进⾏判断的话我们还需要对照直接设计的菜单栏选项对捕捉到的⽤户选择做出判断需要不是参考菜单栏,为了解决这个问题,我们⽤枚举的⽅法来提⾼代码的可读性;enum menu{ADD = 1,SHOW,MODIFIES,FIND,DELETE,SORT,EXITS,};4.接下来我们对通讯录的功能⼀⼀实现,不难想到要对通讯录中的联系⼈信息进⾏操作就必须要有存放联系⼈信息的载体,⽽每个联系⼈信息则⼜包含姓名,年龄,性别,电话号码,地址这些信息,所以我们⾸先⾃定义⼀个message类型,然后创建⼀个message数组来存放联系⼈信息,数组的⼤⼩由我们⾃⾏设定最好⽤#define来设定num的⼤⼩可以做到⼀改全改。
#define num 100typedef struct s{int age;char name[10];char number[20];char sex[5];char adress[20];}message;5.添加联系⼈功能:要想添加联系⼈就得对保存所有联系⼈信息的数组进⾏操作并且还要知道把新建的联系⼈信息存⼊数组的第⼏个元素中,所以这个AddMessage函数应该接收这两个参数,考虑到要统计通讯录中联系⼈的个数并且在添加联系⼈成功后该个数应该++,所以在创建联系⼈数组的同时应该同时定义⼀个变量来告诉⼀些功能函数通讯录中联系⼈的个数并且在addMessage这个函数中还需要对这个变量的值进⾏+1操作所以我们应该向这个函数传⼊该变量的地址达到修改变量值的⽬的。
C语言课程设计——通讯录软件源代码(完美版)

C语言课程设计——通讯录软件源代码(完美版)通讯录完美版操作说明书编译环境:Visual C++ 6.0初始密码为:111111主菜单:选择编号进行相应的操作:选择“1”:输入编号:如“001”。
通讯录数据结构如下,只要输入的数据不超过允许的范围即可:struct callmember //定义数据结构{char code[8]; // 编号char name[20]; // 姓名char callnumber[16]; // 电话号码char address[30]; // 地址};输入完后“Enter”结束。
然后又回到“main menu”。
选择“2”显示通讯录信息,但此时刚输入的信息还没保存,选择“3”就可以将联系人信息保存在“通讯录.txt”文件中了,这个文件是自动生成的不需自己建立。
除此外还有查询、修改、删除功能。
当然功能有限,望有能之士加以修改,完善内容~本软件是一个值得收藏的软件,可以用于管理自己的通讯录~源程序:/***************************C语言课程设计*****************************//******************************************************************* **//******************************************************************* **//******************************************************************* **//***** 项目名称: 通讯录管理系统 *****/ /***** 作者: *****/ /*****专业: ***** *****/ /***** 班级: ***** *****/ /***** 学号: ********* *****//***** 指导老师: *****/ /***** 完成时间: 2010.7.12 *****/ /***** 联系电话: 150*******3 *****/ /***** 初始密码: 111111 *****//*********************************************************************/ /******************************************************************* **//******************************************************************* **//************************预处理***************************************/ #include<string.h> #include<stdio.h>#include<stdlib.h>#include<windows.h>#include<conio.h>#define N 301 //修改N的值,就可以改变记录个数,实际容纳人数为N-1 struct callmember //定义数据结构{char code[8]; // 编号char name[20]; // 姓名char callnumber[16]; // 电话号码char address[30]; // 地址};/***********************定义全局变量**********************************/FILE * fp; //文件指针struct callmember person[N]; //记录信息,N为通信录容量,有用信息为后N-1条int counter; //统计记录个数(联系人个数)/***********************函数声明*************************************/void creat(); //创建通讯录 OKvoid load(); //加载数据 OKvoid menu(); //界面菜单显示 OKvoid choose_1(int ); //选择功能 OKvoid insert(); //1、通讯信息的录入 OKvoid output(); //2、通讯信息的显示 OKvoid save(); //3、通讯信息的保存 OKvoid del(); //4、记录的删除 OKvoid modify(); //5、记录的修改 OKvoid found(); //6、记录的查找,三种方式 OKvoid choose_2(int ); //选择查询方式 OKvoid found_code(); //6.1、按编号查询 OK void found_name(); //6.2、按姓名查询 OK void found_callnumber(); //6.3、按电话号码查询 OK voidquit(); //7、退出系统 OK /********************** MAIN 函数***********************************/int main(){char m;char mima[10];char jiema[10];/*************密码文件的创建*****************/if((fp=fopen("mi_ma.dat","rb"))==NULL) //rb 只读(打开){fp=fopen("mi_ma.dat","wb");//wb 为读写建立一个新的文件(如果文件不存在,建立新文件)fprintf(fp,"%s","111111");fclose(fp);}/*************密码的读入*********************/fp=fopen("mi_ma.dat","rb");fscanf(fp,"%s",jiema);fclose(fp);/*************界面设置***********************/system("color 2f"); //设置界面颜色system("cls"); //清屏printf("\n\n\n\n\n\n\n\n\n\n\t\t\t请输入您的密码: "); //输入九位以内的密码gets(mima);if(!strcmp(mima,jiema)){printf("\n\n\t\t\t是否想修改您的密码 (Y/N) : "); scanf("%c",&m);if(m=='y'||m=='Y'){fp=fopen("mi_ma.dat","wb");printf("\n\t\t\t请输入您的新密码: ");scanf("%s",jiema);fprintf(fp,"%s",jiema);fclose(fp);printf("\n\t\t\t密码修改成功!");getchar();getchar();}system("cls"); //清屏system("color 2f"); //设置界面颜色creat(); //为程序创建文件(如果文件不存在)fp=fopen("counter.txt","r"); //r 只读(打开文件)fscanf(fp,"%d",&counter); //将磁盘中的数据赋给counter fclose(fp); //关闭打开的文件load(); //数据装载到内存中menu();return 0;}else{printf("\n\n\t\t\t输入密码错误!");getchar();printf("\t\t\t");return 0;}}/************************创建通讯录函数****************************/ void creat(){if((fp=fopen("通讯录.txt","r"))==NULL)//r 只读(打开){fp=fopen("通讯录.txt","w");//w 为读写建立一个新的文件(如果文件不存在,建立新文件)fprintf(fp,"%-10s%-20s%-20s%-30s\n","编号","姓名","电话号码","地址"); //写入基本信息person[0]fclose(fp);}if((fp=fopen("counter.txt","r"))==NULL) //r 只读(打开){fp=fopen("counter.txt","w"); //w 为只写建立一个新的文件fprintf(fp,"%d",0); //写入初值(自有文件新建时才有)fclose(fp);}}void load(){int i;if((fp=fopen("通讯录.txt","r"))!=NULL) //r 只读(打开),打开文件成功for(i=0;i<=counter;i++)fscanf(fp,"%s%s%s%s",person[i].code,person[i].name,person[i].callnum ber,person[i].address);//将文件中的信息加载到内存中,供操作使用elseprintf("打开文件失败!\n");fclose(fp);}/************************界面菜单显示函数**************************/ void menu(){int k;printf("\n");printf("\n");printf("\t ********************************************\n");printf("\t ********** 设计者: ***********\n");printf("\t ********** 设计时间: 2010.7.13 ***********\n");printf("\t ********************************************\n\n");printf("\t ********************************************\n");printf("\t **************** MENU ********************\n");printf("\t ********************************************\n");printf("\t ********* 1、通讯信息的录入: *************\n");printf("\t ********* 2、通讯信息的显示: *************\n");printf("\t ********* 3、通讯信息的保存: *************\n");printf("\t ********* 4、通信记录的删除: *************\n");printf("\t ********* 5、通信记录的修改: *************\n");printf("\t ********* 6、通信记录的查找: *************\n");printf("\t ********* 0、退出系统: *************\n");printf("\t ********************************************\n");printf("\t Now Please Enter your choose(0-6): ");scanf("%d",&k);choose_1(k);}/************************函数功能选择函数************************/ void choose_1(int k){switch(k){case 1 : insert();break;case 2 : output();break;case 3 : save();system("cls");printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\t 保存成功!");getchar();getchar();system("cls");menu();break;case 4 : del();break;case 5 : modify();break;case 6 : found();break;case 0 : quit();break;default: ;break;}}/****************************OK***********************************/ /************************通讯信息录入函数*************************/ /***************将数据写入内存中,由person[N]数组保存着***********/ void insert(){struct callmember * p;system("cls");p=(struct callmember *)malloc(sizeof(struct callmember ));//将动态分配的内存首地址赋给pprintf("\n\n\n\n\n\n");printf("\t *********************************\n\n");printf("\t 编号: ");scanf("%s",p->code);strcpy(person[counter+1].code,p->code);printf("\t 姓名: ");scanf("%s",p->name);strcpy(person[counter+1].name,p->name);printf("\t 电话: ");scanf("%s",p->callnumber);strcpy(person[counter+1].callnumber,p->callnumber);printf("\t 地址: ");scanf("%s",p->address);strcpy(person[counter+1].address,p->address);printf("\n\t *********************************");counter++;free(p); //释放空间getchar();getchar();system("cls");menu();}/************************通讯信息显示函数************************/ /************从内存中将数据显示在屏幕上,不用打开文件************/ void output(){int i=1;system("cls");if(counter){for(i=0;i<=counter;i++)printf("\t%-8s%-20s%-16s%-30s",person[i].code,person[i].name,person[i].callnumber,person[i].address);printf("\t");}elseprintf("\n\n\n\n\n\t\t记录为空,请输入联系人信息!");getchar();getchar();system("cls");menu();}/*************保存、修改、删除只针对内存中的数组进行操作*********/ /************************通讯信息保存函数************************/ void save() {int i;system("cls");if((fp=fopen("counter.txt","w"))==NULL) //w 只写覆盖原来的数据{printf("\n\n\n\t\t\t操作失败.");exit(1);}fprintf(fp,"%d",counter); //往磁盘写入现在的值,即保存fclose(fp);if((fp=fopen("通讯录.txt","w"))!=NULL)fprintf(fp,"%s","\0");fclose(fp);if((fp=fopen("通讯录.txt","a"))!=NULL)for(i=0;i<=counter;i++)fprintf(fp,"%-10s%-20s%-20s%-30s\n",person[i].code,person[i].name,person[i].callnumber,p erson[i].address);fclose(fp);system("cls");}/************************信息删除函数****************************/ void del() //根据姓名删除,根据显示选择要删的内容 {int k=1;int c=0;char m;char namekey[20];system("cls");printf("\n\n\n\n\n\n\t\t\t请输入要删除的姓名:");scanf("%s",namekey);while(k<=counter){if(!strcmp(namekey,person[k++].name)){c=k-1;break;}}if(c){printf("\t\t\t已查到,记录为:\n\n\n");printf("\t%-10s%-20s%-20s%-30s\n",person[0].code,person[0].name,person[0].callnumber,p erson[0].address);printf("\t%-10s%-20s%-20s%-30s\n",person[c].code,person[c].name,person[c].callnumber,pe rson[c].address);printf("\n\n\t\t\t确定要删除吗? (Y/N) : ");scanf("%s",&m);if(m=='y'||m=='Y'){if(c==counter){strcpy(person[counter].code,"\0");strcpy(person[counter].name,"\0");strcpy(person[counter].callnumber,"\0");strcpy(person[counter].address,"\0");counter--;}else{for(k=c;k<=counter;k++) //后面的信息将前面的信息覆盖掉{strcpy(person[k].code,person[k+1].code);strcpy(person[k].name,person[k+1].name);strcpy(person[k].callnumber,person[k+1].callnumber); strcpy(person[k].address,person[k+1].address);}strcpy(person[counter].code,"\0"); //最后面的信息为空strcpy(person[counter].name,"\0");strcpy(person[counter].callnumber,"\0");strcpy(person[counter].address,"\0");counter--;}printf("\t\t\t删除成功!");getchar();getchar();system("cls");save(); //用save()函数将删除后的信息从新保存menu();}else{system("cls");menu();}}else{printf("\n\t\t\t对不起,没有此人记录!");getchar();getchar();system("cls");menu();}}/************************信息修改函数****************************/ //可以设定编号唯一,通过查找编号来确定记录位置,进而进行修改 void modify(){int k=1;char m;char codekey[20];system("cls");printf("\n\n\t\t\t 请输入要修改的编号: ");scanf("%s",codekey);while(k<=counter){if(!strcmp(codekey,person[k].code))break;k++;}if(k<=counter){printf("\n\t\t\t 已查到,记录为:\n");printf("\n\t\t%-10s%-20s%-20s%-30s\n","编号","姓名","电话号码","地址");printf("\t\t%-10s%-20s%-20s%-30s\n",person[k].code,person[k].name,person[k].callnumber, person[k].address);printf("\t\t\t 确定要修改吗? (Y/N) : ");scanf("%s",&m);if(m=='y'||m=='Y'){printf("\n\t\t\t 请输入新的信息:\n\n");printf("\t *********************************\n\n");printf("\t 编号: ");scanf("%s",person[k].code);printf("\t 姓名: ");scanf("%s",person[k].name);printf("\t 电话: ");scanf("%s",person[k].callnumber);printf("\t 地址: ");scanf("%s",person[k].address);printf("\n\t *********************************"); printf("\n\n\t\t\t 修改成功!");getchar();getchar();system("cls");save(); //修改完后立马保存menu();}else{system("cls");menu();}}else{printf("\n\n\t\t\t对不起,没有此人记录!");getchar();getchar();system("cls");menu();}}/************************信息查询函数****************************/ void found() //调试合适{int k;system("cls");printf("\n");printf("\n");printf("\n\t\t******************************************\n"); printf("\n\t\t 1、按编号查询:\n");printf("\n\t\t 2、按姓名查询:\n");printf("\n\t\t 3、按电话号码查询:\n");printf("\n\t\t 0、返回:\n");printf("\n\t\t******************************************\n\n"); printf("\t\tPlease Enter Your Choose now: ");scanf("%d",&k);choose_2(k);}void choose_2(int k){switch(k){case 1 : found_code(); break;case 2 : found_name(); break;case 3 : found_callnumber(); break;case 0 : system("cls");menu(); break;default : system("cls");menu();break;}system("cls");menu();}//按编号查询void found_code(){int k=0;char codekey[8];struct callmember * p;p=(struct callmember *)malloc(sizeof(struct callmember)); printf("\n\t\t请输入要查询的编号:");scanf("%s",codekey);if((fp=fopen("通讯录.txt","r"))==NULL){printf("\n不能打开通讯录!\n");exit(0);}while(!feof(fp)) //当文件结束时,feof()返回值为1{fscanf(fp,"%s%s%s%s\n",p->code,p->name,p->callnumber,p->address);if(!strcmp(codekey,p->code)){k=1;break; //k=1,说明已经查到}}if(k){printf("\n\t\t%-10s%-20s%-20s%-30s\n","编号","姓名","电话号码","地址");printf("\t\t%-10s%-20s%-20s%-30s",p->code,p->name,p->callnumber,p->address);}elseprintf("\n\t\t您查询的编号不存在!");fclose(fp);getchar();getchar();system("cls");}//按姓名查询void found_name(){int k=0;char namekey[8];struct callmember * p;p=(struct callmember *)malloc(sizeof(struct callmember));printf("\n\t\t请输入要查询的姓名:");scanf("%s",namekey);if((fp=fopen("通讯录.txt","r"))==NULL){printf("\n不能打开通讯录!\n");exit(0);}while(!feof(fp)) //当文件结束时,feof()返回值为1.{fscanf(fp,"%s%s%s%s\n",p->code,p->name,p->callnumber,p->address); if(!strcmp(namekey,p->name)){k=1;break; //k=1,说明已经查到}}if(k){printf("\n\t\t%-10s%-20s%-20s%-30s\n","编号","姓名","电话号码","地址");printf("\t\t%-10s%-20s%-20s%-30s",p->code,p->name,p->callnumber,p->address);}elseprintf("\n\t\t您查询的姓名不存在!");fclose(fp);getchar();getchar();system("cls");}//按电话号码查询void found_callnumber(){int k=0;char callnumberkey[8];struct callmember * p;p=(struct callmember *)malloc(sizeof(struct callmember));printf("\n\t\t请输入要查询的电话号:");scanf("%s",callnumberkey);if((fp=fopen("通讯录.txt","r"))==NULL){printf("\n不能打开通讯录!\n");exit(0);}while(!feof(fp)) //当文件结束时,feof()返回值为1.{fscanf(fp,"%s%s%s%s\n",p->code,p->name,p->callnumber,p->address);if(!strcmp(callnumberkey,p->callnumber)){k=1;break; //k=1,说明已经查到}}if(k){printf("\n\t\t%-10s%-20s%-20s%-30s\n","编号","姓名","电话号码","地址");printf("\t\t%-10s%-20s%-20s%-30s",p->code,p->name,p->callnumber,p->address);}elseprintf("\n\t\t您查询的号码不存在!");fclose(fp);getchar();getchar();system("cls"); }/************************退出系统函数******************************/void quit() //调试合适 { printf("\t\t");exit(0);}。
手机通讯录源代码

手机通讯录源代码手机通讯录源代码#include#include#include#include#define N 15 //最大容量为15typedef struct //定义一个结构{char name[10];char haoma[15];char leibie[10];char dizhi[20];}ren;//菜单void menu() //目录{system("cls"); //清屏printf(" #########欢迎使用手机通讯录#########\n");printf("\n");printf("================================= ========================================= ====\n");printf("1.~~号码查询~~ \n");printf("2.~~号码添加~~ \n");printf("3.~~号码拨号~~ \n");printf("4.~~号码修改~~ \n");printf("5.~~号码删除~~ \n");printf("0. ~~退出~~ \n");printf("================================= ========================================= ====\n");printf("\n");printf("个人通讯录\n");printf("\n");printf(" ~~请选择相应的功能~~:");}void input() //查询{int help=0; //帮助指令,如果查找所找的类别中没有数据,显示ren ry;FILE *fp;char leibie[10];system("cls");printf("\n 输入要查人员的类别:");scanf("%s",leibie);//要查询的类别查找失败if((fp=fopen("ren.dat","rb"))==NULL){printf("can't open file!\n");exit(0);}fread(&ry,sizeof(ren),1,fp);if(!feof(fp)){ printf(" 人员的信息如下:\n");printf("说明:(A办公类B个人类C商务类)");printf("\n%10s %15s %10s %20s \n","姓名","号码","类别","邮箱");while(!feof(fp)){if(strcmp(ry.leibie,leibie)==0) //若为该类别则输出{ help++;printf("%10s %15s %10s %20s\n",/doc/8f1229847.html,,ry.haoma,ry. leibie,ry.dizhi);}fread(&ry,sizeof(ren),1,fp);}if(help==0){printf(" 查找失败");}。
C语言实现通讯录的详细代码

C语⾔实现通讯录的详细代码⽬录(⼀)实现思路1.通讯录功能2.模块化实现各⽅⾯的功能3.代码实现(⼆)源代码A.test.cB.Contact.hC.Contact.c(⼀)实现思路1.通讯录功能添加好友,删除好友,查找好友,修改好友信息,对好友进⾏排序2.模块化实现各⽅⾯的功能a. test.c测试通讯录功能b. Contact.c实现通讯录功能c. Contact.h包含通讯录实现的头⽂件3.代码实现(⼆)源代码A.test.c#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#include <string.h>#include "contact.h"void menu(){printf("*******************************\n");printf("*** 1.Add 2.Del ***\n");printf("*** 3.Search 4.Modify ***\n");printf("*** 5.Show 6.Sort ***\n");printf("*** 7.Help 8.About0 ***\n");printf("*** 0.Exit ***\n");printf("*******************************\n");}int main(){int input = 0;//创建通讯录InitContact(&con);//使size的初始值,以及好友信息初始化为0; do{menu();printf("请选择:");scanf("%d", &input);switch (input){//添加好友信息case Add:AddContact(&con);break;//删除好友case Del:DelContact(&con);break;//查找好友信息case Search:SearchContact(&con);break;//修改好友信息case Modify:ModifyContact(&con);break;//显⽰好友信息case Show:ShowContact(&con);break;//好友排序case Sort:SortContact(&con);break;//退出case Exit:printf("退出通讯录!");break;//通讯录的使⽤以及帮助case Help:HelpContact();break;//关于通讯录case About:AboutContact();break;//选择错误default:printf("选择错误!");break;}} while (input);return 0;}B.Contact.h#define _CRT_SECURE_NO_WARNINGS 1#define Max 1000#define Max_name 20#define Max_sex 5#define Max_tele 12#define Max_addr 30enum OptionDel,Search,Modify,Show,Sort,Help,About};//创建⼀个结构体来存放通讯录中要存放的信息struct PeoInfo{char name[Max_name];int age;char sex[Max_sex];char tele[Max_tele];char addr[Max_addr];};//通讯录类型struct Contact{struct PeoInfo data[Max];//存放⼀个信息,包括好友姓名,年龄,性别,电话,地址 int size;//记录当前已经有的元素个数//存⼊⼀个好友,size加1,表⽰通讯录⼈数增加⼀个};//声明函数//1.对通讯录进⾏初始化void InitContact(struct Contact* ps);//增加好友信息void AddContact(struct Contact* ps);//删除好友void DelContact(struct Contact* ps);//查找指定姓名的好友void SearchContact(struct Contact* ps);//显⽰好友信息void ShowContact(const struct Contact* ps);//修改好友信息void ModifyContact( struct Contact* ps);//按名字⾸字母对通讯录的好友进⾏排序void SortContact( struct Contact* ps);//帮助使⽤通讯录void HelpContact();//关于通讯录void AboutContact();C.Contact.c#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"#include <stdio.h>#include <stdlib.h>#include <string.h>//初始化通讯录void InitContact(struct Contact* ps){memset(ps->data, 0, sizeof(ps->data));ps->size = 0;//设置通讯录最初只有0个元素}void HelpContact(){printf("各按键的使⽤:\n");printf("1.添加好友\n");printf("2.删除好友\n");printf("3.查找好友信息\n");printf("4.修改好友信息\n");printf("5.显⽰好友信息\n");printf("6.对好友进⾏排序\n");printf("7.帮助使⽤通讯录\n");printf("8.关于通讯录\n");printf("谢谢使⽤通讯录!\n");}//关于通讯录void AboutContact(){printf("通讯录⼀般指在⽇常⽣活中⽤笔记录,也在⼿机,电脑,电⼦字典等电⼦产品中拥有这个功能。
手机通讯录源代码

手机通讯录源代码#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>#define N 15 //最大容量为15typedef struct //定义一个结构{char name[10];char haoma[15];char leibie[10];char dizhi[20];}ren;//菜单void menu() //目录{system("cls"); //清屏printf(" #########欢迎使用手机通讯录#########\n");printf("\n");printf("================================= ========================================= ====\n");printf("1.~~号码查询~~ \n");printf("2.~~号码添加~~ \n");printf("3.~~号码拨号~~ \n");printf("4.~~号码修改~~ \n");printf("5.~~号码删除~~ \n");printf("0. ~~退出~~ \n");printf("================================= ========================================= ====\n");printf("\n");printf("个人通讯录\n");printf("\n");printf(" ~~请选择相应的功能~~:");}void input() //查询{int help=0; //帮助指令,如果查找所找的类别中没有数据,显示ren ry;FILE *fp;char leibie[10];system("cls");printf("\n 输入要查人员的类别:");scanf("%s",leibie);//要查询的类别查找失败if((fp=fopen("ren.dat","rb"))==NULL){printf("can't open file!\n");exit(0);}fread(&ry,sizeof(ren),1,fp);if(!feof(fp)){ printf(" 人员的信息如下:\n");printf("说明:(A办公类B个人类C商务类)");printf("\n%10s %15s %10s %20s \n","姓名","号码","类别","邮箱");while(!feof(fp)){if(strcmp(ry.leibie,leibie)==0) //若为该类别则输出{ help++;printf("%10s %15s %10s %20s\n",,ry.haoma,ry.leibie,ry.dizhi);}fread(&ry,sizeof(ren),1,fp);}if(help==0){printf(" 查找失败!!!");}}// else printf(" 查找失败!!!");fclose(fp);getch();}//修改:输入人员的姓名,查找该人员,若找到则修改该人员的信息,并显示修改前后的结果;//号码添加void search(){int n;FILE *fp; //定义文件指针ren ry,s; // 定义两个ren结构体的量if((fp=fopen("ren.dat","ab+"))==NULL){printf("can't open file!\n");exit(0);}printf("\n录入格式姓名号码类别邮箱。
手机通讯录开发源代码

手机通讯录开发源代码设计开发源代码1.AddContactsActivity类package .demo.pr3;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.EditText;import android.widget.Toast;import .demo.pr3.datax.ContactsTable;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html er;/*增加记录操作界面*/public class AddContactsActivity extends Activity { private EditText nameEditT ext; //输入框private EditText mobileEditText; //手机输入框private EditText qqEditText; //qqprivate EditText danweiEditText; //单位private EditText addressEditText; //地址Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(/doc/10ce63b27ed18 4254b35eefdc8d376eeafaa17c4.html yout.edit);setTitle("添加联系人");//从已设置的页面布局查找对应的控件nameEditText=(EditText)findViewById(/doc/10ce63b27ed184254b35eefdc8d376eeafaa17c4.html );mobileEditText=(EditText)findViewById(R.id.mobile); danweiEditText=(EditText)findViewById(R.id.danwei); qqEditText=(EditText)findViewById(R.id.qq);addressEditText=(EditText)findViewById(R.id.address); }/*创建菜单 */public boolean onCreateOptionsMenu(Menu menu) {menu.add(Menu.NONE,1, Menu.NONE, "保存");menu.add(Menu.NONE,2, Menu.NONE, "返回");return super.onCreateOptionsMenu(menu);}/* 菜单事件*/public boolean onOptionsItemSelected(MenuItem item){ // TODO Auto-generated method stubswitch (item.getItemId()) {case 1://保存if(!nameEditText.getText().toString().equals("")){User user=new User();user.setName(nameEditText.getText().toString());user.setMoblie(mobileEditText.getText().toString());user.setDanwei(danweiEditText.getT ext().toString());user.setQq(qqEditT ext.getText().toString());user.setAddress(addressEditText.getText().toString());ContactsTable ct=new ContactsTable(AddContactsActivity.this);if(ct.addData(user)){Toast.makeText(AddContactsActivity.this, "添加成功!",Toast.LENGTH_SHORT).show();finish();}else{Toast.makeText(AddContactsActivity.this, "添加失败!", Toast.LENGTH_SHORT).show();}}else{Toast.makeText(AddContactsActivity.this, "请先输入数据!", Toast.LENGTH_SHORT).show();}break;case 2://返回finish();break;default:break;}return super.onOptionsItemSelected(item);}}2. ContactsMessageActivity类package .demo.pr3;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.TextView;import .demo.pr3.datax.ContactsTable;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html er;/*显示联系人界面 */public class ContactsMessageActivity extends Activity { private TextView nameTextView; //输入框private TextView mobileTextView; //手机输入框private TextView qqTextView; //qqprivate TextView danweiTextView; //单位private TextView addressTextView; //地址private User user; //修改的联系人Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(/doc/10ce63b27ed18 4254b35eefdc8d376eeafaa17c4.html yout.message);setTitle("联系人信息");//从已设置的页面布局查找对应的控件nameTextView=(TextView)findViewById(http://www.doczj.co m/doc/10ce63b27ed184254b35eefdc8d376eeafaa17c4.html );mobileTextView=(T extView)findViewById(R.id.mobile); danweiTextView=(TextView)findViewById(R.id.danwei); qqTextView=(TextView)findViewById(R.id.qq);addressTextView=(TextView)findViewById(R.id.address);//将要修改的联系人数据付值到用户界面显示Bundle localBundle = getIntent().getExtras();int id=localBundle.getInt("user_ID");ContactsTable ct=new ContactsTable(this);user =ct.getUserByID(id);nameTextView.setT ext(":"+user.getName());mobileTextView.setText(":"+user.getMoblie());qqTextView.setText("QQ:"+user.getQq()); danweiTextView.setText("单位:"+user.getDanwei()); addressTextView.setText("地址:"+user.getAddress());}/*创建菜单*/public boolean onCreateOptionsMenu(Menu menu) { menu.add(Menu.NONE, 1, Menu.NONE, "返回");return super.onCreateOptionsMenu(menu);}/* 菜单事件 */public boolean onOptionsItemSelected(MenuItem item){ // TODO Auto-generated method stubswitch (item.getItemId()) {case 1://返回finish();break;default:break;}return super.onOptionsItemSelected(item);}}3. MyContactsActivity类package .demo.pr3;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.AlertDialog.Builder;import android.content.ContentUris;import android.content.ContentValues;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Color;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html .Uri;import android.os.Bundle;import android.provider.ContactsContract.RawContacts;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html monDataKinds.Phone;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html monDataKinds.StructuredName; import android.provider.ContactsContract.Contacts.Data;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;import .demo.pr3.datax.ContactsTable;import/doc/10ce63b27ed184254b35eefdc8d376 eeafaa17c4.html er;/*主界面*/public class MyContactsActivity extends Activity {private ListView listView; //结果列表private BaseAdapter listViewAdapter; //ListView 列表适配器private User users[];//通讯录用户private int selecteItem=0; //当前选择Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(/doc/10ce63b27ed18 4254b35eefdc8d376eeafaa17c4.html yout.main);setTitle("通讯录");listView = (ListView) findViewById(R.id.listView);loadContacts();}/*加载联系人列表*/private void loadContacts(){//获取所以通讯录联系人ContactsTable ct=new ContactsTable(this);users=ct.getAllUser();//listView列表现实适配器listViewAdapter=new BaseAdapter() {Overridepublic View getView(int position,View convertView, ViewGroup parent) {if(convertView==null){TextView textView =new TextView(MyContactsActivity.this); textView.setTextSize(22);convertView=textView;}String moblie=users[position].getMoblie()==null?"" :users[position].getMoblie();((TextView)convertView).setText(users[position].getName()+"---"+moblie);if(position==selecteItem){convertView.setBackgroundColor(Color.YELLOW); }else{convertView.setBackgroundColor(0);}return convertView;}Overridepublic long getItemId(int position) {return position;}Overridepublic Object getItem(int position) {return users[position];}Overridepublic int getCount() {return users.length;}};//设置listView控件的适配器listView.setAdapter(listViewAdapter);listView.setOnItemClickListener(new OnItemClickListener() { Overridepublic void onItemClick(AdapterView arg0, View arg1, int arg2,long arg3) {// TODO Auto-generated method stub//记录点击列selecteItem=arg2;//刷新列表listViewAdapter.notifyDataSetChanged();}});}/*创建菜单*/public boolean onCreateOptionsMenu(Menu menu) {menu.add(Menu.NONE, 1, Menu.NONE, "添加");menu.add(Menu.NONE, 2, Menu.NONE, "编辑");menu.add(Menu.NONE, 3, Menu.NONE, "查看信息");menu.add(Menu.NONE, 4, Menu.NONE, "删除");menu.add(Menu.NONE, 5, Menu.NONE, "查询");menu.add(Menu.NONE, 6, Menu.NONE, "导入到手机薄");menu.add(Menu.NONE, 7, Menu.NONE, "退出");return super.onCreateOptionsMenu(menu);}/*菜单事件*/public boolean onOptionsItemSelected(MenuItem item){// TODO Auto-generated method stubswitch (item.getItemId()) {case 1://添加Intent intent = new Intent(MyContactsActivity.this,AddContactsActivity.class);startActivity(intent);break;case 2://编辑if(users[selecteItem].getId_DB()>0)//根据数据库ID判断当前记录是否可以操作{intent = new Intent(MyContactsActivity.this,UpdateContactsActivity.class);intent.putExtra("user_ID", users[selecteItem].getId_DB());startActivity(intent);}else{Toast.makeText(this, "无结果记录,无法操作!",Toast.LENGTH_SHORT).show();}break;case 3://查看信息if(users[selecteItem].getId_DB()>0){intent = new Intent(MyContactsActivity.this,ContactsMessageActivity.class);intent.putExtra("user_ID", users[selecteItem].getId_DB());startActivity(intent);}else{Toast.makeText(this, "无结果记录,无法操作!",Toast.LENGTH_SHORT).show();}break;case 4://删除if(users[selecteItem].getId_DB()>0){delete();}else{Toast.makeText(this, "无结果记录,无法操。
ASP通讯录源代码

通讯录源代码:1、基本通讯录odbc_connection.asp<%dim dbset db=server.createobject("ADODB.CONNECTION")db.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & server.mappath("address.mdb")%>Index.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>我们的通讯录</title></head><body><h2 align="center">我们的通讯录</h2><center><table border="0" width="90%"><tr bgcolor="#B7B7B7" align="center"><td width=20%>姓名</td><td width=30%>电话</td><td width=30%>email</td><td width=20%>详细</td></tr><%'建立Recordset对象Dim strSql,rsstrSql ="Select name,tel,email,id From users"Set rs=db.execute(strSql)Do While Not rs.Eof%><tr bgcolor="#F2F2F2" align="center"><td><%=rs("name")%></td><td><%=rs("tel")%></td><td><%=rs("email")%></td><td><a href="particular.asp?id=<%=rs("id")%>" target="_blank">详细</a></td></tr><%rs.MoveNextLoop%></table></center></body></html>Particular.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>详细资料</title></head><body><h2 align="center">详细资料</h2><%'利用Request.QueryString获取传过来的ID编号Dim idid=Request.QueryString("id")strSql ="Select * From users where id=" & idSet rs=db.Execute(strSql)%><center><table border="0" width="80%" ><tr><td width=20%>姓名:</td><td><%=rs("name")%></td> </tr><tr><td>电话:</td><td><%=rs("tel")%></td></tr><tr><td>email:</td><td><%=rs("email")%></td></tr><tr><td>简介:</td><td><%=rs("intro")%></td></tr><table><p> <p align=center><a href="javascript:close()">关闭窗口</a></center></body></html>2、通过姓名链接详细页面---index.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>我们的通讯录</title></head><body><h2 align="center">我们的通讯录</h2><center><table border="0" width="90%"><tr bgcolor="#B7B7B7" align="center"><td width=40%>姓名</td><td width=30%>电话</td><td width=30%>email</td></tr><%'建立Recordset对象Dim strSql,rsstrSql ="Select name,tel,email,id From users"Set rs=db.execute(strSql)Do While Not rs.Eof%><tr bgcolor="#F2F2F2" align="center"><td><a href="particular.asp?id=<%=rs("id")%>" target="_blank"><%=rs("name")%></a></td><td><%=rs("tel")%></td><td><%=rs("email")%></td></tr><%rs.MoveNextLoop%></table></center></body></html>3、详细页面在指定大小的窗口中打开—index.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>我们的通讯录</title></head><body><h2 align="center">我们的通讯录</h2><center><table border="0" width="90%"><tr bgcolor="#B7B7B7" align="center"><td width=20%>姓名</td><td width=30%>电话</td><td width=30%>email</td></tr><%'建立Recordset对象Dim strSql,rsstrSql ="Select * From users"Set rs=db.execute(strSql)Do While Not rs.Eof%><tr bgcolor="#F2F2F2" align="center"><td><a href="#"onClick="open('particular.asp?id=<%=rs("id")%>','','resizable=0,scrollbars=1,st atus=no,toolbar=no,menu=no,width=500,height=300,left=150,top=150')"><%=rs ("name")%></a></td><td><%=rs("tel")%></td><td><%=rs("email")%></td></tr><%rs.MoveNextLoop%></table></center></body></html>4、按字段排序源代码:index.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>我们的通讯录</title></head><body><h2 align="center">我们的通讯录</h2><center><table border="0" width="90%"><tr bgcolor="#B7B7B7" align="center"><td width=10%><a href="index.asp?sortfield=id">编号</a></td><td width=10%><a href="index.asp?sortfield=name">姓名</a></td><td width=30%><a href="index.asp?sortfield=tel">电话</a></td><td width=30%><a href="index.asp?sortfield=email">email</a></td><td width=20%><a href="index.asp?sortfield=submit_date">提交日期</a></td></tr><%'这一段主要来获取排序字段,第一次打开时默认按提交日期到序排列,客户选择字段后按指定字段倒叙排列Dim sortfield '定义一个排序字段变量If Request.QueryString("sortfield")="" Then'该条件表示是第一次打开,则令排序字段为提交日期,并倒叙排列sortfield="submit_date DESC"Else'如果选择了其它排序字段,则按指定字段倒叙排列sortfield=Request.QueryString("sortfield") & " DESC"End If'建立Recordset对象,并按指定字段排序Dim strSql,rsstrSql ="Select * From users Order By " & sortfield '请注意By后面要有一个空格Set rs=db.execute(strSql)Do While Not rs.Eof%><tr bgcolor="#F2F2F2" align="center"><td><%=rs("id")%></td><td><%=rs("name")%></td><td><%=rs("tel")%></td><td><%=rs("email")%></td><td><%=rs("submit_date")%></td></tr><%rs.MoveNextLoop%></table></center></body></html>5、分页显示源代码---index.asp p596、分页显示改进源代码---index.asp p61-627、按单个关键字查询源代码---index.asp p638、按多个关键字查询源代码---index.asp<!--#INCLUDE FILE="odbc_connection.asp"--><html><head><title>我们的通讯录</title></head><body><%'这两个变量用来确定查找关键字和字段Dim keyword,fieldIf Trim(Request.Form("keyword"))<>"" Then'如果条件成立,表示客户输入了关键字。
通讯录源代码,直接可用

#include <stdio.h>#include <windows.h>#include <stdlib.h>#include <conio.h>#include <string.h>/********************结构体定义******************************/ struct Contact{char NAME[20];char Phone[12];char QQ[12];};struct Node{Contact person;Node *next;};Node *head=NULL;/**************************函数申明*************************/ void AddPerson(Contact); //添加联系人Contact *FindPerson(char *name); //查找联系人void DelPerson(char *name); //删除联系人void ShowAll(); //显示所有联系人void function_6(); //分类显示联系人void SaveData(); //保存联系人信息void LoadData(); //载入联系人信息void face(); //界面int CheckPhone(char *num); //检验手机号是否合法int JudgePhone(char *num); //判断电话号码的用户类型/**********************主函数部分****************************/ int main(){system("title 迷你通讯录BY 马恒");system("color f2");LoadData();int op;face();while(1){printf("请选择功能:");fflush(stdin);if(0==scanf("%d",&op)){printf("\n输入不合法,请重新输入!\n");continue;}switch(op){case 0:{printf("感谢您的使用,下次再见!\n");getchar();exit(0);}break;case 1:{Contact per;fflush(stdin);printf("姓名:");scanf("%s",);do{printf("联系电话:");scanf("%s",per.Phone);}while(!CheckPhone(per.Phone));printf("QQ:");scanf("%s",per.QQ);AddPerson(per);SaveData();printf("添加联系人成功!\n");}break;case 2:{char name[15];printf("输入查找姓名:");scanf("%s",name);Contact *per=FindPerson(name);if(NULL!=per){printf("%s %s %s",per->NAME,per->Phone,per->QQ);}else{printf("%s联系人不存在,查询失败!",name);}}break;case 3:{char name[15];printf("输入需要修改的联系人:\n");scanf("%s",name);Contact *per=FindPerson(name);if(NULL==per){printf("%s联系人不存在,修改失败!",name);}else{printf("新姓名:");scanf("%s",per->NAME);printf("\n新号码:");scanf("%s",per->Phone);printf("\n新QQ号:");scanf("%s",per->QQ);SaveData();printf("更新联系人成功!\n");}}break;case 4:{char name[20];printf("输入需要删除的联系人:");scanf("%s",name);Contact *per=FindPerson(name);if(per==NULL){printf("%s联系人不存在,删除失败!",name);}else{DelPerson(name);SaveData();printf("\n成功删除联系人!\n");}}break;case 5:{ShowAll();}break;case 6:{system("cls");for(int i=1;i<=80;i++){printf("@");}printf("\t\t\t\t1.显示全部移动用户\n");//2printf("\t\t\t\t2.显示全部联通用户\n");//1printf("\t\t\t\t3.显示全部电信用户\n");//3printf("\t\t\t\t0.返回主菜单\n");for(i=1;i<=80;i++){printf("@");}int m=1,op;while(m){Node *p=head;printf("请输入指令:");fflush(stdin);if(0==scanf("%d",&op)){printf("您输入的指令无效,重新输入:");continue;}switch(op){case 0:{system("cls");face();m=0;}break;case 1:{while(NULL!=p){if(2==JudgePhone(p->person.Phone)){printf("%s %s %s \n",p->,p->person.Phone,p->person.QQ);}p=p->next;}}break;case 2:{while(NULL!=p){if(1==JudgePhone(p->person.Phone)){printf("%s %s %s \n",p->,p->person.Phone,p->person.QQ);}p=p->next;}}break;case 3:{while(NULL!=p){if(3==JudgePhone(p->person.Phone)){printf("%s %s %s \n",p->,p->person.Phone,p->person.QQ);}p=p->next;}}break;default:{printf("输入不合法,重新输入:");}}}}break;default:{printf("您输入的内容不合法,请重新输入!\n");}}}return 0;}void AddPerson(Contact person) //添加联系人Node *pNewNode;pNewNode=(Node*)malloc(sizeof(Node));pNewNode->person=person;pNewNode->next=NULL;if(NULL==head){head=pNewNode;}else{Node *pNode=head;while(NULL!=pNode->next){pNode=pNode->next;}pNode->next=pNewNode;}}void ShowAll() //显示所有联系人{Node *pNode=head;int icnt=0;while(NULL!=pNode){printf("%s %s %s \n",pNode->,pNode->person.Phone,pNode->person.QQ);pNode=pNode->next;icnt++;}printf("一共有%d个联系人\n",icnt);}Contact *FindPerson(char *name) //查找联系人{Node *pNode=head;while(NULL!=pNode){if(strcmp(pNode->,name)==0){break;}elsepNode=pNode->next;}return pNode?(&(pNode->person)):NULL;}void DelPerson(char *name){if(strcmp(head->,name)==0){Node *pNewHead=head->next;free(head);head=pNewHead;return;}Node *p1=head;while(strcmp(p1->next->,name)!=0) {p1=p1->next;}Node *p2=p1->next->next;free(p1->next);p1->next=p2;}void LoadData(){FILE *fp=fopen("data","rb");if(NULL==fp){return;}Contact ct;while(fread(&ct,sizeof(Contact),1,fp)){AddPerson(ct);}fclose(fp);}void SaveData(){FILE *fp=fopen("data","wb"); //以二进制写入Node *pNode=head;while(NULL!=pNode){fwrite(&(pNode->person),sizeof(Contact),1,fp);pNode=pNode->next;}fclose(fp);}void face(){for(int i=1;i<=80;i++)printf("=");for(i=1;i<=30;i++)printf("=");printf("通讯录管理系统v1.0");for(i=0;i<=30;i++)printf("=");for(i=1;i<=80;i++)printf("=");printf("\t\t\t\t1.添加联系人\n");printf("\t\t\t\t2.查找联系人\n");printf("\t\t\t\t3.修改联系人\n");printf("\t\t\t\t4.删除联系人\n");printf("\t\t\t\t5.显示所有联系人\n");printf("\t\t\t\t6.分类显示联系人\n");printf("\t\t\t\t0.退出通讯录\n");for(i=1;i<=80;i++){printf("=");}for(i=1;i<=80;i++){printf("=");}}int CheckPhone(char *num){if(11!=strlen(num)){return 0;}int i;for(i=0;i<11;i++){if(num[i]<'0'||num[i]>'9'){return 0;}}return 1;}int JudgePhone(char *num) //判断电话号码的用户类型{if('1'!=num[0]){return 0;}if('1'==num[0]){if('3'==num[1]){switch(num[2]){case '0':case '1':case '2':return 1;break;case '3':return 3;break;case '4':case '5':case '6':case '7':case '8':case '9':return 2;break;default:return 0;}}else if('5'==num[1]){switch(num[2]){case '0':case '1':case '2':case '7':case '8':case '9':return 2;break;case '5':case '6':return 1;break;case '3':return 3;break;default:return 0;}}else if('8'==num[1]){switch(num[2]){case'5':case'6':return 1;break;case'0':case'1':case'2':case'7':case'8':case'9':return 2;break;case'3':return 3;break;default:return 0;break;}}else{return 0;}}return 0;}。
c语言编写通讯录程序源代码

c语言编写通讯录程序源代码以下是一个简单的 C 语言编写的通讯录程序示例,包含了添加、查找、修改和删除联系人的功能:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_CONTACTS 100// 联系人结构体struct Contact {char name[50];char number[20];};// 通讯录数组struct Contact contacts[MAX_CONTACTS];// 通讯录大小int size = 0;// 添加联系人void addContact() {if (size >= MAX_CONTACTS) {printf("通讯录已满,无法添加更多联系人。
\n");return;}printf("请输入联系人姓名:");scanf("%s", contacts[size].name);printf("请输入联系人号码:");scanf("%s", contacts[size].number);size++;printf("联系人已添加。
\n");}// 查找联系人void findContact() {char name[50];printf("请输入要查找的联系人姓名:");scanf("%s", name);for (int i = 0; i < size; i++) {if (strcmp(contacts[i].name, name) == 0) {printf("姓名:%s\n", contacts[i].name); printf("号码:%s\n", contacts[i].number); return;}}printf("未找到该联系人。
c语言通讯录源代码

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>struct person{char name[15];char sex[2];int nianling;long int youbian;char addr[50];char celephone[22];char homephone[22];char company[20];char email[40];long int QQ;}per[500];int num=0;//*外部变量num为文件中的纪录数*//FILE *fp;void mainmenu();//*主菜单*//void newrecord();//新添纪录*//void xiugaimenu();//*修改菜单*//void xiugaibyname();//*按姓名修改*//void xiugaibycelephone();//*按手机号码修改*//void xiugaixiangmu(int a);//*修改项目*//void searchmenu();//*查询菜单*//void searchbyname();//*按姓名查询*//void searchbycelephone();//*按手机号码查询*//void searchbyhomephone();//*按家庭电话号码查询*// void searchbyqq();//*按QQ查询*//void deletemenu();//*删除菜单*//void deleteall();//*删除所有信息*//void deleteone();//*删除单个*//void showall();//*输出全部信息*//void readfromfile();//*读取文件*//void writetofile();//*写入文件*// /void deletebycelephone(); //*按手机号码删除*//void deletebyname();//*按姓名删除*/void listbycelephone();//*按手机号码排序*//void listbyname();//*按姓名排序*//void listmenu();//*排序菜单*//void main()//*主函数*//{system("cls");readfromfile();while (1){mainmenu();}} //*主函数结束*//void mainmenu()//*主菜单函数*//{int a;system("cls");system("color 2a");printf("\n\t 您好! 欢迎使用通讯录!\n");printf(" 1: 添加个人信息\n");printf(" 2: 查询个人信息\n");printf(" 3: 删除个人信息\n");printf(" 4: 修改个人信息\n");printf(" 5: 信息排序\n");printf(" 6: 输出全部信息\n");printf(" 7: 写入文件\n");printf(" 8: 读取文件\n");printf(" 9: 删除所有\n");printf(" 0: 退出\n");printf(" 请输入您的数字选择: ");loop1: scanf("%d",&a);switch (a){case 1:newrecord();break;case 2:searchmenu();break;case 3:deletemenu();break;case 4:xiugaimenu();break;case 5:listmenu();break;case 6:showall();break;case 7:writetofile();break;case 8:readfromfile();break;case 9:deleteall();break;case 0:exit(0);default:printf("对不起!您的输入有误!请重新输入: ");goto loop1;}}void newrecord()//*添加纪录*//{int a;system("cls");system("color 2a");loop: printf("\n\n\n\n\t\t 请输入您要添加的联系人的信息:\n");printf("\n请输入姓名:\n");name: scanf("%s",&per[num].name);if(strlen(per[num].name)>15){printf("对不起!您的输入有误!请重新输入");goto name;}printf("\n请输入性别:\n");sex: scanf("%s",&per[num].sex);if(strlen(per[num].sex)==0){printf("对不起!您的输入有误!请重新输入");goto sex;}printf("\n请输入年龄:");nianling: scanf("%d",&per[num].nianling);if(per[num].nianling<10||per[num].nianling>110){printf("对不起!您的输入有误!请重新输入");goto nianling;}printf("\n请输入邮编\n");youbian: scanf("%d",&per[num].youbian);if(per[num].youbian<10000||per[num].youbian>999999){printf("对不起!您的输入有误!请重新输入");goto youbian;}printf("\n请输入地址\n");addr: scanf("%s",&per[num].addr);if(strlen(per[num].addr)>50||strlen(per[num].addr)<4){printf("对不起!您的输入有误!请重新输入\n");goto addr;}printf("\n请输入手机号码:\n");celephone: scanf("%s",&per[num].celephone);if(strlen(per[num].celephone)!=11){printf("对不起!您的输入有误!请重新输入\n");goto celephone;}printf("\n请输入家庭电话号码:\n");homephone: scanf("%s",&per[num].homephone);if(strlen(per[num].homephone)!=11){printf("对不起!您的输入有误!请重新输入\n");goto homephone;}printf("\n请输入公司名称:");company: scanf("%s",&per[num].company);if(strlen(per[num].company)>20||strlen(per[num].company)<10){printf("对不起!您的输入有误!请重新输入");goto company;}printf("\n输入电子邮箱:");email: scanf("%s",&per[num].email);if(strlen(per[num].email)>30||strlen(per[num].email)<4){printf("对不起!您的输入有误!请重新输入");goto email;}printf("\n输入QQ号码:");QQ: scanf("%ld",&per[num].QQ);if(per[num].QQ>00||per[num].QQ<){printf("对不起!您的输入有误!请重新输入");goto QQ;}num++;printf("\n是否继续添加?\n");printf("\n请按1和2(1代表继续;2代表不继续)\n");printf("请输入您的选择");scanf("%d",&a);if(a==1){goto loop;}else{return;}}void searchmenu()//*查询菜单*//{int a;system("cls");system("color 2a");printf("\n\t\t 欢迎使用查询菜单");printf("\n\t\t 1-按手机号码查询");printf("\n\t\t 2-按姓名查询");printf("\n\t\t 3-按家庭电话号码查询");printf("\n\t\t 4-按QQ查询");printf("\n\t\t 5-返回主菜单");printf("\n\t\t");printf("请输入您的选择");scanf("%d",&a);switch (a){case 1:searchbycelephone();break;case 2:searchbyname();break;case 3:searchbyhomephone();break;case 4:searchbyqq();break;case 5:mainmenu();break;}}void searchbycelephone()//*按手机号码查询*//{int mark=0;int i,j;int a=0;char celephone[11];printf("\n 按手机号码查找\n");printf("\n请输入手机号码:\n");scanf("%s",celephone);for(i=0;i<num;i++){if (strcmp(per[i].celephone,celephone)==0){printf("\n 以下是您查找的联系人的信息");printf("\n________________________________");printf("\n名字:%s",per[i].name);printf("\n性别:%s",per[i].sex);printf("\n年龄:%d",per[i].nianling);printf("\n邮编:%ld",per[i].youbian);printf("\n地址:%s",per[i].addr);printf("\n手机号码:%s",per[i].celephone);printf("\n家庭电话号码:%s",per[i].homephone);printf("\n公司名称:%s",per[i].company);printf("\n电子邮件:%s",per[i].email);printf("\nQQ号码:%ld",per[i].QQ);printf("\n________________________________");printf("\n请按任意数字键返回主菜单");mark++;scanf("%d",&j);return;}}if (mark==0){printf("\n对不起!没有该联系人的信息!");printf("\n请按任意数字键返回主菜单");scanf("%d",&j);return;}}void searchbyname()//*按姓名查询*//{int mark=0;int i,j,findmark=0;int a=0;char name[15];printf("\n 按姓名查找");printf("\n请输入姓名:");scanf("%s",name);for(i=a;i<num;i++){if (strcmp(per[i].name,name)==0){findmark++;printf("\n\t\t 以下是您查找的联系人的信息");printf("\n\t\t________________________________");printf("\n\t\t名字:%s",per[i].name);printf("\n\t\t性别:%s",per[i].sex);printf("\n\t\t年龄:%d",per[i].nianling);printf("\n\t\t邮编:%ld",per[i].youbian);printf("\n\t\t地址:%s",per[i].addr);printf("\n\t\t手机号码:%s",per[i].celephone);printf("\n\t\t家庭电话号码:%s",per[i].homephone);printf("\n\t\t公司名称:%s",per[i].company);printf("\n\t\t电子邮件:%s",per[i].email);printf("\n\t\tQQ号码:%ld",per[i].QQ);printf("\n\t\t________________________________");if ((i+1)<num){printf("\n是否继续查找相同名字的联系人的信息?(1代表继续;2代表不继续)");scanf("%d",&j);if (j==1){a=i;mark++;continue;}elsebreak;}else{printf("\n请按任意数字键返回主菜单");scanf("%d",&j);return;}}}if(mark!=0){printf("\n对不起! 没有相同名字的该联系人的信息!!");printf("\n请按任意数字键返回主菜单");scanf("%d",&j);return;}else if(findmark==0){printf("\n对不起!没有该联系人的信息!");printf("\n请按任意数字键返回主菜单");scanf("%d",&j);return;}}void searchbyhomephone()//*按家庭电话号码查询*//{int mark=0;int i,j;int a=0;char homephone[11];printf("\n\t\t 按家庭电话号码查找");printf("\n请输入家庭电话号码:");scanf("%s",homephone);for(i=0;i<num;i++){if (strcmp(per[i].homephone,homephone)==0){printf("\n\t\t 以下是您要查找的联系人的信息");printf("\n\t\t________________________________");printf("\n\t\t名字:%s",per[i].name);printf("\n\t\t性别:%s",per[i].sex);printf("\n\t\t年龄:%d",per[i].nianling);printf("\n\t\t邮编:%ld",per[i].youbian);printf("\n\t\t地址:%s",per[i].addr);printf("\n\t\t手机号码:%s",per[i].celephone);printf("\n\t\t家庭电话号码:%s",per[i].homephone);printf("\n\t\t公司名称:%s",per[i].company);printf("\n\t\t电子邮件:%s",per[i].email);printf("\n\t\tQQ号码:%ld",per[i].QQ);printf("\n\t\t________________________________");printf("\n\t\t请按任意数字键返回主菜单");mark++;scanf("%d",&j);return;}}if (mark==0){printf("\n\t\t对不起!没有该联系人的信息!");printf("\n\t\t请按任意数字键返回主菜单");scanf("%d",&j);return;}}void searchbyqq()//*按QQ查询*//{int mark=0;int i,j;long int QQ;printf("\n\t\t 按QQ号码查找\n");printf("\n请输入QQ号码:");scanf("%ld",&QQ);for(i=0;i<num;i++){if(per[i].QQ==QQ){printf("\n\t\t 以下是您查找的联系人的信息");printf("\n\t\t________________________________");printf("\n\t\t名字:%s",per[i].name);printf("\n\t\t性别:%s",per[i].sex);printf("\n\t\t年龄:%d",per[i].nianling);printf("\n\t\t邮编:%ld",per[i].youbian);printf("\n\t\t地址:%s",per[i].addr);printf("\n\t\t手机号码:%s",per[i].celephone);printf("\n\t\t家庭电话号码:%s",per[i].homephone);printf("\n\t\t公司名称:%s",per[i].company);printf("\n\t\t电子邮件:%s",per[i].email);printf("\n\t\tQQ号码:%ld",per[i].QQ);printf("\n\t\t________________________________");printf("\n\t\t请按任意数字键返回主菜单");mark++;scanf("%d",&j);return;}}if (mark==0){printf("\n\t\t对不起!没有该联系人的信息!");printf("\n\t\t请按任意数字键返回主菜单");scanf("%d",&j);return;}}void deletemenu()//*删除菜单*//{int i,j;system("cls");system("color 3b");if(num==0){printf("\n\t\t对不起!文件中无任何纪录!");printf("\n\t\t请先添加个人信息!");printf("\n\t\t请按任意数字键返回主菜单");scanf("%d",&j);return;}else{printf("\n\t\t 删除菜单");printf("\n\t\t 1-删除单个");printf("\n\t\t 2-返回主菜单");printf("\n\t\t ");printf("\n\t\t请输入您的数字选择: ");loop4: scanf("%d",&i);switch (i){case 1:deleteone();break;case 2:mainmenu();break;default:printf("对不起!您的输入有误!请重新输入: ");goto loop4;}}}void deleteone()//*删除单个*//{int i;printf("\n\t\t1-按手机号码删除2-按姓名删除");printf("\n\t\t请输入您的选择:");loop5:scanf("%d",&i);;switch (i){case 1:deletebycelephone();break;case 2:deletebyname();break;default:printf("对不起!您的输入有误!请重新输入: ");goto loop5;}}void deletebyname()//姓名删除*//{int a=0;int findmark=0;int i,j,k;int deletemark=0;char name[15];printf("\n\t\t请输入您要删除的联系人的姓名:");scanf("%s",name);for (i=a;i<num;i++){if (strcmp(per[i].name,name)==0){printf("\n\t\t以下是您要删除的联系人的纪录:");findmark++;printf("\n\t\t________________________________");printf("\n\t\t名字:%s",per[i].name);printf("\n\t\t性别:%s",per[i].sex);printf("\n\t\t年龄:%d",per[i].nianling);printf("\n\t\t邮编:%ld",per[i].youbian);printf("\n\t\t地址:%s",per[i].addr);printf("\n\t\t手机号码:%s",per[i].celephone);printf("\n\t\t家庭电话号码:%s",per[i].homephone);printf("\n\t\t公司名称:%s",per[i].company);printf("\n\t\t电子邮件:%s",per[i].email);printf("\n\t\tQQ号码:%ld",per[i].QQ);printf("\n\t\t________________________________");printf("\n\t\t是否删除?(1代表删除;2代表不删除)\n");printf("\n\t\t请输入您的数字选择: ");scanf("%d",&k);if(k==1){for (j=i;j<num-1;j++) //*纪录移动,从per数组中删除之*//per[j]=per[j+1];num--;deletemark++;printf("\n\t\t删除成功");if((i+1)<num){printf("\n\t\t是否继续删除相同姓名的联系人的信息?(1代表删除;2代表不删除)");printf("\n\t\t请输入您的数字选择: ");scanf("%d",&k);if(k=1){a=i;findmark++;continue;}}printf("\n\t\t是否继续删除?(1代表继续;2代表不继续)");printf("\n\t\t请输入您的数字选择: ");scanf("%d",&k);if(k==1)deleteone();elsebreak;}}elsecontinue;}if((deletemark==0)&&(findmark==0)){printf("\n\t\t对不起!没有该联系人的纪录!");printf("\n\t\t是否继续删除?(1代表继续;2代表不继续)");printf(" 请输入您的数字选择: ");scanf("%d",&k);if(k==1)deleteone();}else if(findmark!=0){printf("\n\t\t对不起!没有重名信息!");printf("\n\t\t是否继续删除?(1代表继续;2代表不继续)");printf(" 请输入您的数字选择: ");scanf("%d",&k);if(k==1)deleteone();}}void deletebycelephone()//*按手机号码删除*//{int i,j,h,m;int deletemark=0;char celephone[11];printf("\n\t\t请输入要删除的联系人的手机号码:");scanf("%s",celephone);for(i=0;i<num;i++){if(strcmp(per[i].celephone,celephone)==0){deletemark++;printf("\n\t\t以下是您要删除的联系人的纪录:");printf("\n\t\t________________________________");printf("\n\t\t名字:%s",per[i].name);printf("\n\t\t性别:%s",per[i].sex);printf("\n\t\t年龄:%d",per[i].nianling);printf("\n\t\t邮编:%ld",per[i].youbian);printf("\n\t\t地址:%s",per[i].addr);printf("\n\t\t手机号码:%s",per[i].celephone);printf("\n\t\t家庭电话号码:%s",per[i].homephone);printf("\n\t\t公司名称:%s",per[i].company);printf("\n\t\t电子邮件:%s",per[i].email);printf("\n\t\tQQ号码:%ld",per[i].QQ);printf("\n\t\t________________________________");printf("\n\t\t是否删除?(1代表删除;2代表不删除)\n");printf(" 请输入您的数字选择: ");scanf("%d",&h);if(h==1){for (j=i;j<num-1;j++) /*纪录移动,从per数组中删除之*/per[j]=per[j+1];num--;printf("\n\t\t删除成功");printf("\n是否继续删除?(1代表继续;2代表不继续)\n");printf(" 请输入您的数字选择: ");scanf("%d",&h);if(h==1)deletebycelephone();}}}if(deletemark==0){printf("\n\t\t对不起!没有该联系人的纪录!");printf("\n\t\t是否继续删除?(1代表继续;2代表不继续)\n");printf(" 请输入您的数字选择: ");scanf("%d",&m);if(m==1)deletebycelephone();}}void xiugaimenu()//*修改菜单*//{int i,j;system("cls");system("color 3f");if(num==0){printf("\n\t\t对不起!文件中无任何纪录!");printf("\n\t\t请按任意数字键返回主菜单");scanf("%d",&j);return;}else{printf("\n\t\t 1-按姓名修改2-按手机号码修改\n");printf(" 请输入您的数字选择: ");loop6:scanf("%d",&i);switch (i){case 1:xiugaibyname();break;case 2:xiugaibycelephone();break;default:printf("对不起!您的输入有误!请重新输入: ");goto loop6;}}}void xiugaibyname()//*按姓名修改*//{int a=0;int findmark=0;int xiugaimark=0;int i,j;char name[15];printf("\n\t\t请输入要修改联系人的姓名:");scanf("%s",name);for (i=a;i<num;i++){if (strcmp(per[i].name,name)==0){printf("\n\t\t以下是您要修改的联系人的纪录:");findmark++;printf("\n\t\t________________________________");printf("\n\t\t名字:%s",per[i].name);printf("\n\t\t性别:%s",per[i].sex);printf("\n\t\t年龄:%d",per[i].nianling);printf("\n\t\t邮编:%ld",per[i].youbian);printf("\n\t\t地址:%s",per[i].addr);printf("\n\t\t手机号码:%s",per[i].celephone);printf("\n\t\t家庭电话号码:%s",per[i].homephone);printf("\n\t\t公司名称:%s",per[i].company);printf("\n\t\t电子邮件:%s",per[i].email);printf("\n\t\tQQ号码:%ld",per[i].QQ);printf("\n\t\t________________________________");printf("\n\t\t是否修改?(1代表修改;2代表不修改)");printf(" 请输入您的数字选择: ");scanf("%d",&j);if (j==1){xiugaixiangmu(i);xiugaimark++;printf("\n\t\t修改成功");if((i+1)<num){printf("\n\t\t是否继续修改相同姓名的联系人的信息?(1代表继续;2代表不继续)");printf(" 请输入您的数字选择: ");scanf("%d",&j);if (j==1){a=i;findmark++;continue;}}printf("\n\t\t是否继续修改?(1代表继续;2代表不继续)");printf(" 请输入您的数字选择: ");scanf("%d",&j);if (j==1)xiugaibyname();return;}}}if ((xiugaimark==0)&&(findmark==0)){printf("\n\t\t没有该联系人的纪录");printf("\n\t\t是否继续修改?(1代表继续;2代表不继续)");printf(" 请输入您的数字选择: ");scanf("%d",&j);if (j==1)xiugaibyname();return;}else if (findmark!=0){printf("\n\t\t没有重名信息");printf("\n\t\t是否继续修改?(1代表继续;2代表不继续)");printf(" 请输入您的数字选择: ");scanf("%d",&j);if (j==1)xiugaibyname();return;}}void xiugaibycelephone()//*按手机号码修改*//{int findmark=0;int i,j;char celephone[11];printf("\n\t\t请输入要修改联系人的手机号码:");scanf("%s",celephone);for (i=0;i<num;i++){if (strcmp(per[i].celephone,celephone)==0){printf("\n\t\t以下是您要修改的联系人的纪录:");findmark++;printf("\n\t\t________________________________");printf("\n\t\t名字:%s",per[i].name);printf("\n\t\t性别:%s",per[i].sex);printf("\n\t\t年龄:%d",per[i].nianling);printf("\n\t\t邮编:%ld",per[i].youbian);printf("\n\t\t地址:%s",per[i].addr);printf("\n\t\t手机号码:%s",per[i].celephone);printf("\n\t\t家庭电话号码:%s",per[i].homephone);printf("\n\t\t公司名称:%s",per[i].company);printf("\n\t\t电子邮件:%s",per[i].email);printf("\n\t\tQQ号码:%ld",per[i].QQ);printf("\n\t\t________________________________");printf("\n\t\t是否修改?(1代表修改;2代表不修改)");printf(" 请输入您的数字选择: ");scanf("%d",&j);if (j==1){xiugaixiangmu(i);printf("\n\t\t修改成功");printf("\n\t\t是否继续修改?(1代表继续;2代表不继续)");printf(" 请输入您的数字选择: ");scanf("%d",&j);printf(" 请输入您的数字选择: ");if (j==1)xiugaixiangmu(i);break;}}}if (findmark==0){printf("\n\t\t对不起!没有该联系人的纪录!");printf("\n\t\t是否继续修改?(1代表继续;2代表不继续)");printf(" 请输入您的数字选择: ");scanf("%d",&j);if (j==1)xiugaibycelephone();return;}}void xiugaixiangmu(int a)//*修改项目*//{int i;system("cls");system("color c0");printf("\n\t\t 请输入您要修改的项目");printf("\n\t\t\n");printf("\n\t\t1-手机号码\n");printf("\n\t\t2-姓名\n");printf("\n\t\t3-家庭电话号码\n");printf("\n\t\t4-QQ号码\n");printf("\n\t\t5-地址\n");printf("\n\t\t6-邮编\n");printf("\n\t\t7-电子邮件\n");printf("\n\t\t8-回主菜单\n");printf("\n\t\t\n");printf(" 请输入您的数字选择: ");scanf("%d",&i);loop9: switch (i){case 1:printf("请输入手机号码:");scanf("%s",&per[a].celephone);break;case 2:printf("请输入姓名:");scanf("%s",&per[a].name);break;case 3:printf("请输入家庭电话号码:");scanf("%s",&per[a].homephone);break;case 4:printf("请输入QQ号码:");scanf("%s",&per[a].QQ);break;case 5:printf("请输入地址:");scanf("%s",&per[a].addr);break;case 6:printf("请输入邮编:");scanf("%s",&per[a].youbian);break;case 7:printf("请输入email:");scanf("%s",&per[a].email);break;case 8:mainmenu();break;default: printf("对不起!您的输入有误!请重新输入: ");goto loop9;}}void listmenu()//*排序菜单*//{int i,j;system("cls");system("color b0");if(num==0){printf("\n\t\t对不起,文件中无任何纪录");printf("\n\t\t请按任意数字键返回主菜单");scanf("%d",&j);return;}else{system("cls");system("color 12");printf("\n\t\t 排序菜单");printf("\n\t\t 1-按姓名排序");printf("\n\t\t 2-按手机号码排序");printf("\n\t\t 3-返回主菜单");printf(" 请输入您的数字选择: ");loop10: scanf("%d",&i);switch(i){case 1:listbyname();break;case 2:listbycelephone();break;case 3:mainmenu();break;default:printf("对不起!您的输入有误!请重新输入: ");goto loop10;}}}void listbyname()//*按姓名排序*//{int i,j,k;struct person tmp;for (i=1;i<num;i++){if(strcmp(per[i].name,per[i-1].name)<0){tmp=per[i];j=i-1;do{per[j+1]=per[j];j--;}while ((strcmp(,per[j].name)<0&&j>=0));per[j+1]=tmp;}}printf("\n\t\t排序成功,是否显示?(1代表继续;2代表不继续)");printf(" 请输入您的数字选择: ");scanf("%d",&k);if (k==1)showall();return;}void listbycelephone()//*按手机号码排序*//{int i,j,k;struct person tmp;for (i=1;i<num;i++){if(strcmp(per[i].celephone,per[i-1].celephone)<0){tmp=per[i];j=i-1;do{per[j+1]=per[j];j--;}while ((strcmp(tmp.celephone,per[j].celephone)<0)&&j>=0);per[j+1]=tmp;}}printf("\n\t\t排序成功,是否显示?(1代表继续;2代表不继续)");printf(" 请输入您的数字选择: ");scanf("%d",&k);if (k==1)showall();return;}void showall()//*输出全部信息*//{int i,j;system("cls");system("color 3b");if(num!=0){printf("\n\t\t*************** 以下为通讯录所有信息************");for (i=0;i<num;i++){printf("\n\t\t________________________________");printf("\n\t\t名字:%s",per[i].name);printf("\n\t\t性别:%s",per[i].sex);printf("\n\t\t年龄:%d",per[i].nianling);printf("\n\t\t邮编:%ld",per[i].youbian);printf("\n\t\t地址:%s",per[i].addr);printf("\n\t\t手机号码:%s",per[i].celephone);printf("\n\t\t家庭电话号码:%s",per[i].homephone);printf("\n\t\t公司名称:%s",per[i].company);printf("\n\t\t电子邮件:%s",per[i].email);printf("\n\t\tQQ号码:%ld",per[i].QQ);printf("\n\t\t________________________________");printf("\t\t");if (i+1<num){printf("\n\t\t__________________________");system("pause");}}printf("\n\t\t************************************************");}elseprintf("\n\t\t对不起!通讯录中无任何纪录!");printf("\n\t\t请按任意数字键返回主菜单");scanf("%d",&j);return;}void writetofile()//*写入文件*//{int i,k;system("cls");system("color 84");if ((fp=fopen("per.bin","wb"))==NULL){printf("\n\t\t文件打开失败");}for (i=0;i<num;i++){if (fwrite(&per[i],sizeof(struct person),1,fp)!=1){printf("\n\t\t写入文件错误!\n");}}fclose(fp);printf("\n\t\t通讯录文件已保存");printf("\n\t\t请按任意数字键返回主菜单");scanf("%d",&k);return;}void readfromfile()//*读取文件*//{int i,j,k;system("cls");system("color 2b");if((fp=fopen("per.bin","rb"))==NULL){printf("\n\t\t****************************");printf("\n\t\t* *");printf("\n\t\t* *");printf("\n\t\t* 通讯录文件不存在! *");if ((fp=fopen("per.bin","wb"))==NULL){printf("\n* 建立失败! *");printf("\n* *");printf("\n* *");printf("\n****************************");exit(0);}else{printf("\n\t\t* 通讯录文件已建立! *");printf("\n\t\t* *");printf("\n\t\t* *");printf("\n\t\t****************************");printf("\n\t\t 按任意键进入主菜单");printf("\n\t\t 请输入您的数字选择: ");scanf("%d",&k);return;}exit(0);}fseek(fp,0,2); //*文件位置指针移动到文件末尾*//if (ftell(fp)>0) //*文件不为空*//{rewind(fp); //*文件位置指针移动到文件开始位置*//for (num=0;!feof(fp) && fread(&per[num],sizeof(struct person),1,fp);num++);printf("\n\t\t****************************");printf("\n\t\t* *");printf("\n\t\t* *");printf("\n\t\t* 文件导入成功! *");printf("\n\t\t* *");printf("\n\t\t* *");printf("\n\t\t****************************");printf("\n\t\t 按1显示所有信息,按2回主菜单!");printf("\t\t 请输入您的数字选择: ");scanf("%d",&j);if(j==1)showall();}else{printf("\n\t\t****************************");printf("\n\t\t* *");printf("\n\t\t* *");printf("\n\t\t* 文件导入成功! *");printf("\n\t\t* 通讯录文件中无任何纪录! *");printf("\n\t\t* *");printf("\n\t\t* *");printf("\n\t\t****************************");printf("\n\t\t请按任意数字键返回主菜单");scanf("%d",&i);return;}}void deleteall()//*删除所有信息*//{int i,j;system("cls");system("color 50");printf("\n\t\t确认删除?\n");printf("请按1和2(1代表确认;2代表不删除)\n ");scanf("%d",&i);if (i==1){fclose(fp);if ((fp=fopen("per.bin","wb"))==NULL){printf("\n\t\t不能打开文件,删除失败");readfromfile();}num=0;printf("\n\t\t纪录已删除!");printf("\n\t\t请按任意数字键返回主菜单");scanf("%d",&j);return;}}。
通讯录源代码

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>#include <malloc.h>#define LEN sizeof(struct record) //计算字节//#define NULL 0int num;//通讯录文件中的联系人计数器struct record{char name[100];char gender[100];char tel[100];char city[100];char eip[100];struct record *next;};struct record *head;void menu();//显示英文提示选单函数void creat();//创建新的通讯录void add();//将某联系人增加到通讯录中void find();//综合查询某联系人的通讯信息void alter();//修改通讯录中某联系人的信息void deleteb();//删除通讯录中某联系人的信息void list();//显示通讯录中的所有记录void save();//用于将对通讯录的更新保存到文件中void load();//创建新的通讯录void quit(int *f);//退出选单void shifang();// 释放内存函数声明void main(){int choic;head=NULL;int flag=1;printf("使用说明:在当通讯录中存在信息时每次使用通讯录前应先加载通讯录文件!\n");while(flag){menu();scanf("%d",&choic);switch(choic){case 1:{if(head==NULL)creat(); //创建else{shifang();creat(); //重新创建}}break;case 2:{ add();save();//将追加的记录保存到文件中}break;case 3:find();printf("\t");system("pause"); //使系统暂停break;case 4:{ alter();save();//将修改后的记录保存到文件中}printf("\t");system("pause");break;case 5:deleteb();printf("\t");system("pause");break;case 6:load();break;case 7:quit(&flag);break;case 8:list();printf("\t");system("pause");break;}}}void menu(){system("cls");printf( "\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★\n");printf( "\t\t※※\n"); printf( "\t\t※欢迎使用通讯录※\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※7.退出选单8.显示通讯录中所有记录※\n"); printf( "\t\t※※\n"); printf( "\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n"); printf("\n\t\t请输入您选择的操作:");}void creat() /*函数void creat()创建联系人的个人信息*/{struct record *p1,*p2;char name[100];num=0;p1=head=(struct record *)malloc(LEN);p2=p1;system("cls");printf("请输入姓名,性别,电话,城市及邮编(结束操作请按0号键)\n"); getchar();printf("输入姓名:");gets(name);if(strcmp(name,"0")!=0&&name){strcpy(p1->name,name);printf("输入性别(男or 女):");gets(p1->gender);printf("输入8位电话号码或11位手机号(0-9):");gets(p1->tel);printf("输入所在城市:");gets(p1->city);printf("输入邮编(0-9):");gets(p1->eip);p1->next=NULL;while(1){num=num+1;//通讯录文件中的联系人计数器增1if(num==1)head=p1;elsep2->next=p1;p2=p1;printf("请输入姓名:");gets(name);if(strcmp(name,"0")==0)//当输入姓名为0时则表示此次对记录的录入结束{break;}else//继续录入{p1=(struct record *)malloc(LEN);strcpy(p1->name,name);printf("输入性别(男or 女):");gets(p1->gender);printf("输入8位电话号码或11位手机号(0-9):");gets( p1->tel);printf("输入所在城市:");gets(p1->city);printf("输入邮编(0-9):");gets(p1->eip);p1->next=NULL;}}p2->next=NULL;save();return;}elsereturn;}void list()//用于输出通讯录中的所有联系人信息的函数{struct record *p;if(head!=NULL)//通讯录非空时,列出所有联系人信息{ system("cls");p=head;printf("本通讯录现在共有%d人:\n",num);printf("---姓名-------性别------手机--------城市---------邮编\n");while(p!=NULL){printf("== %s",p->name); printf(" ");printf("%s",p ->gender); printf(" ");printf("%s",p->tel); printf(" ");printf("%s",p->city); printf(" ");printf("%s",p->eip); printf(" \n");p=p->next;}printf("==================================\n"); }else //当通讯录为空时,给出提示信息printf("通讯录为空,无法输出!");}void add()//增加记录函数{struct record *p0,*p1,*p2;system("cls");//进行系统清屏char name[100],ch;p1=head;printf("请输入所要增加的联系人的各项信息:\n");getchar();//吸收回车符或空格printf("请输入姓名:");gets(name);if((strcmp(name,"0")==0)&&name){printf("姓名不能为0,增加失败!\n");return;}else{p0=(struct record *)malloc(LEN);strcpy(p0->name,name);printf("输入性别(男or 女):");gets(p0->gender);printf("输入8位电话号码或11位手机号(0-9):");gets(p0->tel);printf("输入所在城市:");gets(p0->city);printf("输入邮编(0-9):");gets(p0->eip);num=num+1;if(head==NULL){head=p0;p0->next=NULL;return;}else{while(strcmp(p0->name,p1->name)>0&&(p1->next!=NULL))//查找结点所应添加的相应位置{p2=p1;p1=p1->next;}if(strcmp(p0->name,p1->name)<0||strcmp(p0->name,p1->name)==0)//把结点有序地增加到链表中{if(head==p1){head=p0;//把结点添加到表头}else{p2->next=p0;}p0->next=p1;}else //把结点添加到表尾{p1->next=p0;p0->next=NULL;}printf("\n是否继续添加?(Y/N):");ch=getchar();if((ch=='y')||(ch=='Y'))add();return;}}}void deleteb() //删除记录{system("cls");struct record *p,*q;char sname[100],ch;p=head;if(head==NULL){printf("通讯录为空!无法删除!\n");return;}printf("请输入欲删除记录的姓名:");scanf("%s",sname);while(strcmp(p->name,sname)!=0 && p->next!=NULL) //查找节点并删除该节点{q=p;p=p->next;}if(strcmp(p->name,sname)==0){printf("%s的通讯内容如下:\n",sname);printf("---姓名-------性别------手机--------城市---------邮编\n");printf("==================================\n");printf("== %s",p->name);printf(" ");printf("%s",p->gender);printf(" ");printf("%s",p->tel);printf(" ");printf("%s",p->city);printf(" ");printf("%s",p->eip); printf(" \n");printf("==================================\n");getchar();//吸收回车键和空格printf("您确认要删除此人的通讯记录吗?(Y/N):");ch=getchar();if((ch=='Y')||(ch=='y')){if(p==head) //当通讯录中只有一条记录时head=p->next;elseq->next=p->next;num=num-1;//通讯录文件中的联系人计数器减1printf("删除成功!\n");save();//保存到文件中}else if((ch=='N')||(ch=='n'))return;}else{printf("通讯录中无此人信息!\n");}return;}void quit(int *f)//退出选单{*f=0 ;printf("谢谢您本次的使用!\n");}void save()//将通讯录写入文件的函数{FILE *fp;struct record *p1;char tong[100];if(head==NULL){fp=fopen("tongxun.txt","w");fp=NULL;//将通讯录文件清空return;}getchar();//吸收回车键和空格printf("请输入要保存通讯录的文件名:"); gets(tong);fp=fopen("tongxun.txt","w");if(fp==NULL){printf("打开通讯录文件失败!\n");return;}p1=head;fprintf(fp,"姓名性别手机城市邮编\n");for(;p1!=NULL;){fprintf(fp,"%s %s %s %s %s\n",p1->name,p1->ge nder,p1->tel,p1->city,p1->eip);p1=p1->next;}printf("保存完毕!\n");fclose(fp);}void load()//文件加载函数{FILE *fp;char tong[100];struct record *p1,*p2;system("cls");getchar();printf("正在加载通讯录文件!\n");getchar();printf("请先输入要加载的通讯录信息所在的文件名称:");gets(tong);if((fp=fopen("tongxun.txt","r"))==NULL){ printf("此通讯录名不存在,无法输出\n");return;}else{shifang();//释放内存}p1=(struct record *)malloc(LEN);fscanf(fp,"%s%s%s%s%s",&p1->name,&p1->gender,&p1->tel,&p1->city,&p1->eip); if(feof(fp)!=0){printf("文件为空,无法打开!\n");return;}else{rewind(fp);p2=p1;head=p1;num=0;while(feof(fp)==0){fscanf(fp,"%s%s%s%s%s",&p1->name,&p1->gender,&p1->tel,&p1->city,&p1->eip);if(feof(fp)!=0)break;p2->next=p1;p2=p1;p1=(struct record *)malloc(LEN);num=num+1;}p2->next=NULL;p1=head;head=head->next;num=num-1;free(p1);list();//显示所有记录printf("加载完毕!\n");return;}fclose(fp);}void shifang()//释放内存函数{struct record *p1;while(head!=NULL){p1=head;head=head->next;free(p1);}return;}void findbyname()//按姓名查询某联系人的通讯录信息{struct record *p1,*p2;char name[100];int m;system("cls");if(head==NULL){printf("通讯录为空,无法显示!\n");return;}p1=head;getchar();printf("请输入需要查找人的姓名:");m=0;gets(name);while(p1!=NULL){while((strcmp(p1->name,name))!=0&&p1->next!=NULL){p2=p1;p1=p1->next;}if(strcmp(p1->name,name)==0){m++;printf("%s的通讯内容如下:\n",name);printf("---姓名-------性别------手机--------城市---------邮编\n");printf("==================================\n");printf("== %s",p1->name);printf(" ");printf("%s",p1->gender);printf(" ");printf("%s",p1->tel);printf(" ");printf("%s",p1->city);printf(" ");printf("%s",p1->eip); printf(" \n");printf("==================================\n");printf("\n是否继续查找某联系人的姓名信息(Y/N):");if((getchar()=='y')||(getchar()=='Y'))findbyname();break;}p1=p1->next;}if(m==0)printf("此人未在本通讯录中!\n");return;}void findbytel()//按电话查询某联系人的通讯录信息{struct record *p1,*p2;char tel[100];int m;system("cls");if(head==NULL){printf("通讯录为空,无法显示!\n");return;}p1=head;getchar();printf("请输入需要查找人的电话:");m=0;gets(tel);while(p1!=NULL){while((strcmp(p1->tel,tel))!=0&&p1->next!=NULL){p2=p1;p1=p1->next;}if(strcmp(p1->tel,tel)==0){m++;printf("%s的通讯内容如下:\n",p1->name);printf("---姓名-------性别------手机--------城市---------邮编\n");printf("==================================\n");printf("== %s",p1->name);printf(" ");printf("%s",p1->gender);printf(" ");printf("%s",p1->tel);printf(" ");printf("%s",p1->city);printf(" ");printf("%s",p1->eip); printf(" \n");printf("==================================\n");printf("\n是否继续查找某联系人的电话信息(Y/N):");if((getchar()=='y')||(getchar()=='Y'))findbytel();break;}p1=p1->next;}if(m==0)printf("此人未在本通讯录中!\n");return;}void find(){int m;printf("\n请选择查询方式:\n");printf("\t 1------姓名\n");printf("\t 2------电话\n");printf("\t 3------返回\n");printf("请选择:");scanf("%d",&m);while(m!=1&&m!=2&&m!=3){printf("输入错误,请重新选择:");scanf("%d",&m);}if(m==1)findbyname();if(m==2)findbytel();}void altertel() //修改电话记录{struct record *p;int a = 0;char name[100];system("cls");getchar();printf("请键入需要修改的联系人的姓名:");gets(name);for(p=head;p!=NULL;p=p->next){if(strcmp(p->name,name)==0){printf("%s的通讯内容如下:\n",name);printf("---姓名-------性别------手机--------城市---------邮编\n");printf("==================================\n");printf("== %s",p->name);printf(" ");printf("%s",p->gender);printf(" ");printf("%s",p->tel);printf(" ");printf("%s",p->city);printf(" ");printf("%s",p->eip); printf(" \n");printf("==================================\n");printf("请键入新电话:");gets(p->tel);printf("修改成功!\n");a=1;break;}}if(a != 1)printf("无此通讯录!\n");return;}void altereip(struct record *p1)//修改邮编信息{printf("请键入新邮编:");gets(p1->eip);}void altercity() //修改城市信息{struct record *p;int a = 0;char name[100];system("cls");getchar();printf("请键入需要修改的联系人的姓名:");gets(name);for(p=head;p!=NULL;p=p->next){if(strcmp(p->name,name)==0){printf("%s的通讯内容如下:\n",name);printf("---姓名-------性别------手机--------城市---------邮编\n");printf("==================================\n");printf("== %s",p->name);printf(" ");printf("%s",p->gender);printf(" ");printf("%s",p->tel);printf(" ");printf("%s",p->city);printf(" ");printf("%s",p->eip); printf(" \n");printf("==================================\n");printf("请键入联系人目前所在城市:");gets(p->city);altereip(p);printf("修改成功!\n");a = 1;break;}}if(a != 1)printf("无此通讯录!\n");return;}void alter(){int m;system("cls");if(head==NULL){printf("通讯录为空!无法修改!\n"); return;}printf("\n请选择修改方式:\n");printf("\t 1------电话\n");printf("\t 2------城市\n");printf("\t 3------返回\n");printf("请选择:");scanf("%d",&m);while(m!=1&&m!=2&&m!=3){printf("输入错误,请重新选择:");scanf("%d",&m);}if(m==1)altertel();if(m==2)altercity();}。
数据结构通讯录系统源代码

头文件:/* 单链表中每个结点的联系人结构体定义*/typedef struct Node/* 每个联系人结构体*/{char name[10];//姓名char telnum[20];//电话号码char address[256];//地址struct Node *next;}SLNode;void Initiate(SLNode ** head)/* 初始化单链表*/{if((*head=(SLNode *)malloc(sizeof(SLNode)))== NULL){printf("内存空间不足!\n");exit(1) ;}(*head)->next=NULL;/* 置链尾标记NULL */}int Length(SLNode *head)//求当前通讯录中的联系人数{SLNode *p;/* p指向头结点*/int size;/* size初始值为0 */p = head->next;size = 0 ;while(p != NULL && head != NULL)/* 循环计数*/{k = k->next;size++;}return size;/* 返回其大小*/}void DataWrite(SLNode *head){SLNode *p;int i;FILE *fp;fp = fopen("Address list.dat","wb+");//打开文件,覆盖以前的文件p = head->next;for( i = 0;i < Length(head);i++){fwrite(p,sizeof(SLNode),1,fp);p =p->next;}fclose(fp);//关闭文件}void Load(SLNode *head)/* 初始化*/{SLNode *q,*p,*m;FILE *fp;int count = 0 ;fp = fopen("Address list.dat","rb");//以读的方式打开二进制文件//rewind(fp);if(fp == NULL){fp = fopen("Address list.dat","wb+");if(fp != NULL){printf("通讯录打开失败!创建新的通讯录!\n");}else{printf("通讯录打开失败!创建新的通讯录失败!\n");exit(0);}}else{q = (SLNode *)malloc(sizeof(SLNode ));while(fread(q,sizeof(SLNode),1,fp)){//fread(q,sizeof(SLNode),1,fp);if(ferror(fp)){printf("error!\n");break;}p = head;m = (SLNode *)malloc(sizeof(SLNode));strcpy(m->name,q->name);strcpy(m->telnum,q->telnum);strcpy(m->address,q->address);count++;m->next=p->next;/* 将新结点插入队头结点*/p->next=m;memset(q,'\0',sizeof(SLNode));}}fclose(fp);printf("\t\t\t\t 通讯录总联系人数:%d \n",Length(head));}int PrintAll(SLNode *head)/* 打印所有出所有联系人信息*/{int i;SLNode *q;q = head->next;if(q == NULL){printf("通讯录为空!\n");return -1;}else{for(i = 0 ; i< Length(head);i++)//逐个打印联系人信息{printf("编号:%d\t姓名:%s\t号码:%s\t地址:%s\n",i+1,q->name,q->telnum,q->address);q = q->next;}return 0;}}void ANParam(SLNode *head)/* 在带头结点的单链表head的第i(0《i《size)个结点前插入一个存放数据元素x的结点*//* 插入成功则返回1,失败则返回0 */SLNode *p,*q;q=(SLNode*)malloc(sizeof(SLNode));/* 生成新结点由指针p指示*/printf("请输入新联系人姓名:");fflush(stdin);gets(q->name);printf("请输入新联系人的电话号码:");fflush(stdin);gets(q->telnum);printf("请输入新联系人的地址:");fflush(stdin);gets(q->address);p = head;q->next=p->next;/* 将新结点插入队头结点*/p->next=q;DataWrite(head);//将信息以覆盖方式重新写入通讯录中printf("添加成功!\n");}void AWParam(SLNode *head,char telnum[11],char name[10],char address[256])//带形参的添加函数/* 在带头结点的单链表head的第i(0《i《size)个结点前插入一个存放数据元素x的结点*//* 插入成功则返回1,失败则返回0 */{SLNode *p,*q;q=(SLNode*)malloc(sizeof(SLNode));/* 生成新结点由指针p指示*/strcpy(q->name,name);strcpy(q->telnum,telnum);strcpy(q->address,address);p = head;q->next=p->next;/* 将新结点插入队头结点*/p->next=q;DataWrite(head);printf("添加成功!\n");}void Delete(SLNode *head)/* 删除带头结点的单链表head的第i(1~n,n为结点个数)个结点/* 删除结点的元素有x带回,删除成功返回1,否则返回0 */{SLNode *p,*s;int choice,i,m,ret;if(PrintAll(head))//如果通讯录为空,则无法删除,退出返回主菜单{return ;}m = Length(head);//求当前通讯录人数printf("请输入你要删除联系人的前面编号:");ret = scanf("%d",&choice);while(!ret || choice > m || choice < 1)//判断输入是否为数字,是否为,若否,则重新输入{printf("请正确输入你要删除联系人的前面编号!\n");fflush(stdin);ret = scanf("%d",&choice);}p=head;i = 0;//由于我们打印出来时是由1开始,所以此处定义为0while(p->next != NULL && p->next->next != NULL && i < (choice-1) )//查找所选择编号前一个结点{p = p->next;i++;}s = p->next;p->next = p->next->next;free(s);DataWrite(head);//将更新的数据重新写入文件中printf("删除成功!");}void SBName(SLNode *head)/* 查找函数,如果不存在,可添加*/{SLNode *p;int choice;char telnum[11], name[10], address[256];p=head->next;printf("请输入你要查找联系人的姓名:");fflush(stdin);gets(name);while(p != NULL){if(!strcmp(p->name,name)){printf("姓名:%s\t电话:%s\t地址:%s\n",p->name,p->telnum,p->address);break;}p=p->next;}if(p == NULL){printf("错误!所查找联系人不在通讯录,是否将该联系人添加至通讯录?\n");printf("请按0确认添加,否则不添加\n");scanf("%d",&choice);//判断输入是否为数字,且数字范围是1~m之间,否则重新输入if(!choice){printf("该联系人姓名:%s\n",name);printf("请输入该联系人的电话:\n");fflush(stdin);gets(telnum);printf("请输入该联系人的地址:\n");fflush(stdin);gets(address);AWParam(head,telnum,name,address);}}}void SBTell(SLNode *head)/* 查找函数,如果不存在,可添加*/{SLNode *p;int choice;char telnum[20], name[10], address[256];p=head->next;printf("请输入你要查找联系人的号码:");fflush(stdin);gets(telnum);while(p != NULL){if(!strcmp(p->telnum,telnum)){printf("姓名:%s\t电话:%s\t地址:%s\n",p->name,p->telnum,p->address);break;}p=p->next;}if(p == NULL){printf("错误!所查找联系人不在通讯录,是否将该联系人添加至通讯录?\n");printf("请按0确认添加,否则不添加\n");scanf("%d",&choice);if(!choice){printf("该联系人电话号码:%s\n",telnum);printf("请输入该联系人的姓名:\n");fflush(stdin);gets(name);printf("请输入该联系人的地址:\n");fflush(stdin);gets(address);AWParam(head,telnum,name,address);}}}void Destroy(SLNode **head)/* 因为单链表的结点空间是在程序运行中申请的,而系统只负责自动收回程序中静态分配的内存空间,所以在程序退出前释放动态申请的内存空间*/{SLNode *p,*p1;p= *head;while(p!=NULL)/* 通过循环释放所有的动态开辟的内存空间*/{p1=p;p=p->next;free(p1);}*head=NULL;}void Alter(SLNode *head){SLNode *p;int choice,num,i,m;if(PrintAll(head))//通讯录为空无法进行修改,退出返回主菜单{return ;}printf("请输入你要更改的信息人的前面编号:");fflush(stdin);m = Length(head);//获取当前通讯录人数i = scanf("%d",&num);//判断是否输入数字while( !i || num > m || num < 1 )//判断输入是否为数字,若否,则重新输入{printf("请正确输入你要更改的信息人的前面编号!\n");fflush(stdin);}p = head->next;//p指向第一个联系人for(i = 0 ; i< Length(head);i++){if((i+1) == num){printf("姓名:%s\t号码:%s\t地址:%s\n",p->name,p->telnum,p->address); lable1: printf("请输入你要更改的信息:\n");printf("1、姓名\t2、号码\t3、地址\t0、全部修改\n");m = scanf("%d",&choice);while(!m || choice > 3 || choice < 0)//判断输入是否为数字,若否,则重新输入{printf("请正确输入选项!\n");fflush(stdin);m = scanf("%d",&choice);}switch(choice){case 1:printf("请输入新姓名:");fflush(stdin);gets(p->name);break;case 2:printf("请输入新号码:");fflush(stdin);gets(p->telnum);break;case 3:printf("请输入新地址:");fflush(stdin);gets(p->address);break;default:printf("请输入新姓名:");fflush(stdin);gets(p->name);printf("请输入新号码:");fflush(stdin);gets(p->telnum);printf("请输入新地址:");fflush(stdin);gets(p->address);break;}printf("以下是刚更改的信息,请确认:");printf("姓名:%s\t号码:%s\t地址:%s\n",p->name,p->telnum,p->address);printf("是否继续更改该联系人?\n");printf("继续修改请按0,否则保存修改!\n");printf("输入:");scanf("%d",&choice);if(!choice){goto lable1;}else{DataWrite(head);//将修改后的文件全部写入通讯录中}}p = p->next;}}int menu(){int ret,i;printf("\t\t******************通讯录******************\n\n");printf("\t\t 1、查找联系人\t");printf("2、添加联系人\n\n");printf("\t\t 3、显示所有联系人信息\t");printf("4、删除联系人\n\n");printf("\t\t 5、更改联系人信息\t");printf("6、退出\n\n");printf("\t\t**************请选择相应功能**************\n");printf("\t\t输入对应功能编号:");i = scanf("%d",&ret);while(!i || ret > 6 || ret <1)//判断输入是否为数字,若否,则重新输入{printf("\t\t请正确输入功能编号!\n");fflush(stdin);printf("\t\t输入对应功能编号:");i = scanf("%d",&ret);}return ret;}void DeleteAll(SLNode *head){FILE *fp;fp = fopen("Address list.dat","wb+");//已创建新的文件覆盖以前的文件,一达到清除目的Destroy(&head);Initiate(&head);//初始化单链表,创建新的头结点printf("清除成功!\n");}测试主函数:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <windows.h>#include "LinkList.h"int main(){int choice = 0 ,ret;SLNode *head;char s[500] = "\t\t**谢谢使用**\n",a[] = "\t\t华中农业大学楚天学院通讯录系统\n";system("title 华中农业大学楚天学院通讯录系统");system("color 30");while(choice < strlen(a)){putchar(a[choice]);Sleep(80);choice++;}Initiate(&head);Load(head);while(1){switch(menu()){case 1:system("cls");if(head->next == NULL){printf("通讯录为空!\n");break ;}else{printf("请选择查找方式:");printf("1、姓名\t 2、电话号码\t 3、退出\n");ret = scanf("%d",&choice);while(!ret || choice >3 || choice <1){printf("输入有误!请正确选择查找方式!\n");fflush(stdin);ret = scanf("%d",&choice);}switch(choice){case 1:SBName(head);break;case 2:SBTell(head);break;case 3:break;default:break;}}break;case 2:system("cls");ANParam(head);break;case 3:system("cls");PrintAll(head);break;case 4:system("cls");printf("请选择删除方式:\n");printf("1、清空通讯录\t2、删除指定联系人\n");ret = scanf("%d",&choice);while(!ret || choice <1 || choice >2){printf("输入错误!请正确选择删除方式!\n");ret = scanf("%d",&choice);}if(choice == 1){DeleteAll(head);}else if(choice == 2){Delete(head);}break;case 5:system("cls");Alter(head);break;case 6:choice = 0;while(choice < strlen(s)){putchar(s[choice]);Sleep(80);choice++;}exit(0);break;default:printf("输入错误!请重新输入!\n");break;}}Destroy(&head);//清除动态申请空间system("pause");return 0;}。
通讯录管理系统程序C语言源代码

Address * h[5];
/*************************************************/
void menu();//一级菜单
void relatives();//亲人
void friends();//朋友
void classmates();//同学
/********************************************************/
void InitList(Address *&L);
int ListInsert(Address *&L,int i,AddressList e);
void DispList(Address *L);
void CreateListR(Address *&L, AddressList a[],int n);
int ListEmpty(Address *L);
void DispName(Address *L);
int ListLength(Address *L);
int ListDelete(Address *&L,int i,AddressList &e);
scanf("%d",&num1);
switch(num1)
{
case 1: menu();
case 2: SecondMenu();
default :exit(1);
}
}
void Delete()
{
int num1;
int m;
if (ListEmpty(h[x])==1)
通讯录管理系统java课程设计源代码

通讯录管理系统简介通讯录是一种记录联系人信息的工具,用于存储和管理与个人、组织或机构相关的联系信息。
通讯录管理系统是一个用于创建、编辑、查找和删除联系人信息的软件应用程序。
本文将介绍一个使用Java编写的通讯录管理系统的设计源代码。
功能需求通讯录管理系统需要具备以下功能: 1. 添加联系人:用户可以输入联系人的姓名、电话号码、电子邮件地址等信息,并将其添加到通讯录中。
2. 编辑联系人:用户可以选择要编辑的联系人,并可以修改其姓名、电话号码、电子邮件地址等信息。
3. 查找联系人:用户可以输入关键字进行搜索,系统将根据关键字在通讯录中查找匹配的联系人并显示出来。
4. 删除联系人:用户可以选择要删除的联系人,并将其从通讯录中删除。
5. 显示所有联系人:系统可以列出所有已存储在通讯录中的联系人信息。
设计思路数据结构为了实现上述功能,我们需要设计合适的数据结构来存储联系人信息。
在这里,我们可以使用一个类来表示每个联系人,其中包含姓名、电话号码和电子邮件地址等属性。
然后,我们可以使用一个集合(如ArrayList)来存储所有的联系人对象。
用户界面为了方便用户操作,我们可以使用命令行界面(CLI)来实现通讯录管理系统。
用户可以通过输入不同的命令来执行相应的操作,如添加联系人、编辑联系人、查找联系人等。
功能实现1.添加联系人:用户输入联系人的姓名、电话号码和电子邮件地址,系统创建一个联系人对象,并将其添加到集合中。
2.编辑联系人:用户选择要编辑的联系人,并输入要修改的信息,系统更新该联系人对象的属性。
3.查找联系人:用户输入关键字,系统遍历所有联系人对象并检查是否包含该关键字,将匹配的结果显示出来。
4.删除联系人:用户选择要删除的联系人,系统从集合中移除该对象。
5.显示所有联系人:系统遍历集合中的所有联系人对象,并将其属性逐个显示出来。
代码实现import java.util.ArrayList;import java.util.Scanner;class Contact {private String name;private String phoneNumber;private String email;public Contact(String name, String phoneNumber, String email) { = name;this.phoneNumber = phoneNumber;this.email = email;}public String getName() {return name;}public void setName(String name) { = name;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}}public class AddressBook {private ArrayList<Contact> contacts;public AddressBook() {contacts = new ArrayList<>();}public void addContact(Contact contact) {contacts.add(contact);System.out.println("Contact added successfully!");}public void editContact(int index, Contact contact) {if (index >= 0 && index < contacts.size()) {contacts.set(index, contact);System.out.println("Contact edited successfully!");} else {System.out.println("Invalid index!");}}public void searchContacts(String keyword) {boolean found = false;for (Contact contact : contacts) {if (contact.getName().contains(keyword) || contact.getPhoneNumber ().contains(keyword)|| contact.getEmail().contains(keyword)) {System.out.println(contact.getName() + " | " + contact.getPhon eNumber() + " | " + contact.getEmail());found = true;}}if (!found) {System.out.println("No matching contacts found.");}}public void deleteContact(int index) {if (index >= 0 && index < contacts.size()) {contacts.remove(index);System.out.println("Contact deleted successfully!");} else {System.out.println("Invalid index!");}}public void displayAllContacts() {for (Contact contact : contacts) {System.out.println(contact.getName() + " | " + contact.getPhoneNum ber() + " | " + contact.getEmail());}}public static void main(String[] args) {AddressBook addressBook = new AddressBook();Scanner scanner = new Scanner(System.in);while (true) {System.out.println("\nAddress Book Management System");System.out.println("1. Add Contact");System.out.println("2. Edit Contact");System.out.println("3. Search Contacts");System.out.println("4. Delete Contact");System.out.println("5. Display All Contacts");System.out.println("6. Exit");System.out.print("\nEnter your choice: ");int choice = scanner.nextInt();switch (choice) {case 1:scanner.nextLine(); // Consume newline characterSystem.out.print("Enter name: ");String name = scanner.nextLine();System.out.print("Enter phone number: ");String phoneNumber = scanner.nextLine();System.out.print("Enter email address: ");String email = scanner.nextLine();Contact contact = new Contact(name, phoneNumber, email);addressBook.addContact(contact);break;case 2:System.out.print("Enter index of the contact to edit: ");int indexToEdit = scanner.nextInt();if (indexToEdit >= 0 && indexToEdit < addressBook.contacts. size()) {scanner.nextLine(); // Consume newline characterSystem.out.print("Enter name: ");String newName = scanner.nextLine();System.out.print("Enter phone number: ");String newPhoneNumber = scanner.nextLine();System.out.print("Enter email address: ");String newEmail = scanner.nextLine();Contact newContact = new Contact(newName, newPhoneNumb er, newEmail);addressBook.editContact(indexToEdit, newContact);} else {System.out.println("Invalid index!");}break;case 3:scanner.nextLine(); // Consume newline characterSystem.out.print("Enter keyword to search contacts: ");String keyword = scanner.nextLine();addressBook.searchContacts(keyword);break;case 4:System.out.print("Enter index of the contact to delete: "); int indexToDelete = scanner.nextInt();addressBook.deleteContact(indexToDelete);break;case 5:addressBook.displayAllContacts();break;case 6:System.exit(0);break;default:System.out.println("Invalid choice!");}}}}总结通过以上的设计和实现,我们创建了一个简单的通讯录管理系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
首先,对于stdlib.h头文件,你们不需要知道别的,只要了解,它里面高喊有申请动态内存空间的函数malloc() 就可以了。
所以,想要使用该函数,必须加此头文件,就像想要使用printf() 和scanf()必须要加上stdio.h一样。
同样,string.h头文件里也包含有好多函数,在本程序里面用的是strcmp() strcpy(),strlen()等等。
下面讲讲#define。
这就是传说中的宏定义了。
(额外讲一点,之所以称之为“传说中”,是因为我在接触它之前,感觉有多么多么神秘,但真正了解了,其实也没啥神秘可言)。
好了不废话了,举个例子#define MAXQQ11.其中,MAXQQ 是宏名,11 是宏体,用宏名可以代替宏体。
如若有一下语句:#define M 10 int a =M;则a的值就为10了;理解了吧?或许你们会问:为什么要用那么一大串字母代替一个数字呢?不麻烦么?直接a = 10;不更简单么?呵呵,其实这正是为了修改的方便才用的。
比如,一个很大的程序里面多次用到常量10,但后来需要把10改为11,那么只要修改开头部分的#define M 11就可以了,而大可不必在程序中一个一个的闷着头在那里一个劲的傻找。
是吧?下面是结构体,tpyedef struct _person {…}person;至于typedef语句,我想,理论是不能解开困惑的,还是举个例子吧:如有typedef int LIKAI;LIKAI a; 语句就等同于:int a; 两位聪明的三姐四姐,明白了没?总之一句话:typedef就是为数据类型取个别名,(刚刚讲的宏定义是给常量(或表达式)取个别名);所以,我们看到下面的一个结构体里的person per;语句就等同于struct _person per; 还有再下面的addr_book *head =NULL;就等同于struct addr_book *head =NULL啦!这样可以少写一些代码(这里其实也就是少写了一个单词而已)再下面从void add()~void input_person(person *p); 都是函数声明,这一点徐慧丽同学比较了解,有疑问可以问她。
再下面是定义的多个字符串数组,其长度已经隐式的指出,就是下面所以字符个数之和。
再下面就是主函数main()了,对了,关于函数的调用,三位同学还是有必要再了解一下的,但是限于篇幅,老师在这里就不再赘述。
希望掌握欠佳的同学课后自行温习一下。
main()函数开头,调用perint_welcome()函数,我们跳到这个函数里面看一看它的运行机制:外重for 循环内的变量i控制着屏幕的行数,在第四行(i从0~3),开始打印,if里面的三个打印字符串都打印完了呢,就直接跳到第七行,退出外重for循环,打印“回车键进入…”,等用户敲回车时,该函数执行完毕,返回到main()里调用它的地方。
然后进入while循环,循环条件永远为真,因为里面的switch语句里包含很多break语句,所以我们并不怕陷入死循环的泥沼中,嘿嘿,(因为我们不知道用户会输入多少条命令,所以要用while循环),在switch语句里,开关的钥匙是一个函数的返回值,这样可以少定义一个变量,代码也变得精简多了,好了,我们再跳到print_menu()函数里面看看:首先,清屏函数system(“cls”),(我帮你们想好了。
要是老师问你们,你们只需说这是个清屏函数,是你们需要清除Dos窗口内的字符的时候,请教高人才得以知道的,嘿嘿),printf(menu);函数打印主菜单界面,并等待用户选择命令,若不在1~8的命令范围只内,提示有误,并请求再次输入,当输入命令合法的时候,返回该命令数字。
然后我们在跳回主函数的switch 语句里,可以看到,无论用户选择那个命令,都会调用一个函数,这就是面向过程程序设计的一个特点,(徐慧丽同学现在知道了所谓的函数串的概念了吧?)而C++则不同,它所操作的都是由一个个类所定义的对象,而每个对象都有自己的“方法”(“方法”就是成员函数的一种牛叉的叫法,即专业名词,呵呵),体现了C++不同于C的一个特点:封装性。
其实我想我们以开始学C的相对于一开始学C++的同学还是很幸运的,因为我们首先接触的是面向过程程序设计,C++ 我们以后一定会学(会了C还怕不会C++?),而我们有C的基础,可以透过语法结构,从思想上、跟不上区别于二者,对照其异同点,效果会更好,而对于他们一开始就学C++的同学,此生恐怕没有机会接触C了…所以….唉,都是题外话,不说了。
继续讲switch,若print_menu()返回值为1,则调用开关语句里的add(),我们再跳进来看看:addr_book *last;addr_book*_new=(addr_book*)malloc( sizeof(addr_book) );第一句是定义一个结构体指针变量last(这里在强调一下,无论C还是C++,指针是精华,十分、非常、极其、特别、尤为、至关重要,所以,以后以编程为饭碗的同学,必须搞得十分清晰十分熟悉,希望引起三位同学的重视),第二句,定义一个结构体指针变量_new,并指向刚刚用malloc()函数申请的内存块,需要讲一下,malloc()是一个void类型的函数,无返回值,我们想想,啥也不返回,那怎么赋值给_new呢?对吧?所以必须使用强制类型转换,即(addr_book*)malloc()来把它的返回值转换成跟_new一个类型的变量的地址,并赋给_new,对了,sizeof(addr_book) 需要我讲么?这个函数是计算括号内数据类型的字节长度的,我们想呀:要开辟一块空地,应该指出它的尺寸大小吧?(长多少,宽多少)是吧,其实有很多东西,我们都可以把它形象化的,如数组、指针、函数模板、类模板,淡然模板是C++的内容。
不好意思,又跑题了。
然后,把刚刚申请的节点的指针域置空(为了防止它乱指,所以置空,但是其实这句是废话,不置空也行的)。
面我们要做啥呢?呵呵,当然是把这个节点加到链表当中啦!所以首先判断链表是否为空(全局指针head是始终指向链表的头结点的,所以,单链表中,没事别乱懂head,更千万别乱给它赋值,这咱伤不起啊╮(╯3╰)╭,否则整个链表会没有头绪,整个程序会崩溃…然后…然后,我们就完蛋了)如果链表头为空,则说明链表没有建立起来,那么就把刚刚申请的那块内存当作头吧,即把_new的地址赋给head,若head 不为空,说明已经有了节点,有多少个呢?不知道,好吧,那咱们调用find_last()(顾名思义)找找吧,找到链表的尾巴,然后把刚刚申请的内存块加到它的尾巴上就OK啦!那咱再跳到find_last()里看看它是怎么工作的:想找到尾巴,我们从那里开始下手呢?嘿嘿,你答对了,当然先从头开始啦,所以,find_last()函数的实参就是head指针。
需要注意的是,尾巴的一个特点就是:它的指针域是为空的,即:若p为尾节点,则p->next 的值为NULL Find_last()函数里,首先定义了一个结构指针p,将头head赋给他,然后head就可以回家吃饭去啦,哈哈,因为没它啥事了嘛!判断p所指的节点的下一个指向是否为空呢?这节链子下面挂的还有没有下一节呢?当然用眼睛是看不到的,我们上一段说过的,如果为尾巴,则指针域为空(NULL),立即结束find_last()函数,并将尾节点返回给调用它的地方,如果不为空,则把p的指向改为p当前所指的节点的下一个节点,继续判断,直到找到尾巴...找到了尾巴后,立即返回到add(),把尾巴赋值给last指针,并将该节点的指针域的nex指向申请的节点_new。
然后呢?呵呵,当然啦,要往这个节点里装东西啦!(其实就跟火车一样),即调用input_person(),形参就是这个节点的数据域的地址,而数据域就是我们以前讲过的那个小结构的全部成员。
现在,我们再跳到input_person()里看看:其实这个也没啥好讲的,就是简单的赋值嘛。
依次为数据域变量赋值后,返回到add(),然后问是否继续添加,选择“是”,则递归调用(自身调用自身),选择“否”,退出。
需要讲一下的是fflush(stdin) ;这个是清除内存缓冲区的函数,即把内存缓冲区的东西都清除掉,到时候老师要是提问你们的话,你们也说,是请教高人才知道的(目前只有这个理由能应付老师了,当然你们也可以自己想理由)。
好了,add()函数执行完毕,我们回到main()函数里调用add()的地方,呵呵它的下一条语句是break;所以,跳出了switch语句,进入while循环。
执行条件为1(真),所以再次进入了switch语句,然后再次调用print_menu()打印屏幕主菜单,根据其返回值来选择需要使用的功能,第二个是显示函数show(),这个没什么,所以咱们跳过。
第三个是查找函数search(),这里我就跟你们写了一种查找方式,其实可以写很多种的(比如:性别,年龄,手机,还有姓名模糊查找),这些功能就不添加了,否则代码会很长,老师会怀疑的(当然,我这里不是轻视三姐四姐的能力,请不要误会哈!)。
当然,如果你们很自信,并且希望添加这些查找方式的话,各位同学不必客气,直接跟我说,我再帮你们添加就是了。
search()我们也不说了,下面我们将删除函数delet(),首先,清屏、打印删除标题、定义结构变量(看看,head又出来了,这个东西可是个VIP级的关键变量啊),然后提示输入姓名,判断链表是否为空,如果为空,则不执行while循环体,直接跳到下面的if语句,因为一次也没有执行count++;所以,count肯定为0,所以输出没有此人的提示信息,否则,count 肯定不为0,既然不为0,说明必定执行了count++语句。
我们现在再拐回头,看看上面的while语句,它的循环体的if语句的条件里面调用了string.h头文件里的strcmp()函数,这个函数运行原理就是:比较两个字符串实参(这里就是p -> 和sea_name)如果相同,就返回0,所以,如果返回0,则说明找到了,调用printf()函数,打印该联系人的信息(该节点的数据域所有数据),count++;然后break;跳出while循环,进入下面的else语句,如果选择Y,就开始删除该联系人(该节点),首先判断要删除的联系人是否为第一个联系人(头结点),如果是,那可不得了啦!刚刚我们说过的,head可是个很很很重要的结构变量,没了它,链表就没了头绪,程序核心就崩溃,我们就完蛋了…(链式反应),言归正传,如果为头结点(p==head),则把head的指向修改为第二个节点,然后删除头结点(free(p)),如果要删除的联系人不是第一个,则我们不要碰head,(对了,这里先讲一下单链表的节点删除原则:先连后删,举例子把,假设有链表A→B→C,要删除B,则必须找到A,先把A 和C相连之后,在释放掉B,如果直接释放B,则链表会断的,程序一样会崩溃,我们一样会完蛋)所以,我们要用p1来找到前一个节点(当然从头head开始一个一个找啦,看看看看head多重要呀),如果找到(判断条件为p1所指向的节点的指针域所指向的下一个节点为p,p就是我们刚刚需要删除的那个节点),就把这个节点与p所指向的下一个节点相连(即实现A与C相连),然后再释放掉指针p所指向的节点。