C語言實現(xiàn)靜態(tài)存儲通訊錄的示例代碼
最初的構(gòu)思與規(guī)劃
產(chǎn)品在制作之前一定要進(jìn)行一定的構(gòu)思,把要設(shè)計和實現(xiàn)的功能羅列出來。
所需要的功能
我們可以打開手機(jī)通訊錄發(fā)現(xiàn)有很多聯(lián)系人都已經(jīng)按照拼音順序排列的整整齊齊,想要找名字便可以搜索他的名字,誰更換號碼了可以進(jìn)行修改,把誰拉黑了,就可以刪除信息,認(rèn)識新朋友可以添加他的號碼。這就包括了 增、刪、查、改、展示、排序等功能。
現(xiàn)在設(shè)計的通訊錄是靜態(tài)版本下的通訊錄,之后會教大家制作動態(tài)版本和文件版本。

顯示菜單以及main函數(shù)
那么我們要制作一個菜單把以上功能都加入進(jìn)去。
//菜單
void menu()
{
printf("***************************\n");
printf(" 1.add 2.del \n");
printf(" 3.search 4.modify \n");
printf(" 5.show 6.sort \n");
printf(" 0.exit \n");
printf("***************************\n");
}

有了慘淡我們當(dāng)然要讓他是可以用的,不能當(dāng)花瓶呀。那我們就要寫一下我們的主函數(shù)(main)。
頭文件的聲明:
//contact.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];//20字節(jié)
char sex[MAX_SEX];//5字節(jié)
char tele[MAX_TELE];//12字節(jié)
int age;
char addr[MAX_ADDR];//30字節(jié)
}PeoInfo;
//通訊錄
typedef struct Contact
{
PeoInfo data[MAX];
int sz;
}Contact;
頭文件定義了一個結(jié)構(gòu)體存放個人信息 PeoInfo,但是我們這個通訊錄是有人數(shù)限制的,需要存一個人數(shù)進(jìn)去,那于是乎又設(shè)計了一個結(jié)構(gòu)體Contact 存放個人信息和已經(jīng)存了多少人的統(tǒng)計數(shù)sz。
//主函數(shù)
int main()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf("請選擇>:");
scanf("%d", &input);
switch (input)
{
case 1:
AddContact(&con);
break;
case 2:
DelContact(&con);
break;
case 3:
SearchContact(&con);
break;
case 4:
ModifyContact(&con);
break;
case 5:
ShowContact(&con);
break;
case 6:
SortContact(&con);
break;
case 0:
break;
default:
break;
}
} while (input);
return 0;
}以上必須要重申一下,函數(shù)和變量的命名方式我比較推薦駝峰法,最好不要用拼音和英文的縮寫,更不要都是小寫或者都是大寫,作為一個合格的程序員要養(yǎng)成良好的編碼習(xí)慣。define 的變量最好全是大寫,但是每個單詞都要用_隔開,例如:#define MAX_SEX 5。
增加個人信息
void AddContact(Contact* pc)//這里重點說一下,一定要確定好接收的是結(jié)構(gòu)體指針變量,形參和實參要多多復(fù)習(xí)。
{
if (pc->sz == MAX)//頭文件中定義了 MAX是100,不要忘記結(jié)合頭文件
{
printf("已經(jīng)滿了\n");
return;
}
else
{
printf("請輸入名字;》\n");
scanf("%s", pc->data[pc->sz].name);//這里我們要剖析一下,請看下面注釋
printf("請輸入性別:》\n");
scanf("%s", pc->data[pc->sz].sex);
printf("請輸入年齡:》\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("請輸入電話:》\n");
scanf("%s", pc->data[pc->sz].tele);
printf("請輸入地址:》\n");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加聯(lián)系人\n");
}
}注釋:
因為我們傳的是結(jié)構(gòu)體指針pc 結(jié)構(gòu)體指針引用數(shù)據(jù)要用剪頭->,之后引用到的數(shù)據(jù)data是結(jié)構(gòu)體數(shù)組需要添加下標(biāo)[pc->sz]就是它的下標(biāo),其中的pc->sz也是結(jié)構(gòu)體指針引用總個數(shù)sz的方式,最后已經(jīng)引用過的data里面的內(nèi)容要進(jìn)行引用需要用 . 這個符號引用(就是 普通結(jié)構(gòu)體的引用)。
提醒:
在這里還要再說一下關(guān)于 if else中大括號的注意事項,一定要縮進(jìn)和對齊,這還是一個程序員的基本功。另外還要提一下,else只會和最近的if結(jié)合,如果怕迷糊,請一定要在if結(jié)束后做大括號{}。
顯示所有聯(lián)系人的信息
想要驗證我們是不是真的添加了信息,那我們直接把他展示出來就好了,那順便把顯示所有聯(lián)系人函數(shù)也做出來。
//顯示所有聯(lián)系人
void ShowContact(Contact* pc)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%d: 姓名:%-10s 性別:%-5s 年齡:%-5d 電話:%-12s 地址:%-30s\n",
pc->sz,
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
??????? }
}刪除個人信息
刪除個人信息之前需要先查到這個人,于是設(shè)計了一個搜索姓名函數(shù),根據(jù)搜索到的結(jié)果找到該聯(lián)系人的位置,再刪除。其實是這個搜索姓名函數(shù)是至關(guān)重要的,最后的查找、修改個人信息也要用到。
//搜索姓名函數(shù)
int FindByName(Contact* pc, char name[])
{
int i = 0;
for (i=0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
//刪除個人信息函數(shù)
void DelContact(Contact* pc)
{
int ret = 0;
char name[MAX_NAME];
printf("請輸入要刪除的名字:》");
scanf("%s", name);
//查找以下是否存在
ret=FindByName(pc, name);
if (ret ==-1)
printf("刪除的人不存在\n");
else
{
//del
int j = 0;
for (j = ret; j < pc->sz-1; j++)
{
pc->data[j]=pc->data[j + 1];
}
pc->sz--;
printf("成功刪除!\n");
}
}查找個人信息
//搜索個人信息
void SearchContact(Contact* pc)
{
char name[MAX_NAME];
printf("請輸入要查找的姓名:》");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("輸入的是個球~\n");
}
else
{
int i = ret;
printf("姓名:%-10s 性別:%-5s 年齡:%-5d 電話:%-12s 地址:%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
???????}更改個人信息
//修改個人信息
void ModifyContact(Contact* pc)
{
char name[MAX_NAME];
printf("請輸入要修改的的名字:》");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("輸入的是個球~\n");
}
else
{
printf("請輸入名字;》\n");
scanf("%s", pc->data[ret].name);
printf("請輸入性別:》\n");
scanf("%s", pc->data[ret].sex);
printf("請輸入年齡:》\n");
scanf("%d", &(pc->data[ret].age));
printf("請輸入電話:》\n");
scanf("%s", pc->data[ret].tele);
printf("請輸入地址:》\n");
scanf("%s", pc->data[ret].addr);
printf("成功修改聯(lián)系人\n");
}
}這里有一個不足之處就是要更改就必須全部更改,不能只改一項信息,隨后會更新升級。
對聯(lián)系人信息進(jìn)行排序
//按年齡排序
int CompareOld(const void* st1, const void* st2)
{
return (((PeoInfo*)st1)->age - ((PeoInfo*)st2)->age);
}
//按姓名排序
int CompareName(const void* st1, const void* st2)
{
return strcmp(((PeoInfo*)st1)->name , ((PeoInfo*)st2)->name);
}
//排序信息
void SortContact(Contact* pc)
{
qsort(pc->data,pc->sz,sizeof(PeoInfo),CompareName);//這里就按姓名排序
}
這里的排序比較簡單,用到了qsort函數(shù),如果對qsort函數(shù)有疑問,那之后會做一個針對排序的博客詳細(xì)講解。只需要記得qsort不管數(shù)組是什么類型都可以進(jìn)行排序(字符串,字符,數(shù)組等)。
最后產(chǎn)品展示
contart.h 頭文件
//contart.h 頭文件
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.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[20];
char sex[5];
char tele[12];
int age;
char addr[30];
}PeoInfo;
//通訊錄
typedef struct Contact
{
PeoInfo data[100];
int sz;
}Contact;
//初始化通訊錄
void InitContact(Contact* pc);
//增加人的信息
void AddContact(Contact* pc);
//打印通訊錄信息
void ShowContact(Contact* pc);
//刪除個人信息
void DelContact(Contact* pc);
//搜索信息
void SearchContact(Contact* pc);
//修改信息
void ModifyContact(Contact* pc);
//排序信息
void SortContact(Contact* pc);
contart. c文件
//contart.c 文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void InitContact(Contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, 100 * sizeof(PeoInfo));
}
//增加聯(lián)系人
void AddContact(Contact* pc)
{
if (pc->sz == MAX)
{
printf("已經(jīng)滿了\n");
return;
}
else
{
printf("請輸入名字;》\n");
scanf("%s", pc->data[pc->sz].name);
printf("請輸入性別:》\n");
scanf("%s", pc->data[pc->sz].sex);
printf("請輸入年齡:》\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("請輸入電話:》\n");
scanf("%s", pc->data[pc->sz].tele);
printf("請輸入地址:》\n");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("成功增加聯(lián)系人\n");
}
}
//顯示所有聯(lián)系人
void ShowContact(Contact* pc)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%d: 姓名:%-10s 性別:%-5s 年齡:%-5d 電話:%-12s 地址:%-30s\n",
pc->sz,
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
//搜索姓名函數(shù)
int FindByName(Contact* pc, char name[])
{
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)
{
int ret = 0;
char name[MAX_NAME];
printf("請輸入要刪除的名字:》");
scanf("%s", name);
//查找以下是否存在
ret=FindByName(pc, name);
if (ret ==-1)
printf("刪除的人不存在\n");
else
{
//del
int j = 0;
for (j = ret; j < pc->sz-1; j++)
{
pc->data[j]=pc->data[j + 1];
}
pc->sz--;
printf("成功刪除!\n");
}
}
//搜索信息
void SearchContact(Contact* pc)
{
char name[MAX_NAME];
printf("請輸入要查找的姓名:》");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("輸入的是個球~\n");
}
else
{
int i = ret;
printf("姓名:%-10s 性別:%-5s 年齡:%-5d 電話:%-12s 地址:%-30s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tele,
pc->data[i].addr);
}
}
//修改信息
void ModifyContact(Contact* pc)
{
char name[MAX_NAME];
printf("請輸入要修改的的名字:》");
scanf("%s", name);
int ret = FindByName(pc, name);
if (ret == -1)
{
printf("輸入的是個球~\n");
}
else
{
printf("請輸入名字;》\n");
scanf("%s", pc->data[ret].name);
printf("請輸入性別:》\n");
scanf("%s", pc->data[ret].sex);
printf("請輸入年齡:》\n");
scanf("%d", &(pc->data[ret].age));
printf("請輸入電話:》\n");
scanf("%s", pc->data[ret].tele);
printf("請輸入地址:》\n");
scanf("%s", pc->data[ret].addr);
printf("成功修改聯(lián)系人\n");
}
}
//按年齡排序
int CompareOld(const void* st1, const void* st2)
{
return (((PeoInfo*)st1)->age - ((PeoInfo*)st2)->age);
}
//按姓名排序
int CompareName(const void* st1, const void* st2)
{
return strcmp(((PeoInfo*)st1)->name , ((PeoInfo*)st2)->name);
}
//排序信息
void SortContact(Contact* pc)
{
qsort(pc->data,pc->sz,sizeof(PeoInfo),CompareName);
}
main.c文件
//main.c 主函數(shù)文件代碼
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//一個漢字占兩個字節(jié)
void menu()
{
printf("***************************\n");
printf(" 1.add 2.del \n");
printf(" 3.search 4.modify \n");
printf(" 5.show 6.sort \n");
printf(" 0.exit \n");
printf("***************************\n");
}
int main()
{
int input = 0;
Contact con;
InitContact(&con);
do
{
menu();
printf("請選擇>:");
scanf("%d", &input);
switch (input)
{
case 1:
AddContact(&con);
break;
case 2:
DelContact(&con);
break;
case 3:
SearchContact(&con);
break;
case 4:
ModifyContact(&con);
break;
case 5:
ShowContact(&con);
break;
case 6:
SortContact(&con);
break;
case 0:
break;
default:
break;
}
} while (input);
return 0;
}

以上就是C語言實現(xiàn)靜態(tài)存儲通訊錄的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C語言靜態(tài)存儲通訊錄的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mac OS上搭建Apache+PHP+MySQL開發(fā)環(huán)境的詳細(xì)教程
這篇文章主要介紹了Mac OS上搭建Apache+PHP+MySQL開發(fā)環(huán)境的詳細(xì)教程,包括常見的PHP連接MySQL失敗問題的解決辦法,需要的朋友可以參考下2016-01-01

