관리 메뉴

지나가는 이야기

[C] 엘리베이터 프로그램 본문

Computer language : 컴퓨터 언어/C

[C] 엘리베이터 프로그램

지나가는 이야기 2020. 6. 21. 13:16
728x90
반응형

 

엘리베이터에 대한 프로그램을 짜 보도록 하겠습니다.

[상황]

10층 건물에 엘리베이터가 두대(1호기, 2호기)가 있는데, 엘리베이터를 움직이게 하는 버튼은 하나입니다. 그리고 다른 층에서 엘리베이터를 타는 사람은 없습니다. (엘리베이터는 1층에서 10층까지 전층 운행한다.)

 

[조건]

1. 현재 나의 위치는 키보드에서 직접 입력으로 받는다.

2. 건물은 1층에서 10층까지 입니다. 1~10 사이의 숫자 이외의 숫자나 문자가 입력되면 에러를 발생하고 다시 입력을 받는다.

3. 각각의 엘리베이터의 위치는 랜덤으로 받는다.

4. 나의 층에서 가장 가까운 엘리베이터 하나만 움직이며, 만약 두 대의 엘리베티어가 같은 층일 시 1호기가 움직인다.

5. 나의 층수, 각각 엘리베이터의 층수, 어떤 엘리베이터가 움직였는지 문자로 출력한다.

6. 1, 2호기 엘리베이터가 몇 층에 있었는지를 배열에 10개만 저장하고 이것을 출력한다. 프로그램은 사용자가 0을 입력할 때까지 반복한다. 하지만 0을 입력할 때까지 반복하므로 10개 이상의 데이터가 발생할 수 있다. 따라서 10개 이상이 발생하게 되면 10개만 배열에 저장한다. 그리고 저장된 10개를 출력한다.

 

먼저 첫 번째 조건인, 키보드에 현재 층을 입력을 받기 위해 정수형 변수를 만들고 scanf_s()함수로 입력을 받는다.

int floor;

printf("What floor are you on ? : ");
scanf_s("%d", &floor)

현재 위치를 반환하는 함수를 만들었다.

int Location(int number) {
	return printf("Your location : %d\n", number);
}

다음으로 두 번째, 세 번째 조건을 만족 시키기 위해 if문을 이용한다. 그리고 0을 입력하면 종료되게 만들었다.

(추가로 배열에 엘리베이터의 값들을 저장하였다.)

 

// 1~10까지의 랜덤한 숫자 생성
el_1 = rand() % 10 + 1;
el_2 = rand() % 10 + 1;

if (scanf_s("%d", &floor) == 0) { // 숫자가 아닌 문자를 입력 받을 시 오류 문구 출력
	printf("Error!!!\n");
	rewind(stdin);				  // 입력 버퍼 지우기
	printf("\n\n");
}
else {
	if (floor == 0) { 			  // 0을 입력시 반복문 탈출
		printf("\n\n");
		break;
	}
    if (floor >= 1 && floor <= 10) {
    	Location(floor);	// 현재 위치를 입력받아 리턴하는 함수호출
	printf("First elevator : %d \t Second elevator : %d \n", el_1, el_2);
    	// 엘리베이터의 정보를 배열에 저장
	el_1_array[i] = el_1;
	el_2_array[i] = el_2;
    }
    else{
    	printf("Error!!\n");
	printf("\n\n");
    }
}

 

그리고 네 번째 조건을 만족하기 위해 두 대의 엘리베이터와 나의 층수를 뺀 값에 절대값을 씌워 가장 가까운 엘리베이터가 움직이게 출력하였다.

// 두 개의 엘리베이터와 나의 위치를 계산 후 절대값을 이용하여 가까운 엘리베이터를 구함
result_1 = floor - el_1;
result_2 = floor - el_2;
if (abs(result_1) < abs(result_2)) {
	printf("Move First elevator.");
}
if (abs(result_2) < abs(result_1)) {
	printf("Move Second elevator.");
}
if (abs(result_1) == abs(result_2)) {
	printf("Move First elevator.");
}

 

배열의 출력은 for문을 통해 출력을 했다.

printf("=====================Result=====================");
printf("\nFirst elevator  : ");
// 반복문을 이용해서 배열을 출력
for (int j = 0; j < 10; j++) {
	if (el_1_array[j] < 1 || el_1_array[j] > 10) { // 엘리베이터의 위치를 구하는 반복문에서 배열을 꽉채우지 않고 나올시
		el_1_array[j] = ' ';					   // 아직 안채워진 배열은 공백으로 만듬
	}
	else {
		printf("%3d", el_1_array[j]);
	}
}
printf("\nSecond elevator : ");
for (int j = 0; j < 10; j++) {
	if (el_2_array[j] < 1 || el_2_array[j] > 10) {
		el_2_array[j] = ' ';
	}
	else {
		printf("%3d", el_2_array[j]);
	}
}
printf("\n\n");

 

 


 

전체 코드는 아래와 같다.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// [상황]
// 10층 건물 한 건물에 두 대의 엘리베이터가 있다.
// 두대(1호기, 2호기)의 엘리베이터는 움직이는 버튼이 하나이다.
// 다른층에 엘리베이터는 타려는 사람은 없다.
// 1호기는 1층에서 10층까지 움직인다.

// [문제]
// 1) 현재 나의 위치(층수)는 키보드에서 직접 입력 받는다.
// 건물은 1층에서 10츱입니다.이외 층수가 입력되면 에러를 발생하고 다시 입력 받는다.
// 단, 0층이 입력될때까지 프로그램은 계속 됩니다.
// 나의 위치를 입력 받아 리턴하는 함수를 작성합니다.
// 2) 각각의 엘리베이터의 위치(층수)는 랜덤하게 발생합니다.사용자는 엘리베이터의 위치를 알 수 없다.
// 엘리베이터 위치발생에 필요한 사항
// #include <stdlib.h>
// #include <math.h>
// srand((unsighed int)time(NULL));
// rand()%10+1
// 3)나의 위치와 가까운 엘리베이터가 움직인다.
// 만일 나의 위치와, 엘리베이터 1호기와 2호기의 위치가 서로 같다면 1호기가 움직인다.
// 4) 나의 층수, 각각 엘리베이터의 층수를 출력하고 어떤 엘리베이터가 움직였는지 문자로 출력한다.
// 5) 1, 2호기 엘리베이터가 몇층 몇층 발생했는지 배열에 10개만 저장하고 마지막에 이것을 출력한다.
// 프로그램은 사용자가 0을 입력 할때까지 반복되므로 10개이상의 데이터가 발생할 수 있다.
// 따라서 10개 이상이 발생하면 10개만 배열에 저장합니다. 그리고 저장된 10개를 각각 출력한다.


// 현재 위치를 입력받아 리턴하는 함수
int Location(int number) {
	return printf("Your location : %d\n", number);
}

int main() {
	int floor;
	int el_1, el_2;
	int el_1_array[10];
	int el_2_array[10];
	int i = 0;
	int result_1;
	int result_2;

	while (true){
		// 1~10까지의 랜덤한 숫자 생성
		el_1 = rand() % 10 + 1;
		el_2 = rand() % 10 + 1;

		printf("What floor are you on ? : ");

		
		if (scanf_s("%d", &floor) == 0) { // 숫자가 아닌 문자를 입력 받을 시 오류 문구 출력
			printf("Error!!!\n");
			rewind(stdin);	// 입력 버퍼 지우기
			i--;
			printf("\n\n");
		}
		else {
			if (floor == 0) { // 0을 입력시 반복문 탈출
				printf("\n\n");
				break;
			}
			if (floor >= 1 && floor <= 10) {
				Location(floor);	// 현재 위치를 입력받아 리턴하는 함수호출
				printf("First elevator : %d \t Second elevator : %d \n", el_1, el_2);
				// 엘리베이터의 정보를 배열에 저장
				el_1_array[i] = el_1;
				el_2_array[i] = el_2;

				// 두 개의 엘리베이터와 나의 위치를 계산 후 절대값을 이용하여 가까운 엘리베이터를 구함
				result_1 = floor - el_1;
				result_2 = floor - el_2;
				if (abs(result_1) < abs(result_2)) {
					printf("Move First elevator.");
				}
				if (abs(result_2) < abs(result_1)) {
					printf("Move Second elevator.");
				}
				if (abs(result_1) == abs(result_2)) {
					printf("Move First elevator.");
				}

				printf("\n\n");
			}
			else {		// 1~10 사이의 숫자가 아닌 수를 입력시 오류 출력
				i--;
				printf("Error!!\n");
				printf("\n\n");
			}
		}
		i++;
		if (i == 10) {
			break;
		}
	}

	// 결과 출력
	printf("=====================Result=====================");
	printf("\nFirst elevator  : ");
	// 반복문을 이용해서 배열을 출력
	for (int j = 0; j < 10; j++) {
		if (el_1_array[j] < 1 || el_1_array[j] > 10) { // 엘리베이터의 위치를 구하는 반복문에서 배열을 꽉채우지 않고 나올시
			el_1_array[j] = ' ';					   // 아직 안채워진 배열은 공백으로 만듬
		}
		else {
			printf("%3d", el_1_array[j]);
		}
	}
	printf("\nSecond elevator : ");
	for (int j = 0; j < 10; j++) {
		if (el_2_array[j] < 1 || el_2_array[j] > 10) {
			el_2_array[j] = ' ';
		}
		else {
			printf("%3d", el_2_array[j]);
		}
	}
	printf("\n\n");

	return 0;
}

 

 

위 영상 두개를 보면 정상적으로 작동하는지 볼 수 있다.

 

728x90
반응형
Comments