通讯录

实现一个;
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址

提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 排序所有联系人 (以名字、年龄、性别、手机号、地址排序(由用户选择一种排序方法))

//catact.h

#ifndef __CONTACT_H__
#define __CONTACT_H__

#define MAX_NAME 20
#define MAX_SEX  5
#define MAX_ADDER 40
#define MAX_COUNT  1000

void menu1();

void menu2();

void menu3();
enum operate1
{
    Exit,
    Add,
    Sub,
    Find,
    Modify,
    Show,
    Empty,
    SORT
};
enum operate2
{
    NAME=1,
    AGE,
    SEX,
    TEL,
    ADDER
};

typedef struct Iformation
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char tel[11];
    char adder[MAX_ADDER];
}infor;//每个联系人的信息

typedef struct Contact
{
    infor date[MAX_COUNT];
    int count;
}contact,*pcontact;//通讯录所有人的信息组成的数组,和通信录以有人的个数

void InitialCount(pcontact p);//通讯录的初始化

void AddContact(pcontact p);//添加联系人

void SubContact(pcontact p);//删除联系人

void FindContact(pcontact p);//查找联系人

void ModifyContact(pcontact p);//修改联系人

void ShowContact(pcontact p);//展示通讯录

void EmptyContact(pcontact p);//把通讯录清空

void SORTContact(pcontact p);//联系人排序

void bubble_sort(void *base, int count, int size, int(*cmp)(void*, void*));//冒泡排序

int cmp_stu_age(const void *e1, const void*e2);//结构体按年龄的比较函数

int cmp_stu_sex(const void *e1, const void *e2);//结构体按性别的比较函数

int cmp_stu_tel(const void *e1, const void *e2);//结构体按电话的比较函数

int cmp_stu_name(const void *e1, const void *e2);//结构体按名字的比较函数

int cmp_stu_adder(const void *e1, const void *e2);// 结构体按地址的比较函数
#endif // !_CONTACT_H
//catact.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include"contact.h"

//对通讯录操作的菜单
void menu1()
{
    printf("***********************\n");
    printf("*** 1.add   2.sub   ***\n");
    printf("*** 3.find  4.mod   ***\n");
    printf("*** 5.show  6.empty ***\n");
    printf("*** 7.sort  0.exit  ***\n");
    printf("************************\n");
 }

//要修改联系人的哪一项信息
void menu2()
{
    printf("***********************\n");
    printf("*** 1.name   2.age   ***\n");
    printf("*** 3.sex    4.tel   ***\n");
    printf("***      5.adder     ***\n");
    printf("************************\n");

}

//以哪种方式排序
void menu3()
{
    printf("***********************\n");
    printf("*** 1.name   2.age   ***\n");
    printf("*** 3.sex    4.tel   ***\n");
    printf("***      5.adder     ***\n");
    printf("************************\n");
}

//通讯录的初始化
void InitialCount(pcontact p)
{
    p->count = 0;
    memset(p->date, 0, sizeof(p->date));
}

//在修改和删除和查找某个人是我们要找到此人的下标,所以我把它写成了个函数
int FindOne(pcontact p, char* name)
{
    int i = 0;
    for (i = 0; i < p->count; i++)
    {
        if (strcmp(name, p->date[i].name) == 0)
            return i;
    }
    if (i == p->count)
    {
        printf("\n*******通讯录里没有此人*******\n");
        printf("\n");
        return -1;
    }
}

//添加联系人
void AddContact(pcontact p)
{
    if (p->count == MAX_COUNT)//当联系人数(从0开始计的)等于最大容量数时,说明通讯录已满
    {
        printf("通讯录已满\n");
        return;
    }
    printf("输入姓名>");
    scanf("%s", p->date[p->count].name);
    printf("输入年龄>");
    scanf("%d", &(p->date[p->count].age));
    printf("输入性别>");
    scanf("%s", p->date[p->count].sex);
    printf("输入电话号>");
    scanf("%s", p->date[p->count].tel);
    printf("输入地址>");
    scanf("%s", p->date[p->count].adder);
    p->count++;
}

//删除联系人
void SubContact(pcontact p)
{
    char name[20];
    int i = 0;
    int k = 0;
    printf("请输入你要删除人的姓名>");
    scanf("%s", name);
    i = FindOne(p, name);
    if(i != -1)
    {
        for (k = i; k < p->count - 1; k++)
        {
            p->date[k] = p->date[k + 1];
        }
        p->count--;
    }

}

//查找联系人
void FindContact(pcontact p)
{
    char name[20];
    int i = 0;
    printf("请输入你要查找人的姓名>");
    scanf("%s", name);
    i = FindOne(p, name);
    if (i != -1)
    {
            printf("\n %s %d %s %s %s\n",
                p->date[i].name,
                p->date[i].age,
                p->date[i].sex,
                p->date[i].tel,
                p->date[i].adder);
            printf("--------------------------------\n");



    }
}

//修改联系人
void ModifyContact(pcontact p)
{
    char name[20];
    int i = 0;
    printf("请输入你要修改人的姓名>");
    scanf("%s", name);
    i = FindOne(p, name);
    if (i != -1)
    {

        int n = 0;
        menu2();
        printf("你要修改哪一项>");
        scanf("%d", &n);
        switch (n)
        {
        case NAME:  printf("输入修改后的姓名>");
            scanf("%s", p->date[i].name);
            break;
        case AGE:   printf("输入修改后的年龄>");
            scanf("%d", &(p->date[i].age));
            break;
        case SEX:  printf("输入修改后的性别>");
            scanf("%s", p->date[i].sex);
            break;
        case TEL:   printf("输入修改后的电话号>");
            scanf("%s", p->date[i].tel);
            break;
        case ADDER:  printf("输入地址>");
            scanf("%s", p->date[i].adder);
            break;
        default:
            break;
        }

    }
}

//展示通讯录
void ShowContact(pcontact p)
{
    int i = 0;
    printf("姓名  年龄  性别   电话号   家庭地址\n");
    printf("--------------------------------\n");
    for (i = 0; i < (p->count); i++)
    {
        printf("%s %d  %s   %s    %s\n",
            p->date[i].name,
            p->date[i].age,
            p->date[i].sex,
            p->date[i].tel,
            p->date[i].adder);
        printf("--------------------------------\n");
    }
}

//把通讯录清空
void EmptyContact(pcontact p)
{
    p->count = 0;
    memset(p->date, 0, sizeof(p->date));
}

//联系人排序
void SORTContact(pcontact p)
{
    int way;
    menu3();
    printf("你要以哪种方式排序>");
    scanf("%d", &way);
    int sz = sizeof(infor);
    switch (way)
    {
    case NAME:  bubble_sort(p->date, p->count, sz, cmp_stu_name);
        break;
    case AGE:   bubble_sort(p->date, p->count, sz, cmp_stu_age);
        break;
    case SEX:  bubble_sort(p->date, p->count, sz, cmp_stu_sex);
        break;
    case TEL:   bubble_sort(p->date, p->count, sz, cmp_stu_tel);
        break;
    case ADDER:  bubble_sort(p->date, p->count, sz, cmp_stu_adder);
        break;
    default:
        break;
    }
}
//冒泡排序sort.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include"contact.h"
//结构体按年龄的比较函数
int cmp_stu_age(const void *e1, const void*e2)
{
    assert(e1 && e2);
    return (((infor*)e1)->age) - (((infor*)e2)->age);
}

//结构体按名字的比较函数
int cmp_stu_name(const void *e1, const void *e2)
{
    assert(e1 && e2);
    return strcmp(((infor*)e1)->name, ((infor*)e2)->name);
}

//结构体按性别的比较函数
int cmp_stu_sex(const void *e1, const void *e2)
{
    assert(e1 && e2);
    return strcmp(((infor*)e1)->sex, ((infor*)e2)->sex);
}

//结构体按电话的比较函数
int cmp_stu_tel(const void *e1, const void *e2)
{
    assert(e1 && e2);
    return strcmp(((infor*)e1)->tel, ((infor*)e2)->tel);
}

// 结构体按地址的比较函数
int cmp_stu_adder(const void *e1, const void *e2)
{
    assert(e1 && e2);
    return strcmp(((infor*)e1)->adder, ((infor*)e2)->adder);
}
//交换函数
void swap(char *e1, char *e2, int size)
{
    assert(e1 && e2);
    int i = 0;
    for (i = 0; i < size; i++)
    {
        char tamp = *((char*)e1 + i);
        *((char*)e1 + i) = *((char*)e2 + i);
        *((char*)e2 + i) = tamp;
    }
}
void bubble_sort(void *base, int count, int size, int(*cmp)(void*, void*))
{
    assert(base && cmp);
    int i = 0;
    int j = 0;
    for (i = 0; i < count - 1; i++)
        for (j = 0; j < count - i - 1; j++)
        {
            if (cmp((char*)base + j * size, (char*)base + (j + 1)*size) > 0)
                swap((char*)base + j * size, (char*)base + (j + 1)*size, size);
        }
}
//main.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"contact.h"
int main()
{
    int input = 0;
    contact my_contact;
    InitialCount(&my_contact);

    do
    {
        menu1();
        printf("请输入您要进行操作的序号>");
        scanf("%d", &input);
        switch (input)
        {
        case Add:   AddContact(&my_contact);
            break;
        case Sub:   SubContact(&my_contact);
            break;
        case Find:  FindContact(&my_contact);
            break;
        case Modify:ModifyContact(&my_contact);
            break;
        case Show:  ShowContact(&my_contact);
            break;
        case Empty: EmptyContact(&my_contact);
            break;
        case SORT:  SORTContact(&my_contact);
            break;
        case Exit:
            break;
        default:
            break;
        }
    } while (input);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jsbgo201506010102/article/details/80256017