問題描述:
實現一個通訊錄;
通訊錄可以用來儲存個人的資訊,每個人的資訊包括:
姓名、性別、年齡、電話、住址。實現增,刪,查,找,清空這幾個功能。
程式分析:
(1)基本思路:學完了結構體,我們必須通過不斷地應用才能真正的掌握。這個通訊錄是以兩個結構體作為架構搭建的一個小型工程。如下所示:
typedef struct Peo
{
char name[NAME_LEN];
int age;
char sex[SEX_LEN];
char tele[TELE_LEN];
char addr[ADDR_LEN];
}PEO,*PPEO;
這個結構體類型是用來儲存一個連絡人的資訊以個模型。只是定義了這樣一個模型,還未定義具體的連絡人的資訊。
typedef struct Contact
{
PEO dhb[MAX_PEO]; //儲存人的資訊
int count; //記錄有效個數
}Con,*Pcon;
而上面這個結構體類型則是將每個連絡人儲存起來的一種結構。有了這兩種結構體類型,接下來只需要在這個基礎上對結構體的訪問或者賦值來完成通訊錄的各種功能。
(2)功能函數:知道了這個工程的規劃思想後,主要任務是編寫增,刪,查,改,清空以及顯示的一些函數,從而實現這個通訊錄的編寫。在這些函數中需要注意的地方有以下幾點:
a.增加連絡人的時候,千萬不能忘記有效連絡人數count++;
b.要刪除的連絡人是建立在尋找到該連絡人基礎上的操作,從這個連絡人開始,依次將後一個人的資訊賦給前一個人。最後,將count-1;
c.修改連絡人的資訊,也是在尋找到連絡人的基礎上的;
d.在寫清空所有連絡人這個函數的時候,要想到最簡便的是將有效連絡人的個數count賦為0;
(3)建立工程:在建立工程的時候應該注意,將函數的聲明和一些宏定義寫在標頭檔contact.h中,將這些函數的定義單獨寫在一個.c(.cpp)檔案中。再建立一個.c(.cpp)檔案用來調用這些函數。這樣這個通訊錄就能順利地完成了。
代碼如下:
/***************************************************************************************/
/*標頭檔<span style="background-color: rgb(255, 0, 0);">contact.h</span>*/#ifndef __CONTACT_H__#define __CONTACT_H__#include<stdio.h>#define NAME_LEN 20 #define SEX_LEN 5#define TELE_LEN 12#define ADDR_LEN 20#defineMAX_PEO 1000/**定義一個結構體類型儲存每個人的資訊**/typedef struct Peo{char name[NAME_LEN]; int age;char sex[SEX_LEN];char tele[TELE_LEN];char addr[ADDR_LEN];}PEO,*PPEO; //PEO代表了上邊所指的類型,PPEO是指向這個類型的結構指標/*定義一個電話本使所有人(不超過1000)的資訊可以存到裡面*/typedef struct Contact{PEO dhb[MAX_PEO];//儲存人的資訊int count;//記錄有效個數}Con,*Pcon;/**聲明以下幾個函數**/void InitContact(Pcon contact);//初始化有效連絡人的人數bool addContact(Pcon contact);//增加連絡人void showContact(Pcon contact); //顯示所有連絡人void print_menu(); //列印菜單int searchContact(Pcon contact); //尋找連絡人void deleteContact(Pcon contact);//刪除連絡人void clearContact(Pcon contact); //清空所有連絡人bool modifyContact(Pcon contact); //修改連絡人資訊#endif/**
**********************************************************************************************在這個<span style="background-color: rgb(255, 0, 0);">contact.c</span>檔案中將定義這幾個函數**/#include"contact.h"#include<string.h>void InitContact(Pcon contact){contact->count = 0; <span style="font-family: Arial, Helvetica, sans-serif;">/*將有效連絡人數初始化為0,也可以直接定義為0,</span><span style="font-family: Arial, Helvetica, sans-serif;">而不必封裝一個這樣的函數來達到contact初始化的目的*/</span>
}bool addContact(Pcon contact){ printf("name:");//提示輸入要添加的姓名 scanf("%s",contact->dhb[contact->count].name);//通過箭頭訪問到結構體中存放姓名的空間,並且將內容賦給name printf("age:");<span style="font-family: Arial, Helvetica, sans-serif;">//提示輸入要添加的年齡</span> scanf("%d",&(contact->dhb[contact->count].age));//<span style="font-family: Arial, Helvetica, sans-serif;">通過箭頭訪問到結構體中存放姓名的空間,並且將內容賦給age</span> printf("sex:");<span style="font-family: Arial, Helvetica, sans-serif;">//提示輸入要添加的性別</span> scanf("%s",contact->dhb[contact->count].sex);//<span style="font-family: Arial, Helvetica, sans-serif;">通過箭頭訪問到結構體中存放姓名的空間,並且將內容賦給sex</span> printf("tele:"); <span style="font-family: Arial, Helvetica, sans-serif;">//提示輸入要添加的姓名</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span> scanf("%s",contact->dhb[contact->count].tele);//<span style="font-family: Arial, Helvetica, sans-serif;">通過箭頭訪問到結構體中存放姓名的空間,並且將內容賦給tele</span> printf("addr:");<span style="font-family: Arial, Helvetica, sans-serif;">//提示輸入要添加的姓名</span> scanf("%s",contact->dhb[contact->count].addr);//<span style="font-family: Arial, Helvetica, sans-serif;">通過箭頭訪問到結構體中存放姓名的空間,並且將內容賦給addr</span> contact->count++;//使有效連絡人數贈加 return true;}void showContact(Pcon contact){int i = 0;//定義迴圈變數,並且將其初始化為0for(i = 0;i<contact->count;i++)//運用for迴圈將所有連絡人的所有資訊全部列印出來{printf("%12s",contact->dhb[i].name);//靠右12位對齊,輸出連絡人的姓名 printf("%12d",contact->dhb[i].age);<span style="font-family: Arial, Helvetica, sans-serif;">//靠右12位對齊,輸出連絡人的年齡</span>printf("%12s",contact->dhb[i].sex);<span style="font-family: Arial, Helvetica, sans-serif;">//靠右12位對齊,輸出連絡人的性別</span>printf("%12s",contact->dhb[i].tele);<span style="font-family: Arial, Helvetica, sans-serif;">//靠右12位對齊,輸出連絡人的電話號碼</span>printf("%12s\n",contact->dhb[i].addr);<span style="font-family: Arial, Helvetica, sans-serif;">//靠右12位對齊,輸出連絡人的住址</span>}}int searchContact(Pcon contact){char name[NAME_LEN];//定義一個字串數組printf("name:\n");scanf("%s",name);//輸入要尋找的連絡人的姓名int ret = 0;//定義迴圈變數for(ret = 0;ret<contact->count;ret++)//逐一進行判斷{if(strcmp(name,contact->dhb[ret].name) == 0)//判斷所查詢的連絡人的姓名與電話本中的連絡人姓名是否一致{return ret;//若一致,則返回該連絡人所在的下標}}return -1;//若尋找的連絡人不存在,則返回-1}void deleteContact(Pcon contact){int ret = searchContact(contact);//調用“尋找連絡人”這個函數,並用ret接收所尋找到的連絡人的下標while(ret<contact->count-1){contact->dhb[ret] = contact->dhb[ret+1];//這種思路:將ret位置的用ret+1位置的內容覆蓋,再講ret++,使ret指向下一位,相同思路,將後一個往前一個覆蓋到前一個的位置,ret往後走,從後往前覆蓋,這樣就達到了將原來ret位置的連絡人刪除的功能ret++;}(contact->count)--;//刪除完之後,將有效連絡人數-1}void clearContact(Pcon contact){ contact->count = 0;//清空連絡人,即將有效連絡人數置為0}bool modifyContact(Pcon contact){ int ret = searchContact(contact);<span style="font-family: Arial, Helvetica, sans-serif;">//調用“尋找連絡人”這個函數,並用ret接收所尋找到的連絡人的下標</span> printf("name:"); scanf("%s",contact->dhb[ret].name);<span style="font-family: Arial, Helvetica, sans-serif;">//輸入要修改後的姓名</span> printf("age:"); scanf("%d",&(contact->dhb[ret].age)); <span style="font-family: Arial, Helvetica, sans-serif;">//輸入要修改後的年齡</span> printf("sex:"); scanf("%s",contact->dhb[ret].sex); <span style="font-family: Arial, Helvetica, sans-serif;">//輸入要修改後的性別</span> printf("tele:"); scanf("%s",contact->dhb[ret].tele);<span style="font-family: Arial, Helvetica, sans-serif;">//輸入要修改後的電話號碼</span> printf("addr:"); scanf("%s",contact->dhb[ret].addr);<span style="font-family: Arial, Helvetica, sans-serif;">//輸入要修改後的住址</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span> return true;}void print_menu(){printf("***************************\n");//列印這個菜單,包含一些提示資訊printf("*[1]add: [2]show: *\n");printf("*[3]search: [4]delete:*\n");printf("*[5]clear: [6]modify:*\n");printf("***************************\n");}
/**************************************************************************<span style="background-color: rgb(255, 0, 0);">main.c</span>中函數的調用*/#include"contact.h"int main(){Con contact; //定義結構體contactInitContact(&contact);//使有效連絡人數得到初始化int input = 1;int ret;while(input) //運用while迴圈使程式可以在控制下迴圈測試{print_menu();printf("please chose input:\n");scanf("%d",&input);switch(input){case 1:addContact(&contact); //增加連絡人break;case 2:showContact(&contact);//顯示連絡人break;case 3:ret = searchContact(&contact);//尋找連絡人if(ret != -1){printf(" found it!\n");//ret沒有返回1,說明找到}else{printf("not exist!\n");//否則沒找到}break;case 4:deleteContact(&contact);//刪除連絡人break;case 5:clearContact(&contact);//清空連絡人break;case 6:modifyContact(&contact);//修改連絡人break;default:break;}}return 0;}