個人主頁:點我進入主頁
專欄分類:C語言初階? ? ??C語言程序設(shè)計————KTV? ? ? ?C語言小游戲? ? ?C語言進階
C語言刷題
歡迎大家點贊,評論,收藏。
一起努力,一起奔赴大廠。
目錄
1. 前言
2.主函數(shù)
3.增加函數(shù)?
?4.位置查找函數(shù)
5.刪除函數(shù)?
6.查找函數(shù)?
7. 修改函數(shù)
8.排序函數(shù)?
?9.頭文件的展示
1. 前言
? ? ? ? ?在前面我們學(xué)習(xí)了自定義類型,其中包括結(jié)構(gòu)體,位段,枚舉,聯(lián)合體,其中最有意思的是他們的內(nèi)存對齊,想要學(xué)習(xí)的小伙伴們可以點擊https://blog.csdn.net/Infernal_Puppet/article/details/133720624
進行學(xué)習(xí),今天我們就來實現(xiàn)一下通訊錄,后期我們還會講動態(tài)通訊錄,利用文件存儲通訊錄信息。通訊錄包括?通訊錄的增刪查改排序,接下來讓我們感受一下通訊錄的實現(xiàn)把。
2.主函數(shù)
enum nums {
退出,
增加,
查找,
刪除,
修改,
排序
};
void menu()
{
printf("*************************\n");
printf("*** 1.增加 2.查找 ***\n");
printf("*** 3.刪除 4.修改 ***\n");
printf("*** 5.排序 0.退出 ***\n");
printf("*************************\n");
}
void init_adderstbook(Struct *pc)
{
memset(pc->arr, 0, sizeof(pc->arr));
pc->i = 0;
}
void print(Struct* pc)
{
int i;
printf("%-20s%-15s%-3s\n", "姓名", "電話", "年齡");
for (i = 0; i <pc->i; i++)
{
printf("%-20s%-15s%-3d\n", pc->arr [i].name , pc->arr[i].phone , pc->arr[i].age );
}
}
int main()
{
Struct s;
init_adderstbook(&s);
while(1)
{
menu();
int num;
printf("請輸入你想選擇的序號:");
scanf("%d", &num);
int ret;
switch (num)
{
case 增加:
add(&s);
print(&s);
break;
case 查找:
finds(&s);
break;
case 刪除:
del(&s);
print(&s);
break;
case 修改:
mod(&s);
print(&s);
break;
case 排序:
qsort(s.arr, s.i, sizeof(s.arr[0]), mysort);
print(&s);
break;
case 退出:
return 0;
}
}
return 0;
}
????????這里面包括菜單函數(shù),打印函數(shù),結(jié)構(gòu)體的初始化,還有一個枚舉的定義,枚舉主要用于switch case語句,由于我們要寫的函數(shù)較多,容易忘記函數(shù)是什么,順序是什么,我們就可以利用枚舉進行定義。
3.增加函數(shù)?
void add(Struct *pc)
{
assert(pc);
if (pc->i + 1 == Max_Size)
{
printf("通訊錄滿了\n");
return;
}
printf("請輸入聯(lián)系人的姓名:");
scanf("%s", pc->arr[pc->i].name);
printf("請輸入聯(lián)系人的電話;");
scanf("%s", pc->arr[pc->i].phone);
printf("請輸入聯(lián)系人的年齡:");
scanf("%d", &pc->arr[pc->i].age);
pc->i++;
}
? ? ? ? 由于我們要傳結(jié)構(gòu)體,分為傳值和傳址,我們利用傳址進行函數(shù)的傳參,主要原因是這樣更高效,由于是指針,我們用assert判斷是不是空指針,再判斷通訊錄是不是滿了,然后進行數(shù)據(jù)的輸入。
?4.位置查找函數(shù)
int find(Struct *pc,char name[])
{
assert(pc);
int i = 0;
for (i = 0; i <= pc->i; i++)
{
if (strcmp(name, pc->arr[i].name) == 0)
{
return i;
}
}
return -1;
}
? ? ? ? 在這里我們創(chuàng)建了一個位置查找函數(shù),這個函數(shù)主要是用于查找到name的位置,如果沒有找到返回-1,找到返回所在的位置,這個函數(shù)主要用于刪除函數(shù)和查找函數(shù)以及修改函數(shù)。
5.刪除函數(shù)?
void del(Struct* pc)
{
assert(pc);
char name[50];
printf("請輸入你想刪除人的名字\n");
scanf("%s", name);
int ret = find(pc, name);
int i;
if (ret != -1)
{
for (i = ret; i < pc->i; i++)
{
pc->arr[i] = pc->arr[i + 1];
}
pc->i--;
}
}
? ? ? ? ?同樣我們先判斷是不是指針是不是空指針,然后進行想要查找的名字,利用find函數(shù)找到這個名字的位置,如果不是-1進行刪除操作,也就是從這個位置開始,進行覆蓋操作(前一個等于后一個直到結(jié)束),通訊錄的人數(shù)減少一個,
6.查找函數(shù)?
void finds(Struct* pc)
{
assert(pc);
char name[50];
scanf("%s", name);
int ret = find(pc, name);
if (ret != -1)
{
printf("%-20s%-15s%-3s\n", "姓名", "電話", "年齡");
printf("%-20s%-15s%-3d\n", pc->arr[ret].name, pc->arr[ret].phone, pc->arr[ret].age);
}
else
printf("沒找到\n");
}
? ? ? ? 先進行指針是不是空的判斷,輸入要查找的人的名字,利用find函數(shù)進行查找,如果有進行打印,沒有則打印沒有找到。
7. 修改函數(shù)
void mod(Struct* pc)
{
assert(pc);
char name[50];
printf("請輸入你想修改的名字:");
scanf("%s", name);
int ret = find(pc, name);
if (ret != -1)
{
printf("請輸入你修改后的信息\n");
printf("請輸入聯(lián)系人的姓名:");
scanf("%s", pc->arr[ret].name);
printf("請輸入聯(lián)系人的電話;");
scanf("%s", pc->arr[ret].phone);
printf("請輸入聯(lián)系人的年齡:");
scanf("%d", &pc->arr[ret].age);
}
else
printf("沒有此人\n");
}
? ? ? ? 先進行指針是不是空的判斷,輸入想要修改的人的名字,利用find函數(shù)進行查找,找到后對其進行修改,沒有找到則返回沒找到。
8.排序函數(shù)?
? ? ? ? 在這個函數(shù)中我們用到了qsort函數(shù),qsort函數(shù)的參數(shù)是要排序的數(shù)組,排序幾個元素,每個元素占幾個字節(jié),排序方式函數(shù),想要學(xué)習(xí)的可點擊qsort函數(shù)詳細講解以及利用冒泡排序模擬實現(xiàn)qsort函數(shù)-CSDN博客,進行查看。
?9.頭文件的展示
? ? ? ? 由于我們是分文件寫的,分為主函數(shù)文件,函數(shù)文件,函數(shù)聲明文件,其中函數(shù)文件和主函數(shù)文件是.c文件,函數(shù)聲明文件是.h文件,具體代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-723487.html
#pragma once
#define Max_Size 50
#include <stdio.h>
#include <assert.h>
#include <string.h>
struct xinxi {
char name[50];
char phone[13];
int age;
};
typedef struct adderstbook {
struct xinxi arr[Max_Size];
int i;
}Struct;
void add (Struct *pc);
int find(Struct* pc,char name[]);
void del(Struct* pc);
void finds(Struct* pc);
void mod(Struct* pc);
int mysort(const void* e1, const void* e2);
????????今天的內(nèi)容就結(jié)束了,歡迎大家來三連;文章來源地址http://www.zghlxwxcb.cn/news/detail-723487.html
到了這里,關(guān)于C/C++之分文件寫靜態(tài)通訊錄詳解(保姆級教學(xué))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!