用结构体与数组实现C语言电话簿小系统--学习笔记

目标:通过编写c语言电话簿小系统掌握结构体与结构体数组的使用方式

个人学习记录

  • 结构体的创建和初始化
  • 结构体数组的使用与增删改查

先在编译器中创建对应项目与文件

此处使用的是Microsoft Visual C++2010学习版编译器
首先打开任务栏中的’文件’ — ‘新建’ — ‘项目’ ,打开后选择’Win32控制台应用程序’ ,创建 ‘dianhuabu’ 项目。
在这里插入图片描述随后在任务栏的左边这里,对源文件进行右击,‘添加’ — ‘新建项’

这是一个图片
随后选择好C++文件后,在下方输入’dianhuabu’ 的文件名,文件便创建好了

在这里插入图片描述将代码复制进去后,ctrl+f5即可执行。
在这里插入图片描述

c语言电话簿小系统代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10

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

提供方法:
1.	添加联系人信息
2.	删除指定联系人信息
3.	查找指定联系人信息
4.	修改指定联系人信息
5.	显示所有联系人信息
6.	清空所有联系人
7.	以名字排序所有联系人

--8.  保存联系人到文件
--9.  加载联系人
*/
   struct personInfo 
  {
    char name[10]; //姓名
    char sex[10];   //性别
    char age[4];   //年龄
    char phone[12];   //电话
    char adress[200]; //地址
  };
  int i = 0;
  struct personInfo p_info[N];
  int sz = sizeof(p_info) / sizeof(personInfo);
  

void add_linkman()
{
    int num = 0,count = 0,flag = 0,size = 0;
    struct personInfo stu;
    while(num < N)
    {
        if(p_info[num].name[0] != '\0')
        {
            count++;
        }
        else if(flag == 0)
        {
            size = num;
            flag = 1;
        }
        num++;
    }
    printf("电话簿一共有%d个位置,已经用了%d位,",N,count);
    printf("size的位置为:%d\n",size);
    if(count == N)
    {
        printf("数组已满\n");
    } 
    else 
    {
        printf("请输入联系人信息:\n");
        printf("联系人姓名:\n");
        scanf("%s",stu.name);
        printf("联系人性别:\n");
        scanf("%s",stu.sex);
        printf("联系人年龄:\n");
        scanf("%s",stu.age);
        printf("联系人电话:\n");
        scanf("%s",stu.phone);
        printf("联系人地址:\n");
        scanf("%s",stu.adress);
        fflush(stdin);
        p_info[size] = stu;
        if(strcmp(p_info[size].name,stu.name) == 0){
            printf("联系人已添加\n");
        }
        else
        {
            printf("添加失败\n");
        }
        
    }

}

int delete_appoint_linkman()
{
    fflush(stdin);
    char linkman_name[10];
    char p_info_name[10];
    printf("您要删除的联系人是:\n");
    gets(linkman_name);
    printf("您输入的联系人是:\n");
    printf("%s\n",linkman_name);

    int i,j;
    for(i = 0;i < 10;i++)
    {
        //字符数组的字符串值与结构体中的字符串数组值进行比对
        
        //将数组p_info_name进行置空
        memset(p_info_name,0,sizeof(p_info_name));      
        for (j = 0; j < 10; j++)
        {
            if(p_info[i].name[j] != '\0')
            {
                p_info_name[j] = p_info[i].name[j];
            }
        }
    
        if(strcmp(p_info_name,linkman_name)==0)
        {
            int k = i;
            while(p_info[k+1].name[0] != '\0')
            {
                p_info[k] = p_info[k+1];
                k++;
            }
            p_info[k].name[0] = '\0';
            printf("删除结束\n");
            return 1;
        }      
    }
    return 0;


}

int find_appoint_linkman()
{
    fflush(stdin);
    char linkman_name[10];
    char p_info_name[10];
    printf("您要查找的联系人是:\n");
    gets(linkman_name);
    printf("您输入的联系人是:\n");
    puts(linkman_name);
    
    //i用来表示结构体数组的长度,j用来表示结构体数组中name字符串数组的长度
    int i,j; 
    for(i = 0;i < sz;i++)
    {
        //字符数组的字符串值与结构体中的字符串数组值进行比对
        
        //将数组p_info_name进行置空
        memset(p_info_name,0,sizeof(p_info_name));      
        for (j = 0; j < 10; j++)
        {
            if(p_info[i].name[j] != '\0')
            {
                p_info_name[j] = p_info[i].name[j];
            }
        }
    
        if(strcmp(p_info_name,linkman_name)==0)
        {
            printf("联系人-- 姓名:%s,性别:%s,年龄:%s,电话:%s,住址:%s\n",i+1,p_info[i].name,p_info[i].sex,p_info[i].age,p_info[i].phone,p_info[i].adress);
            printf("查询结束\n");
            return 1;
        }      
    }
    printf("未找到相关联系人\n");
    return 0;
}

int update_appoint_linkman()
{
    fflush(stdin);
    char linkman_name[10];
    char p_info_name[10];
    printf("您要更新的联系人是:\n");
    gets(linkman_name);
    printf("您输入的联系人是:");
    puts(linkman_name);
    printf("%s\n",linkman_name);
    
    int i,j;
    for(i = 0;i < sz; i++)
    {
        //字符数组的字符串值与结构体中的字符串数组值进行比对
        
        //将数组p_info_name进行置空
        memset(p_info_name,0,sizeof(p_info_name));      
        for (j = 0; j < sz; j++)
        {
            if(p_info[i].name[j] != '\0')
            {
                p_info_name[j] = p_info[i].name[j];
            }
        }
    
        if(strcmp(p_info_name,linkman_name)==0)
        {   
            printf("已查询到您输入的联系人\n");
            struct personInfo stu;
            printf("请输入新联系人信息:\n");
            printf("联系人姓名:\n");
            scanf("%s",stu.name);
            printf("联系人性别:\n");
            scanf("%s",stu.sex);
            printf("联系人年龄:\n");
            scanf("%s",stu.age);
            printf("联系人电话:\n");
            scanf("%s",stu.phone);
            printf("联系人地址:\n");
            scanf("%s",stu.adress);

            p_info[i] = stu;
            return 1;
        }      
    }
    return 0;
}

void find_all_linkman()
{   
    int i = 0;
    for(;i < sz;i++)
    {
        
        if(p_info[i].name[0] == '\0')
        {           
            continue;
        }
        else
        {
        printf("联系人-- 姓名:%s,性别:%s,年龄:%s,电话:%s,住址:%s\n",p_info[i].name,p_info[i].sex,p_info[i].age,p_info[i].phone,p_info[i].adress);
        }
        
       //printf("联系人-- 姓名:%s,性别:%s,年龄:%s,电话:%s,住址:%s\n",i+1,p_info[i].name,p_info[i].sex,p_info[i].age,p_info[i].phone,p_info[i].adress);
    }
    printf("已输出所有联系人!\n");
}

void delete_all_linkman()
{   
    
    for (int i = 0; i < sz; i++ )
    {
        p_info[i].name[0] = '\0';
    }
    printf("已删除所有联系人\n");
}


//对联系人进行排序
void sort_linkman_byname()
{
    struct personInfo p_info_temp;
    p_info_temp = p_info[0];
    for (int i = 0; i < sz; i++)
        for(int j = 0; j < sz - i - 1; j++)
    {
        if(p_info[j].name[0] > p_info[j+1].name[0])
        {
            p_info_temp = p_info[j];
            p_info[j] = p_info[j+1];
            p_info[j+1] = p_info_temp;
        }
    }
    printf("排序结束\n");

}



int main() {
  
    printf("============*开始*============\n");
    
    struct personInfo stu1 = {"ycy","female","20","15958163105","江苏常州"};
    struct personInfo stu2 = {"hkl","female","21","15958163106","江苏常州"};
    struct personInfo stu3 = {"hxy","female","22","15958163107","江苏常州"};
    struct personInfo stu4 = {"ch","female","23","15958163108","江苏常州"};
    p_info[0] = stu1;
    p_info[1] = stu2;
    p_info[2] = stu3;
    p_info[3] = stu4;
    
    char code = '*'; //此处初始化code值

    printf("***********指令列表***********\n");
    printf("添加联系人:     -- 0\n");
    printf("删除指定联系人: -- 1\n");
    printf("更新指定联系人: -- 2\n");
    printf("查询指定联系人: -- 3\n");
    printf("清空所有联系人: -- 4\n");
    printf("显示所有联系人: -- 5\n");
    printf("对联系人排序:   -- 6\n");
    printf("结束选择:       -- #\n");
    printf("***********指令列表***********\n");

    while(code != '#')
    {
        printf("请输入您要执行的指令(输入#退出):\n");
        fflush(stdin);
        scanf("%c",&code);
        switch(code)
        {
            case '0': 
                printf("*****分隔符*****\n");
                add_linkman(); 
                printf("*****分隔符*****\n"); break;
            case '1':
                printf("*****分隔符*****\n");
                delete_appoint_linkman(); 
                printf("*****分隔符*****\n"); break;
            case '2':
                printf("*****分隔符*****\n");
                update_appoint_linkman();
                printf("*****分隔符*****\n");  break;
            case '3':
                printf("*****分隔符*****\n");
                find_appoint_linkman(); 
                printf("*****分隔符*****\n"); break;
            case '4':
                printf("*****分隔符*****\n");
                delete_all_linkman(); 
                printf("*****分隔符*****\n"); break;
            case '5':
                printf("*****分隔符*****\n");
                find_all_linkman(); 
                printf("*****分隔符*****\n"); break;
            case '6':
                printf("*****分隔符*****\n");
                sort_linkman_byname(); 
                printf("*****分隔符*****\n"); break;
            default: 
                printf("您未执行任何操作!\n"); break;
        }
    }

    printf("============*结束*============\n");
    return 0;
}

此次记录主要涉及的是c语言中的结构相关内容,因此涉及到文件操作的方法8与9还尚未实现,等下次再做补充。

总结:

  1. 上述小系统的代码中,以结构体personInfo来充当联系人的主要信息的数据形式,存放在结构体数组p_info[10]中(模拟数据库的作用),主要实现对数组中的信息进行增删改查,以及指定联系人的查询、删除与修改等功能。
  2. 所遇到的问题有:
    i.注意到在执行输入方法gets或者scanf方法时,存在跳过而直接运行了下一步的问题,核查后原因在于数据输入时存在缓存空间,需要及时执行fflush(stdin)方法,即可清除缓存,不至于再对下一次的输入产生影响。
    ii.将数组置空时,需要采用memset(p_info_name,0,sizeof(p_info_name));方法,而不是单纯的将其赋值于NULL。
  3. 部分运行展示:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值