前言:
我們用C語言實現一個可以存放100個人信息的通訊錄
每個人的信息包括:
姓名、性別、年齡、住址、電話
通訊錄的功能包括:
- 增加聯系人
- 刪除指定聯系人
- 查找指定聯系人
- 修改指定聯系人
- 顯示聯系人信息
- 排序聯系人(按照年齡/名字)
通訊錄的實現
1. 設計框架
與我們之前的掃雷和三子棋項目設計一樣,把程序分裝在三個文件中:
test.c:通訊錄的總體邏輯,測試通訊錄的相關功能
contact.c:通訊錄的實現模塊
contact.h:通訊錄的各種聲明,包括庫函數、自定義函數以及自定義結構體的聲明
2. 菜單函數的實現
實現通訊錄建立一個菜單是很重要的,并且菜單要包含通訊錄所有的功能,以便于用戶的操作
代碼如下:
void menu()
{
printf("********************************\n");
printf("***** 1. add ***\n");
printf("***** 2. del ***\n");
printf("***** 3. search ***\n");
printf("***** 4. modify ***\n");
printf("***** 5. show ***\n");
printf("***** 6. sort ***\n");
printf("***** 0. exit ***\n");
printf("********************************\n");
}
3. 菜單選項功能函數的實現
有了菜單之后我們還需要創(chuàng)建一個函數來進行菜單的選擇功能,比如輸入1,就會增加聯系人,輸入0,就可以退出程序
看代碼:
enum Option//使用枚舉變量來定義
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};
int main()
{
int input = 0;
Contact con;//通訊錄
//初始化通訊錄
//加載文件的信息到通訊錄中
InitContact(&con);
int input = 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("退出通訊錄\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}
這里我們用了switch語句和do····while語句來實現
4. 聯系人結構體的創(chuàng)建
用第一個結構體 PeoInfo
來存放人的信息,第二個結構體Contact
是通訊錄的信息,data
是以第一個結構體為類型的數組,用sz
來記錄通訊錄里當前有幾個人的信息。
代碼如下:
//表示一個人的信息
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
typedef struct Contact
{
PeoInfo data[MAX];//存放數據
int sz;//記錄通訊錄中的有效信息個數
}Contact;
5. 全局變量的定義
為了后期處理數據方便,我們用宏來實現這個功能
#include <stdio.h>
#include <string.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
通訊錄功能的實現
1. 初始化通訊錄
在對
data
初始化時,我們使用一個memset
函數來實現
此函數需要引用string
的頭文件
void InitContact(Contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));
}
2. 增加聯系人信息
訪問通訊錄結構體里的數組中的元素然后輸出就可以了
結構體對象訪問用:.
指針訪問用:->
代碼如下:
void AddContact(Contact* pc)
{
if (pc->sz == MAX)
{
printf("通訊錄已滿,無法增加\n");
return;
}
printf("請輸入名字:>");
scanf("%s", pc->data[pc->sz].name);
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("添加成功\n");
}
3. 打印通訊錄
這里我們用for循環(huán)來打印通訊錄
void ShowContact(const Contact* pc)
{
int i = 0;
//打印標題
printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話", "地址");
//打印數據
for (i = 0; i < pc->sz; i++)
{
printf("%-10s %-4d %-5s %-12s %-30s\n",
pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
4. 刪除指定聯系人
因為在刪除聯系人和查找聯系人時都需要查找的功能,所以我們在這里分裝了一個查找函數
代碼如下:
static int FindByName(const Contact* pc, char name[])
//加上static使得函數只能在自己所在的.c文件內部使用
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
我們利用查找函數查找下標,查找到我們需要刪除的聯系人的下標,然后對他進行刪除,刪除后我們要把后邊的元素向前移動,利用for循環(huán)來移動
代碼如下:
void DelContact(Contact* pc)
{
char name[MAX_NAME] = { 0 };
if (pc->sz == 0)
{
printf("通訊錄為空,無法刪除\n");
return;
}
//刪除
//1. 找到要刪除的人 - 位置(下標)
printf("輸入要刪除人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
typedef struct Contact
{
PeoInfo data[MAX];//存放數據
int sz;//記錄通訊錄中的有效信息個數
}Contact, *pContact;
if (pos == -1)
{
printf("要刪除的人不存在\n");
return;
}
int i = 0;
//2. 刪除 - 刪除pos位置上的數據
for (i = pos; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("刪除成功\n");
}
另一種寫法:
typedef struct Contact
{
PeoInfo data[MAX];//存放數據
int sz;//記錄通訊錄中的有效信息個數
}Contact, *pContact;
void DelContact(pContact pc);
void SearchContact(pContact pc);
5. 查找聯系人
代碼如下:
void SearchContact(const Contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("請輸入要查找人的名字:>");
scanf("%s", name);
//查找
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要查找的人不存在\n");
return;
}
//打印
printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話", "地址");
//打印數據
printf("%-10s %-4d %-5s %-12s %-30s\n",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
}
6. 修改通訊錄
代碼如下:
void ModifyContact(Contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("請輸入要修改人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要修改的人不存在\n");
return;
}
//修改
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("修改成功\n");
}
7. 排序通訊錄
用qsort函數來排序,需要提供比較函數,這里假設我們用名字來排序
代碼如下:
//按照名字來排序
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
printf("排序成功\n");
}
完整代碼
contact.h
#pragma once
#include <stdio.h>
#include <string.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30
//表示一個人的信息
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
typedef struct Contact
{
PeoInfo data[MAX];//存放數據
int sz;//記錄通訊錄中的有效信息個數
}Contact;
//初始化通訊錄
void InitContact(Contact* pc);
//增加指定聯系人
void AddContact(Contact* pc);
//顯示聯系人信息
void ShowContact(const Contact* pc);
//刪除指定聯系人
void DelContact(Contact* pc);
//查找指定聯系人
void SearchContact(const Contact* pc);
//修改通訊錄
void ModifyContact(Contact* pc);
//排序通訊錄元素
void SortContact(Contact* pc);
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//初始化通訊錄
void InitContact(Contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));
}
//增加聯系人
void AddContact(Contact* pc)
{
if (pc->sz == MAX)
{
printf("通訊錄已滿,無法增加\n");
return;
}
printf("請輸入名字:>");
scanf("%s", pc->data[pc->sz].name);
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("添加成功\n");
}
//顯示聯系人信息
void ShowContact(const Contact* pc)
{
int i = 0;
//打印標題
printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話", "地址");
//打印數據
for (i = 0; i < pc->sz; i++)
{
printf("%-10s %-4d %-5s %-12s %-30s\n",
pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
static int FindByName(const Contact* pc, char name[])
//加上static使得函數只能在自己所在的.c文件內部使用
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
//刪除指定聯系人
void DelContact(Contact* pc)
{
char name[MAX_NAME] = { 0 };
if (pc->sz == 0)
{
printf("通訊錄為空,無法刪除\n");
return;
}
//刪除
//1. 找到要刪除的人 - 位置(下標)
printf("輸入要刪除人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要刪除的人不存在\n");
return;
}
int i = 0;
//2. 刪除 - 刪除pos位置上的數據
for (i = pos; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("刪除成功\n");
}
//查找指定聯系人
void SearchContact(const Contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("請輸入要查找人的名字:>");
scanf("%s", name);
//查找
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要查找的人不存在\n");
return;
}
//打印
printf("%-10s %-4s %-5s %-12s %-30s\n", "姓名", "年齡", "性別", "電話", "地址");
//打印數據
printf("%-10s %-4d %-5s %-12s %-30s\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)
{
char name[MAX_NAME] = { 0 };
printf("請輸入要修改人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要修改的人不存在\n");
return;
}
//修改
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("修改成功\n");
}
//排序通訊錄元素
//按照名字來排序
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_by_name);
printf("排序成功\n");
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
printf("********************************\n");
printf("***** 1. add ***\n");
printf("***** 2. del ***\n");
printf("***** 3. search ***\n");
printf("***** 4. modify ***\n");
printf("***** 5. show ***\n");
printf("***** 6. sort ***\n");
printf("***** 0. exit ***\n");
printf("********************************\n");
}
enum Option//使用枚舉變量來定義
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};
int main()
{
int input = 0;
Contact con;//通訊錄
//初始化通訊錄
InitContact(&con);
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("退出通訊錄\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}
運行結果如圖所示:
這個靜態(tài)版通訊錄還是有很多不足的地方
1.通訊錄大小是固定大?。ㄖ荒苁?00個元素)
2.當通訊錄退出之后,重新運行,之前的信息都丟了
這是因為當前的通訊錄信息保存在內存中的,程序退出,內存就收回,下一次重新運行程序,內存重新分配,之前的數據就不見了
數據能否永久保存?——文件文章來源:http://www.zghlxwxcb.cn/news/detail-418927.html
下次七七會更新動態(tài)版的通訊錄,來解決這個問題,一起期待吧!
文章來源地址http://www.zghlxwxcb.cn/news/detail-418927.html
到了這里,關于靜態(tài)版通訊錄——C語言【詳解+全部碼源】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!