연재 완료/C Lang 예제코드 모음

C언어 연습문제 풀이 CH3 (11~15번)

라이피 (Lypi) 2018. 4. 29. 01:08
반응형

문제 출처 : YES C (정보공학연구소/생능출판사)



11. 4개의 정수를 입력받아 오름차순으로 정렬하여 출력하는 프로그램을 작성하라. (단, " ? : "의 연산자만을 사용하라)

#include <stdio.h>


void main()
{
	int a, b, c, d;

	printf("첫번째 정수를 입력하세요 : "); scanf_s("%d", &a);
	printf("두번째 정수를 입력하세요 : "); scanf_s("%d", &b);
	printf("세번째 정수를 입력하세요 : "); scanf_s("%d", &c);
	printf("네번째 정수를 입력하세요 : "); scanf_s("%d", &d);

	int temp = 0;
	
	a < b ? temp = 0 : (temp = a, a = b, b = temp);
	b < c ? temp = 0 : (temp = b, b = c, c = temp);
	c < d ? temp = 0 : (temp = c, c = d, d = temp);

	a < b ? temp = 0 : (temp = a, a = b, b = temp);
	b < c ? temp = 0 : (temp = b, b = c, c = temp);
	c < d ? temp = 0 : (temp = c, c = d, d = temp);

	a < b ? temp = 0 : (temp = a, a = b, b = temp);
	b < c ? temp = 0 : (temp = b, b = c, c = temp);
	c < d ? temp = 0 : (temp = c, c = d, d = temp);

	printf("%d, %d, %d, %d", a, b, c, d);
	

}

// 고민 하다가 버블 정렬로 해결... 이게 제일 깔끔한 것 같다.


12. scanf()를 이용하여 5개의 수를 입력받아 큰 수들의 합과 작은 수들의 합을 구하는 프로그램을 작성하라.

//조건 변경 : 1. scanf() 대신에 scanf_s()로 사용 2. 입력받은 수 중 큰 수 2개의 합과 작은수 2개의 합을 계산

#include <stdio.h>

void main()
{
	int input;
	int max1, max2, min1, min2;

	printf("첫번째 정수를 입력하세요 : "); scanf_s("%d", &input);
	max1 = max2 = min1 = min2 = input;

	printf("두번째 정수를 입력하세요 : "); scanf_s("%d", &input);
	input > max1 ? (max2 = max1, max1 = input)
				 : (max2 = input);
	input < min1 ? (min2 = min1, min1 = input)
				 : (min2 = input);

	printf("세번째 정수를 입력하세요 : "); scanf_s("%d", &input);
	input > max1 ? (max2 = max1, max1 = input)
		: (input > max2 ? (max2 = input) : (input = 0));
	input < min1 ? (min2 = min1, min1 = input)
		: (input < min2 ? (min2 = input) : (input = 0));

	printf("네번째 정수를 입력하세요 : "); scanf_s("%d", &input);
	input > max1 ? (max2 = max1, max1 = input)
		: (input > max2 ? (max2 = input) : (input = 0));
	input < min1 ? (min2 = min1, min1 = input)
		: (input < min2 ? (min2 = input) : (input = 0));

	printf("다섯번째 정수를 입력하세요 : "); scanf_s("%d", &input);
	input > max1 ? (max2 = max1, max1 = input)
		: (input > max2 ? (max2 = input) : (input = 0));
	input < min1 ? (min2 = min1, min1 = input)
		: (input < min2 ? (min2 = input) : (input = 0));

	printf("다섯개의 수 중 가장 큰 수(%d)와 그 다음 큰 수(%d)의 합은 %d 입니다. \n", max1, max2, max1 + max2);
	printf("다섯개의 수 중 가장 작은 수(%d)와 그 다음 작은 수(%d)의 합은 %d 입니다. \n", min1, min2, min1 + min2);

}

// 방법이야 많겠지만 이번엔 받는 즉시 판단해서 넣어버리도록 했다. ... 이 책은 왜 삼항연산자만 가지고 이런 짓을 자꾸 시키는것인가...


13. 다음 변수들을 선언하여 초기화를 시킨 후 이들의 계산을 한 결과를 출력하는 프로그램을 작성하고 그 결과가 어떻게 나왔는지를 조사하라. 

//상당히 마음에 안드는 짜증나는 문제...

a = ---i;

b = j- --i;

c = j ---i;

d = -j -- -k;

e = k ++=i;

f = m++ / ++i * --j;

g = ++i / m++ * ++n;


#include <stdio.h>

void main()
{
	//i,j,k,n이 문제 조건에 정의되어 있지 않으므로 그냥 0으로 초기화했다.
	int i = 0, j = 0, k = 0, n = 0, m = 0;

	int a, b, c, d, e, f, g;

	a = -(--i); 
	printf(" a = %d, i = %d, j = %d, k = %d, n = %d, m = %d \n", a, i, j, k, n, m);
	//a = ---i; 는 에러다.  a = - --i; 로 쓸수도 있는데 괄호를 쓰는게 더 안전하다. 참고로 -- -i나 --(-i)는 안된다.
	
	b = j- (--i);
	printf(" b = %d, i = %d, j = %d, k = %d, n = %d, m = %d \n", b, i, j, k, n, m);
	//b = j- --i;는 에러는 나지 않는데, 좋은 코드는 아니므로 괄호를 쓰자.

	c = j - (--i);
	printf(" c = %d, i = %d, j = %d, k = %d, n = %d, m = %d \n", c, i, j, k, n, m);
	//c = j ---i; 는 에러다.

	d = -(j--) - k;
	printf(" d = %d, i = %d, j = %d, k = %d, n = %d, m = %d \n", d, i, j, k, n, m);
	//d = -j -- - k; 증감연산자와 변수 사이에는 공백이 있어서는 안된다. 또한 증감연산자의 피연산자는 좌변값이어야 한다.
	//그러므로 -j-- -k도 에러는 안나지만 좋은 코드는 아니므로 괄호를 쓰자. 
	//j--는 대입이 끝난뒤 실행되므로 위의 식은 0-0=0으로 계산된 뒤에 j가 -1이 되었다.

	e = k++; k = i;
	printf(" e = %d, i = %d, j = %d, k = %d, n = %d, m = %d \n", e, i, j, k, n, m);
	//e = k++=i;
	//당연히 에러가 나고, 뭘 원하는 식인지도 모르겠지만 굳이 쓰자면 이런식으로 써야 한다. 
	//k=i도 대입되는 i값을 리턴하지만 k++는 좌변값이 아니므로 그 값을 받을 수가 없다.
	
	f = (m++) / (++i) * (--j);
	printf(" f = %d, i = %d, j = %d, k = %d, n = %d, m = %d \n", f, i, j, k, n, m);
	//f = m++ / ++i * --j;
	//딱히 문제는 없는 식이지만 헷갈리므로 괄호를 쓰자.

	g = (++i) / (m++) * (++n);
	printf(" g = %d, i = %d, j = %d, k = %d, n = %d, m = %d \n", g, i, j, k, n, m);
	//g = ++i / m++ * ++n;
	//상동

}


14. 4개의 정수를 입력받아 내림차순으로 정렬하여 출력하는 프로그램을 작성하라. 단 " ? : "의 연산자만을 사용하라.

#include <stdio.h>

void main()
{
	int a, b, c, d;

	printf("첫번째 정수를 입력하세요 : "); scanf_s("%d", &a);
	printf("두번째 정수를 입력하세요 : "); scanf_s("%d", &b);
	printf("세번째 정수를 입력하세요 : "); scanf_s("%d", &c);
	printf("네번째 정수를 입력하세요 : "); scanf_s("%d", &d);

	int temp = 0;

	a > b ? temp = 0 : (temp = a, a = b, b = temp);
	b > c ? temp = 0 : (temp = b, b = c, c = temp);
	c > d ? temp = 0 : (temp = c, c = d, d = temp);

	a > b ? temp = 0 : (temp = a, a = b, b = temp);
	b > c ? temp = 0 : (temp = b, b = c, c = temp);
	c > d ? temp = 0 : (temp = c, c = d, d = temp);

	a > b ? temp = 0 : (temp = a, a = b, b = temp);
	b > c ? temp = 0 : (temp = b, b = c, c = temp);
	c > d ? temp = 0 : (temp = c, c = d, d = temp);

	printf("%d, %d, %d, %d", a, b, c, d);
}

//11번과 같은 버블정렬방식으로 해결. 


15. 정수(초, sec)를 입력받아 몇 시, 몇 분, 몇 초인지를 나타내는 프로그램을 작성하라. (단, 음수일 경우 에러 메시지 출력)

#include <stdio.h>

void main()
{
	int sec;
	printf("계산할 초를 입력하세요 : "); scanf_s("%d", &sec);
	sec < 0 
		? printf("음수는 계산할 수 없습니다.") 
		: printf("%d초는 %d시간 %d분 %d초입니다. \n",sec, sec/3600, (sec%3600)/60, sec%60);
}
//삼항연산자 결과값에 함수를 넣을 수 있는지는 긴가민가 했는데 잘된다.


반응형