动态+静态+文件操作 C语言实现通讯录

简介: 通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

一.通讯录简介


实现一个通讯录

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

二.分模块实现


1.添加联系人信息

(1)静态版本

//添加联系人
void Addcontact(Contact* pc)
{
  assert(pc);
  if (pc->sz == Max)
  {
    printf("通讯录已满,无法添加\n");
    return;
  }
  printf("请输入名字:>");
  scanf("%s", pc->data[pc->sz].name);
  printf("请输入性别:>");
  scanf("%s", pc->data[pc->sz].sex);
  printf("请输入年龄:>");
  scanf("%d", &pc->data[pc->sz].age);
  printf("请输入号码:>");
  scanf("%s", pc->data[pc->sz].tele);
  printf("请输入住址:>");
  scanf("%s", pc->data[pc->sz].addr);
  pc->sz++;
  printf("添加成功\n");
}

(2)动态版本

void Addcontact(Contact* pc)
{
  // 动态版本
  assert(pc);
  if (pc->sz == pc->Capacity)
  {
    PeoInfo* tmp = realloc(pc->data, (pc->Capacity + 2) * sizeof(PeoInfo));
    if (tmp != NULL)
    {
      pc->data = tmp;
    }
    else
    {
      perror("realloc:pc->data");
      return;
    }
    pc->Capacity += 2;
    printf("增容成功\n");
  printf("请输入名字:>");
  scanf("%s", pc->data[pc->sz].name);
  printf("请输入性别:>");
  scanf("%s", pc->data[pc->sz].sex);
  printf("请输入年龄:>");
  scanf("%d", &pc->data[pc->sz].age);
  printf("请输入号码:>");
  scanf("%s", pc->data[pc->sz].tele);
  printf("请输入住址:>");
  scanf("%s", pc->data[pc->sz].addr);
  pc->sz++;
  printf("添加成功\n");
    }
}

(3)文件操作版本

//加载文件到通讯录中
void Loadcontact(Contact* pc)
{
  FILE* pf = fopen("contact.dat", "rb");
  if (pf == NULL)
  {
    perror("Loadcontact::fopen");
    return;
  }
  PeoInfo tmp = { 0 };
  while (fread(&tmp, sizeof(PeoInfo), 1, pf))
  {
    Checkcontact(pc); //增容
    pc->data[pc->sz] = tmp;
    pc->sz++;
  }
  fclose(pf);
  pf = NULL;
}
//文件保存版本 初始化通讯录
void InitContact(Contact* pc)
{
  assert(pc);
  PeoInfo* tmp = (PeoInfo*)malloc(Default_Max * sizeof(PeoInfo));
  if (tmp != NULL)
  {
    pc->data = tmp;
  }
  else
  {
    perror("PeoInfo*)malloc:");
    return;
  }
  memset(pc->data, 0, Default_Max * sizeof(PeoInfo));
  pc->sz = 0;
  pc->Capacity = Default_Max;
 
  //加载文件信息到通讯录
  Loadcontact(pc);
}
 
void Addcontact(Contact* pc)
{
 
  Checkcontact(pc);
  printf("请输入名字:>");
  scanf("%s", pc->data[pc->sz].name);
  printf("请输入性别:>");
  scanf("%s", pc->data[pc->sz].sex);
  printf("请输入年龄:>");
  scanf("%d", &pc->data[pc->sz].age);
  printf("请输入号码:>");
  scanf("%s", pc->data[pc->sz].tele);
  printf("请输入住址:>");
  scanf("%s", pc->data[pc->sz].addr);
  pc->sz++;
  printf("添加成功\n");
}

2.删除指定联系人信息

//删除联系人
void Deletecontact(Contact* pc)
{
  assert(pc);
  char name[Name_Max];
  if (pc->sz == 0)
  {
    printf("通讯录已空,无法删除\n");
  }
  printf("请输入要删除联系人的名字:>");
  scanf("%s", name);
  int pos = FindByname(pc, name);
  if (pos == -1)
  {
    printf("未找到指定联系人\n");
    return;
  }
  else
  {
    int i = pos;
    for (i = pos; i < pc->sz - 1; i++)
    {
      pc->data[i] = pc->data[i + 1];
    }
    pc->sz--;
    printf("删除成功\n");
  }
}

3.查找指定联系人信息

//查找联系人
void Searchcontact(Contact* pc)
{
  assert(pc);
  char name[Name_Max];
  printf("请输入要查找的联系人名字:>");
  scanf("%s", name);
  int pos = FindByname(pc, name);
  if (pos == -1)
  {
    printf("未找到指定联系人\n");
    return;
  }
  printf("%-20s %-5s %-5s %-12s  %-30s\n", "姓名", "性别", "年龄", "号码", "住址");
  printf("%-20s %-5s %-5d %-12s  %-30s\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);
}

4.修改指定联系人信息

//修改菜单
void menu1()
{
  printf("***********************\n");
  printf("****1.姓名  2.性别 ****\n");
  printf("****3.年龄  4.号码 ****\n");
  printf("****5.住址  0.返回 ****\n");
  printf("***********************\n");
}
 
//修改联系人
void Modifycontact(Contact* pc)
{
  assert(pc);
  char name[Name_Max];
  int input = 0;
  printf("请输入修改联系人的名字:>");
  scanf("%s", name);
  int pos = FindByname(pc, name);
  if (pos == -1)
  {
    printf("未找到指定联系人\n");
    return;
  }
  printf("%-20s %-5s %-5s %-12s  %-30s\n", "姓名", "性别", "年龄", "号码", "住址");
  printf("%-20s %-5s %-5d %-12s  %-30s\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);
  do
  {
    menu1();
    printf("请选择要修改的内容:>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      printf("请输入名字:>");
      scanf("%s", pc->data[pos].name);
      printf("修改成功\n");
      break;
    case 2:
      printf("请输入性别:>");
      scanf("%s", pc->data[pos].sex);
      printf("修改成功\n");
      break;
    case 3:
      printf("请输入年龄:>");
      scanf("%d", &pc->data[pos].age);
      printf("修改成功\n");
      break;
    case 4:
      printf("请输入号码:>");
      scanf("%s", pc->data[pos].tele);
      printf("修改成功\n");
      break;
    case 5:
      printf("请输入住址:>");
      scanf("%s", pc->data[pos].addr);
      printf("修改成功\n");
      break;
    case 0:
      printf("退出修改\n");
      break;
    default:
      printf("选择错误\n");
      break;
    }
  } while (input);
}

5.显示所有联系人信息

//打印通讯录
void Printcontact(Contact* pc)
{
  assert(pc);
  if (pc->sz == 0)
  {
    printf("通讯录为空\n");
    return;
  }
  int i = 0;
  printf("%-20s %-5s %-5s %-12s  %-30s\n", "姓名", "性别", "年龄", "号码", "住址");
  for (i = 0; i < pc->sz; i++)
  {
    printf("%-20s %-5s %-5d %-12s  %-30s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
  }
}

6.清空所有联系人

(1)静态版本


//通讯录初始化
void InitContact(Contact* pc)
{
  assert(pc);
  memset(pc->data, 0, sizeof(pc->data));
  pc->sz = 0;
}
 
//清空联系人
void Emptycontact(Contact* pc, void(*p)(Contact*))
{
  InitContact(pc);
  printf("清空成功\n");
}
 

(2)动态版本

void InitContact(Contact* pc)
{
  assert(pc);
  PeoInfo* tmp = (PeoInfo*)malloc(Default_Max * sizeof(PeoInfo));
  if (tmp != NULL)
  {
    pc->data = tmp;
  }
  else
  {
    perror("PeoInfo*)malloc:");
    return;
  }
  memset(pc->data, 0, Default_Max * sizeof(PeoInfo));
  pc->sz = 0;
  pc->Capacity = Default_Max;
}
//清空联系人
void Emptycontact(Contact* pc, void(*p)(Contact*))
{
  InitContact(pc);
  printf("清空成功\n");
}

7.以名字排序所有联系人

//排序联系人
 
int cmp_name(const void* e1, const void* e2)
{
  return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sortcontact(Contact* pc)
{
  int sz = pc->sz;
  qsort(pc->data, sz, sizeof(pc->data[0]), cmp_name);
  printf("排序成功\n");
}

8.销毁通讯录(释放)

(1)非文件操作版本

void Freecontact(Contact* pc)
{
  free(pc->data);
  pc->Capacity = 0;
  pc->sz = 0;
  printf("销毁成功\n");
}

(2)文件操作版本

//保存文件
void Savecontact(Contact* pc)
{
  //打开文件
  FILE* pf = fopen("contact.dat", "wb");
  if (pf == NULL)
  {
    perror("Savecontact::contact.dat");
    return;
  }
  //写入文件
  int i = 0;
  for (i = 0; i < pc->sz; i++)
  {
    fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
  }
  //关闭文件
  fclose(pf);
  pf = NULL;
}
 
void Freecontact(Contact* pc)
{
  free(pc->data);
  pc->Capacity = 0;
  pc->sz = 0;
  printf("销毁成功\n");
}

三.菜单界面


#define _CRT_SECURE_NO_WARNINGS  1
#include"contact.h"
 
void menu()
{
  printf("*****************************\n");
  printf("****  1.add     2.delete ****\n");
  printf("****  3.search  4.modify ****\n");
  printf("****  5.print   6.empty  ****\n");
  printf("****  7.sort    0.exit   ****\n");
  printf("*****************************\n");
}
void test()
{
  Contact Con;//通讯录
  InitContact(&Con); //初始化通讯录
  int input = 0;
  do 
  {
    input = 0;
    menu();
    printf("请选择>:");
    scanf("%d", &input);
    switch (input)
    {
    case add:
      Addcontact(&Con);
      break;
    case delete:
      Deletecontact(&Con);
      break;
    case search:
      Searchcontact(&Con);
      break;
    case modify:
      Modifycontact(&Con);
      break;
    case print:
      Printcontact(&Con);
      break;
    case empty:
      Emptycontact(&Con, InitContact);
      break;
    case sort:
      Sortcontact(&Con);
      break;
    case 0:
      Savecontact(&Con);
      Freecontact(&Con);
      printf("退出通讯录\n");
      break;
    default:
      printf("选择错误\n");
      break;
    }
  } while (input);
}
int main()
{
  test();
  return 0;
}

四.头文件声明


#define _CRT_SECURE_NO_WARNINGS  1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
//常量定义
enum Option
{
  //exit,
  add=1,
  delete,
  search,
  modify,
  print,
  empty,
  sort
};
 
#define Max 1000
#define Name_Max 20
#define Sex_Max 5
#define Tele_Max 12
#define Addr_Max 30
#define Default_Max 3
 
//类型声明
 
//联系人结构体
typedef struct PeoInfo
{
  char name[Name_Max];
  char sex[Sex_Max];
  int age;
  char tele[Tele_Max];
  char addr[Addr_Max];
}PeoInfo;
 
//动态版本
typedef struct Contact
{
  PeoInfo* data;
  int sz;
  int Capacity;
}Contact;
 
//静态版本
//1000个联系人 与已存个数结构体
//typedef struct Contact
//{
//  PeoInfo data[Max];
//  int sz;
//}Contact;
 
//函数声明
 
//初始化通讯录
void InitContact(Contact* pc);
 
//添加联系人
void Addcontact(Contact* pc);
 
//打印通讯录
void Printcontact(Contact* pc);
 
//删除联系人
void Deletecontact(Contact* pc);
 
//查找联系人
void Searchcontact(Contact* pc);
 
//修改联系人
void Modifycontact(Contact* pc);
 
//清空联系人
void Emptycontact(Contact* pc,void(*p)(Contact*));
 
//排序联系人
void Sortcontact(Contact* pc);
 
//销毁通讯录
void Freecontact(Contact* pc);
 
//保存文件
void Savecontact(Contact* pc);
目录
相关文章
|
24天前
|
存储 C语言
【c语言】玩转文件操作
本文介绍了C语言中文件操作的基础知识,包括文件的打开和关闭、文件的顺序读写、文件的随机读写以及文件读取结束的判定。详细讲解了`fopen`、`fclose`、`fseek`、`ftell`、`rewind`等函数的使用方法,并通过示例代码展示了如何进行文件的读写操作。最后,还介绍了如何判断文件读取结束的原因,帮助读者更好地理解和应用文件操作技术。
31 2
|
1月前
|
存储 C语言
C语言文件操作(2)
【10月更文挑战第2天】
|
1月前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
20 2
|
1月前
|
程序员 编译器 C语言
C语言底层知识------文件操作
本文详细介绍了文件操作的基本概念,包括文件的分类(程序文件和数据文件,其中着重于数据文件的文本文件和二进制文件),流的概念及其在C程序中的应用,以及标准输入输出流stdin、stdout和stderr的作用。作者通过示例展示了如何使用fopen、fclose和常见的读写函数如fgetc、fputc和fgets进行文件操作。
22 2
|
1月前
|
存储 缓存 编译器
文件操作——C语言
文件操作——C语言
|
1月前
|
存储 C语言
简述C语言文件操作
简述C语言文件操作
11 0
|
1月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
1月前
|
存储 程序员 编译器
C语言文件操作(1)
【10月更文挑战第1天】
|
1月前
|
存储 C语言
C语言的文件操作
C语言的文件操作
21 0
|
1月前
|
存储 C语言
手把手教你用C语言实现通讯录管理系统
手把手教你用C语言实现通讯录管理系统