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

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

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

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

Q&A

解決済

3回答

370閲覧

for文とif文の使い方

h_proc

総合スコア68

C

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

0グッド

0クリップ

投稿2018/12/12 03:19

編集2018/12/22 02:32

じゃんけんゲームのプログラムをfor文用いて作るという課題が出されました。分からないながら、このようにソースコードをかいてみたのですが、案の定作動しませんでした。
コンピューターの手は乱数により、ランダムに提示され、人間の手はキーボード入力するようになっていて、勝敗がつくまで、じゃんけんが続くようにしたいです。
キーボードから2が入力された場合のソースコードを添付させていただきました。ご指導よろしくお願いいたします。

c

1#include <stdio.h> 2 3int get_number(void) 4{ 5 int jam = 0; 6 jam = ((((int)rand() / (int)(RAND_MAX + 1))) * 3 )+1; 7 return jam; 8} 9int main (void){ 10printf("Let's play rock,paper,scissors!\n"); 11 printf("Choose your hand from 1 to 3.\n"); 12 printf("1 rock\n"); 13 printf("2 paper\n"); 14 printf("3 scissors\n"); 15 int h = 0; 16 scanf("%d\n", &h); 17if (h = 2) { 18 int res = 0; 19 res = get_number(); 20 for (; res == 2;) { 21 printf("You are even.\n"); 22 printf("Choose your hand from 1 to 3.\n"); 23 printf("1 rock\n"); 24 printf("2 paper\n"); 25 printf("3 scissors\n"); 26 int h = 0; 27 scanf("%d", &h); 28 break; 29 } 30 for (; res == 1;) { 31 printf("You are win!!\n"); 32 break; 33 } 34 for (; res == 3;) { 35 printf("You are loose!!\n"); 36 break; 37 } 38 } 39return 0; 40}

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

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

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

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

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

guest

回答3

0

ベストアンサー

参考として、モックの1例を記載します。

整数以外の入力が無い前提であれば、大体、以下のようになるかと思います。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4int get_number(void) 5{ 6 int jam = rand()%3+1; 7 return jam; 8} 9 10void echo(void) { 11 printf("Choose your hand from 1 to 3.\n"); 12 printf("1 rock\n"); 13 printf("2 paper\n"); 14 printf("3 scissors\n"); 15} 16 17int main (void) { 18 int h, res; 19 20 for(;;) { 21 echo(); 22 scanf("%d", &h); 23 24 if (!(h >= 1 && h <= 3)) { 25 printf("1~3を入力してください。\n"); 26 continue; 27 } 28 29 // コンピュータの手をランダムに取得 30 res = get_number(); 31 32 if (res == h) { 33 // あいこの場合 34 printf("You are even.\n"); 35 } else if (勝ちの条件(複数ある場合は、||で複数記載)) { 36 // ユーザの勝ちの場合 37 printf("You are win!!\n"); 38 break; 39 } else { 40 // ユーザの負けの場合 41 printf("You are loose!!\n"); 42 break; 43 } 44 } 45 return 0; 46}

1点、課題内容によりますが、ユーザビリティ的にコンピュータの手は出力しなくて良いのかな?と思いました。

投稿2018/12/12 04:08

編集2018/12/12 04:10
aikon_marimo

総合スコア1083

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

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

h_proc

2018/12/22 02:19

回答ありがとうございます。参考にして、もう一度書き直してみます。
h_proc

2018/12/22 02:29

場合分けをfor 文を使って行うことはできないでしょうか。
aikon_marimo

2018/12/22 03:02

課題の内容的にif文を使ってはいけない、ということでしょうか? for文の条件式に書けば出来なくはないですが、わざわざfor文でやる意味はないです。
h_proc

2018/12/23 22:10

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

2018/12/23 22:25

確かに for は使ってますけどこれでは点数が低いと思います。 正しくないと言っているわけではありません。正しい処理をしているかどうかまでは読んでいません。 九九の宿題を足し算で答えるようなもので、答えは合っているが課題の意図とはずれているということです。 for を使えという課題は、初期化・継続条件・継続処理の三つが正しく理解できているかどうかを見るためのものです。この回答ではそれを見ることができません。
Zuishin

2018/12/23 22:46 編集

また細かいことですが、無限ループを抜ける手段が無いので、return 0 に到達できません。 到達できない部分のあるコードは保守性を損ないます。コンパイラによっては警告が出ます。 無限ループを抜ける手段を用意するか、main の戻り値を void とするのが良いと思います。 上記は正しくありませんでした。ループを抜ける手段は用意されているので訂正します。
Zuishin

2018/12/23 22:38

あと課題の目的は学習です。人にやらせて丸写ししたのでは無意味です。 宿題代行サイトへの規制が検討されている昨今、このような回答はあまり感心しません。
guest

0

if (h = 2) {
は、hが定義されていないので、実行エラーではなく、コンパイルエラーになります。
定義されたとしたら
if (h = 2) {
ではなく
if (h == 2) {
が正しいはずです。
まず、ソースを提示する場合は、コンパイルが正常に完了したものを提示するようにしましょう。
(#include 文も含めて全て提示してください。回答者は提示されたソースを回答者の環境でそのままコピペして実行し、確認します。その為、そのままコピペして、コンパイルエラーにならないものを提示してください)
コンパイルエラーが取れない場合は、「コンパイルエラーが取れない」という質問にしてください。

投稿2018/12/12 03:41

tatsu99

総合スコア5438

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

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

h_proc

2018/12/22 02:17

回答ありがとうございます。以後気を付けます。
h_proc

2018/12/22 02:34

大変申し訳ありません。冒頭でhを定義しても、作動しませんでした。(質問内容に冒頭のコードを追加しました。)もし可能でしたら、もう一度教えていただきたいと思います。よろしくお願い致します。
guest

0

変数宣言とかしてないのでビルドできない気がしますがそれは一旦おいておいて

forを用いた課題ということでifは使ってはいけないことはないはずなのでforではなくifで条件判定しましょう。

C

1int get_number(void) 2{ 3 int jam = 0; 4 jam = ((((int)rand() / (int)(RAND_MAX + 1))) * 3 )+1; 5 return jam; 6}

この関数で相手の手を返してる(多分13を返す)と思いますが、rand()は0RAND_MAXまでの整数を返すはずなので、この計算式ではおかしいはずです。余りを利用すればできるはずです。

あいこ判定の間ループ処理をしてあいこでなければループを抜け勝ちかまけ判定を入れればよいかと思います。

投稿2018/12/12 03:37

rururu3

総合スコア5545

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

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

h_proc

2018/12/22 02:18

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問