C语言实现通讯录小功能

本文实例为大家分享了C语言实现通讯录功能的具体代码,供大家参考,具体内容如下

头文件contact.h

#pragma once
#define  _CRT_SECURE_NO_WARNINGS 1

//#define max 1000

#define fault 3
#define max_name 20
#define max_telephone 12
#define max_sex 5
#define max_address 30

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<errno.h>

enum option
{
 EXIT,
 ADD,
 DEL,
 SEARCH,
 MODIFY,
 SHOW,
 SORT,
 SAVE
};

struct people_information
{
 char name[max_name];
 char telephone[max_telephone];
 char sex[max_sex];
 char address[max_address];
 int age;
};

struct contact
{
 //struct people_information data[max];
 struct people_information *data;//动态空间
 int size;//记录当前有多少信息
 int capacity;//当前最大容量
};

void initcontact(struct contact* ps);//初始化函数
void add(struct contact* ps);
void my_delete(struct contact* ps);
void search(const struct contact* ps);
void modify(struct contact* ps);//修改指定联系人
void show(const struct contact* ps);//展示全部联系人
void sort(struct contact* ps);
void destroy(struct contact* ps);
void save(struct contact* ps);

分装函数contact.c

#define  _CRT_SECURE_NO_WARNINGS 1

#include"contact.h"

void initcontact(struct contact* ps)
{
 //memset(ps->data, 0, sizeof(ps->data));
 //ps->size = 0;//初始化通讯录中只有0个信息
 ps->data = (struct people_information*)malloc(fault * sizeof(struct people_information));
 if (ps->data == NULL)
 {
  return;
 }
 ps->size = 0;
 ps->capacity = fault;
}

void checkcapacity(struct contact* ps)
{
 if (ps->size == ps->capacity)
 {
  struct people_information * ptr=realloc(ps->data, (ps->capacity + 2)*sizeof(struct people_information));
  if (ptr != NULL)
  {
   ps->data = ptr;
   ps->capacity += 2;
   printf("增容成功\n");
  }
  else
  {
   printf("增容失败\n");
  }
 }
}

void add(struct contact* ps)
{
 /*if (ps->size == max)
 {
  printf("通讯录已满,无法增加\n");
 }
 else
 {
  printf("请输入姓名:>");
  scanf("%s", ps->data[ps->size].name);
  printf("请输入电话:>");
  scanf("%s", ps->data[ps->size].telephone);
  printf("请输入性别:>");
  scanf("%s", ps->data[ps->size].sex);
  printf("请输入住址:>");
  scanf("%s", ps->data[ps->size].address);
  printf("请输入年龄:>");
  scanf("%d", &(ps->data[ps->size].age));
  ps->size++;
  printf("添加成功!\n");
 }*/
 //检测当前通讯录的容量
 checkcapacity(ps);
 printf("请输入姓名:>");
 scanf("%s", ps->data[ps->size].name);
 printf("请输入电话:>");
 scanf("%s", ps->data[ps->size].telephone);
 printf("请输入性别:>");
 scanf("%s", ps->data[ps->size].sex);
 printf("请输入住址:>");
 scanf("%s", ps->data[ps->size].address);
 printf("请输入年龄:>");
 scanf("%d", &(ps->data[ps->size].age));
 ps->size++;
 printf("添加成功!\n");
}

void show(const struct contact* ps)
{
 if (ps->size == 0)
 {
  printf("通讯录为空\n");
 }
 else
 {
  int i = 0;
  for (i = 0; i < ps->size; i++)
  {
   printf("%-20s\t%-12s\t%-5s\t%-30s\t%-4s\n",
    "姓名", "电话", "性别", "住址", "年龄");
   printf("%-20s\t%-12s\t%-5s\t%-30s\t%-4d\n",
    ps->data[i].name,
    ps->data[i].telephone,
    ps->data[i].sex,
    ps->data[i].address,
    ps->data[i].age);
  }
 }
}

static int FindByName(const struct contact* ps, char name[max_name])//冗余函数、查找函数
{
 //找到了返回名字所在元素的下标,找不到返回-1
 int i = 0;
 for (i = 0; i < ps->size; i++)
 {
  if (0 == strcmp(ps->data[i].name, name))
  {
   return i;
  }
 }
 return -1;
}

void my_delete(struct contact* ps)
{
 printf("请输入您要删除联系人的姓名:");
 char name[max_name] ;
 scanf("%s", name);
 int pos = FindByName(ps, name);
 if (pos==-1)
 {
  printf("您要删除的人不存在\n");
 }
 else
 {
  //删除数据
  int j = 0;
  for (j = pos; j < ps->size - 1; j++)
  {
   ps->data[j] = ps->data[j + 1];
  }
  ps->size--;
  printf("删除成功!\n");
 }
}

void search( const struct contact* ps)
{
 printf("请输入您要查找联系人的姓名:");
 char name[max_name];
 scanf("%s", name);
 int pos = FindByName(ps, name);
 if (pos == -1)
 {
  printf("您要查找的联系人不存在\n");
 }
 else
 {
  printf("%-20s\t%-12s\t%-5s\t%-30s\t%-4s\n",
   "姓名", "电话", "性别", "住址", "年龄");
  printf("%-20s\t%-12s\t%-5s\t%-30s\t%-4d\n",
   ps->data[pos].name,
   ps->data[pos].telephone,
   ps->data[pos].sex,
   ps->data[pos].address,
   ps->data[pos].age);
 }
}//完成

void modify(struct contact* ps)
{
 printf("请输入您要修改联系人的姓名:");
 char name[max_name];
 scanf("%s", name);
 int pos = FindByName(ps, name);
 if (pos == -1)
 {
  printf("您要修改的联系人不存在\n");
 }
 else
 {
  printf("新的姓名:");
  scanf("%s", ps->data[pos].name);
  printf("新的电话:");
  scanf("%s", ps->data[pos].telephone);
  printf("新的性别:");
  scanf("%s", ps->data[pos].sex);
  printf("新的住址:");
  scanf("%s", ps->data[pos].address);
  printf("新的年龄:");
  scanf("%d", &(ps->data[pos].age));

  printf("修改完成!\n");
 }
}

void sort(struct contact* ps)
{
 assert(ps);
 if (ps->size == 0)
 {
  printf("通讯录为空,无需排序\n");
 }
 else if (ps->size == 1)
 {
  printf("您的通讯录中只有一个人,无需排序\n");
  printf("%-20s\t%-12s\t%-5s\t%-30s\t%-4s\n",
   "姓名", "电话", "性别", "住址", "年龄");
  printf("%-20s\t%-12s\t%-5s\t%-30s\t%-4d\n",
   ps->data[0].name,
   ps->data[0].telephone,
   ps->data[0].sex,
   ps->data[0].address,
   ps->data[0].age);
 }
 else
 {
  int i = 0;
  for (i = 0; i < ps->size; i++)
  {
   int j = 0;
   for (j = 0; j < ps->size - i - 1; j++)
   {
    int ret = strcmp(ps->data[j].name, ps->data[j + 1].name);
    if (ret > 0)
    {
     char tmp1[max_name] = { 0 };
     char tmp2[max_telephone] = { 0 };
     char tmp3[max_sex] = { 0 };
     char tmp4[max_address] = { 0 };
     int  tmp5 = 0;

     strcpy(tmp1, ps->data[j].name);
     strcpy(tmp2, ps->data[j].telephone);
     strcpy(tmp3, ps->data[j].sex);
     strcpy(tmp4, ps->data[j].address);
     tmp5 = ps->data[j].age;//交给临时变量

     strcpy(ps->data[j].name, ps->data[j+1].name);
     strcpy(ps->data[j].telephone, ps->data[j+1].telephone);
     strcpy(ps->data[j].sex, ps->data[j+1].sex);
     strcpy(ps->data[j].address, ps->data[j+1].address);
     ps->data[j].age= ps->data[j+1].age;

     strcpy( ps->data[j + 1].name,tmp1);
     strcpy( ps->data[j + 1].telephone,tmp2);
     strcpy( ps->data[j + 1].sex,tmp3);
     strcpy( ps->data[j + 1].address,tmp4);
     ps->data[j + 1].age=tmp5;
    }
   }
  }
 }
 printf("排序完成!\n");
}

void destroy(struct contact* ps)
{
 free(ps->data);
 ps->data = NULL;
}

void save(struct contact* ps)
{
 FILE* pfwrite = fopen("contact.dat", "wb");
 if (pfwrite == NULL)
 {
  printf("%s\n", strerror(errno));
  return ;
 }
 //写通讯录中的数据到文件中

 int i = 0;
 for (i = 0; i < ps->size; i++)
 {
  fwrite(&(ps->data[i]), sizeof(struct people_information), 1, pfwrite);
 }

 fclose(pfwrite);
 pfwrite = NULL;
}

源文件test.c

#define  _CRT_SECURE_NO_WARNINGS 1

//功能:
//一、存放1000个系人信息,信息包括:姓名、电话、性别、住址、年龄
//二、增加联系人信息
//三、删除指定联系人信息
//四、查找联系人信息
//五、修改联系人信息
//六、显示全部联系人信息
//七、排序

#include<stdio.h>
#include"contact.h"

void menu()
{
 printf("******************************\n");
 printf("****1.add         2.delete****\n");
 printf("****3.search      4.modify****\n");
 printf("****5.show        6.sort  ****\n");
 printf("****7.save        0.exit  ****\n");
 printf("******************************\n");
}

int main()
{
 int input = 0;
 //创建通讯录
 struct contact con;//con就是通讯录,存放1000个信息

 //初始化通讯录
 initcontact(&con);
 do
 {
  menu();
  printf("请选择:>");
  scanf("%d", &input);
  switch (input)
  {
  case ADD:
   add(&con);//增加联系人信息
   break;
  case DEL:
   my_delete(&con);//删除指定联系人信息
   break;
  case SEARCH:
   search(&con);//查找联系人信息
   break;
  case MODIFY:
   modify(&con);//修改联系人信息
   break;
  case SHOW:
   show(&con);//显示全部联系人信息
   break;
  case SORT:
   sort(&con);//排序
   break;
  case EXIT:
   printf("退出通讯录\n");
   //销毁通讯录
   destroy(&con);
   break;
  case SAVE:
   save(&con);
  default:
   printf("选择错误\n");
   break;
  }
 } while(input);
 return 0;
}

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

(0)

相关推荐

  • C语言实现个人通讯录管理系统

    如何用c语言制作简易的个人通讯录管理系统?想必这是每一位初步学习c语言的同学需要解决的一个大问题.如何将这些数据类型不完全相同的数据元素存储并访问呢?采用结构体便能轻松解决这个问题! #include<stdio.h> #include<string.h> #include<stdlib.h> #include<windows.h> struct stu //第一部分:声明结构体类型struct stu { char name[100];//姓名为字符串型

  • 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

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

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

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

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

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

  • C语言实现一个通讯录

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

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

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

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

随机推荐