반응형
문제 출처 : 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); }
//삼항연산자 결과값에 함수를 넣을 수 있는지는 긴가민가 했는데 잘된다.
반응형