/*
교실 내의 자리배치
*/
#include <stdio.h>
#include <time.h>
#include <Windows.h>
void seat_arrangement(int row, int column);
void shuffle_number(int sit_number[], int total);
void draw_check02(int column, int row);
void gotoxy(int x, int y);
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(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;
unsigned char a = 0xa6;
unsigned char 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 total)
{
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(int row, int column)
{
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;
unsigned char a = 0xa6;
unsigned char 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(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);
typedef struct
{
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(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;
unsigned char a = 0xa6;
unsigned char 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 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언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 11.1장 디지털 주판 (0) | 2017.11.04 |
---|---|
명품 C언어 프로젝트 10.5장 설문 조사 프로그램 (0) | 2017.10.30 |
명품 C언어 프로젝트 10.3장 움직이는 광고판 (15) | 2017.10.05 |
명품 C언어 프로젝트 10.2장 휴대전화 문자 (0) | 2017.09.29 |
명품 C언어 프로젝트 10.1장 디지털 시계 (8) | 2017.09.25 |