1

私はこれがハードウェアの質問のように見えるかもしれないことを知っています、そしてこれは自己学習の練習なのでそれをそのように扱うために私のゲストになります。

複数の配列内に特定の値が存在するかどうかをテストする最も簡単な方法は何でしょうか。

例えば:

擬似コード

if array a contains a value of 4 and
   array b contains a value of 2 and
   array c contains a value of 6 
then procede to procedure x

私がこれまでに実装してきたこと

#include<stdio.h>

void x(void){/* do stuff */}

int main()
{
    char fndA = 0;
    char fndB = 0;
    char fndC = 0;

    int a[5] = {1,2,3,5,6};    
    int b[5] = {1,2,2,3,4};
    int c[5] = {1,3,4,5,6};

    for(int i=0;i<5;i++)
    {
        if(a[i]==4){fndA=1;}
    }

    //repeat for-loop for b/fndb and c/fndC

    if (fndA && fndB && fndC) {x();}

    return 0;
}

この例でx()は、4が配列に存在しないため、呼び出されることはありませんaforしかし、最終的には、テストするアレイごとにループを構築する必要がありますか?ありがとう

4

3 に答える 3

5

はい。ただし、ループを実行する関数を作成することはできます。配列、そのサイズ、および探している要素をその関数に渡す必要があります。

int array_contains_int(int *arr, size_t size, int value) {
    int i;
    for(i = 0; i < size; i++)
        if(arr[i] == value)
            return 1;
    return 0;
}
于 2012-05-21T20:04:09.353 に答える
2

はい。あなたが書いたコードは基本的にあなたがすることです。一般に、配列をセットとして扱っているように見えます。その場合、これはセットのシグネチャを持つ抽象データ型と考えることができます。member()代わりに、これらの配列を他の方法で実装した場合は、関数を抽象化して実行時間を短縮できる可能性があります。通常はO(log(n))(ツリーベースの実装の場合)です。ただし、はい、何をするにしても、member()関数に対してANDを実行する必要があります。

于 2012-05-21T20:05:23.637 に答える
0

intと配列を取り、trueまたはfalseを返す関数を作成します。それからそしてそれらのうちの3つを一緒に。

これには、最初のループの1つが条件でfalseを返した場合に、後のループを呼び出さないという追加の利点があります。

于 2012-05-21T20:05:08.643 に答える