ここから本文です

C言語記憶力ゲームを修正したいです。 下記コードのif( no != num) 0012の場...

sas********さん

2020/7/1501:00:03

C言語記憶力ゲームを修正したいです。

下記コードのif( no != num)
0012の場合は12でも012でも0012でも正解となってしまいます。

0012の場合は0012以外は不正解としたいです。文字列への変換をしなければならないのですが、どのようにコードを書き換えればよろしいでしょうか?
よろしくお願い致します。

/* 記憶力トレーニング(4桁) */

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

#define MAX_STAGE 10 /*ステージ数 */

/* x秒経過するまで待つ */
int sleep(unsigned long x)
{
clock_t c1 = clock(),c2;
do
{
/* エラー処理 */
if((c2 = clock()) == (clock_t)-1)
{
return 0;
}
}
while(1000.0 * (c2 -c1) / CLOCKS_PER_SEC < x);
{
return 1;
}
}

int main(void)
{
int stage;
int success = 0; /* 正解数 */
clock_t start,end; /* 開始時刻・終了時刻 */
int num; /* 読み込んだ数字 */
int no;

/*乱数を設定*/
srand(time(NULL));
printf("4桁の数値を記憶して下さい。\n");

start = clock();
for(stage = 0; stage < MAX_STAGE; stage++)
{
//int num; /* 読み込んだ数字 */
int no = rand() % 9000; /* 記憶する数字 */
printf("%4d",no);
fflush(stdout);
/* 問題の提示秒数 */
sleep(500);

printf("\r数値を入力して下さい。\n");
fflush(stdout);
scanf("%4d", &num);
scanf("%*[^\n]");

if( num != no)
{
printf("間違いです。\n");
}
else
{
printf("正解です。\n");
success++;
}
}
end = clock();

printf("%d回中%d回で成功しました。\n",MAX_STAGE,success);
printf("%.1f秒でした。\n",(double)(end - start) / CLOCKS_PER_SEC);

return 0;
}

補足サンプルのコードを書いていただけるとありがたいです。よろしくお願いします。

閲覧数:
27
回答数:
3
お礼:
25枚

違反報告

回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

pok********さん

2020/7/1502:28:06

初めから文字列で入力してしまえばいいのでは。

--------------------

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

#define MAX_STAGE 10 /*ステージ数 */

/* x秒経過するまで待つ */
int sleep(unsigned long x)
{
clock_t c1 = clock(),c2;
do
{
/* エラー処理 */
if((c2 = clock()) == (clock_t)-1)
{
return 0;
}
}
while(1000.0 * (c2 -c1) / CLOCKS_PER_SEC < x);
{
return 1;
}
}

int main(void)
{
int stage;
int success = 0; /* 正解数 */
clock_t start,end; /* 開始時刻・終了時刻 */
char num[5]; /* 読み込んだ数字 */ //★文字配列に変更
char no[5]={0}; //★文字配列に変更 [4]='\0'にするために要初期化
//★4桁の数字に文字列の末尾'\0'で[5]

/*乱数を設定*/
srand(time(NULL));
printf("4桁の数値を記憶して下さい。\n");

start = clock();
for(stage = 0; stage < MAX_STAGE; stage++)
{
//int num; /* 読み込んだ数字 */
//int no = rand() % 9000; /* 記憶する数字 */
//printf("%4d",no);
for(int i=0;i<4;i++) //★このように文字で数字を設定
no[i]='0'+rand()%10; //0-9の文字がランダムに入る
printf("%s",no); //★文字列で出力
fflush(stdout);
/* 問題の提示秒数 */
sleep(500);

printf("\r数値を入力して下さい。\n");
fflush(stdout);
//scanf("%4d", &num);
//scanf("%*[^\n]");

while(1){ //★無限ループで入力、条件を満たせばbreakでぬける
scanf("%4s",num);
if('0'<=num[0] && num[0]<='9' &&
'0'<=num[1] && num[1]<='9' &&
'0'<=num[2] && num[2]<='9' &&
'0'<=num[3] && num[3]<='9')
{
break; //4桁とも数字文字なら入力終了
}else{
//違った場合はメッセージを出してもう一度入力
printf("数字以外が入力されています。もう1度入力してください\n");
}
}

if(num[0]==no[0] && //★判定はこのように行う
num[1]==no[1] && //わかるのならstrcmp()を使ってもいい
num[2]==no[2] &&
num[3]==no[3] )
{
printf("正解です。\n");
success++;
}else{
printf("間違いです。\n");
}

}
end = clock();

printf("%d回中%d回で成功しました。\n",MAX_STAGE,success);
printf("%.1f秒でした。\n",(double)(end - start) / CLOCKS_PER_SEC);

return 0;
}

  • pok********さん

    2020/7/1502:51:22

    >int no = rand() % 9000; /* 記憶する数字 */

    0-9999と思って書きましたが、0-8999であるなら

    for(int i=0;i<4;i++) //★このように文字で数字を設定
    no[i]='0'+rand()%10; //0-9の文字がランダムに入る



    no[0]='0'+rand()%9; //[0]には0-8の文字をランダムに入れる
    for(int i=1;i<4;i++)
    no[i]='0'+rand()%10; //[1]-[3]に0-9の文字がランダムに入る


    入力の頭部分を

    if('0'<=num[0] && num[0]<='9' &&
    '0'<=num[1] && num[1]<='9' &&
    '0'<=num[2] && num[2]<='9' &&
    '0'<=num[3] && num[3]<='9')
    {



    if('0'<=num[0] && num[0]<='8' && //★[0]だけ<=8とする
    '0'<=num[1] && num[1]<='9' &&
    '0'<=num[2] && num[2]<='9' &&
    '0'<=num[3] && num[3]<='9')
    {

    とします。

    正解の判定箇所はそのままで構いません。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

プロフィール画像

カテゴリマスター

Windcatさん

2020/7/1502:19:20

参考のサンプルです。
文字列で処理してます

#include<stdio.h>
#include<string.h>

//数値を4文字の文字列にする
int tofour(int n,char *s){
if(n>9999) n %= 10000;
sprintf(s,"%04d",n);
return 0;
}


int main()
{
char a[10];
char b[10];
int num =56; //出題の数値
int sc;
tofour(num,a);
printf("%s\n",a);

printf("> "); //回答入力
scanf("%s",b);
sc = strlen(b);
//printf("%s %d\n",b,sc);
if(sc != 4){ //入力が4文字?
printf("4文字ではない !!\n");
return 0;
}
if(strcmp(a,b)==0){ //判定
printf("一致しました\n");
}else{
printf("不一致です\n");
}
return 0;
}

the********さん

2020/7/1501:40:59

数値として扱ったら無理です。

文字列として処理しましょう。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる