ページ 11

数字当てゲームについて

Posted: 2011年8月28日(日) 13:56
by aitoma
1. 自分は今、数字当てゲームを作りたくて、仕様は
1~99までの数字
0以下の数字、100以上の数字、文字は打ってしまったら、再度打ちこみをしろと命令を出させる
正解が66の場合、55と打ったら、数が大きい
77と打ったら、数が小さいという風にする。
制限回数が10回までで、10回を越えた場合、終わり。

2. 作ったプログラムは下記内容です。

3. どのようなエラーやトラブルで困っていて
文字(例えばKと打った場合)を打ったら、おかしな文章になって上手く出来ない。

4. 自分は何が解らないのか、知りたいのか

コード:

moji = getchar();
		if (isdigit(moji!= 0) {
			printf("文字は打てないn");
			count--;
この部分を変更したいのと、


scanf("%d", &input);のエラーを直したいです。

5. 今のCの知識はどの程度なのか

ほとんど初心者です。
宜しくお願い致します。


コード:


#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>

int main(void) {
	int moji,answer, input, count = 1;
	
	
	srand((unsigned) time(NULL));
	answer = rand() % 99+1;

	
	while (count <= 10) {
		printf("", count);
		scanf("%d", &input);
		if (input >= 100){
			printf("100以上の数字は打てないn");
			count--;
		}
		if (input <=0){
			printf("0以下の数字は打てないn");
			count--;
		}
		moji = getchar();
		if (isdigit(moji!= 0) {
			printf("文字は打てないn");
			count--;
		}
		
		if (input == answer) {
			printf("正解\n");
			break;
		}
		else if(input < answer) { 
			printf("数が大きい\n");
		} 
		else{
			printf("数が小さい\n");
		}
		count++;
	}

	if (count > 10) {
		printf("また挑戦してね");
	}
	return 0;
}

Re: 数字当てゲームについて

Posted: 2011年8月28日(日) 14:22
by softya(ソフト屋)
フォーラムルールに書いてあると思いますが、codeタグを使ってくださいね。今回は直しておきました。

で質問は、scanfを止めて独自に数字チェックと数値を変換行いたいと言う事でしょうか?

【補足】残念ながらscanf()で入力したのと同じ文字をgetchar()で取得することが出来ません。getchar()とscanf()は別の入力として扱われます。

Re: 数字当てゲームについて

Posted: 2011年8月28日(日) 15:27
by aitoma
>>で質問は、scanfを止めて独自に数字チェックと数値を変換行いたいと言う事でしょうか?

はい、そうです。
ただ、やり方がわからなくて・・

Re: 数字当てゲームについて

Posted: 2011年8月28日(日) 15:33
by softya(ソフト屋)
gets()で文字列として入力して、1文字づつチェックして全部数値ならOK。それ以外はエラーとするのでどうでしょうか?
配列、文字列を理解している必要がありますけど。

Re: 数字当てゲームについて

Posted: 2011年8月28日(日) 17:03
by aitoma
<gets()で文字列として入力して、1文字づつチェックして全部数値ならOK。それ以外はエラーとするのでどうでしょうか?
<配列、文字列を理解している必要がありますけど。

すいません・・・全然わからなくて・・・

Re: 数字当てゲームについて

Posted: 2011年8月28日(日) 17:07
by softya(ソフト屋)
C言語は何処まで学ばれたのでしょうか?
下記サイトだと何章相当ですか?
「苦しんで覚えるC言語」
http://9cguide.appspot.com/

あと聞いておかないと行けないことが。
もし課題なら、習っていない技術を使ってもOKですか?
課題でないなら全然気にしなくて良いのですが。

Re: 数字当てゲームについて

Posted: 2011年8月28日(日) 21:25
by box
数字以外の文字を入力したときに思った動きをしない点はさておき、
aitoma さんが書きました:

コード:

		if (input >= 100){
			printf("100以上の数字は打てないn");
			count--;
		}
		if (input <=0){
			printf("0以下の数字は打てないn");
			count--;
		}
100以上、もしくは0以下の数値を入力したときにトライ回数を減らす、
という動きは仕様どおりですか?

Re: 数字当てゲームについて

Posted: 2011年8月28日(日) 23:32
by aitoma
>softya(ソフト屋) さん

学んだのも自己流ですが、12章あたりだと思います。
使ってない内容でもOKです。


>boxさん

はい、仕様どうりです。

Re: 数字当てゲームについて

Posted: 2011年8月29日(月) 00:39
by softya(ソフト屋)
じゃあ、とりあえず文字列と配列はなしで組んでみましょう。
あとで文字列と配列を使った例も紹介します。
今回は、scanf()を止めてgetchar()だけで組んでみます。

説明。
getchar()は一文字のキー入力を受け取れます。
なので、一文字を得る毎に数値かチェックした上でOKなら変数inputに蓄えるようにします。
問題は一文字づつinputに数値を蓄える方法ですが、キーボードから得られるのは上位の桁からで、一桁づつと言う所に注目します。

たとえば、142と入力されたとします。
これは、1 x 100 + 4 x10 + 2と同じですね。 ← この桁毎の分解に意味があります。
これを更に読み替えます。
(1x10 + 4) x10 + 2
法則性がありませんか?
ax10+bが基本になっていますよね。 ← a=1でb=4なら(1x10 + 4)、 a= (1x10 + 4)でb=2なら(1x10 + 4) x10 + 2です。
ここがポイントです。
前の計算値を10倍して新しい桁の値を加えるだけで、どんどん桁上げが出来るわけです。
これをプログラムに書くと、
(1)moji = getchar();
(2)ENTERチェック
(3)数値チェック
(4)文字数値変換。
(5)input = input*10 + hitoketa;
となります。

(2)はgetchar();でENTERは文字の

コード:

if( moji=='\n') {
で判定できます。

(4)は、文字コードから数値に変換する必要があります。
文字コードは環境により変化するのでややこしいのですが、Windowsパソコンに限定して説明します。
文字コードも数値なのですが、'0'と言う文字は数値にすると48と言う値です。
「ASCIIコード表」
http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html
以下49,50…57まで連続していますよね。
なので、
int hitoketa = moji - '0';
で計算できます。

どうでしょう。理解できましたか?

Re: 数字当てゲームについて

Posted: 2011年8月29日(月) 11:53
by 白い時空
私としてはscanfの戻り値を調べるだけでいいかなと思います。

scanfの戻り値は普通、読み込めたデータ数になります。(EOFが来た場合のみ-1になります)

コード:

scanf("%d",&input);
この場合、数字の読み込みに成功すると1、失敗すると0が返ります。

簡単なサンプルを打ったので、文字でも入れて試してみてください。

コード:

#include <stdio.h>

int main(){
	int input,n;
	n = scanf("%d",&input);
	
	printf("n=%d\n",n);
	if(n==1){
		printf("input=%d\n",input);
	}else{
		printf("読み込み失敗\n");
	}
	return 0;
}

Re: 数字当てゲームについて

Posted: 2011年8月29日(月) 12:04
by softya(ソフト屋)
白い時空さんの方法でOKとみなすかどうかだと思います。
1kと打った場合は白い時空さんの方法ではエラーになりません。kまたはk1とかならエラーになります。
私の提案の方法はENTERまでの間に0から9以外の文字があったらエラーとする方法です。
決めるのは、aitomaさんです。

あっそれと仕様の
>boxさん
はい、仕様どうりです。
の件は、boxさんの指摘が正しいと思います。
0以下の数字、100以上の数字、文字は打ってしまったら、再度打ちこみをしろと命令を出させる
って打ち間違えたらエラーカウントするって意味には見えないですよ。

Re: 数字当てゲームについて

Posted: 2011年8月29日(月) 14:41
by non
後で、count++するから、その分をcount--しているのでしょうけど、その後の、answerとの比較処理に
入ってしまうので、流れとしておかしいですね。

Re: 数字当てゲームについて

Posted: 2011年9月03日(土) 18:34
by aitoma
結局はどういったソースコードになるのでしょうか?

Re: 数字当てゲームについて

Posted: 2011年9月03日(土) 18:39
by softya(ソフト屋)
どの手法を選ぶのか、どの様に書くかはaitomaさんが選ぶべきことですよ。
学習のために書いているなら色々書いてみるのも勉強になります。
仕様が曖昧なので、答えは一つではありませんからね。

とりあえず、1つめをどうするか選んで分からない事があれば質問してくださいね。

Re: 数字当てゲームについて

Posted: 2011年9月03日(土) 18:45
by box
aitoma さんが書きました:結局はどういったソースコードになるのでしょうか?
そこを『自分の頭で考える』ことが、プログラミングの醍醐味ではないんでしょうか。

Re: 数字当てゲームについて

Posted: 2011年9月08日(木) 00:00
by aitoma
それが出来たら、質問していません

Re: 数字当てゲームについて

Posted: 2011年9月08日(木) 00:21
by softya(ソフト屋)
私の方法で行くのか、白い時空さんの方法で行くのかを検討してください。
メリットとデメリットは提示してあります。選ぶのはaitomaさんです。
他人が選んでも意味ないですから。

その上で分からないことを聞いてください。