编程-我要写一个通讯录的程序,要有分组的功能,怎么实现比较好。

问题描述

我要写一个通讯录的程序,要有分组的功能,怎么实现比较好。

如题,用户可以自由添加或删除分组,一个人可以属于多个不同组

解决方案

要使用两个表:
表一、字段:排序,分组,姓名,性别,办公电话,移动电话,住宅电话,单位名称,职务.....,ID
表二、分组,各称,备注,ID

这样通过表二的分组,可以查找对应 表一的分组的信息。

编程,用什么语言均可,如果U盘可以使用的话,建议数据库使用ACCESS。

解决方案二:

 #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[30];     //职业
    char handset[30];  //手机
    char email[30];    //电子邮件
    char address[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->email);
        printf("请输入通讯地址:");  gets(p1->address);
        head=NULL;
        while(1)
        {
            n=n+1;   //记录通讯录人数个数
            if(n==1)
                head=p1;
            else
                p2->next=p1;
            p2=p1;
            printf("请输入姓名:");
            gets(name);
            if(strcmp(name,"0")==0)
            {
                break;
            }
            else
            {
                p1=(struct address_list *)malloc(LEN);
                strcpy(p1->name,name);
                printf("请输入职业:"); gets(p1->work);
                printf("请输入手机:"); gets(p1->handset);
                printf("请输入电子邮件:"); gets(p1->email);
                printf("请输入通讯地址:");  gets(p1->address);
            }
        }
        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-------通讯地址n");
        printf("==================================n");
        do
        {
            printf("== %s",p->name); printf("       ");
            printf("%s",p->work); printf("       ");
            printf("%s",p->handset); printf("       ");
            printf("%s",p->email); printf("       ");
            printf("%s",p->address); 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->email);
        printf("请输入通讯地址:");  gets(p0->address);
        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------通讯地址n");
            printf("==================================n");
            printf("== %s",p1->name);printf("       ");
            printf("%s",p1->work);printf("       ");
            printf("%s",p1->handset);printf("       ");
            printf("%s",p1->email);printf("       ");
            printf("%s",p1->address); printf("       n");
            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[30];
        char handset[30];
        char email[30];
        char address[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].email,p1->email);
        strcpy(px[i].address,p1->address);
        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->email,px[0].email);
    strcpy(p1->address,px[0].address);

    head=p1;
    for(i=1;i<n;i++)
    {
        p1=(struct address_list *)malloc(LEN);
        strcpy(p1->name,px[i].name);
        strcpy(p1->work,px[i].work);
        strcpy(p1->handset,px[i].handset);
        strcpy(p1->email,px[i].email);
        strcpy(p1->address,px[i].address);
        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("++ %s        %s       %s       %s        %sn",p1->name,p1->work,p1->handset,p1->email,p1->address);
            printf("+++++++++++++++++++++++++++++++++++n");
        }
        p1=p1->next;

        if(m==0)
        {
            printf("此人未在本通讯录中!n");
        }
        break;
    }

    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 filen");
        return;
    }
    p1=head;
    fprintf(fp,"姓名    职业      手机     Email     通讯地址n");
    for(;p1!=NULL;)
    {
        fprintf(fp,"%s       %s       %s        %s       %sn",p1->name,p1->work,p1->handset,p1->email,p1->address);
        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",&p1->name,&p1->work,&p1->handset,&p1->email,&p1->address);
            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 *menu(struct address_list *head)
{
    char num[10];
    while(1)
    {
        printf("*********************n");
        printf("*** 1 姓名查找      ****n");
        printf("*** 2 单个显示      ****n");
        printf("*** 3 增加          ****n");
        printf("*** 4 退出          ****n");
        printf("*********************n");
        printf("请输入您选择的操作:");
        gets(num);
        switch(*num)
        {
        case '1':
            {
                head=search(head);                          //姓名查找
                print(head);
            }
            break;
        case '2':
            {
                head=display(head);                          //显示
            }
            break;
        case '3':
            {
                head=insert(head);                           //增加
                print(head);
            }
            break;
        case '4':
            return head;
        default:
            printf("操作错误,此项不存在!n");
            break;
        }
        if(strcmp(num,"6")==0)
            break;
    }
    return head;
}
//主函数
void 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;
    }
}

解决方案三:

可以用单向链表来实现,每一个人是一个节点,一个节点用一个结构体表示;
结构体成员可以包括姓名、手机、组属性1、组属性2。。。
实现链表功能:创建、增加、删除、查找、排序、列表显示等等。

解决方案四:

如果要带界面的话,建议使用c#+sqlserver

解决方案五:

先管理分组信息
以分组信息为基础,再完成人的管理

建议为分组设定一个最大值,如:有 20 个不同的分组,这样编程实现会方便很多。

时间: 2024-09-19 10:04:14

编程-我要写一个通讯录的程序,要有分组的功能,怎么实现比较好。的相关文章

日历-求帮写一个java小程序

问题描述 求帮写一个java小程序 读取txt文件,文件中有一个8位的日期(任意),读出并打印此日期开始的一个月日历 解决方案 String s="20160221"; SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd"); try { Date startDate=sdf.parse(s); Calendar c2=Calendar.getInstance(); Calendar c=Calendar.getI

c++-用C++写一个排序的程序

问题描述 用C++写一个排序的程序 题目的意思是 你从键盘录入一系列数,然后你把他按顺序排好,用数组,但要建立类,C++写 解决方案 #include <iostream> using namespace std; class A { public: void print(int* pData, int count){ for (int i = 0; i< count; i++) { cout << pData[i] << " "; } cou

mfc-我写一个MFC的程序,在本机安装有oracle数据库

问题描述 我写一个MFC的程序,在本机安装有oracle数据库 我有一个MFC的程序,在本机安装有oracle数据库,并且可以连接并读取oracle数据库的表,现在想把oracle数据库安装在服务器上,MFC程序互联网访问oracle数据库,这样部署可行么,意思是程序不写服务器端,直接用客户端连接数据库读取数据. 解决方案 可以啊.你直接连另一个计算机的数据库和连本机的没有什么区别. 但是如果你的服务器在因特网上,你的客户端要发布给不信任的人,就最好不要这么玩,一旦你的客户端被破解,攻击者直接拿

swing-我要用java写一个Swing界面程序,实现对服务器操作的监控

问题描述 我要用java写一个Swing界面程序,实现对服务器操作的监控 管理员用户监测服务器中进行特定操作,来了解其他用户是否有违规操作,有什么方法可以实现吗?

用Google App Engine写一个留言板程序(一)

Google App Engine SDK可以看作是类似.NET Framework一样的平台(这个比喻不太恰当,但你可以先这样理解),这个环境运行在Google的服务器上,Google对它的安全.性能等作了多种限制和调节.另外Google App Engine是有选择性的支持Python,你不可能用到Python的全部特性 分享一下学习Google App Engine的学习心得,整个文章包括以下部分: ·Google App Engine前言介绍·开发环境配置·起步,写个Hello, Wor

大神请帮帮我这菜鸟吧,写一个简单的程序

问题描述 初学者,问题是:写一个Student类,包含name,age,hobbies(爱好),director(主任),count几个属性,这几个属性都是私有的.要求(1)写一个Driver类,创建5个我们班的同学的信息作为对象:(2)由于私有方法不能在类外面访问,所以自行设计其它的访问属性的set和get方法.(3)由于所有同学的主任都是李惠老师,特别思考下这个属性应该怎么设计?而且设置成私有的以后如何访问它?(4)count属性用于统计一共有多少个学生,思考应该如何设计,并要求输出一共有多

写一个完美数程序

完美数,不明白的去bing搜索吧. 下面给程序代码,没有加多线程,不过现在的CPU已经很快了,瞬间就完了. package com.yourcompany.struts; public class PerfectNumber { public static void main(String[] args) { // int sum, k; int perfectNum[] = new int[100]; for (int num = 1; num <= 10000; num++) { int s

用Java写一个日历小程序-代码

SDate部分: class SDate { public static int accountDays(int year,int month) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 2: if(isLeap(year)) return 29; else return 28; default: return 30; } } public static

我正在用C#写一个邮件客户端程序,不知道如何下手,请高手帮忙!!

问题描述 如题,提供源码也可.但要全.邮箱sxliang04@163.com谢谢!! 解决方案 解决方案二:http://www.blogjava.net/blogpig/archive/2006/10/21/76581.html