wordpress增加網(wǎng)址大全seo優(yōu)化一般多少錢
? 1.實現(xiàn)怎樣一個通訊錄
實現(xiàn)一個通訊錄 | 聯(lián)系人信息: |
1.可以保存100個人的信息 | 名字 |
2.添加聯(lián)系人 | 年齡 |
3.刪除指定聯(lián)系人 | 性別 |
4.查找指定聯(lián)系人 | 電話 |
5.修改指定聯(lián)系人 | 住址 |
6.排序聯(lián)系人 | |
7.顯示所有聯(lián)系人信息 |
?2.通訊錄的實現(xiàn)
2.1創(chuàng)建兩個源文件和一個頭文件
首先我們創(chuàng)建contact.c和test.c,contact.h,在頭文件中包含了程序所需的各種頭文件并且實現(xiàn)對各種函數(shù)的聲明,而源文件test.c用于引用函數(shù),contact.c實現(xiàn)函數(shù)。這樣做的目的是為了各個文件可以處理各自模塊的功能,增強邏輯性和代碼的清晰度,使得可讀性更高。
?2.2搭建構(gòu)架
1.菜單打印
首先在test.c這個源文件里面把菜單打印出來,直接使用printf函數(shù)打印出通訊錄的功能即可。
void menu()
{printf("**********************************\n");printf("*****1.Add 2.del ********\n");printf("*****3.Search 4.modify ********\n");printf("*****5.show 6.sort ********\n");printf("***** 0.exit ********\n");printf("**********************************\n");
}
?2.使用do while
這里相比較之前寫的游戲代碼進行了改進,因為數(shù)字的具體含義不知道,所以使用了枚舉常量代替,而枚舉常量會進行默認賦值,所以從0開始一一對應就行了,增加了代碼的可讀性。
enum Option
{EXIT,//0ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};
int main()
{int input = 0;Contact con;//通訊錄InitContact(&con);//初始化通訊錄do{menu();printf("請輸入你的選擇:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);break;case DEL:break;case SEARCH:break;case MODIFY:break;case SHOW:ShowContact(&con);break;case SORT:break;case EXIT:printf("退出通訊錄\n");break;default:printf("選擇錯誤,重新選擇\n");break;}} while (input);return 0;
}
3.使用結(jié)構(gòu)體保存聯(lián)系人的信息
接下來在contact.h里面創(chuàng)建結(jié)構(gòu)體來包含人的信息,如果覺得在使用結(jié)構(gòu)體時每次都要寫成struct PeoInfom比較復雜,可以在struct前面加上typedef,這樣的話使用這個結(jié)構(gòu)體寫PeoInfom就行。如果我們在數(shù)組里面寫上數(shù)字的話,就是常量,以后如果發(fā)生變化,修改起來不夠方便,可以使用#define定義常量。
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#define MAME_MAX 40
#define SEX_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100
//類型的聲明
typedef struct PeoInfom
{char name[MAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfom;
4.將通訊錄初始化
在contact.h里面創(chuàng)建一個結(jié)構(gòu)體,sz記錄的是當前通訊錄中存放的人的信息個數(shù),PeoInfom data是用來存放數(shù)據(jù)。
typedef struct Contact
{PeoInfom data[MAX];//存放數(shù)據(jù)int sz;//記錄的是當前通訊錄中存放的人的信息個數(shù)
}Contact;
在test.c的主函數(shù)里面創(chuàng)建通訊錄contact con,這個通訊錄里面有一個存放數(shù)據(jù)的數(shù)組,還有個聯(lián)系人數(shù)量,現(xiàn)在這個通訊錄沒有數(shù)據(jù)。
Contact con;
結(jié)果調(diào)試以后發(fā)現(xiàn)data和sz都是隨機數(shù),所以先對通訊錄初始化。結(jié)構(gòu)體傳參的時候盡量傳址,傳值的話如果結(jié)構(gòu)體過大會導致性能下降,在test.c中進行傳址。
InitContact(&con);//初始化通訊錄
在contact.h中聲明函數(shù):
void InitContact(Contact* pc);//初始化通訊錄
在contact.c中進行函數(shù)的實現(xiàn),sz直接訪問賦0即可。data是一塊連續(xù)的空間,所以使用memset函數(shù)將數(shù)據(jù)全部變?yōu)?,data單獨放在sizeof內(nèi)部表示這個數(shù)組,第三個參數(shù)直接使用sizeof求出data的大小就行了,單位都是字節(jié)。當然使用循環(huán)也許,但是memset更加方便快捷。
void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));
}
5.添加聯(lián)系人
首先在case語句中寫上添加聯(lián)系人函數(shù)AddContact,然后進行傳址。
case ADD:AddContact(&con);break;
在contact.h中聲明:
void AddContact(Contact* pc);//增加聯(lián)系人
在contact.c中實現(xiàn):?
首先判斷一下通訊錄空間是否滿了,使用if判斷sz是不是等于MAX。如果沒有滿,則開始輸入信息,先打印提醒信息,在輸入,名字放在通訊錄里面data數(shù)組的下標為pc->sz的位置上,所以是pc->data[pc->sz].name,name是數(shù)組名,數(shù)組名本身是地址,所以不需要使用&。然后模仿名字這樣把各項信息輸入進去,最后sz++,再打印提示信息。
void AddContact(Contact* pc)
{assert(pc);if (pc->sz == MAX){printf("通訊錄已滿,無法增加\n");return;}//增加信息 printf("請輸入名字:");scanf("%s", pc->data[pc->sz].name);printf("請輸入年齡:");scanf("%d", &(pc->data[pc->sz].age));printf("請輸入性別:");scanf("%s",pc->data[pc->sz].sex);printf("請輸入電話:");scanf("%s",pc->data[pc->sz].tele);printf("請輸入地址:");scanf("%s",pc->data[pc->sz].addr);pc->sz++;printf("添加聯(lián)系人成功\n");
}
那么我們輸入成功之后是看不見這些信息的,所以需要完成show函數(shù),展示出來。
6.展示通訊錄信息
首先在case語句中寫上添加聯(lián)系人函數(shù)ShowContact,然后進行傳址。
case SHOW:ShowContact(&con);break;
在contact.c中實現(xiàn):
由于不需要修改數(shù)據(jù),使用const限制一下參數(shù)。
先使用if判斷一下通訊錄是否為空,如果不是再打印信息。
首先我們把各項信息的標題打印出來,確定好間隔。然后開始打印信息,通過找到data數(shù)組的下標找出相應的結(jié)構(gòu)體,然后使用下標訪問操作符找出相對應的信息,打印出來。
void ShowContact(const Contact *pc)
{if(ps->sz == 0){printf("通訊錄為空\n");}else{int i = 0;//標題printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");//數(shù)據(jù)for(i = 0; i < pc->sz; i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}}
}
7.刪除指定聯(lián)系人
首先在contact.h聲明:
void DelContact(Contact* pc);//刪除指定聯(lián)系人
在test.c中使用:
case DEL:DelContact(&con);break;
在contact.c中實現(xiàn):
刪除聯(lián)系人先判斷一下通訊錄是否為空,名字單獨創(chuàng)建一個數(shù)組,然后輸入名字,然后開始在通訊錄查找名字。
寫一個Findbyname的名字查找函數(shù),參數(shù)分別是pc這個通訊錄和name,在通訊錄里面查找sz次,使用strcmp函數(shù)比較,如果等于0,就是找到了這個聯(lián)系人,則返回下標,否則返回-1.
回到刪除函數(shù),如果返回的是-1,則聯(lián)系人不存在。找到了則將返回的下標作為for函數(shù)的i,將i+1這個結(jié)構(gòu)體代替i這個結(jié)構(gòu)體,然后不斷的循環(huán)。如果判斷條件設(shè)置為i<pc->sz的話,訪問到最后一個結(jié)構(gòu)體就會越界,所以是sz-1,并且for循環(huán)走完之后sz--,如果要刪除最后一個結(jié)構(gòu)體的時候。則不會訪問到最后一個結(jié)構(gòu)體,已經(jīng)被刪除了。
int Findbyname(Contact* pc,char name[])
{assert(pc);for (int i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(Contact* pc)
{char name[NAME_MAX];assert(pc);if (pc->sz == 0){printf("通訊錄為空\n");}printf("請輸入要刪除的聯(lián)系人:");scanf("%s", name);int ret = Findbyname(pc, name);if (ret == -1){printf("要刪除的人不存在\n");return;}else {for (int i = ret; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("刪除成功\n");}
}
8.查找聯(lián)系人?
在test.c中使用:
case SEARCH:SearchContact(&con);break;
在contact.h中聲明:
void SearchContact(const Contact* pc);//查找聯(lián)系人
在contact.c中實現(xiàn):
這里其實是使用到了Findbyname這個函數(shù)和展示函數(shù),需要注意的是要把下標換成ret。
void SearchContact(const Contact* pc)
{char name[NAME_MAX];assert(pc);printf("請輸入聯(lián)系人:");scanf("%s", name);int ret = Findbyname(pc, name);if (ret == -1){printf("要查找的人不存在\n");return;}else{//標題printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");//數(shù)據(jù)printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[ret].name,pc->data[ret].age,pc->data[ret].sex,pc->data[ret].tele,pc->data[ret].addr);}
}
9.修改聯(lián)系人
在contact.h里面聲明:
void ModifyContact(Contact* pc);//修改聯(lián)系人信息
在test.c中使用:?
case MODIFY:ModifyContact(&con);break;
在contact.c中實現(xiàn):
修改函數(shù)使用Findbyname函數(shù)后直接用添加聯(lián)系人的方法就可以了,需要注意的是把下標改成ret。
void ModifyContact(Contact* pc)
{char name[NAME_MAX];assert(pc);printf("請輸入聯(lián)系人:");scanf("%s", name);int ret = Findbyname(pc, name);if (ret == -1){printf("要修改的人不存在\n");return;}printf("請輸入名字:");scanf("%s", pc->data[ret].name);printf("請輸入年齡:");scanf("%d", &(pc->data[ret].age));printf("請輸入性別:");scanf("%s", pc->data[ret].sex);printf("請輸入電話:");scanf("%s", pc->data[ret].tele);printf("請輸入地址:");scanf("%s", pc->data[ret].addr);printf("修改聯(lián)系人成功\n");
}
?10.排序聯(lián)系人
在test.c中使用:?
case SORT:SortContact(&con);break;
在contact.h里面聲明:
void SortContact(Contact* pc);//排序聯(lián)系人
在contact.c中實現(xiàn):
這里使用一個qsort進行排序即可,比較函數(shù)使用strcmp。
int cmp_name(const void* e1, const void* e2)
{return (strcmp(((Contact*)e1)->data->name, ((Contact*)e2)->data->name));
}
//聯(lián)系人排序
void SortContact(Contact* pc)
{assert(pc);qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);//打印printf("排序完成\n");ShowContact(pc);
}
完整代碼:
contact.h:
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#define NAME_MAX 40
#define SEX_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100
//類型的聲明
typedef struct PeoInfom
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfom;typedef struct Contact
{PeoInfom data[MAX];//存放數(shù)據(jù)int sz;//記錄的是當前通訊錄中存放的人的信息個數(shù)
}Contact;void InitContact(Contact* pc);//初始化通訊錄void AddContact(Contact* pc);//增加聯(lián)系人void ShowContact(const Contact* pc);//展示通訊錄信息void DelContact(Contact* pc);//刪除指定聯(lián)系人void SearchContact(const Contact* pc);//查找聯(lián)系人void ModifyContact(Contact* pc);//修改聯(lián)系人信息void SortContact(Contact* pc);//排序聯(lián)系人
contact.c:
#include"contact.h"
void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));
}
void AddContact(Contact* pc)
{assert(pc);if (pc->sz == MAX){printf("通訊錄已滿,無法增加\n");return;}//增加信息 printf("請輸入名字:");scanf("%s", pc->data[pc->sz].name);printf("請輸入年齡:");scanf("%d", &(pc->data[pc->sz].age));printf("請輸入性別:");scanf("%s",pc->data[pc->sz].sex);printf("請輸入電話:");scanf("%s",pc->data[pc->sz].tele);printf("請輸入地址:");scanf("%s",pc->data[pc->sz].addr);pc->sz++;printf("添加聯(lián)系人成功\n");
}
void ShowContact(const Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通訊錄為空\n");}else{int i = 0;//標題printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");//數(shù)據(jù)for (i = 0; i < pc->sz; i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}}
}
int Findbyname(Contact* pc,char name[])
{assert(pc);for (int i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}
void DelContact(Contact* pc)
{char name[NAME_MAX];assert(pc);if (pc->sz == 0){printf("通訊錄為空\n");}printf("請輸入要刪除的聯(lián)系人:");scanf("%s", name);int ret = Findbyname(pc, name);if (ret == -1){printf("要刪除的人不存在\n");return;}else {for (int i = ret; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("刪除成功\n");}
}
void SearchContact(const Contact* pc)
{char name[NAME_MAX];assert(pc);printf("請輸入聯(lián)系人:");scanf("%s", name);int ret = Findbyname(pc, name);if (ret == -1){printf("要查找的人不存在\n");return;}else{//標題printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");//數(shù)據(jù)printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",pc->data[ret].name,pc->data[ret].age,pc->data[ret].sex,pc->data[ret].tele,pc->data[ret].addr);}
}
void ModifyContact(Contact* pc)
{char name[NAME_MAX];assert(pc);printf("請輸入聯(lián)系人:");scanf("%s", name);int ret = Findbyname(pc, name);if (ret == -1){printf("要修改的人不存在\n");return;}printf("請輸入名字:");scanf("%s", pc->data[ret].name);printf("請輸入年齡:");scanf("%d", &(pc->data[ret].age));printf("請輸入性別:");scanf("%s", pc->data[ret].sex);printf("請輸入電話:");scanf("%s", pc->data[ret].tele);printf("請輸入地址:");scanf("%s", pc->data[ret].addr);printf("修改聯(lián)系人成功\n");
}int cmp_name(const void* e1, const void* e2)
{return (strcmp(((Contact*)e1)->data->name, ((Contact*)e2)->data->name));
}
//聯(lián)系人排序
void SortContact(Contact* pc)
{assert(pc);qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);//打印printf("排序完成\n");ShowContact(pc);
}
test.c:
#include"contact.h"//測試通訊錄的基本功能
void menu()
{printf("**********************************\n");printf("*****1.Add 2.del ********\n");printf("*****3.Search 4.modify ********\n");printf("*****5.show 6.sort ********\n");printf("***** 0.exit ********\n");printf("**********************************\n");
}
enum Option
{EXIT,//0ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};
int main()
{int input = 0;Contact con;//通訊錄InitContact(&con);//初始化通訊錄do{menu();printf("請輸入你的選擇:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);break;case DEL:DelContact(&con);break;case SEARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:SortContact(&con);break;case EXIT:printf("退出通訊錄\n");break;default:printf("選擇錯誤,重新選擇\n");break;}} while (input);return 0;
}
今天的分享到這里就結(jié)束啦!謝謝老鐵們的閱讀,讓我們下期再見。