通訊錄的創(chuàng)建
通訊錄中是存放人的信息的,人的信息包括:姓名、年齡、性別、電話、住址??梢园讶说男畔⒍x成結構體,因為每個聯系人的信息都有這幾個要素。
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
//類型的定義
typedef struct PeoInfo //定義人的信息類型
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
注:用#define定義的標識符常量,使用修改時可以降低維護成本。如聯系人的信息中名字的寬度為20,以便之后需要修改時只需修改一處,而不是修改全部用到名字的寬度為20的地方。
定義完結構體類型之后,創(chuàng)建通訊錄(通訊錄需要能夠存放1000個人的信息)可以利用人信息類型創(chuàng)建元素為1000的數組。但是當要操作通訊錄中聯系人的信息內容時,比如增加聯系人信息,這時就需要知道通訊錄中的聯系人是否已經到達上限或者需要知道在哪個位置添加人的信息(需要知道當前通訊錄中有幾個人的信息),如果達到上限就無法再添加聯系人。綜上通訊錄在維護時需要存放數據的空間和通訊錄中當前總共有幾個元素,將這兩個變量放到一起定義成結構體通訊錄。這樣就避免了執(zhí)行每個功能時都要相同地傳入兩個變量(聯系人信息,已有聯系人個數)方便傳參。
//通訊錄定義
typedef struct Contact
{
PeoInfo data[MAX];//存放添加進來的人的信息
int sz;//記錄的是當前通訊錄中有效信息的個數
}Contact;
通訊錄的初始化
通訊錄創(chuàng)建完之后,需要將通訊錄進行初始化。內存空間清零并將記錄的是當前通訊錄中有效信息的個數清零
//通訊錄初始化
void InitContact(Contact* pc)
{
pc->sz = 0;
//memset(); - 內存設置
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");
}
通訊錄刪除特定聯系人信息
通訊錄刪除特定聯系人信息如果通訊錄為空則不能刪除,如果通訊錄不為空,則需要判斷要刪除的聯系人是否存在于通訊錄中(查找要刪除的人)。如果要刪除的聯系人存在于通訊錄中則刪除。
查找函數是通過聯系人的名字在通訊錄中進行查找,查找的過程就是排除的過程。通過遍歷進行查找,如果找到了返回通訊錄中聯系人信息所在的下標,否則返回-1。
通訊錄刪除特定聯系人信息的方式有兩種:
注:
- 第一種方式在刪除的時候需要將要刪除聯系人信息的位置用后一個聯系人信息的位置進行覆蓋即可,依次類推,直到將最后一個聯系人信息的位置覆蓋到倒數第二個聯系人信息的位置即可。不需要將最后一個聯系人的信息也覆蓋這是毫無意義的,因為刪除完信息之后通訊錄中有效信息的個數會減一這時也就看不到最后一個聯系人信息了。這樣也可以避免數組越界訪問
- 雖然第二種方法操作起來比較簡單,移動的次數也更少,但是還是使用第一種方法進行刪除,因為第二種方法會搗亂聯系人的先后順序。
最后刪除完指定聯系人信息后需要將當前通訊錄中有效信息的個數減一。
static int FindByName(Contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;//找不到
}
void DelContact(Contact* pc)
{
char name[MAX_NAME] = { 0 };
if (pc->sz == 0)
{
printf("通訊錄為空,無需刪除\n");
return;
}
printf("請輸入要刪除人的名字:>");
scanf("%s", name);
//1. 查找要刪除的人
//有/沒有
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要刪除的人不存在\n");
return;
}
//2. 刪除
int i = 0;
for (i = pos; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("刪除成功\n");
}
通訊錄查找特定聯系人信息
在通訊錄查找特定聯系人信息,如果找到將查找函數返回的通訊錄中聯系人信息所在下標并打印通訊錄中特定聯系人信息的內容。如果未找到則將打印要查找的人不存在。
void SearchContact(Contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("請輸入要查找人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要查找的人不存在\n");
return;
}
else
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");
//打印數據
printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\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;
}
else
{
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");
}
}
通訊錄排序聯系人信息
排序聯系人信息可以通過qosrt函數進行排序,這里只需要寫一個自定義的比較函數即可。
//自定義比較函數
static int CmpByName(const void* e1, const void* e2)
{
return strcmp((const char*)e1, (const char*)e2);
}
void SortContact(struct Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(PeoInfo), CmpByName);//排序
printf("排序成功\n");
}
通訊錄打印聯系人信息
當前通訊錄中有效信息的個數有幾個,通訊錄中聯系人信息就打印幾個。
void PrintContact(const Contact* pc)
{
int i = 0;
//打印標題
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");
//打印數據
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
通訊錄整體代碼
test.c
#define _CRT_SECURE_NO_WARNINGS 1
//通訊錄-靜態(tài)版本
//1.通訊錄中能夠存放1000個人的信息
//每個人的信息:
//名字+年齡+性別+電話+地址
//2. 增加人的信息
//3. 刪除指定人的信息
//4. 修改指定人的信息
//5. 查找指定人的信息
//6. 排序通訊錄的信息
#include "contact.h"
void menu()
{
printf("********************************\n");
printf("****** 1. add 2. del ******\n");
printf("****** 3. search 4. modify*****\n");
printf("****** 5. sort 6. print *****\n");
printf("****** 0. exit *****\n");
printf("********************************\n");
}
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
PRINT
};
int main()
{
int input = 0;
//創(chuàng)建通訊錄
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 SORT:
//排序
SortContact(&con);
break;
case PRINT:
//打印
PrintContact(&con);
break;
case EXIT:
//退出
printf("退出通訊錄\n");
break;
default:
printf("選擇錯誤,重新選擇\n");
break;
}
} while (input);
return 0;
}
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//通訊錄初始化
void InitContact(Contact* pc)
{
pc->sz = 0;
//memset(); - 內存設置
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 PrintContact(const Contact* pc)
{
int i = 0;
//打印標題
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");
//打印數據
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
static int FindByName(Contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;//找不到
}
void DelContact(Contact* pc)
{
char name[MAX_NAME] = { 0 };
if (pc->sz == 0)
{
printf("通訊錄為空,無需刪除\n");
return;
}
printf("請輸入要刪除人的名字:>");
scanf("%s", name);
//1. 查找要刪除的人
//有/沒有
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要刪除的人不存在\n");
return;
}
//2. 刪除
int i = 0;
for (i = pos; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("刪除成功\n");
}
void SearchContact(Contact* pc)
{
char name[MAX_NAME] = { 0 };
printf("請輸入要查找人的名字:>");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("要查找的人不存在\n");
return;
}
else
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");
//打印數據
printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\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;
}
else
{
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");
}
}
//自定義比較函數
static int CmpByName(const void* e1, const void* e2)
{
return strcmp((const char*)e1, (const char*)e2);
}
void SortContact(struct Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(PeoInfo), CmpByName);//排序
printf("排序成功\n");
}
contact.h文章來源:http://www.zghlxwxcb.cn/news/detail-453882.html
#pragma once
#include <string.h>
#include <stdio.h>
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
#define MAX 1000
//類型的定義
typedef struct PeoInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
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 PrintContact(const Contact* pc);
//刪除聯系人的信息
void DelContact(Contact* pc);
//查找指定聯系人
void SearchContact(Contact* pc);
//修改指定聯系人
void ModifyContact(Contact* pc);
//排序聯系人信息
void SortContact(struct Contact* pc);
注:文章來源地址http://www.zghlxwxcb.cn/news/detail-453882.html
- test.c是用于測試通訊錄的模塊、contact.c用于通訊錄模塊的函數實現、contact.h用于通訊錄模塊的類型定義以及函數聲明
- 使用枚舉可以增加代碼的可讀性,避免程序員寫代碼以及閱讀代碼時不明確代碼其中的的具體意義。
到了這里,關于C語言—通訊錄的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!