1

4 つの変数のうち 0 より大きい変数の数を数えようとしていたので、目的を達成するためにこれらの if ステートメントを書きました。すべての数値は正または 0 になります。

            if(a1>0){counter++;}
            if(a2>0){counter++;}
            if(a3>0){counter++;}
            if(a4>0){counter++;}

            printf("%d", counter);

変数の数が増えると、何らかの問題が発生することは明らかです。これを書くより効率的な方法はありますか?

私を助けてくれてありがとう。

4

5 に答える 5

6

単一のステートメントを探している場合は、

 counter+= (a1>0) + (a2>0) + (a3>0) + (a4>0);

する必要があります。データを配列にパックすることにした場合は、

#define SIZE(x) (sizeof(x)/sizeof*(x))
int x, a[4];
for(x=0; x<SIZE(a); x++)
    counter += (a[x]>0);

まだ適度にコンパクトです。

于 2012-06-07T00:48:17.720 に答える
5

基本的に、チェックするメモリアドレスと結果をどこに置くかをコンパイラに指示する必要があります。

ローカル変数が多数ある場合は、個別に宣言された大量の変数ではなく、それらを保持する配列または同様のデータ構造を検討することをお勧めします。その場合、カウンターの結果も保持する配列を定義し、ループ構造を使用できます。

大量のローカル変数がない場合、現在のアプローチはそれと同じくらい優れていると思います(配列内の各変数へのポインターを配置してからループを使用することで空想にふけることができますが、配列の初期化は少なくとも現在のifステートメントと同じくらい面倒です)。

名前が付けられている場合は配列を使用するようにプログラムロジックを変更しません。個々の変数はより自然に適合します。

于 2012-06-07T00:38:29.187 に答える
3

アレイを使用した場合はどうなりますか?このような:

int a[4];
int counter;
int i; // iterator
for(i=0;i<4;i++){
    if(a[i]>0){
        counter++;
    }
}
printf("%d", counter);

それはより速く、より短いコードですが、別々の変数が必要な場合、あなたの方法は可能な限り効率的です。

于 2012-06-07T00:43:43.600 に答える
0

個別の変数ではなく、配列を使用してください。次に、配列をループします。

于 2012-06-07T00:36:53.167 に答える
0

すべての変数が同じ型の場合、変数へのポインターを配列に格納し、ループを使用してカウンターをチェックしてインクリメントできます。

于 2012-06-07T00:41:48.657 に答える