그냥저냥

문제풀이 | The C Programming Language (K&R): Exercise 1-4 본문

개발기/The C Programming Language

문제풀이 | The C Programming Language (K&R): Exercise 1-4

sync86 2026. 5. 4. 16:09
728x90
반응형

책: The C Programming Language (K&R)

본문의 연습문제는 저작권 이슈로 그 내용을 직접적으로 언급하지 않습니다. 이점 양해 바랍니다.

 


Exercise 1-4. 섭씨-화씨 역산과 연산 우선순위

Exercise 1-4 문제는 Exercise 1-3에서 소개한 예제를 기반으로 섭씨에서 화씨로 역산하는 문제입니다.


1. 분석

섭씨에서 화씨를 구하는 공식

F = (9/5) * 섭씨(C) + 32

2. 소스코드

#include <stdio.h>

/** 
 * print Celsius-Fahrenheit table
 * for celsius = 0, 20, ..., 300
 */

int main(int argc, char** argv)
{
   int fahr       = 0;
   int lower      = 0;
   int upper      = 300;
   int step       = 20;
   int celsius    = lower;
   printf("============================\n");
   printf("| Celsius-Fahrenheit Table |\n");
   printf("============================\n\n");
   printf("----------------------------\n");
   printf("|    Celsius |  Fahrenheit |\n");
   printf("----------------------------\n");
   while (celsius <= upper) {
       fahr = ((9.0/5.0) * celsius) + 32.0;
       printf("| %10d | %11d |\n", celsius, fahr);
       celsius = celsius + step;
   }
   printf("----------------------------\n");
   return 0;
}

3. 실행 및 검증

$ ./a.out         
============================
| Celsius-Fahrenheit Table |
============================

----------------------------
|    Celsius |  Fahrenheit |
----------------------------
|          0 |          32 |
|         20 |          68 |
|         40 |         104 |
|         60 |         140 |
|         80 |         176 |
|        100 |         212 |
|        120 |         248 |
|        140 |         284 |
|        160 |         320 |
|        180 |         356 |
|        200 |         392 |
|        220 |         428 |
|        240 |         464 |
|        260 |         500 |
|        280 |         536 |
|        300 |         572 |
----------------------------

4. 마무리

Exercise 1-4는 기존 코드를 기반으로 바뀐 부분만 남기자면 아래와 같습니다.

int main(int argc, char** argv)
{
   int fahr       = 0;
   
   /* 생략 */
   
   int celsius    = lower;
   
   /* 생략 */
   
   printf("| Celsius-Fahrenheit Table |\n");
   
   /* 생략 */
   
   printf("|    Celsius |  Fahrenheit |\n");
   
   /* 생략 */
   
   while (celsius <= upper) {
       fahr = ((9.0/5.0) * celsius) + 32.0;
       printf("| %10d | %11d |\n", celsius, fahr);
       celsius = celsius + step;
   }
   
   /* 생략 */
}

 

다만, 눈치채신 분들도 계시겠지만, (9.0 / 5.0) * calsius + 32.0 수식을 보면 부동 소수점이 사용된 것을 확인할 수 있습니다.

부동 소수점과 수학에서 실수와는 표현은 비슷하나 엄연히 다른 측면이 있습니다.
이에 대해서 설명하는 것은 자신 없습니다.
현대 컴파일러는 수식에서 타입이 다른 부분이 있다면, 범위가 큰 타입으로 형변환을 자동으로 실행합니다.
수학의 분자 더하기에서 문모가 다를 때 분모를 일치 시켜서 계산하는 것과 유사합니다.

 

위의 코드를 기반으로 다시 작성하였습니다.

#include <stdio.h>

/** 
 * print Celsius-Fahrenheit table
 * for fahr = 0, 20, ..., 300
 */

int main(int argc, char** argv)
{
   double fahr    = 0.0;
   int lower      = 1;
   int upper      = 30;
   int step       = 1;
   int celsius = lower;
   printf("============================\n");
   printf("| Celsius-Fahrenheit Table |\n");
   printf("============================\n\n");
   printf("----------------------------\n");
   printf("|    Celsius |  Fahrenheit |\n");
   printf("----------------------------\n");
   while (celsius <= upper) {
       fahr = ((9.0/5.0) * celsius) + 32.0;
       printf("| %10d | %11.2lf |\n", celsius, fahr);
       celsius = celsius + step;
   }
   printf("----------------------------\n");
   return 0;
}

 

실행 결과는 아래와 같습니다.

$ ./a.out 
============================
| Celsius-Fahrenheit Table |
============================

----------------------------
|    Celsius |  Fahrenheit |
----------------------------
|          1 |       33.80 |
|          2 |       35.60 |
|          3 |       37.40 |
|          4 |       39.20 |
|          5 |       41.00 |
|          6 |       42.80 |
|          7 |       44.60 |
|          8 |       46.40 |
|          9 |       48.20 |
|         10 |       50.00 |
|         11 |       51.80 |
|         12 |       53.60 |
|         13 |       55.40 |
|         14 |       57.20 |
|         15 |       59.00 |
|         16 |       60.80 |
|         17 |       62.60 |
|         18 |       64.40 |
|         19 |       66.20 |
|         20 |       68.00 |
|         21 |       69.80 |
|         22 |       71.60 |
|         23 |       73.40 |
|         24 |       75.20 |
|         25 |       77.00 |
|         26 |       78.80 |
|         27 |       80.60 |
|         28 |       82.40 |
|         29 |       84.20 |
|         30 |       86.00 |
----------------------------

 

원래의 Celsius의 초기값이 0, Step이 20입니다.

실제 컴파일하고 실행해보니 차이가 나지 않아 조금 범위를 수정하였습니다.

참고바랍니다.

 

마지막으로 Celsius는 정수형을 유지하고, Fahrenheit의 값만 double 형으로 수정하였습니다.

Celsius는 통상적으로 영상/영하 몇도라는 단위로 많이 쓰입니다.

그래서 Celsius는 정수형 그대로 사용하였고, Fahrenheit만 double으로 부동 소수점으로 변환하였습니다.

 

 

다음은 Exercise 1-5 풀어보겠습니다.

728x90
반응형