c语言-查找数据,定义两个函数

6-7 查找数据
分数 5
作者 余贞侠
单位 成都信息工程大学
调用自定义函数Input从键盘读入数据到数组Arr中,读满20个数或者遇到-9999结束。再读入一个数num,然后调用自定义函数Search在数组arrA中查找num,输出查找的位置信息(下标从0计算),没有找到输出“not Find!”

函数接口定义:

int Input(int *p,int n);
int Search(int *p, int n, int num);

Input函数将数据读入数组中并返回实际读入的元素个数; Search函数返回查找num的位置信息,没有找到返回-1

裁判测试程序样例:

#include
int Input(int *p,int n);
int Search(int *p, int n, int num);

int main(void)
{
        int Arr[20],cnt=0, num, Pos;
         cnt = Input(Arr,20);
         scanf("%d", &num);    
    
         Pos = Search(Arr,cnt,num) ;  
        if (-1 == Pos)
        {
                printf("not Find!\n");
        }
        else
        {
                printf("%d\n", Pos);
        }

        return 0;
}

/* 请在这里填写答案 */
输入样例:
18 99 45 33 66 3 11 57 70 100 48 -9999
11
输出样例:
6
输入样例:
18 99 45 -33 66 23 101 -57 70 70 28 999 -45 33 66 3 11 57 80 10
100
输出样例:
not Find!

求解,还有为什么输入一行以后会直接输出。

基于Monster 组和GPT的调写:


#include <stdio.h>

int Input(int *p, int n) {
    int cnt = 0;
    while (cnt < n) {
        int x;
        scanf("%d", &x);
        if (x == -9999) break;
        p[cnt++] = x;
    }
    return cnt;
}

int Search(int *p, int n, int num) {
    for (int i = 0; i < n; i++) {
        if (p[i] == num) return i;
    }
    return -1;
}

int main(void) {
    int Arr[20], cnt = 0, num, Pos;
    cnt = Input(Arr, 20);
    scanf("%d", &num);
    Pos = Search(Arr, cnt, num);
    if (-1 == Pos) {
        printf("not Find!\n");
    } else {
        printf("%d\n", Pos);
    }
    return 0;
}

img

img

输入一行以后会直接输出,可能是在终端中输入完一行后按下回车键,这时回车键也被当做一个字符读入了,导致程序继续往下执行。可以在每次调用scanf函数后加上一个额外的getchar函数来读取回车键。例如,将scanf("%d", &num);修改为scanf("%d", &num); getchar();。

有啥困难?

#include<stdio.h>
int Input(int *p,int n);
int Search(int *p, int n, int num);
 
int main(void)
{
        int Arr[20],cnt=0, num, Pos;
         cnt = Input(Arr,20);
         scanf("%d", &num);    
    
         Pos = Search(Arr,cnt,num) ;  
        if (-1 == Pos)
        {
                printf("not Find!\n");
        }
        else
        {
                printf("%d\n", Pos);
        }
 
        return 0;
}
int  input(int *p,int n)
{
    int m;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&m);
        if(m == -9999)
            break;
        p[i] = m;
    }
    return i;
}
int Search(int *p, int n, int num)
{
    for(int i=0;i<n;i++)
    {
        if(p[i] == num)
            return i;
    }
    return -1;
}

img


至于为什么输入一行以后会直接输出,可能是因为输入数据中包含回车符等特殊符号,导致scanf函数只读取了第一个数据,后面的回车符自动被当做下一个scanf的输入。可以在每个scanf调用后加上一个getchar来清空缓冲区。例如:

scanf("%d", &num);
getchar(); // 读取回车符
这样可以清空输入缓冲区,保障下一个scanf函数正常读取数据。

这道题要求你写两个函数,一个函数Input用于从键盘读入数据到数组Arr中,读满20个数或者遇到-9999结束。另一个函数Search用于在数组arrA中查找num,输出查找的位置信息(下标从0计算),没有找到输出“not Find!”

函数接口定义:

void Input(int arrA[], int n);
int Search(int arrA[], int n, int num);

Input函数将数据读入数组中并返回实际读入的元素个数; Search函数返回查找num的位置信息,没有找到返回-1

输入样例:

18 99 45 33 66 3 11 57 70 100 48 -9999
11

输出样例:

6

输入样例:

18 99 45 -33 66 23 101 -57 70 70 28 999 -45 33 66 3 11 57 80 10100
-100

输出样例:

not Find!

为什么输入一行以后会直接输出,这是因为这里的数据是裁判测试程序样例,输入已经写在程序里了,只需要直接运行即可。如果你在本地输入,需要运行程序才会输出结果。