質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

732閲覧

if文からswich文への書き換え

h_proc

総合スコア68

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/11/29 10:09

if-else文を用いて三つの整数値の大小を比較するソースコードを作りました。これをifを使わずに、switch文を用いて書き換えようとしたのですが、swich文では式の値しか返せず、困っています。switch文が使えないとなると、どの文を使えば良いのでしょうか。繰り返し文を用いるしかないのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

3 つの数 -2, 0 , 2 に対して、 x がどの区分に入っているかを判定する処理を
if 文無しで書いてみました。

関数 f(x) は、 x がどの区分にいるかに応じた int 値を返すように定義してます。
関数 sing_1(x) は
0: x < 0 の場合
1: x == 0 の場合
2: 0 < x の場合
となるように定義しています。

x.c

c

1#include <stdio.h> 2 3#define A (-2) 4#define B (0) 5#define C (2) 6 7int sign_1(int x) { 8 return (0 < x) - (x < 0) + 1; 9} 10 11int f(int x) { 12 return sign_1(x - A) + sign_1(x - B) * 10 + sign_1(x - C) * 100; 13} 14 15void print_status(int x) { 16 switch (f(x)) { 17 case 0: 18 printf("x < %d\n", A); 19 break; 20 case 1: 21 printf("x == %d\n", A); 22 break; 23 case 2: 24 printf("%d < x < %d\n", A, B); 25 break; 26 case 12: 27 printf("x == %d\n", B); 28 break; 29 case 22: 30 printf("%d < x < %d\n", B, C); 31 break; 32 case 122: 33 printf("x == %d\n", C); 34 break; 35 case 222: 36 printf("%d < x\n", C); 37 break; 38 } 39} 40 41int main() { 42 for (int x = A - 1; x <= C + 1; x++) { 43 printf("x = %d: ", x); 44 print_status(x); 45 } 46 return 0; 47}

実行例
イメージ説明

投稿2018/11/29 14:23

編集2018/11/29 15:17
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_proc

2018/11/29 14:41

回答ありがとうございます。参考にさせていただきます。
guest

0

これをifを使わずに、switch文を用いて書き換えようとしたのですが

C言語のswitchでは、比較対象は定数式だけなので、汎用的なifの代替として使うのは難しいです(なぜそのように書き換えたいのでしょうか)。

投稿2018/11/29 10:46

maisumakun

総合スコア145201

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_proc

2018/11/29 12:34

分かりました。ありがとうございます。課題で、if文を用いずに書き換えるように指示されたからです。
maisumakun

2018/11/29 12:44

「繰り返し文を用いるしかないのでしょうか。」→無理やりですが可能です。 while(評価したい式){条件成立の際に実行する文; break;}とすれば、条件分岐の代わりも可能です(もっとも、実用すべきでないのは間違いありません)。
h_proc

2018/11/29 13:30

ありがとうございます。
guest

0

ベストアンサー

こういうのでもいいのですか?

C

1switch ((a < b) * 2 + (a > b)) { 2 case 1: 3 break; 4 case 2: 5 break; 6 default: 7 break; 8}

投稿2018/11/29 10:37

Zuishin

総合スコア28662

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/11/29 10:44

sign が使えるなら switch(sign(a -b)) で -1, 0, 1 の 3 つになります。
cateye

2018/11/29 11:06

数値によっては可能かも? 0位上、10位上、20位上等なら10で割れば0.1.2になります。
Zuishin

2018/11/29 11:13

三つの整数値というのはそういう意味でしたか。
Zuishin

2018/11/29 11:31

仮に 10 20 50 と a を比較するのであれば (a >= 10) + (a >= 20) + (a >= 50) で 0 1 2 3 の 4 つの定数値になりますから switch が使えますね。 10 20 50 という値自体は変化しても 0 1 2 3 が定数なので大丈夫です。
h_proc

2018/11/29 12:36

申し訳ありません。なぜ、(a >= 10) + (a >= 20) + (a >= 50) で0123の四つの値になるか教えていただきたいです。
h_proc

2018/11/29 12:41

あと、switch ((a < b) * 2 + (a > b))の(a<b)はどのような値になるのでしょうか。
Zuishin

2018/11/29 12:43

真は 1 で偽は 0 です。 例えば a が50の場合、3 つの条件式が全て真になるので 3 です。 30 の場合は 2 です。 15 の場合は 1 です。 9 の場合は 0 です。
h_proc

2018/11/29 13:32

分かりました。ありがとうございます。
guest

0

switchは、どの値か、を判定するもので、値の大小の比較はできません。
これがしたいならif文でやりましょう

投稿2018/11/29 10:11

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_proc

2018/11/29 10:24

if文以外で大小比較ができる文はないのでしょうか、、、。
y_waiwai

2018/11/29 10:27

なぜifを使いたくないんでしょうか。 まあ、テとしては、その数字以下の数値を全部書く、数字以上の数字を全部書く、という方法はありますがw
maisumakun

2018/11/29 10:50

ifだけ回避すればいいのなら、三項演算子で書いてしまう、という手段もありますが、それではまずいでしょうか。
h_proc

2018/11/29 12:39

if文を使わずに書き換えるという課題が出されたからです。三項演算子は授業で扱っていません。
y_waiwai

2018/11/29 12:46

ならその講師に聞きましょうよ。 ここで当てずっぽうやっても無駄なだけですぜ
guest

0

比較した結果として何を返すのでしょうか?

(a > b) && (b > c) && funcA(); // a > b > c の時、 funcA()が実行
(a < b) && (b < c) && funcB(); // a < b < c の時、 funcB()が実行
..

(一応、funcA(), funcB() の戻り値は、int とする)

されますが、こんなのは?

投稿2018/11/29 13:41

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問