본문 바로가기
C언어/쉽게 풀어쓴 C언어 EXPRESS 개정4판

[4上] 쉽게 풀어쓴 C언어 EXPRESS 개정 4판 4장 PROGRAMMING (1~6번)

by EATSTAR 2023. 6. 3.
반응형

[ 7 ~ 12번 ]

 

쉽게 풀어쓴 C언어 EXPRESS 4장 PROGRAMMING (下)

이 페이지는 4장 7~12번 문제에 대해 서술하므로 1~6번의 문제는 아래의 링크를 참조하세요. 쉽게 풀어쓴 C언어 EXPRESS 4장 PROGRAMMING (上) 이 페이지는 4장 1~6번 문제에 대해 서술하므로 7~12번의 문제

eatstar.tistory.com

 

* 본문은 Microsoft Visual Studio 2022 버전 17.6.2를 사용하였으므로 다른 버전의 비쥬얼 스튜디오나 다른 C언어 작동 프로그램으로 작동할 경우 오류가 생길 수 있음을 양지해주세요.

1. 사용자로부터 하나의 실수를 입력받아서 소수점 표기 방법과 지수 표기 방법으로 동시에 출력하는 프로그램을 작성하라.  (실수 입출력 / MEDIUM)

실수를 입력하시오: 123.567
실수형식으로는 123.567000입니다
지수형식으로는 1.235670e+02입니다

HINT > 실수 형식은 %f를 사용하고 지수 형식은 %e를 사용하여 출력한다.

메인 개념 page > 144p (소수점 표기와 지수 표기 방식)

 

#include <stdio.h>

int main(void) {
	double f;

	printf("실수를 입력하시오: ");
	scanf_s("%lf", &f);
	printf("실수형식으로는 %f입니다.\n", f);
	printf("지수형식으로는 %e입니다.", f);

	return 0;
}

이상한 것을 눈치챘는가? 분명 double 형으로 f 변수를 정의했는데 실수형식으로 출력할 때는 %f를 쓰고 있다! WHAT?

double 형의 실수를 출력할 때는 %f와 %lf 모두 사용 가능하다 (물론 맞게 써주는게 안헷갈리지만..)

하지만 double 형을 입력할 때(scanf 함수에서의 %)는 %lf만 가능함을 양지하자.

 

 

%g 사용을 통한 생각 확장

%g를 사용할 수도 있다. %g는 소수점 이하 6자리 안에서 표현이 가능하면 %f를 사용하고 아니면 %e를 자동으로 사용하는 편리한 도구이니 이것도 알아두자.

#include <stdio.h>

int main(void) {
	double f;

	printf("실수를 입력하시오: ");
	scanf_s("%lf", &f);
	printf("[실수/지수]형식으로는 %g입니다.", f);

	return 0;
}

 

소수점 아래 6자리가 넘었지만 %f로 출력된다. 결과적으로 반올림을 통해 소수점 아래 6자리로 표현이 가능하면 되는거다.

 

소수점 부분을 없애더라도 어쨋든 반올림을 통해 6자리로 만들었다. 이쯤 되면 소수점이 없어지더라도 반올림을 하고 6자리임을 깨달을 수 있다.

 

소수점을 제거하고 반올림을 하더라도 1234567으로 되므로 드디어 7자리로 표현할 수 밖에 없어졌다! 이러면 %e로 출력되는 것이다.

 


2. 사용자로부터 정수를 16진수로 입력받아서 8진수, 10진수, 16진수 형태로 출력하는 프로그램을 작성하시오.  (다양한 진법 입출력 / MEDIUM)

16진수 정수를 입력하시오: ff
8진수로는 0337입니다
10진수로는 255입니다
16진수로는 0xff입니다

HINT > 16진수 정수로 입력받으려면 scanf("%x", &data);와 같이 한다. 16진수를 0x를 붙여서 출력하려면 printf("%#x", data)와 같이 한다.

메인 개념 page > 134p (n진수[진법]의 입출력 방식)

 

#include <stdio.h>

int main(void) {
	int num;
	
	printf("16진수 정수를 입력하시오: ");
	scanf_s("%x", &num);
	printf("8진수로는 %o입니다\n", num);
	printf("10진수로는 %d입니다\n", num);
	printf("8진수로는 %#x입니다", num);

	return 0;
}

슬슬 교재의 내용이 좀 기억이 안나서 땀이 나기 시작할거다.

하긴, 왼쪽 날개 참고사항에 있는걸 누가 주의깊게 읽겠는가?

아무튼, 8진수는 %o로 나타내고, 10진수는 정수형 그대로 %d를 사용한다.

16진수는 %x로 입력하는데, 앞에 0x가 붙은 형태는 %#x로 해주면 된다.

 

정수를 입력받는 것이므로 num 변수는 int 형으로 정의한다.

 

 


3. int형의 변수 x와 y의 값을 서로 교환하는 프로그램을 작성하여보자. 별도의 변수가 필요하면 정의하여서 사용한다.   (다양한 진법 입출력 / MEDIUM)

x=10 y=20
x=20 y=10

HINT > 또 하나의 변수 tmp가 필요하다. 우유와 주스가 든 컵의 내용물을 서로 교환하려면 제 3의 컵이 필요한 것과 마찬가지이다.

 

#include <stdio.h>

int main(void) {
	int x = 10;
	int y = 20;
	int tmp = 0;

	printf("x=%d y=%d\n", x, y);

	tmp = x;
	x = y;
	y = tmp;
	
	printf("x=%d y=%d", x, y);

	return 0;
}

드디어 지식 퀴즈가 아니라 논리적 사고를 요하는 문제가 나왔다!  (간단한 변수 선언만 알면 3장 수준에서도 풀 수 있다.)

물 컵 2개가 있을 때 서로 바꿀 수 없으므로, 한 개의 물 컵이 더 필요하다. 그것이 바로 tmp다.

tmp는 오류를 대비해 일단 0으로 초기화시켜주자.

그리고 tmp는 x의 값을 받으므로 tmp = 10 / x = 10 / y = 20

x는 y의 값을 받으므로 tmp = 10 / x = 20 / y = 20

마지막으로 y는 tmp의 값을 받으므로 tmp = 10 / x = 20 / y = 10

이렇게 해서 x와 y값은 바뀌게 된다.

 


4. 상자의 부피를 구하는 프로그램을 작성하여보자. 부피는 길이*너비*높이로 계산된다. 길이, 너비, 높이는 모두 double형의 실수로 입력받아보자.  (실수 입출력, 실수 계산 / MEDIUM)

상자의 가로 세로 높이를 한번에 입력: 30 30 30
상자의 부피는 27000.000000입니다.

HINT > scanf_s("%lf %lf %lf", &w, &h, %d);와 같이 하면 3개의 값을 한 문장으로 받을 수 있다.

 

#include <stdio.h>

int main(void) {
	double length, width, height, volume;

	printf("상자의 가로 세로 높이를 한번에 입력: ");
	scanf_s("%lf %lf %lf", &length, &width, &height);
	volume = length * width * height;
	printf("상자의 부피는 %lf입니다.", volume);
	
	return 0;
}

여러가지 변수를 정의하고, 한 번에 입력받을 수 있는지 테스트하는 문제다. 또 약간 복잡한 실수 계산도 포함되어 있다.

 

 


5. 우리나라에서 많이 사용되는 면적 단위인 평을 제곱미터로 환산하는 프로그램을 작성하시오. 여기서 1평은 3.3㎡이다. 변수들의 자료형은 어떤 것을 선택하는 것이 좋은가? 기호 상수를 이용하여 1평당 제곱미터를 나타내어라.  (실수 입출력, 실수 계산 / MEDIUM)

평을 입력하세요: 31
102.479800평방미터입니다.

HINT > 기호 상수는 const double SQMETER_PER_PYEONG=3.3058;와 같이 정의할 수 있다. #define SQMETER_PER_PYEONG 3.3058을 사용하여도 된다.

메인 개념 page > 136~137p (기호 상수 정의법)

 

#include <stdio.h>
#define SQMETER_PER_PYEONG 3.3058

int main(void) {
	double PYEONG, SQMETER;

	printf("평을 입력하세요: ");
	scanf_s("%lf", &PYEONG);
	SQMETER = PYEONG * SQMETER_PER_PYEONG;
	printf("%lf평방미터입니다.", SQMETER);

	return 0;
}

#define을 이용하여 기호상수를 정의했다. 하지만 아래와 같이 const int로 정의할 수도 있다.

#include <stdio.h>

int main(void) {
	double PYEONG, SQMETER;
	const double SQMETER_PER_PYEONG = 3.3058;

	printf("평을 입력하세요: ");
	scanf_s("%lf", &PYEONG);
	SQMETER = PYEONG * SQMETER_PER_PYEONG;
	printf("%lf평방미터입니다.", SQMETER);

	return 0;
}

 

 


6. 다음과 같은 수식의 값을 계산하여 화면에 출력하는 프로그램을 작성하시오. 지수 표기법을 사용하여 변수들을 초기화한다.  (실수 입출력, 실수 계산 / MEDIUM)

3.32 X 10^-3 + 9.76 X 10^-8

0.003320

HINT > 3.32 X 10^-3은 3.32e-3으로 표기하면 된다.

 

#include <stdio.h>

int main(void) {
	printf("%lf", 3.32e-3 + 9.76e-8);

	return 0;
}

이 정도 문제는 변수 선언을 하지 않고도 이렇게 printf 함수만으로 간단하게 출력이 가능하다.

이 문제에서 알 것은 지수를 코드상에서 어떻게 표기하느냐 정도다.

#include <stdio.h>

int main(void) {
	double sum = 3.32e-3 + 9.76e-8;
	printf("%lf", sum);

	return 0;
}

물론 이렇게 sum 변수를 선언하여 출력할 수도 있다.

 

반응형