简单的通讯录(C语言实现)

 


通讯录实现的功能
1、添加联系人 2、删除联系人
3、查找联系人 4、修改联系人
5、显示联系人 6、清空通讯录
7、按照姓名进行排序 8、退出程序
该通讯录将联系人的信息保存在文件中
在VS2013中打开文件直接创建,创建建的文件名字是contact.dat,操作步骤如下:


使用的文件操作函数如下:
fopen 
函数原型为 FILE *fopen( const char *fname, const char *mode );
打开由fname(文件名)指定的文件并返回一个关联该文件的流.如果发生错误, fopen()返回NULL.
mode(方式)是用于决定文件的用途
fwrite:
函数原型为 size_t fwrite ( const void * buffer, size_t size, size_t count, FILE * stream );
从buffer(缓冲区)中, 写count个大小为size(大小)的对象到stream(流)指定的流. 
返回值是已写的对象的数量. 
fread:
函数原型为size_t fread( void *buffer, size_t size, size_t num, FILE *stream );
读取[num]个对象(每个对象大小为size(大小)指定的字节数),
并把它们替换到由buffer(缓冲区)指定的数组
数据来自给出的输入流. 



完整代码:

头文件:Addersss.h

 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #ifndef _ADDRESS_LIST_H_
 3 #define _ADDRESS_LIST_H_
 4 #include<stdio.h>
 5 #include<string.h>
 6 #include<stdlib.h>
 7 #define NAME_MAX 12
 8 #define TEL_MAX 12
 9 #define SEX_MAX 5
10 #define  ADDR_MAX 20
11 #define INIT 4
12 #define SIZE 4
13 enum OP
14 {
15     EXIT,  //退出
16     ADD,  //添加
17     DEL,//删除
18     SEARCH, //查找
19     REVISE, //修改
20     DISPLAY, //打印
21     SORT, //排序
22     EMPTY //清空
23 };
24 typedef struct PerInfo
25 {
26     char name[NAME_MAX];//姓名
27     int age; // 年龄
28     char sex[SEX_MAX];//性别
29     char tel[TEL_MAX]; //电话
30     char address[ADDR_MAX];//地址
31 }PerInfo;
32 typedef struct Contact
33 {
34     PerInfo* data;//存储所有联系人的信息
35     int size;
36     int capacity;
37 }Contact, *Pcon;
38 void Add(Pcon Con); //添加联系人
39 void Delete(Pcon Con);//删除联系人
40 void Revise(Pcon Con);//修改联系人
41 void Search(Pcon Con);//查找联系人
42 void Display(Pcon Con);//打印联系人
43 void Init(Pcon Con);//初始化通讯录
44 void Save_Contact(Pcon Con); //存储联系人
45 void Load_Contact(Pcon Con);//加载联系人
46 void Empty(Pcon Con); //清空联系人
47 void Sort(Pcon Con);//对联系人进行排序
48 void Free(Pcon Con);//释放空间
49 
50 #endif //_ADDRESS_LIST_H_

  Contact.c

  1 #define _CRT_SECURE_NO_WARNINGS 1
  2 #include"AddressList.h"
  3 void judge_full(Pcon Con)    //当实际联系人个数和初始化的容量相等时用realloc增容
  4 {
  5     if (Con->capacity == Con->size)
  6     {
  7         PerInfo* tmp = (PerInfo*)realloc(Con->data, (Con->capacity + SIZE)*sizeof(PerInfo));
  8         if (tmp == NULL)
  9         {
 10             printf("out of memery\n");
 11             exit(EXIT_FAILURE);
 12         }
 13         else
 14         {
 15             Con->data = tmp;
 16             Con->capacity += SIZE;
 17         }
 18     }
 19 }
 20 int  Find(Pcon Con, char* str) //查找联系人函数
 21 {
 22     for (int i = 0; i < Con->size; i++)
 23     {
 24         if (strcmp(str, Con->data[i].name) == 0)
 25         {
 26             return i;
 27         }
 28     }
 29     return -1;//没有找到返回 -1
 30 }
 31 void Add(Pcon Con) //添加
 32 {
 33     judge_full(Con);
 34     printf("请输入联系人的姓名 年龄  性别 电话号码,家庭住址\n");
 35     scanf("%s%d%s%s%s", Con->data[Con->size].name,
 36         &Con->data[Con->size].age,
 37         Con->data[Con->size].sex,
 38         Con->data[Con->size].tel,
 39         Con->data[Con->size].address);
 40     Con->size++;
 41     printf("添加成功\n");
 42     return;
 43 }
 44 void Delete(Pcon Con)//删除联系人
 45 {
 46     char input[NAME_MAX];
 47     int i = 0;
 48     printf("请输入联系人姓名:\n");
 49     scanf("%s", input);
 50     int ret = Find(Con, input);
 51     if (ret != -1)
 52     {
 53         for (i = ret; i < Con->size; i++)
 54         {
 55             Con->data[i] = Con->data[i + 1]; //将所要删除的元素后面的元素都往前移动
 56 
 57         }
 58         Con->size--;
 59     }
 60     else
 61     {
 62         printf("这个联系人不存在!\n");
 63     }
 64 }
 65 void Revise(Pcon Con) //修改联系人
 66 {
 67     char input[NAME_MAX];
 68     printf("请输入联系人姓名:\n");
 69     scanf("%s", input);
 70     int ret = Find(Con, input);
 71     if (ret != -1)
 72     {
 73         printf("请输入修改后联系人的姓名,性别,年龄,电话号码,家庭住址\n");
 74         scanf("%s, %s, %d, %s, %s",
 75             Con->data[ret].name,
 76             Con->data[ret].sex,
 77             Con->data[ret].age,
 78             Con->data[ret].tel,
 79             Con->data[ret].address);
 80         printf("修改完成\n");
 81     }
 82     else
 83     {
 84         printf("该联系人不存在\n");
 85     }
 86 }
 87 void Search(Pcon Con)
 88 {
 89     char input[NAME_MAX];
 90     printf("请输入联系人姓名:\n");
 91     scanf("%s", input);
 92     int ret = Find(Con, input);
 93     if (ret != -1)
 94     {
 95         printf("%s,%s,%d,%s,%s\n",
 96             Con->data[ret].name,
 97             Con->data[ret].sex,
 98             Con->data[ret].age,
 99             Con->data[ret].tel,
100             Con->data[ret].address);
101     }
102     else
103     {
104         printf("该联系人不存在!\n");
105     }
106 }
107 void Display(Pcon Con)
108 {
109     int i = 0;
110     while (i < Con->size)
111     {
112         printf("%s,%s,%d,%s,%s\n",
113             Con->data[i].name,
114             Con->data[i].sex,
115             Con->data[i].age,
116             Con->data[i].tel,
117             Con->data[i].address);
118         i++;
119     }
120 }
121 void Init(Pcon Con)
122 {
123     Con->data = (PerInfo*)malloc(SIZE*sizeof(PerInfo)); //开辟空间
124     if (Con->data == NULL)
125     {
126         printf("out of memory\n");
127         exit(EXIT_FAILURE);
128     }
129     Con->size = 0;
130     Con->capacity = INIT;
131     Load_Contact(Con);
132 }
133 void Save_Contact(Pcon Con) //存储联系人
134 {
135     FILE* pfwrite = fopen("contact.dat", "w");
136     if (pfwrite == NULL)
137     {
138         perror("open file for write");
139         exit(EXIT_FAILURE);
140     }
141     for (int i = 0; i < Con->size; i++)
142     {
143         fwrite(&(Con->data[i]), sizeof(PerInfo), 1, pfwrite);
144     }
145     fclose(pfwrite);
146 }
147 void Load_Contact(Pcon Con)//加载联系人
148 {
149     FILE* pfread = fopen("contact.dat", "r");
150     PerInfo tmp = { 0 };
151     if (pfread == NULL)
152     {
153         perror("open file for  read");
154         exit(EXIT_FAILURE);
155     }
156     while (fread(&tmp, 1, sizeof(PerInfo), pfread))
157     {
158         judge_full(Con);
159         Con->data[Con->size] = tmp;
160         Con->size++;
161     }
162 }
163 void Empty(Pcon Con)//清空联系人
164 {
165     Con->size = 0;
166     return;
167 }
168 void Sort(Pcon Con) //按照联系人姓名进行排序
169 {
170     int flag = 0;
171     for (int i = 0; i < Con->size - 1; i++) //需要排n-1趟
172     {
173         int flag = 0;
174         for (int j = 0; j < Con->size - 1 - i; j++) //每趟进行n-1-i次比较
175         {
176             if (strcmp(Con->data[j].name, Con->data[j + 1].name)>0) //按照升序进行排序
177             {
178                 flag = 1;
179                 PerInfo tmp = Con->data[j];
180                 Con->data[j] = Con->data[j + 1];
181                 Con->data[j + 1] = tmp;
182             }
183         }
184         if (flag == 0)
185         {
186             break;
187         }
188     }
189 }
190 void Free(Pcon Con)
191 {
192     free(Con->data);
193     Con->data = NULL;
194 
195 }

Test.c

 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #include"AddressList.h"
 3 void Print()
 4 {
 5 
 6     printf("**********************************************************\n");
 7     printf("*********1:添加联系人*****2:删除联系人********************\n");
 8     printf("*********3:查找联系人***** 4 : 修改联系人********************\n");
 9     printf("*********5:显示所有联系人***6:排序*************************\n");
10     printf("*********7:清空联系人********0:退出************************\n");
11     printf("**********************************************************\n");
12 }
13 int main()
14 {
15     Contact pcon;
16     Init(&pcon);
17     int input;
18     while (1)
19     {
20         Print();
21         printf("选择一个操作:");
22         scanf("%d", &input);
23         switch (input)
24         {
25         case EXIT:
26             Save_Contact(&pcon);
27             Free(&pcon);
28             exit(0);
29             break;
30         case ADD:
31             Add(&pcon);
32             break;
33         case DEL:
34             Delete(&pcon);
35             break;
36         case SEARCH:
37             Search(&pcon);
38             break;
39         case REVISE:
40             Revise(&pcon);
41             break;
42         case SORT:
43             Sort(&pcon);
44             break;
45         case DISPLAY:
46             Display(&pcon);
47             break;
48         case EMPTY:
49             Empty(&pcon);
50             break;
51         default:
52             printf("选择错误,请重新选择:\n");
53 
54         }
55     }
56     system("pause");
57     return 0;
58 }

 

 

 

---恢复内容结束---

posted @ 2017-01-11 19:07  xmc_2022  阅读(1910)  评论(0编辑  收藏  举报