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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

6回答

2857閲覧

C++初心者です... IF文の結果を並べたいです

kuroichi11

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/02/06 23:23

僕は部活のデモストで、友達と協力して選んだ選択肢によってストーリーが進むプログラミングを組みたいのですが、IFでその先を分岐する際に、どうしても2の選択肢を実行してしまいます...
多分分かる方にはとても簡単なのでしょうけど、僕はどうにも といった状況です
教えていただけるとありがたいです
因みに分岐したいのは(d==2)と、(e==4)のところです。
中一の組んだプログラムですので、内容の幼さは勘弁してください...

int main(void) { printf("ミノゴブリンを倒せ!\n スタートは1を、やめるは2を押して!"); int a,b,c,d,e,f,g,h,i,j,k,l; scanf("%d",&a); if (a==1); { printf("本作品はミノゴブリンを様様な魔法を使って倒していく楽しい作品です*本作品においてエンターを押すと自動的に続けられます。\n"); getchar(); printf("あなたは男ですか?女ですか?男なら1を、女なら2をおして!\n"); scanf("%d",&b); if (b==1); { printf("貴方の職業は武闘家です!\n"); getchar(); printf("武闘家の技は、炸裂のパンチ(1)・変態燕返し(2)・(三ターンに一回のみ)秘技 飛翔龍神脚(3)・超足クサキック(4)\n"); getchar(); printf("ミノゴブリン(弱)が現れた!!!!!!!!\n"); getchar(); printf("1,2,4,のどれかの技を選んでね!(3はパワーが貯まっていません。)"); scanf("%d",&c); if (c==1); { printf("武闘家はミノゴブリンに炸裂のパンチを放った!\n 敵は火傷状態になった!(5ダメージ+毎ターン1ダメージ)\n"); getchar(); printf("ミノゴブリンの体力は残り24!\n (ミノゴブリンの体力は30、武闘家の体力は120だ!)"); getchar(); printf("ミノゴブリンのターン!反撃だ!"); printf("ミノゴブリンの とっしん! しかしコケてしまった!\n 武闘家にダメージ0\n ミノゴブリンに2のダメージ"); getchar(); printf("次はどの技を出す?\n 2,4"); scanf("%d",&e); { if (d==2); printf("武闘家は変態燕返しを発動した!\n 三回まで相手の攻撃を反射するぞ!(自動)\n"); getchar(); printf("ミノゴブリンの体力は残り21!\n (毎ターン1ダメージを受ける) "); printf("ミノゴブリンの マッハ突進! しかし 武闘家は変態燕返し を発動した!\n 武闘家にダメージ0\n ミノゴブリンに20のダメージ!\n おっと 火傷でミノゴブリンの体力は0! 瀕死だ!"); getchar(); printf("今なら秘技 飛翔龍神脚が発動できるぞ! \n (enterを押せ!)"); getchar(); printf("食らえ! 秘技! 飛翔龍神脚!\n"); printf("ミノゴブリンは 倒れた!\n"); printf("You win!"); getchar(); printf("ありがとうございました enterを押して出て下さい。"); getchar(); return 0; } if (e==4); printf("武闘家は超足クサキックを放った!\n 敵はクサ過ぎて混乱状態になった!\n (5ダメージ)"); getchar(); printf("ミノゴブリンが攻撃を開始した!\n しかし敵は混乱状態で、自分に攻撃をしている!\n (毎ターン10ダメージ)\n"); printf("ミノゴブリンの体力は残り8だ!(30-5-5-10-1-1。)"); getchar(); printf("今なら秘技 飛翔龍神脚 が発動できるぞ!\n (enterをおせ!)\n"); getchar(); printf("食らえ! 秘技! 飛翔龍神脚!\n"); printf("ミノゴブリンは 倒れた!\n"); printf("You win!\n"); getchar(); printf("ありがとうございました enterを押して出てください。"); getchar(); return 0; } } } } }

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

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

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

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

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

kozuchi

2016/02/07 02:10

どういった部活でしょうか?コンピュータやプログラミングに関係する部活かどうかでアドバイスすべき内容も変わってきますが。
kuroichi11

2016/02/07 10:17

早稲田中学の、物理研究部です。 電子工作・プログラミングを主としている部活ですね。 この部活でのプログラミングは二種類あって、僕のは〖見る〗形のプログラミングです
guest

回答6

0

if文の使い方が間違っています。

C

1if (a==1); 23```このセミコロンでif文の効力が終了してしまうので、他のif文も同様に外してください。 4```C 5if (a==1) 6{ 7 // if文の条件に当てはまったときに実行したい内容 8 : 9 : 10} 11```このように、if文の直後に実行させたい内容をブロックにして(中括弧(`{`,`}`)で括って)書く必要があります。 12 13`if (d==2);`のところと`if (e==4);`のところはブロックになっていませんので、ちゃんと中括弧で括ってください。 14 15それと`(d==2)`の`d`が入力のないまま使われています。`e`の間違いでは?

投稿2016/02/06 23:57

catsforepaw

総合スコア5938

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

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

kuroichi11

2016/02/08 11:56

[e]の間違いでした! 関数の指定を間違えていたみたいです。 ありがとうございました!
guest

0

ベストアンサー

C++だと、if文は 例えば(例)のようになるので、
if文の()の後ろにある";"をすべて削除するとうまく作動する気がします。
※";"プログラムが1文終了した意味?少し説明が難しいです、すみません(汗)

今の状態であれば、おそらく、上から順番にすべて処理してしまっているので、
先にくるd==2が必ず処理され、その後returnを通るため、
e==4の分岐がされていない状態かと。

わかりにくい説明ですみません。

(例)if (x == 0)
{
printf_s("x is 0!\n");
}

ご質問さなっているソース↓
if (a==1);←分岐を見るが、ここに";"があるため、次の処理を必ず行う
{
if (b==1);←分岐を見るが、ここに";"があるため、次の処理を必ず行う
{

if (c==1);←分岐を見るが、ここに";"があるため、次の処理を必ず行う { scanf("%d",&e); { if (d==2);**←分岐を見るが、ここに";"があるため、** 処理**←この処理が通り、

** return;←ここでリターンしてしまう。
}
if (e==4);←上でreturnしてしまうため、4は必ず通らない。
処理
return;
}
}
}
}

投稿2016/02/08 09:53

nothing

総合スコア27

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

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

kuroichi11

2016/02/08 11:52

ありがとうございました! 仰られた通り、セミコロンを外し、{}を正規の位置(ほかの方のアドバイス)に置いたら、ちゃんと作動しました!
guest

0

他の方の説明の補足程度ですが、1から説明していきます。

if文とは

if(条件) 式文1
if(条件) 式文1 else 式文2

「条件」が真のとき、「式文1」を実行する。
偽のとき、「式文2」を実行する。
式文には、単文のみ記述することができる。

こんなことぐらい分かっている、バカにするな! と怒られそうですね。
ですが少し立ち止まって考えてみます。「式文」って何だ?

規格書には、「式文とは、式を書く事のできる文である。」と書いてあります。

…さっぱり何を言っているのか分からないと思うので説明します。
例えば、次のコードは式文です。

C

1; 2```何も書いてないではないか、と思われたでしょう? その通りです。 3これは、null文と呼ばれ、何もしない式文です。 4もうお気づきだと思いますが、質問者さんは、 5```C 6if(条件); 後続文 7```と書いているため、if文にnull文が指定され、後続文が無条件に実行されてしまったのです。 8 9では、どうすれば複数の処理をまとめて指定できるのか。 10実はもう、知っているはずです。 11```C 12{0個以上の式文} 13```いわゆるブロックです。これは複文と呼ばれ、複数の式文を単文としてまとめるために用いられます。要するに、 14```C 15if(条件){...} 16```と書くことで、複数の制御を行うことができるのです。 17 18(長くなったので、「条件」についての説明は省略しました。要望があれば補足します。)

投稿2016/02/08 03:14

majiponi

総合スコア1720

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

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

kuroichi11

2016/02/08 11:54

セミコロンが原因だったんですね! null文...初めて知りました。 ここまでやって知らなかったのは恥ずかしい限りです... これから参考にさせていただきます 分かりやすい説明、ありがとうございました!
guest

0

確かにIF文で条件分岐しても良いのですが、この場合はどちらかと言うと

switch文を使う方がコードの可読性が上がるかもしれません。
予め分岐するパターンを把握しておいて、各パターンでswitch文で処理を分けるという
感じですね。

投稿2016/02/06 23:58

Tossy

総合スコア38

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

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

kuroichi11

2016/02/08 11:55

アドバイスありがとうございます! switch文は、知っていますがまだ使ったことがないです... これから使ってみますね!
guest

0

今時は中学生からC++を使うんですか!凄いですね。

if文の()の後ろに;(セミコロン)を付ける表記は見たことがないので合っているか分かりませんが、if (d==2);のところだけ間違っているような気が。

C++

1scanf("%d",&d); // &dを&eと打ち間違い? 2if (d==2) 3{ //括弧の位置はif文の後ろかな? 4 printf("武闘家は変態燕返しを発動した!\n 三回まで相手の攻撃を反射するぞ!(自動)\n"); 5 6 (中略) 7} else if( d==4 ) { 8 printf("武闘家は超足クサキックを放った!\n 敵はクサ過ぎて混乱状態になった!\n (5ダメージ)"); 9 (中略) 10 11}

あと女性の場合は未実装ですか?

投稿2016/02/06 23:52

chinyato

総合スコア241

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

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

kuroichi11

2016/02/07 10:22

女性・その他の選択肢・続きはまだ未実装です...
kuroichi11

2016/02/08 11:50

ありがとうございました!
kuroichi11

2016/02/08 11:57

{}の位置と、関数の指定を間違えていたみたいでした! ありがとうございます!
guest

0

if 文の理解に混乱があるようです。
おそらく、さまざまなソースコードを見て

C

1if ( 条件 ) 処理; 2

といった記述と

C

1if ( 条件 ) { 2 処理; 3 処理; 4 ... 5} 6

といった記述があるのを見て整理しきれていないのでしょう。

慣れてくれば正しく書けるようになると思いますが、
今の段階ではどうかんがえたらいいのか指標が無い状態だと思いますので、
初心者にお勧めの考え方を書きます。
(あくまでも一つ考え方であって、上級者も含めただれにとっても正しいことという意味ではないので注意してください)

if 文(制御構文)の記法のとらえ方

以下のようにとらえ、よくわからない最初のうちは
「基本的な考え方」で書くようにして、例外的な書き方は忘れてください。

基本的な if 文の書き方

C

1if ( 条件 ) { 2 処理; 3}

処理が一文(一行ではないことに注意)の場合のみ特別に許される例外的書き方

C

1if ( 条件 ) 2 処理;

C

1if ( 条件 ) 処理;

蛇足(注意)

後者の書き方には愛好者がたくさんいます。
とくに熟練者に多いです。
ただし、この書き方を嫌っている人も熟練者には多いです。

この考え方は、あくまでも自分がなれるための便宜的な考え方ということを理解してください。
あなたも慣れてくれば、自分なりの別の考え方を持つようになるでしょう。
どちらの書き方をするべきかは、そうなったときあなたが自分で考えてください。
ここで示したのは、そうなるまでの仮の考え方です。

投稿2016/02/08 21:52

編集2016/02/09 11:49
kozuchi

総合スコア1193

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

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

catsforepaw

2016/02/09 00:12

最後の書き方はお勧めしません。熟練者に多いなどと書くとまねする人も出てくるかと思いますので、念のため問題を指摘しておきます。 「条件」と「処理」を1行で書いてしまうと、ブレークポイントやステップ実行は基本的に行単位なので、「条件」と「処理」を別々に止めることができなくなってしまいます。 デバッグできないコードは良くないコードです。
majiponi

2016/02/09 01:08 編集

「最後の書き方」というより、1文だけの書き方自体、オススメしません。 例えば、以下のコードはどのように動作するでしょうか? if(A)   if(B) C; else   D; (レイアウトの都合上、全角スペースでインデントを調整しています) 正解は「Aが真、Bも真ならばCを実行し、Aが真、Bが偽ならばDを実行する。」です。おそらく、「Aが真、Bも真ならばCを実行し、Aが偽ならばDを実行する。」と間違えたのではないかと思います。このように、単文指定の書き方は、ときに見た目に反した、意図しない動作を引き起こし、バグの原因となります。 私の説明では、規格書上は単文が原則だと言いましたが、現実は逆で、実用コードの8割以上がブロック指定です。なので今は、ブロックでくくる書き方だけ覚えればいいと思います。
kozuchi

2016/02/09 12:30 編集

お二人のおっしゃることは私が言いたくて我慢していたことそのままです。 書かなかった理由は三つあります。 一つは感情的になりそうなので自制したこと。(正直嫌っている度合ではお二方に負けない自信があります。) もう一つは、質問者の方が現役の職業プログラマではなく、部活でプログラムを組んでいる中学生で、 理解の程度が、質問にそえられたコードの内容のようなものだったからです。 今の段階では、経験を積まないとピンとこない問題を述べ立てても消化しきれない と思われるので、分かり易い原則を一つ示す方が有益だと思ったからです。 最後の理由は、この原則で経験を積めば、そういった問題は自ずとわかってくるからです。 >早稲田中学の、物理研究部です。 電子工作・プログラミングを主としている部活 をしているこの質問者の方はおそらく、専門のプログラマにならないにしても、 そういったこととかかわりのある道に進む可能性が高いと思います。 私としては、この質問者の方に私の言ったことを鵜呑みにするのではなく、 自分の経験からそういった知見をつかむという体験をしてほしかったのです。 >熟練者に多いなどと書くとまねする人も出てくるかと思いますので、 この点は配慮が足りなかったと思います。回答を修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問