본문 바로가기
College Computer Science/C Language

[C 프로그래밍 실습] Report 01

by 2den 2020. 11. 4.
728x90

Program 1

 

도형의 면적을 계산하는 프로그램을 쓰시오. (도형의 종류는 삼각형, 정사각형, 사각형, 원의 네 가지로 한다.)

  • 입력 : 네 가지 도형 중에 하나를 선택, 각 도형의 길이 정보
  • 출력 : 선택한 도형의 길이 정보와 계산한 면적 결과 출력
  • 예외처리, 설명 주석, 문제 해결 방법에 대한 설명 필수

 

 

1) 문제 해결 방법에 대한 설명

  • 프로그램을 반복 실행하다가 사용자가 프로그램 종료를 선택하면 실행을 중지해야 하기 때문에 변수 선언을 제외한 전체 프로그램을 while(i)로 반복, 프로그램 종료 선택 시 i를 1에서 0으로 변경 (* switch문을 사용하기 때문에 break; 명령문을 사용하기 헷갈리는 점을 고려)
  • 사용자가 선택한 옵션에 따라 출력하는 안내문, 입력받는 길이 값, 연산 방법이 다르기 때문에 이후 실행되는 코드는 switch문 안에서 해결
  • 나머지 설명은 주석으로 대신합니다.

 

2) 소스 코드

#include <stdio.h>
#define pi 3.141592

int main()
{
	int i = 1, n = 0;
	int plane = 0;
	float hor = 0, ver = 0, rad = 0;

	// 프로그램 종료 입력 전까지 프로그램 반복 실행
	while (i)
	{
		printf("삼각형[1] 정사각형[2] 사각형[3] 원[4] 프로그램 종료[5]\n");
		printf("면적을 구할 도형의 번호를 선택하세요. >> ");

		scanf_s("%d", &plane);

		// 사용자의 입력값을 받아 switch 조건문으로 실행
		switch (plane)
		{
		case 1:
			// 유효한 입력이 들어올 때까지 입력 반복
			while (1)
			{
				printf("삼각형의 면적을 구합니다. 가로와 높이를 실수로 입력하세요. >> ");

				// 길이 값을 입력 받아 유효 개수를 검사
				n = scanf_s("%f %f", &hor, &ver);
				if (n != 2) {
					//유효 개수가 기대값과 다르면 입력 버퍼를 비우고 입력 오류 메세지, 입력을 다시 받음
					while (getchar() != '\n');
					printf("?? 길이 입력 오류\n");
				}
				// 유효 개수가 기대값과 같으면 입력 반복을 중지, 결과를 출력
				else break;
			}
			printf("[ 결과 ] 가로 : %.2f, 높이 : %.2f, 삼각형 면적 : %.2f\n\n", hor, ver, hor * ver / 2);
			break;
		case 2:
			while (1)
			{
				printf("정사각형의 면적을 구합니다. 한 변 길이를 실수로 입력하세요. >> ");
				n = scanf_s("%f", &hor);
				if (n != 1) {
					while (getchar() != '\n');
					printf("?? 길이 입력 오류\n");
				}
				else break;
			}
			ver = hor;
			printf("[ 결과 ] 한 변 길이: %.2f, 정사각형 면적 : %.2f\n\n", hor, hor * ver);
			break;
		case 3:
			while (1)
			{
				printf("사각형의 면적을 구합니다. 가로와 높이를 실수로 입력하세요. >> ");
				n = scanf_s("%f %f", &hor, &ver);
				if (n != 2) {
					while (getchar() != '\n');
					printf("?? 길이 입력 오류\n");
				}
				else break;
			}
			printf("[ 결과 ] 가로 : %.2f, 높이 : %.2f, 삼각형 면적 : %.2f\n\n", hor, ver, hor * ver);
			break;
		case 4:
			while (1)
			{
				printf("원의 면적을 구합니다. 반지름 길이를 실수로 입력하세요. >> ");
				n = scanf_s("%f", &rad);
				if (n != 1) {
					while (getchar() != '\n');
					printf("?? 길이 입력 오류\n");
				}
				else break;
			}
			printf("[ 결과 ] 반지름 : %.2f, 원 면적 : %.2f\n\n", rad, rad * rad * pi);
			break;
		case 5:
			printf("**** 프로그램을 종료합니다 ****\n\n");
			// 전체 프로그램 반복을 중지하기 위해 i값을 0으로 변경
			i = 0;
			break;
		default:
			// 도형을 잘못 선택하였을 경우 입력버퍼를 지우고 프로그램 반복
			while (getchar() != '\n');
			printf("?? 번호 선택이 잘못되었습니다.\n\n");
			break;
		}
	}

	return 0;
}

 

3) 입력/출력 결과

 


 

 

Program 2

 

다음을 참고로 표준 입력으로 받은 성별, 신장(키), 몸무게를 이용하여 비만도를 출력하는 프로그램을 작성하시오. 유효한 입력 값이 아니면 다시 입력받도록 처리해야 한다.

  • 비만 지수 = (현재 체중/ 표준 체중) × 100(%) 
  • 남자 표준 체중: 신장(m) × 신장(m) × 22
  • 여자 표준 체중: 신장(m) × 신장(m) × 21
  • 비만도(100 기준) : 정상(±10% 까지), 체중 과다(10% 초과 ~ 20% 이하), 비만(20% 초과), 체중 미달(-10% 미만)
  • 입력 : 성별, 신장(cm, 2m 이하), 몸무게(kg, 100kg 이하)
  • 예외처리, 설명 주석, 문제 해결 방법에 대한 설명 필수

 

 

1) 문제 해결 방법에 대한 설명

  • 프로그램 반복을 종료하지 않으므로 변수 선언 이후 코드는  while(1) 문으로 반복
  • 성별을 입력받은 후 성별을 잘못 입력했을 경우 신장과 몸무게의 입력을 받지 않고 반복하도록 바로 switch문 실행
  • 비만지수를 계산하여 100 값을 기준으로 범위를 계산, 숫자의 범위이기 때문에 간단하게 if, else if, else문을 활용
  • 나머지 설명은 주석으로 대신합니다.

 

2) 소스 코드

#include <stdio.h>

int main()
{
	int n = 0;
	int sex = 0;
	float height = 0, weight = 0;
	float standard = 0, BMI = 0;

	while (1)
	{
		printf("성별을 입력하세요. 1(여자) 2(남자): ");
		scanf_s("%d", &sex);

		switch (sex)
		{
		case 1:
			while (1)
			{
				printf("신장(cm)과 몸무게(kg)를 입력하세요: ");
				n = scanf_s("%f %f", &height, &weight);
				// 입력이 잘못되었거나 음수값이 입력되었을 때
				if (n != 2 || height <= 0 || weight <= 0) {
					while (getchar() != '\n');
					printf("신장 또는 몸무게를 잘못 입력하였습니다.\n");
				}
				// 문제가 없으면 입력 반복을 중지
				else break;
			}
			// 여자 표준 체중 계산
			standard = (height / 100) * (height / 100) * 21;
			break;
		case 2:
			while (1)
			{
				printf("신장(cm)과 몸무게(kg)를 입력하세요: ");
				n = scanf_s("%f %f", &height, &weight);
				if (n != 2 || height <= 0 || weight <= 0) {
					while (getchar() != '\n');
					printf("신장 또는 몸무게를 잘못 입력하였습니다.\n");
				}
				else break;
			}
			// 남자 표준 체중 계산
			standard = (height / 100) * (height / 100) * 22;
			break;
		default:
			// 성별을 잘못 입력했을 경우 입력 버퍼를 비우고 프로그램 반복
			while(getchar() != '\n');
			printf("성별을 잘못 입력하였습니다.\n\n");
			continue;
		}

		// 비만지수 계산
		BMI = (weight / standard) * 100;
		printf("  현재 신장: %.2f, 체중: %.2f\n", height, weight);
		printf("  표준 체중: %.2f, 비만지수: %.2f\n", standard, BMI);

		// 비만지수가 90퍼센트 미만일 시 체중 미달, 90~110 정상, 110 초과 ~120 체중과다, 120 초과 비만
		if (BMI < 90) printf("비만도 판정 결과 : \"체중 미달\"입니다.\n\n");
		else if (BMI <= 110) printf("비만도 판정 결과 : \"정상\"입니다.\n\n");
		else if (BMI <= 120) printf("비만도 판정 결과 : \"체중 과다\"입니다.\n\n");
		else printf("비만도 판정 결과 : \"비만\"입니다.\n\n");
	}
	
	return 0;
}

 

 

3) 입력/출력 결과

 


 

 

Program 3

 

임의의 양의 정수와 자릿수 정수(n)를 입력받아 n의 자릿수에서 반올림하는 프로그램을 작성하시오. 

  • 예로 12365와 1을 입력하면 12370을 출력하고, 12365와 2를 입력하면 12400을 출력한다. 
  • 12365 10 입력하면 다시 입력받도록 한다.

 

 

1) 문제 해결 방법에 대한 설명

  • 사용자가 마지막 질문에 n이라고 대답 시 프로그램 실행 반복을 종료하여야 하므로 변수 선언 이외의 코드는 while(i) 안에서 실행
  • 자릿수 비교와 반올림 연산을 위해 dec 변수를 계산, dec은 사용자가 입력한 자릿수가 반올림되는 자릿수의 실제값을 의미 (ex. 2 -> 100, 3 -> 1000), dec을 계산하기 위해 자릿수만큼 10을 곱해줌
  • 자릿수 비교를 위해 dec/10 값보다 입력한 실수가 큰지 확인 (999 3 -> 1000으로 반올림 가능, 99 3 -> 99에는 세번째 자릿수 없음)
  • 반올림 연산은 <math.h>의 버림 메소드를 이용해도 되지만, 직접 구현 입력 값의 (반올림이기 때문에) 반올림하는 자릿수에 5를 더하고, dec으로 나눠 버림(5를 더했기 때문에 실제로는 반올림) 후 자릿수를 맞추기 위해 dec 값으로 다시 곱해줌
  • 나머지 설명은 주석으로 대신합니다.

 

2) 소스 코드

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

int main()
{
	int i = 1;

	int input = 0, digit = 0, dec = 1;
	char ans;

	while (i)
	{
		printf("임의의 양의 정수와 자릿수 정수를 입력하시오>> ");
		scanf_s("%d %d", &input, &digit);

		//매 반복마다 dec을 1로 초기화
		dec = 1;
		for (int j = 0; j < digit; j++)
		{
			dec *= 10;
		}

		//음수거나 자릿수를 잘못 입력하였을 경우 입력버퍼 지우고 다음 실행 생략
		if (input < dec/10 || input <= 0) {
			while (getchar() != '\n');
			printf("음수이거나 자릿수 지정 오류입니다.\n\n");
			continue;
		}

		// 반올림 출력
		printf("%d 자리에서 반올림한 결과 >> %d\n", digit, ((input + (dec / 2)) / dec) * dec);

		// n입력시 반복 종료
		printf("계속 하시겠습니까(y/n)? ");
		scanf_s(" %c", &ans);
		if (ans == 'n') i = 0;
		printf("\n");
	}

	return 0;
}

 

3) 입력/출력 결과

 


 

 

Program 4

 

표준 입력으로 받은 두 실수의 사칙 연산을 수행하는 프로그램을 작성하시오.

  • switch 문을 사용하고, 연산 종류 선택은 문자(+, -, *, .)로 하시오.

 

 

1) 문제 해결 방법에 대한 설명

  • 전체 프로그램을 반복하고, 실수 입력과 연산 종류 입력을 각각 반복하며 해당 두 반복은 break;로 종료
  • 나머지 설명은 주석으로 대신합니다.

 

2) 소스 코드

#include <stdio.h>

int main()
{
	int n;
	float a, b;
	char cal;

	// 프로그램 반복
	while (1)
	{
		// 실수 잘 입력할 때까지 반복
		while (1)
		{
			printf("두 실수 입력 : ");
			n = scanf_s("%f %f", &a, &b);

			// 잘못 입력시 입력버퍼 비우고 반복
			if (n != 2) {
				while (getchar() != '\n');
				printf("다시 ");
				continue;
			}
			// 잘 입력 했을 경우 입력 반복 종료
			break;
		}

		// 연산종류 잘 입력할 때까지 반복
		while (1)
		{
			printf("연산종류 선택 : ");
			scanf_s(" %c", &cal);

			// switch문 안에서 연산
			switch (cal) {
			case '+':
				printf("%.2f %c %.2f = %.2f", a, cal, b, a + b);
				break;
			case '-':
				printf("%.2f %c %.2f = %.2f", a, cal, b, a - b);
				break;
			case '*':
				printf("%.2f %c %.2f = %.2f", a, cal, b, a * b);
				break;
			case '/':
				printf("%.2f %c %.2f = %.2f", a, cal, b, a / b);
				break;
			// 연산자 잘못 입력 시 입력 반복
			default:
				printf("연산자를 잘못 선택했습니다.\n");
				continue;
			}
			// 입력 잘 되었을 때 연산 후 입력 반복 종료
			printf("\n\n");
			break;
		}
	}

	return 0;
}

 

3) 입력/출력 결과

 

728x90

댓글