2011년6월2일_온도 섭씨(℃) ↔ 화씨(℉) 변환 코드, C과제6(두 정수 사이의 5의 배수갯수 구하기, 10진수를 2진수로 출력(비트별값), 난수발생 주사위, 수직막대그래프(Histogram), 예외처리(scanf( ) 함수))

 

 

온도 섭씨(℃) ↔ 화씨(℉) 변환 코드

clip_image002

예제) 섭씨(Celsius) 온도를 화씨(Fahrenheit)로 변환

0℃에서 100℃까지의 섭씨 온도를 화씨 온도로 바꾸어서 5℃ 간격으로 출력하시오.
(섭씨 온도를 화씨로 바꾸는 변환식을 검색하여 적용하세요. )

① 섭씨 → 화씨 변환 테이블을 화면에 출력.
② 화씨 → 섭씨 변환 테이블을 화면에 출력.
③ ‘C’를 입력 받으면 섭씨 → 화씨 변환 테이블을 화면에 출력.
   ‘F’를 입력 받으면 화씨 → 섭씨 변환 테이블을 화면에 출력.

 

<온도 단위 변환식>

image image


① 섭씨 → 화씨 변환 테이블을 화면에 출력.


 

   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

 

<힌트>

image 

 

 

 

두 정수 사이의 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:  }

 

clip_image002[5]

 

 

 

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:  }

 

clip_image004

 

 

 

 

주사위를 굴리는 게임

 

   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:  }

 

clip_image002[7]

 

 

 

수직막대그래프(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:  }

 

clip_image002[9]clip_image004clip_image006

 

 

 

 

 

scanf( )의 예외처리 (Exception 처리)

image

1은 하나의 입력을 받을 때만 해당되고 두 개의 변수에 담을 때는 2를 반환한다.
만약 %d형식지정자로 정수를 입력받을 때 문자를 입력하면 이상한 결과를 보여주는데 이런 결과는 프로그래머나 사용자가 원하는 결과가 아니다. 그래서 사용자가 프로그래머의 의도와 맞지 않는 입력을 하더라도 프로그램은 정상적으로 계속 동작해야 한다.
이를 프로그램의 강건성이라고 한다.

(시간나면 자세히;;;)

 

 

 

 

 

참조 (Reference)

 

 

DSCN3285