概述
文章目录
- 前言
- 一、内容梳理
- 二、主体实现(静态版)
- 1、基本功能和定义
- 2、具体功能实现
- 3、主函数设计
- 三、主体实现(动态版)
- 1、基本功能定义
- 2、具体功能实现
- 3、主函数设计
- 总结
前言
- 本文将介绍通讯录的两种实现方式静态版和动态版,后期会加入文件操作版!!!
一、内容梳理
- 此通讯录涉及到的知识为宏定义、结构体、枚举、分支选择、内调函数、动态内存开辟、string部分相关函数使用、assert断言、函数封装、初阶指针等等。
二、主体实现(静态版)
1、基本功能和定义
#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_AGE 5
#define MAX_SEX 5
#define MAX_TEL 12
#define MAX_ADD 20
typedef struct PeoInfo
{
char name[MAX_NAME];
char age[MAX_AGE];
char sex[MAX_SEX];
char tel[MAX_TEL];
char add[MAX_ADD];
} PeoInfo;
typedef struct Contact
{
PeoInfo Data[MAX];
int size;
}Contact;
void Add_Contact(Contact* p);
void Del_Contact(Contact* p);
void Search_Contact(Contact* p);
void Alter_Contact(Contact* p);
void Sort_Contact(Contact* p);
void Show_Contact(Contact* p);
int com_string(const char* e1, const char* e2);
int Find_contact(Contact* p);
2、具体功能实现
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
int Find_contact(Contact* p)
{
char name[MAX_NAME] = { 0 };
printf("请输入联系人的名字:");
scanf("%s", &name);
for (int i = 0; i < p->size; i++)
{
if (strcmp(p->Data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void Add_Contact(Contact* p)
{
assert(p);
if (p->size == MAX)
{
printf("通讯录已满!n");
return;
}
printf("请输入姓名:");
scanf("%s", p->Data[p->size].name);
printf("请输入年龄:");
scanf("%s", p->Data[p->size].age);
printf("请输入性别:");
scanf("%s", p->Data[p->size].sex);
printf("请输入电话:");
scanf("%s", p->Data[p->size].tel);
printf("请输入地址:");
scanf("%s", p->Data[p->size].add);
p->size++;
printf("添加成功!n");
}
void Del_Contact(Contact* p)
{
if (p->size == 0)
{
printf("空通讯录!n");
return;
}
int ret = Find_contact(p);
if (ret != -1)
{
for (int j = ret; j < p->size - 1; j++)
{
memmove(&p->Data[j], &p->Data[j + 1],sizeof(p->Data[j]));
//p->Data[j] = p->Data[j + 1];
}
p->size--;
printf("删除成功!n");
}
else
{
printf("无此联系人!n");
}
}
void Search_Contact(Contact* p)
{
if (p->size == 0)
{
printf("空通讯录!n");
return;
}
int ret = Find_contact(p);
if (ret != -1)
{
printf("%-20s%-5st%-5st%-15st%-20sn", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s%-5st%-5st%-15st%-20sn", p->Data[ret].name, p->Data[ret].age, p->Data[ret].sex, p->Data[ret].tel, p->Data[ret].add);
}
else
{
printf("无此联系人!n");
}
}
void Alter_Contact(Contact* p)
{
if (p->size == 0)
{
printf("空通讯录!n");
return;
}
int ret = Find_contact(p);
if (ret != -1)
{
printf("%-20s%-5st%-5st%-15st%-20sn", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s%-5st%-5st%-15st%-20sn", p->Data[ret].name, p->Data[ret].age, p->Data[ret].sex, p->Data[ret].tel, p->Data[ret].add);
printf("请输入姓名:");
scanf("%s", p->Data[ret].name);
printf("请输入年龄:");
scanf("%s", p->Data[ret].age);
printf("请输入性别:");
scanf("%s", p->Data[ret].sex);
printf("请输入电话:");
scanf("%s", p->Data[ret].tel);
printf("请输入地址:");
scanf("%s", p->Data[ret].add);
printf("%-20s%-5st%-5st%-15st%-20sn", p->Data[ret].name, p->Data[ret].age, p->Data[ret].sex, p->Data[ret].tel, p->Data[ret].add);
printf("修改成功!n");
}
else
{
printf("无此联系人!n");
}
}
int Cmp_string(const char* e1,const char* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sort_Contact(Contact* p)
{
qsort(p->Data, p->size, sizeof(p->Data[0]), Cmp_string);
printf("排序完成!n");
}
void Show_Contact(Contact* p)
{
if (p->size == 0)
{
printf("通讯录为空!n");
return;
}
printf("%-20s%-5st%-5st%-15st%-20sn","姓名","年龄","性别","电话","地址");
for (int i = 0; i < p->size; i++)
{
printf("%-20s%-5st%-5st%-15st%-20sn", p->Data[i].name, p->Data[i].age, p->Data[i].sex, p->Data[i].tel, p->Data[i].add);
}
}
3、主函数设计
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
void Clear_Screen()
{
system("cls");
}
void menu()
{
printf("************************************n");
printf("**** 1、Add 2、Del ****n");
printf("**** 3、Search 4、Alter ****n");
printf("**** 5、Sort 6、Show ****n");
printf("**** 7、Exit ****n");
printf("************************************n");
}
enum function
{
Exit,
Add,
Del,
Search,
Alter,
Sort,
Show
};
void Init_Contact(Contact* p)
{
p->size = 0;
memset(p->Data, 0, sizeof(p->Data));
}
int main()
{
int choice = 0;
Contact EX;
Init_Contact(&EX);
do
{
menu();
printf("请选择>");
scanf("%d", &choice);
switch (choice)
{
case Add:
Clear_Screen();
Add_Contact(&EX);
break;
case Del:
Clear_Screen();
Del_Contact(&EX);
break;
case Search:
Clear_Screen();
Search_Contact(&EX);
break;
case Sort:
Clear_Screen();
Sort_Contact(&EX);
break;
case Alter:
Clear_Screen();
Alter_Contact(&EX);
break;
case Show:
Clear_Screen();
Show_Contact(&EX);
break;
case Exit:
printf("退出程序n");
break;
default:
printf("输入有误,请重新输入!n");
}
} while (choice);
return 0;
}
三、主体实现(动态版)
1、基本功能定义
#pragma once
#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <errno.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_AGE 5
#define MAX_SEX 5
#define MAX_TEL 12
#define MAX_ADD 20
#define TEMP_SIZE 3
typedef struct PeoInfo
{
char name[MAX_NAME];
char age[MAX_AGE];
char sex[MAX_SEX];
char tel[MAX_TEL];
char add[MAX_ADD];
} PeoInfo;
typedef struct Contact
{
PeoInfo* Data;
int capacity;
int size;
}Contact;
void Init_Contact(Contact* p);
void Destroy_Contact(Contact* p);
void Check_Capacity(Contact* p);
void Add_Contact(Contact* p);
void Del_Contact(Contact* p);
void Search_Contact(Contact* p);
void Alter_Contact(Contact* p);
void Sort_Contact(Contact* p);
void Show_Contact(Contact* p);
int com_string(const char* e1, const char* e2);
int Find_contact(Contact* p);
2、具体功能实现
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
void Init_Contact(Contact* p)
{
assert(p);
p->size = 0;
p->capacity = TEMP_SIZE;
p->Data = (PeoInfo*)malloc(p->capacity * sizeof(PeoInfo));
if (p->Data == NULL)
{
perror("Init_Contact::malloc");
return;
}
memset(p->Data, 0, p->capacity * sizeof(PeoInfo));
}
void Destroy_Contact(Contact* p)
{
free(p->Data);
p->Data = NULL;
p->capacity = 0;
p->size = 0;
printf("销毁成功n");
}
void Check_Capacity(Contact* p)
{
if (p->size == p->capacity)
{
PeoInfo* tmp = (PeoInfo*)realloc(p->Data, (p->capacity + 2) * sizeof(PeoInfo));
if (tmp != NULL)
{
p->Data = tmp;
}
else
{
perror("Check_Capacity::realloc");
return;
}
p->capacity += 2;
printf("增容成功n");
}
}
int Find_contact(Contact* p)
{
char name[MAX_NAME] = { 0 };
printf("请输入联系人的名字:");
scanf("%s", &name);
for (int i = 0; i < p->size; i++)
{
if (strcmp(p->Data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void Add_Contact(Contact* p)
{
assert(p);
Check_Capacity(p);
printf("请输入姓名:");
scanf("%s", p->Data[p->size].name);
printf("请输入年龄:");
scanf("%s", p->Data[p->size].age);
printf("请输入性别:");
scanf("%s", p->Data[p->size].sex);
printf("请输入电话:");
scanf("%s", p->Data[p->size].tel);
printf("请输入地址:");
scanf("%s", p->Data[p->size].add);
p->size++;
printf("添加成功!n");
}
void Del_Contact(Contact* p)
{
if (p->size == 0)
{
printf("空通讯录!n");
return;
}
int ret = Find_contact(p);
if (ret != -1)
{
for (int j = ret; j < p->size - 1; j++)
{
memmove(&p->Data[j], &p->Data[j + 1], sizeof(p->Data[j]));
//p->Data[j] = p->Data[j + 1];
}
p->size--;
printf("删除成功!n");
}
else
{
printf("无此联系人!n");
}
}
void Search_Contact(Contact* p)
{
if (p->size == 0)
{
printf("空通讯录!n");
return;
}
int ret = Find_contact(p);
if (ret != -1)
{
printf("%-20s%-5st%-5st%-15st%-20sn", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s%-5st%-5st%-15st%-20sn", p->Data[ret].name, p->Data[ret].age, p->Data[ret].sex, p->Data[ret].tel, p->Data[ret].add);
}
else
{
printf("无此联系人!n");
}
}
void Alter_Contact(Contact* p)
{
if (p->size == 0)
{
printf("空通讯录!n");
return;
}
int ret = Find_contact(p);
if (ret != -1)
{
printf("%-20s%-5st%-5st%-15st%-20sn", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s%-5st%-5st%-15st%-20sn", p->Data[ret].name, p->Data[ret].age, p->Data[ret].sex, p->Data[ret].tel, p->Data[ret].add);
printf("请输入姓名:");
scanf("%s", p->Data[ret].name);
printf("请输入年龄:");
scanf("%s", p->Data[ret].age);
printf("请输入性别:");
scanf("%s", p->Data[ret].sex);
printf("请输入电话:");
scanf("%s", p->Data[ret].tel);
printf("请输入地址:");
scanf("%s", p->Data[ret].add);
printf("%-20s%-5st%-5st%-15st%-20sn", p->Data[ret].name, p->Data[ret].age, p->Data[ret].sex, p->Data[ret].tel, p->Data[ret].add);
printf("修改成功!n");
}
else
{
printf("无此联系人!n");
}
}
int Cmp_string(const char* e1, const char* e2)
{
return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sort_Contact(Contact* p)
{
qsort(p->Data, p->size, sizeof(p->Data[0]), Cmp_string);
printf("排序完成!n");
}
void Show_Contact(Contact* p)
{
if (p->size == 0)
{
printf("通讯录为空!n");
return;
}
printf("%-20s%-5st%-5st%-15st%-20sn", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0; i < p->size; i++)
{
printf("%-20s%-5st%-5st%-15st%-20sn", p->Data[i].name, p->Data[i].age, p->Data[i].sex, p->Data[i].tel, p->Data[i].add);
}
}
3、主函数设计
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
void Clear_Screen()
{
system("cls");
}
void menu()
{
printf("************************************n");
printf("**** 1、Add 2、Del ****n");
printf("**** 3、Search 4、Alter ****n");
printf("**** 5、Sort 6、Show ****n");
printf("**** 7、Exit ****n");
printf("************************************n");
}
enum function
{
Exit,
Add,
Del,
Search,
Alter,
Sort,
Show
};
int main()
{
int choice = 0;
Contact EX;
Init_Contact(&EX);
do
{
menu();
printf("请选择>");
scanf("%d", &choice);
switch (choice)
{
case Add:
Clear_Screen();
Add_Contact(&EX);
break;
case Del:
Clear_Screen();
Del_Contact(&EX);
break;
case Search:
Clear_Screen();
Search_Contact(&EX);
break;
case Sort:
Clear_Screen();
Sort_Contact(&EX);
break;
case Alter:
Clear_Screen();
Alter_Contact(&EX);
break;
case Show:
Clear_Screen();
Show_Contact(&EX);
break;
case Exit:
Destroy_Contact(&EX);
printf("已销毁!n");
printf("退出程序n");
break;
default:
printf("输入有误,请重新输入!n");
}
} while (choice);
return 0;
}
总结
-
对此通讯录系统动态版和静态版的比较我们可以发现仅仅多出来了动态内存开辟部分,其他完全一样。这部分涉及到了mallo函数、realloc函数(这两个函数在后期我会详细介绍),在实现过程中基本函数都是很常见的,具体在于细节的实现,如何让输出有美感,在show函数中为了不让打印出现错位一定要写固定长度字符打印。
-
注:作者水平有限,若有错误,敬请指正!!!
最后
以上就是寂寞睫毛膏为你收集整理的通讯录的实现前言一、内容梳理二、主体实现(静态版)三、主体实现(动态版)总结的全部内容,希望文章能够帮你解决通讯录的实现前言一、内容梳理二、主体实现(静态版)三、主体实现(动态版)总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复