本篇博客主要以一个小例子来初步探索一下“搜索”,包括程序的逻辑结构设计
例:在美元中,硬币是有名字的,它有一些英文单词去对应的硬币的面值,比如1分钱叫做penny,5分钱叫做nichel......(有一个数字对应一个英文单词)。如果要编写一个程序做搜索,用户输入一个数字(面额),程序输出对应的英文,那么如何实现?
分析:本题的关键点是如何建立“数字面值”与“英文”这两者之间的联系。可以分别设置两个数组
如图所示,如果在amount数组中搜到了一个值:比如10,得到它所在的位置是2,那么就可以在字符数组2的位置上得到dime。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//搜索函数
int search(int a[], int key, int size)
{
int ret = -1;
for ( int i = 0; i < size; i++)
{
if (a[i] == key)
{
ret = i;
break;
}
}
return ret;
}
int main()
{
int amount[] = { 1, 5, 10, 25, 10 };
char*p[] = { "penny", "nickel", "dime", "quarter", "half-dollar" };
int sz = sizeof(amount) / sizeof(amount[0]);
int loc = search(amount, 0, sz);
if (loc != -1)
{
printf("%s\n", p[loc]);//输出对应位置的英文字符
}
else
{
printf("没找到\n");
}
system("pause");
return 0;
}
但是这样有一个不好处:它是割裂的两个数组。更好的做法是:将数字面额与对应的英文放的比较近;这样的话,一旦找到面额,直接再附近就可以找到英文,不需要到另外的地方去找。
改进思路:不需要有两个数组,而是设计一个结构,结构内容包含“int 类型的数字面额”和“字符指针”,用这样的结构构造一个结构体数组,然后进行初始化。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
struct
{
int amount;
char*name;
}coins[] = {
{ 1, "penny" },
{ 5, "nickel" },
{ 10, "dime" },
{ 25, "quarter" },
{ 50, "half-dollar" }
};
int main()
{
int k = 0;
scanf("%d", &k);
int sz = sizeof(coins) / sizeof(coins[0]);
for (int i = 0; i < sz; i++)
{
if (k == coins[i].amount)
{
printf("%s\n", coins[i].name);
break;
}
}
system("pause");
return 0;
}