C语言课程设计实验报告

中南大学

二○一三~二○一四学年第一学期

信息科学与工程学院

程序设计基础实践

设计报告

课程名称:       程序设计基础实践       

班    级:    20##信息安全1302    

学    号:         0906130221           

姓    名:           张振宇            

指导教师:            杨希              

二○##年 十二 月

目录

一、需求分析... 3

二、总体设计... 4

1.设计环境.... 4

2.基本要求.... 4

3.设计步骤.... 4

三、详细设计... 5

1.算法分析.... 5

2.设计流程图.... 5

3.我的任务.... 5

四、调试与测试... 8

五、本次课程设计的心得体会... 12

六、附录... 12

一、需求分析

通过课程设计使学生综合使用所学过的C语言程序设计知识,掌握结构化程序设计的基本思路和方法,在所掌握的基本知识和技能的基础上,进一步提高自学能力和查找资料的能力,解决一定程度的复杂的结构化程序设计问题,加深对所学知识的理解与掌握,增强学生利用自己所学知识解决实际问题的能力,为以后的程序开发打下基础。

课程设计的目的和要求:

1、使学生巩固和加强《C语言程序设计》课程的理论知识。

2、使学生掌握C语言的基本概念、语法、语义和数据类型的使用特点。

3、使学生掌握C语言程序设计的方法及编程技巧,能正确使用C语言编写程序。

4、进一步理解和运用结构化程序设计的思想和方法;学会利用传统流程图或N-S图表示算法。

5、使学生掌握调试程序的基本方法及上机操作方法。

6、掌握书写程序设计开发文档的能力,使学生学会撰写课程设计总结报告。课程设计的思想和方法还可以作为学生做毕业论文时的参考资料。

7、通过查阅手册和文献资料,培养学生独立分析问题和解决问题的能力。为学生做毕业设计打好基础。

8、初步掌握开发一个小型实用系统的基本方法:结合实际应用的要求,使课程设计既覆盖知识点,又接近工程实际需要。通过激发学习兴趣,调动学生主动学习的积极性,并引导他们根据实际编程要求,训练自己实际分析问题的能力及编程能力,并养成良好的编程习惯。

9、培养学生的创新能力和创新思维。学生可以根据指导书和相关文献上的参考算法,自己设计出相应的应用程序。

10、培养学生良好的程序设计风格。在实际编程中,为了提高编程质量,对空行、空格和注释均有要求。学生在课程设计书写代码时,应该严格按要求处理,以便建立良好的程序设计风格。

11、课程设计题目及内容

员工通讯管理系统:

通讯录信息为:姓名、地址、单位、固定电话、移动手机、分类(包括同事、朋友、同学、家人等)、EMAIL、QQ等。

1.  通讯录的增加;

2.  通讯录的修改、删除;

3.  按姓名、电话、QQ查询;

4.  通讯录的排序;

5.  分类统计;

6.  通讯录输出。

二、总体设计

1.设计环境

⑴硬件:一般PC机。

⑵软件:操作系统为WindowsXP或Windows2000,设计语言为Visual C++或Turbo C2.0。

2.基本要求

⑴课程设计题目可以协商合作,但每名同学必须完成每个功能函数,甚至每条语句的作用。只有了解了整个程序设计思路,每个函数、设置每条语句的作用,才达到开“计算机与程序设计语言”这门课的目的。

⑵由于上机时间有限,要求在没上机时事先写好代码,再在上机时进行调试。

⑶要求利用结构化程序设计方法以及C的编程思想来完成系统的设计;

⑷要求有欢迎界面、命令选择菜单、录入的数据保存在文件中,对数据的操作通过链表(每条记录保存在一个节点中(每个节点是一个结构体类型的数据),将节点链接在一起构成链表)、数组、结构体等数据结构实现;

⑸模块化程序设计:要求在设计的过程中,按功能定义函数或书写多个源程序文件,按照从顶向下逐步细化的模块化原则进行程序设计,各个功能模块用函数的形式来实现;

⑹学生所选课题必须上机通过,并获得满意的结果;

3.设计步骤

⑴根据问题描述,设计数据存储方式;

⑵分析系统功能,划分功能模块,确定各模块函数名称;

⑶主程序算法设计和各模块算法设计;

⑷编程实现;

⑸调试和测试;

三、详细设计

1.算法分析

以上所给的课程设计的题目,每一个对象都包括多个属性。所以要考虑数据的存储形式要用结构体类型来实现。首先,应该考虑定义一个结构,其次,我们应该考虑数据的存储形式:是定义一个数组来存储,还是定义一个链表呢?在这里假如我们以数组的方式来存储,当然可以,但是我们知道,假如我们定义一个数组的话,我们首先必须知道学生人数大概是多少,以便我们确定数组的大小,但是题目中没有给出,而且题目要求中有大量的删除、插入操作,所以用链表的方式比较方便。

对于菜单的实现,首先我们用printf函数把程序的功能列出来,然后等待用户选择而执行不同的函数,执行完了一个功能后又回到菜单。保存数据要通过文件来实现。

2.设计流程图

文本框: 创建联系人,文本框: 按照名字排序,文本框: 删除,文本框: 打开,文本框: 退出,文本框: 保存,文本框: 查找,文本框: 综合操作,文本框: 显示,文本框: 修改,文本框: 增加,文本框: 退出 


3.我的任务

在简单的分工之后,我的任务是完成通讯录的排序,因为主题是用链表来实现通讯录之间的连接,而链表是不好直接进行排序的,所以我想到了数组。即把链表中指针指向的内容赋给一个数组,利用我们学到的冒泡排序法对其进行排序,排序结束之后重新赋回去。

思路虽然听起来很简单,但是在实际操作起来总存在这样那样的错误,比如说变量名不统一等合作性问题,而由于链表不是授课内容,不能很好的掌握,在写的过程中总是出现考虑不周全的情况。但是在百度的帮助下和不懈的努力下,在预期时间完成了我的任务并且还参与了最终程序的合并调试。

struct address_list *paixu(struct address_list *head)

{

    struct address_list *p1,*p2;

    int i,j;

    struct address_list1

    {

        char name[30];     //名字

        char work[50];     //单位

        char handset[30];  //手机

        char phone[30];    //固定电话

        char email[30];    //电子邮件

        char address[30];  //通讯地址

        char QQ[20];       //QQ

        int t;             //类别标记

        char fenlei[30];   //分类

    };

    struct address_list1 px[200];

    struct address_list1 temp;

    if(head==NULL)

    {

        printf("通讯录为空,无法排序!\n");

        return(head);

    }

    p1=head;

    for(i=0;i<n,p1!=NULL;i++)

    {

        strcpy(px[i].name,p1->name);

        strcpy(px[i].work,p1->work);

        strcpy(px[i].handset,p1->handset);

        strcpy(px[i].phone,p1->phone);

        strcpy(px[i].email,p1->email);

        strcpy(px[i].address,p1->address);

        strcpy(px[i].QQ,p1->QQ);

        px[i].t=p1->t;

        strcpy(px[i].fenlei,p1->fenlei);

        p2=p1;

        p1=p1->next;

    }

    head=shifang(head);

    for(j=0;j<n-1;j++)

    {

        for(i=j+1;i<n;i++)

        {

            if(strcmp(px[i].name,px[j].name)<0)

            {

                temp=px[i];

                px[i]=px[j];

                px[j]=temp;

            }

        }

    }

    p1=(struct address_list *)malloc(LEN);

    p2=p1;

    strcpy(p1->name,px[0].name);

    strcpy(p1->work,px[0].work);

    strcpy(p1->handset,px[0].handset);

    strcpy(p1->phone,px[0].phone);

    strcpy(p1->email,px[0].email);

    strcpy(p1->address,px[0].address);

    strcpy(p1->QQ,px[0].QQ);

    p1->t=px[0].t;

    strcpy(p1->fenlei,px[0].fenlei);

    head=p1;

    for(i=1;i<n;i++)

    {

        p1=(struct address_list *)malloc(LEN);

        strcpy(p1->name,px[i].name);

        strcpy(p1->name,px[i].name);

        strcpy(p1->work,px[i].work);

        strcpy(p1->handset,px[i].handset);

        strcpy(p1->phone,px[i].phone);

        strcpy(p1->email,px[i].email);

        strcpy(p1->address,px[i].address);

        strcpy(p1->QQ,px[i].QQ);

        p1->t=px[i].t;

        strcpy(p1->fenlei,px[i].fenlei);

        p2->next=p1;

        p2=p1;

    }

    p2->next=NULL;

    printf("按姓名排序后为:\n");

    print(head);

    return(head);

}

四、调试与测试

一、主页面

二、创建通讯录

1、输入信息

2、创建成功后自动输出所有信息

三、 按照名字排序

四、综合操作

1、综合操作主页面

2、分类显示

五、保存

六、打开

七、删除

五、本次课程设计的心得体会

该程序的新颖性在于结构体和文件的使用上,这两个章节都是老师在课堂上没有讲过的,因此也是在不断的实践,不断的调试中实现的。结构体和文本的使用保证了这个程序可以存储大量的信息。该程序具备一个基本的员工通讯录所需要的功能。我不仅巩固《C语言程序设计》课程学习的内容,掌握设计的基本方法,强化上机动手能力,还进一步掌握以下了知识:数据类型、分支控制、循环控制、函数的定义及调用、结构体及数组、指针、文件操作、编译预处理等;通过课程设计,掌握了程序的局部测试、调试方法,建立程序系统调试、测试的基本概念和思想,学会较大程序的系统测试和调试方法。

团队精神不可少,分工合作也是必须的,身为组长就要以身作则,带领好小组,做好各项工作。在开始,对本组人员进行整理,分析其特点,再分配任务,然后进行综合应用,最后对所需资料及要编的程序进行整理得出最后程序。 

通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

六、附录

【源程序】

#include <stdio.h>

#include <malloc.h>  //得到指向大小为Size的内存区域的首字节的指针//

#include <string.h>

#include <stdlib.h>  //标准库函数//

#define NULL 0

#define LEN sizeof(struct address_list)  //计算字节//

int n;

struct address_list

{

    char name[30];     //名字

    char work[50];     //单位

    char handset[30];  //手机

    char phone[30];    //固定电话

    char email[30];    //电子邮件

    char address[30];  //通讯地址

    char QQ[20];       //QQ

    int t;             //类别标记

    char fenlei[30];   //分类

    struct address_list *next;

};

struct address_list *shifang(struct address_list *head); // 释放内存函数声明

//创建函数,不带头结点的链表

struct address_list *creat(void)

{

    struct address_list *head,*p1,*p2;

    char name[20];

    n=0;

    p1=(struct address_list *)malloc(LEN);

    p2=p1;   //强制内存转换

    printf("请输入通讯录的内容!\n姓名输入为0时表示创建完毕!\n");

    printf("请输入姓名:");

    gets(name);

    if(strcmp(name,"0")!=0)

    {

        strcpy(p1->name,name);

        printf("请输入单位:");     gets(p1->work);

        printf("请输入手机:");     gets(p1->handset);

        printf("请输入固定电话:"); gets(p1->phone);

        printf("请输入电子邮件:"); gets(p1->email);

        printf("请输入QQ号码:"); gets(p1->QQ);

        printf("请输入通讯地址:");  gets(p1->address);

        printf("请输入分类(1.同事  2.朋友  3.同学  4.家人 5.其他):"); scanf("%d",&p1->t);

        switch(p1->t)

         {

           case 1:strcpy(p1->fenlei,"同事"); break;

           case 2:strcpy(p1->fenlei,"朋友"); break;

           case 3:strcpy(p1->fenlei,"同学"); break;

           case 4:strcpy(p1->fenlei,"家人"); break;

           case 5:strcpy(p1->fenlei,"其他"); break;

         }

        head=NULL;

        while(1)

        {

            n=n+1;   //记录通讯录人数个数

            if(n==1)

                head=p1;

            else

                p2->next=p1;

            p2=p1;

            printf("请输入姓名:");    scanf("%s",name);

            if(strcmp(name,"0")==0)

            {

                break;

            }

            else

            {

                p1=(struct address_list *)malloc(LEN);

                strcpy(p1->name,name);

                printf("请输入单位:");    scanf("%s",&p1->work);

                printf("请输入手机:");     scanf("%s",&p1->handset);

                printf("请输入固定电话:"); scanf("%s",&p1->phone);

                printf("请输入电子邮件:"); scanf("%s",&p1->email);

                printf("请输入QQ号码:"); scanf("%s",&p1->QQ);

                printf("请输入通讯地址:");  scanf("%s",&p1->address);

                printf("请输入分类(1.同事  2.朋友  3.同学  4.家人 5.其他):"); scanf("%d",&p1->t);

                 switch(p1->t)

                  {

                   case 1:strcpy(p1->fenlei,"同事"); break;

                   case 2:strcpy(p1->fenlei,"朋友"); break;

                   case 3:strcpy(p1->fenlei,"同学"); break;

                   case 4:strcpy(p1->fenlei,"家人"); break;

                   case 5:strcpy(p1->fenlei,"其他"); break;

                   }

            }

        }

        p2->next=NULL;

        return head;

    }

    else

        return 0;

}

//输出函数

void print(struct address_list *head)

{

    struct address_list *p;

    if(head!=NULL)

    {

        p=head;

        printf("本通讯录现在共有%d人:\n",n);

        printf("---姓名-------单位--------手机-------固定电话-------Email--------QQ--------通讯地址--------类别--\n");

        printf("==================================\n");

        do

        {

            printf("== %s",p->name); printf("       ");

            printf("%s",p->work); printf("       ");

            printf("%s",p->handset); printf("       ");

            printf("%s",p->phone); printf("       ");

            printf("%s",p->email); printf("       ");

            printf("%s",p->QQ); printf("       ");

            printf("%s",p->address); printf("       ");

            printf("%s",p->fenlei); printf("      \n");

            p=p->next;

        }while(p!=NULL);

        printf("==================================\n");

    }

    else

        printf("通讯录为空,无法输出!\n");

}

//增加函数

struct address_list *insert(struct address_list *head)

{

    struct address_list *p0,*p1,*p2;

    char name[20];

    p1=head;

    printf("请输入增加的内容:\n");

    printf("请输入姓名:"); gets(name);

    if(strcmp(name,"0")==0)

    {

        printf("姓名不能为0,增加失败!\n");

        return(head);

    }

    else

    {

        p0=(struct address_list *)malloc(LEN);

         strcpy(p0->name,name);

         printf("请输入单位:");     gets(p0->work);

         printf("请输入手机:");     gets(p0->handset);

         printf("请输入固定电话:"); gets(p0->phone);

         printf("请输入电子邮件:"); gets(p0->email);

         printf("请输入QQ号码:"); gets(p0->QQ);

         printf("请输入通讯地址:");  gets(p0->address);

         printf("请输入分类(1.同事  2.朋友  3.同学  4.家人 5.其他):"); scanf("%d",&p0->t);

         switch(p0->t)

              {

                   case 1:strcpy(p0->fenlei,"同事"); break;

                   case 2:strcpy(p0->fenlei,"朋友"); break;

                   case 3:strcpy(p0->fenlei,"同学"); break;

                   case 4:strcpy(p0->fenlei,"家人"); break;

                   case 5:strcpy(p0->fenlei,"其他"); break;

               }

        n=n+1;

        if(head==NULL)

        {

            head=p0;

            p0->next=NULL;

            return head;

        }

        else

        {

            while(strcmp(p0->name,p1->name)>0&&(p1->next!=NULL))

            {

                p2=p1;

                p1=p1->next;

            }

            if(strcmp(p0->name,p1->name)<0 || strcmp(p0->name,p1->name)==0)

            {

                if(head==p1)

                {

                    head=p0;

                }

                else

                {

                    p2->next=p0;

                }

                p0->next=p1;

            }

            else

            {

                p1->next=p0;

                p0->next=NULL;

            }

            return head;

        }

    }

}

struct address_list* delete_txl(struct address_list *head)

{

    struct address_list *p,*q;

    char name[30];

    if(head==NULL)

    {

        printf("通讯录为空,无法显示!\n");

        return head;

    }

    p=head;

    printf("请输入需要删除的人的姓名:");

    gets(name);

    if(strcmp(head->name,name)==0)

    {

        head=head->next;

        free(p);

        printf("删除操作成功!\n");

        return head;

    }

    else

    {

        q=head,p=head->next;

        while(p!=NULL)

        {

            if(strcmp(p->name,name)==0)

            {

                q->next=p->next;

                free(p);

                printf("删除操作成功!\n");

                return head;

            }

            p=p->next;

            q=q->next;

        }

    }

}

//显示函数

struct address_list *display(struct address_list *head)

{

    struct address_list *p1,*p2;

    char name[30];

    int m;

    if(head==NULL)

    {

        printf("通讯录为空,无法显示!\n");

        return head;

    }

    p1=head;

    m=0;

    printf("请输入需要显示人的姓名:");

    gets(name);

    while(p1!=NULL)

    {

        while((strcmp(p1->name,name))!=0 && p1->next!=NULL)

        {

            p2=p1;

            p1=p1->next;

        }

        if(strcmp(p1->name,name)==0)

        {

            m++;

            printf("%s的通讯内容如下:\n",name);

            printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址----类别--\n");

            printf("==================================\n");

            printf("== %s",p1->name); printf("   ");

            printf("%s",p1->work); printf("   ");

            printf("%s",p1->handset); printf("   ");

            printf("%s",p1->phone); printf("   ");

            printf("%s",p1->email); printf("   ");

            printf("%s",p1->QQ); printf("   ");

            printf("%s",p1->address); printf("   ");

            printf("%s",p1->fenlei); printf("   ");

            printf("==================================\n");

        }

        p1=p1->next;

    }

    if(m==0)

    {

        printf("此人未在本通讯录中!\n");

    }

    return(head);

}

//排序函数

struct address_list *paixu(struct address_list *head)

{

    struct address_list *p1,*p2;

    int i,j;

    struct address_list1

    {

        char name[30];     //名字

        char work[50];     //单位

        char handset[30];  //手机

        char phone[30];    //固定电话

        char email[30];    //电子邮件

        char address[30];  //通讯地址

        char QQ[20];       //QQ

        int t;             //类别标记

        char fenlei[30];   //分类

    };

    struct address_list1 px[200];

    struct address_list1 temp;

    if(head==NULL)

    {

        printf("通讯录为空,无法排序!\n");

        return(head);

    }

    p1=head;

    for(i=0;i<n,p1!=NULL;i++)

    {

        strcpy(px[i].name,p1->name);

        strcpy(px[i].work,p1->work);

        strcpy(px[i].handset,p1->handset);

        strcpy(px[i].phone,p1->phone);

        strcpy(px[i].email,p1->email);

        strcpy(px[i].address,p1->address);

        strcpy(px[i].QQ,p1->QQ);

        px[i].t=p1->t;

        strcpy(px[i].fenlei,p1->fenlei);

        p2=p1;

        p1=p1->next;

    }

    head=shifang(head);

    for(j=0;j<n-1;j++)

    {

        for(i=j+1;i<n;i++)

        {

            if(strcmp(px[i].name,px[j].name)<0)

            {

                temp=px[i];

                px[i]=px[j];

                px[j]=temp;

            }

        }

    }

    p1=(struct address_list *)malloc(LEN);

    p2=p1;

    strcpy(p1->name,px[0].name);

    strcpy(p1->work,px[0].work);

    strcpy(p1->handset,px[0].handset);

    strcpy(p1->phone,px[0].phone);

    strcpy(p1->email,px[0].email);

    strcpy(p1->address,px[0].address);

    strcpy(p1->QQ,px[0].QQ);

    p1->t=px[0].t;

    strcpy(p1->fenlei,px[0].fenlei);

    head=p1;

    for(i=1;i<n;i++)

    {

        p1=(struct address_list *)malloc(LEN);

        strcpy(p1->name,px[i].name);

        strcpy(p1->name,px[i].name);

        strcpy(p1->work,px[i].work);

        strcpy(p1->handset,px[i].handset);

        strcpy(p1->phone,px[i].phone);

        strcpy(p1->email,px[i].email);

        strcpy(p1->address,px[i].address);

        strcpy(p1->QQ,px[i].QQ);

        p1->t=px[i].t;

        strcpy(p1->fenlei,px[i].fenlei);

        p2->next=p1;

        p2=p1;

    }

    p2->next=NULL;

    printf("按姓名排序后为:\n");

    print(head);

    return(head);

}

//姓名查找函数

struct address_list *search(struct address_list *head)

{

    struct address_list *p1,*p2;

    int m;

    char name[30];

    if(head==NULL)

    {

        printf("通讯录为空,无法分类查找!\n");

        return(head);

    }

    p1=head;

    printf("********************\n");

    printf("**  请输入需要查找的姓名  **\n");

    printf("********************\n");

    m=0;

    gets(name);

    while(p1!=NULL)

    {

        while(strcmp(p1->name,name)!=0&&p1->next!=NULL)

        {

            p2=p1;

            p1=p1->next;

        }

        if(strcmp(p1->name,name)==0)

        {

            m++;

            printf("你查找的内容是:\n");

            printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");

            printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址----类别--\n");

            printf("    %s        %s        %s        %s        %s         %s         %s         %s\n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->QQ,p1->address,p1->fenlei);

printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");

        }

        p1=p1->next;

        if(m==0)

        {

            printf("此人未在本通讯录中!\n");

        }

        break;

    }

    return(head);

}

//分类显示

struct address_list *classfy(struct address_list *head)

{

    struct address_list *p1;

    int m;

    int kind;

    if(head==NULL)

    {

        printf("通讯录为空,无法分类统计!\n");

        return(head);

    }

    p1=head;

    printf("********************\n");

    printf("**  请输入分类(1.同事  2.朋友  3.同学  4家人 5.其他) **\n");

       scanf("%d",&kind);

    printf("********************\n");

    m=0;

    printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址---\n");

    while(p1!=NULL)

    {

        while(kind!=p1->t&&p1!=NULL)

        {

            p1=p1->next;

        }

        if(kind==p1->t)

        {

            m++;

            printf("\n");

            printf("%s    %s   %s    %s    %s    %s    %s \n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->address,p1->QQ);

        }

        p1=p1->next;

        if(m==0)

        {

            printf("没有任何人在该分类中!\n");

            break;

              }

  

    }

    printf("该分类中共 %d 人",m);

printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");

    return(head);

}

//释放内存函数

struct address_list *shifang(struct address_list *head)

{

    struct address_list *p1;

    while(head!=NULL)

    {

        p1=head;

        head=head->next;

        free(p1);

    }

    return(head);

}

//文件写入函数

void save(struct address_list *head)

{

    FILE *fp;

    struct address_list *p1;

    char tong[30];

    if(head==NULL)

    {

        printf("通讯录为空,无法存储!\n");

        return;

    }

    printf("请输入保存后的文件名:");

    gets(tong);

    fp=fopen("(tong).txt","w");

    if(fp==NULL)

    {

        printf("cannot open file\n");

        return;

    }

    p1=head;

    fprintf(fp,"姓名    单位      手机    固定电话  Email     QQ     通讯地址    类别\n");

    for(;p1!=NULL;)

    {

    fprintf(fp,"%s    %s    %s       %s       %s        %s       %s    %s\n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->QQ,p1->address,p1->fenlei);

        p1=p1->next;

    }

    printf("保存完毕!\n");

    fclose(fp);

}

//文件读出函数

struct address_list *load(struct address_list *head)

{

    FILE *fp;

    char tong[30];

    struct address_list *p1,*p2;

    printf("请输入要输出的文件名:");

    gets(tong);

    fp=fopen("(tong).txt","r");

    if(fp==NULL)

    {

        printf("此通讯录名不存在,无法输出!\n");

        return(head);

    }

    else

    {

        head=shifang(head);

    }

    p1=(struct address_list *)malloc(LEN);

    fscanf(fp,"%s%s%s%s%s",&p1->name,&p1->work,&p1->handset,&p1->email,&p1->address);

    if(feof(fp)!=0)

    {

        printf("文件为空,无法打开!\n");

        return(head);

    }

    else

    {

        rewind(fp);

        p2=p1;

        head=p1;

        n=0;

        while(feof(fp)==0)

        {

            fscanf(fp,"%s%s%s%s%s%s%s%s",&p1->name,&p1->work,&p1->handset,&p1->phone,&p1->email,&p1->QQ,&p1->address,&p1->fenlei);

            if(feof(fp)!=0)

                break;

            p2->next=p1;

            p2=p1;

            p1=(struct address_list *)malloc(LEN);

            n=n+1;

        }

        p2->next=NULL;

        p1=head;

        head=head->next;

        n=n-1;

        free(p1);

        print(head);

        printf("打开完毕!\n");

        return(head);

    }

    fclose(fp);

}

//手机查找

struct address_list *posearch(struct address_list *head)

{

    struct address_list *p1,*p2;

    int m;

    char handset[30];

    if(head==NULL)

    {

        printf("通讯录为空,无法分类查找!\n");

        return(head);

    }

    p1=head;

    printf("********************\n");

    printf("**  请输入需要查找的手机  **\n");

    printf("********************\n");

    m=0;

    gets(handset);

    while(p1!=NULL)

    {

        while(strcmp(p1->handset,handset)!=0&&p1->next!=NULL)

        {

            p2=p1;

            p1=p1->next;

        }

        if(strcmp(p1->handset,handset)==0)

        {

            m++;

            printf("你查找的内容是:\n");

            printf("+++++++++++++++++++++++++++++++++++\n");

            printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址----类别--\n");

            printf("    %s        %s        %s        %s        %s         %s         %s         %s\n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->QQ,p1->address,p1->fenlei);

            printf("+++++++++++++++++++++++++++++++++++\n");

        }

        p1=p1->next;

        if(m==0)

        {

            printf("此人未在本通讯录中!\n");

        }

        break;

    }

    return(head);

}

//修改

struct address_list *xiugai(struct address_list *head)

{

       struct address_list *p1,*p2;

       int i,m=0,k,kind=0;

    char name[30];

    if(head==NULL)

    {

        printf("通讯录为空,无法修改!\n");

        return(head);

    }

    p1=head;

    printf("********************\n");

    printf("**  请输入需要修改联系人的姓名  **\n");

    printf("********************\n");

    gets(name);

    while(1)

    {

        while(strcmp(p1->name,name)!=0&&p1->next!=NULL)

        {

            p2=p1;

            p1=p1->next;

        }

        if(strcmp(p1->name,name)==0)

        {

            m++;

            printf("你所要修改的联系人是:\n");

            printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");

            printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址----类别--\n");

printf("    %s        %s        %s        %s        %s         %s         %s         %s\n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->QQ,p1->address,p1->fenlei);

            printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");

        }

        p1=p1->next;

        if(m==0||p1->next==NULL)

        {

            printf("此人未在本通讯录中!\n");

            break;

        }

          printf("请输入你所需要修改的信息:1:姓名  2职业  3手机  4电话  5邮箱  6QQ  7分类,完成后请输入");

           scanf("%d",&k);

           switch(k)

         {

           case 0:break;

           case 1:scanf("%s",p1->name); break;

           case 2:scanf("%s",p1->work); break;

           case 3:scanf("%s",p1->handset); break;

           case 4:scanf("%s",p1->phone); break;

           case 5:scanf("%s",p1->email); break;

           case 6:scanf("%s",p1->QQ); break;

           case 7:scanf("%d",&p1->t);printf("请输入分类(1.同事  2.朋友  3.同学  4.家人 5.其他):");scanf("%d",&kind);break;

         }

           switch(kind)

           {

              case 0:break;

             case 1:strcpy(p1->fenlei,"同事"); break;

             case 2:strcpy(p1->fenlei,"朋友"); break;

             case 3:strcpy(p1->fenlei,"同学"); break;

             case 4:strcpy(p1->fenlei,"家人"); break;

             case 5:strcpy(p1->fenlei,"其他"); break;

           }

       break;

    }

    return (head);

}

//QQ 查找

struct address_list *qqsearch(struct address_list *head)

{

    struct address_list *p1,*p2;

    int m;

    char qq[30];

    if(head==NULL)

    {

        printf("通讯录为空,无法分类查找!\n");

        return(head);

    }

    p1=head;

    printf("********************\n");

    printf("**  请输入需要查找的QQ  **\n");

    printf("********************\n");

    m=0;

    gets(qq);

    while(p1!=NULL)

    {

        while(strcmp(p1->QQ,qq)!=0&&p1->next!=NULL)

        {

            p2=p1;

            p1=p1->next;

        }

        if(strcmp(p1->QQ,qq)==0)

        {

            m++;

            printf("你查找的内容是:\n");

            printf("+++++++++++++++++++++++++++++++++++\n");

            printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址----类别--\n");

printf("    %s        %s        %s        %s        %s         %s         %s         %s\n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->QQ,p1->address,p1->fenlei);

            printf("+++++++++++++++++++++++++++++++++++\n");

        }

        p1=p1->next;

        if(m==0)

        {

            printf("此人未在本通讯录中!\n");

        }

        break;

    }

    return(head);

}

//综合操作函数

struct address_list *menu(struct address_list *head)

{

    char num[10];

    while(1)

    {

        printf("*********************\n");

        printf("*** 1 姓名查找      ****\n");

        printf("*** 2 按QQ查找      ****\n");

        printf("*** 3 按手机查找    ****\n");

        printf("*** 4 单个显示      ****\n");

        printf("*** 5 增加          ****\n");

        printf("*** 6 分类显示      ****\n");

        printf("*** 7 修改          ****\n");

        printf("*** 8 退出          ****\n");

        printf("*********************\n");

        printf("请输入您选择的操作:");

        gets(num);

        switch(*num)

        {

        case '1':

            {

                head=search(head);                          //姓名查找

            }

            break;

        case '2':

            {

                head=qqsearch(head);

            }

            break;

        case '3':

            {

                head=posearch(head);

            }

            break;

        case '4':

            {

                head=display(head);                          //显示

            }

            break;

        case '5':

            {

                head=insert(head);                           //增加

                print(head);

            }

            break;

        case '6':

            {

                head=classfy(head);   //分类

            }

                   break; 

              case '7':

                     {

                            head=xiugai(head);

                            print(head);

                break;

                     }

        case '8':

            return head;

        default:

            printf("操作错误,此项不存在!\n");

            break;

        }

        if(strcmp(num,"6")==0)

            break;

    }

    return head;

}

//主函数

int main()

{

    struct address_list *head=NULL;

    char num[10];

    printf("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");

    printf("*=*               程序说明                *=*\n");

    printf("*=*    请及时保存创建完毕的通讯录内容!    *=*\n");

    printf("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");

    while(1)

    {

        printf("************************\n");

        printf("***     1 创建通讯录      ****\n");

        printf("***     2 按名字排序      ****\n");

        printf("***     3 综合操作        ****\n");

        printf("***     4 保存            ****\n");

        printf("***     5 打开            ****\n");

        printf("***     6 删除            ****\n");

        printf("***     7 退出            ****\n");

        printf("************************\n");

        printf("请输入您选择的操作:");

        gets(num);

        switch(*num)

        {

        case '1':

            {

                if(head==NULL)

                {

                    head=creat();                                //创建

                    print(head);

                }

                else

                {

                    head=shifang(head);

                    head=creat();                                //重新创建

                    print(head);

                }

            }

            break;

        case '2':

            {

                head=paixu(head);                               //排序

            }

            break;

        case '3':

            {

                head=menu(head);

                                                   //综合操作

            }

            break;

        case '4':

            {

                save(head);                                   //文件保存

                print(head);

            }

            break;

        case '5':

            {

                head=load(head);                              //文件输出

            }

            break;

        case '6':

            {

                head=delete_txl(head);                           //删除

                print(head);

            }

            break;

        case '7':

            { head=shifang(head);

              break;

            }

        default:

            printf("操作错误,此项不存在!\n");

            break;

        }

        if(strcmp(num,"7")==0)

            break;

    }

  }

相关推荐