画面に現れた英文字のうち一つを記憶するプログラムについて。

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

画面に現れた英文字のうち一つを記憶するプログラムについて。

#1

投稿記事 by TI » 8年前

かなりの初心者です。

英文字が5つ現れ、そのうちの先頭から2文字目を記憶し、入力するプログラムを作ろうとしています。
教えていただきたいのは、答え合わせの部分です。
入力した英文字と、解答を比較する方法がよくわかりません。
if 文で
if (strcmp(x, mstr[1]) != 0)
などいろいろ試してみたのですが、できない原因やこれらの使い方もいまいち理解できていないので、
ご教授いただけたら幸いです。

よろしくお願いいたします。

コード:

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

#define MAX_STAGE 10



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()
{
	int i, stage;
	int level;
	int success = 0;
	char ltr[] = "abcdefghijklmnopqrstuvwxyz";

	srand(time(NULL));

	printf("2番目の英字を記憶してください。\n");
	
	
	for (stage = 0; stage < MAX_STAGE; stage++) {
	 char mstr[10];
	 char x[10];

	  for (i = 0; i < 5; i++) 	
		mstr[i] = ltr[rand() % strlen(ltr)];
		mstr[5] = '\0';

	printf("%s", mstr);
	fflush(stdout);
	sleep(1000);



	printf("\r入力せよ!:");
	scanf("%s", x);

	if (strcmp(x, mstr[1]) != 0)
		printf("間違いです。\n");	
	else {
		printf("正解です。\n");	
		success++;
	}
}

		
	printf("%d回中%d回成功しました。\n", MAX_STAGE, success);

return 0;
}

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

Re: 画面に現れた英文字のうち一つを記憶するプログラムについて。

#2

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

scanfの%sは、文字列を読み込みます。
strcmp()は、引数の文字列同士を比較します。
C言語では、文字列はNUL終端された文字の配列で表されます。
普通の配列なので、mstr[1]は文字列ではなく文字になり、strcmp()には渡せません。
&mstr[1]とすると、mstrに入っている文字列の1文字目(0-origin)から最後までの文字列が見えます。

例えば、入力の1文字目とmstrの2文字目(ともに1-origin)が等しくないかを判定するには、そのまま

コード:

x[0] != mstr[1]
とすればいいでしょう。
「入力が1文字でないときも等しくないとみなす」という条件を追加するなら、

コード:

x[0] != mstr[1] || x[1] != '\0'
とすればいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

metaphor

Re: 画面に現れた英文字のうち一つを記憶するプログラムについて。

#3

投稿記事 by metaphor » 8年前

取り敢えずメモリーアクセスで落ちる事は無くなりました。
(fflush(stdout);がよくわからない。)

コード:

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

#define MAX_STAGE 10

int sleep(unsigned long x) // xミリ秒経過するのを待つ
{
	clock_t c1 = clock(), c2; //clock_t=long  [typedef long clock_t]

	do {                                    //(プロセッサ時間)
		if ((c2 = clock()) == (clock_t)-1) //プログラム実行開始からの経過時間
			return 0;                     // 時間の取得に失敗した場合0を返す
	} while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x); //CLOCKS_PER_SEC=1000
	return 1;
}

int main()
{
	int i, stage;
	int level;
	int success = 0;
	char ltr[] = "abcdefghijklmnopqrstuvwxyz"; int Int;

	srand(time(NULL));

	printf("AAA:::strlen(ltr)=%d\n\n", strlen(ltr));// 文字の配列の長さ'\0"入れると27
	printf("\n");                                  // 改行
	printf("2番目の英字を記憶してください。\n"); // 入力指示

	for (stage = 0; stage < MAX_STAGE; stage++) {
		char mstr[10];
		char x[10];
		int rnd;
		for (i = 0; i < 5; i++) {
			rnd = rand() % strlen(ltr); printf("rnd=%d\t", rnd);// 乱数チェック
			mstr[i] = ltr[rnd]; // ltr[rand() % strlen(ltr)];  // 5文字設定
		}
		mstr[5] = '\0'; // 終端文字

		printf("%s", mstr);
		//fflush(stdout);// 一時中止
		//sleep(1000);  // 一時中止

		printf("\r入力せよ!:");
		//scanf("%s", x);
		x[0] = 'A'; x[1] = 'B'; x[2] = 'C'; x[4] = 'D'; x[5] = '\0';
		//if (strcmp(x, mstr[1]) != 0)
		printf("間違いです。\n");
		//else {
		printf("正解です。\n");
		success++;
		//}
	}

	printf("%d回中%d回成功しました。\n", MAX_STAGE, success);

	return 0;
}
AAA:::strlen(ltr)=26


2番目の英字を記憶してください。
入力せよ!:間違いです。rnd=24 rnd=18 rtvys
正解です。
入力せよ!:間違いです。rnd=10 rnd=21 ymzkv
正解です。
入力せよ!:間違いです。rnd=4 rnd=17 uqber
正解です。
入力せよ!:間違いです。rnd=14 rnd=15 fesop
正解です。
入力せよ!:間違いです。rnd=11 rnd=20 kqolu
正解です。
入力せよ!:間違いです。rnd=19 rnd=2 zettc
正解です。
入力せよ!:間違いです。rnd=22 rnd=3 ifawd
正解です。
入力せよ!:間違いです。rnd=10 rnd=20 pemku
正解です。
入力せよ!:間違いです。rnd=23 rnd=4 tdtxe
正解です。
入力せよ!:間違いです。rnd=14 rnd=8 wmooi
正解です。
10回中10回成功しました。
続行するには何かキーを押してください . . .

TI

Re: 画面に現れた英文字のうち一つを記憶するプログラムについて。

#4

投稿記事 by TI » 8年前

おふた方、丁寧な解説ありがとうございます。
理解できたので、もう一度トライしてみます。

閉鎖

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