導(dǎo)言:“練習(xí)成就不了完美。多練習(xí)會(huì)產(chǎn)生髓磷脂,是髓磷脂讓你做到完美?!薄つ釥枴た埔翣枺―aniel Coyle)
目錄
一:通訊錄的思想
二:通訊錄的實(shí)現(xiàn)
1.創(chuàng)建文件
2.打印菜單
3.創(chuàng)建聯(lián)系人結(jié)構(gòu)體
4.初始化菜單
5.實(shí)現(xiàn)菜單的功能
a.增加聯(lián)系人
b.刪除聯(lián)系人
c.查找聯(lián)系人
d.修改聯(lián)系人
e.打印聯(lián)系人
三:總結(jié)
一:通訊錄的思想
我們將每一位聯(lián)系人的姓名,性別,年齡,電話,地址來用一個(gè)結(jié)構(gòu)體保存,用另一個(gè)結(jié)構(gòu)體來保存通訊錄的信息和通訊錄已經(jīng)保存的聯(lián)系人的個(gè)數(shù)。
剩下通過函數(shù)依次實(shí)現(xiàn)通訊錄各個(gè)功能:
1.增加聯(lián)系人? 2.刪除聯(lián)系人? 3.查找聯(lián)系人 4.修改聯(lián)系人? 5.打印聯(lián)系人信息
二:通訊錄的實(shí)現(xiàn)
1.創(chuàng)建文件
首先我們創(chuàng)建三個(gè)文件,test.c用來測(cè)試,address.h用來聲明結(jié)構(gòu)體和函數(shù),address.c用來實(shí)現(xiàn)各個(gè)功能函數(shù)的實(shí)現(xiàn)。
?2.打印菜單
打印菜單是十分有必要的,能夠?qū)崿F(xiàn)與用戶的交互,菜單需要包含通訊錄的各個(gè)功能,便于操作。
打印菜單如下:
void menu() {
printf("-------- 1.增加:-------- \n");
printf("-------- 2.刪除:-------- \n");
printf("-------- 3.查詢:-------- \n");
printf("-------- 4.修改:-------- \n");
printf("-------- 5.打?。?------- \n");
printf(" 0.退出通訊錄: \n");
}
實(shí)際打印效果如下:
3.創(chuàng)建聯(lián)系人結(jié)構(gòu)體?
這里我們聯(lián)系人的信息用結(jié)構(gòu)體來保存,在頭文件聲明。
//類型的聲明
//一位聯(lián)系人的基本信息,我們都放在一個(gè)結(jié)構(gòu)體里面
typedef struct People {
char name[NAME_MAX]; //名字
char sex[SEX_MAX]; //性別
int age; //年齡
char tele[TELE_MAX]; //電話號(hào)碼
char addr[ADDR_MAX]; //地址
}People;
//通訊錄
typedef struct Address {
People date[MAX];//可以存放1000位聯(lián)系人
int sz;//記錄通訊錄已經(jīng)保存的聯(lián)系人個(gè)數(shù)
}Address;
這里我們?cè)O(shè)定存放1000位聯(lián)系人。第二個(gè)結(jié)構(gòu)體是我們的通訊錄,sz是記錄通訊錄已經(jīng)保存的聯(lián)系人個(gè)數(shù)。
看到這兒,可能會(huì)有人好奇我定義的數(shù)組里面大寫字母代表的是什么,這里我用的宏定義的變量,便于后期數(shù)值的修改。
#pragma once
//頭文件這里用來類型的聲明和函數(shù)的聲明
#include<stdio.h>
#include<assert.h>
#include<string.h>
//這樣是為了便于后續(xù)好修改大小和數(shù)據(jù)
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
4.初始化菜單
剛開始的時(shí)候,在結(jié)構(gòu)體Address中我們并沒有給數(shù)組和sz賦值,不知道起始數(shù)值是多少,所以現(xiàn)在我們需要將他們?nèi)抠x值為0,是通訊錄里面為空。
我們首先聲明一個(gè)初始化函數(shù)。
//初始化通訊錄函數(shù)
void InitAddress(Address* p);
由于結(jié)構(gòu)體傳參的數(shù)據(jù)所占內(nèi)存可能過大,所以我們結(jié)構(gòu)體傳遞用地址傳遞,后面都是如此。
函數(shù)的實(shí)現(xiàn)如下:
//初始化
void InitAddress(Address* p) {
assert(p);//斷言,為了指針的有效性
p->sz = 0;
//利用庫(kù)函數(shù),將數(shù)組全部初始化為0
memset(p->date, 0, sizeof(p->date));
}
初始化函數(shù)這里我們用到了庫(kù)函數(shù)memset,是將整個(gè)數(shù)組的字節(jié)大小全部修改為0.
5.實(shí)現(xiàn)菜單的功能
a.增加聯(lián)系人
在初始化函數(shù)后,我們開始實(shí)現(xiàn)模擬菜單的功能。但是在實(shí)現(xiàn)功能之前,我們還要選擇菜單選項(xiàng),可以讓用戶選擇幾就執(zhí)行幾所對(duì)應(yīng)的功能,并且能讓用戶可以一直輸入下去,這里我們使用枚舉變量來代表我們用戶選擇的數(shù)字,更加直接明了。
//利用枚舉類型便于直觀
enum Option {
EXIT,//0
ADD,//1
DEL,//2
FIND,//3
MODIFY,//4
PRINT//5
};
void test() {
printf("歡迎進(jìn)入通訊錄:\n");
int input = 0;
Address add;
//初始化通訊錄
InitAddress(&add);
do {
menu();
scanf("%d", &input);
switch (input) {
case ADD:
//增加聯(lián)系人
Add_Address(&add);
break;
case DEL:
//刪除聯(lián)系人
Del_Address(&add);
break;
case FIND:
//查詢聯(lián)系人
Find_Address(&add);
break;
case MODIFY:
//修改聯(lián)系人
Modify_Address(&add);
break;
case PRINT:
Print_Address(&add);
break;
case EXIT:
printf("退出通訊錄:\n");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入:\n");
break;
}
} while (input);
}
int main() {
test();
return 0;
}
現(xiàn)在我們來實(shí)現(xiàn)增加聯(lián)系人的操作,首先我們要聲明一個(gè)函數(shù)。
//增加聯(lián)系人
void Add_Address(Address* p);
函數(shù)的實(shí)現(xiàn):
//增加聯(lián)系人
void Add_Address(Address* p) {
assert(p);
//先判斷有沒有空間添加聯(lián)系人
if (p->sz == MAX) {
printf("通訊錄已滿,無法添加!\n");
}
//否則,添加聯(lián)系人
//錄入信息
printf("請(qǐng)輸入聯(lián)系人姓名:");
scanf("%s", p->date[p->sz].name);
printf("請(qǐng)輸入聯(lián)系人性別:");
scanf("%s", p->date[p->sz].sex);
printf("請(qǐng)輸入聯(lián)系人年齡:");
scanf("%d", &p->date[p->sz].age);
printf("請(qǐng)輸入聯(lián)系人電話:");
scanf("%s", p->date[p->sz].tele);
printf("請(qǐng)輸入聯(lián)系人地址:");
scanf("%s", p->date[p->sz].addr);
//記錄完一次,我們sz保存的聯(lián)系人就要加一次
p->sz++;
printf("聯(lián)系人保存成功!\n");
}
只要依次輸入對(duì)應(yīng)數(shù)據(jù),即可保存成功。
最終效果如下:
?
b.刪除聯(lián)系人
刪除元素我們需要將sz作為下標(biāo)來使用,具體實(shí)現(xiàn)如下,我們先聲明一個(gè)函數(shù)。
//刪除聯(lián)系人
void Del_Address(Address* p);
函數(shù)的實(shí)現(xiàn)
//刪除聯(lián)系人
//這里我們?cè)O(shè)置,如果存在這個(gè)聯(lián)系人,就返回下標(biāo)sz
//如果不存在這個(gè)聯(lián)系人,就返回-1。
int Find_name(const Address* p,char name[]) {
assert(p);
//采用循環(huán)遍歷
int i = 0;
for (i = 0; i < p->sz; i++) {
if (0 == strcmp(p->date[i].name, name)) {
//等于0,表示存在這個(gè)聯(lián)系人
return i;
}
}
//否則返回-1
return -1;
}
void Del_Address(Address* p) {
assert(p);
//判斷是否為空
if (p->sz == 0) {
printf("通訊錄已空,無法刪除!\n");
}
char name[20] = { 0 };
printf("請(qǐng)輸入你要?jiǎng)h除的聯(lián)系人姓名:\n");
scanf("%s", name);
int ret = Find_name(p,name);
if (ret == -1) {
printf("這個(gè)聯(lián)系人不存在!\n");
return;
}
else {
int j = 0;
for (j = ret; j < p->sz - 1; j++) {
p->date[j] = p->date[j + 1];
}
p->sz--;
}
printf("刪除成功.\n");
}
這里中間我們又定義了一個(gè)函數(shù)Find_name(),這個(gè)函數(shù)用來查找要?jiǎng)h除的聯(lián)系人是否在通訊錄中,用庫(kù)函數(shù)strcmp比較函數(shù)來判斷是否存在。另外,在刪除元素的時(shí)候要主要數(shù)組下標(biāo)越界的問題。
最終效果如下:
c.查找聯(lián)系人
查找聯(lián)系人和刪除很像,只要用Find_name()函數(shù)查找,再打印出來即可。首先我們?cè)俾暶骱瘮?shù)。
//查詢聯(lián)系人
void Find_Address(Address* p);
函數(shù)的實(shí)現(xiàn)
//查詢聯(lián)系人
void Find_Address(const Address* p) {
assert(p);
char name[20];
printf("請(qǐng)輸入你要查詢的聯(lián)系人姓名:\n");
scanf("%s", name);
int ret = Find_name(p, name);
if (ret == -1) {
printf("查無此人\n");
}
else {
//打印當(dāng)前查詢聯(lián)系人信息
printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "性別", "年齡", "電話", "地址");
printf("%-20s %-5s %-5d %-12s %-30s\n", p->date[ret].name, p->date[ret].sex, p->date[ret].age, p->date[ret].tele, p->date[ret].addr);
}
}
最終效果如下:
?d.修改聯(lián)系人
修改聯(lián)系人我們這里讓用戶選擇修改什么類容,通過信息查詢來進(jìn)行修改,跟實(shí)現(xiàn)菜單差不多,也是通過do? while?和switch來實(shí)現(xiàn)用戶的選擇,我們先聲明一個(gè)函數(shù)。
//修改聯(lián)系人
void Modify_Address(Address* p);
函數(shù)的實(shí)現(xiàn)
//修改聯(lián)系人信息
void Modify_Address(Address* p) {
assert(p);
char name[20]={0};
printf("請(qǐng)選擇你要修改的聯(lián)系人姓名:\n");
scanf("%s", name);
int ret= Find_name(p, name);
if (ret == -1) {
printf("查無此人\n");
}
else {
int input = 0;
do {
printf("請(qǐng)選擇你要修改的信息:\n");
printf("1.修改聯(lián)系人名字:\n");
printf("2.修改聯(lián)系人性別:\n");
printf("3.修改聯(lián)系人年齡:\n");
printf("4.修改聯(lián)系人電話:\n");
printf("5.修改聯(lián)系人地址:\n");
printf(" 0.退出修改: \n");
scanf("%d", &input);
switch (input) {
case 1:
//修改名字:
printf("請(qǐng)輸入你要修改的聯(lián)系人名字:\n");
scanf("%s", p->date[ret].name);
break;
case 2:
printf("請(qǐng)輸入你要修改的聯(lián)系人性別:\n");
scanf("%s", p->date[ret].sex);
break;
case 3:
printf("請(qǐng)輸入你要修改的聯(lián)系人年齡:\n");
scanf("%s", &p->date[ret].age);
break;
case 4:
printf("請(qǐng)輸入你要修改的聯(lián)系人電話:\n");
scanf("%s", &p->date[ret].tele);
break;
case 5:
printf("請(qǐng)輸入你要修改的聯(lián)系人地址:\n");
scanf("%s", &p->date[ret].addr);
break;
case 0:
printf("退出修改\n");
break;
default:
printf("輸入無效,請(qǐng)重新輸入:\n");
break;
}
} while (input);
}
printf("修改成功!\n");
}
這里我們通過Find_name函數(shù)所返回的那個(gè)下標(biāo)進(jìn)行修改,那個(gè)下標(biāo)就是我們要修改的聯(lián)系人對(duì)象。
最終效果如下:
?
e.打印聯(lián)系人
這里我們使用一個(gè)for循環(huán)和sz當(dāng)作下標(biāo)來依次打印出聯(lián)系人的信息。
聲明函數(shù):
//打印通訊錄
void Print_Address(Address* p);
函數(shù)的實(shí)現(xiàn)文章來源:http://www.zghlxwxcb.cn/news/detail-490715.html
//打印聯(lián)系人
void Print_Address(Address* p) {
assert(p);
//前面-是左對(duì)齊的意思,不加-就是右對(duì)齊
printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "性別", "年齡", "電話", "地址");
int i = 0;
for (i = 0; i < p->sz; i++) {
printf("%-20s %-5s %-5d %-12s %-30s\n", p->date[i].name, p->date[i].sex, p->date[i].age, p->date[i].tele, p->date[i].addr);
}
}
三.總結(jié)
寫到這兒也結(jié)束了,通訊錄是考察結(jié)構(gòu)體的運(yùn)用和創(chuàng)建,完整源碼如下,供參考,歡迎提錯(cuò)誤。文章來源地址http://www.zghlxwxcb.cn/news/detail-490715.html
#pragma once
//頭文件這里用來類型的聲明和函數(shù)的聲明
#include<stdio.h>
#include<assert.h>
#include<string.h>
//這樣是為了便于后續(xù)好修改大小和數(shù)據(jù)
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
//利用枚舉類型便于直觀
enum Option {
EXIT,//0
ADD,//1
DEL,//2
FIND,//3
MODIFY,//4
PRINT//5
};
//類型的聲明
//一位聯(lián)系人的基本信息,我們都放在一個(gè)結(jié)構(gòu)體里面
typedef struct People {
char name[NAME_MAX]; //名字
char sex[SEX_MAX]; //性別
int age; //年齡
char tele[TELE_MAX]; //電話號(hào)碼
char addr[ADDR_MAX]; //地址
}People;
//通訊錄
typedef struct Address {
People date[MAX];//可以存放1000位聯(lián)系人
int sz;//記錄通訊錄已經(jīng)保存的聯(lián)系人個(gè)數(shù)
}Address;
//函數(shù)的聲明
//初始化通訊錄函數(shù)
void InitAddress(Address* p);
//增加聯(lián)系人
void Add_Address(Address* p);
//刪除聯(lián)系人
void Del_Address(Address* p);
//打印通訊錄
void Print_Address(Address* p);
//查詢聯(lián)系人
void Find_Address(Address* p);
//修改聯(lián)系人
void Modify_Address(Address* p);
#define _CRT_SECURE_NO_WARNINGS 1
#include"address.h"
//通訊錄函數(shù)的實(shí)現(xiàn)
//初始化
void InitAddress(Address* p) {
assert(p);//斷言,為了指針的有效性
p->sz = 0;
//利用庫(kù)函數(shù),將數(shù)組全部初始化為0
memset(p->date, 0, sizeof(p->date));
}
//增加聯(lián)系人
void Add_Address(Address* p) {
assert(p);
//先判斷有沒有空間添加聯(lián)系人
if (p->sz == MAX) {
printf("通訊錄已滿,無法添加!\n");
}
//否則,添加聯(lián)系人
//錄入信息
printf("請(qǐng)輸入聯(lián)系人姓名:");
scanf("%s", p->date[p->sz].name);
printf("請(qǐng)輸入聯(lián)系人性別:");
scanf("%s", p->date[p->sz].sex);
printf("請(qǐng)輸入聯(lián)系人年齡:");
scanf("%d", &p->date[p->sz].age);
printf("請(qǐng)輸入聯(lián)系人電話:");
scanf("%s", p->date[p->sz].tele);
printf("請(qǐng)輸入聯(lián)系人地址:");
scanf("%s", p->date[p->sz].addr);
//記錄完一次,我們sz保存的聯(lián)系人就要加一次
p->sz++;
printf("聯(lián)系人保存成功!\n");
}
//刪除聯(lián)系人
//這里我們?cè)O(shè)置,如果存在這個(gè)聯(lián)系人,就返回下標(biāo)sz
//如果不存在這個(gè)聯(lián)系人,就返回-1。
int Find_name(const Address* p,char name[]) {
assert(p);
//采用循環(huán)遍歷
int i = 0;
for (i = 0; i < p->sz; i++) {
if (0 == strcmp(p->date[i].name, name)) {
//等于0,表示存在這個(gè)聯(lián)系人
return i;
}
}
//否則返回-1
return -1;
}
void Del_Address(Address* p) {
assert(p);
//判斷是否為空
if (p->sz == 0) {
printf("通訊錄已空,無法刪除!\n");
}
char name[20] = { 0 };
printf("請(qǐng)輸入你要?jiǎng)h除的聯(lián)系人姓名:\n");
scanf("%s", name);
int ret = Find_name(p,name);
if (ret == -1) {
printf("這個(gè)聯(lián)系人不存在!\n");
return;
}
else {
//刪除
int j = 0;
for (j = ret; j < p->sz - 1; j++) {
p->date[j] = p->date[j + 1];
}
p->sz--;
}
printf("刪除成功.\n");
}
//打印聯(lián)系人
void Print_Address(Address* p) {
assert(p);
//前面-是左對(duì)齊的意思,不加-就是右對(duì)齊
printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "性別", "年齡", "電話", "地址");
int i = 0;
for (i = 0; i < p->sz; i++) {
printf("%-20s %-5s %-5d %-12s %-30s\n", p->date[i].name, p->date[i].sex, p->date[i].age, p->date[i].tele, p->date[i].addr);
}
}
//查詢聯(lián)系人
void Find_Address(const Address* p) {
assert(p);
char name[20];
printf("請(qǐng)輸入你要查詢的聯(lián)系人姓名:\n");
scanf("%s", name);
int ret = Find_name(p, name);
if (ret == -1) {
printf("查無此人\n");
}
else {
//打印當(dāng)前查詢聯(lián)系人信息
printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "性別", "年齡", "電話", "地址");
printf("%-20s %-5s %-5d %-12s %-30s\n", p->date[ret].name, p->date[ret].sex, p->date[ret].age, p->date[ret].tele, p->date[ret].addr);
}
}
//修改聯(lián)系人信息
void Modify_Address(Address* p) {
assert(p);
char name[20]={0};
printf("請(qǐng)選擇你要修改的聯(lián)系人姓名:\n");
scanf("%s", name);
int ret= Find_name(p, name);
if (ret == -1) {
printf("查無此人\n");
}
else {
int input = 0;
do {
printf("請(qǐng)選擇你要修改的信息:\n");
printf("1.修改聯(lián)系人名字:\n");
printf("2.修改聯(lián)系人性別:\n");
printf("3.修改聯(lián)系人年齡:\n");
printf("4.修改聯(lián)系人電話:\n");
printf("5.修改聯(lián)系人地址:\n");
printf(" 0.退出修改: \n");
scanf("%d", &input);
switch (input) {
case 1:
//修改名字:
printf("請(qǐng)輸入你要修改的聯(lián)系人名字:\n");
scanf("%s", p->date[ret].name);
break;
case 2:
printf("請(qǐng)輸入你要修改的聯(lián)系人性別:\n");
scanf("%s", p->date[ret].sex);
break;
case 3:
printf("請(qǐng)輸入你要修改的聯(lián)系人年齡:\n");
scanf("%s", &p->date[ret].age);
break;
case 4:
printf("請(qǐng)輸入你要修改的聯(lián)系人電話:\n");
scanf("%s", &p->date[ret].tele);
break;
case 5:
printf("請(qǐng)輸入你要修改的聯(lián)系人地址:\n");
scanf("%s", &p->date[ret].addr);
break;
case 0:
printf("退出修改\n");
break;
default:
printf("輸入無效,請(qǐng)重新輸入:\n");
break;
}
} while (input);
}
printf("修改成功!\n");
}
#define _CRT_SECURE_NO_WARNINGS 1
//通訊錄
//靜態(tài)版本
//通訊錄可以存儲(chǔ)1000位聯(lián)系人
#include"address.h"
void menu() {
printf("-------- 1.增加:-------- \n");
printf("-------- 2.刪除:-------- \n");
printf("-------- 3.查詢:-------- \n");
printf("-------- 4.修改:-------- \n");
printf("-------- 5.打?。?------- \n");
printf(" 0.退出通訊錄: \n");
}
void test() {
printf("歡迎進(jìn)入通訊錄:\n");
int input = 0;
Address add;
//初始化通訊錄
InitAddress(&add);
do {
menu();
scanf("%d", &input);
switch (input) {
case ADD:
//增加聯(lián)系人
Add_Address(&add);
break;
case DEL:
//刪除聯(lián)系人
Del_Address(&add);
break;
case FIND:
//查詢聯(lián)系人
Find_Address(&add);
break;
case MODIFY:
//修改聯(lián)系人
Modify_Address(&add);
break;
case PRINT:
Print_Address(&add);
break;
case EXIT:
printf("退出通訊錄:\n");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入:\n");
break;
}
} while (input);
}
int main() {
test();
return 0;
}
到了這里,關(guān)于手機(jī)通訊錄的實(shí)現(xiàn)——C語言(靜態(tài)版本)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!