본문 바로가기
혼공학습단 C

C언어 W3(5 ~ 6강)

by 알래스카코코넛 2023. 7. 20.
반응형

*본 포스팅은 한빛미디어의 '혼자공부하는 C언어(1판)'기준으로 작성되었습니다.

Chapter5. 제어문

5-1. if문

기본 형식:

#include <stdio.h>
int main() {
    int a = 50;
    int b;
    printf("정수 하나를 입력하세요:\n");
    scanf("%d", &b); 
    if(a>b)
    {
        printf("입력한 값은 50보다 작습니다.");
    }
    else if (a = b)
    {
        printf("입력한 값은 50입니다.");
    }
    else
    {
        printf("입력한 값은 50보다 작습니다.");
    }
    return 0;
}

이런 식으로 if/else if/ else로 입력한 값이 a(=50)보다 작으면, 같으면, 크면으로 분기점을 나눌 수 있다. 

 

else문은 위의 if, else if 문과는 달리 조건 ((a=b)등) 없이, '나머지 조건에 해당하지 않는 모든 케이스'를 싹 다 해당시키기 때문에 조건이 없다. 

 

*가장 중요한 사항은, if/ else/ else if 뒤에 실행할 문장이 두 줄 이상이면 반드시 중괄호{}로 묶어야 한다. 위의 예시에서는 한 줄이라도 {}로 묶었는데, 두 줄 이상일 때 묶지 않으면 에러가 나므로 차라리 한 줄일 때도 그냥 묶는 습관을 들이자. 

 

5-2. if문 활용과 switch ~ case문

먼저 if문 활용을 알아보자. 예를 들어 학점이 4.3 이상이고 토익 점수가 950점을 넘으면 장학금이 등록금의 100% 지급되고, 4.3 이상이고 토익 점수가 950이하면 장학금이 50% 지급, 4.3미만이면 토익점수와 상관없이 장학금이 지급되지 않는 장학 제도가 있다고 가정해보자.

 

이 경우 조건이 2개인데, 어떻게 if문으로 나타낼 수 있을까? 

이럴 때 if문을 if문 안에 중첩해서 사용한다. 

#include <stdio.h>
int main() {
    double score;
    int toeic;
    int scholar;
    printf("학점을 입력해주세요:");
    scanf("%lf", &score);
    printf("\n토익 점수를 입력해주세요:");
    scanf("%d", &toeic);   
    
    if (score>=4.3){
        if (toeic > 950){
            scholar = 100;
        }
        else{
            scholar = 50;
        }
    }
    else{
        scholar = 0;
    }
    printf("장학금은 등록금의 %d%%만큼 지급됩니다.",scholar);
    return 0;
}

그러나 if문을 중첩해서 사용하는 것보다는, if ~ else if를 적극적으로 사용하는 편이 더 처리 속도가 빠르다. 따라서 위와 같은 경우는 score >= 4.3 && toeic > 950 같이 표시하는게 더 효율적이다.

 

물론 위 예시는 간단해서 컴퓨터가 신속히 처리할 수 있으므로, 크게 속도에 연연할 정도는 아니니 본인이 편한 방법으로 코딩해도 무방하다. 

 

switch ~ case문

요즘 닌텐도 스위치를 많이 해서 그런지 switch하면 누르는 스위치가 아니고 닌텐도가 계속 떠오른다

 

닌텐도 모동숲 최애 주민 아크릴 조는 모습 귀엽다

switch ~ case문은 은근 많이 쓰이는데, 특히 교수님들이 좋아하시는 것 같다. if문만 죽어라 파고 switch문은 공부 하나도 안하다가 기말고사 때 한 문제를 통째로 아무말 대잔치했었다.

 

흐름 자체는 if문이랑 거의 유사하니, if문을 이해했다면 switch문은 형식만 알아두면 충분히 쉽게 활용할 수 있을 것이다. 

//switch문 형식 
#include <stdio.h>
int main() {
    int age;
    printf("인원수를 입력하세요:");
    scanf("%d", &age);
    
switch(age){
    case 1:
        printf("1인석으로 안내하겠습니다. ");
        break;
    case 2:
        printf("2인석으로 안내하겠습니다.");
        break;
    case 3:
        printf("4인석으로 안내하겠습니다.");
        //위에 4인석 오타 아님, 보통 식당에는 3인석이 없음 
        break;
    case 4:
        printf("4인석으로 안내하겠습니다.");
        break;
        
    default:
        printf("인원수에 맞게 앉아주세요.");
        break;
    }
    return 0;
}

 이런 식으로 case를 정수로 표현 한 후, 그 정수를 매개변수로 문장을 실행한다. else와 같은 느낌으로 default를 사용한다. 


Chapter 6. 반복문

반복문이란, 특정 조건을 달성하기 전까지 계속 구문을 실행시키는 것을 말한다. 예를 들어, 반 학생들 전체의 평균을 알기 위해 점수를 계속 더하려고 하는데 한명 더하고 프로그램 실행이 끝나고, 또 한명 더하고 프로그램 실행이 끝나면 정상적으로 평균을 알기 어렵다. 이런 상황에 반복문을 사용한다.

 

while과 for로 학생들의 평균을 구하는 간단한 예제를 통해 구문에 대해 살펴보자. 

1) while문을 이용한 평균 구하기

#include <stdio.h>

int main() {
    int num,score;  //학생 수, 점수 선언
    int a, total = 0; //while문의 매개변수 점수, 값을 모두 더할 변수 선언
    printf("학생 수 입력:");
    scanf("%d", &num);
    
    while (a<num){
        a ++;
        printf("학생%d의 점수 입력:", a);
        scanf("%d", &score);
        total = total+score;
    }
    double avg;
    avg = (double)total/(double)num;
    printf("평균 점수: %.2lf", avg);
    return 0;
}

형식은 while(조건){실행문}이다. 여기서 (조건)부분에 (1)을 넣으면 1이 True라는 의미로, 특정 조건 전에는 무한히 반복한다는 뜻이다. 이 부분은 아래 break와 continue부분에 있으니, 일단은 이런게 있구나~만 알고 넘어가자. 

 

while을 통하여 반복될 범위(학생 수)를 정해주고, 그 동안 a를 1씩 증가시킨다. 이렇게 증가된 a가 학생 수 보다 많을 때, 즉 학생 수만큼 점수를 받았다면 더한 점수를 학생 수만큼 나누어서 평균 점수를 만들어준다. 

 

2) for문을 이용하여 평균점수 구하는 코드:

#include <stdio.h>

int main(){
    int num,score;  //num: 학생 수, score: 점수
    int total = 0;   //점수들을 모두 더할 변수 선언
    printf("학생 수 입력:");
    scanf("%d", &num);
    
    for (int a = 0; a<num; a++){
        printf("학생%d의 점수 입력:", a+1);
        scanf("%d", &score);
        total = total+score;      
    }
    double avg;
    avg = (double)total/(double)num;
    printf("평균 점수: %.2lf", avg);
    return 0;
}

for문의 형식은 'for (초기식, 조건식, 증감식) {실행할 구문}'이다.

여기서 while문과 다른 점으로 printf("학생 %d의 점수 입력:", a+1)을 찾았다면 상당히 관찰력이 좋다고 할 수 있다. 원래 a = 0부터 시작했으므로, 만약 a+1이 아니라 a로 썼다면 가장 먼저 "학생 0의 점수 입력"이 출력된다.

 

그러나 while문에서는 a++를 먼저 해주고, 다음에 a를 사용했기 때문에 '학생 0'이 아니라 '학생 1'로 출력된다. 시작이 헷깔리지 않게 주의하자. 

 

여기서 for문은 몇 가지 주의사항이 있다:

1. 초기식, 조건식, 증감식은 반복횟수를 알기 쉽게 작성하자.

for (i = 0; i < 5; i++)나 for (i = 3; i < 8; i++)나 for (i = 0; i < 10; i+=2)은 모두 같은 작용을 한다. 그러나 서술 방식에 따라 같은 내용도 혼란을 줄 수 있으므로, 가장 이해하기 쉬운 방법을 사용하자. 위의 예시 중 가장 널리 쓰이는 방법은 당연히 첫 번째 예시다.

 

2. 반복 횟수를 세는 변수를 반복문 안에서 바꾸지 말자. 

for (i = 0; i < 5; i++)에서 i를 최대한 중괄호 안에서 증감시키지 말자. 참고로 위에 a+1은 증가 시키긴 하나, 그 값이 a에 반영되는 것이 아니므로 괜찮고, 자주 쓰이는 방법이다. 그러나 만약 a= a+1, a++가 중괄호 안에 있다면 이건 지양해야 할 점이며, 차라리 변수가 많이 쓰이더라도 다른 변수를 하나 더 만들자.

 

3) do~while문

do~while문의 핵심은 일단 실행하고 다음에 조건을 알아보자이다. 

예를 들어, 휴대폰을 잃어버렸을 때 잃어버린 곳이 확실히 거실 안이라면 의사코드(문법을 맞춘 건 아니지만,  읽기 쉬운 코드)로 

while (room = "거실")
	search(휴대폰)

으로 나타낼 수 있다. 그러나 도저히 어디에서 잃어버렸는지 모르겠다면, 일단 모든 곳을 찾아봐야 한다. 이럴 때 do ~while문을 이용하고, 의사코드는 다음과 같다. 

do{
	search
    } 
    while (휴대폰 not found){
    buy new 휴대폰};

이렇게 일단 search를 실행하고, 찾을 수 없다면 새 휴대폰을 찾는 매커니즘이다. 


break와 continue

위에 switch문을 보면, break;가 계속 등장하는 것을 볼 수 있다. break문은 무엇일까? 겸사겸사 continue도 같이 알아보자.

 

구문 사용처 의미
break 반복문 안에서 반복 즉시 끝낼 때 반복문을 부수고 나가겠다
continue 반복문의 끝으로 이동 후 다시 반복한다. 내가 있는 부분은 뛰어넘고 계속 가라(continue)

말로만 하면 이해가 잘 안되니 역시 예시코드로 알아보자.

#include <stdio.h>

int main(){
    int total = 0; //총 더한 값을 넣을 변수 선언
    for (int i = 1; i<=20; i++){
        total += i; //
        if(total>10){ //만약 더한 값이 10을 넘어가면
            break;        //반복문을 부수고 끝내라
        }
    }
    printf("누적한 값: %d\n", total);
    printf("마지막으로 더한 값: %d", i);
    return 0;
}
//결과: 
//누적한 값: 15
//마지막으로 더한 값: 5

위 코드를 보면, i를 for의 매개변수로 20까지 반복하려 했지만 마지막으로 더한 값은 5에서 끝나버린다. 그 이유는 조건에 

break; 즉 특정 조건(지금까지 더한 값이 10을 넘는다)을 가 있어서, i 값이 20이 되지 않아도 마지막으로 total이 10이 넘었기 때문에 반복문에서 탈출한 것이다. 

 

continue문도 예시를 통해 알아보자. 

#include <stdio.h>

int main(){
    int sum = 0;
    for (int i = 1; i<= 20; i++){
        if ((i%3) == 0){ //만약 i가 3의 배수라면 
            continue; //아래에 있는 sum +=i를 실행하지 말고 반복문 끝으로 이동해라 
        }
        sum +=i;
    }
    printf("3배수를 제외한 20이하 숫자들의 합계: %d", sum);
    return 0;
}
//3배수를 제외한 20이하 숫자들의 합계: 147

간단히 설명하자면, i%3==0, 즉 i의 나머지가 0이면(i가 3의 배수이면) for문 안에 있는 sum += i는 실행하지 않고 넘어가게 된다. 


3주차 기본미션: 혼공C 용어노트 활용하기

용어 사전1(클릭하면 이미지 커짐)
용어사전 2

3주차 추가미션: p.123 크리스마스 소개팅 예문 if문 실행화면 캡처

크리스마스가 아니고 여자친구가 있을 때
크리스마스에 여자친구가 있을 때
크리스마스에 여자친구가 없을 때
크리스마스가 아니고 여자친구가 없을 때

참고로 코드는 다음과 같다:

#include <stdio.h>

int main() {
    int Girlfriend;
    int Christmas;
    
    printf("오늘은 크리스마스인가요?: 맞으면 1, 틀리면 0 입력: ");
    scanf_s("%d", &Christmas); //visual stdio에서 _CRT_SECURE_NO_WARNINGS 오류가 발생하는 것을 방지하기 위해 사용
    //scanf와 의미 자체는 같다. 

    printf("여자친구가 있나요?: 맞으면 1, 틀리면 0 입력: ");
    scanf_s("%d", &Girlfriend);

    if (Girlfriend == 0 && Christmas == 1) {
        printf("친구가 소개팅을 주선해 준다\n");
    }
    else {
        printf("친구가 소개팅을 주선해주지 않는다.\n"); //소개해주면 큰일난다. 
    }
    return 0;

이상으로 3주차도 완료했다! 

반응형

'혼공학습단 C' 카테고리의 다른 글

C언어 W5(8강 배열)  (0) 2023.08.08
C언어 W4(7강 함수)  (0) 2023.07.24
C언어 W2-2(4강)  (0) 2023.07.13
C언어 W2-1 (3강)  (0) 2023.07.11
혼공학습단 10기 C언어 W1  (0) 2023.07.06