私は多くの比較があるコードを書こうとしています
数値を「定量化」する「QUANT.C」でプログラムを作成します。整数「x」を読み取ってテストし、 次の出力を生成します。 xは1000以上、「巨大な正」を印刷します xは999から100を含む(100を含む)「非常にポジティブ」を印刷 x 100〜0を印刷「ポジティブ」 x正確に0を印刷「ゼロ」 xを0〜-100を印刷 "ネガティブ」 x -100〜-999(-100を含む)は、「非常にネガティブ」を印刷します x以下は-1000以下「巨大なネガティブ」を印刷します したがって、-10は「ネガティブ」、-100は「非常にネガティブ」、458は「非常にポジティブ」を出力します。
それから私はスイッチを使用して解決しようとしましたが、うまくいきませんでした、ifステートメントを使用して解決する必要がありますか、スイッチを使用して解決する方法がありますか?
#include <stdio.h>
int main(void)
{
int a=0;
printf("please enter a number : \n");
scanf("%i",&a);
switch(a)
{
case (a>1000):
printf("hugely positive");
break;
case (a>=100 && a<999):
printf("very positive");
break;
case (a>=0 && a<100):
printf("positive");
break;
case 0:
printf("zero");
break;
case (a>-100 && a<0):
printf("negative");
break;
case (a<-100 && a>-999):
printf("very negative");
break;
case (a<=-1000):
printf("hugely negative");
break;
return 0;
}
ケースを整数型にする必要があるため、スイッチでこれを解決する明確な方法はありません。 if-else if-elseをご覧ください。
スイッチレスand if-else-lessメソッド:
#include <stdio.h>
int main(void)
{
int a=0, i;
struct {
int value;
const char *description;
} list[] = {
{ -999, "hugely negative" },
{ -99, "very negative" },
{ 0, "negative" },
{ 1, "zero" },
{ 100, "positive" },
{ 1000, "very positive" },
{ 1001, "hugely positive" }
};
printf("please enter a number : \n");
scanf("%i",&a);
for (i=0; i<6 && a>=list[i].value; i++) ;
printf ("%s\n", list[i].description);
return 0;
}
Forループにはコードが含まれていません(空のステートメント;
)ただし、入力された値a
が配列内のvalue
要素以上の場合、値を使用して配列を実行し、終了します。その時点で、i
は、印刷するdescription
のインデックス値を保持します。
Gccを使用している場合、言語拡張機能を使用することで必要なものを正確にサポートするため、「幸運」が得られます。
#include <limits.h>
...
switch(a)
{
case 1000 ... INT_MAX: // note: cannot omit the space between 1000 and ...
printf("hugely positive");
break;
case 100 ... 999:
printf("very positive");
break;
...
}
ただし、これは非標準であり、他のコンパイラーはコードを理解しません。標準機能(「移植性」)のみを使用してプログラムを作成する必要があるとよく言われます。
そのため、「合理化された」if-elseif-else
コンストラクト:
if (a >= 1000)
{
printf("hugely positive");
}
else if (a >= 100)
{
printf("very positive");
}
else if ...
...
else // might put a helpful comment here, like "a <= -1000"
{
printf("hugely negative");
}
(a>1000)
は1 [true]または0 [false]に評価されます。
コンパイルしてエラーを取得します
test_15.c:12: error: case label does not reduce to an integer constant
つまり、case
ラベルにinteger constant
値を使用する必要があります。この場合、If-else if-else
ループは正常に機能するはずです。
これは少し遅すぎるかもしれませんが:
switch( option(a) ){
case (0): ...
case (1): ...
case (2): ...
case (n): ...
ここで、option()関数は単純にif elseを持つ関数です。これにより、スイッチの外観をきれいに保つことができ、ロジック部分は他の場所にあります。
スイッチを使用する設定があるのはなぜですか?
これは「宿題の質問」のように聞こえるからです。コンパイラは、if/else構文をスイッチと同じくらい効率的に処理する必要があります(範囲を処理していなくても)。
スイッチは示されているように範囲を処理できませんが、最初に入力を分類し(if/elseを使用)、switchステートメントを使用して回答を出力することにより、スイッチを含める方法を見つけることができます。