C語言實現(xiàn)制作通訊錄(新手推薦)
一、本通訊錄要實現(xiàn)的功能
通訊錄可以用來存儲1000個人的信息,每個人的信息包括:姓名、性別、年齡、電話、住址
通訊錄可執(zhí)行的操作如下:
- 添加聯(lián)系人信息
- 刪除指定聯(lián)系人信息
- 查找指定聯(lián)系人信息
- 修改指定聯(lián)系人信息
- 顯示所有聯(lián)系人信息
- 清空所有聯(lián)系人
- 以名字排序所有聯(lián)系人
二、通訊錄初步準(zhǔn)備:
1.創(chuàng)建一個.c文件,編寫主函數(shù)main;
2.再創(chuàng)建一個.c文件,用于集中存放1中的.c文件所使用到的自定義函數(shù);
3.創(chuàng)建一個.h頭文件,用于申明1中的.c文件所使用到的函數(shù)。
如下圖:

三、程序編寫
下文將介紹程序的編寫思路:
步驟1、首先根據(jù)通訊錄所包含的信息要求,在頭文件中構(gòu)造結(jié)構(gòu)體PeoIfo,即通訊錄要求包含的信息;再構(gòu)造結(jié)構(gòu)體contact用于儲存多個聯(lián)系人。(注:本段代碼使用#define是因為整個程序中會多次用到這些數(shù)值,通過#define的方式若后期要修改值,不需要通篇去修改。)
#define MAX 100
#define nameMAX 20
#define sexMAX 10
#define telMAX 20
#define adrMAX 20
struct PeoIfo
{
char name[nameMAX];
char sex[sexMAX];
int age;
char tel[telMAX];
char adr[adrMAX];
};
struct contact
{
struct PeoIfo data[MAX];
int sz;
};步驟2、在第一個.c文件中寫主函數(shù)main(),對步驟1中所構(gòu)造的結(jié)構(gòu)體進(jìn)行初始化,初始化函數(shù)次數(shù)命名為InitContact(&con)。(注:此處段代碼需要引用頭文件“contact.h”)
#include"contact.h"
int main() {
int input = 0;
struct contact con;
//初始化
InitContact(&con);
return 0;
}
步驟3、在頭文件中申明初始化函數(shù)
//初始化 void InitContact(struct contact* pc);
步驟4、再另外一個.c文件中編寫該初始化函數(shù),使其實現(xiàn)初始化功能。
//初始化
void InitContact(struct contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, MAX * sizeof(struct PeoIfo));
}
步驟5、回到主函數(shù)main()中。編寫程序菜單menu(),再編寫Switch語句,對應(yīng)菜單中的選項。此處以1.add為例,1.add選項為增加聯(lián)系人。
#include"contact.h"
void menu()
{
printf("*****************************\n");
printf("****1.add 2.del ****\n");
printf("****3.search 4.modify ****\n");
printf("****5.show 6.empty ****\n");
printf("****7.sort 0.exit ****\n");
printf("*****************************\n");
}
int main() {
int input = 0;
struct contact con;
//初始化
InitContact(&con);
do
{
menu();
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
add(&con);
break;
case 2:
del(&con);
break;
case 3:
search(&con);
break;
case 4:
modify(&con);
break;
case 5:
show(&con);
break;
case 6:
InitContact(&con);//直接給他初始化不就清空了。
break;
case 7:
Sort(&con);
break;
case 0:
printf("已退出通訊錄。\n");
break;
default:
printf("輸入錯誤,請重新輸入:\n");
break;
}
} while (input);
return 0;
}步驟6、在.h頭文件中申明函數(shù)
//添加聯(lián)系人 void add(struct contact* pc);
步驟7、在另外一個.c文件中,對add函數(shù)編寫,使其達(dá)到添加聯(lián)系人的功能。此處介紹一下
pc->data[pc->sz].name的含義,pc->data[i],對data中的第i個聯(lián)系人的結(jié)構(gòu)體PeoIfo進(jìn)行解引用,.name便是指該聯(lián)系人的姓名。該段代碼末尾pc->sz++,是指聯(lián)系人+1。
//添加聯(lián)系人
void add(struct contact* pc)
{
if (pc->sz >= MAX)
{
printf("通訊錄已滿。\n");
return;
}
printf("請輸入姓名\n");
scanf("%s", pc->data[pc->sz].name);
printf("請輸入性別\n");
scanf("%s", pc->data[pc->sz].sex);
printf("請輸入年齡\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("請輸入電話\n");
scanf("%s", pc->data[pc->sz].tel);
printf("請輸入住址\n");
scanf("%s", pc->data[pc->sz].adr);
pc->sz++;
}步驟8、同理重復(fù)步驟6、7,實現(xiàn)剩余的刪除、查找等功能。此處不一一贅述,讀者在學(xué)會add的編寫之后,建議獨自進(jìn)行其他功能的函數(shù)實現(xiàn)思考。
四、完整程序
1、主函數(shù)所在的.c文件原碼
#include"contact.h"
void menu()
{
printf("*****************************\n");
printf("****1.add 2.del ****\n");
printf("****3.search 4.modify ****\n");
printf("****5.show 6.empty ****\n");
printf("****7.sort 0.exit ****\n");
printf("*****************************\n");
}
int main() {
int input = 0;
struct contact con;
//初始化
InitContact(&con);
do
{
menu();
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
add(&con);
break;
case 2:
del(&con);
break;
case 3:
search(&con);
break;
case 4:
modify(&con);
break;
case 5:
show(&con);
break;
case 6:
InitContact(&con);//直接給他初始化不就清空了。
break;
case 7:
Sort(&con);
break;
case 0:
printf("已退出通訊錄。\n");
break;
default:
printf("輸入錯誤,請重新輸入:\n");
break;
}
} while (input);
return 0;
}2、.h頭文件原碼
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define MAX 100
#define nameMAX 20
#define sexMAX 10
#define telMAX 20
#define adrMAX 20
struct PeoIfo
{
char name[nameMAX];
char sex[sexMAX];
int age;
char tel[telMAX];
char adr[adrMAX];
};
struct contact
{
struct PeoIfo data[MAX];
int sz;
};
//初始化
void InitContact(struct contact* pc);
//添加聯(lián)系人
void add(struct contact* pc);
//刪除聯(lián)系人
void del(struct contact* pc);
//查找聯(lián)系人
void search(struct contact* pc);
//修改聯(lián)系人
void modify(struct contact* pc);
//展示通訊錄
void show(struct contact* pc);
//清空通訊錄
void empty(struct contact* pc);
//按姓名排序
void Sort(struct contact* pc);3、自定義函數(shù)所在的.c文件原碼
#include"contact.h"
//打印項目
void pri()
{
printf("%-15s\t%-10s\t%-10s\t%-10s\t%-20s\n", "姓名", "性別", "年齡", "電話", "住址");
}
//查找聯(lián)系人的位置
int FindPOS(const struct contact* pc,char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0==strcmp(pc->data[i].name, name) )
{
return i;
}
}
return -1;
}
//初始化
void InitContact(struct contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, MAX * sizeof(struct PeoIfo));
}
//添加聯(lián)系人
void add(struct contact* pc)
{
if (pc->sz >= MAX)
{
printf("通訊錄已滿。\n");
return;
}
printf("請輸入姓名\n");
scanf("%s", pc->data[pc->sz].name);
printf("請輸入性別\n");
scanf("%s", pc->data[pc->sz].sex);
printf("請輸入年齡\n");
scanf("%d", &(pc->data[pc->sz].age));
printf("請輸入電話\n");
scanf("%s", pc->data[pc->sz].tel);
printf("請輸入住址\n");
scanf("%s", pc->data[pc->sz].adr);
pc->sz++;
}
//刪除聯(lián)系人
void del(struct contact* pc)
{
printf("請輸入要刪除的聯(lián)系人姓名:\n");
char delname[nameMAX];
scanf("%s", &delname);
int ret=FindPOS(pc, delname);
if (-1 == ret)
{
printf("要刪除的聯(lián)系人不存在\n");
}
else
{
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->data[ret] = pc->data[ret + 1];
}
pc->sz--;
printf("刪除成功\n");
}
}
//查找聯(lián)系人
void search(struct contact* pc)
{
char sechname[nameMAX];
printf("請輸入要找的聯(lián)系人:\n");
scanf("%s", &sechname);
int ret = FindPOS(pc, sechname);
if (-1 == ret)
{
printf("找不到聯(lián)系人\n");
return;
}
pri();
printf("%-15s\t%-10s\t%-10d\t%-10s\t%-20s\n",
pc->data[ret].name,
pc->data[ret].sex,
pc->data[ret].age,
pc->data[ret].tel,
pc->data[ret].adr);
}
//修改聯(lián)系人
void modify(struct contact* pc)
{
printf("請輸入要修改的聯(lián)系人姓名:\n");
char moname[nameMAX];
scanf("%s", &moname);
int ret = FindPOS(pc, moname);
if (-1 == ret)
{
printf("沒有找到聯(lián)系人\n");
}
else
{
printf("請輸入姓名\n");
scanf("%s", pc->data[ret].name);
printf("請輸入性別\n");
scanf("%s", pc->data[ret].sex);
printf("請輸入年齡\n");
scanf("%d", &(pc->data[ret].age));
printf("請輸入電話\n");
scanf("%s", pc->data[ret].tel);
printf("請輸入住址\n");
scanf("%s", pc->data[ret].adr);
}
}
//展示通訊錄
void show(struct contact* pc)
{
pri();
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%-15s\t%-10s\t%-10d\t%-10s\t%-20s\n",
pc->data[i].name,
pc->data[i].sex,
pc->data[i].age,
pc->data[i].tel,
pc->data[i].adr);
}
}
//按姓名排序
int compare(void* s1, void* s2)
{
return strcmp(((struct PeoIfo*)s1)->name, ((struct PeoIfo*)s2)->name);
}
void Sort(struct contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct PeoIfo), compare);
}以上就是C語言實現(xiàn)制作通訊錄(新手推薦)的詳細(xì)內(nèi)容,更多關(guān)于C語言通訊錄的資料請關(guān)注腳本之家其它相關(guān)文章!

