/* 교실 내의 자리배치 */ #include<stdio.h> #include<time.h> #include<Windows.h> void seat_arrangement(introw, int column); void shuffle_number(intsit_number[], inttotal); void draw_check02(intcolumn, introw); void gotoxy(intx, inty); int main(void) { int row, column; printf("자리배치 프로그램\n\n"); printf("좌석배치에 대한 행과 열을 입력해야 합니다\n"); printf("학생수는 최대 100명입니다.(10X10)\n"); printf("행의 수를 입력하고 Enter>"); scanf("%d", &row); printf("열의 수를 입력하고 Enter>"); scanf("%d", &column); seat_arrangement(row, column); printf("\n\n\n"); return 0; } void gotoxy(intx, inty) { COORD Pos = { x - 1, y - 1 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos); } /* 확장된 바둑판 그리기 함수 draw_check02 */ void draw_check02(intc, intr) { int i, j; unsignedchar a = 0xa6; unsignedchar b[12]; for (i = 1; i < 12; i++) b[i] = 0xa0 + i; printf("%c%c", a, b[3]); for (i = 0; i < c - 1; i++) { printf("%c%c", a, b[1]); printf("%c%c", a, b[8]); } printf("%c%c", a, b[1]); printf("%c%c", a, b[4]); printf("\n"); for (i = 0; i < r - 1; i++) { printf("%c%c", a, b[2]);; for (j = 0; j < c; j++) { printf(" "); printf("%c%c", a, b[2]); } printf("\n"); printf("%c%c", a, b[7]); for (j = 0; j < c - 1; j++) { printf("%c%c", a, b[1]); printf("%c%c", a, b[11]); } printf("%c%c", a, b[1]); printf("%c%c", a, b[9]); printf("\n"); } printf("%c%c", a, b[2]); for (j = 0; j < c; j++) { printf(" "); printf("%c%c", a, b[2]); } printf("\n"); printf("%c%c", a, b[6]); for (i = 0; i < c - 1; i++) { printf("%c%c", a, b[1]); printf("%c%c", a, b[10]); } printf("%c%c", a, b[1]); printf("%c%c", a, b[5]); printf("\n"); } /* 난수에 의해 배열에 저장된 값을 임의로 섞는 함수 shuffle_number */ void shuffle_number(intsit_number[], inttotal) { int i, rnd, temp; for (i = 0; i < total; i++) { rnd = rand() % total; temp = sit_number[rnd]; sit_number[rnd] = sit_number[i]; sit_number[i] = temp; } } /* 좌석 번호를 임의로 배치하여 출력하는 함수 seat_arrangement */ void seat_arrangement(introw, intcolumn) { int sit_number[100] = { 0 }; int total, i, j, count = 0; total = row*column; for (i = 0; i < total; i++) sit_number[i] = i + 1; shuffle_number(sit_number, total); gotoxy(1, 7); draw_check02(column, row); for (i = 1; i <= row; i++) { for (j = 1; j <= column; j++) { gotoxy(j * 4 - 1, 6 + i * 2); printf("%2d", sit_number[count]); count++; } } } [개선과 확장 1] /* 응용 10.4.1은 학생의 숫자가 정확히 행과 열의 곱과 일치하는 경우만을 고려한 것 이지만 일치하지 않는 경우에도 ㅎ행을 우선으로 자리배치가 가능한 프로그램을 작성하시오. */ #include<stdio.h> #include<time.h> #include<Windows.h> void seat_arrangement(int row, int column, int student); void shuffle_number(int sit_number[], int student); void draw_check02(int column, int row); void gotoxy(int x, int y); int main(void) { int row, column, student; printf("자리배치 프로그램\n"); printf("좌석배치에 대한 행과 열을 입력해야 합니다\n"); printf("학생수는 최대 100명입니다.(10X10)\n"); printf("행의 수를 입력하고 Enter>"); scanf("%d", &row); printf("열의 수를 입력하고 Enter>"); scanf("%d", &column); printf("학생 수를 입력하고 Enter>"); scanf("%d", &student); seat_arrangement(row, column, student); printf("\n\n\n"); return 0; } void gotoxy(int x, int y) { COORD Pos = { x - 1, y - 1 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos); } /* 확장된 바둑판 그리기 함수 draw_check02 */ void draw_check02(int c, int r) { int i, j; unsignedchar a = 0xa6; unsignedchar b[12]; for (i = 1; i < 12; i++) b[i] = 0xa0 + i; printf("%c%c", a, b[3]); for (i = 0; i < c - 1; i++) { printf("%c%c", a, b[1]); printf("%c%c", a, b[8]); } printf("%c%c", a, b[1]); printf("%c%c", a, b[4]); printf("\n"); for (i = 0; i < r - 1; i++) { printf("%c%c", a, b[2]);; for (j = 0; j < c; j++) { printf(" "); printf("%c%c", a, b[2]); } printf("\n"); printf("%c%c", a, b[7]); for (j = 0; j < c - 1; j++) { printf("%c%c", a, b[1]); printf("%c%c", a, b[11]); } printf("%c%c", a, b[1]); printf("%c%c", a, b[9]); printf("\n"); } printf("%c%c", a, b[2]); for (j = 0; j < c; j++) { printf(" "); printf("%c%c", a, b[2]); } printf("\n"); printf("%c%c", a, b[6]); for (i = 0; i < c - 1; i++) { printf("%c%c", a, b[1]); printf("%c%c", a, b[10]); } printf("%c%c", a, b[1]); printf("%c%c", a, b[5]); printf("\n"); } /* 난수에 의해 배열에 저장된 값을 임의로 섞는 함수 shuffle_number */ void shuffle_number(int sit_number[], int student) { int i, rnd, temp; for (i = 0; i < student; i++) { rnd = rand() % student; temp = sit_number[rnd]; sit_number[rnd] = sit_number[i]; sit_number[i] = temp; } } /* 좌석 번호를 임의로 배치하여 출력하는 함수 seat_arrangement */ void seat_arrangement(int row, int column, int student) { int sit_number[100] = { 0 }; int i, j, count = 0; for (i = 0; i < student; i++) sit_number[i] = i + 1; shuffle_number(sit_number, student); gotoxy(1, 7); draw_check02(column, row); for (i = 1; i <= row; i++) { for (j = 1; j <= column; j++) { gotoxy(j * 4 - 1, 6 + i * 2); printf("%2d", sit_number[count]); count++; if (count==student) return; } } } [개선과 확장 2] /* 교실 안에 특정한 장애물(기둥, 난로 또는 선반 등)이 있다고 가정하고, 장애물의 개수와 장애물이 위치한 행과 열을 입력받아 해당 위치를 제외하고 나머지 위치에 자리배치를 하는 프로그램을 작성하시오. */ #include<stdio.h> #include<time.h> #include<Windows.h> void seat_arrangement(introw, intcolumn, intstudent); void shuffle_number(intsit_number[], intstudent); void draw_check02(intcolumn, introw); void gotoxy(intx, inty); typedefstruct { int x, y; }barrier; //장애물을 위한 구조체 int main(void) { int row, column, student; printf("자리배치 프로그램\n"); printf("좌석배치에 대한 행과 열을 입력해야 합니다\n"); printf("학생수는 최대 100명입니다.(10X10)\n"); printf("행의 수를 입력하고 Enter>"); scanf("%d", &row); printf("열의 수를 입력하고 Enter>"); scanf("%d", &column); printf("학생 수를 입력하고 Enter>"); scanf("%d", &student); seat_arrangement(row, column, student); printf("\n\n\n"); return 0; } void gotoxy(intx, inty) { COORD Pos = { x - 1, y - 1 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos); } /* 확장된 바둑판 그리기 함수 draw_check02 */ void draw_check02(intc, int r) { int i, j; unsignedchar a = 0xa6; unsignedchar b[12]; for (i = 1; i < 12; i++) b[i] = 0xa0 + i; printf("%c%c", a, b[3]); for (i = 0; i < c - 1; i++) { printf("%c%c", a, b[1]); printf("%c%c", a, b[8]); } printf("%c%c", a, b[1]); printf("%c%c", a, b[4]); printf("\n"); for (i = 0; i < r - 1; i++) { printf("%c%c", a, b[2]);; for (j = 0; j < c; j++) { printf(" "); printf("%c%c", a, b[2]); } printf("\n"); printf("%c%c", a, b[7]); for (j = 0; j < c - 1; j++) { printf("%c%c", a, b[1]); printf("%c%c", a, b[11]); } printf("%c%c", a, b[1]); printf("%c%c", a, b[9]); printf("\n"); } printf("%c%c", a, b[2]); for (j = 0; j < c; j++) { printf(" "); printf("%c%c", a, b[2]); } printf("\n"); printf("%c%c", a, b[6]); for (i = 0; i < c - 1; i++) { printf("%c%c", a, b[1]); printf("%c%c", a, b[10]); } printf("%c%c", a, b[1]); printf("%c%c", a, b[5]); printf("\n"); } /* 난수에 의해 배열에 저장된 값을 임의로 섞는 함수 shuffle_number */ void shuffle_number(int sit_number[], intstudent) { int i, rnd, temp; for (i = 0; i < student; i++) { rnd = rand() % student; temp = sit_number[rnd]; sit_number[rnd] = sit_number[i]; sit_number[i] = temp; } } /* 좌석 번호를 임의로 배치하여 출력하는 함수 seat_arrangement */ void seat_arrangement(introw, intcolumn, int student) { int sit_number[100] = { 0 }; int block, i, j, count = 0, bCount=0; //bCount는 장애물을 위한 count for (i = 0; i < student; i++) sit_number[i] = i + 1; shuffle_number(sit_number, student); printf("장애물의 갯수는?"); scanf("%d", &block); //장애물의 갯수만큼 동적할당하여 배열 생성 barrier *ptr = (barrier*)malloc(sizeof(barrier)*block); for (int i = 0; i < block; i++) { int x, y; printf("장애물의 위치 표시(행과 열은 순차적으로 입력): "); scanf("%d %d", &y, &x); ptr[i].x = x; ptr[i].y = y; } Sleep(2000); system("cls"); gotoxy(1, 7); draw_check02(column, row); for (i = 1; i <= row; i++) { for (j = 1; j <= column; j++) { if (i == ptr[bCount].y && j == ptr[bCount].x) { gotoxy(j * 4 - 1, 6 + i * 2); printf("■"); bCount++; } else { gotoxy(j * 4 - 1, 6 + i * 2); printf("%2d", sit_number[count]); count++; if (count == student) return; } } } for (int i = 0; i < block; i++) free(ptr); //동적할당 해제 } 개발환경:Visual Studio 2017 지적, 조언, 질문 환영입니다! 댓글 남겨주세요~ [참고] 명품 C언어 프로젝트 안기수 저 |