2011년5월18일...시리얼통신복습, C과제3풀이, C과제4

 

시리얼 통신


○ 시리얼 통신시 일치시켜 줘야하는 설정.
① 통신속도 (Baud rate)
② Data Size
③ Stop Bit
④ Parity Bit

○ ATmega128 ↔ PC,  PC ↔ PC 둘 다 통신설정을 잘 맞춰줘야함.

○ ATmega128통신 관련 레지스터
① 통신제어
② 데이터

 

 

C과제3풀이

 

● 1번-4 ch는 대문자이다.
              if(ch >= 65 && ch <= 90)  또는,
              if(ch >= ‘A’ && ch <= ‘Z’)  문자를 넣어도 됨.
● 1번-5 ch는 소문자이다.
              if(ch >= 97 && ch <= 122) 또는,
              if(ch >= ‘a’ && ch <= ‘z’)
           ※소문자는 대문자보다 32가 많고, 대문자는 소문자보다 32가 적다.

● 2번…scanf(“%c”,&ch);  → printf(“%d"\n”, ch);
        한 개의 문자를 입력받아 정수형으로 출력.

● 3번…대문자 ↔ 소문자
         1번조건을 사용해 대문자인지 소문지인지 판별하여 대문자이면 +32하여 소문자로 바꾸고,
                                                                      소문자이면 -32하여 대문자로 바꿈.

● 4번…만약 1234가 입력되었다고 하면,
          1234 / 10 → 결과가 0인지? 123이라 계속 나눔.
           123 / 10 → 결과가 0인지? 12라 계속 나눔.
            12 / 10 → 결과가 0인지? 1이라 계속 나눔.
             1 / 10 → 결과가 0인지? 0이네 이제 그만하고 몇 번 나누었는지 출력하면 자릿수가 나옴.

 

image


 

   1:  cnt = 0;
   2:    while( num > 0 )
   3:    {
   4:         cnt = cnt + 1;
   5:         num = num / 10;
   6:    }

 

 

★코드 수정하여 자릿수의 합을 구해보자.

   1:  sum = 0;
   2:  cnt = 0;
   3:  while ( num > 0)
   4:  {
   5:      cnt = cnt + 1;
   6:      sum = sum + num % 10;     //최하위 자리의 수를 추출해 sum에 저장.
   7:      num = num / 10;              //최하위 자리 잘라냄.
   8:  }

 

● 5번...피보나치 수열

image

이를 코드로 표현하면,

   1:      //항의 합 계산
   2:      N0 = 0;
   3:      N1 = 1;
   4:      Sum = 0;
   5:   
   6:      for( i = 0 ; i < num ; i++)
   7:      {
   8:          Sum = Sum + N1;
   9:          N2 = N0 + N1;
  10:          N0 = N1;
  11:          N1 = N2;
  12:      }
  13:      //결과출력
  14:      printf("피보나치 수열 %d항의 합은 %d\n", num, Sum);

 

image  <- 결과는 같아 그러나 나의 코드는 너무 길어 ㅠㅠ

 

 

C과제4

<힌트?>

   1:  int i, j;
   2:   
   3:  for(i = 0 ; i < 3 ; i++)
   4:  {
   5:      for(j = 0 ; j < 4 ; j++)
   6:      {
   7:          printf("*");
   8:      }
   9:      printf("\n");
  10:  }

image

삼각형이나 미끄럼틀을 표시하려면 상기의 그림의 좌표를 참고하여 규칙을 찾아내면 된다.



1. 잘못된 부분을 찾아서 고쳐보세요.
1) if(N < 0);
N = 0;

답: if문 다음에 세미콜론이 있어 아무 일도 하지 않고 다음 명령 수행.

   1:  if(N < 0)
   2:  {
   3:      N = 0
   4:  }

2) if(N % 5 > 0)
N = (N % 5) * 5;
printf(“N = %d”, N);

답: if다음에 중괄호가 없음.

   1:  If(N % 5 > 0)
   2:  {
   3:      N = (N % 5) * 5;
   4:      printf(“N = %d”,N);
   5:  }

3) if(N % 2 == 0)
printf(“짝수”);
else(N % 2 == 1)
printf(“홀수”);

답: else문이 아니라 elseif문으로 해야함.
또는 else문 오른쪽에 조건식을 없애야됨.

   1:  if(N % 2 == 0)
   2:  {
   3:  pinrtf(“짝수\n”); 
   4:  }
   5:  else
   6:  {
   7:  printf(“홀수\n”);
   8:  }

4) if(0 <= N <= 10)
N = 0;

답: if문에 조건식은 하나씩 따로 해야함.

   1:  if(0 <= N && N <= 10)
   2:  {
   3:  N = 0;
   4:  }

5) if(N = K)
N = M;
else
N = L;

답: if문 조건식에 대입연산자가 있어 항상 K의 값에 따라 K가 0이면 else문을 수행하고,
    K가 0이 아니면 if문의 명령문을 수행.

   1:  if(N == K)
   2:  {
   3:      N = M;
   4:  }
   5:  else
   6:  {
   7:      N = L;
   8:  }

 

6) if(N ! = M);
N = M;

답: if문의 다음에 세미콜론이 있어 아무 일도 하지 않고 항상 다음 명령을 수행함.

   1:  if(N != M)
   2:  {
   3:      N  = M;
   4:  }

 

 

2. 정수를 입력 받아 절대값을 출력하세요.
출력) 정수 입력 : –1
절대값 출력 : 1
정수 입력 : 2
절대값 출력 : 2

   1:  /******************************************************
   2:  
   3:      2. 정수를 입력 받아 절대값을 출력하세요.
   4:  
   5:      소속: 내장형하드웨어
   6:      작성자: 김수만
   7:      작성일자: 2011년 5월 18일
   8:  
   9:  ******************************************************/
  10:  #include <stdio.h>
  11:   
  12:  int main()
  13:  {
  14:      int iNum;
  15:   
  16:      printf("정수 입력: ");
  17:      scanf("%d", &iNum);
  18:      
  19:      if(0 > iNum)                //음수이면
  20:      {
  21:          iNum = iNum * -1;        //양수로 바꿈.
  22:      }
  23:      
  24:      printf("절대값 출력: %d", iNum);
  25:      
  26:      return 0;
  27:  }

 

clip_image00299999999999를 입력한 경우 범위를 초과하여 엉뚱한 값이 출력되었음.

 

 

3. 문제에 나온 그림대로 출력하세요. (중첩 for문 사용)

1)
*
   *
      *
         *
            *

   1:  /******************************************************
   2:  
   3:      3. 문제에 나온 그림대로 출력하세요. (중첩 for문 사용)
   4:      1)
   5:      *
   6:          *
   7:              *
   8:                 *
   9:                    *
  10:  
  11:  
  12:      소속: 내장형하드웨어
  13:      작성자: 김수만
  14:      작성일자: 2011년 5월 18일
  15:  
  16:  ******************************************************/
  17:  #include <stdio.h>
  18:   
  19:  int main()
  20:  {
  21:      int iRow;
  22:      int iCol;
  23:   
  24:      for(iRow = 0 ; 5 > iRow ; ++iRow)
  25:      {
  26:          for(iCol = 0 ; iRow > iCol ; ++iCol)
  27:          {
  28:              printf("  ");
  29:          }
  30:          
  31:          printf("*\n");
  32:      }
  33:          
  34:      
  35:      return 0;
  36:  }

 

clip_image002[5]

2)

                    *
               *
          *
     *
*

   1:  /******************************************************
   2:  
   3:      3. 문제에 나온 그림대로 출력하세요. (중첩 for문 사용)
   4:      2)
   5:                  *
   6:                *
   7:             *
   8:          *
   9:       *
  10:  
  11:      소속: 내장형하드웨어
  12:      작성자: 김수만
  13:      작성일자: 2011년 5월 18일
  14:  
  15:  ******************************************************/
  16:  #include <stdio.h>
  17:   
  18:  int main()
  19:  {
  20:      int iRow;
  21:      int iCol;
  22:   
  23:      for(iRow = 5 ; 0 < iRow ; --iRow)
  24:      {
  25:          for(iCol = 0 ; iRow - 1 > iCol ; ++iCol)
  26:          {
  27:              printf("  ");
  28:          }
  29:          
  30:          printf("*\n");
  31:      }
  32:          
  33:      
  34:      return 0;
  35:  }

 

clip_image002[7]

4. 출력할 줄의 개수를 입력받은 후 직삼각형을 다음과 같이 출력하세요.

줄 개수 입력 : 5

*
* *
* * *
* * * *
* * * * *

   1:  /******************************************************
   2:  
   3:      4. 출력할 줄의 개수를 입력받은 후 직삼각형을,
   4:          다음과 같이 출력하세요.
   5:          
   6:      줄 개수 입력 : 5
   7:      *
   8:      * *
   9:      * * *
  10:      * * * *
  11:      * * * * *
  12:  
  13:      소속: 내장형하드웨어
  14:      작성자: 김수만
  15:      작성일자: 2011년 5월 18일
  16:  
  17:  ******************************************************/
  18:  #include <stdio.h>
  19:   
  20:  int main()
  21:  {
  22:      int iLine;
  23:      int iRow;
  24:      int iCol;
  25:      
  26:      printf("줄 개수 입력 : ");
  27:      scanf("%d", &iLine);
  28:      
  29:      for(iRow = 0 ; iLine > iRow ; ++iRow)
  30:      {
  31:          for(iCol = 0 ; iRow + 1 > iCol ; ++iCol)
  32:          {
  33:              printf("* ");
  34:          }
  35:          
  36:          printf("\n");
  37:      }
  38:      
  39:      
  40:      return 0;
  41:  }

clip_image002[11]

 

5. 다음과 같은 형태로 문자열이 출력되는 프로그램을 작성하시오.

A
A B
A B C
A B C D
A B C D E

   1:  /******************************************************
   2:  
   3:      5. 다음과 같은 형태로 문자열?
   4:          출력되는 프로그램을 작성하시오. 
   5:      A
   6:      A    B
   7:      A    B    C
   8:      A    B    C    D
   9:      A    B    C    D    E
  10:  
  11:      소속: 내장형하드웨어
  12:      작성자: 김수만
  13:      작성일자: 2011년 5월 18일
  14:  
  15:  ******************************************************/
  16:  #include <stdio.h>
  17:   
  18:  int main()
  19:  {
  20:      int iLine = 5;
  21:      int iRow;
  22:      int iCol;
  23:      int iAlpha = 65;
  24:      
  25:      //printf("줄 개수 입력 : ");
  26:      //scanf("%d", &iLine);
  27:      
  28:      for(iRow = 0 ; iLine > iRow ; ++iRow)
  29:      {
  30:          for(iCol = 0 ; iRow + 1 > iCol ; ++iCol)
  31:          {
  32:              printf("%c\t", iAlpha + iCol);
  33:          }
  34:          
  35:          printf("\n");
  36:      }
  37:      
  38:      
  39:      return 0;
  40:  }

 

clip_image002[15]