C语言通讯录实例分享

 更新时间:2018年02月15日 09:42:02   作者:StevenLoveMaggie  
这篇文章主要为大家分享了C语言通讯录实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

main.c文件:

// 
// main.c 
// c语言通讯录 
// 
// Created by stevenchang on 9/6/15. 
// Copyright (c) 2015 cz. All rights reserved. 
// 
 
/** 
 1.添加联系人 
 2.删除联系人 
 3.更新联系人 
 4.显示所有联系人 
 5.查找联系人 
 6.退出系统 
 */ 
#include <stdio.h> 
 
int main(int argc, const char * argv[]) { 
 //程序的初始化 
 initContacts(); 
  
 while(1) { 
  int flag = 0; 
  printf("*************C语言通讯录*************\n"); 
  printf("************1.添加用户***************\n"); 
  printf("************2.删除用户***************\n"); 
  printf("************3.更新用户***************\n"); 
  printf("************4.查找用户***************\n"); 
  printf("************5.显示所有用户************\n"); 
  printf("************6.退出系统***************\n"); 
  printf("************************************\n"); 
   
  printf("请输入1-6的功能编号 :\n"); 
  scanf("%d",&flag); 
  //判断编号是否合法 
  validateNum(flag, 1, 6); 
   
  switch (flag) { 
   case 1: 
    addContact(); //添加用户 
    break; 
   case 2: 
    deleteContact();  //删除用户 
    break; 
   case 3: 
    updateContact();  //更新用户 
    break; 
   case 4: 
    searchContact();  //查找用户 
    break; 
   case 5: 
    listContact();  //显示所有用户 
    break; 
   case 6: 
    printf("系统正在退出!\n"); 
    printf("成功退出系统!\n"); 
    return 0; 
    break; 
   default: 
    break; 
  } 
   
 } 
 return 0; 
} 

MyFile.c文件:

// 
// MyFile.c 
// c语言通讯录 
// 
// Created by stevenchang on 9/6/15. 
// Copyright (c) 2015 cz. All rights reserved. 
// 
 
#include "MyFile.h" 
 
//**************函数的实现**********************// 
 
/** 
 * 添加联系人 
 */ 
void addContact() { 
 int flag = 0; 
 printf("您选择的是添加联系人,请按操作进行!\n"); 
 printf("请输入用户姓名(*注意联系人姓名中间不能有空格):\n"); 
 scanf("%s",contacts[totalContactsCount].name); 
 printf("请输入电话(*注意联系人电话中间不能有空格): \n"); 
 scanf("%s",contacts[totalContactsCount].tel); 
 printf("是否确认添加!1:是 0:否\n"); 
 scanf("%d",&flag); 
 if (flag) { 
  //联系人个数加1 
  totalContactsCount++; 
   
  //将联系人信息保存到文件中 
  writeFile(); 
 } 
 printf("已经放弃添加!\n"); 
 return ; 
} 
 
/** 
 * 删除联系人 
 */ 
void deleteContact() { 
 int no; 
 printf("您选择的是删除联系人,请按操作进行!\n"); 
 printf("请输入要删除的编号:\n"); 
 scanf("%d",&no); 
  
 //判断输入的编号是否合法 
 if (!validateNum(no, 1, totalContactsCount)) { 
  printf("您输入的编号不合法!\n"); 
  return ; 
 } 
 //合法 
 //如果删除的是最后一个元素 
 if (no == totalContactsCount) { 
  totalContactsCount--; 
 } else { 
  //如果删除的不是最后一个元素 
  for (int i = no; i < totalContactsCount; i++) { 
   contacts[no-1] = contacts[no]; //元素的移动和覆盖 
  } 
  totalContactsCount--; 
 } 
  
 //同步文件 
 writeFile(); 
} 
 
/** 
 * 更新联系人 
 */ 
void updateContact() { 
 int no; 
 char newName[NAMELENGTH]; 
 char newTel[TELLENGTH]; 
 printf("您选择的是更新联系人,请按操作进行!\n"); 
 printf("请输入要修改的联系人编号:\n"); 
 scanf("%d",&no); 
  
 //判断编号是否合法 
 if (!validateNum(no, 1, totalContactsCount)) { 
  return ; 
 } 
  
 //合法 
 printf("请重新输入用户名:\n"); 
 scanf("%s",newName); 
 printf("请重新输入电话号码\n"); 
 scanf("%s",newTel); 
  
 strcpy(contacts[no-1].name, newName); 
 strcpy(contacts[no-1].tel, newTel); 
  
 //写入文件 
 writeFile(); 
} 
 
/** 
 * 显示所有联系人 
 */ 
void listContact() { 
 printf("您选择的是显示所有联系人,联系人如下!\n"); 
  
 if (totalContactsCount > 0) { 
  printf("序号\t姓名\t电话\n"); 
  for (int i = 0 ; i < totalContactsCount; i++) { 
   printf("%d\t%s\t%s\n",i+1,contacts[i].name, contacts[i].tel); 
  } 
 } else { 
  printf("联系人为空,请添加联系人!\n"); 
  return ; 
 } 
} 
 
/** 
 * 查找联系人 
 */ 
void searchContact() { 
 printf("您选择的是查找联系人,请按操作进行!\n"); 
 char searchName[NAMELENGTH]; 
 printf("请输入要查找的联系人姓名:\n"); 
 scanf("%s",searchName); 
 for (int i = 0 ; i < totalContactsCount; i++) { 
  if (strcmp(searchName, contacts[i].name)==0) { //说明相同 
   printf("联系人姓名为:%s,电话号码为:%s\n",contacts[i].name,contacts[i].tel); 
   return ; 
  } 
  if (i == totalContactsCount-1) { 
   printf("此联系人不存在!\n"); 
  } 
 } 
} 
 
/** 
 * 通讯录的初始化 
 */ 
void initContacts() { 
 printf("通讯录正在初始化!\n"); 
 FILE *fp = fopen(filePath, "r"); 
 if (fp!=NULL) { //读取文件成功 
  //读取联系人的个数 
  fread(&totalContactsCount, sizeof(totalContactsCount), 1, fp); 
  //读取每个联系人 
  for (int i = 0; i < totalContactsCount; i++) { 
   //读取联系人数据,到联系人数组中 
   fread(&contacts[i], sizeof(Person), 1, fp); 
  } 
 } else { 
  //读取文件失败 
  //创建文件 
  fp = fopen(filePath, "wb"); 
  //写入联系人的个数 
  fwrite(&totalContactsCount, sizeof(totalContactsCount), 1, fp); 
   
  printf("通讯录文件创建成功!\n"); 
 } 
  
 //关闭文件指针 
 fclose(fp); 
 printf("通讯录初始化成功!\n"); 
} 
 
/** 
 * 判断功能编号是否合法 1:合法 0:非法 
 */ 
int validateNum(int num, int min, int max) { 
 if (num < min || num > max) { 
  printf("输入的功能编号不正确,请重新输入!\n"); 
  return 0; 
 } 
 return 1; 
} 
 
/** 
 *将联系人写入文件 
 */ 
void writeFile() { 
 //以二进制文件打开文件 
 FILE *fp = fopen(filePath, "wb"); 
  
 if (fp != NULL) { 
  //写入联系人个数 
  fwrite(&totalContactsCount, sizeof(totalContactsCount), 1, fp); 
  //写入每个联系人个数 
  for (int i = 0; i < totalContactsCount; i++) { 
   fwrite(&contacts[i], sizeof(Person), 1, fp); 
  } 
 } 
  
 fclose(fp); 
 printf("文件更新成功\n"); 
} 

MyFile.h文件:

// 
// MyFile.h 
// c语言通讯录 
// 
// Created by stevenchang on 9/6/15. 
// Copyright (c) 2015 cz. All rights reserved. 
// 
 
#ifndef __c_______MyFile__ 
#define __c_______MyFile__ 
 
#include <stdio.h> 
#include <string.h> 
 
#define N 100   //宏定义一个通讯录的容量 
#define NAMELENGTH 22 //宏定义一个名字的长度 
#define TELLENGTH 12  //宏定义一个电话号码的长度 
 
//********************函数的声明*********************// 
void addContact(); //添加联系人 
void deleteContact(); //删除联系人 
void updateContact(); //更新联系人 
void listContact(); //显示所有联系人 
void searchContact(); //查找联系人 
void initContacts();  //通讯录的初始化 
int validateNum(int num, int min, int max); //判断功能编号是否合法 1:合法 0:非法 
void writeFile(); //将联系人写入文件 
 
typedef struct Person { //定义一个结构体 
 char name[NAMELENGTH];  //定义姓名数组 
 char tel[TELLENGTH];  //定义结构体数组 
} Person; 
 
//定义文件路径 
char *filePath = "telData.data"; 
int totalContactsCount = 0; 
Person contacts[N]; //定义Person结构体数组 
 
#endif /* defined(__c_______MyFile__) */ 

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

相关文章

  • C语言实现考勤管理系统

    C语言实现考勤管理系统

    这篇文章主要为大家详细介绍了C语言实现考勤管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • c++难以发现的bug(有趣)

    c++难以发现的bug(有趣)

    这篇文章主要介绍了c++难以发现的bug(有趣)的相关资料,需要的朋友可以参考下
    2017-10-10
  • QT布局管理详解QVBoxLayout与QHBoxLayout及QGridLayout的使用

    QT布局管理详解QVBoxLayout与QHBoxLayout及QGridLayout的使用

    在这篇文章中,你将知道水平布局、垂直布局、网格布局如何轻松上手,以纯代码方式展示。对齐方式,大小设置,图片头像匹配标签,布局器里面的组件大小随意切换大小,认真看完这篇文章,QT布局管理器熟练使用
    2022-06-06
  • C语言字符串大小比较

    C语言字符串大小比较

    本文给大家分享给大家的是C语言的字符串大小比较的函数,有需要的小伙伴可以参考下。
    2015-07-07
  • 利用c++写一个简单的推箱子小游戏

    利用c++写一个简单的推箱子小游戏

    推箱子想必是很多人童年时期的经典游戏,我们依旧能记得抱个老人机娱乐的场景,下面这篇文章主要给大家介绍了关于如何利用c++写一个简单的推箱子小游戏的相关资料,需要的朋友可以参考下
    2021-09-09
  • C++的array和&array有什么区别

    C++的array和&array有什么区别

    本文主要介绍了C++的array和&array有什么区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Qt中简单的按钮槽函数传递参数方法

    Qt中简单的按钮槽函数传递参数方法

    这篇文章主要介绍了Qt中简单的按钮槽函数传递参数方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++实现LeetCode165.版本比较)

    C++实现LeetCode165.版本比较)

    这篇文章主要介绍了C++实现LeetCode165.版本比较),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • Qt实现矩形大小任意缩放的示例代码

    Qt实现矩形大小任意缩放的示例代码

    这篇文章主要介绍了Qt如何实现在窗口上绘制任意大小的矩形,并且通过边角的拖曳按钮可改变矩形大小,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-06-06
  • 一文带你深入了解C++中的类型转换

    一文带你深入了解C++中的类型转换

    在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。本文主要介绍了C++中常见的四个类型转换,需要的可以参考一下
    2022-12-12

最新评论