C语言/通讯录

#pragma once//这是头文件的代码

#include<stdio.h>
#include<string.h>

#define Max_NAME 20
#define Max_SEX  10
#define Max_TELE 12
#define Max_Addr 30
#define Max 100

//在这里我们要写一个人的基本信息,为了使程序更加稳定,我用预定义来限制字符串的长度
/*1.姓名
2.年龄
3.性别
4.地址
5.电话
6.等等*/

typedef struct Peotfe
{
    char name[Max_NAME];
    int age;
    char sex[Max_SEX];
    char tele[Max_TELE];
    char addr[Max_Addr];
}Peotfe;

//现在写一个通讯录的框架
typedef struct Contact
{
    Peotfe date[Max];
    int sz;
}Contact;

//初始化通讯录
void Initcontact(Contact* pc);


//增加联系人信息
void AddContact(Contact* pc);

//打印通讯录信息
void PrintContact(Contact* pc);

//删除联系人信息
void DelContact(Contact* pc);

//查找联系人信息
void SearchContact(Contact* pc);

//修改联系人信息
void ModifyContact(Contact* pc);

//排序通讯录
void SortContact(Contact* pc);

#define _CRT_SECURE_NO_WARNINGS 1//这是函数实现的代码

#include"Contact.h"

void Initcontact(Contact* pc)//初始化函数
{
    pc->sz = 0;
    //memset — 内存设置函数
    memset(pc->date, 0, sizeof(pc->date));
}

void AddContact(Contact* pc)//增加函数
{
    if (pc->sz == Max)//如果人满了,就无法添加联系人
    {
        printf("联系人已满,无法添加联系人\n");
        return;
    }

    printf("请输入名字:>");
    scanf("%s", pc->date[pc->sz].name);
    printf("请输入电话:>");
    scanf("%s", pc->date[pc->sz].tele);
    printf("请输入地址:>");
    scanf("%s", pc->date[pc->sz].addr);
    printf("请输入年龄:>");
    scanf("%d", &(pc->date[pc->sz].age));
    printf("请输入性别:>");
    scanf("%s", pc->date[pc->sz].sex);
    
    pc->sz++;
    printf("成功增加联系人\n");
}

void PrintContact(Contact* pc)//打印函数
{
    if (pc->sz == 0)
    {
        printf("通讯录没有联系人,请添加联系人再打印\n");
        return;
    }
    int i = 0;
    printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n","姓名","年龄","性别","电话","地址");
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n", 
            pc->date[i].name,
            pc->date[i].age,
            pc->date[i].sex,
            pc->date[i].tele,
            pc->date[i].addr
              );
    }
}

static int Seekcontact(Contact* p,char str[])
{
    /*这里我们需要注意返回值,参数设计等等
    并且我在这个顺便说一下,大家写程序的时候一定要认真
    任何一个小失误可能都会导致你的失败*/

    //想一想 我们改则么查找呢,有人会说姓名或者是电话号码,或者地址对吧?
    //想法没有问题,主要是如何实现,因为这是第一版本,所以我就简单的用姓名查找吧
    //一些细节我没有注意,比如说名字一样则么办,我后面会升级代码的哈,希望大家点个关注,不迷路
    //废话不多说,开始实现
    int i = 0;
    for (i = 0; i < p->sz; i++)//用循环的方式 一个一个找
    {
        if (strcmp((p->date[i].name), str) == 0)
        {
            return i;
        }
    }
    return -1;//如果这个循环出来都没有找到的话,就是没有
}

void DelContact(Contact* pc)//删除函数
{
    /*删除的布置
    首先要输入一个联系人的信息,比如姓名,地址等等
    我在这里就按姓名举例子
    1.查找,如果有返回下标
    如果有,然后将后面的往前移一个
    如果没有,返回-1或者负数,因为负数不可能是下标*/
    //显然我们先要写一个查找函数
    
    if (pc->sz == 0)
    {
        printf("通讯录为空,无需删除\n");
        return;
    }
    int ret = 0;
    int i = 0;
    printf("请输入你要查找的联系人的姓名:>");
    char str[Max_NAME] = { 0 };
    scanf("%s", str);
    ret = Seekcontact(pc, str);//我声明一下,我英语不太好,单词都是简单的,别嫌弃哈
    if (ret == -1)
    {
        printf("你要查找的人不存在\n");
        return;
    }
    else
    {
        for (i = ret; i < pc->sz - 1; i++)//这里的判断条件 会在后面的图片里有,我先标记一下 (1)
        {
            pc->date[i] = pc->date[i+1];
        }
        pc->sz--;//这里也是一种特殊情况
        printf("删除成功\n");
    }
}

void SearchContact(Contact* pc)
{
    /*查找之前就写过了
    会比较轻松*///还是要输入一个人的名字
    //分两种情况
    //1.查找的人不存在 或者没有联系人可以查找
    //2.另一种就是存在

    if (pc->sz == 0)
    {
        printf("通讯录为空,无需查询\n");
        return;
    }

    printf("请输入你要查找的联系人的姓名:>");
    char name[Max_NAME] = { 0 };
    scanf("%s", name);
    int ret = 0;
    ret = Seekcontact(pc, name);
    if (ret == -1)
    {
        printf("你查找的联系人不存在,请你确认后再查询\n");
        return;
    }
    else
    {
        printf("你查找的联系人存在,他的信息是:>\n");
        printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
        printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
            pc->date[ret].name,
            pc->date[ret].age,
            pc->date[ret].sex,
            pc->date[ret].tele,
            pc->date[ret].addr
               );
    }
}

void ModifyContact(Contact* pc)
{
    /*修改也是一样的
    * 0.看通讯录是否为空
    1.查询是否存在
    2.存在,然后修改*/

    if (pc->sz == 0)
    {
        printf("通讯录为空,无需修改\n");
        return;
    }

    printf("请输入你要修改的联系人的姓名:>");
    char name[Max_NAME] = { 0 };
    scanf("%s", name);
    int ret = 0;
    ret = Seekcontact(pc, name);
    if (ret == -1)
    {
        printf("你要修改的联系人不存在,请你确认后再修改\n");
        return;
    }
    else
    {
        printf("你修改的联系人存在,他的信息是:>\n");
        printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
        printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
            pc->date[ret].name,
            pc->date[ret].age,
            pc->date[ret].sex,
            pc->date[ret].tele,
            pc->date[ret].addr
        );

        printf("下面是修改他的信息:>\n");

        printf("请输入名字:>");
        scanf("%s", pc->date[ret].name);
        printf("请输入电话:>");
        scanf("%s", pc->date[ret].tele);
        printf("请输入地址:>");
        scanf("%s", pc->date[ret].addr);
        printf("请输入年龄:>");
        scanf("%d", &(pc->date[ret].age));
        printf("请输入性别:>");
        scanf("%s", pc->date[ret].sex);

        printf("修改后他的信息是:>\n");
        printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
        printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
            pc->date[ret].name,
            pc->date[ret].age,
            pc->date[ret].sex,
            pc->date[ret].tele,
            pc->date[ret].addr
        );
    }
}
void SOrtContact(Contact* pos)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < pos->sz; i++)
    {
        for (j = 0; j < pos->sz - i; j++)//冒泡排序大家肯定都是知道的
            //如果不知道的话 我后面写一篇博客
        {
            if (strcmp(pos->date[j].name, pos->date[j + 1].name) == -1)
            {
                Peotfe str = pos->date[j];
                pos->date[j] = pos->date[j + 1];
                pos->date[j + 1] = str;
            }
        }
    }
}

void SortContact(Contact* pc)
{
    /*排序可以有很多种方式
    不过本人主要想用姓名或者地址
    毕竟字符串方便一点,前面那些都用的姓名
    那么这个函数也围绕这姓名吧*/

    //写道这里首先想到的是冒泡排序
    //首先是思维,然后是代码
    /*思维是排序是按一下,所有人都排序
    因为是第一版本,我就弄简单点,这次这是从小到大
                                      或者从大到小
                                      后面的版本我会升级
                                      一样的大家期待一吧
    废话不多说 我们现在就开始*/

    //我们还是会用到字符串比较函数 strcmp
    SOrtContact(pc);
    PrintContact(pc);
}

#define _CRT_SECURE_NO_WARNINGS 1//这是主函数

/*通讯录
1.增加联系人信息
2.删除联系人信息
3.查找联系人信息
4.排序联系人
5.打印通讯录
6.退出*/

#include"Contact.h"

void menu()
{
    printf("***************************************\n");
    printf("******  1. Add     2.Ddl **************\n");
    printf("******  3. Search  4. Modify **********\n");
    printf("******  5. Sort    6. Print  **********\n");
    printf("************ 0. Exit ******************\n");
    printf("***************************************\n");
}

enum Option
{
    Exit,
    Add,
    Del,
    Search,
    Modify,
    Sort,
    Print

};

int main()
{
    Contact con;
    //初始化通讯录
    Initcontact(&con);

    int input = 0;
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch(input)
        {
            case Add:
                AddContact(&con);
                //增加联系人信息
                break;
            case Del:
                DelContact(&con);
                //删除
                break;
            case Search:
                SearchContact(&con);
                //查找
                break;
            case Modify:
                //修改
                ModifyContact(&con);
                break;
            case Sort:
                //排序
                SortContact(&con);
                break;
            case Print:
                //打印
                PrintContact(&con);
                break;
            case Exit:
                //退出
                printf("已经退出通讯录\n");
                break;
            default:
                //输入错误
                printf("输入错误,请重新输入\n");
                break;
        }
    } while (input);
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值