글
숙제 - 조교한테 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;
- 예)
a = 3;
for (i=2; i<=10; i=i+1)
a = 2*a - 1;
- 예)
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창에 실행 값이 실시간으로 등장한다.