C语言实现“220713-通讯录(北航22年夏令营问题)讲解”

第一部分:问题描述

题目描述

小明同学有一个通讯录,通讯录中有 n 条记录。对于每一条记录,分别有对方的姓名和电话号码。假设通讯录中所有的姓名都不重复,请你帮小明同学写一个程序,以姓名为输入,查询该姓名对应的电话号码。

输入

第一行为两个整数 n 和 m,其中 n 表示通讯录中记录的数量,m 表示查询的数量。

接下来的 n 行,每行2个字符串 name 和 number,其中 name 表示姓名,number 表示 name 对应的电话号码。字符串 name 和字符串 number 均不含空格。

之后出现的 m 行,每行1个字符串 query,表示需要查询的姓名。

输出

对于每一次需要查询的姓名,输出对应的电话号码。如果通讯录中没有改姓名,则输出Not Found。

输入样例:

2 3
alice 1234567
bob 7654321
alice
bob
catherine

输出样例:

1234567
7654321
Not Found

条件限制(取值范围):

1≤n≤500000。

1≤m≤10000。

query 的每一位是26个小写英文字母(即a到z)之一,且字符串 name 和字符串 query 的长度不超过20。字符串 number 的每一位是10个阿拉伯数字(即0到9)之一,且字符串 number 的长度不超过 20。

第二部分:代码实现

#include <stdio.h>
#include <stdio.h>
struct student
{
    char name[20];
    char phone[20];
};

int main() {
    //定义一个结构体数组存储所有的通讯录记录
    int n;//n代表通讯录中记录的数量
    scanf("%d",&n);
    int m;//m代表需要查找的姓名数量
    scanf("%d",&m);
    struct student arr[n];
    for(int i=0;i<n;i++)
    {
        struct student s1;
        scanf("%s",&s1.name);
        scanf("%s",&s1.phone);
        arr[i]=s1;
    }

    /*
    //循环输出所有内容
    for(int i=0;i<n;i++)
    {
        printf("%s",arr[i].name);
        printf("%s",arr[i].phone);
        printf("\n");
    }
    */
    //定义第二个结构体数组,存储要查找的所有姓名。
     struct student arr2[m];
    for(int i=0;i<m;i++)
    {
        struct student s1;
        scanf("%s",&s1.name);
        //scanf("%s",&s1.phone);
        arr2[i]=s1;
    }
    //开始将数据填充到arr2中---查询操作
    for(int i=0;i<m;i++)
    {

        int amount=0;
        for(int j=0;j<n;j++)
        {
            //循环比对两个数组
            int result=strcmp(arr2[i],arr[j]);
            if(result!=0)//如果name不一样,amount++
            {
                amount++;
            }
            else//比对成功,查找到了对应的手机号
            {
                //arr2[i].phone=arr[j].phone;
                strcpy(arr2[i].phone,arr[j].phone);
            }
        }
        if(amount==n)
        {
           strcpy(arr2[i].phone,"Not Found");
        }
    }

    //输出结果
    for(int i=0;i<m;i++)
    {
        printf("%s",arr2[i].phone);
        printf("\n");
    }
}

第三部分:效果展示

第四部分:思路解析

(1)定义结构体,包含姓名和手机号码

struct student
{
    char name[20];
    char phone[20];
};

(2)定义arr数组,存储通讯录的所有数据

    struct student arr[n];
    for(int i=0;i<n;i++)
    {
        struct student s1;
        scanf("%s",&s1.name);
        scanf("%s",&s1.phone);
        arr[i]=s1;
    }

(3)定义arr2数组,存储要查询的姓名和查询结果

  //定义第二个结构体数组,存储要查找的所有姓名。
     struct student arr2[m];
    for(int i=0;i<m;i++)
    {
        struct student s1;
        scanf("%s",&s1.name);
        //scanf("%s",&s1.phone);
        arr2[i]=s1;
    }
    //开始将数据填充到arr2中---查询操作
    for(int i=0;i<m;i++)
    {

        int amount=0;
        for(int j=0;j<n;j++)
        {
            //循环比对两个数组
            int result=strcmp(arr2[i],arr[j]);
            if(result!=0)//如果name不一样,amount++
            {
                amount++;
            }
            else//比对成功,查找到了对应的手机号
            {
                //arr2[i].phone=arr[j].phone;
                strcpy(arr2[i].phone,arr[j].phone);
            }
        }
        if(amount==n)
        {
           strcpy(arr2[i].phone,"Not Found");
        }
    }

希望能够帮助到大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值