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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
カメロンパン
記事: 21
登録日時: 8年前
連絡を取る:

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

#1

投稿記事 by カメロンパン » 7年前

こんにちは。
いまはまだ初心者でして、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を入力しても判定せず続行するには何かキーを押してくださいになってしまいます。
どうしてなのか分からないのでお聞きしに着ました。
何方か教えてください><

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

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

#2

投稿記事 by beatle » 7年前

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

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

hss12
記事: 40
登録日時: 8年前

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

#3

投稿記事 by hss12 » 7年前

文字なら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の文字コードの数字が入ります。

カメロンパン
記事: 21
登録日時: 8年前
連絡を取る:

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

#4

投稿記事 by カメロンパン » 7年前

hss12さん>>
上手くいきました。ありがとうございます。
ただ、ひとつ問題なのがA、B以外を入力したときに「入力された文字はAかBではありません。」
という文章を表示し、もう1度入力受付をしたいのですが、どうすれば良いのでしょうか?

non
記事: 1097
登録日時: 9年前

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

#5

投稿記事 by non » 7年前

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

else if( )

else

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

カメロンパン
記事: 21
登録日時: 8年前
連絡を取る:

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

#6

投稿記事 by カメロンパン » 7年前

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;
		}
}

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

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

#7

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

最後のメッセージにprintfがないのが原因です。こういう場合コンパイルエラーにならないので注意して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

hss12
記事: 40
登録日時: 8年前

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

#8

投稿記事 by hss12 » 7年前

コード:

#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さんはまた違うアプローチでやろうとしているのかもしれませんので私のやり方は参考程度に。

カメロンパン
記事: 21
登録日時: 8年前
連絡を取る:

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

#9

投稿記事 by カメロンパン » 7年前

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

閉鎖

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