🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

解決済

5回答

1710閲覧

C言語:for文で出た多数の結果からある部分のみをピックアップ、また、結果全てが同じだった場合に、結果1つずつではなく一文で表したい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

0グッド

0クリップ

投稿2019/11/18 02:07

編集2019/11/18 02:58
ここに質問の内容を詳しく書いてください。 C言語で、以下のようなプログラムを書いています。 z=R1+xまでで、zの値を複数通り出しました。ここから、入力した値と一致しているzのみを抜き出して、その時のR1,R2,R3と一緒に表示させたいのですが、以下のような文章だとfor文で出た全ての結果に対してif,elseが実行されてしまいます。一致している値が1つでもあった場合は、 「指定された抵抗値○となるR1,R2,R3の組み合わせは、○、△、□です。」 と表示させて(複数あったら複数表示させる)、一致している値が1つもなかった場合は、 「指定された抵抗値○となるR1,R2,R3の組み合わせはありません。」 と表示させたいです。  初歩的な質問で申し訳ありませんが、ヒントだけでも教えていただきたいです。 ### 発生している問題・エラーメッセージ #include <stdio.h> int main(void) { long double a; puts("指定する合成抵抗値を入力してください。(整数で)"); printf("指定する抵抗値:"); scanf("%Lf",&a); long double R1,R2,R3,v,w,x; long double z; int i1,i2,i3; long R[30]={10,100,1000,10000,100000,15,150,1500,15000,150000,22,220,2200,22000,220000,33,330,3300,33000,330000,47,470,4700,47000,470000,68,680,6800,68000,680000}; for(i1=0;i1<30;i1++) for(i2=0;i2<30;i2++) for(i3=0;i3<30;i3++) { R1=R[i1]; R2=R[i2]; R3=R[i3]; v=R2+R3; w=R3*R2; x=w/v; z=R1+x; if(a==z) printf("指定された抵抗値%LfΩとなるR1,R2,R3の組み合わせは、\n R1=%LfΩ、R2=%LfΩ,R3=%LfΩ\n",a,R1,R2,R3); else printf("指定された抵抗値%LfΩとなるR1,R2,R3の組み合わせはありません。\n",a); } return 0; }

試したこと

if, else,break,contnueなど知っている文は色々試しましたが、どれもうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

C言語です。Xcodeでこのプログラムを書いています。よろしくお願いします。

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2019/11/18 02:31

お付けになっているタグで,「C++」は C とは異なります. また「プログラミング言語」は言語そのものに対するご質問の場合に使用するものかと思いますので, 両タグは外されたほうが良いと思います.
guest

回答5

0

全ての結果に対してif,elseが実行されてしまいます。

全ての結果それぞれに対して if else を実行するコードになっています.

一致している値が1つでもあった場合は、(略)
1つもなかった場合は、(略)

y_waiwai さんや fana さんのおっしゃっているように, ループでは探すのみで一致したらループを終わり, 後に表示するのが常かと思います.

else の printf を3重for の後に出し, if の printf の後に return を入れる形では如何でしょうか.

c

1 if(a==z) { 2 printf("指定された抵抗値%LfΩとなるR1,R2,R3の組み合わせは、\n R1=%LfΩ、R2=%LfΩ,R3=%LfΩ\n",a,R1,R2,R3); 3 return 0; 4 } 5 } 6 printf("指定された抵抗値%LfΩとなるR1,R2,R3の組み合わせはありません。\n",a);

なお, {} を省略する書き方では, 修正時に常に処理が含まれているかの注意が必要です.
特にこのような行数の加減が多く発生する開発段階では, 常に {} を付けておかれたほうが良いかと思います.

投稿2019/11/18 02:58

jimbe

総合スコア13202

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

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

退会済みユーザー

退会済みユーザー

2019/11/18 03:27

{}は全てのforに必要なのですね、ありがとうございます、勉強になりました。
guest

0

ベストアンサー

組み合わせが見つかったとき、印字するとともに、その回数をカウントします。
最後に、その回数が0なら、組み合わせなしとします。
以下のようにしてください。

C

1#include <stdio.h> 2int main(void) 3{ 4 long double a; 5 6 puts("指定する合成抵抗値を入力してください。(整数で)"); 7 printf("指定する抵抗値:"); 8 scanf("%Lf", &a); 9 10 long double R1, R2, R3, v, w, x; 11 long double z; 12 int i1, i2, i3; 13 long R[30] = 14 { 10, 100, 1000, 10000, 100000, 15, 150, 1500, 15000, 150000, 22, 15 220, 2200, 22000, 220000, 33, 330, 3300, 33000, 330000, 47, 470, 16 4700, 17 47000, 470000, 68, 680, 6800, 68000, 680000 18 }; 19 int counter = 0; 20 for (i1 = 0; i1 < 30; i1++) { 21 for (i2 = 0; i2 < 30; i2++) { 22 for (i3 = 0; i3 < 30; i3++) { 23 R1 = R[i1]; 24 R2 = R[i2]; 25 R3 = R[i3]; 26 v = R2 + R3; 27 w = R3 * R2; 28 x = w / v; 29 z = R1 + x; 30 31 if (a == z) { 32 printf 33 ("指定された抵抗値%LfΩとなるR1,R2,R3の組み合わせは、\n R1=%LfΩ、R2=%LfΩ,R3=%LfΩ\n", 34 a, R1, R2, R3); 35 counter++; 36 } 37 } 38 } 39 } 40 41 if (counter == 0) { 42 printf 43 ("指定された抵抗値%LfΩとなるR1,R2,R3の組み合わせはありません。\n", 44 a); 45 } 46 return 0; 47} 48

今後、質問するときは、
添付図

<code>をクリックすると
"""ここに言語を入力
コード
"""
の文字がでます。
言語のところは"C"を設定し、
コードのところへあなたのソースを貼り付けてください。
そうすると、インデントがきれいに保たれて見やすい状態で表示されます。

投稿2019/11/18 02:50

tatsu99

総合スコア5493

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

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

退会済みユーザー

退会済みユーザー

2019/11/18 03:24

ありがとうございます、うまくいきそうです。
guest

0

関数を作り、R1,R2,R3の値が見つかったときにまとめて構造体で返せば良いです。

C

1typedef struct { 2 int R1, R2, R3; 3} Rs; 4 5Rs search_Rs(int R[], size_t r_size, double purpose) { 6 for(...) { 7 int R1 = ...; 8 for(...) { 9 int R2 = ...; 10 for(...) { 11 int R3 = ...; 12 13 double z = ...; 14 if(zとpurposeが充分近い) { 15 Rs rs = {R1, R2, R3}; 16 return rs; 17 } 18 } 19 } 20 } 21 22 // 探索失敗 23 Rs ret = {-1, -1, -1}; 24 return ret; 25} 26 27int main(void) { 28 ... 29 30 Rs rs = search_Rs(R, 30, a); 31 if(rs.R1の値が-1) { 32 抵抗値の組み合わせを出力; 33 } 34 else { 35 printf("指定された抵抗値%LfΩとなるR1,R2,R3の組み合わせはありません。\n", a); 36 } 37 38 ... 39}

『充分近い』とは?

浮動小数点数型の値を扱う際には、常に誤差について検討する必要があります。
同じ値をとるか確認する際は、f1 == f2 ではなく abs(f1 - f2) < ε を判定に使って下さい。
このときεは充分小さい適当な値です。

質問編集を受けて

複数あったら複数表示させる

急に要件増えましたね。それだと上記の方法は使えません。
動的にメモリを確保するのも面倒ですし、関数内で出力も済ませてしまいましょう。

C

1#include <stdbool.h> 2 3... 4 5bool print_Rs(...) { 6 bool found = false; 7 三重ループ { 8 ... 9 if(zとpurposeが充分近い) { 10 抵抗値を出力; 11 found = true; 12 } 13 } 14 15 if(!found) { 16 printf("指定された抵抗値%LfΩとなるR1,R2,R3の組み合わせはありません。\n", purpose); 17 } 18 19 return found; // 返しておくと後々便利かも 20}

C++のstd::vectorが使えると簡単なんですが。

コードの貼り方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押して下さい。
C

投稿2019/11/18 02:29

編集2019/11/18 03:02
LouiS0616

総合スコア35668

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

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

退会済みユーザー

退会済みユーザー

2019/11/18 03:24

コードの貼り方知りませんでした。指摘ありがとうございます
guest

0

if(a==z)

で一致の判定ができてるのだろうか…? という点はとりあえず置いておいて……

関数にして,「一致」した時点でreturnすれば良いのでは.


あれ? 質問内容が180度変わってない?
全列挙したいならこの質問の問題点とは一体は何なのか?
単に「1個もない」と表示したいだけ? なら,フラグ1個用意すりゃ終了なんじゃねーの????

投稿2019/11/18 02:24

編集2019/11/18 02:58
fana

総合スコア11985

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

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

退会済みユーザー

退会済みユーザー

2019/11/18 03:25

すみません、フラグを習ったことなかったので、フラグを使う書き方はできませんでした。習ったら、フラグを用いてもう一度やってみます。
guest

0

条件に合致したときになんかフラグをセットするようにして、そのフラグでループを抜けるようにしましょう。

#goto使ってもいいけどねえ

投稿2019/11/18 02:17

y_waiwai

総合スコア88038

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

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

退会済みユーザー

退会済みユーザー

2019/11/18 03:26

gotoやフラグについて何も知らないので、勉強します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問