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

C언어 연습문제 풀이 CH3 (6~10번)

라이피 (Lypi) 2018. 4. 28. 19:45
반응형

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


6. 15와 7의 비트 연산 AND, OR, XOR를 구하는 프로그램을 작성하라.

#include <stdio.h>


void main()
{
	printf("15 & 7 = %d \n", 15 & 7); //비트단위 논리곱 (AND연산)
	printf("15 | 7 = %d \n", 15 | 7); //비트단위 논리합 (OR연산)
	printf("15 ^ 7 = %d \n", 15 ^ 7); //비트단위 베타적 논리합 (XOR연산)
}

/*

 15는 이진수로 1111, 7은 이진수로 0111

 1111 & 0111 = 0111 (7)

 1111 | 0111 = 1111 (15)

 1111 ^ 0111 = 1000 (8)

*/


7. 두 수 x, y를 입력받아 비교하여 큰 수를 작은 수로 나눈 몫과 나머지를 출력하는 프로그램을 작성하라. 


#include <stdio.h>


void main()
{
	int a, b;
	printf("첫번째 정수를 입력하세요. : "); scanf_s("%d", &a);
	printf("두번째 정수를 입력하세요. : "); scanf_s("%d", &b);

	printf("%d에서 %d를 나눈 몫은 %d이고 나머지는 %d입니다.\n", 
                (a>b)?a:b, (a>b)?b:a, (a>b)?(a/b):(b/a), (a>b)?(a%b):(b%a));

}


/*

  이 코드의 문제점

  1. if문이 아직 나오지 않았으므로 예외처리를 하지 않음. 

  2. 그래서 입력값에 0이 있으면 런타임에러가 나고, 실수를 입력하면 정상적인 작동을 하지 않음.

  

  xor swap 알고리즘을 한번 써볼까 했는데 삼항 연산자만으로는 오히려 코드가 복잡해질 것 같아서 쓰지 않음. 

*/


8. 세 수를 입력받아 좌표상의 한 점으로 하여 연결할 경우 삼각형이 되는지 안되는지를 판별하라. 

//입력받은 값은 삼각형의 변의 길이라 판단했다.


//삼각형이 되는 조건은 가장 긴 변이 나머지 두 변의 합보다 작아야 한다.

#include <stdio.h> void main() { float a, b, c; printf("첫번째 변의 길이를 입력하세요. : "); scanf_s("%f", &a); printf("두번째 변의 길이를 입력하세요. : "); scanf_s("%f", &b); printf("세번째 변의 길이를 입력하세요. : "); scanf_s("%f", &c); printf ("삼각형을 만들 수 %s 습니다.", (a > b) ? ((a > c) ? ((a < b + c) ? "있" : "없") : ((c < a + b) ? "있" : "없") ) : ((b > c) ? ((b < a + c) ? "있" : "없") : ((c < a + b) ? "있" : "없") ) );

//여러분 삼항연산자가지고 이 지랄 하지 말고 그냥 if-else문을 씁시다 (..)

//한글 한 글자는 문자가 아니라 문자열로 처리됩니다. 그러니 쌍따옴표를 씁시다.


9. 날짜(2003년 2월 14일)를 입력받아 일년 중 총 몇일인지를 출력하는 프로그램을 작성하라.

#include <stdio.h>


void main()
{
	int y, m, d;
	bool o; // 참이면 1, 거짓이면 0

	printf("년을 입력해주세요 : "); scanf_s("%d", &y);
	printf("월을 입력해주세요 : "); scanf_s("%d", &m);
	printf("일을 입력해주세요 : "); scanf_s("%d", &d);
	printf("%d년 %d월 %d일은 %d년의  ", y, m, d, y);

	o = (y % 400 == 0) || (y % 100 != 0) && (y % 4 == 0);

	m > 1 ? d += 31 : d += 0;
	m > 2 ? (o == 1 ? d += 29 : d += 28 ) : d += 0;
	m > 3 ? d += 31 : d += 0;
	m > 4 ? d += 30 : d += 0;
	m > 5 ? d += 31 : d += 0;
	m > 6 ? d += 30 : d += 0;
	m > 7 ? d += 31 : d += 0;
	m > 8 ? d += 31 : d += 0;
	m > 9 ? d += 30 : d += 0;
	m > 10 ? d += 31 : d += 0;
	m > 11 ? d += 30 : d += 0;
	
	printf("%d번째 날입니다. \n", d);
}

// 조건 연산자로 노가다를 좀 했는데, 배열과 반복문을 쓰면 좀 더 간단하게 짤 수 있다고 한다.



10. 키보드에서 30개의 정수를 입력받아 가장 작은 수를 출력하는 프로그램을 작성하라.

#include <stdio.h>


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

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

	printf("입력하신 수들 중 가장 작은 수는 %d 입니다.", (b < a) ? ((b < c) ? b : c) : ((a < c) ? a : c));
}

//삼항 연산자 중첩해서 쓰는거 참 헷갈린다. 

반응형