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

通讯录实现的功能                              2017-01-11:
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 }

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

时间: 2024-10-18 18:34:44

简单的通讯录(C语言实现)的相关文章

51系列小型操作系统精髓 简单实现8 C语言版待改进

使用keil4  ,代码Code Optimization:0   运行OK 可运行8个任务 Program Size: data=21.0 xdata=0 code=401  (包括2个示例变量,未优化) 任务从中断处切换,在定时时间到后从定时中断中切换回来. 待改进地方 1.手动优化汇编程序 2. 重入问题 3.参数进函数和时中断的保护问题 #include "STC12C5A.H" #define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T

51系列小型操作系统精髓 简单实现11 C语言版优化后说明(有图)

/* CRTOS 实时可剥夺型内核 1.任务不用预加载,不用预定义.任务调用时加载,可删除(退出死循环即可) 2.单位轮转查询时间由晶振和定时器初始化决定.在这里为10ms 3.定时时间为[ time*单位轮转查询时间 ] ,其中time为 rtos_wait(time)中time. 4.可运行多个任务[自定义] 5.任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来,任务执行后,回到中断,再从中断回到主程序. */ #include "STC12C5A.H" #d

51系列小型操作系统精髓 简单实现7 C语言版待改进

#include "STC12C5A.H" #define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C  初始10ms #define MAX_TASKS 2 //任务槽最大个数. unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈.  PC指针为16位,需2个字节task_stack[][0]L  task_stack[][1]H. unsigned char idata task_tim

51系列小型操作系统精髓 简单实现10 C语言版优化后发布(有图)

4个任务 /* 使用keil4 可运行8个任务 任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来. */ #include "STC12C5A.H" #define TIMER_RELOAD() {TL0=0x00;TH0=0xC4;}//使能T/C 初始10ms #define MAX_TASKS 8 //任务槽最大个数. unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈. PC指针为16位,需2个字节tas

排序(2)---------简单插入排序(C语言实现)

插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 通俗解释: ①假设初始序列的第一个元素是有序的(当一个序列只有1个元素时,我们可以认为其是有序的). ②从第二个元素开始与前面的元素进行比较,如果比前面的大

51系列小型操作系统精髓 简单实现12 C语言版加保护参数

/* CRTOS 实时可剥夺型内核 1.任务不用预加载,不用预定义.任务调用时加载,可删除(退出死循环即可) 2.单位轮转查询时间由晶振和定时器初始化决定.在这里为10ms 3.定时时间为[ time*单位轮转查询时间 ] ,其中time为 rtos_wait(time)中time. 4.可运行多个任务[自定义] 5.任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来,任务执行后,回到中断,再从中断回到主程序. */ #include "STC12C5A.H" #d

一个简单的通讯录。。。

上课的时候老师布置了一个作业,利用结构体实现一个简单地通讯录,这可是我们大一的时候学期末的课设题目啊,不过还好现在的水平比之前高了那么一点.. 实现一个通讯录: 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人 这个是通讯录的主要功能. 这个比较大,所以我们写在三个文件里.

51系列小型操作系统精髓 简单实现6 C语言版待改进

#include "STC12C5A.H" #define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C  初始10ms #define MAX_TASKS 8 //任务槽最大个数. unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈.  PC指针为16位,需2个字节. unsigned char idata task_time[MAX_TASKS]; //定时时间 unsigned char

最简单的通讯录,实现了联系人的 增删该查

原文:最简单的通讯录,实现了联系人的 增删该查 源代码下载地址:http://www.zuidaima.com/share/1550463724014592.htm omcat servlet jsp db 最简单的通讯录 实现了联系人的 增删该查 数据库在压缩包内 经验证该分享代码有乱码的问题,界面也很粗糙,导入db也会有乱码问题.大家可以酌情下载,不过对初级工程师有借鉴意义. 登陆页面 http://localhost:端口/项目名称/login.html 管理页面 jdbc的连接配置需要手

51系列小型操作系统精髓 简单实现9 C语言版优化后发布(有图)

Program Size: data=20.0 xdata=0 code=360 creating hex file from "WK1C_T"... "WK1C_T" - 0 Error(s), 0 Warning(s). /* 使用keil4 可运行8个任务 任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来. */ #include "STC12C5A.H" #define TIMER_RELOAD() {TL0=0x0