【C语言】一篇搞定自定义类型:结构体、枚举、联合体(共用体)附上简易通讯录项目源码(三)

简介: 【C语言】一篇搞定自定义类型:结构体、枚举、联合体(共用体)附上简易通讯录项目源码(三)

4. 利用自定义类型实现简易通讯录程序

通讯录.c


#include "contact.h"

void menu()

{

printf("******************************\n");

printf("****  1. 添加      2. 删除  **\n");

printf("****  3. 搜索      4. 修改  **\n");

printf("****  5. 展示全部  6. 排序  **\n");

printf("****  0. 退出               **\n");

printf("******************************\n");

}

int main()

{

int input = 0;

//创建一个通讯录

struct Contact con;

//初始化通讯录

InitContact(&con);

do

{

 menu();

 printf("请选择:>");

 scanf_s("%d", &input);

 switch (input)

 {

 case ADD:

  AddContact(&con);

  break;

 case DEL:

  DeletContact(&con);

  break;

 case SHOW:

  ShowContact(&con);

  break;

 case MODIFY:

  ModifyContact(&con);

  break;

 case SEARCH:

  SearchContact(&con);

     break;

 case SORT:

  SortContact(&con);

  break;

 case EXIT:

  printf("退出通讯录\n");

  break;

 default:

  printf("选择错误\n");

  break;

 }

} while (input);

return 0;

}

contact.c

#include "contact.h"

void InitContact(struct Contact* pc)

{

pc->sz = 0;//默认没有信息

//memset(pc->data, 0, MAX*sizeof(struct PeoInfo));

memset(pc->data, 0, sizeof(pc->data));

}

void AddContact(struct Contact* pc)

{

if (pc->sz == MAX)

{

 printf("通讯录满了\n");

}

else

{

 printf("请输入名字:>");

 scanf_s("%s", pc->data[pc->sz].name,30);

 printf("请输入年龄:>");

 scanf_s("%d", &(pc->data[pc->sz].age));

 printf("请输入性别:>");

 scanf_s("%s", pc->data[pc->sz].sex,5);

 printf("请输入电话:>");

 scanf_s("%s", pc->data[pc->sz].tele,12);

 printf("请输入地址:>");

 scanf_s("%s", pc->data[pc->sz].addr,30);

 

 printf("添加成功\n");

 pc->sz++;

 ShowContact(pc);

}

}

void DeletContact(struct Contact* pc)

{

printf("请输入需要删除的联系人姓名\n");

char name[30]="0";

scanf_s("%s", name, 30);

for (int i = 0; i < pc->sz; i++)

{

 if (strcmp(name, pc->data[i].name) == 0)

 {

  for (int j = i; j < pc->sz; j++)

  {

   strcpy_s(pc->data[j].name, 30, pc->data[j + 1].name);

   strcpy_s(pc->data[j].sex, 5, pc->data[j + 1].sex);

   strcpy_s(pc->data[j].tele, 12, pc->data[j + 1].tele);

   strcpy_s(pc->data[j].addr, 30, pc->data[j + 1].addr);

   pc->data[j].age = pc->data[j + 1].age;

  }

  printf("删除成功\n");

  (pc->sz)--;

  ShowContact(pc);

 }

}

}

void ModifyContact(struct Contact* pc)

{

printf("请输入需要修改的联系人姓名\n");

char name[30]="0";

scanf_s("%s", name, 30);

for (int i = 0; i < pc->sz; i++)

{

 if (strcmp(name, pc->data[i].name) == 0)

 {

  printf("请输入名字:>");

  scanf_s("%s", pc->data[i].name, 30);

  printf("请输入年龄:>");

  scanf_s("%d", &(pc->data[i].age));

  printf("请输入性别:>");

  scanf_s("%s", pc->data[i].sex, 5);

  printf("请输入电话:>");

  scanf_s("%s", pc->data[i].tele, 12);

  printf("请输入地址:>");

  scanf_s("%s", pc->data[i].addr, 30);

  printf("修改成功!\n");

  ShowContact(pc);

 }

}

}


void ShowContact(struct Contact* pc)

{

int i = 0;

printf("序号\t%10s\t%10s\t%8s\t%15s\t%30s\n", "name", "age", "sex", "tele", "addr");

for (i = 0; i < pc->sz; i++)

{

 //打印每一个数据

 printf("%d\t%10s\t%10d\t%8s\t%15s\t%30s\n",

  i+1,

  pc->data[i].name,

  pc->data[i].age,

  pc->data[i].sex,

  pc->data[i].tele,

  pc->data[i].addr);

}

}

void SearchContact(struct Contact* pc)

{

printf("请输入需要搜索的联系人姓名\n");

char name[30]="0";

scanf_s("%s",name,30);

for (int i = 0; i < pc->sz; i++)

{

 if (strcmp(name , pc->data[i].name) == 0)

 {

  printf("序号\t%10s\t%10s\t%8s\t%15s\t%30s\n", "name", "age", "sex", "tele", "addr");

  printf("%d\t%10s\t%10d\t%8s\t%15s\t%30s\n",

   i + 1,

   pc->data[i].name,

   pc->data[i].age,

   pc->data[i].sex,

   pc->data[i].tele,

   pc->data[i].addr);

  return;

 }

}

printf("找不到联系人信息\n");

}

void SortContact(struct Contact* pc)

{

struct PeoInfo temp;

for(int j = 0;j < pc->sz-1;j++)

for (int i = 0; i < pc->sz-1-j; i++)

{

 if (strcmp(pc->data[i].name, pc->data[i + 1].name) > 0)

 {

  temp = pc->data[i + 1];

  pc->data[i + 1] = pc->data[i];

  pc->data[i] = temp;

 }

}

ShowContact(pc);

}


contact.h


#pragma once

#define NAME_MAX 30

#define SEX_MAX 5

#define TELE_MAX 12

#define ADDR_MAX 30

#define MAX 1000

#include <string.h>

#include <stdio.h>

#include <string.h>

//创建枚举变量

enum Option

{

EXIT,

ADD,

DEL,

SEARCH,

MODIFY,

SHOW,

SORT

};

//描述人的信息

struct PeoInfo

{

char name[NAME_MAX];

int age;

char sex[SEX_MAX];

char tele[TELE_MAX];

char addr[ADDR_MAX];

};

//通讯录

struct Contact

{

struct PeoInfo data[MAX];//1000个人的数据存放在data数组中

int sz;//记录当前通讯录有效信息的个数

};

//初始化通讯录

void InitContact(struct Contact* pc);

//增加联系人

void AddContact(struct Contact* pc);

//删除联系人

void DeletContact(struct Contact* pc);

//修改联系人信息

void ModifyContact(struct Contact* pc);

//搜索联系人信息

void SearchContact(struct Contact* pc);

//显示所有的联系人

void ShowContact(struct Contact* pc);

//按姓氏排序联系人信息

void SortContact(struct Contact* pc);




版权声明:本文为CSDN博主「敲代码的布莱恩特」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/DerrickWestbrook/article/details/120380553

相关文章
|
13天前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
23 10
|
13天前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
17天前
|
编译器 C语言
共用体和结构体在 C 语言中的优先级是怎样的
在C语言中,共用体(union)和结构体(struct)的优先级相同,它们都是用户自定义的数据类型,用于组合不同类型的数据。但是,共用体中的所有成员共享同一段内存,而结构体中的成员各自占用独立的内存空间。
|
26天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
31 3
|
C语言
《C语言及程序设计》实践项目——枚举应用
返回:贺老师课程教学链接 【项目1-对称点】 设计函数,可以按指定的方式,输出一个平面点的对称点 下面给出枚举类型定义和main函数(测试函数),请写出output函数的实现。 #include&lt;stdio.h&gt; enum SymmetricStyle {axisx, axisy, point};//分别表示按x轴, y轴, 原点对称三种方式 void
1091 0
|
17天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
31 10
|
10天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
16天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
41 7
|
16天前
|
存储 编译器 程序员
【c语言】函数
本文介绍了C语言中函数的基本概念,包括库函数和自定义函数的定义、使用及示例。库函数如`printf`和`scanf`,通过包含相应的头文件即可使用。自定义函数需指定返回类型、函数名、形式参数等。文中还探讨了函数的调用、形参与实参的区别、return语句的用法、函数嵌套调用、链式访问以及static关键字对变量和函数的影响,强调了static如何改变变量的生命周期和作用域,以及函数的可见性。
25 4
|
21天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。