C語言實(shí)現(xiàn)簡單通訊錄功能
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)簡單通訊錄功能的具體代碼,供大家參考,具體內(nèi)容如下
1.存放聯(lián)系人信息
2.信息:名字+年齡+性別+電話+住址
3.增加聯(lián)系人
4.刪除聯(lián)系人
5.查找聯(lián)系人
6.修改聯(lián)系人
7.排序
test.c源文件代碼如下:
#define _CRT_SECURE_NO_WARNINGS 1
#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");
}
//創(chuàng)建一個枚舉類型,分別對應(yīng)菜單選項(xiàng)
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT,
};
int main()
{
int input = 0;
//創(chuàng)建一個通訊錄
struct Contact con;
//初始化通訊錄
InitContact(&con);
//最多可以放3個聯(lián)系人信息
//空間不夠再增容
do
{
menu();//進(jìn)入循環(huán),先打印菜單
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:
SaveContact(&con);
//銷毀通訊錄
DestroyContact(&con);
printf("退出\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}
contact.c源文件代碼如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//檢測通訊錄容量
void CheckCapacity(struct Contact* pc)
{
//斷言
assert(pc);
if (pc->sz == pc->capacity)//如果有效聯(lián)系人等于最大容納量
{
//增加容量
struct PeoInfo* ptr = realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));
if (ptr != NULL)//如果不為空,表示增容成功
{
pc->data = ptr;
pc->capacity += 2;
printf("增容成功\n");
}
else
{
perror("AddContact::realloc");
return;
}
}
}
//加載有效聯(lián)系人信息
void LoadContact(struct Contact* pc)
{
assert(pc);
struct PeoInfo tmp = { 0 };//臨時空間
FILE* pfRead = fopen("contact.txt", "rb");//打開文件,讀取數(shù)據(jù)
if (NULL == pfRead)
{
perror("open file for reading");
return;
}
//加載數(shù)據(jù)
//每次讀取一個聯(lián)系人信息,直到frea返回值小于1,表示讀取完畢,循環(huán)結(jié)束
while (fread(&tmp, sizeof(struct PeoInfo), 1, pfRead))
{
CheckCapacity(pc);
pc->data[pc->sz] = tmp;
pc->sz++;
}
//關(guān)閉文件
fclose(pfRead);
pfRead = NULL;//置空,防止變成野指針
}
//初始化通訊錄
void InitContact(struct Contact* pc)
{
assert(pc);
pc->sz = 0;
pc->capacity = DEFAULT;
pc->data = (struct PeoInfo*)malloc(DEFAULT * sizeof(struct PeoInfo));//動態(tài)申請空間
if (pc->data == NULL)
{
perror("InitContact::malloc");
return;
}
LoadContact(pc);//加載通訊錄的信息
}
//增加聯(lián)系人
void AddContact(struct Contact* pc)
{
assert(pc);
CheckCapacity(pc);//檢查容量是否為滿,是則進(jìn)行增容
//輸入增加指定聯(lián)系人的信息
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);
printf("添加成功\n");
pc->sz++;//有效聯(lián)系人加1
}
//銷毀通訊錄
void DestroyContact(struct Contact* pc)
{
assert(pc);
free(pc->data);//釋放申請的動態(tài)內(nèi)存空間
pc->data = NULL;//置為空指針
pc->capacity = 0;//容量置0
pc->sz = 0;//有效聯(lián)系人置0
}
//顯示通訊錄信息
void ShowContact(const struct Contact* pc)
{
assert(pc);
int i = 0;
printf("%20s\t%5s\t%10s\t%12s\t%50s\n\n", "name", "age", "sex", "tele", "addr");
for (i = 0; i < pc->sz; i++)
{
//打印每一個數(shù)據(jù)
printf("%20s\t%5d\t%10s\t%12s\t%50s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
//查找指定聯(lián)系人
int FindContactByName(const struct Contact* pc, const char* name)
{
assert(pc && name);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
//找不到
return -1;
}
//刪除指定聯(lián)系人
void DelContact(struct Contact* pc)
{
assert(pc);
if (pc->sz == 0)
{
printf("通訊錄為空,無法刪除\n");
return;
}
char name[NAME_MAX] = { 0 };
printf("請輸入要刪除聯(lián)系人的名字:>");
scanf("%s", name);
//查找到刪除的人
int pos = FindContactByName(pc, name);
if (pos == -1)
printf("指定聯(lián)系人不存在\n");
else
{
//刪除
int i = 0;
for (i = pos; i < pc->sz-1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("成功刪除\n");
}
}
//查找指定聯(lián)系人
void SearchContact(const struct Contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
if (pc->sz == 0)
{
printf("通訊錄為空,無法查找\n");
return;
}
printf("請輸入要查找的聯(lián)系人名字:>");
scanf("%s", name);
int pos = FindContactByName(pc, name);
if (-1 == pos)
printf("查無此人\n");
else
{
printf("%15s\t%5s\t%8s\t%15s\t%30s\n\n", "name", "age", "sex", "tele", "addr");
printf("%15s\t%5d\t%8s\t%15s\t%30s\n",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
}
}
//修改指定聯(lián)系人
void ModifyContact(struct Contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
if (pc->sz == 0)
{
printf("通訊錄為空,無法修改\n");
return;
}
printf("請輸入要修改的聯(lián)系人名字:>");
scanf("%s", name);
int pos = FindContactByName(pc, name);
if (-1 == pos)
printf("要修改的人不存在\n");
else
{
printf("請輸入新的名字:>");
scanf("%s", pc->data[pos].name);
printf("請輸入新的年齡:>");
scanf("%d", &(pc->data[pos].age));
printf("請輸入新的性別:>");
scanf("%s", pc->data[pos].sex);
printf("請輸入新的電話:>");
scanf("%s", pc->data[pos].tele);
printf("請輸入新的地址:>");
scanf("%s", pc->data[pos].addr);
}
}
//按照名字排序->升序
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp((((struct PeoInfo*)e1)->name), (((struct PeoInfo*)e2)->name));
}
//按照年齡排序->升序
int cmp_by_age(const void* e1, const void* e2)
{
return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;
}
//排序通訊錄
void SortContact(struct Contact* pc)
{
assert(pc);
int input = 0;
if (pc->sz == 0)
{
printf("通訊錄為空,無法排序\n");
return;
}
printf("按名字排序請輸入1,年齡排序請輸入2:>");
scanf("%d", &input);
if (1 == input)
{
//名字排序
qsort(pc->data, pc->sz, sizeof(struct PeoInfo), cmp_by_name);
}
else
{
//年齡排序
qsort(pc->data, pc->sz, sizeof(struct PeoInfo), cmp_by_age);
}
}
//保存通訊錄
void SaveContact(struct Contact* pc)
{
assert(pc);
int i = 0;
FILE* pfWrite = fopen("contact.txt", "wb");把當(dāng)前程序的有效聯(lián)系人寫入文件
if (NULL == pfWrite)//判斷是否為空指針
{
perror("open file for writting");
return;
}
//寫數(shù)據(jù)
for (i = 0; i < pc->sz; i++)
{
fwrite(pc->data+i, sizeof(struct PeoInfo), 1, pfWrite);//進(jìn)行寫入
}
fclose(pfWrite);//關(guān)閉文件
pfWrite = NULL;//置為空指針
}
contact.h頭文件代碼如下:
#pragma once
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define DEFAULT 3
#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 50
#define MAX 1000
//描述聯(lián)系人的信息
struct PeoInfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
};
//通訊錄-動態(tài)增長版本
struct Contact
{
struct PeoInfo* data;
int sz;//通訊錄中當(dāng)前有效元素個數(shù)
int capacity;//通訊錄的當(dāng)前最大容量
};
//增容
void CheckCapacity(struct Contact* pc);
//初始化通訊錄
void InitContact(struct Contact* pc);
//銷毀通訊錄
void DestroyContact(struct Contact* pc);
//增加聯(lián)系人
void AddContact(struct Contact* pc);
//顯示通訊錄
void ShowContact(const struct Contact* pc);
//刪除指定聯(lián)系人
void DelContact(struct Contact* pc);
//查找指定聯(lián)系人
void SearchContact(const struct Contact* pc);
//修改指定聯(lián)系人
void ModifyContact(struct Contact* pc);
//排序通訊錄
void SortContact(struct Contact* pc);
//保存通訊錄到文件
void SaveContact(struct Contact* pc);
//加載通訊錄
void LoadContact(struct Contact* pc);
程序運(yùn)行:







重新運(yùn)行程序并顯示
之前添加的聯(lián)系人會存放在指定文件中,再次運(yùn)行程序會加載進(jìn)去,增容成功是因?yàn)槟J(rèn)容納的聯(lián)系人有3位,要加載4位聯(lián)系人,所以自動進(jìn)行增容。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++中的三種繼承public,protected,private詳細(xì)解析
我們已經(jīng)知道,在基類以private方式被繼承時,其public和protected成員在子類中變?yōu)閜rivate成員。然而某些情況下,需要在子類中將一個或多個繼承的成員恢復(fù)其在基類中的訪問權(quán)限2013-09-09
C/C++實(shí)現(xiàn)貪吃蛇逐步運(yùn)動效果
這篇文章主要為大家詳細(xì)介紹了C/C++實(shí)現(xiàn)貪吃蛇逐步運(yùn)動效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05
純C語言:遞歸二進(jìn)制轉(zhuǎn)十進(jìn)制源碼分享
這篇文章主要介紹了純C語言:遞歸二進(jìn)制轉(zhuǎn)十進(jìn)制源碼,有需要的朋友可以參考一下2014-01-01
FFmpeg實(shí)戰(zhàn)之分離出PCM數(shù)據(jù)
PCM(Pulse?Code?Modulation,脈沖編碼調(diào)制)音頻數(shù)據(jù)是未經(jīng)壓縮的音頻采樣數(shù)據(jù)裸流,它是由模擬信號經(jīng)過采樣、量化、編碼轉(zhuǎn)換成的標(biāo)準(zhǔn)數(shù)字音頻數(shù)據(jù)。本文將通過FFmpeg實(shí)現(xiàn)分離PCM數(shù)據(jù),感興趣的可以了解一下2023-02-02

