標籤:c語言 結構體 結構體的直接存取 結構體的間接訪問 建立工程
問題描述:
實現一個通訊錄;
通訊錄可以用來儲存個人的資訊,每個人的資訊包括:
姓名、性別、年齡、電話、住址。實現增,刪,查,找,清空這幾個功能。
程式分析:
(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;}bool addContact(Pcon contact){ printf("name:"); scanf("%s",contact->dhb[contact->count].name); printf("age:"); scanf("%d",&(contact->dhb[contact->count].age)); printf("sex:"); scanf("%s",contact->dhb[contact->count].sex); printf("tele:"); scanf("%s",contact->dhb[contact->count].tele); printf("addr:"); scanf("%s",contact->dhb[contact->count].addr); contact->count++; return true;}void showContact(Pcon contact){int i = 0;for(i = 0;i<contact->count;i++){printf("%12s",contact->dhb[i].name);printf("%12d",contact->dhb[i].age);printf("%12s",contact->dhb[i].sex);printf("%12s",contact->dhb[i].tele);printf("%12s\n",contact->dhb[i].addr);}}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;}void deleteContact(Pcon contact){int ret = searchContact(contact);while(ret<contact->count-1){contact->dhb[ret] = contact->dhb[ret+1];ret++;}(contact->count)--;}void clearContact(Pcon contact){ contact->count = 0;}bool modifyContact(Pcon contact){ int ret = searchContact(contact); printf("name:"); scanf("%s",contact->dhb[ret].name); printf("age:"); scanf("%d",&(contact->dhb[ret].age)); printf("sex:"); scanf("%s",contact->dhb[ret].sex); printf("tele:"); scanf("%s",contact->dhb[ret].tele); printf("addr:"); scanf("%s",contact->dhb[ret].addr); 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");}/**定義這幾個函數**/#include"contact.h"#include<string.h>void InitContact(Pcon contact){contact->count = 0;}bool addContact(Pcon contact){ printf("name:"); scanf("%s",contact->dhb[contact->count].name); printf("age:"); scanf("%d",&(contact->dhb[contact->count].age)); printf("sex:"); scanf("%s",contact->dhb[contact->count].sex); printf("tele:"); scanf("%s",contact->dhb[contact->count].tele); printf("addr:"); scanf("%s",contact->dhb[contact->count].addr); contact->count++; return true;}void showContact(Pcon contact){int i = 0;for(i = 0;i<contact->count;i++){printf("%12s",contact->dhb[i].name);printf("%12d",contact->dhb[i].age);printf("%12s",contact->dhb[i].sex);printf("%12s",contact->dhb[i].tele);printf("%12s\n",contact->dhb[i].addr);}}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;}void deleteContact(Pcon contact){int ret = searchContact(contact);while(ret<contact->count-1){contact->dhb[ret] = contact->dhb[ret+1];ret++;}(contact->count)--;}void clearContact(Pcon contact){ contact->count = 0;}bool modifyContact(Pcon contact){ int ret = searchContact(contact); printf("name:"); scanf("%s",contact->dhb[ret].name); printf("age:"); scanf("%d",&(contact->dhb[ret].age)); printf("sex:"); scanf("%s",contact->dhb[ret].sex); printf("tele:"); scanf("%s",contact->dhb[ret].tele); printf("addr:"); scanf("%s",contact->dhb[ret].addr); 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;InitContact(&contact);int input = 1;int ret;while(input){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");}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;}
(C語言)通訊錄