ページ 11

独習Cの例_3_9_1の正答の14行目の理解について

Posted: 2012年12月22日(土) 14:54
by パクパク
[1] 質問文
 [1.1]
<独習C例3_9_1の問題>
(A)加算、(S)減算、(M)乗算、(D)除算を行う。その際、'A''S''M'''D'以外が入力されてもループを続け、計算はswitch文を使うプログラム。

<疑問点>
独習Cの例_3_9_1の正答の14行目はどのように理解したら良いでしょうか?do-whileの式で'A''S''M'''D'以外を入力しても、ループが続くため、必要ないように感じるのですが……。14行目のコードの意味を教えて下さい。また、間違っている部分、手直しした方が良い部分があれば、合わせてご教授お願い致します。
 [1.2]

コード:

#include <stdio.h>

int main(void)
{
	int a, b;
	char ch;

	printf("実行したい演算は\n");
	printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか?\n");
  
	do{
		printf("アルファベットの1文字を入力してください: ");
		ch = getchar();
		while(getchar() != '\n');
	}while((ch != 'A') && (ch != 'S') && (ch != 'M') && (ch != 'D'));

	printf("\n");

	printf("最初の数字を入力してください: ");
	scanf("%d", &a);
	printf("2番目の数字を入力してください: ");
	scanf("%d", &b);

	switch(ch){
		case 'A':
			printf("%d", a + b);
			break;
		case 'S':
			printf("%d", a - b);
			break;
		case 'M':
			printf("%d", a * b);
			break;
		case 'D' :
			if(b == 0){
			printf("0では割れません。終了します。");
			break;
			}
			printf("%d", a / b);
			break;
		
	}

  return 0;
}

[2] 環境  
 [2.1] OS : Windows
 [2.2] コンパイラ名 : VC++ 2010

[3] その他
 ・独習Cを読み進めながら、学習している初心者です。

Re: 独習Cの例_3_9_1の正答の14行目の理解について

Posted: 2012年12月22日(土) 15:32
by softya(ソフト屋)
getchar()が利用する入力機構は、必ず一行分を入力するため行の最後までの文字と改行文字が入力されたことになってします。
ちなみにこれを付けないでAAとか打ち込んでみると動作がわかると思います。
こういう推測と実験を繰り返すのが上達するコツで、疑問に思ったら実験した上で良くわからないことを聞くのが掲示板を使うコツです。

Re: 独習Cの例_3_9_1の正答の14行目の理解について

Posted: 2012年12月22日(土) 15:52
by パクパク
AAを打ち込んで実験してみます。
丁寧なご回答ありがとうございました。