題目:實(shí)現(xiàn)一個(gè)通訊錄,通訊錄可以用來(lái)存儲(chǔ)1000個(gè)人的信息,每個(gè)人的信息包括:姓名,性別,年齡,電話,住址,
C結(jié)構(gòu)體實(shí)現(xiàn)一個(gè)通訊錄
。提供方法:1.添加聯(lián)系人信息 2.刪除指定聯(lián)系人的信息 3.查找指定聯(lián)系人的信息 4.修改指定聯(lián)系人的信息 5.顯示所有聯(lián)系人信息 6.清空所有聯(lián)系人 7.以名字排序所有聯(lián)系人
思路分析:1. 首先我們可以分三個(gè)模塊來(lái)解決這個(gè)問(wèn)題,第一個(gè)模塊我們需要一個(gè)頭文件,這個(gè)頭文件里可以包含一些相應(yīng)信息,當(dāng)實(shí)現(xiàn)文件和測(cè)試文件包含自己定義的頭文件時(shí)便可以獲得一些相關(guān)的信息。所以頭文件里應(yīng)該包括一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體里應(yīng)包含姓名,性別,年齡,電話,住址。同時(shí)還可以定義一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體里包含通訊錄,同時(shí)通訊錄里人員的計(jì)數(shù)變量,將通訊錄的地址傳到別的地方便可以實(shí)現(xiàn)對(duì)它遍歷或者其他操作。 2.第二個(gè)模塊便是我們的測(cè)試函數(shù),測(cè)試函數(shù)便可以實(shí)現(xiàn)我們的菜單打印,同時(shí)由我們接收不同的值便可以實(shí)現(xiàn)不同的操作,就是相應(yīng)的方法的實(shí)現(xiàn),這里很明顯可以通過(guò)一個(gè)switch語(yǔ)句來(lái)進(jìn)行控制。 3.第三個(gè)模塊便是我們的方法實(shí)現(xiàn)的函數(shù),將模塊2里定義的類型為通訊錄的地址傳到各個(gè)方法里,這樣便可以實(shí)現(xiàn)對(duì)通訊錄的操作。
代碼實(shí)現(xiàn):
模塊1:
#pragma oncetypedef struct Peo//每一個(gè)人的信息用一個(gè)結(jié)構(gòu)來(lái)接收,包括姓名,性別,年齡,電話,地址{char name[20];char sex[4];int age;char tell[12];char address[20];}Peo;typedef struct Contact//將通訊錄和人員計(jì)數(shù)也聲明在結(jié)構(gòu)體里{Peo Dhb[1000];int count;}Contact;void add_stu(Contact *p);//相應(yīng)函數(shù)void del_stu(Contact *p);void find_stu(Contact *p);void modify_stu(Contact *p);void show_stu(Contact *p); void clear_stu(Contact *p);void sort_stu(Contact *p);
模塊2:(測(cè)試功能)
#include<stdio.h>#include"contact.h"#include<stdlib.h>Contact con;//類型為Contact變量,里面包含電話本和計(jì)數(shù)變量void menu(){printf("menu:\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("**********6.清空聯(lián)系人信息************\n");printf("******7.以名字排序所有聯(lián)系人信********\n");}void test()//測(cè)試函數(shù){int input = 1;menu();while (input){printf("請(qǐng)輸入選項(xiàng):");scanf_s("%d", &input);switch (input)//方法選擇功能的實(shí)現(xiàn){case 1:add_stu(&con);break;case 2:del_stu(&con);break;case 3:find_stu(&con);break;case 4:modify_stu(&con);break;case 5:show_stu(&con);break;case 6:clear_stu(&con);break;case 7:sort_stu(&con);break;case 0:exit(1);break;}}}int main(){test(); return 0;}
模塊3:(方法的具體實(shí)現(xiàn))
#include"contact.h"#include<string.h>int search(Contact *p,char *pname)//分裝的函數(shù)利于刪除,查找,修改方法的實(shí)現(xiàn){int ret;int i;for (i = 0; i < p->count; i++){if(strcmp(p->Dhb[i].name, pname)==0)return i;}return -1;}void add_stu(Contact *p)//添加聯(lián)系人{(lán)printf("請(qǐng)輸入姓名:");scanf("%s", p->Dhb[p->count].name);printf("請(qǐng)輸入性別:");scanf("%s", p->Dhb[p->count].sex);printf("請(qǐng)輸入年齡:");scanf("%d", &p->Dhb[p->count].age);printf("請(qǐng)輸入電話:");scanf("%s", p->Dhb[p->count].tell);printf("請(qǐng)輸入地址:");scanf("%s", p->Dhb[p->count].address);p->count++;printf("聯(lián)系人添加成功\n");}void del_stu(Contact *p)//刪除聯(lián)系人{(lán)int ret;int n;int i = 0;char name[20];printf("請(qǐng)輸入要?jiǎng)h除人的姓名:");scanf("%s",name);ret=search(p,name);if (ret !=-1){printf("要?jiǎng)h除的人存在\n");printf("你是否確定刪除該聯(lián)系人?\n");printf("確定輸入1,不刪除輸入0\n");scanf("%d",&n);if (n == 1){for (i = 0; i < p->count; i++){p->Dhb[i] = p->Dhb[i + 1];//使i后面的元素向前覆蓋便可以刪掉}printf("刪除成功\n");}else{printf("刪除失敗\n");}}}void find_stu(Contact *p)//查找聯(lián)系人{(lán)int ret;char name[20];printf("請(qǐng)輸入要查找人的姓名:");scanf("%s", name);ret = search(p, name);if (ret !=-1){printf("要查找的人存在\n");printf("%s ", p->Dhb[ret].name);printf("%s ", p->Dhb[ret].sex);printf("%d ", p->Dhb[ret].age);printf("%s ", p->Dhb[ret].tell);printf("%s ", p->Dhb[ret].address);}}void modify_stu(Contact *p)//修改聯(lián)系人{(lán)int ret;char name[20];printf("請(qǐng)輸入要修改人的姓名:");scanf("%s", name);ret = search(p, name);if (ret != -1){printf("請(qǐng)把姓名修改成:");scanf("%s", p->Dhb[ret].name);printf("請(qǐng)把性別修改成:");scanf("%s", p->Dhb[ret].sex);printf("請(qǐng)把年齡修改成:");scanf("%d", &p->Dhb[ret].age);printf("請(qǐng)把電話修改成:");scanf("%s", p->Dhb[ret].tell);printf("請(qǐng)把地址修改成:");scanf("%s", p->Dhb[ret].address);}else{printf("不存在此人\n");}}void show_stu(Contact *p)//顯示聯(lián)系人信息{int i = 0;printf("輸出所有人的信息:");for (i = 0; i <( p->count); i++){printf("%s ",p->Dhb[i].name);printf("%s ", p->Dhb[i].sex);printf("%d ", p->Dhb[i].age);printf("%s ", p->Dhb[i].tell);printf("%s ", p->Dhb[i].address);}printf("\n");}void clear_stu(Contact *p)//清空聯(lián)系人{(lán)p->count = 0;//是人員計(jì)數(shù)的變量置0就可以實(shí)現(xiàn)清空}void sort_stu(Contact *p)//以名字排序所有聯(lián)系人{(lán)int i = 0;int j = 0;for (i = 0; i < p->count-1;i++)//冒泡法for (j = 0; j < p->count - 1 - i;j++){if (strcmp(p->Dhb[j].name, p->Dhb[j + 1].name)>0){Peo tmp;tmp=p->Dhb[j];p->Dhb[j] =p-> Dhb[j + 1];p->Dhb[j + 1] = tmp;}}void show_stu( p);}
總結(jié):此題只是利用了相關(guān)結(jié)構(gòu)體的知識(shí),主要難處就是三個(gè)模塊各自的分工不好想到,其他地方便只是基本方法的實(shí)現(xiàn),