おみくじのプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
junjunjun

おみくじのプログラム

#1

投稿記事 by junjunjun » 6年前

書籍、「新版 明解C言語 中級編」をしている者です。わからないところが出てきたので質問させて頂きました。
自由課題の課題1-1
「おみくじのプログラムを作成せよ。0~6の乱数を生成し、その値に応じて、[大吉][中吉][小吉][吉][末吉][凶][大凶]
を表示すること。」
なんですが、自分なりに、

コード:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
	int retry;
	int aaa;

	srand(time(NULL));

	while(printf("おみくじをしますか?はい・・・1,いいえ・・・0>"),!(scanf("%d",&aaa))){
		puts("おみくじをします。");
		retry=rand()%7;
		switch(retry){
		case 0:
			printf("大吉!\n");
			break;
		case 1:
			printf("中吉!\n");
			break;
		case 2:
			printf("小吉!\n");
			break;
		case 3:
			printf("吉!\n");
			break;
		case 4:
			printf("末吉!\n");
			break;
		case 5:
			printf("凶!\n");
			break;
		case 6:
			printf("大凶!\n");
			break;
		}
	}
	return 0;
}
と、作ってみました。
しかし、「おみくじをしますか?はい・・・1,いいえ・・・0>」と出て、1を入力してもおみくじが出来ません。
何故なのでしょうか?教えて下さい(>_<)

jay
記事: 314
登録日時: 9年前
住所: 大阪市
連絡を取る:

Re: おみくじのプログラム

#2

投稿記事 by jay » 6年前

while文の条件がややこし過ぎます(下手したら環境によって解釈変わるんじゃないかと)


while文に入る前に
printfでメッセージを表示、scanfで入力を取得し

if文でscanfの結果を調べて、1が入力されていたらおみくじの結果を表示する
という形に変えてみてはどうでしょうか?

1行の中に色々詰め込むよりは
1つ1つ処理を書いていく方が、コードも読みやすくなりますしね。
最後に編集したユーザー jay on 2013年7月16日(火) 20:16 [ 編集 1 回目 ]
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

アバター
みけCAT
記事: 6252
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: おみくじのプログラム

#3

投稿記事 by みけCAT » 6年前

scanfで1を読み込む→scanfの戻り値は1個読み込んだので1
→!演算子で論理が反転されて0→while文の条件が偽なのでwhile文の中のおみくじは実行されない

ですね。

コード:

while(printf("おみくじをしますか?はい・・・1,いいえ・・・0>"),scanf("%d",&aaa)==1&&aaa){
こうではないですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

pg78446

Re: おみくじのプログラム

#4

投稿記事 by pg78446 » 6年前

初めて書き込みます。

while文の条件を無限ループ(while(1)など)にして最初にprintfでメッセージ出力、その後にscanfで入力し、scanfで入力した値(この場合はaaa)の値に応じてbreak文でループ抜けするようにすればいいかと思います(その後のwhileループ内でおみくじの結果表示の処理)。

でも、まずはjayさんの提案するような単純なプログラムから進めていくことをオススメします。

junjunjun

Re: おみくじのプログラム

#5

投稿記事 by junjunjun » 6年前

これでいいでしょうか?アドバイスお願いします。

コード:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
	int retry;
	int aaa;

	srand(time(NULL));

	while(1){
		printf("おみくじをしますか?はい・・・1,いいえ・・・0>");
		scanf("%d",&aaa);
		if(aaa==0) break;
		puts("おみくじをします。");
		retry=rand()%7;
		switch(retry){
		case 0:
			printf("大吉!\n");
			break;
		case 1:
			printf("中吉!\n");
			break;
		case 2:
			printf("小吉!\n");
			break;
		case 3:
			printf("吉!\n");
			break;
		case 4:
			printf("末吉!\n");
			break;
		case 5:
			printf("凶!\n");
			break;
		case 6:
			printf("大凶!\n");
			break;
		}
	}
	return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: おみくじのプログラム

#6

投稿記事 by softya(ソフト屋) » 6年前

こういう再質問する時は、自分で動かした結果も報告したほうが良いと思います。
> 自分で試した分にはうまく動いていると思いますが、コードの書き方として問題はないでしょうか?アドバイスをお願いします。
という感じです。

で、アドバイスとしては、うまく動作していると思います。
ステップアップの提案としては
1.0,1以外の入力時の動作も書いてほしい。
2.全部同じ確率では無い方良いでしょう。吉が多めとか大吉と大凶は少ない方が良いと思います。
3.aaaとretryの変数名が意味不明なので分かりやすく工夫を。
なんてところでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

junjunjun

Re: おみくじのプログラム

#7

投稿記事 by junjunjun » 6年前

0,1以外の入力時の動作も書いたのがこれです。

コード:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
	int retry;
	int aaa;

	srand(time(NULL));

	while(1){
		printf("おみくじをしますか?はい・・・1,いいえ・・・0>");
		scanf("%d",&aaa);
		if(aaa==0) break;
                 else if(aaa==1){
		    puts("おみくじをします。");
		    retry=rand()%7;
		    switch(retry){
		    case 0:
			    printf("大吉!\n");
			    break;
		    case 1:
			    printf("中吉!\n");
			    break;
		    case 2:
			    printf("小吉!\n");
			    break;
		    case 3:
			    printf("吉!\n");
			    break;
		    case 4:
			    printf("末吉!\n");
			    break;
		    case 5:
			    printf("凶!\n");
			    break;
		    case 6:
			    printf("大凶!\n");
			    break;
			}
		}else{     
			 printf("0か1を入力してください。\n");
                          }
	}
	return 0;
}
自分で試した分にはうまく動いていると思いますが、コードの書き方として問題はないでしょうか?アドバイスをお願いします。

また、softya(ソフト屋)さんのアドバイス2と似たような課題が次の課題としてあります。
自由課題の課題1-2「全問で作成したプログラムを、出る運勢が均等とならないように改良したプログラムを作成せよ(例えば、[末吉][凶][大凶]を出にくくするとよい)。」
です。
このプログラムを作るのにおいてヒント(アドバイス等)を宜しくお願いします。
出る運勢が均等にならないようにするというのが、どうすればいいかわかりません。(>_<)

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: おみくじのプログラム

#8

投稿記事 by Dixq (管理人) » 6年前

例えば

コード:

            case 0:
                printf("大吉!\n");
                break;
            case 1:
            case 2:
                printf("中吉!\n");
                break;
にすれば中吉より大吉の方が出にくくなりますよね?この要領でどうでしょう。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: おみくじのプログラム

#9

投稿記事 by softya(ソフト屋) » 6年前

インデントが狂ってますね。そこが残念ですね。
あと書き忘れましたが、printf()で統一しましょう。書き分けている様でもなく何となく使っているように見えます。

>出る運勢が均等にならないようにするというのが、どうすればいいかわかりません。(>_<)

そうですね。現実で20面サイコロがあってサイコロを振ってその数で[大吉][中吉][小吉][吉][末吉][凶][大凶]を決めるとして、等確率にしないとしたらどうのような方法を取りますか?
それと同じなんですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

junjunjun

Re: おみくじのプログラム

#10

投稿記事 by junjunjun » 6年前

改良したコードがこれです。

コード:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
	int retry;
	int aaa;
	srand(time(NULL));
	while(1){
		printf("おみくじをしますか?はい・・・1、いいえ・・・0");
		scanf("%d",&aaa);
		if(aaa==0)break;
		else if(aaa==1){
			printf("おみくじをします\n");
			retry=rand()%11;
			switch(retry){
			case 0:
			case 1:
				printf("大吉!\n");
				break;
			case 2:
			case 3:
				printf("中吉!\n");
			             break;
			case 4:
                                        case 5:
				printf("小吉!\n");
			             break;
			case 6:
			case 7:
				printf("吉!\n");
			             break;
			case 8:
				printf("末吉!\n");
			             break;
			case 9:
				printf("凶!\n");
			             break;
			case 10:
				printf("大凶!\n");
			             break;
			}
		}else{
			printf("0か1を入力してください。\n");
		}
		
	}
}
自分で試した分にはうまく動いていると思いますが、コードの書き方として問題はないでしょうか?アドバイス宜しくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: おみくじのプログラム

#11

投稿記事 by softya(ソフト屋) » 6年前

問題ないと思います。ただ、No.6に書いたように変数名に気を配った欲しかったですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

junjunjun

Re: おみくじのプログラム

#12

投稿記事 by junjunjun » 6年前

ご回答ありがとうございした。
これからもプログラミング頑張りたいと思います。
また次の機会も宜しくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る