C语言程序设计--通讯录

通讯录管理系统

本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和单链表的各种基本操作。本程序中涉及结构体、单链表、文件等方面的知识。通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,掌握利用单链表存储结构实现对学生通讯录管理的原理,为进一步开发出高质量的管理信息系统打下坚实的基础。

  1. 问题定义与描述

1.1问题定义

创建一个学生通讯录管理系统。系统中每个学生信息包括学号、姓名、性别、出生日期、家庭地址、学号、电话、QQ。程序的运行效果如下图所示,选择任意菜单后,实现相应功能。

图1.1  学生通讯录管理系统功能需求

1.2问题描述

在问题定义与描述阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。

2、系统设计

 总体设计

采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。

2.1主要功能模块

添加:添加通讯录记录。

显示:显示通讯录记录。

删除:删除通讯录记录。

查询:查询通讯录记录。

修改:修改通讯录记录。

保存:将信息保存到文件。

2.2数据结构设计

                                                         

结构体

s struct addr             /*通讯地址结构定义*/

{   char post_num[10];  /*邮编*/

    char addr[40];      /*家庭地址*/

};

struct birth      /*出生年月结构定义*/

{   int year;     /*年份*/

    int month;    /*月份*/

    int day;      /*日期*/

};

struct friend1     /*电子通讯录结构定义*/

{   int number;       /*序号*/

    char name[20];     /*姓名*/

    char sex;             /*性别*/

    struct birth birth;   /*出生年月*/

    struct addr addr;     /*通信地址*/

    char telephone[13];   /*联系电话*/

}friends[50];

FILE *fp;

int i;

2.3输入记录模块

输入记录模块主要实现将数据存入结构体中。,用户应选择2,调用Data_Inpu ()函数,进行朋友姓名、电话、地址、性别的输入,即完成在结构体中添加记录的操作。

2.4查询记录模块

查询记录模块主要实现了在结构体中按姓名查找满足相关条件的信息记录。在查询函数search()中,找到相同名字则打印出记录。

2.5删除记录模块

该操作完成删除指定姓名的记录,

输入要删除的序号,输入后调用函数若找到该记录,询问是否继续寻找相同姓名的记录。

2.6显示所有记录模块

该操作完成显示所有记录信息,它分两步完成。

第一步,按照数组中序号进行排序。

第二步,逐条显示出来。

3、系统实现

#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<dos.h>
struct addr             /*通讯地址结构定义*/
{   char post_num[10];  /*邮编*/
    char addr[40];      /*家庭地址*/
};
struct birth      /*出生年月结构定义*/
{   int year;     /*年份*/
    int month;    /*月份*/
    int day;      /*日期*/
};
struct friend1     /*电子通讯录结构定义*/
{   int number;       /*序号*/
    char name[20];     /*姓名*/
    char sex;             /*性别*/
    struct birth birth;   /*出生年月*/
    struct addr addr;     /*通信地址*/
    char telephone[13];   /*联系电话*/
}friends[50];
FILE *fp;
int i;


void Data_Load()
{   int j;
    long k;
    fp=fopen("friend.txt","r+t");   /*打开文件friend.txt*/
    if(fp!=NULL)
    {   for(i=1;i<50;i++)
 {   j=fgetc(fp);
     if(j==EOF)    /*判断是否到了文件尾*/
               return;
     k=i-1;
     fseek(fp,k*sizeof(struct friend1),SEEK_SET);
     fread(&friends[i],sizeof(struct friend1),1,fp);/*从文件中读取一条记录*/
         }
    }
    else
    {   fp=fopen("friend.txt","w");
        i=1;
    }
}

void Data_Show(int j)    /*打印记录的详细资料*/
{
    printf("\n\n\tNo:%3d\n",friends[j].number);
    printf("\n\tBirthday(y/m/d):%4d%2d%2d",friends[j].birth.year,friends[j].birth.month,friends[j].birth.day);
    printf("\n\tPostnum:%-10s",friends[j].addr.post_num);
    printf("\n\taddress:%-40s",friends[j].addr.addr);
    printf("\n\tTele%-13s",friends[j].telephone);
}

void Data_Input(int j)    /*记录插入函数*/
{
    fflush(stdin);
    friends[j].number=j;
    printf("\n\n\n\tNo %d record",j);
    printf("\n\n\tName:");      /*读入姓名*/
    scanf("%s",friends[j].name);
    fflush(stdin);
    printf("\n\tSex(m/f):");    /*读入性别*/
    scanf("%c",&friends[j].sex);
    printf("\n\t---birthday---");   /*读入出生年月*/
    printf("\n\tyear:");
    scanf("%d",&friends[j].birth.year);
    printf("\n\t\tmonth:");
    scanf("%d",&friends[j].birth.month);
    printf("\n\t\tday:");
    scanf("%d",&friends[j].birth.day);
    printf("\n\tPost_number:");   /*读入邮编*/
    scanf("%s",friends[j].addr.post_num);
    printf("\n\tAddress:");    /*读入家庭地址*/
    scanf("%s",friends[j].addr.addr);
    printf("\n\ttelephone:");    /*读入联系电话*/
    scanf("%s",friends[j].telephone);
    printf("y/n");

     if( getch()=='n')
    main();
}

void Data_Save()
{
    int j;
    fp=fopen("friend.txt","w");
    for(j=1;j<=i;j++)
    {   fwrite(&friends[j],sizeof(struct friend1),1,fp);
    }
}

void main()
{
    int j,k;
    char ch;
    char *search_name;
    clrscr();
    Data_Load();
    i--;
    do
    {   printf("\n\n\n\tFunction choose:");
        printf("\n\t1.Read");
        printf("\n\t2.Append");
        printf("\n\t3.Delete");
        printf("\n\t4.Search");
        printf("\n\t5.Insert");
        printf("\n\t6.Save and Exit");
        printf("\n\t7.Quit");
        printf("\n\n");
        printf("\tChoice:");
        ch=getche();
        switch(ch)
        {   case '1': j=1;     /*显示通讯录中的所有记录*/
             while(getch()!=0x1b&&j<=i) Data_Show(j++);
             if(j>i) printf("\n\tEnd of e_note\n");
                break;
            case '2':          /*增加通讯录中的记录*/
              while(getch()!=0x1b&&i<50)
              {   i++;
                Data_Input(i);
              }
              if(i==50)printf("\n\te_note is filled\n");
                  break;
            case '3':           /*删除通讯录中的记录*/
              if(i<1)
              {   printf("\n\tNo records\n");
                  break;
              }
              printf("\n\tDelete No:");    /*读入删除位置*/
              scanf("%d",&k);
              for(j=k;j<i;j++)   /*删除位置前的元素顺序前移*/
              {   strcpy(friends[j].name,friends[j+1].name);
                  friends[j].sex=friends[j=1].sex;
                  friends[j].birth.year=friends[j+1].birth.year;
                  friends[j].birth.month=friends[j+1].birth.month;
                  friends[j].birth.day=friends[j+1].birth.day;
                  strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);
                  strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
                  strcpy(friends[j].telephone,friends[j+1].telephone);
              }
              i--;      /*元素总数减1*/
              break;
            case '4':      /*通讯录查询功能*/
              printf("\n\tPlease input name:");
              gets(search_name);
              for(j=1;j<=i;j++)
              {
                  if(strcmp(search_name,friends[j].name)==0)  /*比较字符串*/
                  {   Data_Show(j);  /*查询成功,打印记录结束循环*/
                       break;
                  }

              }
              if(j>1)     /*查询失败*/
              printf("\n\t No such records")  ;



 文章借鉴于此纷传

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值