C语言实现一个简易通讯录

本文实现一个通讯录,是基于c语言的IO文件操作、数据结构里面的顺序表实现。

具体功能

实现了

1、信息的添加
2、信息的显示
3、信息的修改(修改单一属性)
4、将内存中的信息保存到文件中去
5、将文件中的信息加载到内存中(每次程序运行数据就会丢失)
6、信息的删除
7、信息的查找(按照各自的属性查找)
8、给每一条信息设置了唯一的标识id
9、通讯录的销毁

头文件中的声明

在c语言中我们采用结构体来记录每一个人的具体信息
用顺序表的数据结构来来对数据的操作

#ifndef __ADDRESSBOOK_H__
#define __ADDRESSBOOK_H__

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>

#define NAME_MAX 200 //名字
#define GENDER_MAX 100 // 性别
#define ADDRESS_MAX 200 // 地址
#define NUMBER_MAX 200 // 电话
#define SEQLIST_MAX 1000 // 存储的最大信息数量
#define FILE_PATH "address_book.txt" // 写入文件的位置

typedef struct person_inf
{
  char name[NAME_MAX];
  char gender[GENDER_MAX];
  char number[NUMBER_MAX];
  char address[ADDRESS_MAX];
}person_inf;

typedef struct address_book
{
  size_t size;
  person_inf data[SEQLIST_MAX];
}address_book;

//初始化通讯录
void address_book_init(address_book *book);

//添加信息
void address_book_add(address_book *book);

//显示信息
void address_book_display(address_book *book);

//删除所有信息
void address_book_delete_all(address_book *book);

//保存信息
void address_book_save(address_book *book);

//加载信息
void address_book_load(address_book *book);

//修改信息
void address_book_update(address_book *book);

//删除信息
void address_book_delete(address_book *book);

//查找信息
void address_book_find(address_book *book);

//销毁通讯录
void adderss_book_destory(address_book *book);

#endif

函数的定义

在这里我们实现了,基本的增删查改,保存信息加载信息。

#define _CRT_SECURE_NO_WARNINGS

#include "AddressBook.h"

//初始化通讯录
void address_book_init(address_book *book)
{
  if(book == NULL)
  {
    return ;
  }
  book->size = 0;
}

//添加信息
void address_book_add(address_book *book)
{
  size_t cur = 0;
  if(book == NULL)
  {
    printf("book is NULL\n");
    return ;
  }
  cur = book->size;
  ++book->size;
  printf("添加信息\n");
  printf("请输入要添加的姓名\n");
  scanf("%s",book->data[cur].name);
  printf("请输入要添加的性别\n");
  scanf("%s",book->data[cur].gender);
  printf("请输入要添加的电话\n");
  scanf("%s",book->data[cur].number);
  printf("请输入要添加的地址\n");
  scanf("%s",book->data[cur].address);
  printf("添加成功\n");
  return;
}

//显示信息
void address_book_display(address_book *book)
{
  size_t j = 0;
  if(book == NULL)
  {
    return ;
  }
  printf("序号\t\t姓名\t\t性别\t\t电话\t\t地址\n");
  for(j=0; j< book->size; j++)
  {
    printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",j,book->data[j].name,
    book->data[j].gender,book->data[j].number,
    book->data[j].address);
  }
}

//保存信息
void address_book_save(address_book *book)
{
  size_t i = 0;
  FILE *fp = fopen(FILE_PATH,"w");
  if(book == NULL)
  {
    return ;
  }
  if(fp == NULL)
  {
    printf("打开文件失败\n");
    return ;
  }
  //fprintf(fp,"序号\t\t姓名\t\t性别\t\t电话\t\t地址\n");
  for(i=0; i< book->size; i++)
  {
    fprintf(fp,"%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name,
    book->data[i].gender,book->data[i].number,
    book->data[i].address);
  }
  fclose(fp);
}

//加载信息
void address_book_load(address_book *book)
{
  size_t len = 0;
  size_t i = 0;
  FILE *fp = fopen(FILE_PATH,"r");

  if(book == NULL)
  {
    return ;
  }
  if(fp == NULL)
  {
    printf("打开文件失败\n");
    return ;
  }
  // 把光标移动到文件末尾
  fseek(fp,0,SEEK_END);
  // 从光标到文件首偏移的字节数
  len = ftell(fp);
  if(len == 0)
  {
    printf("通讯录为空\n\n");
    return ;
  }
  // rewind函数是将fp指针指向文件的开始
  rewind(fp);
  while(!feof(fp))
  {
    fscanf(fp,"%u\t\t%s\t\t%s\t\t%s\t\t%s\n",&i,book->data[book->size].name,//name是数组,在调用数组名时候降级为指针
      book->data[i].gender,book->data[book->size].number,
      book->data[book->size].address);
    i++;
    ++book->size;
  }
  fclose(fp);
}

//修改信息
void address_book_update(address_book *book)
{
  size_t i = 0;
  if(book == NULL)
  {
    return ;
  }
  printf("请输入要修改的编号\n");
  scanf("%u",&i);
  if(i > book->size || i < 0)
  {
    printf("输入为非法值\n");
    return ;
  }
  printf("修改信息\n");
  printf("姓名修改为\n");
  scanf("%s",book->data[i].name);
  printf("性别修改为\n");
  scanf("%s",book->data[i].gender);
  printf("修改电话为\n");
  scanf("%s",book->data[i].number);
  printf("地址修改为\n");
  scanf("%s",book->data[i].address);
  printf("修改成功\n");
  return ;
}

//删除信息
void address_book_delete(address_book *book)
{
  size_t i = 0;
  if(book == NULL)
  {
    return ;
  }
  printf("请输入要删除的编号\n");
  scanf("%u",&i);
  if(i > book->size)
  {
    printf("输入为非法值\n");
    return ;
  }
  while(i < book->size)
  {
    book->data[i] = book->data[i+1];
    i++;
  }
  book->size--;
  printf("删除成功\n");
  return;
}

//删除所有信息
void address_book_delete_all(address_book *book)
{
  if(book == NULL)
  {
    return ;
  }
  book->size = 0;
}

//查找信息
void address_book_find(address_book *book)
{
  int flag = 0;
  size_t i = 0;
  int choice = 0;
  char f_name[50];
  char f_number[50];
  if(book == NULL)
  {
    //book为空指针;
    return ;
  }
  printf("请输入要查找的方式\n");
  printf("************************\n");
  printf("*1.姓名查找 2.电话号查找\n");
  printf("************************\n");
  scanf("%d",&choice);
  if (choice == 1)
  {
    //姓名查找
    printf("请输入查找的姓名或者关键字\n");
    scanf("%s",f_name);
    printf("序号\t\t姓名\t\t性别\t\t电话\t\t地址\n");
    while(i < book->size)
    {
      if(strstr(book->data[i].name,f_name)) //用strstr函数来查关键字
      {
        flag = 1;
        printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name,
        book->data[i].gender,book->data[i].number,
        book->data[i].address);
      }
      i++;
    }
    if(flag == 0)
    printf("未查找到\n");
  }
  else if (choice == 2)
  {
    //电话号码查找
    printf("请输入查找的电话号或者关键号码\n");
    scanf("%s",f_number);
    printf("序号\t\t姓名\t\t性别\t\t电话\t\t地址\n");
    while(i < book->size)
    {
      if(strstr(book->data[i].number,f_number))
      {
        flag = 1;
        printf("%u\t\t%s\t\t%s\t\t%s\t\t%s\n",i,book->data[i].name,
        book->data[i].gender,book->data[i].number,
        book->data[i].address);
      }
      i++;
    }
    if(flag == 0)
    {
      printf("未查找到\n");
    }
  }
  else
  {
    printf("选择错误\n");
  }
}

/*fseek(fp,100L,0);把文件内部指针移动到离文件开头100字节处;
fseek(fp,100L,1);把文件内部指针移动到离文件当前位置100字节处;
fseek(fp,-100L,2);把文件内部指针退回到离文件结尾100字节处。

ftell(fp);利用函数 ftell() 也能方便地知道一个文件的长。
如以下语句序列: fseek(fp, 0L,SEEK_END); len =ftell(fp)+1;
首先将文件的当前位置移到文件的末尾,然后调用函数ftell()获得当前
位置相对于文件首的位移,该位移值等于文件所含字节数。
*/

//销毁通讯录
void adderss_book_destory(address_book *book)
{
  FILE *fp = fopen(FILE_PATH,"w");
  if(book == NULL)
  {
    return ;
  }
  if(fp == NULL)
  {
    printf("打开文件失败\n");
    return ;
  }
  fseek(fp,0,SEEK_SET);
  rewind(fp);
  fclose(fp);
  printf("销毁成功\n");
}

主函数的实现(主要的框架)

实现是采用枚举来标识要使用哪种功能,其中要注意的是,我们在将程序运行起来时候就需要加载我们的以前文件中的信息。还有就是我们要在每次添加一条信息,或者删除,修改都需要保存,既内存中和IO文件中保存写入一次

enum
{
  EXIT,
  DISPLAY,
  ADD,
  UPDATE,
  Y_DELETE,
  FIND,
  DESTORY
};

//菜单
void menu()
{
  int choice = 0;
  address_book book;
  address_book_init(&book);
  address_book_load(&book);
  while(1)
  {
    printf("===============================\n");
    printf("1.显示通讯录\n");
    printf("2.添加\n");
    printf("3.修改\n");
    printf("4.删除\n");
    printf("5.查找\n");
    printf("6.销毁\n");
    printf("0.退出\n");
    printf("===============================\n");
    scanf("%d",&choice);
    system("cls");
    switch (choice)
    {
      case DISPLAY:
        address_book_display(&book);
        break;
      case ADD:
        address_book_add(&book);
        address_book_save(&book);
        break;
      case UPDATE:
        address_book_update(&book);
        address_book_save(&book);
        break;
      case Y_DELETE:
        address_book_delete(&book);
        address_book_save(&book);
        break;
      case FIND:
        address_book_find(&book);
        break;
      case DESTORY:
        adderss_book_destory(&book);
        address_book_delete_all(&book);
        break;
      case EXIT:
        return ;
        break;
      default:
        printf("输入值非法\n");
        break;
    }
  }

}

int main()
{
  menu();
  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现通讯录功能

    本文实例为大家分享了C语言实现通讯录功能的具体代码,供大家参考,具体内容如下 先定义头文件 #ifndef __CONTACT_H__ #define __CONTACT_H__ #define NAME_LEN 10 #define SEX_LEN 6 #define TELE_LEN 12 #define ADDR_LEN 20 #define MAX_PEO 1000 typedef struct PEO { char name[NAME_LEN]; int age; char sex[S

  • 用C语言实现简易通讯录

    C语言实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 **提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人** 思路分析: 首先我们可以分三个模块来解决这个问题,第一个模块我们需要一个头文件,这个头文件里可以包含一些相应信息,当实现文件和测试文件包含自己定义的头文件时便可以获得一些相关的信息.所以头文件里

  • C语言基于哈希表实现通讯录

    本文为大家分享了C语言基于哈希表实现通讯录的具体代码,供大家参考,具体内容如下 1.需求分析 本演示程序用C语言编写,完成哈希表的生成,电话号码的插入.以及查找等功能. (1)按提示输入相应的联系人的相关资料: (2)以相应的输出形式输出所存储的的联系人的资料: (3)程序可以达到建立.添加.查找.打印的功能: (4)程序可以判断用户输入的非法数据并引导正确的输入. 2.概要设计 存储电话号码的记录时,若在存储位置和其关键字之间建立某种确定的对应关系使得每个关键字和存储结构中一个唯一的存储位置相

  • C语言使用结构体实现简单通讯录

    C语言用结构体实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 代码实现: 头文件: #ifndef __HEAD_H__ ////防止头文件被多次调用 #define __HEAD_H__ #include<stdio.h> #include<string.h> #in

  • C语言实现一个通讯录

    实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 提供方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6.  清空所有联系人 7. 以名字排序所有联系人 没有开辟动态内存的方法: 头文件:test.h #ifndef __CONTACT #define __CONTACT #define _CRT_SECURE_NO_WARNINGS 1 #include<

  • C语言实现简单的通讯录

    用C语言写了一个简单的通讯录,说简单一是功能简单,二是也没有加读写文件操作,只是作为链表操作的一个练习,希望能给这方面的新手一此引导和帮助. 代码: /* 转贴请注明出处 */ /* 作者:小浦原(ID:blueboy82006) */ /* http://blog.csdn.net/blueboy82006 */ #include <stdio.h> #include <stdlib.h> #include<string.h> #include<ctype.h&

  • C语言实现通讯录系统

    C语言通讯录系统实现,供大家参考,具体内容如下 需求分析: 利用文件读,写的方法 实现增加通讯录联系人信息 实现删除通讯录联系人信息 实现查找通讯录联系人信息 实现修改通讯录联系人信息 实现查看现有通讯录联系人信息 代码实现: // main.c // C语言通讯录实现 // // Created by Brisinga on 15/10/14. // Copyright © 2015年 yan. All rights reserved. // #include <stdio.h> #incl

  • 使用C语言打造通讯录管理系统和教学安排系统的代码示例

    通讯录管理系统 实现了通讯录的录入信息.保存信息.插入.删除.排序.查找.单个显示等功能.. 完整的代码如下: #include <stdio.h> #include <malloc.h> //得到指向大小为Size的内存区域的首字节的指针// #include <string.h> #include <stdlib.h> //标准库函数// #define NULL 0 #define LEN sizeof(struct address_list) //计

  • C语言通讯录管理系统完整版

    C语言实现了通讯录的录入信息.保存信息.插入.删除.排序.查找.单个显示等功能.. 完整的代码如下: #include <stdio.h> #include <malloc.h> //得到指向大小为Size的内存区域的首字节的指针// #include <string.h> #include <stdlib.h> //标准库函数// #define NULL 0 #define LEN sizeof(struct address_list) //计算字节//

  • C语言通讯录管理系统课程设计

    本文实例为大家分享了C语言通讯录管理系统课程设计,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <windows.h> struct Sign{ char name[8]; char sex[4]; char birthday[12]; char phone[11]; char postcode[7]; char addr[30]; struct Sign *next; }pe; char Ph

随机推荐