C语言实现通讯录 (附完整代码)

🍀实现一个通讯录:

通讯录中保存人的信息:
名字
年龄
性别
电话
住址

🍀通讯录的功能:

1.通讯录可以存放100个人的信息
2.显示所有联系人的信息
3.排序功能
4.增:增加联系人
5.删:删除指定联系人
6.查:查找指定联系人
7.改:修改指定联系人

🍀多文件实现

test.c 测试通讯录
contact.h 函数和类型的声明
contact.c 函数的实现

💮设计结构体——保存人的信息

初级:

struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];//一个汉字占两个字符
	char tele[12];
	char addr[30];
};

结构体的引用:

struct PeoInfo num1 ;
struct PeoInfo num2;
struct PeoInfo data[50];

改进:
考虑到每次使用结构体都需要写 struct PeoInfo比较繁琐,能不能直接把struct自己省略掉呢?
这时候就需要对改结构体进行重命名typedef

typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char tele[12];
	char addr[30];
}PeoInfo;

这样,当我们使用结构体时,就不用用 struct PeoInfo了,直接使用PeoInfo就可以了。

💮初始通讯录

因为我们刚刚定义了结构体用来存储人的信息,但一个通讯录中有很多人,我们上面设置了该通讯录可以存放100个人的信息,所以我们需要用结构体数组将每一个类型都是结构体的元素存储起来。
C语言定义结构体数组一般形式:

结构体类型 数组名[数组长度];

所以我们定义 通讯录:

PeoInfo data[100];

同时,我们需要一个变量,来判断通讯录里已经存放数据的个数。(以防止在增添联系人时,超过了定义的通讯录的最大容量)

int sz=0;

💮封装通讯录

在上面考虑到通讯录PeoInfo data[100]和变量 sz是一种封锁的关系。即,sz等于几,PeoInfo data里面就有几个数据元素。sz加1,则PeoInfo data数组里会再存放一个元素。
所以,我们考虑将通讯录进行进一步的封装,构建一个结构体

typedef struct Contact
{
	PeoInfo data[100];
	int sz;
}Contact;

这时,我们的通讯录就为 con

Contact con;

💮define宏定义修改通讯录的最大容量


在这里插入图片描述
同样我们也可以对 我们刚开始定义的 姓名、地址、联系方式等 以同样的宏定义进行转变。

初始化通讯录

将通讯录初始化为0。可以定义一个函数,用来初始化通讯录。

void InitContact(Contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data);
	pc->sz = 0;
}

因为我们要改变通讯录的内部,所以函数参数是一个地址值,类型是我们定义的通讯录结构体 Contact类型。
利用memset函数,将结构体中数组所有元素全部赋值为0.同时将pc所指向的sz也初始化为0.

void InitContact(Contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data);
	pc->sz = 0;
}

💐💐大致框架

接下来,我们在void test ()函数中写一下大概的框架:
(因为要尽可能避免在主函数中太过冗长,所以我们把通讯录的具体实现——增删查找等等都放在test函数中,之后我们就只需要在主函数中进行调用即可。)

首先,我们可以用do...while循环 打印一个菜单。
定义一个函数 void menu()完成打印。在()函数中调用即可。
之后我们利用switch,对输入的input进行判断,进行相应的操作。对于下面的七种情况,我们可以写七个函数分别实现其相应的功能。

在这里插入图片描述
我们进行的所有操作都是对于通讯录而言的,所以在test函数中必须有通讯录。所以我们将我们已经初始化的通讯录放在函数中。
在这里插入图片描述
不要忘了包含头文件contact.h
(在contact.h头文件中,包含着本身已经封装好的常见的头文件 比如 <stdio.h><string.h>等,还有我们自己对于结构体或者函数的一些声明和定义,比如定义人的信息的结构体 PeoInfo、定义通讯录的 Contact,以及我们函数的声明,完成Contact初始化的函数InitContact等,还有之后,我们要对通讯录进行操作的一系列增删查找函数等函数的声明都会放在都文件中。)
(要注意,函数的定义不是放在头文件中的,而是在contat.c中)

在这里插入图片描述

💐改进–枚举 提高代码的可读性

在这里插入图片描述
在这里插入图片描述

🌼🌼定义函数实现功能

🌼AddContact

在这里插入图片描述

//增加联系人的信息
void AddContact(Contact* pc)
{
	//判断数组是否可以增添?
	if (pc->sz == 100)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//通讯录没满
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[pc->sz].name);//pc->data 指向的是结构体数组 数组名本身就是地址,不用用取地址符号
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入电话:>");
		scanf("%s", pc->data[pc->sz].tele);
		printf("请输入住址:>");
		scanf("%s", pc->data[pc->sz].addr);
		pc->sz++;
		printf("增加联系人成功!");
	}
}

🌼ShowContact

//显示所有联系人的信息
void ShowContact(const Contact* pc)//仅仅是显示,而不修改 所以用const限制修饰
{
	int i;
	for (i = 0; i < pc->sz; i++)
	{
		printf("姓名:%-20s\t", pc->data[i].name);//根据联系人结构体信息
		printf("年龄:%-4d\t", pc->data[i].age);
		printf("性别:%-5s\t", pc->data[i].sex);
		printf("电话:%-12s\t", pc->data[i].tele);
		printf("住址:%-13s\t", pc->data[i].addr);//统一左对齐
		printf("\n");
	}
}


但是,当显示的数据变多的时候,尽管是左对齐,还是不够美观。
接下来,我们采用打印标题的形式,更好的打印出数据。

//显示所有联系人的信息
void ShowContact(const Contact* pc)//仅仅是显示,而不修改 所以用const限制修饰
{
	int i;
	//打印列标题
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

🌼DelContact

//删除指定联系人
void DelContact(Contact* pc)
{
	int i = 0;
	char name[20];
	int pos = 0;
	int flag = 0;//输入要删除的人删除
	printf("请输入要删除人的名字:>");
	scanf("%s", name);//将要删除的人的名字放入name中(name本就是一个地址值)
	//查找有没有这个人
	for (i = 0; i < pc->sz; i ++)
	{
		if (strcmp(name, pc->data[i].name) == 0) //字符串比较函数
		{
			pos = i;//找到了,记下位置
			flag = 1;
		}	
	}

	if (flag == 0)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//进行删除
	for (i = pos; i <pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人!");
}

🌼进一步改进

当我们写后面的函数时,我们发现后面的查找函数 还是 修改函数 都需要像 删除函数一样 先在通讯录类进行查找。
为了更高效完成整个工程,提高效率,我们可以来写一个通过名字进行查找的函数FindByName
当我们写 删除 查找 修改函数时,首先可以直接调用这个函数。

int FindByName(Contact* pc, char name[])
{
	int flag = 0;
	int i = 0;
	int pos;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(name, pc->data[i].name) == 0) //字符串比较函数
		{
			pos = i;//找到了,记下位置
			return pos;
		}
	}
	if (flag == 0)
	{
		printf("要删除的人不存在\n");
		return -1;
	}

}

DelContact函数改进为:

//删除指定联系人
void DelContact(Contact* pc)
{
	int i = 0;
	char name[20];
	int pos = 0;
	int flag = 0;//输入要删除的人删除
	printf("请输入要删除人的名字:>");
	scanf("%s", name);//将要删除的人的名字放入name中(name本就是一个地址值)


	//查找有没有这个人
	if ((FindByName(pc, name) == -1))
	{
		printf("找不到要删除的联系人");
	}
	else
		pos = FindByName(pc, name); //记下位置


	//进行删除
	for (i = pos; i <pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人!");
}

🌼SearchContact

在这里插入图片描述

//查找指定联系人
void SearchContact(const Contact* pc)
{
	int pos = 0;
	char name[20] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	//查找有没有指定联系人
	if (FindByName(pc, name) == -1)
		printf("没有找到要查找的联系人\n");
	else
	{
		pos = FindByName(pc, name);
		printf("找到了!\n");
		printf("该联系人的下标为%d", pos);
		//打印数据
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}

🌼ModifyContact

在这里插入图片描述


//修改指定联系人
void ModifyContact(Contact* pc)
{
	int pos = 0;
	char name[20] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	//查找有没有要修改的联系人
	if (FindByName(pc, name) == -1)
		printf("没有找到要修改的联系人\n");
	else 
	{
		printf("找到了要修改的联系人!\n");
		pos = FindByName(pc, name);
		//修改 (修改可以理解为再次录入一遍信息)
		printf("请输入名字:>");
		scanf("%s", pc->data[pos].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入住址:>");
		scanf("%s", pc->data[pos].addr);
		printf("成功修改联系人!");

	}
}

🌼Sort Contact

//按照名字进行排序
//排序

int cmp_name(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
}
void SortContact(Contact* pc)
{
	int i = 0;
	//利用qsort 函数
	qsort(pc->data, pc->sz, sizeof((pc->data)[0]), cmp_name);
	//打印列标题
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}

}

🎆🎆🎆完整代码

contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define MAX 100

//声明结构体--保存人的信息
typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];//一个汉字占两个字符
	char tele[12];
	char addr[30];
}PeoInfo;
//声明结构体通讯录
typedef struct Contact
{
	PeoInfo data[MAX];
	int sz;
}Contact;
int FindByName(Contact* pc, char name[]);
void AddContact(Contact* pc);
void ShowContact(const Contact* pc);
void DelContact(Contact* pc);
void SearchContact( Contact* pc);
void SearchContact(Contact* pc);
void SortContact(Contact* pc);

enum OPTION
{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SHOW,//5
	SORT//6
};


//函数的声明--初始化通讯录
void InitContact(Contact* pc);

contact.c

#include "contact.h"

void InitContact(Contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}


//增加联系人的信息
void AddContact(Contact* pc)
{
	//判断数组是否可以增添?
	if (pc->sz == 100)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//通讯录没满
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[pc->sz].name);//pc->data 指向的是结构体数组 数组名本身就是地址,不用用取地址符号
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入电话:>");
		scanf("%s", pc->data[pc->sz].tele);
		printf("请输入住址:>");
		scanf("%s", pc->data[pc->sz].addr);
		pc->sz++;
		printf("增加联系人成功!");
	}
}


//显示所有联系人的信息
void ShowContact(const Contact* pc)//仅仅是显示,而不修改 所以用const限制修饰
{
	int i;
	//打印列标题
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

int FindByName(Contact* pc, char name[])
{
	int flag = 0;
	int i = 0;
	int pos;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(name, pc->data[i].name) == 0) //字符串比较函数
		{
			pos = i;//找到了,记下位置
			return pos;
		}
	}
	if (flag == 0)
	{
		printf("要删除的人不存在\n");
		return -1;
	}

}

//删除指定联系人
void DelContact(Contact* pc)
{
	int i = 0;
	char name[20];
	int pos = 0;
	int flag = 0;//输入要删除的人删除
	printf("请输入要删除人的名字:>");
	scanf("%s", name);//将要删除的人的名字放入name中(name本就是一个地址值)


	//查找有没有这个人
	if ((FindByName(pc, name) == -1))
	{
		printf("找不到要删除的联系人");
	}
	else
		pos = FindByName(pc, name); //记下位置


	//进行删除
	for (i = pos; i <pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人!");
}

//查找指定联系人
void SearchContact( Contact* pc)
{
	int pos = 0;
	char name[20] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	//查找有没有指定联系人
	if (FindByName(pc, name) == -1)
		printf("没有找到要查找的联系人\n");
	else
	{
		pos = FindByName(pc, name);
		printf("找到了!\n");
		printf("该联系人的下标为%d", pos);
		//打印数据
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}


//修改指定联系人
void ModifyContact(Contact* pc)
{
	int pos = 0;
	char name[20] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	//查找有没有要修改的联系人
	if (FindByName(pc, name) == -1)
		printf("没有找到要修改的联系人\n");
	else 
	{
		printf("找到了要修改的联系人!\n");
		pos = FindByName(pc, name);
		//修改 (修改可以理解为再次录入一遍信息)
		printf("请输入名字:>");
		scanf("%s", pc->data[pos].name);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入住址:>");
		scanf("%s", pc->data[pos].addr);
		printf("成功修改联系人!");

	}
}

//按照名字进行排序
//排序

int cmp_name(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
}
void SortContact(Contact* pc)
{
	int i = 0;
	//利用qsort 函数
	qsort(pc->data, pc->sz, sizeof((pc->data)[0]), cmp_name);
	//打印列标题
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}

}

test.c


#include"contact.h"

void menu()
{
	printf("\n");
	printf("******************\n");
	printf("******请选择******\n");
	printf("******1.增添******\n");
	printf("******2.删除******\n");
	printf("******3.查找******\n");
	printf("******4.修改******\n");
	printf("******5.显示******\n");
	printf("******6.排序******\n");
	printf("******0.退出******\n");
			
}

void test()
{
	Contact con;  //定义结构体变量-通讯录
	InitContact(&con);//对通讯录进行初始化
	int input = 0;
	do
	{
		menu();
		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("退出通讯录\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}

	} while (input);

}
int main()
{
	test();
	return 0;
}

C语言编写的通讯录管理程序设计 #include"stdio.h" #include"stdlib.h" #include"string.h" #include"conio.h" #define HEADER1"------------------------------------------MESSAGE MENU--------------------------------------------------------------\n" #define HEADER2" | num | name | phonenumber | address |\n" #define HEADER3" |-------------------------------------------------------------------|\n" #define FORMAT " | %-10s %-10s %-15s %-20s |\n" #define DATA p->num,p->name,p->phonenum,p->address #define END " ------------------------------------------------------------------------------------------------------------------\n" #define N 100 int saveflag=0; /*是否需要存盘的标志变量*/ typedef struct record /*标记为record*/ { char num[4]; /*编号*/ char name[10]; /*姓名*/ char phonenum[15]; /*电话*/ char address[20]; /*地址*/ } RECORD; RECORD tele[N]; void menu(); void Disp(); void Qur(); void Modify(); void SelectSort(); void Wrong(); void Save(); void main() { RECORD tele[N]; /*定义RECOED结构体*/ FILE *fp; /*文件指针*/ int select; /*保持内选择结果变量*/ char ch; /*保存y,Y,n,N*/ int count=0; /*保存文件中的记录条数(或元素个数)*/ fp=fopen("C:\\record.txt","a+"); /*以追加方式打开文本文件c;\record,可读可写,若此文件不存在,会创建此文件*/ if(fp==NULL) { printf("\n=>Can not open file!\n"); exit(0); } while(!feof(fp)) { if(fread(&tele[count],sizeof(RECORD),1,fp)==1) /*一次从文件中读取一条通讯记录*/ count++; } fclose(fp); /*关闭文件*/ printf("\n=>Open file success,the total records number is:%d.\n",count); getchar(); menu(); while(1) { system("cls"); menu(); cprintf("\n Please input your choice(0-8):"); /*显示提示信息*/ ch=getch(); if(ch=='0') { if(saveflag==1) /*若对数组的数据有修且未进行存盘操作,则此标志为1*/ { getchar(); printf("\n==>Whether save the modified record to file?(y/n):"); scanf("%c",&ch); if(ch=='y'||ch=='Y') Save(tele,count); } printf("\n=>Thank you for useness!"); getchar(); break ; } switch(ch) { case'0':break; case'1':count=Add(tele,count);break; /*增加通讯记录*/ case'2':system("cls");Disp(tele,count);break; /*显示通讯记录*/ case'3':count=Del(tele,count) ;break; /*删除通讯记录*/ case'4':Qur(tele,count);break; /*查询通讯记录*/ case'5':Modify(tele,count);break; /*修改通讯记录*/ case'6':count=Insert(tele,count);break; /*插入通讯记录*/ case'7':SelectSort(tele,count);break;/*排序通讯记录*/ case'8':Save(tele,count);break; /*保存通讯记录*/ default: Wrong();getchar();break; /*按键有误,必需为0~8*/ } } } void menu() { system("cls"); /*调用DOS命令清屏,与clrscr()功能相同*/ textcolor(63); /*在文本模式中选择新的字符颜色*/ gotoxy(10,5); /*在文本窗口中设置光标*/ printf(" The communication management system\n"); gotoxy(10,8); printf(" ****Menu**** \n"); gotoxy(10,9); printf("\n"); gotoxy(10,10); printf("\* 1. Add record\n"); /*增加*/ gotoxy(10,11); printf("\* 2. Display record\n"); /*展览*/ gotoxy(10,12); printf("\* 3. Delete record\n"); /*删除*/ gotoxy(10,13); printf("\* 4. Search record\n"); /*查找*/ gotoxy(10,14); printf("\* 5. Modify record\n"); /*更改*/ gotoxy(10,15); printf("\* 6. Insert record\n"); /*插入*/ gotoxy(10,16); printf("\* 7. Sort record\n"); /*整理*/ gotoxy(10,17); printf("\* 8. Save record\n"); /*保存*/ gotoxy(10,18); printf("\* 0 Quit system\n"); /*退出*/ gotoxy(10,19); printf(" ************ \n"); /*cprintf()送格式话输出至文本窗口屏幕中*/ } /*格式化输出表头*/ void printheader() { printf(HEADER1); printf(HEADER2); printf(HEADER3); } /*格式化输出表中数据*/ void printdata(RECORD q) { RECORD *p; p=&q; printf(FORMAT,DATA); } void Disp( RECORD temp[],int n) /*显示数组temp[]中存储的通讯记录,内容为record结构中定义的内容*/ { int i; if(n==0) /*表示没有通讯记录*/ { printf("\n=>No menu record!\n"); getchar(); return ; } printf("\n\n"); printheader(); /*输出表格头部*/ i=0; while(i<n) /*逐条输出数组中存储的通讯记录*/ { printdata(temp[i]); i++; printf(HEADER3); } getchar(); } void Wrong() /*输出按键错误信息*/ { printf("\n\n\n\n\n**********Error:input has wrong! press any key to continue***********\n"); getchar(); } void Nofind() /*输出未查找到此记录的信息*/ { printf("\n=>Not find this menu record!\n"); } int Locate(RECORD temp[],int n,char findmess[],char nameorphonenum[]) { int i=0; if(strcmp(nameorphonenum,"phonenum")==0) /*按电话号码查询*/ { while(i<n) { if(strcmp(temp[i].phonenum,findmess)==0) /*若找到findmess值的电话号码*/ return i; i++; } } else if(strcmp(nameorphonenum,"name")==0) /*按姓名查询*/ { while(i<n) { if(strcmp(temp[i].name,findmess)==0) /*若找到findmess值的姓名*/ return i; i++; } } return -1; /*若未找到,返回一个整数-1*/ } void stringinput(char *t,int lens,char *notice) { char n[255]; do { printf(notice); /*显示提示信息*/ scanf("%s",n); /*输入字符串*/ if(strlen(n)>lens) printf("\n Exceed the required length! \n"); /*进行长度检测,超过lens值重新输入*/ } while(strlen(n)>lens); strcpy(t,n); /*将输入发字符串拷贝到字符串t中*/ } int Add(RECORD temp[],int n) /*增加通讯记录*/ { char ch,num[10]; int i,flag=0; system("cls"); Disp(temp,n); /*先打印出已有的通讯录信息*/ while(1) /*一次可输入多条记录,直至输入编号为0的记录才结束添加操作*/ { while(1) /*输入记录编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/ { stringinput(num,10,"Input number(press '0' return menu):"); /*格式化输入编号并检验*/ flag=0; if(strcmp(num,"0")==0) /*输入为0,则退出添加操作,返回主界面*/ { return n; } i=0; while(i<n) /*产寻该编号是否已经存在,若存在则要求重新输入一个未被占用的编号*/ { if(strcmp(temp[i].num,num)==0) { flag=1; break; } i++; } if(flag==1) /*提示拥护是否重新输入*/ { getchar(); printf("==>The number %s is existing,try again?(y/n):",num); scanf("%c",&ch); if(ch=='y'||ch=='Y') continue; else return n; } else {break;} } strcpy(temp[n].num,num); /*将字符串num拷贝到temp[n].num中*/ stringinput(temp[n].name,15,"Name:\n"); stringinput(temp[n].phonenum,15,"Telephone:\n"); stringinput(temp[n].address,15,"Address:\n"); saveflag=1; n++; } return n; } void Qur(RECORD temp[],int n) /*按编号或姓名查询通讯记录*/ { int select; /*按1:按姓名查,2:按电话号码查,其他:返回住界面(菜单)*/ char searchinput[20]; /*包寻用户输入的查询内容*/ int p=0; if(n<=0) /*若数组为空*/ { system("cls"); printf("\n=>No menu record!\n"); getchar(); return ; } system("cls"); printf("\n =>1 Search by name =>2 Search by telephonenumber\n"); printf(" Please choice[1,2]:"); scanf("%d",&select); if(select==1) /*按姓名查询*/ { stringinput(searchinput,10,"Input the existing name:"); p=Locate(temp,n,searchinput,"name"); /*在数组temp中查找编号为searchinput值的元素,并返回该数组元素的下标值*/ if(p!=-1) /*若找到该记录*/ { printheader(); printdata(temp[p]); printf(END); printf("Press any key to return"); getchar(); } else Nofind(); getchar(); } else if(select==2) /*按电话号码查询*/ { stringinput(searchinput,15,"Input the existing telephone number:"); p=Locate(temp,n,searchinput,"phonenum"); if(p!=-1) { printheader(); printdata(temp[p]); printf(END); printf("Press any key to return"); getchar(); } else Nofind(); getchar(); } else Wrong(); getchar(); } int Del(RECORD temp[],int n) { int sel; char findmess[20]; int p=0,i=0; if(n<=0) { system("cls"); printf("\n=>No menu record!\n"); getchar(); return n; } system("cls"); Disp(temp,n); printf("\n =>1 Delete by name =>2 Delete by telephonenumber\n"); printf(" Please choice[1,2]:"); scanf("%d",&sel); if(sel==1) { stringinput(findmess,10,"Input the existing name:"); p=Locate(temp,n,findmess,"name"); getchar(); if(p!=-1) { for(i=p+1;i<n;i++) /*删除此记录,后面记录向前移*/ { strcpy(temp[i-1].num,temp[i].num); strcpy(temp[i-1].name,temp[i].name); strcpy(temp[i-1].phonenum,temp[i].phonenum); strcpy(temp[i-1].address,temp[i].address); } printf("\n=>Delete success!\n"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } else if(sel==2) /*先按电话号码查询到该记录所在的数组元素的下标值*/ { stringinput(findmess,15,"Input the existing telephone number:"); p=Locate(temp,n,findmess,"phonenum"); getchar(); if(p!=-1) { for(i=p+1;i<n;i++) /*删除此记录,后面的记录向前移*/ { strcpy(temp[i-1].num,temp[i].num); strcpy(temp[i-1].name,temp[i].name); strcpy(temp[i-1].phonenum,temp[i].phonenum); strcpy(temp[i-1].address,temp[i].address); } printf("\n=>Delete success!\n"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } return n; } void Modify(RECORD temp[],int n) { char findmess[20]; int p=0; if(n<=0) { system("cls"); printf("\n=>No menu record!\n"); getchar(); return ; } system("cls"); printf("modify menu book recorder"); Disp(temp,n); stringinput(findmess,10,"Input the existing name:"); /*输入并检验该姓名*/ p=Locate(temp,n,findmess,"name"); /*查询到该数组元素,并返回下标值*/ if(p!=-1) /*若p!=-1,表明已经找到该数组元素*/ { printf("Number:%s,\n",temp[p].num); printf("Name:%s,",temp[p].name); stringinput(temp[p].name,15,"Input new name:"); printf("Name:%s,",temp[p].phonenum); stringinput(temp[p].name,15,"Input new telephone:"); printf("Name:%s,",temp[p].address); stringinput(temp[p].address,30,"Input new address:"); printf("\n=>modify success!\n");getchar(); Disp(temp,n); getchar();saveflag=1; } else { Nofind(); getchar(); } return ; } int Insert(RECORD temp[],int n) { char ch,num[10],s[10]; /*s[]保存插入点位置之前的记录编号,num[]保存输入的新记录的编号*/ RECORD newinfo; int flag=0,i=0,m=0; system("cls"); Disp(temp,n); while(1) { stringinput(s,10,"Please input insert location after the Number:"); flag=0;i=0; while(i<n) /*查询该编号是否存在,flag=1表示该编号存在*/ { if(strcmp(temp[i].num,s)==0) { m=i; flag=1; break; } i++; } if(flag==1) break; /*若编号存在,则进行插之前的新记录输入操作*/ else { getchar(); printf("\n=>The number is not existing,try again?(y\n):",s); scanf("%c",&ch); if(ch=='y'||ch=='Y') { continue; } else { return n; } } } /*以下新记录的输入操作与Add()相同*/ while(1) { stringinput(num,10,"Input new Number:"); flag=0;i=0; while(i<n) /*查询该编号是否存在,flag=1表示该编号存在*/ { if(strcmp(temp[i].num,num)==0) { flag=1; break; } i++; } if(flag==1) { getchar(); printf("\n=>Sorry,The number %s is existing,try again?(y\n):",num); scanf("%c",&ch); if(ch=='y'||ch=='Y') { continue; } else { return n; } } else break; } strcpy(newinfo.num,num); /*将字符串num拷贝到newinfo.num中*/ stringinput(newinfo.name,15,"Name:"); stringinput(newinfo.phonenum,15,"Telephone:"); stringinput(newinfo.address,15,"Address:"); saveflag=1; /*在main()中有对该全局变量的判断,若为1,则进行存盘操作*/ for(i=n-1;i>m;i--) /*从最后一个组织元素开始往前移一个元素位置*/ { strcpy(temp[i+1].num,temp[i].num); strcpy(temp[i+1].name,temp[i].name); strcpy(temp[i+1].phonenum,temp[i].phonenum); strcpy(temp[i+1].address,temp[i].address); } strcpy(temp[m+1].num,newinfo.num); strcpy(temp[m+1].name,newinfo.name); strcpy(temp[m+1].phonenum,newinfo.phonenum); strcpy(temp[m+1].address,newinfo.address); n++; Disp(temp,n); printf("\n\n");getchar(); return n; } void SelectSort(RECORD temp[],int n) { int i=0,j=0,flag=0,indexmin,select; char charflag[10]; RECORD newinfo; if(n<=0) { system("cls"); printf("\n=>Not record!\n"); getchar(); return ; } system("cls"); Disp(temp,n); /*显示排序前的所有记录*/ printf("\n =>1 SORT by num =>2 SORT by another way \n"); printf(" Please choice[1,2]:"); scanf("%d",&select); if(select==1) /*按记录编号排序*/ { for(i=0;i<n-1;i++) { flag=32767; indexmin=0; for(j=i;j<n;j++) { if(atoi(temp[j].num)<flag) { flag=atoi(temp[j].num); indexmin=j; } } strcpy(newinfo.num,temp[i].num); /*利用结构变量nesinfo实现数组元素的交换*/ strcpy(newinfo.name,temp[i].name); strcpy(newinfo.phonenum,temp[i].phonenum); strcpy(newinfo.address,temp[i].address); strcpy(temp[i].num,temp[indexmin].num); strcpy(temp[i].name,temp[indexmin].name); strcpy(temp[i].phonenum,temp[indexmin].phonenum); strcpy(temp[i].address,temp[indexmin].address); strcpy(temp[indexmin].num,newinfo.num); strcpy(temp[indexmin].name,newinfo.name); strcpy(temp[indexmin].phonenum,newinfo.phonenum); strcpy(temp[indexmin].address,newinfo.address); } Disp(temp,n); /*显示排序后的所有记录*/ saveflag=1; printf("\n=>Sort complete!\n");getchar(); return; } else if(select==2) { for(i=0;i<n-1;i++) { charflag[0]=255; indexmin=0; strcpy(newinfo.num,temp[i].num); /*利用结构变量nesinfo实现数组元素的交换*/ strcpy(newinfo.name,temp[i].name); strcpy(newinfo.phonenum,temp[i].phonenum); strcpy(newinfo.address,temp[i].address); strcpy(temp[i].num,temp[indexmin].num); strcpy(temp[i].name,temp[indexmin].name); strcpy(temp[i].phonenum,temp[indexmin].phonenum); strcpy(temp[i].address,temp[indexmin].address); strcpy(temp[indexmin].num,newinfo.num); strcpy(temp[indexmin].name,newinfo.name); strcpy(temp[indexmin].phonenum,newinfo.phonenum); strcpy(temp[indexmin].address,newinfo.address); } Disp(temp,n); /*显示排序后的所有记录*/ saveflag=1; printf("\n=>Sort complete!\n");getchar(); return; } else { Wrong(); getchar(); getchar(); return; } } void Save(RECORD temp[],int n) { int i=0; FILE *fp; fp=fopen("c:\\record.txt","w"); /*以只写方式打开文本文件*/ if(fp==NULL) /*打开文件失败*/ { printf("\n=>Open file error!\n"); getchar(); return; } for(i=0;i<n;i++) { if(fwrite(&temp[i],sizeof(RECORD),1,fp)==1) /*每次写一条记录或一个结构数组元素至文件*/ { continue; } else { break; } } if(i>0) { getchar(); printf("\n\n=>Save file complete,total saved's record number is:%d\n",i); getchar(); saveflag=0; } else { system("cls"); printf("The current link is empty,no menu record is saved!\n"); getchar(); } fclose(fp); /*关闭此文件*/ }
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

釉色清风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值