쉽게 풀어쓴 C언어 Express(이승재, 이기정)-3주차

Jaylee
Quantum Ant
Published in
15 min readJul 25, 2019

목차

제어문

if 문

if-else 문

중첩 if 문

연속적인 if 문

switch 문

goto 문

반복문

while

if와 while의 차이

do…while 문

for 문

중첩반복문

break 문

goto 문의 이용

continue 문

내용

제어문

제어문은 문장이 실행되는 순서를 제어하는 문장이다.

-제어구조(Fig1)

순차구조: 명령들이 순차적으로 실행되는 구조

선택구조: 둘 중의 하나의 명령을 선택하여 실행되는 구조

반복구조: 동일한 명령이 반복되면서 실행되는 구조

Fig1. 제어구조의 순서도

if문(Fig2)

if문은 조건에 따라 프로그램의 흐름을 바꿀 때 사용한다. if 문은 주어진 조건문을 계산하여 그 결과값이 참으로 계산되면 실행문장을 실행하고 조건식이 거짓으로 계산되면 문장을 실행하지 않는다.

Fig2. if문의 순서도

-형식

if(조건문) — -①

실행문장; — — ②

① 조건문은 수식으로 나타낸다. 조건문을 나타낼 때 4장에서 배운 논리연산자, 관계연산자를 사용할 수 있다.

② 조건문이 참이면 실행되는 문장. 1개의 문장만 들어갈 수 있다.

-복합문(블록)

블록은 여러 개의 문장을 실행할 때 사용한다. 2개 이상의 실행문장을 { }로 감싸면 블록을 만들 수 있다. 하나의 문장을 { }로 감싸도 블록이 만들어진다. 블록은 하나의 문장처럼 취급한다.

-예제

입력받은 점수를 판별하여 결과을 출력하는 프로그램

#define _CRT_SECURE_NO_WARNINGS //scanf 함수의 보안오류 방지

#include <stdio.h>

int main() {

int score;

printf(“점수를 입력하시오 : “);

scanf(“%d”, &score);

if (score >= 90) {

printf(“합격입니다.\n”);

printf(“장학금 수령 대상입니다.\n”);

}

}

if-else문(Fig3)

조건식을 계산하여 조건식이 참이면 if이후의 문장을 실행하고 조건식이 거짓이면 else 이후의 문장을 실행한다. 이때 조건이 참일 때 실행되는 문장을 then 절이라 하고 조건이 참이 아닐 때 실행하는 문장을 else 절이라 한다.

Fig3. if와 else의 순서도

-형식

if(조건문) — -①

실행문장1; — — ②

else — — ③

실행문장2; — — ④

③ 조건이 거짓일 때 else 이후의 문장이 실행된다.

④ else 절의 실행되는 문장, 블록으로 2개 이상의 문장을 1개로 만들어 넣을 수 있다.

-예제

정수를 입력받아 홀수와 짝수를 출력하는 프로그램

#define _CRT_SECURE_NO_WARNINGS //scanf 함수의 보안오류 방지

#include <stdio.h>

int main() {

int number;

printf(“정수를 입력하시오 : “);

scanf(“%d”, &number);

if (number%2==0) {

printf(“입력된 정수는 짝수입니다.\n”);

}

else{

printf(“입력된 정수는 홀수입니다.\n”);

}

}

중첩 if문(Fig4)

if문도 1개의 문장이다. 즉 if(조건식) 실행문장; 까지가 1개의 문장이 된다 따라서 if문 안에 다른 if문이 들어갈 수도 있다. 같은 원리로 if문 안에 if와 else가 동시에 들어갈 수도 있다. 다만 컴파일러의 관점에서 본다면 else가 어떤 if와 매칭되는 지 혼동할 수 있다.

Fig4. else와 if와의 관계가 헷갈리는 경우

이를 방지하기 위해서 else절은 무조건 제일 가까운 if문과 매치된다. 혹은 { }을 이용해 if와 else와의 관계(Fig5)를 확실히 할 수 있다.

Fig5. else와 if의 매칭

연속적인 if문

조건에 따라서 다중으로 분기되는 if 문을 만들기 위해서는 else if문을 사용해야 한다.

-형식

if(조건식1)

실행문장1;

else if(조건식2)

실행문장2;

else if(조건식3)

실행문장3;

else

실행문장4;

만일 이 중 1개의 조건식이 참이면 뒤의 문장(블록)이 실행되고 더 이상의 비교는 이루어지지 않는다.

-예제

점수에 따른 학점을 출력하는 프로그램

#define _CRT_SECURE_NO_WARNINGS //scanf 함수의 보안오류 방지

#include <stdio.h>

int main() {

int score;

printf(“정수를 입력하시오 : “);

scanf(“%d”, &score);

if(score>=90)

printf(“학점 A\n”);

else if(score>=80)

printf(“학점 B\n”);

else if(score>=70)

printf(“학점 C\n”);

else if(score>=60)

printf(“학점 D\n”);

else

printf(“학점 F\n”);

}

switch문(Fig6)

if문은 조건식의 값이 참이냐 거짓이냐에 따라서 실행문장이 달라진다. 하지만 c언어에선 제어식의 값에 따라서 여러 경로중 1개를 선택할 수 있는 switch문을 제공한다. switch문에서는 제어식을 계산하여 나오는 정수값과 일치하는 case절의 문장을 실행한다. 만약 case절에서 일치하는 정수값을 찾지 못하면 default문을 실행한다.

Fig6. switch문의 순서도

-형식

switch(제어식) — — ①

{

case 값1: — — ②

문장1; — — ③

break; — — ④

case 값2:

문장2;

break;

case 값3:

문장3;

break;

.

.

.

default: — — ⑤

문장;

break;

}

① 제어식에서는 반드시 정수 값이 나와야 한다. 또한 상수이어야만 한다.

② case절의 값 또한 정수만 사용해야한다. 변수, 변수가 포함된 수식, 실수, 문자열은 사용할 수 없다. 하지만 문자 1개는 사용할 수 있다. 문자는 아스키코드로 표현되고 아스키코드는 정수이므로 사용가능하다.

③ case절의 정수값이 일치하면 실행되는 문장이다.

④ 다음 case절을 실행하지 않도록 끝내주는 역할을 한다. 만약 제어식에서 값1이 나오고 break;가 없다면 문장1, 문장2…default의 문장까지 실행하게 된다.

⑤ 제어식의 정수값이 case의 정수값과 일치하지 않을 때 default 절을 실행하게 된다.

-예제

달의 일수를 계산하는 프로그램

#define _CRT_SECURE_NO_WARNINGS //scanf 함수의 보안오류 방지

#include <stdio.h>

int main() {

int month,days;

printf(“달을 입력하시오 : “);

scanf(“%d”, &month);

switch(month)

{

case 2:

days=28;

break;

case 4:

case 6:

case 9:

case 11:

days=30;

break;

default:

days=31;

break;

}

printf(“%d월의 일수는 %d입니다.\n”,month,days);

return 0;

}

goto문

goto문은 가장 역사가 오래된 명령문이다. goto문은 조건없이 어떤 위치로 점프하게 만드는 문장이다. 하지만 프로그램 해독과 유지보수에 어려움을 제공하므로 되도록 사용하지 않을 것을 추천한다.

-형식

goto 레이블; — — ①

문장1

문장2

레이블: — — ②

문장3;

문장4;

① 레이블의 이름을 정할 때는 식별자의 이름 규칙을 따른다.

②문장1,문장2는 실행되지 않고 레이블 이후의 문장3,문장4가 실행된다.

-예제

구구단 3단을 출력하는 프로그램

#include <stdio.h>

int main() {

int i=1;

loop:

printf(“%d*%d=%d\n”,3,i,3*i);

i++;

if(i==10)

goto end;

goto loop;

end:

return 0;

}

반복(Fig7)

반복은 프로그램 상에서 같은 작업을 여러번 되풀이하는 것이다. 동일한 작업을 반복하기 위하여 똑같은 문장을 복사하여 붙여넣기 하는 것보다 반복 구조를 사용하는 편이 프로그램을 간결하게 만든다.

Fig7. 반복의 순서도

while문

while문은 주어진 조건이 만족되는 동안 문장들을 반복 실행하는 문장 구조이다. while 문은 조건식의 결과가 참, 거짓이냐에 따라 실행된다. 만약 조건식이 참이라면 while 뒤의 문장이 실행되고 거짓이라면 문장은 실행되지 않는다. 반복되는 문장은 단일문이거나 복합문이 될 수 있다. 하지만 복합문을 사용할 경우 { }로 감싸 블록을 만들어 줘야 한다.

-형식

while(조건식){ — — ①

실행문장1; — — ②

실행문장2; — — ③

}

① 조건식에는 관계연산자, 논리연산자를 이용한 수식이 사용된다. 또한 정수를 생성하는 어떤 수식도 사용할 수 있다.

② 조건식이 참이면 사용되는 문장이다.

③ 문장이 모두 실행되면 다시 ①로 돌아가 조건을 검사하고 조건식이 거짓으로 나오면 반복을 중단한다.

-예제1

Hello World! 를 5번 출력하는 프로그램

#include <stdio.h>

int main() {

int i=0;

while(i<5){

printf(“Hello World!\n”);

i++;

}

return 0;

}

-예제2

사용자로부터 숫자를 받아 구구단을 출력하는 프로그램

#define _CRT_SECURE_NO_WARNINGS //scanf 함수의 보안오류 방지

#include <stdio.h>

int main() {

int n;

int i=1;

printf(“출력하고 싶은 단:”);

scanf(“%d”,&n);

while(i<=9){

printf(“%d*%d=%d\n”,n,i,n*i);

i++;

}

return 0;

}

-if와 while의 차이

if 문은 조건에 맞으면 단 한 번 실행하고 while 문은 조건에 맞으면 무한히 반복 실행한다.

-조건식의 참과 거짓

while 문의 조건식에 수식을 넣었을 때 0이 아닌 모든 값들은 모두 참이고 0은 거짓으로 간주된다. 만약 조건식의 값이 1이라면 무한히 실행하는 무한 루프가 된다.

-보초값

보초값은 데이터의 끝을 알리는 데 사용되는 데이터 값이다. 예를 들어서 성적을 입력받아 성적의 평균을 구하는 프로그램을 만들었다고 하자. 데이터를 모두 입력했을 때 음수를 입력하면 평균을 출력한다고 하자. 이때 음수는 데이터의 끝을 알리는 데 사용된 보초값이다.

do…while문(Fig8)

do…while 문은 조건이 만족하지 않아도 루프 안의 문장이 한 번은 실행된다. 이후에 조건을 검사하여 참이면 반복이 계속된다.

Fig8. do…while의 순서도

-형식

do{ — — ①

실행문장1;

실행문장2;

}while(조건식); — — ②

① ②의 조건식의 참,거짓과 상관없이 do의 실행문장은 무조건 한 번 실행된다.

② 실행문장들이 한번 실행된 이후 조건식의 참, 거짓을 따져본다. 이후 조건식이 참이면 실행문장을 반복한다. 또한 while 문과는 다르게 do…while문에서는 while뒤에 ;이 붙는다.

-예제

#define _CRT_SECURE_NO_WARNINGS //scanf 함수의 보안오류 방지

#include <stdio.h>

int main() {

int i=0;

do{

printf(“1 — -새로만들기\n”);

printf(“2 — -파일열기\n”);

printf(“3 — -파일닫기\n”);

printf(“하나를 선택하시오\n”);

scanf(“%d”,&i);

}while(i<1 || i>3);

printf(“선택된 메뉴=%d \n”,i);

return 0;

}

for 문(Fig9)

for 문은 정해진 횟수만큼 반복할 때 사용하는 반복구조이다.

Fig9. for 문의 순서도

for 문은 초기식, 조건식, 증감식의 3부분으로 구성된다. 이들 세 부분은 ;으로 구분되어있다.

-형식

for(초기식; 조건식; 증감식) — — ①

실행문장; — — ②

① 초기식: 초기식은 반복 루프를 실행하기 전 한 번만 실행한다. 주로 변수를 초기화하는 용도로 사용된다.

ex)int i=0

조건식:반복의 조건을 검사하는 수식이다. 이 수식의 값이 거짓이 되면 반복이 중단된다. 이 수 식은 반복을 하기 전에 계산된다.

ex)i<5

증감식: 한번의 루프 실행이 끝나면 증감식이 실행된다. 주로 i++, I — 와 같은 증감식이 쓰인다. 하지만 곱셈, 나눗셈과 같은 복잡한 수식도 사용할 수 있다.

ex)i++

②실행문장이 2개 이상일 경우 { }를 이용해 블록을 만들어 준다.

-예제

반복을 이용한 팩토리얼 구하기

#define _CRT_SECURE_NO_WARNINGS //scanf 함수의 보안오류 방지

#include <stdio.h>

int main(){

long fact=1;

int n;

printf(“정수를 입력하시오:”);

scanf(“%d”,&n);

for(int i=1; i<=n; i++)

fact=fact*i;

printf(“%d!는 %d입니다\n”,n,fact);

return 0;

}

-for문의 실행 순서(Fig10)

먼저 루프안의 문장이 실행되기 전, 초기식을 제일 먼저 거친다. 그 다음 조건식을 따져 조건에 맞는 지 검사한다. 조건에 맞다면 루프안의 문장을 실행하고 증감식을 거친다. 이후 조건식에 맞지 않을 때까지 이러한 과정을 거친다. 이후 조건식에 맞지 않다면 그대로 루프를 빠져나간다.

Fig10. for 문의 순서

-while문과 for문의 관계(Fig11)

while문은 루프가 몇 번이나 반복될지 모르는 환경에서 사용할 수 있다. 하지만 미리 반복 횟수를 아는 경우에도 사용할 수 있다. 따라서 for루프는 while 루프로도 변환이 가능하다.

Fig11. while 문과 for 문의 차이

-다양한 for루프

① 초기식, 조건식, 증감식이 비어있는 for 문: 이 경우 초기화는 물론 반복 조건 검사나 증감 수식도 없으므로 루프가 무한히 반복된다. pc의 경우 이 것을 중단시키려면 Ctrl-C를 눌러야 한다.

for(;;){ }

② 초기식에서 콤마 연산자를 사용하여 2개 이상의 변수를 초기화시킬수 있다.

ex)for(i=0, sum=0; i<100;i++)

③ 초기식 자리에 변수 초기화가 아닌 다른 문장도 들어갈 수 있다.

ex)for(printf(“Hello World!”),i=0;i<100;i++)

④ 조건식에는 참, 거짓을 판별할 수 있는 수식이면 뭐든지 가능하다. 논리연산자를 이용하여 여러 가지 조건을 결합할 수도 있다.

ex)for(i=0; i<100 && sum<2000;i++)

중첩반복문(Fig12)

반복문안에 다른 반복문이 포함된 형태를 중첩 반복문이라고 한다. 외부에 위치한 반복문을 외부 반복문이라고 하고 안쪽의 반복문을 내부 반복문이라고 한다.

Fig12. 중첩반복문

-예제

*을 나무 모양으로 출력하는 프로그램

#include <stdio.h>

int main(){

int x,y;

for(y=1; y<=5; y++){

for(x=0;x<y;x++)

printf(“*”);

printf(“\n”);

}

return 0;

}

break

break문은 반복 루프를 벗어나기 위하여 사용한다. 다만 내부 중첩루프에서 break 문을 사용하게 되면 내부의 루프만 빠져나오고 외부에 루프에 머물게 된다.

-예제

백 만원으로 재테크를 시작한 사람이 연 30%의 수익으로 몇 년만에 원금의 10배가 되는지 알아보는 프로그램

#include <stdio.h>

#define SEED_MONEY 1000000

//매크로 정의하기, 1000000를 SEED_MONEY라는 변수에 넣었다.

int main(){

int year=0, money=SEED_MONEY;

while(1){ //조건식이 0이 아니므로 무한루프

year++;

money +=money*0.30;

if(money>10*SEED_MONEY)

break;

}

printf(“%d년\n”,year);

return 0;

}

goto 문의 사용

goto 문은 중첩 루프를 빠져나올 때 아주 유용하다. break는 한 번에 1개의 루프만 벗어나올 수 있다.

-예제

*을 출력하다가 키보드를 누르면 종료되는 프로그램

#include <stdio.h>

int main(){

int x,y;

for(y=1; y<10000; y++){

for(x=1; x<50; x++){

if(_kbhit()) //_kbhit()은 키보드가 눌려지면 1을 반환하는 함수이다.

goto OUT;;

printf(“*”);

}

printf(“\n”);

}

OUT:

return 0;

}

continue 문(Fig13)

continue문은 현재 실행하고 있는 반복과정의 나머지를 생략하고 다음 반복을 실행하게 만든다. for 문과 while 문에서 continue의 동작에 차이가 있는데 이는 Fig13에서 알아볼 수 있다.

Fig13. continue 문의 동작

-예제

1부터 10까지 3의 배수만 제외하고 출력하는 프로그램

#include <stdio.h>

int main(){

int i;

for(i=0; i<10; i++){

if(i%3==0)

continue;

printf(“%d “,i);

}

return 0;

}

--

--