C/명품 C언어 프로젝트(안기수 저)

명품 C언어 프로젝트 10.4장 교실 내의 자리배치

꾸준함. 2017. 10. 9. 00:28

/*

교실 내의 자리배치

*/

#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언어 프로젝트 안기수 저

반응형