처음으로 배우는 C 프로그래밍 제2부 기초 제5장 반복문
제 1 절 while 문 while 문의 일반적인 형태 while 문의 예 while (expression) statement; 먼저 수식을 검사하여 거짓이면 while 문 탈출, 참이면 statement를 실행하고 다시 수식 검사, 반복 while 문의 예 count = 1; /* 수식에 쓰이는 카운트 변수 초기화 */ while (count <= 10) { /* 카운트 변수 검사 */ printf(“%d ”, count); count++; /* 수식에 쓰이는 카운트 변수 변경 */ }
제 2 절 while 반복문 내의 scanf() 수를 입력 받아 그 수를 출력하는 예제 프로그램 count = 1; /* count를 1로 초기화하지 않으면? */ while (count <= 4) { printf(“\nEnter a number: “); scanf(“%f”, &num); printf(“The number entered is %f”, num); ++count; /* count를 1증가 시키지 않으면? */ }
제 2 절 while 반복문 내의 scanf() 입력 받은 수들의 합과 평균을 구하는 예제 프로그램 count = 1; total = 0; /* total을 0으로 초기화 시키지 않으면? */ while (count <= 4) { printf(“\nEnter a number: “); scanf(“%f”, &num); total = total + num; ++count; } --count; /* 왜 count을 1 감소시키는가? */ average = total / count; printf(“\nThe total is %f, average is %f”, total, average);
제 2 절 while 반복문 내의 scanf() 자료 끝 표시(sentinels) 입력될 자료의 개수를 알 수 없을 때 자료 입력의 끝을 나타내는 특수 데이터 입력되는 자료들 값의 범위와 충돌하지 않도록 선택 성적 입력 시, 성적은 0 부터 100까지 이므로 이 범위 밖의 값을 선택 C언어에서 제공되는 EOF(End Of File) 운영체제마다 틀리지만 어떤 문자에도 사용되지 않는 코드 값이 할당, 유닉스: Control-D, 도스: Control-Z 입력 시, 이런 코드 조합을 발견하면 자신만의 EOF로 변환 EOF 상수는 stdio.h에 정의
제 2 절 while 반복문 내의 scanf() break 문과 continue 문 printf(“Enter a grade: “); while (scanf(“%f”, &grade) != EOF) { total = total + grade; } scanf입력 시 Control-D(유닉스)나 Control-Z(도스)를 입력하면 scanf는 EOF를 반환한다 break 문과 continue 문 break문은 switch, while, for, do-while 문으로부터 탈출, 비정상적인 조건이 검출되었을 때 반복문으로부터 벗어나는 데 유용
제 2 절 while 반복문 내의 scanf() while (…) { ... if (num > 76) break; } continue 문은 while, do-while, for 등의 반복문에만 적용, 반복문의 다음 반복을 즉시 시작, 반복문 내에서 처리되어서는 안될 데이터를 건너 뛰는데 유용 if (grade < 0 || grade > 100) continue;
제 2 절 while 반복문 내의 scanf() 널 문장(null statement) 세미콜론만으로 이루어진 문장 ; 문장이 요구되고 아무런 수행도 일어나지 않는 곳에 사용되는 아무 일도 아지 않는 문장 for 문과 널 문장을 이용한 시간 지연 for (i = 0; i <= 1000; i++);
제 3 절 for 문 for 문의 일반적인 형태 for (initializing list; expression; altering list) statement; for 문 내의 각각의 항목은 생략될 수 있지만 세미콜론은 필수 초기화 리스트는 한번만 수행, 나머지 부분은 while 문과 동일 동등한 while 구조 initializing list; while (expression) { statement; altering list; }
제 3 절 for 문 for 문, 그리고 그와 동등한 while 문 for 문의 구성 요소가 일부 생략된 for 문 for (count = 1; count <= 100; ++count) printf(“%d “, count); 동등한 while 문 count = 1; while (count <= 100) { printf(“%d “, count); ++count; } for 문의 구성 요소가 일부 생략된 for 문 for(; count <= 100; ) 유효한 for 문
제 3 절 for 문 생략된 초기화 리스트나 변경 리스트는 프로그래머가 적당한 위치에 제공해야만 함 count = 2; /* 초기화 리스트 */ for (; count <= 20; count = count + 2) 초기화 리스트, 변경 리스트가 생략된 for 문 for (; count <= 20; ) { printf(“%d “, count); count = count + 2; /* 변경 리스트 */ } 수식을 생략하면 무한 루프에 빠질 수 있음
제 3 절 for 문 열림 중괄호의 위치 첫번째 스타일 두번째 스타일: 많은 프로그래머들이 사용 for (expression) { } 중괄호 쌍을 찾기 쉬움 두번째 스타일: 많은 프로그래머들이 사용 for (expression) { 라인 수를 줄일 수 있음 어느 것을 사용해도 무방하나 섞어 쓰지는 않는다
제 3 절 for 문 한 문장으로 표현되는 for 문 for 반복문 내의 scanf() for (count = 2; count <= 20; printf(“%d “, count), count = count + 2); 초기화 리스트나 변경 리스트에 두개 이상의 요소가 쓰일 경우 콤마(,)로 구분 for 반복문 내의 scanf() total = 0.0; for (count = 0; count < 5; ++count) { printf(“\nEnter a number: “); scanf(“%f”, &num); total = total + num; }
제 3 절 for 문 중첩 반복문(nested loop) 또 다른 반복문을 포함하는 반복문 for (i = 1; i <= 5; ++i) { /* 바깥 반복문 */ printf(“\ni is now %d\n”, i); for (j = 1; j <= 4; ++j) /* 안쪽 반복문 */ printf(“ j = %d”, j); } printf(“\ni is now %d\n”, i); 문장은 총 5번 수행 printf(“ j = %d”, j); 문장은 총 20(5X4)번 수행
제 3 절 for 문 for 문, while 문 어떤 것을 사용할 것인가? C언어에서 for 문과 while 문 동등하기 때문에 서로 바꿔 쓸 수 있다 for 문은 주로 고정 카운트 반복에 쓰이고(반복 횟수가 고정된 경우) while 문은 주로 변수 조건 반복에 쓰인다(반복 횟수가 가변적인 경우)
제 4 절 do-while 문 do-while 문의 일반적인 형태 유효성 검사 do statement; while (expression); 수식 평가를 반복문의 끝에서 수행 statement는 적어도 한번은 수행 do-while 문은 동등한 while 문이나 for 문으로 다시 작성 가능 유효성 검사 do-while 문은 사용자 입력을 걸러내고 데이터 유효성 검사를 제공하는 데 유용
제 4 절 do-while 문 do-while 문을 이용한 유효성 검사의 예 do { printf(“\nEnter an identification number(1000<=id<=1999): “); scanf(“%f”, &id_num); } while (id_num < 1000 || id_num > 1999); 1000<=id<=1999인 id가 입력될 때 까지 계속 반복된다.
제 5 절 일반적인 프로그래밍 오류 수식 내에서 동등 연산자, ==, 대신 대입 연산자, =, 를 부주의하게 사용하는 것 부동 소수점과 배정밀도 수를 검사할 때 동등 연산자를 사용하는 것 for 문의 괄호의 끝에 세미콜론을 찍는 것 for (count = 1; count <= 10; ++count); sum += count; for 문 내에 분리자 세미콜론 대신 콤마를 사용하는 것 do-while 문에서 while뒤에 세미콜론을 생략하는 것
제 6 절 요약 while, for, do-while 문은 반복문을 생성한다. 수식의 값에 기초하여 계속 반복을 행하거나 탈출한다. while 문은 제일 먼저 수식을 검사한다. 수식에 사용되는 변수는 while 문 전에 나타나야 하며 while 문 내에서 그 변수를 변경하는 문장이 있어야한다 for 문은 그 반복 횟수가 정해진 경우 유용하다. 초기화, 검사 수식, 검사 수식에 영향을 주는 수식들이 for 문 내에 모두 포함될 수 있다. do-while 문은 반복문의 끝에서 수식을 검사한다. 따라서 몸체는 적어도 한 번 이상 수행된다.
제 7 절 문자 지향 그래픽 문자 지향 그래픽: C가 인식하는 영숫자나 문자를 이용하여 그림을 표현하는 것 동시 문자 출력 display 함수 의사코드 인자로써 반복횟수와 출력할 문자 심볼을 받는다 for 반복횟수만큼 문자를 출력한다 for 끝
제 7 절 문자 지향 그래픽 display() 실제 C 함수 삼각형 모양을 출력하는 의사코드 void display(int howmany, char symbol) { int i; for ( i = 1; i <= howmany; i++) printf(“%c”, symbol); } 삼각형 모양을 출력하는 의사코드 for line number equal 1 to 5 display(6 - line number, ‘ ‘) display(2 * line number - 1, ‘*’) end for