2011년6월2일_온도 섭씨(℃) ↔ 화씨(℉) 변환 코드, C과제6(두 정수 사이의 5의 배수갯수 구하기, 10진수를 2진수로 출력(비트별값), 난수발생 주사위, 수직막대그래프(Histogram), 예외처리(scanf( ) 함수))
온도 섭씨(℃) ↔ 화씨(℉) 변환 코드 |
예제) 섭씨(Celsius) 온도를 화씨(Fahrenheit)로 변환
0℃에서 100℃까지의 섭씨 온도를 화씨 온도로 바꾸어서 5℃ 간격으로 출력하시오.
(섭씨 온도를 화씨로 바꾸는 변환식을 검색하여 적용하세요. )
① 섭씨 → 화씨 변환 테이블을 화면에 출력.
② 화씨 → 섭씨 변환 테이블을 화면에 출력.
③ ‘C’를 입력 받으면 섭씨 → 화씨 변환 테이블을 화면에 출력.
‘F’를 입력 받으면 화씨 → 섭씨 변환 테이블을 화면에 출력.
<온도 단위 변환식>
1: /*********************************************************************************
2: 예제) 섭씨(Celsius) 온도를 화씨(Fahrenheit)로 변환
3:
4: 0℃에서 100℃까지의 섭씨 온도를 화씨 온도로 바꾸어서 5℃ 간격으로 출력하시오.
5: (섭씨 온도를 화씨로 바꾸는 변환식을 검색하여 적용하세요. )
6:
7: 작성자: 김수만
8: 작성일자: 2011년 6월 2일
9:
10: *********************************************************************************/
11: #include <stdio.h>
12:
13: int Celsius_to_Fahrenheit(int);
14: int Fahrenheit_to_Celsius(int);
15: void View_Temperature_Conversion_Table(char);
16:
17:
18: int main()
19: {
20: int iLoop;
21: char cSel;
22:
23:
24: while(1)
25: {
26: printf("\n섭씨를 화씨로 변환한 표를 보시려면 C키를 누르시고,\n");
27: printf("화씨를 섭씨로 변환한 표를 보시려면 F키를 눌러주세요.");
28: scanf(" %c", &cSel);
29:
30: putchar('\n'); //보기 좋게 개행
31:
32: if('c' == cSel || 'C' == cSel || 'f' == cSel || 'F' == cSel)
33: {
34: View_Temperature_Conversion_Table(cSel);
35: }
36: else
37: {
38: printf("종료키를 누르셨어요. 메롱~ \n");
39: break;
40: }
41: }
42:
43: return 0;
44: }
45:
46: /*********************************************************************************
47:
48: 'c' 또는 'C'를 입력받으면 섭씨를 화씨로 변환한 테이블을 화면에 출력.
49: 'f' 또는 'F'를 입력받으면 화씨를 섭씨로 변환한 테이블을 화면에 출력.
50: 이외의 문자를 입력받으면 아무 일도 하지 않음.
51:
52: *********************************************************************************/
53:
54: void View_Temperature_Conversion_Table(char cSel)
55: {
56: int iLoop;
57:
58: switch(cSel)
59: {
60: //섭씨를 화씨로 변환한 테이블
61: case 'c':
62: case 'C':
63: printf(" ** Celsius To Fahrenheit **\n");
64:
65: //섭씨를 화씨로 변환하여 출력. 0 ~ 100℃까지
66: for(iLoop = 0 ; 100 >= iLoop ; iLoop = iLoop + 5)
67: {
68: printf("%8d℃ =>%5d℉\n", iLoop, Celsius_to_Fahrenheit(iLoop));
69: }
70:
71: break;
72:
73: //화씨를 섭씨로 변환한 테이블
74: case 'f':
75: case 'F':
76: printf("\n\n ** Fahrenheit To Celsius **\n");
77:
78: //화씨를 섭씨로 변환하여 출력. 32 ~ 212℉까지
79: for(iLoop = 32 ; 212 >= iLoop ; iLoop = iLoop + 9)
80: {
81: printf("%8d℉ =>%5d℃\n", iLoop, Fahrenheit_to_Celsius(iLoop));
82: }
83:
84: break;
85:
86: default:
87: //printf("잘 못 입력하셨습니다.\n");
88: break;
89: }
90:
91: return ;
92: }
93:
94: //섭씨를 화씨로 변환.
95: int Celsius_to_Fahrenheit(int iNum)
96: {
97: iNum = ((9.0 / 5.0) * iNum) + 32; //℃ → ℉
98:
99: return iNum;
100: }
101:
102: //화씨를 섭씨로 변환.
103: int Fahrenheit_to_Celsius(int iNum)
104: {
105: iNum = (5.0 / 9.0) * (iNum - 32); //℉ → ℃
106:
107: return iNum;
108: }
C과제6 |
<힌트>
두 정수 사이의 5의 배수 갯수 구하기 |
1: /*******************************************************************************
2:
3: 1. 두 개의 정수를 입력받고 두 정수 사이에 5의 배수의 개수를
4: 출력하는 프로그램을 작성하세요.
5:
6: 출력) 정수(2개) 입력 : 5 21
7: 출력 : 3
8:
9: 작성자: 김수만
10: 작성일자: 2011년 6월 2일
11:
12: *******************************************************************************/
13: #include <stdio.h>
14:
15: int Seek_Multiple(int, int);
16:
17:
18: int main()
19: {
20: int iMax;
21: int iMin;
22: int iStatus = 0;
23:
24: printf("정수(2개) 입력 : ");
25: iStatus = scanf("%d%d", &iMin, &iMax); //정상값은 2
26:
27: //예외 처리
28: if(2 != iStatus) //비정상이면
29: {
30: printf("정수를 입력하지 않아 종료합니다.\n");
31: return 0;
32: }
33:
34: iStatus = Seek_Multiple(iMin, iMax);
35:
36: printf("출력 : %d\n", iStatus);
37:
38: return 0;
39: }
40:
41: /****************************************************************
42:
43: 두 개의 정수를 입력받아,
44: 두 정수 사이의 5의 배수의 갯수를 반환하는 함수.
45:
46: ****************************************************************/
47:
48: int Seek_Multiple(int iMin, int iMax)
49: {
50: int iLoop;
51: int iCnt = 0;
52:
53: //최소값의 +1에서 부터 최대값의 -1까지 검사.
54: for(iLoop = iMin + 1 ; iMax > iLoop ; ++iLoop)
55: {
56: if(0 == iLoop % 5) //5의 배수의 갯수를 셈.
57: {
58: ++iCnt;
59: }
60: }
61:
62: return iCnt; //5의 배수의 갯수를 반환.
63: }
10진수를 2진수로 출력 |
1: /*******************************************************************************
2:
3: 2. 1바이트 범위의 정수를 입력 받은 다음,
4: 각각의 비트가 켜져 있으면 1, 꺼져 있으면 0을 출력하세요.
5:
6: 출력) 정수 입력(0~255) : 127
7:
8: 비트 스위치
9: ------------------
10: 0 : 1
11: 1 : 1
12: 2 : 1
13: 3 : 1
14: 4 : 1
15: 5 : 1
16: 6 : 1
17: 7 : 0
18: ------------------
19:
20:
21: 작성자: 김수만
22: 작성일자: 2011년 6월 2일
23:
24: *******************************************************************************/
25: #include <stdio.h>
26:
27: int main()
28: {
29: unsigned char cNum;
30: unsigned char cLoop;
31:
32: printf("정수 입력(0~255) : ");
33: scanf("%d", &cNum);
34:
35: printf("\n비트 스위치\n");
36: printf("---------------------\n");
37:
38: //8bit자료형이므로 0~7까지 8단계 우로 시프트
39: for(cLoop = 0 ; 8 > cLoop ; ++cLoop)
40: {
41: printf("%3d : %3d\n", cLoop, cNum & 0x01); //최하위 비트만 추출.
42: cNum = cNum >> 1;
43: }
44:
45: printf("---------------------\n");
46:
47:
48: return 0;
49: }
주사위를 굴리는 게임 |
1: /*******************************************************************************
2:
3: 3. 난수를 발생하는 rand 함수를 활용하여 주사위를..
4: 10번 던졌을 때 주사위 값을 출력하시오.
5:
6: 출력) ------ 주사위 GAME START -----
7: 주사위 게임 몇 번? : 3
8: dice value : 5
9: dice value : 2
10: dice value : 1
11:
12: 주사위 게임 몇 번? : 0
13: 게임 종료하시겠습니까?(Y/N) : n
14:
15: 주사위 게임 몇 번? 2
16: dice value : 3
17: dice value : 4
18:
19: 주사위 게임 몇 번? : 0
20: 게임 종료하시겠습니까?(Y/N) : y
21: ----------- 게임 종료! ----------
22:
23:
24: 작성자: 김수만
25: 작성일자: 2011년 6월 2일
26:
27: *******************************************************************************/
28: #include <stdio.h>
29: #include <stdlib.h> //rand()
30: #include <time.h> //srand()
31:
32: void Shake_dice(unsigned char);
33:
34:
35: int main()
36: {
37: unsigned char ucNum;
38: unsigned char cStatus = 0;
39:
40: /***********************************************
41: srand(time())
42: 고정적인 난수의 개념에 시간을 도입하여..
43: 고정적이지 않게 만드는 구문.
44: ***********************************************/
45: srand(time(NULL));
46:
47:
48: printf("------ 주사위 GAME START -----\n");
49:
50: while(1)
51: {
52: printf("주사위 게임 몇 번? : ");
53: cStatus = scanf("%d", &ucNum); //비정상이면 1이 아닌 값을 리턴.
54:
55: if(1 != cStatus) //비정상이면 정수를 입력하라고 하고 버퍼를 비운뒤에 처음으로.
56: {
57: printf("정수를 입력해주세요.\n");
58: fflush(stdin); //버퍼비움.
59: continue;
60: }
61:
62: if(0 == ucNum || 0 > ucNum) //0이거나 음수이면 게임을 종료할 것인지 물음.
63: {
64: printf("게임을 종료하시겠습니까?(Y/N) : ");
65: cStatus = scanf(" %c", &ucNum); //비정상이면 1이 아닌 값을 리턴.
66: //%c앞에 공백문자는 화이트 스페이스
67:
68: //예외처리를 하였으나 원하는 대로 되지 않음.
69: if(('y' == ucNum) || ('Y' == ucNum) || (1 != cStatus))
70: {
71: break; //종료
72: }
73: else
74: {
75: continue; //다시 입력 받음.
76: }
77: }
78:
79: Shake_dice(ucNum);
80:
81: putchar('\n');
82: }
83:
84: printf("----------- 게임 종료! ----------\n");
85:
86:
87: return 0;
88: }
89:
90: //인자로 받은 수 만큼 주사위를 흔들어 화면에 출력.
91: void Shake_dice(unsigned char ucNum)
92: {
93: unsigned char ucLoop;
94: //주사위 굴리기.
95: for(ucLoop = 0 ; ucNum > ucLoop ; ++ucLoop)
96: {
97: printf("dice value : %d\n", (rand() % 6) + 1); // 1 ~ 6사이의 난수를 발생함.
98: }
99:
100: return ;
101: }
수직막대그래프(Histogram) |
1: /*******************************************************************************
2:
3: [도전] 수직 막대 그래프(histogram)와 관련된 문제입니다.
4: 정수 N1, N2, N3의 길이를 갖는 막대 그래프를 출력하세요.
5: (0 < N1, N2, N3 < 10, 막대문자 : *).
6:
7: 출력) 정수(3개) 입력 : 7 2 5
8: 7 2 5
9: --------------
10: * * *
11: * * *
12: * *
13: * *
14: * *
15: *
16: *
17:
18: 작성자: 김수만
19: 작성일자: 2011년 6월 2일
20:
21: *******************************************************************************/
22: #include <stdio.h>
23:
24: #define SPACE 32 //공백문자의 ASCII는 32
25: #define STICK 10 //공백문자와 '*'은 10만큼 차이난다.
26:
27: void View_Histogram(unsigned char ucNum1, unsigned char ucNum2, unsigned char ucNum3);
28:
29: //프로그램 시작.
30: int main()
31: {
32: unsigned char ucNum1;
33: unsigned char ucNum2;
34: unsigned char ucNum3;
35: unsigned char ucStatus = 0;
36:
37: printf("정수(3개)입력 : ");
38: ucStatus = scanf("%d%d%d", &ucNum1, &ucNum2, &ucNum3);
39:
40: if(3 != ucStatus)
41: {
42: printf("입력하신 수가 정수가 아니라 종료합니다.\n");
43: return 0;
44: }
45:
46: View_Histogram(ucNum1, ucNum2, ucNum3);
47:
48: return 0;
49: }
50:
51: //히스토그램 출력.
52: void View_Histogram(unsigned char ucNum1, unsigned char ucNum2, unsigned char ucNum3)
53: {
54: unsigned char ucLoop;
55:
56: printf("%4d%4d%4d\n", ucNum1, ucNum2, ucNum3);
57: printf("--------------\n");
58:
59: //별 출력(막대사탕)
60: for(ucLoop = 0 ; 9 > ucLoop ; ++ucLoop)
61: {
62: //스페이스는 32, 별표는 42, 조건문이 참이면 1로 별표출력, 거짓이면 0으로 공백문자.
63: printf("%4c%4c%4c\n", (ucLoop < ucNum1) * STICK + SPACE
64: , (ucLoop < ucNum2) * STICK + SPACE
65: , (ucLoop < ucNum3) * STICK + SPACE);
66: }
67:
68: return ;
69: }
scanf( )의 예외처리 (Exception 처리) |
1은 하나의 입력을 받을 때만 해당되고 두 개의 변수에 담을 때는 2를 반환한다.
만약 %d형식지정자로 정수를 입력받을 때 문자를 입력하면 이상한 결과를 보여주는데 이런 결과는 프로그래머나 사용자가 원하는 결과가 아니다. 그래서 사용자가 프로그래머의 의도와 맞지 않는 입력을 하더라도 프로그램은 정상적으로 계속 동작해야 한다.
이를 프로그램의 강건성이라고 한다.
(시간나면 자세히;;;)
참조 (Reference) |
'내장형하드웨어 > 일일보고서' 카테고리의 다른 글
2011년6월7일_C과제7마무리(코드오류수정, 2의 보수, 1로 세트된 비트의 갯수, 교대급수), C과제7풀이 (0) | 2011.06.07 |
---|---|
2011년6월3일_C과제6풀이(5의 배수, 10진수를 2진수로 변환, 주사위게임, 히스토그램), 예제2(call by value, call by reference) (0) | 2011.06.07 |
2011년6월1일_리눅스 운영체제 메모리 보호영역 접근가능?, C과제5풀이, 리눅스명령어 정리 시작 (0) | 2011.06.02 |
2011년5월31일_ATmega128 내부EEPROM 하드웨어적 오류와 회피법, HexaView 프로젝트 (0) | 2011.06.01 |
2011년5월30일_두더지잡기게임 프로젝트 보고서 (0) | 2011.05.30 |