숙제 - 조교한테 E-mail로 낼 것

1. while 반복문을 사용하여 십진수를 입력하면 그것을 ASCII 값으로 하는 문자를 출력하는 프로그램을 작성하라. (단, 끝날때는 999를 입력한다고 하자.)

2. 자료의 개수를 입력하고, 그 개수 만큼의 자료를 입력하면 합과 평균을 구하는 프로그램을 작성하라.

작성한 프로그램 파일 폴더 통째로 Zip 저장해서 일요일까지 제출
──────────────────────────────────────────────────

[while문]
- while (조건식) ....조건식이 참인 동안
     문장                 문장 반복 실행

- white (조건식){
     문장
     문장
     ...
     }

- 예) 음수 또는 0이 입력될 때까지의 입력된 정수의 합을 계산
   sum = 0;                          /* 합의 초기 값 */
   scanf("%d",&number);      /* 정수 입력 */
   while (number > 0){
   sum = sum + number;
   scanf("%d",&number);      /* 다시 정수 입력 */
   }

[반복 제어 변수] ... 반복문에서 루프를 도는 횟수를 제어하겠다.
- 예) 1부터 10까지의 정수의 합 계산
   sum = 1 + 2 + 3 + ... + 10
     ↓
   sum = 0;
   sum = sum + 1;
   sum = sum + 2;              i는 1~10에 대해서 다음 문장 반복수행
    ...                               sum = sum + i
   sum = sum + 10;
     ↓                               변수 i가 반복제어변수
   sum = 0;                        합의 초기값은 0
   i = 1;                             초기화
   while (i <= 10){              검사
   sum = sum + i;
   i = i + 1;                         갱신
   }                                  ※ 반복제어변수
                                           - 반복할 때마다 값이 변화
                                           - 변수 값에 따라서 반복수행 여부결정

예) 1~20까지의 합 구하기

#include <stdio.h>

int main(void)
{
 int sum, i;
 sum = 0;
 i = 1;

 while (i<=20){
  sum = sum + i;
  i = i + 1;
 }

 printf("%d",sum);
 return 0;
}

== sum ==
210
=========

예) 실수 r의 n제곱을 계산 (n은 정수)
  - 곱의 초기값 = 1 (곱셈 항등원)
  - 반복제어: n을 초기값에서 시작하여 반복할 때마다 1씩 감소시켜서 
                  n이 0이 될 때까지 반복하면 n의 초기값 횟수만큼 반복 수행

[for문]
- for문
  for(수식1; 수식2; 수식3)             .... 수식2가 참인동안 반복
       문장
- 반복제어변수를 사용하는 경우에 적합
  수식1: 초기화
  수식2: 조건식
  수식3: 갱신
- 예) N번 반복 실행
  1. for(i=1;i<=N;i=i+1)                  .... 1부터 N까지
      문장
  2. for(i=0; i<N; i=i+1)                 .... 0부터 N-1까지
      문장

- 예) 1부터 10까지의 정수의 합 계산
  for (i=1; i<=10; i=i+1)
       sum = sum + i;

- 예) 

수열 an = 2an-1 – 1 (a1=3) a10 구하기

   a = 3;
   for (i=2; i<=10; i=i+1)
        a = 2*a - 1;

- 예)
 

Fibonacci수열 Fn = Fn-2 + Fn-1 (F1=0, F2=1) F20 구하기

    a = 0; b = 1;

사용자 삽입 이미지

    for (i=3; i <=20; i=i+1){
        c = a + b;
        a = b;
        b = c;
    }


==== 프로그래밍 ====
#include <stdio.h>

int main(void)
{
 int a, b, c, d, i;
 a = 0; b= 1;

 printf("항 번호를 입력하시오: ");
 scanf("%d",&d);

 for(i=3; i<=d; i=i+1){
  c = a + b;
  a = b;
  b = c;
 }
 
 printf("결과값은 %d 이다\n",c);

 return 0;
}
=== run ===
항 번호를 입력하시오: 20
결과값은 4101 이다
===========


[무한 루프와 공문]
- 무한루프
   반복조건이 항상 참인 반복문

   for (  ;  ;  )             .... 수식2가 생략되면 참(true)으로 간주함
   문장

   while(1)                 .... 조건식 1은 참(true)이다
   문장

   무한 루프인 반복문은 내부에서 반복문을 종료할 수 있어야 함
    -> break

- 공문(null statement): ; 만으로 이루어진 아무 동작도 하지 않는 문장
   while(조건식);

   while(조건식)      -> 무한루프 발생 가능
   ;

[반복문 설계]
- 반복 자료 입력을 종료 시키는 방법
  입력 자료 수를 먼저 입력하여 이 횟수 만큼 반봅 입력
  정상적으로 사용되지 않는 자료(보초)를 마지막에 잆력
  입력 함수의 파일 끝(EOF) 반환 기능 이용 (Ctrl-Z 또는 Ctrl-D 입력)

- EOF를 만날 때 까지 정수를 입력하여 평균 계산

사용자 삽입 이미지

== 프로그램 ==
#include <stdio.h>

int main(void)
{
 int count, sum, number;

 count = 0;
 sum = 0;

 while(scanf("%d",&number) != EOF){
  sum = sum + number;
  count = count + 1;
 }
 
 printf("The number of inputs = %d\n", count);
 
 if(count >0)
  printf("average = %f\n", (double)sum/count);
 
 return 0;
}
== run ==
1(enter)
2(enter)
3(enter)
4(enter)
5(enter)
^Z (ctrl+Z)
The number of inputs = 5
average = 3.000000
=========

예) 네제곱표 만들기
 #include <stdio.h>
  main()
  {
      int a;
      for(a=1; a<=13; a=a+2)
           printf("%d %d \n", a, a*a*a*a);
   }
문제점: 각 열이 나란하게 출력되지 않음 -> 해결책: 출력의 각 필드 폭(자릿수)을 일정하게 함


[잘못된 입력 처리하기]
- scanf()함수의 반환 값
   scanf() 함수는 성공적으로 입력된 변수의 개수를 반환함

- 정수가 아닌 입력에 대해서 반복 종료 (프로그램 종료)
  while ( scanf("%d", &number) = 1){
  sum = sum + number;
  count = count + 1;
  }
  반복문에서 EOF를 1로 바꾸면 파일 끝뿐만 아니라 정수가 아닌 입력에 대해서도 반복을 종료함

- 정수가 아닌 입력을 무시하고 계속 입력
  scanf("%*s")를 사용
하면 잘못된 입력을 무시하고 다음 자료 입력 (프로그램 계속 돈다)
   while ( (n =scanf("%d",&number) ) != EOF){
   if ( n == 1){
      sum = sum + number;
      count = count + 1;
   } else
      scanf("%*s);
   }


[형식지정 출력]
- 필드 폭과 정렬: 출력 공간의 크기 (우정렬, 좌정렬, 필드폭보다 크면 글자가 잘림)

- printf 함수의 형식지정자

사용자 삽입 이미지


== 화씨 섭씨 계산 프로그램 ==

#include <stdio.h>

int main(void)
{
 int f;
 float c;

 printf("%4s %6s\n", "화씨", "섭씨");
 
 for(f=0; f<=100; f=f+5){
  c=(f-32.0)*5.0/9.0;
  printf("%4d %6.1f\n", f, c);
 }

 return 0;
}
== run ==

사용자 삽입 이미지

========

[증감 연산자]
- 증감 연산자
   증가 연산자: i++        <- i = i + 1
   감소 연산자: i--        <- i = i - 1

- 증감 연산 수식의 값
   사전증감: ++i, --i는 먼저 증감 -> 증감이후의 값을 사용
   사후증감: i++, i--는 나중에 증감 -> 증감이전의 값을 사용
   예) i = 5;
        a = ++i;      ---------> i++; a = i;
        결과: i=6, a=6

        i = 5;
        a = 1++       ---------> a=i; i++;
        결과: i=6, a=5


[복합 치환 연산자]
- 복합 치환 연산자
   var op = 수식 (변수 연산자 = 수식)          <- var = var op 수식
     op: 산술연산자(+ - * / %), 비트연산자(11장)

- 예)  치환연산자 사용                      복합치환연산자 사용
         a = a + 2                                a += 2
         count = count - 1                    count -= 1
         sum = sum + j                         sum += j
         d = d / 12                               d /= 12
         n = n * (k+1)                           n *= k+1      .... 괄호 불필요

예) 다음과 같은 수열의 20항까지 출력, 20항까지의 합 출력
      1  2  4  7  11  16  ...

사용자 삽입 이미지

숙제 - 조교한테 E-mail로 낼 것

1. while 반복문을 사용하여 십진수를 입력하면 그것을 ASCII 값으로 하는 문자를 출력하는 프로그램을 작성하라. (단, 끝날때는 999를 입력한다고 하자.)

2. 자료의 개수를 입력하고, 그 개수 만큼의 자료를 입력하면 합과 평균을 구하는 프로그램을 작성하라.

작성한 프로그램 파일 폴더 통째로 Zip 저장해서 일요일까지 제출

[do - while문]
- do=while문
  do
     문장                   ..... 조건에 관계없이 문장이 적어도 한번은 실행됨
  while (조건식)
;       ..... 세미콜론(;)으로 끝남에 주의

  do {
      문장;
      문장;
      ...
      } while (조건식);

- 예) 정상적인 메뉴 입력이 들어올 때까지 반복 입력
   do {
        printf("menu select (1-5): ");    /* 입력 안내문 */
        scanf("%d", &menu);              /* 문자 입력 */
   } while (menu < 1 }} menu > 5);
   printf("you choose menu %d\n", menu);


[중첩된 반복문] .. 반복문이 여러개 중첩
- 예) 다음과 같은 구구단 표 출력
  for (a = 2; a <= 9; a++) {
      for (b = 1; b <= 9; b++)
           printf("%dΧ%d = %2d   ", a, b, a*b);
      printf("\n");
  }

[p125 디버깅]
디버깅: error는 없는데 값이 이상할 경우, 어느 부분에서 잘못 되었는지 딱 집어서 확인해볼 수 있는 툴
=> 선언했던 변수가 어떤 값을 갖는지를 확인

== 프로그램 ==
#include <stdio.h>

void main()
{
 int a, inc, i, sum;
 
 sum = 0; a = 1; inc = 1;

 for(i=0; i <= 20; i++)
 {
  printf("%d   ", a);
  sum += a;
  a += inc;
  inc++;
 }

 printf("\n 수열 합 = %d\n", sum);
}

디버깅 할때에는 에러가 없어야 된다.

해당줄에 손을 클릭하면 왼쪽에 이 생긴다.

F5키를 누르면 디버그 모드로 들어가고,
F10키를 누르면 한 줄씩 내려가고,
왼쪽 하단 창을 내려보면 값을 볼 수 있다.
오른쪽 하단 창에 name에 변수를 넣으면 해당 변수의 값을 볼 수 있다.

뒤에 cmd창에 실행 값이 실시간으로 등장한다.

by Joe & Soohy 2007. 1. 2. 09:57