以下のプログラムについて質問です!
main()
{
int a,b;

printf(" ");

for(a=1;a<=8;a++)
{
printf(" ");
printf("%d",a);
}//横のマス番号表示
printf("\n");

char array[9][9];

array[0][0]='1';
array[1][0]='2';
array[2][0]='3';
array[3][0]='4';
array[4][0]='5';
array[5][0]='6';
array[6][0]='7';
array[7][0]='8';//縦マス番号の初期化

for(a=0;a<=7;a++)
{
printf("%c",array[a][0]);
printf("\n");
}//縦マス番号の表示

int c,h,x,y;
int i=0;

while(1)
{
fflush(stdin);
printf("Please push line number\n");
c = getc(stdin);
//行の座標を決定
x = c - '0';
fflush(stdin);

printf("Please push row number\n");
h = getc(stdin);

y = h - '0';
//列の座標を決定
if(i%2==0)
{
array[x][y]='A';
}
if(i%2!=0)
{
array[x][y]='B';
}
//先行はA後攻はB
for(a=0;a<=7;a++)
{
for(b=0;b<=8;b++)
{
printf("%c",array[a][b]);
}
printf("\n");
}
i++;
}
}

(1)行の座標を決定、列の座標の決定とあるのですが
c = getc(stdin);
//行の座標を決定
x = c - '0';
fflush(stdin);

h = getc(stdin);
y = h - '0';
//列の座標を決定

これらの部分の意味がよくわかりません。

(2)fflush(stdin)とあるのですがこれは何でしょうか?

(3)最後の部分のi++はどういう意味ですか?

(4)勝利判定の部分はどこですか?

質問多くてすみません!>< よろしくお願いします!

このQ&Aに関連する最新のQ&A

A 回答 (2件)

(1)


> c = getc(stdin);

で、「文字」を一つ入力し、その番号をcに代入します。

> x = c - '0';

で「文字の番号」を対応する「数値」に変換しています。
ASCII準拠の文字コードだと、'0'から'9'まで番号が順番に並んでいるので、「数字の番号」-「'0'の番号」とすることで、数値0~9になります。

が、環境によっては「'0'から'9'まで順番に並んでいない」場合もあるので、常に使える手法ではありません。
strtol等の文字列→数値変換関数を使うのが確実です。

(2)
入出力には「バッファ」が用意されていて、1文字ずつではなく、ある程度まとめて読み書きするようになっています。

通常のファイル出力だと、一定文字溜るまでファイルには書き込みません。そのため、fprintf等で「出力」したのにファイルには書きこまれていない、という瞬間が存在します。
一般的なファイル出力だと、最終的に結果が書き込まれていれば問題は無いのですが、出力したらすぐに書き込んで欲しいときもあります(リアルタイムで逐次ログを出力したい、等)そんな時使うのが fflush です。
fflushはバッファに溜っている分を書き出して、バッファを空にします。

同様に、キー入力もバッファを持っています。押されたキーをある程度記録しておいて、読み出すタイミングで順番に処理されます。このような動作を「先行入力」とも呼ばれています。
PCが重くなったときにキー入力すると、既にキーは押してないのに、遅れて画面に文字が表示されることがあると思います。あれが先行入力によるものです。

ところが、このゲームのように、先行入力は必要なく、入力状態になった時点からの入力だけが欲しいケースもあります。先行入力のキャンセルが必要です。

そんな時には fflushで入力をキャンセルします...というのは半分嘘です。

Cの規格では、fflushを入力に対して行なったときの動作は「未定義」です。何が起るかわかりません。
あるC言語では、先行入力のキャンセルとして働きますが、他のC言語では何も起りません。致命的なエラーになる実装もあるでしょう。
そのC言語のマニュアルをよく読んで、fflushが先行入力キャンセルの動作をすることが確認できた場合に、そのC言語限定で使うようにする。

基本はこのケースでは使わない(別の手段でクリアする)のが正しい対応でしょう。

(3),(4)については、既に回答があるので省略。

ついでに。
> main()
型の省略は推奨できません。
    • good
    • 0
この回答へのお礼

すごく丁寧にありがとうございました!>< とても分かりやすかったです!

お礼日時:2011/04/24 11:33

そんなことより、まず、実行してみましょう。


画面、めちゃくちゃになりませんか?

配列のarray[*][こっち側]何も入っていませんよ?
arrayをゼロクリアするなりの処理が必要です。

さて、(1)ですが、
これは数字を表している文字を、数値に変換しています。詳しくは、ASCIIコードを調べてみてください。ちなみに、せめて範囲チェックくらいはした方がいいと思います。
(2)は、いわゆる先行入力を読み捨ててるのだと思いますが、このプログラムでは、要らないんじゃないかな?
(3)++はインクリメント演算子です。iはintですから、i=i+1だと思えばいいです。で、このiは、2で割った余りを見て、先攻か、後攻かを判断する変数のようですので、それをトグルしているだけですね。
(4)は、実装されていませんね。そもそも、これ、何ですか?どうなると勝つんですか?
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます!>< とても助かりました!

お礼日時:2011/04/24 11:30

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報