#include #define COL 8 /* 行 */ #define ROW 8 /* 桁 */ int getline(char* line, int row); int getdec(int* ans, int keta); void ume(char* line, int i, int row); void keyflush(int input); void rotate0(char* buf, int col, int row); void rotate90(char* buf, int col, int row); void rotate180(char* buf, int col, int row); void rotate270(char* buf, int col, int row); /* ----- 滅入ん ----- */ void main() { char matrix[COL][ROW]; int i; int menu; void (*sel_ptr[])(char* buf, int col, int row) = { /* 関数ポインタの定義!(>_<)w */ rotate0, rotate90, rotate180, rotate270 }; printf("%d 桁 × %d 行の文字を入力して下さい\n", ROW, COL); for (i = 0; i < COL; i++) { if (getline(matrix[i], ROW)) { /* 1 行読み込み */ for (i++; i < COL; i++) { ume(matrix[i], 0, ROW); /* EOF 入力の場合は後の配列を ' ' で埋める */ } break; } } do { printf("\n************ 操作を選んでください ************\n"); printf("[1]:0度 [2]:90度 [3]:180度 [4]:270度 [0]:終了\n> "); if (getdec(&menu, 1) == 0) { printf("入力値が不正です!\n"); continue; /* エラーやり直し (-_-;) */ } if (menu == 0) { /* 0 は終了 */ break; } if (menu >= 1 && menu <= 4) { /* 1 〜4 の間かに? */ (*sel_ptr[menu - 1])(matrix[0], COL, ROW); /* 関数のポインタで処理を振り分け */ } else { printf("入力値が不正です!\n"); /* それ以外はエラー */ } } while (1); printf("終了します\n"); } /* ----- 関数の定義 ----- */ /* キーボー入力をバッファに格納する */ /* 引数:char* line バッファのポインタ, int row 桁数 */ /* 戻値:正常終了 = 0, EOF 入力された = 1 */ int getline(char* line, int row) { int i; char input; for (i = 0; i < row; i++) { input = getchar(); if (input == EOF) { /* EOF が入力された */ ume(line, i, row); /* 残りのバッファを ' ' で埋める */ return 1; } else if (input == '\n') { /* 改行が入力された */ ume(line, i, row); /* 残りのバッファを ' ' で埋める */ keyflush(input); /* キーバッファのクリア */ return 0; } else { *line = input; } line += 1; } keyflush(input); /* キーバッファのクリア */ return 0; } void ume(char* line, int i, int row) { for (; i< row; i++) { /* 残りのバッファを ' ' で埋める */ *line = ' '; line += 1; } } /* キーボードから数字を入力し整数に変換するる */ /* 引数:int* ans 変換した数値へのポインタ, int keta 桁数 */ /* 返値:正常終了 = 1, 不正な入力 = 0 */ int getdec(int* ans, int keta) { int input; /* 1 文字入力の値 */ int sign = 2; /* 最初のループ時:2 整数:0 負数:1 */ int i = 0; /* 繰り返しカウンタ ※ 1 文字読み込んだら増やす */ *ans = 0; /* 文字→数値変換の結果を初期化 */ while ((input = getchar()) != '\n') { i++; /* 繰り返しカウンタを増やす */ if (sign == 2) { /* 符号判定 ※最初の 1 回のみ実行される */ if (input == '-') { /* 負数の時 */ sign = 1; /* 負数フラグ On */ input = getchar(); /* '-' を読み飛ばす */ i++; /* 繰り返しカウンタを増やす */ } else if (input == '\n') { keyflush(input); return 0; /* 行頭での改行はエラー (0) */ } else { sign = 0; /* 負数フラグ Off */ } } if (i > keta) { /* 繰り返しの判定 */ break; /* 所定回数に達したら抜ける */ } if (input >= '0' && input <= '9') { *ans = (*ans * 10) + (input - '0'); /* 文字数字を 10 進数に変換 */ } else { keyflush(input); return 0; /* 数字以外の入力ならエラー (0) */ } } if (sign == 2) { /* 改行だけの入力はエラー */ keyflush(input); return 0; } if (sign) { *ans *= -1; /* 負数の時はそんな感じで */ } keyflush(input); return 1; } void keyflush(int input) { while (input != '\n') { /* 入力バッファのクリア簡易版 */ input = getchar(); } } void rotate0(char* buf, int col, int row) { int i, j; for (i = 0; i < col; i++) { for (j = 0; j < row; j++) { putchar(*buf); buf += 1; } putchar('\n'); } } void rotate90(char* buf, int col, int row) { int i, j; char* tmp; for (i = (col - 1) * row; i < col * row; i++) { tmp = buf + i; for (j = i; j >= 0; j -= row) { putchar(*tmp); tmp -= row; } putchar('\n'); } } void rotate180(char* buf, int col, int row) { int i, j; buf += col * row - 1; for (i = 0; i < col; i++) { for (j = 0; j < row; j++) { putchar(*buf); buf -= 1; } putchar('\n'); } } void rotate270(char* buf, int col, int row) { int i, j; char* tmp; for (i = row - 1; i >= 0; i--) { tmp = buf + i; for (j = i; j <= (row - 1) * col + i; j += row) { putchar(*tmp); tmp += row; } putchar('\n'); } }