用C语言制作一个通讯录,这个通讯录需要完成一系列基本的通讯录应有的工作:增加、删除、查找、修改、展示、退出。这个通讯录需要做到动态的内存开辟,以及将写好的通讯录的内容写入文件,每次在开始时可以调出原来写好的内容。
至于如何实现这些功能,我接下来一个接一个说明,说明完成后,就直接将源代码全部放出来,源代码分为三个文件,一个头文件,两个源文件。
这里强调一下,就我个人目前写代码的经验,我觉得在写一个程序开始前,一定要将整个程序的所有或大部分应该实现的功能在自己心里想清楚,或者写下来,在每个程序写之前一定要有一个清晰的框架,避免写好后一遍又一遍的修改,去增加一些突然想好的新增加的功能。
首先我们来屡一下思路:
- 我们首先需要确定这个通讯录的每个成员的数据类型,毫无疑问是这个成员是一个结构体,每个成员有多重特性:序号、姓名,地址,性别,电话号码。这几项中的地址和性别还有自己单独的数据类型,地址也是一个结构体,地址有四个成员:国家、省份、城市、具体地址,这四项。性别则是一个枚举类型:男,女,保密,这三种类型。在一开始就应该在头问价中写好。
- 我们在main函数中需要做到有一个打印函数,一个通讯录的大小的开辟(如果已经有存储好的数据,就需要进行一个数据的读取,并将其写入这个通讯录)一个选择的输入,还有一个对选择做出反应的函数,这样,便把main函数的基本结构定了下来 。并且这个时候我们还要定义两个全局变量,分别记录通讯的大小和通讯录中成员的个数。
- 我们接下来进行其他函数的定义:
- 打印函数:这个函数只需要进行一个基本打印就可以了
- 增加函数:这个函数需要做到的是新增,而且在所开辟的空间满了后,还要realloc增加空间。新增成员时,一次进行成员的写入,每写入一个成员,记录成员个数的变量自增一次。
- 删除函数:删除函数需要做到两个功能,一个是删除指定的成员,一个是要删除全部成员。删除其实就是将指定成员后面的成员向前覆盖,然后记录成员个数的变量自减一次(也可以最后一个成员直接覆盖到指定成员,然后成员个数自减一次)。至于删除所有成员,我的做法是直接将成员个数变量置零,这样就做到了所有成员的删除。在删除完后,要进行一个内存大小的管理,如果需要将通讯录缩小,就realloc缩小内存。
- 查找函数:就是查找,通过循环进行一个查找。查找时使用的时name作为关键词进行查找。用strcmp进行查找。
- 修改函数:就是修改嘛,根据所获得选择进行一个修改。
- 展示函数:这个函数其实是需要做到两个功能,一个是成员的排序,另一个是将通讯录成员展示出来。
- 排序函数:排序函数首先要做到一个按照名字进行的冒泡排序(或者是其他排序方法也可以),然后还要进行一个成员序号的写入。
- 保存函数:将目前的、未完成的成员数据暂时先写入文件,免得数据丢失。
- 退出函数:这个函数需要做到一个将目前的通讯录成员的数据写入文件,然后结束通讯。
在这几个基本框架搭建完成后,还需要做一些数据有有效行的检查,确保数据输入没有问题。觉得我写的还行的的话,点个赞再走呗。
好了,话不多说,直接上代码:(代码分为三部分:第一部分是头文件,第二部分是各个函数所在的源文件,第三部分是main函数所在的源文件)
#ifndef _CONTECT_H_
#define _CONTECT_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define NUM 2
extern int NumPeople;//all people
extern int SizeContect;//realloc function
typedef struct ConAddress
{
char Country[15];
char Province[15];
char City[15];
char Detail[15];
}ConAddress;
typedef enum ConSex
{
men,
women,
secret
}ConSex;
typedef struct Contect
{
int Number;
char Name[20];
ConAddress Address;
ConSex Sex;
char CallNumber[15];
}Contect;
void PrintContect();
Contect* DoChange(int change,Contect *people);
#endif _CONTECT_H_
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contects.h"
int NumPeople = 0;//all people
int SizeContect = NUM;//realloc function
int i = 0;//Show function
void PrintContect(change)// print function
{
printf(" **********************************\n");
printf(" ******* 1.Add 2.Del ******\n");
printf(" ******* 3.Show 4.Search ******\n");
printf(" ******* 5.Modify 6.Modify ******\n");
printf(" ******* 7.Save 0.Exit ******\n");
printf(" **********************************\n");
switch (change)
{
case 1:
printf("Input success\n");
break;
case 2:
if (NumPeople == 0)
{
printf("Contect is void\n");
break;
}
else
{
printf("Delete success\n");
break;
}
//case 3:
// if (NumPeople == 0)
// {
// printf("Contect is void ,don't show\n");
// break;
// }
case 4:
if (NumPeople == 0)
{
printf("Contect is void ,don't search\n");
break;
}
default:
break;
}
printf("Please do change:>");
}
void SortContact(Contect *people)
{
Contect tmp;
int i = 0;
int j = 0;
for (i = NumPeople; i > 0;--i)
{
if (NumPeople == 1)
{
break;
}
for (j = 0; j < i;++j)
{
if (strcmp(people[j].Name,people[j+1].Name)>0)
{
tmp = people[j];
people[j] = people[j + 1];
people[j + 1] = tmp;
}
}
}
for (i = 0; i < NumPeople; ++i)
{
people[i].Number = i + 1;
}
}
Contect* AddContect(Contect* people)
{
assert(people != NULL);
int tmp = 0;
int key = 1;
if (NumPeople == SizeContect)
{
int tmp = SizeContect;
SizeContect = SizeContect + tmp;
people = (Contect*)realloc(people, SizeContect*sizeof(Contect));
}
printf("-----------------------------------------------------------------------------------\n");
printf("Number Name Country Province City Detail Sex CallNumber \n");
printf("-----------------------------------------------------------------------------------\n");
printf(" Input name:>");
scanf("%s", people[NumPeople].Name);
if (strcmp(people[NumPeople].Name,"exit0")==0)
{
return people;
}
printf(" Input address(Country):>");
scanf("%s", people[NumPeople].Address.Country);
printf(" Input address(Province):>");
scanf("%s", people[NumPeople].Address.Province);
printf(" Input address(City):>");
scanf("%s", people[NumPeople].Address.City);
printf(" Input address(Detail):>");
scanf("%s", people[NumPeople].Address.Detail);
printf(" Input sex number( men(0) or women(1) or secret(2) ):>");
scanf("%d",&tmp);
while (key)
{
if (tmp == 0 || tmp == 1 || tmp == 2)
{
people[NumPeople].Sex = tmp;
key = 0;
}
else
{
printf("Input error\n");
scanf("%d", &tmp);
}
}
printf(" Input PhoneNumber:>");
scanf("%s", people[NumPeople].CallNumber);
++NumPeople;
return people;
}
Contect* DelContect(Contect* people)
{
assert(people != NULL);
char DelName[15] = { 0 };
int i = 0;
printf("Please input need delete name(Input rma could delete all name):>");
scanf("%s", DelName);
if (strcmp(DelName,"rma")==0)
{
NumPeople = 0;
SizeContect = NUM;
people = (Contect*)realloc(people, NUM*sizeof(Contect));
}
for (i = 0; i < NumPeople;++i)
{
if (strcmp(DelName,people[i].Name)==0)
{
while (i < NumPeople)
{
people[i] = people[i + 1];
++i;
}
--NumPeople;
}
}
if (NumPeople != 0 && NumPeople < SizeContect/2)
{
SizeContect /= 2;
people = (Contect*)realloc(people, SizeContect*sizeof(Contect));
}
return people;
}
Contect* ShowContect(Contect* people)
{
assert(people != NULL);
SortContact(people);
printf("-----------------------------------------------------------------------------------\n");
printf("Number Name Country Province City Detail Sex CallNumber \n");
printf("-----------------------------------------------------------------------------------\n");
for (i = 0; i < NumPeople;++i)
{
printf("%-8d", people[i].Number);
printf("%-7s", people[i].Name);
printf("%10s %10s %10s %10s", people[i].Address.Country, people[i].Address.Province, people[i].Address.City, people[i].Address.Detail);
//printf("%8d", people[NumContect].Sex);
if (people[i].Sex==0)
{
printf(" man");
}
else if (people[i].Sex == 1)
{
printf(" women");
}
else if (people[i].Sex == 2)
{
printf(" secret");
}
printf("%15s", people[i].CallNumber);
printf("\n");
}
printf("-----------------------------------------------------------------------------------\n");
printf("\n");
printf("\n");
return people;
}
Contect* SearchContect(Contect* people)
{
assert(people != NULL);
int i = 0;
char search[15] = { 0 };
int check = 0;
printf("Please input you need search name :>");
scanf("%s", search);
printf("-------------------------------------------------------------------------------\n");
printf("Name Country Province City Detail Sex CallNumber \n");
for (i = 0; i < NumPeople;++i)
{
if (strcmp(search,people[i].Name) == 0)
{
printf("%-7s", people[i].Name);
printf("%10s %10s %10s %10s", people[i].Address.Country, people[i].Address.Province, people[i].Address.City, people[i].Address.Detail);
printf("%8d", people[i].Sex);
printf("%15s", people[i].CallNumber);
printf("\n");
++check;
}
}
printf("-------------------------------------------------------------------------------\n");
printf("\n");
if (check==0)
{
printf("Not found\n");
}
return people;
}
Contect* ModifyContect(Contect* people)
{
int j = 0;
int i = 0;
int num = 0;
char tmp[15] = { 0 };
char Itmp = 0;
int key = 0;
int Check = 0;
int CheckArr[10] = { 0 };
printf("Change need modify name:>");
scanf("%s", tmp);
system("cls");
printf("-----------------------------------------------------------------------------------\n");// Print pinter
printf("Number Name Country Province City Detail Sex CallNumber \n");
printf("-----------------------------------------------------------------------------------\n");
for (i = 0; i < NumPeople; ++i)
{
if (strcmp(tmp, people[i].Name) == 0)
{
CheckArr[j] = people[i].Number;
++j;
++Check;
printf("%-8d", people[i].Number);
printf("%-7s", people[i].Name);
printf("%10s %10s %10s %10s", people[i].Address.Country, people[i].Address.Province, people[i].Address.City, people[i].Address.Detail);
printf("%8d", people[i].Sex);
printf("%15s", people[i].CallNumber);
printf("\n");
if (Check == 1)
{
num = people[i].Number;
}
}
}
printf("-------------------------------------------------------------------------------\n");
printf("\n");
printf(" *****************************************************\n");
printf(" ***** 1.Name *****\n");
printf(" ***** 2.Country 3.Province 4.City 5.Detail *****\n");
printf(" ***** 6.Sex *****\n");
printf(" ***** 7.CallNumber ******\n");
printf(" ******************************************************\n");
if (Check == 0)
{
printf("Contect can't found this name\n");
return people;
}
if (Check == 1)
{
printf("Which need be changed of the options :>");
scanf("%d", &key);
}
if (Check > 1)
{
printf("Which need be changed of the number and options :>");
scanf("%d", &num);
scanf("%d", &key);
for (j = 0; j < Check;++j)//Check num are invalid
{
if (CheckArr[j] == num)
{
break;
}
if (CheckArr[Check - 1] != num&&j == Check - 1)//If num is invalid
{
while (1)
{
printf("Input error ,again input\n");
printf("Which need be changed of the number :>");
scanf("%d", &num);
for (j = 0; j < Check; ++j)
{
if (CheckArr[j] == num)
{
break;
}
}
if (CheckArr[j] == num)
{
break;
}
}
if (CheckArr[j] == num)
{
break;
}
}
}
if (key < 1||key > 7)
{
printf("Input option is invalid,again:>");
while (key > 0&&key < 8)
{
scanf("%d", &key);
}
}
}
printf("What are you modify:>");//Input modify
if (key == 6)//Modify sex
{
scanf("%d", &Itmp);
while (1)//Check sex invalid
{
if (Itmp == 0 || Itmp == 1 || Itmp == 2)
{
break;
}
printf("Input error\n");
scanf("%d", &Itmp);
}
}
else
{
scanf("%s", tmp);
}
switch (key) //Modify
{
case 1:
strcpy(people[num - 1].Name, tmp);
break;
case 2:
strcpy(people[num - 1].Address.Country, tmp);
break;
case 3:
strcpy(people[num - 1].Address.Province, tmp);
break;
case 4:
strcpy(people[num - 1].Address.City, tmp);
break;
case 5:
strcpy(people[num - 1].Address.Detail, tmp);
break;
case 6:
people[num - 1].Sex = Itmp;
break;
case 7:
strcpy(people[num - 1].CallNumber, tmp);
break;
default:
break;
}
return people;
}
Contect* WriteContect(Contect* people)
{
assert(people != NULL);
int i = 0;
FILE* FileContect = NULL;
FileContect = fopen("contact.txt", "w");
if (FileContect == NULL)
{
perror("contect.txt");
exit(EXIT_FAILURE);
}
for (i = 0; i < NumPeople; i++)
{
fprintf(FileContect, "%d ", NumPeople);
fprintf(FileContect, "%s %s %s %s %s %d %s", people[i].Name, people[i].Address.Country, people[i].Address.Province,
people[i].Address.City, people[i].Address.Detail, people[i].Sex, people[i].CallNumber);
}
fclose(FileContect);
if (NumPeople == 0)
{
remove("contact.txt");
}
return people;
}
Contect* SaveContect(Contect* people)
{
assert(people != NULL);
int i = 0;
FILE* FileContect = NULL;
FileContect = fopen("contact.txt", "w");
if (FileContect == NULL)
{
perror("contect.txt");
exit(EXIT_FAILURE);
}
for (i = 0; i < NumPeople; i++)
{
fprintf(FileContect, "%d ", NumPeople);
fprintf(FileContect, "%s %s %s %s %s %d %s", people[i].Name, people[i].Address.Country, people[i].Address.Province,
people[i].Address.City, people[i].Address.Detail, people[i].Sex, people[i].CallNumber);
}
fclose(FileContect);
return people;
}
Contect* DoChange(int change,Contect *people)//do switch case
{
switch (change)
{
case 1:
AddContect(people);
break;
case 2:
ShowContect(people);
DelContect(people);
break;
case 3:
system("cls");
ShowContect(people);
break;
case 4:
SearchContect(people);
break;
case 5:
ShowContect(people);
ModifyContect(people);
break;
case 6:
system("cls");
return people;
case 7:
SaveContect(people);
return people;
case 0:
WriteContect(people);
printf(" Exit from Contect \n");
return people;
default:
printf("Input error\n");
break;
}
}
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contects.h"
int main()
{
Contect *people = NULL;
int change = 0;
int i = 0;
int check = 0;
FILE* FileContect = fopen("contact.txt", "r");
if (FileContect != NULL)
{
check = fscanf(FileContect, "%d", &NumPeople);
people = (Contect*)malloc(NumPeople * sizeof(Contect));
SizeContect = NumPeople;
for (i = 0; i < NumPeople; ++i)
{
fscanf(FileContect, "%s", people[i].Name);
fscanf(FileContect, "%s", people[i].Address.Country);
fscanf(FileContect, "%s", people[i].Address.Province);
fscanf(FileContect, "%s", people[i].Address.City);
fscanf(FileContect, "%s", people[i].Address.Detail);
fscanf(FileContect, "%d", &people[i].Sex);
fscanf(FileContect, "%s", people[i].CallNumber);
}
fclose(FileContect);
}
else
{
people = (Contect*)malloc(SizeContect * sizeof(Contect));
}
do{
PrintContect(change);
scanf("%d", &change);
while (change < 0|| change > 7)
{
printf("Input error,again:>");
scanf("%d", &change);
if (change >= 0&&change <= 7)
{
break;
}
}
if (change == 1 || change == 2)
{
system("cls");
}
people = DoChange(change, people);
} while (change);
free(people);
people = NULL;
return 0;
}