実行結果は
% ./infection
1文字入力: k
入力文字は16進数で表現すると 0x6b で,これをもとに細菌の位置を決定
左足 位置[1-25]: 21
右足 位置[1-25]: 24
感染してしまいました.細菌はタイル 12 24 にいました
+--+--+--+--+--+
| 1| 2| 3| 4| 5|
+--+--+--+--+--+
| 6| 7| 8| 9|10|
+--+--+--+--+--+
|11| @|13|14|15|
+--+--+--+--+--+
|16|17|18|19|20|
+--+--+--+--+--+
| L|22|23| @|25|
+--+--+--+--+--+
%
% ./infection
1文字入力: M
入力文字は16進数で表現すると 0x4d で,これをもとに細菌の位置を決定
左足 位置[1-25]: 4
右足 位置[1-25]: 10
無事です.細菌はタイル 6 12 18 24 にいました
+--+--+--+--+--+
| 1| 2| 3| L| 5|
+--+--+--+--+--+
| @| 7| 8| 9| R|
+--+--+--+--+--+
|11| @|13|14|15|
+--+--+--+--+--+
|16|17| @|19|20|
+--+--+--+--+--+
|21|22|23| @|25|
+--+--+--+--+--+
です
プログラムは
#include <stdio.h>
#include <stdlib.h> /* 乱数のため必要 */
#define UNPLACED (-1) /* 足がどこにも置かれていないことを示す */
#define EDGE_TILES (5) /* 縦,もしくは,横の一辺のタイル数 */
#define NUM_TILES (EDGE_TILES * EDGE_TILES) /* タイルの総数 */
int put_germ(int); /* プロトタイプ宣言 */
int put_foot(int, int);
int judge_infection(int, int, int);
void draw_feet(int, int, int, int);
void draw_line(int);
void fill_position(int, int, int, int, int);
int main(void)
{
int germ; /* もとの細菌の位置 */
int danger; /* 細菌が拡散した位置 */
int left, right; /* 両足の位置 */
int infection; /* 感染を示す */
germ = put_germ(NUM_TILES); /* 細菌の位置を決定 */
printf("左足 ");
left = put_foot(NUM_TILES, UNPLACED); /* 左足の位置 */
printf("右足 ");
right = put_foot(NUM_TILES, left); /* 右足は左足の以外の位置 */
/* 細菌が複数のタイルにいるので,ループを使って順次調べる */
infection = 0; /* 未感染 */
dangerをおおもとの細菌の位置で初期化
while(dangerが NUM_TILES 以下であるかぎり) {
if(judge_infection(left, right, danger) == 1) { /* 感染したかどうかを判定 */
infection = 1; /* 感染 */
break;
}
dangerに germ を加え,次の感染位置に移動
}
if(infection == 1)
printf("感染してしまいました.");
else
printf("無事です.");
/* 細菌が複数のタイルにいるので,ループを使って順次印字 */
printf("細菌はタイル ");
danger = germ; /* おおもとの細菌の位置 */
while(danger <= NUM_TILES) {
printf("%2d ", danger);
danger += germ;
}
printf("にいました\n");
draw_feet(EDGE_TILES, left, right, germ);
return 0;
}
/* 1文字から細菌の位置を暗号化 */
int put_germ(int size) /* sizeはタイルの数 */
{
char key;
int position;
printf("1文字入力: ");
scanf("%c", &key); /* 1文字入力 */
printf("入力文字は16進数で表現すると 0x%x で,これをもとに細菌の位置を決定\n", key);
srand((unsigned int)key); /* srand()は乱数の種を設定 */
position = rand() % size + 1; /* rand()は乱数を発生.位置が1から size までの値になるよう計算 */
return position;
}
/* 今まで足が置かれていないタイルを選んで足を置く */
int put_foot(int size, int already) /* sizeはタイルの数, alreadyはすでに置かれた足の位置 */
{
int position; /* 入力された足の位置 */
do {
printf("位置[1-%d]: ", size); /* 位置を入力 */
scanf("%d", &position);
if(already == UNPLACEDなら足はどこにでも置ける)
; /* 空文 */
else if(already == position) { /* 同じ位置に足は置けない */
printf("タイル %d にはすでに別の足が置かれています.\n", already);
position = 0;
}
} while((position < 1) || (position > size)); /* 1からsizeまでの位置に足を置くまで再入力 */
return position;
}
int judge_infection(int left, int right, int germ) /* 引数は順に左足,右足,おおもとの細菌の位置 */
{ /* 細菌のいるタイルに足を置くと感染,足を置かなければ無事 */
int danger; /* 細菌が拡散した位置 */
/* 細菌が複数のタイルにいるので,ループを使って順次感染を検査 */
danger = germ;
while(danger <= NUM_TILES) {
if((danger - left) * (danger - right) == 0)
return 1; /* 感染した */
else
次の細菌の位置に更新
}
return 0;
}
void draw_feet(int edge, int left, int right, int germ)
{
基本問題の問題文にある説明に従ってここは書く.
ただし,ループ回数がedgeの同じになるようにする.
return;
}
void draw_line(int edge)
{
int i;
/* 以下のように書いておくと,一辺のタイル数がいくつになっても大丈夫 */
for(i = 1; i <= edge; i++) {
printf("+--");
}
printf("+");
return;
}
void fill_position(int row, int left, int right, int germ, int edge)
/* rowは何行目の表示か,edgeはタイルは縦または横方向にいくつあるかを示す */
{
int index; /* タイルの番号 */
int i;
char sign; /* 左足なら'L' 右足なら'R' 細菌なら'@' */
int danger; /* 細菌が拡散した位置 */
index = このタイルの行の一番左にあるタイルの番号;
for(i = 1; i <= edge; i++) {
printf("|"); /* 区切り記号 */
/* このタイルに足があれば,その足を表示. 左足は'L', 右足は'R' */
if(この位置に左足がある)
sign = 'L';
else if(この位置に右足がある)
sign = 'R';
else
sign = ' '; /* この位置に足がなければ' ' */
/* 細菌が複数のタイルにいるので,ループを使う */
danger = germ;
while(danger <= NUM_TILES) {
if(この位置に細菌がいる) {
sign = '@';
break;
} else {
次の細菌の位置に更新
}
}
if(sign == ' ')
printf("%2d", index); /* タイル番号は2桁で書く */
else
printf(" %c", sign); /* L, R, @の記号も2桁で書く */
index++;
}
printf("|"); /* 区切り記号 */
return;
}
となっています
途中日本語で書かれた部分がわからないため教えてください
お願いします
c言語の問題がわかりません
Re: c言語の問題がわかりません
細菌の位置を決定するロジックがわかりません。txt4567 さんが書きました: 1文字入力: k
入力文字は16進数で表現すると 0x6b で,これをもとに細菌の位置を決定
左足 位置[1-25]: 21
右足 位置[1-25]: 24
感染したかどうかを判定するロジックがわかりません。txt4567 さんが書きました: 感染してしまいました.細菌はタイル 12 24 にいました
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。