一个综合示例:通讯录管理系统

      本示例充分利用前期所学一些C语言编程知识,主要涉及到的有:结构体,文件的读写等。本通讯录设定可以保存100条通讯录,每条通讯录包括:姓名,街道,城市,国家,邮编。程序运行后,显示一个主菜单:

      1、添加联系人

      2、删除联系人

      3、显示所有联系人

      4、保存联系人条目到文件

      5、从文件读取联系人条目

      6、退出


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

//定义本通讯录最大容量为100条
#define MAX 100

//结构体,用以存储通讯录的具体信息
struct addr {
  char name[50];
  char street[50];
  char city[50];
  char state[20];
  unsigned long int zip;
} addr_list[MAX];

//后文将会用到的若干子程序
void init_list(void);
void enter(void);
void delete(void);
void list(void);
void load(void);
void save(void);
int menu_select(void);
void find_free(void);

//主程序
int main(void)
{
  char choice;

  //初始化通讯录结构体,将所有字段都置为空
  init_list();

  //空的for语句构成一个无限循环,显示主菜单提示用户输入并执行对应的操作
  for(;;) {
    choice = menu_select();
    switch(choice) {
      case 1: enter();
        break;
      case 2: delete();
        break;
      case 3: list();
        break;
      case 4: save();
        break;
      case 5: load();
        break;
      case 6: exit(0);
    }
  }

  return 0;
}

//初始化通讯录,将所有条目的name字段都设为“\0”
void init_list(void)
{
  register int t;

  for(t=0; t<MAX; ++t) addr_list[t].name[0] = '\0';
}

//获取用户从键盘的一个输入项,返回值是1-6之间的一个数
int menu_select(void)
{
  char s[80];
  int c;

  printf("1. Enter a name\n");
  printf("2. Delete a name\n");
  printf("3. List the file\n");
  printf("4. Save the file\n");
  printf("5. Load the file\n");
  printf("6. Quit\n");
  do {
    printf("\nEnter your choice: \n");
    gets(s);
    c = atoi(s);
  } while(c<0 || c>6);
  return c;
}

//输入一个通讯录的条目
void enter(void)
{
  int slot;
  char s[80];

  slot = find_free();

  if(slot==-1) {
    printf("\nList Full");
    return;
  }

  printf("Enter name: ");
  gets(addr_list[slot].name);

  printf("Enter street: ");
  gets(addr_list[slot].street);

  printf("Enter city: ");
  gets(addr_list[slot].city);

  printf("Enter state: ");
  gets(addr_list[slot].state);

  printf("Enter zip: ");
  gets(s);
  addr_list[slot].zip = strtoul(s, '\0', 10);//
}

//搜寻一个空白的条目
int find_free(void)
{
  register int t;

  for(t=0; addr_list[t].name[0] && t<MAX; ++t) ;

  if(t==MAX)
      return -1; //到达MAX则本通讯录所有条目已经耗尽,没有空白了

  return t;
}

//删除一个通讯录条目
void delete(void)
{
  register int slot;
  char s[80];

  printf("enter record #: ");
  gets(s);
  slot = atoi(s);

  if(slot>=0 && slot < MAX)
    addr_list[slot].name[0] = '\0';
}

//在屏幕上显示所有的通讯录条目
void list(void)
{
  register int t;

  for(t=0; t<MAX; ++t) {
    if(addr_list[t].name[0]) {
      printf("%s\n", addr_list[t].name);
      printf("%s\n", addr_list[t].street);
      printf("%s\n", addr_list[t].city);
      printf("%s\n", addr_list[t].state);
      printf("%lu\n\n", addr_list[t].zip);
    }
  }
  printf("\n\n");
}

//将内存中的通讯录保存到磁盘
void save(void)
{
  FILE  *fp;
  register int i;

  if((fp=fopen("maillist", "wb"))==NULL) {
    printf("Cannot open file.\n");
    return;
  }

  for(i=0; i<MAX; i++)
    if(*addr_list[i].name)
      if(fwrite(&addr_list[i],
         sizeof(struct addr), 1, fp)!=1)
           printf("File write error.\n");

  fclose(fp);
}

//从磁盘文件里读取保存的通讯录条目信息
void load(void)
{
  FILE  *fp;
  register int i;

  if((fp=fopen("maillist", "rb"))==NULL) {
    printf("Cannot open file.\n");
    return;
  }

  init_list();
  for(i=0; i<MAX; i++)
    if(fread(&addr_list[i],
       sizeof(struct addr), 1, fp)!=1) {
         if(feof(fp)) break;
         printf("File read error.\n");
    }

  fclose(fp);
}




  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值