지식
인터넷 상의 푹 퍼진 정보들을 가지런히 모아 말끔 상쾌 통쾌한 지식을 남겨주세요. ^^
제어문
실행의 흐름을 제어
원칙은 순차적 실행
제어문에 의해 달라짐
조건결정 : if, if else, switch
순환(반복) : for, while, do while
분기처리 : break, continue, goto, return
조건문
조건문 if : 어떠한 조건을 만족하면 그에 해당하는 일이
처리되는 문장을 조건문
키워드 else
필요하면 else 이용
조건문 if에서 키워드 else를 사용하여 조건 표현식이 거짓인 경우, else 이후의 문장을 실행하는 구문을 구성
조건문과 조건 연산자
if문은 간단히 조건 연산자를 이용한 문장으로 변환이 가능
if(x>y)
max = x;
else
max = y;
max = ( x > y ) ? x : y;
if(x>y)
min = y;
else
min = x;
min = ( x > y ) ? y : x;
else 주의
중첩된 if의 else
문법적으로 else는 같은 블록 내에서 else가 없는 상위의 가장 가까운 if문의 else로 해석한다. 그러므로 프로그램의 혼란을 방지하려면 블록({})을 이용하는 것이 바람직하다.
else if
중첩된 if문에서 else이후에 if문을 실행하는 구문을 이용
switch
중첩된 if문에서 조건식이 정수형의 등호식이라면..
연산식 expression 값이 value1 이면 이 문장을 실행.
문장 break를 만나면 switch문을 종료한다.
만일 이 break가 없다면 value2 값과 상관없이
아래 문장 statement2를 실행한다.
표현식과 같은 expression이 하나도 없으면
default하부의 문장을 실행한다.
switch 이용 주의
키워드
switch 문에서 switch, case, break, defaul는 키워드이며,
expression과 value는 반드시 정수나 정수 수식이어야 함.
또한 case 다음의 value 값은 중복되어서는 안됨.
switch 문의 정확한 실행 순서는
switch 문의 표현식을 평가
위 표현식에서 계산된 값과 일치하는 상수 값을 갖는 case의 값을 위에서부터 검색
일치된 case 값을 ask나면 case 내부의 문장을 실행
break를 만나면 switch 문을 종료, 또는 switch 몸체의 마지막
문장을 수행하면 switch 문을 종료
일치된 case 값을 만나지 못하여 default를 만나면 default 내부의 문장을 실행
break 역할
중요한 break
switch 문에서 break 문을 만나면 무조건 switch 문을 종료
그러나 switch 문의 case 문 내부에 break 문이 없다면
일치하는 case 문을 실행하고,
계속해서 break 문을 만나기 전까지 무조건 다음 case 문 내부의 문장을 실행
반복문
제어문 : 프로그램의 실행 순서는 “위에서 아래로 한 문장씩” 순차적으로 실행
반복문 : 프로그램에서는 일정한 규칙의 처리를 반복적으로 처리하는 모듈이 자주 필요
(이를 위한 구문이 반복문)
|
반복문의 종류 |
반복의 몸체가 블록으로 구성된 반복 구문 |
반복의 몸체가 하나의 문장으로 구성된 반복 구문 |
특징 |
|
for |
for(초기화; 조건검사; 증감연산) { for문 몸체(body); } |
for(초기화; 조건검사; 증감연산) for문 몸체(body); |
일정한 반복 횟수를 이용하는 반복문에 적합 |
|
while |
while(조건검사) { while문 몸체(body); } |
while(조건검사) while문 몸체(body); |
구문이 간단하며, 검사부분이 처음에 있음. |
|
do while |
do { do while문 몸체(body); } while (조건검사); |
do do while문 몸체(body); while(조건검사); |
반복 몸체를 최소한 한 번은 실행하며, 검사부분이 뒤에 있음. |
반복문 for 구조
for 다음에 괄호 () 구성
초기화(initialization), 조건검사(conditional expression), 증감연산(increment)의 세 부분으로 구성되고 이를 세미콜론(;)으로 구분
for 문의 실행순서
초기화 : 한번 실행
반복 : 조건검사, 몸체, 증감연산
1 초기화 → 2 조건검사 → 3 몸체 → 4 증감연산 → 5 2로 돌아감 → 6 다음문장
반복문의 몸체가 실행되고 다음 반복을 위한 조건검사 이전에 증감연산이 실행된다는 것을 잊지 말자.
for 문이 반복되는 과정
1에서 10까지의 합을 구하는 for 문을 작성.
sum = 1+2+3+4+5+6+7+8+9+10;
sum = 0;
for (i=1;i<=10;i++)
{
sum +=i; //sum = sum + i;
}
반복문 while 문
while 문 구조
조건검사 부분인 expression을 while 다음에 괄호로 구성
while 문 실행순서
조건문인 expression 을 검사하여 0이 아니면(참) 반복문의 몸체에 해당되는 문장이나 블록을 실행
몸체를 실행하면 다시 조건검사를 조사하여 1의 과정을 다시 실행
조건검사가 거짓이면 while 문장을 종료
|
fact = 1; i = 1; while (i <= input) { fact *= i; printf("%d! = %d\n", I, fact); i++; } |
for (fact=1, i=1; i<= input; i++) { fact *= i; printf("%d! = %d\n", i, fact); }
|
do while
문장 구조
do while 문은 while 문과 유사하나 검사부분이 몸체의 마지막에 있는 것이 차이
do while 문은 족너검사를 나주에 하는 반복문에 적당
몸체 부분에 특별한 구문이 없는 경우, 반복문 do while의 몸체는 적어도 한번은 실행
do
{
printf("다음 연산의 결과를 입력해 주세요.\n");
printf("%d %% %d = ", m, n);
scanf("%d", &result);
} while ( !(result ==m%n));
printf("정답입니다.\n");
return 0;
중첩된 반복문
for(i=1; i<=5; i++)
{
for (j=1; j<=5; j++)
printf("%d", j);
printf("\n");
}
콤마 연산자의 이용
초기화와 증감부분에 여러 개의 문장 기술
int sum = 0, i;
for (i=1; i<=10; i++)
sum += I,
위와 같은 1부터 10까지의 합을 구하는 전형적인 소스는 다음과 같이 기술할 수 있다. 일반적으로 반복문 for 문의 초기화 부분에는 중요한 제어 변수 초기화에 대한 여러 문장을 콤마 연산자를 이용하여 나열하고, 증감부분에는 증감 연산을 위한 여러 문장을 콤마 연산자를 이용하여 나열한다.
int sum, i;
for (sum = 0, i = 1; i <= 10; sum+= i, i++);
break 반복 종료
세 종류 반복문에서 무조건 반복문을 종료하려면 break 문을 이용
반복문에서 break의 역할은 반복을 종료하고 반복문 다음 문장으로 실행 흐름을 바꾸는 역할
result = 1;
i = 2;
while ( i <= n/2)
{
if ( n % i == 0)
{ result = 0; break; }
i++;
}
continue 반복 계속
continue 문은 반복문을 완전히 종료하는 것이 아니라, continue 문이 있는 몸체의 continue 문 아래 부분은 실행되지 않고, 다음 반복을 계속하는 문장
for ( i = 1; i <= 10; I++)
{
if(i % 2 ==0)
continue;
printf("%d", i);
}
무한 반복
for 문에서 조건검사 부분이 없다면?
조건검사를 무시하고 계속적으로 반복문을 수행
for( ; ; ), while (1), while ( )
함수는 원하는 특정한 작업을 수행하는 독립된 프로그램 단위
결국 C프로그램이란 함수의 집합
하나 이상의 여러 함수로 구성
main()도 이름이 이미 정의된 특수한 하나의 함수로 프로그램의 실행이 시작되는 함수
프로그램 실행
C프로그램은 main() 함수의 첫 줄에서 시작하여 마지막 중를 마지막으로 실행한 후 종료
함수를 만들어 사용하려면 함수선언, 함수호출, 함수정의가 필요
하나의 응용 프로그램은 하나의 메인 함수와 여러 개의 다름 함수로 구성되며, 필요에 따라 여러 소스 파일에 나누어 코딩할 수 있음
응용프로그램의 구성
#include <stdio.h>
int add(int a, int b);
int subtrack(int a, int b);
…
int main(void)
{
…
sum = add(20, 30);
diff = subtract(10, 20);
…
}
int subtract(int a, int b)
{ ... }
함수의 구분
시스템 정의 함수와 사용자 정의 함수로 구분
시스템 정의 함수
라이브러리 함수는 이미 개발도구에 구현되어 있는 프로그램 부품(component) 함수
한 예로 출력함수 printf()
사용자 함수
사용자 프로그래머가 필요에 의하여 직접 정의하여 이용하는 함수
개발자가 직접 개발하는 함수
함수 장점
함수는 문제 해결의 방법
주어진 문제를 작은 문제, 즉 여러 함수로 나누어 생각할 수 있으므로 함수를 만드는 것은 문제 해결의 하나의 방법
함수 이용의 장점
함수로 구성된 프로그램은 함수 단위로 구성되어 있어, 읽기 쉽고, 이해하기 쉬움
이미 정의된 함수는 여러 번 호출이 가능하므로 소스의 중복을 최소화하여 프로그램의 양을 줄이는 효과
Structured Program
적절한 함수로 잘 구성된 프로그램을 모듈화 프로그램, 구조화된 프로그램
한 번 잘 구현된 함수는 라이브러리 함수와 같이 여러 프로그램에서 손쉽게 이용이 가능
이러한 함수 중심의 구조화 프로그램 방식을 절차적 프로그래밍 방식
함수가 있는 프로그램 구조
요소
함수 선언인 함수원형 (Prototype)
함수원형은 함수호출(function call)이 있기 전에 먼저 있어야 한다.
함수원형은 소스파일과 같은 파일 또는 헤더파일에 있을 수도 있음
메인 프로그램
그리고 함수의 정의(구현)
함수의 정의
함수의 정의(구현)는 함수의 머리와 몸체로 구성
함수의 머리는 함수의 반환값 자료유형과 함수의 이름, 그리고 괄호 사이에 인자 목록으로 구성
함수정의에 이용되는 자료유형
모든 기본 자료 유형은 반환 값이나 인자의 자료유형으로 이용 가능
char, short, int, long, float, double 등이 가능
void
반환 값이 없는 경우에는 void라는 키워드를 이용
함수의 매개변수가 하나도 없는 경우에는 void라는 키워드를 인자 목록에 기술하여 이용
반환 값을 아예 생략
반환 값이 int형이라고 가정
반환 값을 생략하는 프로그램 코딩 방법은 적절하지 못한 방법으로, 반환 값을 반드시 기술하도록
void printmyname (void)
{ printf("내 이름은 홍길동입니다.”); }
return 문
반환 값 역할
함수 인자가 함수를 호출하는 부분에서 함수를 호출하는 영역으로 자료를 전달하는데 주로 사용
함수 인자는 여러 개를 사용할 수 있는 반환 값은 하나만 이용
return 문
return 문장은 반환 값을 전달하는 목적과 함께 함수의 작업 종료도 의미
반환 값을 전달 할 때 return 문장을 이용하며, 반환 값이 없는 함수는 return 문장 뒤에 반환 값을 기술하지 않음
int sum(int a, int b);
{
return (a+b);
}
함수원형 개념과 구조
함수 원형
함수를 사용하기 이전에 함수의 머리 부분을 기술하는 단계
함수 우너형의 기술 방법이 다음 두 가지 방법으로 가능
자료유형 목록을 변수 선언 하듯이 변수유형과 변수이름이 함께 나오는 방식
함수 반환값 자료유형이 나오고 빈 공간을 띄운 후 적당한 함수 이름이 나타냄
괄호 () 안에는 인자 목록이 기술되고, 마지막으로 세미콜론으로 종료
함수 호출
정의된 함수의 이용
함수의 이름에 적당한 인자를 이용하여 기술
인자의 유형과 순서에 맞는 변수나 상수를 기술
인자를 잘못 기술하면 문제가 발생
즉 인자의 순서와 개수, 그리고 자료유형이 일치해야
예로 다음과 같은 함수호출은 잘못 result = add(8);
함수 매개변수
함수 인자의 필요
함수를 호출하는 부분에서 함수의 내부로 값을 전달하기 위해 사용
즉 매개변수는 함수 내부로 입력 값을 전달하기 위한 벙법
함수의 매개변수는 필요한 경우 이용
필요 없으면 함수의 매개변수 부분에는 키워드 void를 기술하거나 아무것도 기술하지 않음.
함수 반환 값
역할
함수를 호출하는 부분에서 함수가 작업을 수행한 후, 다시 함수를 호출한 영역으로 결과 값을 전달할 때는 반호나 값을 이용
제약
함수 인자는 여러 개를 사용할 수 있으나 반환 값은 하나만 이용할 수 있다는 제약
형식인자와 실인자
형식인자 : 함수 정의 구문에서 기술되는 인자를 형식인자(formal parameters)
실인자 : 함수를 호출할 때 기술되는 인자를 실인자(real parameters)
실인자를 기술할 때는 함수의 헤더에 정의된 자료유형과 일치하도록 해야 함
int main(void)
{
int a=3, b=4;
…
printf("%3d + %3d = %4d\n", a, b, sum(a, b));
return 0;
}
int sum(int a, int b){
return (a+b);
}
재귀 함수
재귀 : 함수는 함수 구현에서 자기 자신의 함수를 호출
특징
구현하려는 알고리즘 자체가 재귀적 특성을 갖는다면, 재귀 함수를 이용하면 쉽게 구현이 가능
재귀 함수는 계속적인 함수의 호출로 인하여 시간과 메모리 공간의 효율성이 떨어지는 단점
일반적으로 재귀 함수는 반복문을 이용한 함수로 변환이 가능
토맛토
