ページ 11

選択肢に付いて(初心者です。)

Posted: 2012年2月03日(金) 07:47
by カメロンパン
こんにちは。
いまはまだ初心者でして、1つ分からないところがあるのでお聞きします。

ifとscanfを使って選択肢を作ろうかと思います。
まだカーソルを合わせるなどは出来ないので素直にAとBのどちらかを入力して判定するという物です。
コードは以下になります。

コード:

#include <stdio.h>

main()
{
	int choices, A, B;
	
	printf("選択肢です。AかBのどちらかを入力してください\n");
	scanf("%c",&choices);
	
	if(choices==A)
		{
		printf("選択されたのはAです。\n");
		}
		
	else if(choices==B)
		{
		printf("選択されたのはBです。\n");
		}
	
}
問題はコンパイルは無事終了するのですが、AまたはBを入力しても判定せず続行するには何かキーを押してくださいになってしまいます。
どうしてなのか分からないのでお聞きしに着ました。
何方か教えてください><

Re: 選択肢に付いて(初心者です。)

Posted: 2012年2月03日(金) 07:50
by beatle
変数A, Bは初期化されずに使用されているため,不具合が出ています.
具体的には
if(choices==A)
とか,
else if(choices==B)
の部分で,ユーザーから入力された値choicesと,不定な値A, Bを比較しています.

やりたいのは
if (choices =='A')
だと推測します.

Re: 選択肢に付いて(初心者です。)

Posted: 2012年2月03日(金) 15:35
by hss12
文字ならintよりcharですね。

コード:

#include <stdio.h>

int main(void)
{
	char choices;

	printf("選択肢です。AかBのどちらかを入力してください\n");
	scanf("%c", &choices);

	if(choices=='A')
	{
		printf("選択されたのはAです。\n");
	}

	else if(choices=='B')
	{
		printf("選択されたのはBです。\n");
	}
	return 0;
}
あるいは
char A = 'A';
として
choices==A
とするか
文字コードを代入、例えば
char A = 65;
でも同じことです。
'A'はAの文字コードの数字が入ります。

Re: 選択肢に付いて(初心者です。)

Posted: 2012年2月03日(金) 19:59
by カメロンパン
hss12さん>>
上手くいきました。ありがとうございます。
ただ、ひとつ問題なのがA、B以外を入力したときに「入力された文字はAかBではありません。」
という文章を表示し、もう1度入力受付をしたいのですが、どうすれば良いのでしょうか?

Re: 選択肢に付いて(初心者です。)

Posted: 2012年2月03日(金) 20:41
by non
カメロンパン さんが書きました:A、B以外を入力したときに「入力された文字はAかBではありません。」
という文章を表示し
まず、ここまで作ってみましょう。
if( )

else if( )

else

の制御構造で行けそうですね。

Re: 選択肢に付いて(初心者です。)

Posted: 2012年2月03日(金) 21:30
by カメロンパン
beatleさん>>
試しに作ってみましたが、コンパイルしても結局同じでした。
何処か間違っていますかね?

コード:

#include <stdio.h>

main()
{
	char choices;
	
	printf("選択肢です。AかBのどちらかを入力してください\n");
	scanf("%c",&choices);
	
	if(choices=='A')
		{
		printf("選択されたのはAです。\n");
		}
		
	else if(choices=='B')
		{
		printf("選択されたのはBです。\n");
		}
		else
		{
		("入力された文字はAまたはBではありません。\n");
		return 0;
		}
}

Re: 選択肢に付いて(初心者です。)

Posted: 2012年2月04日(土) 00:24
by softya(ソフト屋)
最後のメッセージにprintfがないのが原因です。こういう場合コンパイルエラーにならないので注意して下さい。

Re: 選択肢に付いて(初心者です。)

Posted: 2012年2月04日(土) 00:27
by hss12

コード:

#include <stdio.h>

int main(void)
{
	char choices;

	while(1) /*無限ループ*/
	{
		printf("選択肢です。AかBのどちらかを入力してください\n");
		scanf("%c", &choices);
		if(choices=='A' || choices=='B') break; /*ループを抜ける*/
		printf("入力された文字はAまたはBではありません。\n");
	}

	if(choices=='A')
	{
		printf("選択されたのはAです。\n");
	}

	else if(choices=='B')
	{
		printf("選択されたのはBです。\n");
	}
	return 0;
}
基本テクニックとしてはこんな感じで書くのですが
エンターキーも認識してしまうので違う文字を入れた場合
入力した文字数も含めて複数回文字が表示されてしまいます。
また例えばCAと入力した場合、Aと認識してしまいます。

これを回避する方法は面倒なので
(何か良い方法があるのかもしれませんが)
getch関数を使ってみます。
この関数はエンターキーを押す必要がありません。

コード:

#include <stdio.h>
#include <conio.h>

int main(void)
{
	int choices;

	while(1) /*無限ループ*/
	{
		printf("選択肢です。AかBのどちらかを入力してください\n");
		choices=getch(); /*入力*/
		putch(choices); /*入力した文字の表示*/
		putchar('\n'); /*改行*/
		if(choices=='A' || choices=='B') break; /*ループを抜ける*/
		printf("入力された文字はAまたはBではありません。\n");
	}

	if(choices=='A')
	{
		printf("選択されたのはAです。\n");
	}

	else if(choices=='B')
	{
		printf("選択されたのはBです。\n");
	}
	return 0;
}
ただしVisual C++などは問題ありませんが、Linuxなどは違う書き方をする必要があります。

あとmain()ではなくint main(void)と書くようにしたほうが良いです。
またifなどの{}のインデントが変?です。私の書き方が一般的と思います。

nonさんはまた違うアプローチでやろうとしているのかもしれませんので私のやり方は参考程度に。

Re: 選択肢に付いて(初心者です。)

Posted: 2012年2月04日(土) 01:14
by カメロンパン
メッセージの表示に付いてはsoftya(ソフト屋)さんのアドバイスで何とかなりました。
ループに付いてはまだ学習中な為、hss12さんのソースを参考に組み立てていこうと思います。
一応これで解決したということになりましたので、皆さんお付き合いいただきありがとうございます。
これからも、何か有ったらまた相談させて頂きます。