静态通讯录

这个通讯录存粹用到C的知识就可以,主要就是一个联系人信息结构体,再就是一个结构体数组,对结构体数组反复操作
进行增、删、查、改、排序(由于是初学者还不能对中文名进行排序)、清空写等功能。

在这里我们可以尽量写的正式一点
所以我们用contact.h头文件创建结构体和对函数进行声明
conteact.c中是主要功能的实现及代码
最后用test.c进行测试

1.头文件”contact.h”

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


#define NAME_MAX 20
#define  SEX_MAX 5
#define PHONE_MAX 13
#define MAX_SIZE 1000   
struct MyStruct    //定义联系人信息的结构体
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int age;
    char phone[PHONE_MAX];
    char address[50];
};

struct A
{
    struct MyStruct arr[MAX_SIZE];  //结构体数组
    int i;
};
enum op//枚举可以让后面的Switch语句中的选择变得有意义
{
    EXIT,
    ADD,
    DELETE,
    FIND,
    AMEND,
    PRINT,
    INIT,
    SORT

};
//函数声明
void _init(struct A *p);
void add(struct A *p);
int find_place(struct A *p);
void delete(struct A *p);
void search_name(struct A *p);
void amend(struct A *p);
void sort(struct A *p);
void _print(struct A *p);
void Menu();

2.函数实现”contact.c”

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void _init(struct A *p)//对结构体成员进行初始化
{
    p->i = 0;
    memset(p->arr, 0, MAX_SIZE * sizeof(struct MyStruct));//这个就是将结构体数组全部初始化为0
}
void add(struct A *p)
{
    printf("录入联系人信息\n");
    printf("请录入联系人姓名:");
    scanf("%s", p->arr[p->i].name);
    printf("\n请录入联系人性别:");
    scanf("%s", p->arr[p->i].sex);
    printf("\n请录入联系人年龄:");
    scanf("%d", &p->arr[p->i].age);
    printf("\n请录入联系人电话:");
    scanf("%s", p->arr[p->i].phone);
    printf("\n请录入联系人住址:");
    scanf("%s", p->arr[p->i].address);
    p->i++;
    printf("\n联系人信息录入完毕\n");
}
int find_place(struct A *p)
{
    char name[NAME_MAX];
    printf("请输入姓名:");
    scanf("%s", name);
    for (int i = 0; i < p->i; i++)
    {
        if (strcmp(p->arr[i].name, name) == 0)//利用strcmp对字符串的比较来找位置
        {
            return i;
        }
    }
    return -1;
}
void delete(struct A *p)
{
    if (p->i > 0)
    {
        printf("删除联系人\n");
        int ret = find_place(p);
        if (ret != -1)
        {
            for (int i = ret; i < p->i - 1; i++)//要让删除位置之后的都向前移动一位
            {
                p->arr[i] = p->arr[i + 1];
            }
            p->i--;//让总数组长度减1
            printf("删除完毕\n");
        }
        else
        {
            printf("未找到此联系人\n");
        }
    }
    else
    {
        printf("通讯录中无联系人");
    }
}
void search_name(struct A *p)
{
    int ret = find_place(p);
    if (ret != -1)
    {
        printf("姓名:%s  性别:%s  年龄:%d  电话:%s   住址:%s\n",
            p->arr[ret].name,
            p->arr[ret].sex,
            p->arr[ret].age,
            p->arr[ret].phone,
            p->arr[ret].address);
    }
    else
        printf("未找到此联系人");
}
void amend(struct A *p)
{
    printf("修改个人信息:\n");
    int ret = find_place(p);
    if (ret != -1)
    {
        printf("请输入联系人姓名:");
        scanf("%s", p->arr[ret].name);
        printf("\n请录入联系人性别:");
        scanf("%s", p->arr[ret].sex);
        printf("\n请录入联系人年龄:");
        scanf("%d", &p->arr[ret].age);
        printf("\n请录入联系人电话:");
        scanf("%s", p->arr[ret].phone);
        printf("\n请录入联系人住址:");
        scanf("%s", p->arr[ret].address);
        printf("修改完毕\n");
    }
    else
    {
        printf("未找到此联系人");
    }
}
void sort(struct A *p)
{
   //简单的冒泡排序算法运用
    for (int i = 0; i < p->i - 1; i++)
    {
        for (int j = 0; j < (p->i - 1 - i); j++)
        {
            if (strcmp(p->arr[i].name, p->arr[j].name) < 0)
            {
                struct MyStruct tem;//定义一个结构体类型变量
                tem = p->arr[i];
                p->arr[i] = p->arr[j];
                p->arr[j] = tem;
            }
        }
    }
    printf("\n排序完成\n");
}
void _print(struct A *p)
{
    printf("\n联系人信息:\n");
    int i = 0;
    for (i = 0; i < p->i; i++)
    {
        printf("姓名:%s  性别:%s  年龄:%d  电话:%s   住址:%s\n",
            p->arr[i].name,
            p->arr[i].sex,
            p->arr[i].age,
            p->arr[i].phone,
            p->arr[i].address);
    }
}
void Menu()
{
    printf("\n      ***1  添加联系人信息   ***\n");
    printf("      ***2  删除联系人信息   ***\n");
    printf("      ***3  查找联系人信息   ***\n");
    printf("      ***4  修改联系人信息   ***\n");
    printf("      ***5  显示联系人信息   ***\n");
    printf("      ***6  清空联系人信息   ***\n");
    printf("      ***7 以名字排序联系人  ***\n");
    printf("      ***0  退 出 通 讯 录    ***\n");
}

3.测试代码”test.c”

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void Test()
{
    struct A p;
    int input = 1;
    _init(&p);//这里一定要注意要用地址传递的方式,要不然在不能改变数组内的信息,具体为什么就不一一说了
              //另建议结构体传参时,尽量用地址传递,因为一般地址传递都比值传递的效率高
    while (input)
    {   
        Menu();
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
            case ADD:
                add(&p);
                break;
            case DELETE:
                delete(&p);
                break;
            case FIND:
                search_name(&p);
                break;
            case AMEND:
                amend(&p);
                break;
            case PRINT:
                _print(&p);
                break;
            case INIT:
                p.i=0;
            case SORT:
                sort(&p);
                break;
            case EXIT:
                break;
        default:
            break;
        }
    }
}
int main()
{
    Test();
    system("pause");
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值