<C프로그래밍-새내기를 위한 첫 C 언어 책>연습문제 chapter 10(11, 12, 13, 14, 15)

11. 다음 프로그램은 main의 두 정수 a와 b에 대해 나누기를 한 몫과 나머지를 quotient와 remainder에 구하여 출력하기 위한 것이다. 그러나 프로그램을 실행하면 잘못된 결과가 나온다. 프로그램에서 잘못된 곳을 찾아 이유를 설명하고 바르게 수정하시오.

 

 

#include <stdio.h>
void division(int x, int y, int q, int r);
int main(void)
{
	int a = 75, b = 8, quotient, remainder;

	division(a, b, quotient, remainder);
	printf("%d / %d = %d\n", a, b, quotient);
	printf("%d %% %d = %d \n", a, b, remainder);

	return 0;
}
//x를 y로 나눈 몫은 q에 나머지는 r에 구하는 함수
void division(int x, int y, int q, int r)
{
	q = x / y;
	r = x % y;
}

 

<수정한 프로그램>

#include <stdio.h>
void division(int x, int y, int* q, int* r);
int main(void)
{
	int a = 75, b = 8, quotient, remainder;

	division(a, b, &quotient, &remainder);	//함수에 주소값을 넘겨야 값이 변경된다
	printf("%d / %d = %d\n", a, b, quotient);
	printf("%d %% %d = %d \n", a, b, remainder);

	return 0;
}
//x를 y로 나눈 몫은 q에 나머지는 r에 구하는 함수
void division(int x, int y, int* q, int* r)	//인수를 포인터로 받는다
{
	*q = x / y;
	*r = x % y;
}

12. main 함수의 sec 변수에 초 단위의 시간을 입력받은 후 이 시간이 몇 분 몇 초에 해당하는지 main 함수의 min 과 sec 변수에 구하는 프로그램을 작성하시오. min과 sec의 값은 compute_time 함수를 이용하여 구한다.

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void compute_time(int* m, int* s);

int main(void)
{
	int min, sec;
	printf("초를 입력하세요. ");
	scanf("%d", &sec);
	printf("%d초는 ", sec);
	compute_time(&min, &sec);
	printf("%d분 %d초입니다.", min, sec);
	
	return 0;
}
void compute_time(int* m, int* s)
{
	*m = *s / 60;	//분
	*s %= 60;		//초
}

13. 다음의 배열 ary에 저장된 값을 포인터 연산을 통해 출력하시오. 배열의 원소 수는 배열의 크기와 배열 원소의 크기를 이용하여 구한다.

 

 

double ary[] = {170.5, 165.3, 157.2, 160.0, 165.7};
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	double ary[] = { 170.5, 165.3, 157.2, 160.0, 165.7 };
	double* p = ary;
	for (int i = 0; i < sizeof(ary) / sizeof(ary[0]); i++)
		printf("%d번째 수: %lf\n", i, *(p + i));
	
	return 0;
}

 


14. 11번과 12번 문제와 같이 함수 간 인수 전달에서 주소에 의한 호출이 필요한 예를 찾아 문제를 제시하고 프로그램으로 작성하시오.

 

풀이 생략..

 


 

15. 대학의 학점은 일반적으로 A+가 4.5점에 해당하지만 학교에 따라 4.3점인 경우도 있다. 4.3 만점제가 적용된 학생의 학점이 grade일 때 이 grade를 4.5 만점제에 맞추어 변환한 값 scre를 구하는 프로그램을 작성하시오. main 함수는 입력받은 grade에 대한 gbrade2와 score를 구하기 위해 convert 함수를 이용하도록 한다. grade가 4.2면 grade2는 4.4이며 score는 97.7이다.

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>	//_getch 사용

void convert(double g1, double* g2, double* s);

int main(void)
{
	double grade, grade2, score;
	int n;
	do {
		printf("4.3만점일 때 학점은? ");
		scanf("%lf", &grade);
		convert(grade, &grade2, &score);

		printf("100점 만점에 %.1lf점, 4.5점 만점에 %.1lf점입니다.\n", score, grade2);
		printf("종료하려면 q를 누르세요.\n\n");
		n = _getch();
	} while (n != 'q');	//q를 누를 때까지 반복
	
	return 0;
}

void convert(double g1, double* g2, double* s)
{
	*g2 = (g1 * 4.5) / 4.3;	//4.5 만점일 때
	*s = (g1 * 100) / 4.3;	//100점 만점일 때
}

반복 기능은 그냥 넣어봤다.