栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目标:通过编写c语言电话簿小系统掌握结构体与结构体数组的使用方式 个人学习记录
  • 结构体的创建和初始化
  • 结构体数组的使用与增删改查

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

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


随后选择好C++文件后,在下方输入’dianhuabu’ 的文件名,文件便创建好了

将代码复制进去后,ctrl+f5即可执行。

c语言电话簿小系统代码:
#include 
#include 
#include 
#define N 10


   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] != '')
        {
            count++;
        }
        else if(flag == 0)
        {
            size = num;
            flag = 1;
        }
        num++;
    }
    printf("电话簿一共有%d个位置,已经用了%d位,",N,count);
    printf("size的位置为:%dn",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("%sn",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] != '')
            {
                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] != '')
            {
                p_info[k] = p_info[k+1];
                k++;
            }
            p_info[k].name[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] != '')
            {
                p_info_name[j] = p_info[i].name[j];
            }
        }
    
        if(strcmp(p_info_name,linkman_name)==0)
        {
            printf("联系人-- 姓名:%s,性别:%s,年龄:%s,电话:%s,住址:%sn",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("%sn",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] != '')
            {
                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] == '')
        {           
            continue;
        }
        else
        {
        printf("联系人-- 姓名:%s,性别:%s,年龄:%s,电话:%s,住址:%sn",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,住址:%sn",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] = '';
    }
    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("添加联系人:     -- 0n");
    printf("删除指定联系人: -- 1n");
    printf("更新指定联系人: -- 2n");
    printf("查询指定联系人: -- 3n");
    printf("清空所有联系人: -- 4n");
    printf("显示所有联系人: -- 5n");
    printf("对联系人排序:   -- 6n");
    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. 部分运行展示:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832606.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号