A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ldk1991125 中级黑马   /  2016-6-29 21:13  /  1176 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/**
1.引入头文件
2.进行必要的宏定义
3.定义文件名称变量、联系人数组、联系人结构体
4.定义函数、并进行函数声明
5.编写循环控制程序
6.显示操作界面
7.根据编号执行不同的函数
*/
#include <stdio.h>
#include <string.h>
//进行宏定义
#define N100  //定义通讯录容量
#define NAMELEN 22  //定义姓名长度
#define NUMLEN 12  //定义号码长度
//**********定义部分**********
//定义联系人结构体
struct{
//联系人
  char name[NAMELEN];
//电话号码
  char telNum[NUMLEN];
}Person;
//存储所有的联系人、建立联系人数组
Person contacts[N]; //能够储存100个联系人
//定义联系人的个数
int totalContactCount=0;
//接收用户输入的编号
int fno;
//定义数据文件的保存位置
char *filepath = "telbook.data";
//******函数的声明部分******
void init()
int validateInput(int num,int min,int max);
void doADD()
void doDelete()
void Update()
void doList()
void doSearchByName()
void writeFile()
int main(int argc,const char*argv[]){
  int flag=1;
  init();
  printf("初始化完成!\n");
  while(flag){
    printf("\n");
    //软件的界面显示出来
    printf("****************************\n");
    printf("****** 欢迎使用通讯录 ******\n");
    printf("****** 1.添加联系人   ******\n");
    printf("****** 2.删除联系人   ******\n");
    printf("****** 3.修改联系人   ******\n");
    printf("****** 4.查看所有联系人 ****\n");
    printf("****** 5.搜索联系人   ******\n");
    printf("****** 6.退出系统     ******\n");
    printf("****************************\n");
  //提示用户选择一个序号
  printf("请选择需要的操作编号\n");
  scanf("%d,&fno");
  //判断编号是否合法
   validateInput(fno,1,6);
   switch(fno){
      case 1:
       doADD()   //执行添加
      break;
      case 2:doDelete()
       //执行删除
      break;
      case 3:Update()
       //执行修改
      break;
      case 4:doList()
       //执行显示所有联系人
      break;
      case 5:doSearchByName()
       //执行查找
      break;
      case 6:
       //执行退出系统
        printf("系统正在退出...\n");
        printf("系统已退出!\n");
        flag=0;
      break;
      default:
      break;
    }
  }
  return 0;
}
/**
*验证输入是否合法
*
*@param num  待验证的数
*@param min  最小值
*@param max  最大值
*
*@return 1 非法, 0 正常
*/
int validateInput(int num,int min,int max){
  if(num<min||num>max){
    printf("所输编号不合法!");
    return 1;
  }
  return0;
}

/**添加联系人
*  思路:
    1)提示用户输入姓名和电话
    2)接收用户输入的内容
    3)保存到联系人 数组
    4)写入到文件中
*/
void doADD(){
  printf("您选择的是添加联系人\n");
//1.提示用户输入联系人的姓名
  printf("请输入联系人姓名:(注意不可有空格键)\n");
//totalContactCount==0
//
  scanf("%s",contacts[totalCtacyCount].name);
//3.提示用户输入电话号码
  printf("请输入联系人电话号码:(注意不可有空格)\n");
//4.接收电话号码
  scanf("%s",contacts[totalContactCount].telNum);
//5.确认添加
  int flag;
  printf("确认添加数据么?1.确认 0.取消\n");
  scanf("%d",&flag);
  if(flag){
  //6.联系人的个数+1
    totalContactCount++;
  //7.把联系人信息写入到文件中
    writeFile();
  }
}

/**
*  删除联系人
    思路:
    1)让用户输入要删除的数据的编号
    2)判断编号是否合法,编号不能大于联系人个数
    3)让用户再次确认删除
    4)开始删除数组元素
      (1)删除的元素正好是数组的最后一个元素,只要让

联系人个数减一
      (2)如果删除的元素不是最后一个元素,需要移动元

素,联系人数量减一
    5)删除文件内容
*/
void doDelete(){
//1.提示用户输入一个联系人编号
  int no;
  printf("请输入要删除的联系人编号:\n");
  scanf("%d",&no);
//2.判断编号是否合法,编号不能大于联系人个数
  if(validateInput(no,1totalContactCount)){
    return;
  }
//3.提示用户再次确认删除
  int flag;
  printf("删除联系人后将无法恢复,是否确认?\n");
  scanf("%d",&flag);
  if(flag){
//4.开始删除数组元素
  //1)删除的元素正好是数组的最后一个元素
    if(no==totalContactCount){
      totalContactCount--;
    }
    for(int i=no;i<totalContactCount;i++){
      contacts[no-1]=contacts[no];
    }
  }

}

/**
* 修改联系人
   1)提示输入要修改的联系人编号
   2)判断编号是否合法
   3)让用户输入新的姓名、电话
   4)让用户再次确认修改
   5)开始修改用户信息
   6)更新到文件中
*/
void Update(){
  printf("您选择的是修改联系人\n");
  doList();
//1)提示输入要修改的联系人编号
  int no;
  printf("请输入要修改的联系人编号:\n");
  scanf("%d",&no);
//2)判断编号是否合法,编号不能大于联系人个数
  if(validateInput(no,1,totalContactCount))){
    return;
  }
//3)让用户输入新的姓名、电话
  //contacts[n-1].name="xxxx";错误
  char name1(NAMELEN);
  char tel[NUMLEN];
  printf("请输入联系人新的姓名:(中间不能有空格)\n");
  scanf("%s",name1);
  printf("请输入联系人新的电话:(中间不能有空格)\n");
  scanf("%s",tel);
//4)让用户再次确认修改
  int flag;
  printf("确认后,将永久修改信息,是够确认?1.确认 0.

取消\n");
  scanf("%d",&flag);
  if(flag){
//5)开始修改用户信息
  strcpy(contacts[no-1].name,name1);
  strcpy(contacts[no-1].telNum,tel);
//6)更新到文件中
  writeFile();
  }
}

/** 显示联系人
*  思路:
    1)先判断联系人是否为空
    2)如果不为空,则遍历数组,显示所有的联系人
*/
void doList(){
  printf("您选择的是显示所有联系人,联系人数据如下:

\n");
//判断通讯录是否为空
  if(totalContactCount==0){
    printf("您的通讯录为空\n");
  }else{
   //输出格式
    printf("编号:\t姓名:\t电话:\t\n");
   //遍历联系人数组
    for(int i=0;i<totalContactCount;i++){
      printf("%d\t%s\t%d\t\n",i+1,contacts

[i].name,contacts[i].telNum);
    }
  }
}

/**
* 搜索联系人
   思路:
    1)提示用户输入要查找的人的姓名
    2)遍历联系人数组,查找有没有这个人
    3)查找到了,则把电话号码显示出来
*/ 4)查找不到,提示用户没有该联系人
void doSearchByName(){
  printf("您选择的是搜索联系人\n");
//1)提示用户输入要查找的人的姓名
  char name[NAMELEN];
  printf("请输入要查找的联系人!\n");
  scanf("%s",name);
//2)遍历联系人数组,查找有没有这个人
  for(int i=0;i<totalContactCount;i++){
    if(strcmp(name,contacts[i].name)==0){
    printf("您搜索的联系人%s号码是:%s

\n",name,contacts[i].telNum);
    break;
     }
  }
    if(i==totalContactCount){
      printf("对不起,查无此人!\n");
     }
}

/**
初始化
1.尝试性的读取文件
2.如果成功了,则说明文件存在,则读取文件内容
3.如果不成功,说明文件不存在
   1)创建联系人数据
   2)把当前联系人的个数写入到文件中

totalContactCount=0
*/
void init(){
//定义文件指针,并打开文件
  FILE *fp=fopen(filepath,"r");
  if(fp!=NULL){
    //读取联系人个数  4
    fread(&totalContactCount,sizeof

(totalContactCount),1,fp);
    //读取每一个联系人  34
    for(int i=0;i<totalContactCount;i++){
      //读取联系人数据到联系人数组中
       fread("&contacts[i],sizeof(Person),1,fp");
     }
   }else{
    fp=fopen(filepath,"wb");
    fwrite();
    printf();
   }
  fclose(fp);
}
/**
*  写数据到文件中
    思路:
    1.以wb方式打开文件
    2.先写联系人个数
    3.写每个联系人的数据
*/
void writeFile(){
//1.以wb方式打开文件
  FILE *fp=fopen(filepath,"wb");
  if(fp!=NULL){
//2.先写联系人个数
    fwrite(&totalContactCount,sizeof

(totalContactCount),1,fp);
//3.写每个联系人数据
    for(int i=0;i<totalContactCount;i++){
    //每次都写入一个数组的元素
      fwrite(&contact[i],sizeof(Person),1,fp);
    }
  printf("添加成功!\n");
  }
  fclose(fp);
}

1 个回复

倒序浏览
卧槽 不错 这个我要了 找了好久  经典
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马