在我們的平常生活中常常會用到電話通訊錄,常用的功能有添加聯系人,删除,查找,删除,清空,顯示,按姓名排序等
現在我們就來實作以下要求的簡易通訊錄
實作一個通訊錄;
通訊錄可以用來存儲1000個人的資訊,每個人的資訊包括:
姓名、性别、年齡、電話、住址
提供方法:
1. 添加聯系人資訊
2. 删除指定聯系人資訊
3. 查找指定聯系人資訊
4. 修改指定聯系人資訊
5. 顯示所有聯系人資訊
6. 清空所有聯系人
7. 以名字排序所有聯系人
要實作通訊錄,就要用到結構體。可以建立兩個結構體,一個用來存放資料的,另一個把這些資料存放起來。
相當于先建立一個檔案夾用來存放下的小電影,檔案夾可以按照國家來建立很多個嘛,然後再把這麼多的檔案夾放在你的隐藏空間裡。這裡按照國家起名的檔案夾就是第一個結構體,這個隐藏空間就是第二個結構體。隐藏空間肯定要用一個計算存了多少檔案夾的計數器,是以第二個結構體要定義一個計數器。
具體的怎麼實作直接來看代碼,注釋裡有解釋
按子產品化來寫
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
void menu()
{
printf("***************************************************\n");
printf("***1、添加聯系人資訊 2、删除指定聯系人資訊***\n");
printf("***3、查找指定聯系人資訊 4、修改指定聯系人資訊***\n");
printf("***5、顯示所有聯系人資訊 6、清空所有聯系人 ***\n");
printf("***7、以名字排序所有聯系人 0、exit ***\n");
printf("***************************************************\n");
}
enum OP //用枚舉法列出選項,直覺
{
EXIT,
ADD,
DEL,
FIND,
MOD,
SHOW,
EMPTY,
SORT
};
void test()
{
int input = 0;
struct Contact my_con; //建立一個struct Contact類型的對象
my_con.sz = 0; //将計數器清零
InitContact(&my_con); //初始化對象
do
{
menu();
printf("請輸入你的選擇:>");
scanf("%d",&input);
switch (input)
{
case ADD:
add_con(&my_con);
break;
case DEL:
del_con(&my_con);
break;
case FIND:
find_con(&my_con);
break;
case MOD:
modifty_con(&my_con);
break;
case SHOW:
show_con(&my_con);
break;
case EMPTY:
empty_con(&my_con);
break;
case SORT:
sort_con(&my_con);
break;
case EXIT:
printf("退出\n");
break;
default:
printf("選擇錯誤\n");
break;
}
}while(input);
}
int main()
{
test();
system("pause");
return 0;
}
Contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
void InitContact(Contact pcon) //靜态初始化
{
pcon->sz = 0;
memset(pcon->data,0,sizeof(pcon->data));
}
int add_con(Contact pcon) //添加資料
{
if(pcon->sz == MAX) //派出存滿
{
printf("通訊錄已滿\n");
return -1;
}
{
printf("請輸入姓名:>");
scanf("%s",pcon->data[pcon->sz].name);
printf("請輸入性别:>");
scanf("%s",pcon->data[pcon->sz].sex);
printf("請輸入年齡:>");
scanf("%d",&pcon->data[pcon->sz].age);
printf("請輸入電話号碼:>");
scanf("%s",pcon->data[pcon->sz].tel);
printf("請輸入位址:>");
scanf("%s",pcon->data[pcon->sz].addr);
printf("添加成功\n");}
pcon->sz++; //存一個計數器加1
return 0;
}
int del_con(Contact pcon) //要删除的資料
{
int i = 0;
int ret = 0;
if(pcon->sz == 0) //如果沒有資料則傳回-1
{
printf("通訊錄裡沒有資訊\n");
return 0;
}
ret = find_con(pcon); //先周遊一遍
if(ret != -1)
{
for(i=ret; i<pcon->sz-1; i++);
{
pcon->data[i] = pcon->data[i+1]; //删除相當于把後面的資料依次向前覆寫前面的資料
}
pcon->sz--; //删除之後計數器減1
return 1;
}
else
{
printf("沒有要删除的人\n");
return -1;
}
}
int find_con(Contact pcon) //查找,為後面的其他選項提供周遊
{
int i = 0;
char name[NAME_MAX];
printf("請輸入名字:>");
scanf("%s",name);
for(i=0; i<pcon->sz; i++)
{
if(strcmp(pcon->data[i].name,name)==0)
{
printf("%10s",pcon->data[i].name);
printf("%4s",pcon->data[i].sex);
printf("%4d",pcon->data[i].age);
printf("%12s",pcon->data[i].tel);
printf("%20s",pcon->data[i].addr);
printf("\n");
return i;
}
}
return -1;
}
int modifty_con(Contact pcon) //要修改的内容
{
int i = 0;
int ret = 0;
if(pcon->sz == 0) //如果沒資料則傳回
{
printf("沒有可修改的資料\n");
return 0;
}
ret = find_con(pcon); //先在周遊一遍,看有沒有要修改的資料
if(ret != -1)
{
printf("請重新輸入要改的資料\n");
printf("請輸入姓名:>");
scanf("%s",pcon->data[pcon->sz].name);
printf("請輸入性别:>");
scanf("%s",pcon->data[pcon->sz].sex);
printf("請輸入年齡:>");
scanf("%d",pcon->data[pcon->sz].age);
printf("請輸入電話:>");
scanf("%s",pcon->data[pcon->sz].tel);
printf("請輸入位址:>");
scanf("%s",pcon->data[pcon->sz].addr);
return 1;
}
else
{
printf("沒找到要修改的名字\n");
return -1;
}
}
int show_con(Contact pcon) //将所有資訊按存入時間來顯示出來
{
int i = 0;
for(i=0; i<pcon->sz; i++) //時間順序
{
printf("%10s",pcon->data[i].name);
printf("%4s",pcon->data[i].sex);
printf("%4d",pcon->data[i].age);
printf("%12s",pcon->data[i].tel);
printf("%20s",pcon->data[i].addr);
printf("\n");
}
printf("\n");
return 0;
}
int empty_con(Contact pcon) //清空資料
{
pcon->sz = 0; //隻是将要計數器清零,實際資料還在(相當于位址變為起始位址指針)
return 0;
}
int sort_con(Contact pcon) //按姓名字母大小排序顯示
{
int tmp = 0;
int ret = 0;
int i = 0;
int j = 0;
PeoInfo swp ; //定義另一個PeoInfo的對象
if(pcon->sz == 0) //如果清單為空,則傳回
{
printf("沒有可靠的資料\n");
return 0;
}
for(i=0; i<pcon->sz-1; i++)
{
for(j=0; j<pcon->sz-i-1; j++)
{
if(strcmp(pcon->data[j].name,pcon->data[j+1].name)>0) //按照名字的大小,按照從小到大冒泡排序
{
swp = pcon->data[j];
pcon->data[j] = pcon->data[j+1];
pcon->data[j+1] = swp;
}
}
}
tmp = show_con(pcon); //将排序後的列印出來
return 0;
}
Contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NAME_MAX 20
#define SEX_MAX 4
#define TEL_MAX 12
#define ADDR_MAX 30
#define MAX 1000
typedef struct PeoInfo //定義一個存一個資料的結構體
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tel[TEL_MAX];
char addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact //定義一個能存放1000個類型為PeoInfo類型的結構體
{
PeoInfo data[MAX];
int sz;
};
typedef struct Contact *Contact; //将結構體重命名為一個結構體指針,用來直接指向結構體内容
void InitContact(Contact pcon);
int add_con(Contact pcon);
int del_con(Contact pcon);
int find_con(Contact pcon);
int modifty_con(Contact pcon);
int show_con(Contact pcon);
int empty_con(Contact pcon);
int sort_con(Contact pcon);
#endif //__CONTACT_H__