본문 바로가기

Computer Science/따라하며 배우는 C

07 If문

728x90

07-01. if


image
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int number;

    printf("input a positive integer : ");
    scanf("%d", &number);

    // Todo: print even or odd

    if (number % 2 ==0)
        printf("Even");

    else if (number % 2 != 0)
        printf("ODD");

    return 0;
}

07-02. getchar(), putchar() example


char을 입력받아서 출력하기

int main()
{
    /* 

    1. Introduc getchar(), putchar()
    2. Use while loop to process char sequences
    3. Filter a specific character
    4. Convert number to asterisks
    5. Lower characters to Upper Char

     */

    char ch;

    while ((ch = getchar()) != '\n') // use '\n' to find the end of a sentence
    {
        putchar(ch);
    }

    putchar(ch);
    return 0;
}

특정 문자열을 출력하지 못하게 하기


int main()
{


    char ch;

    while ((ch = getchar()) != '\n') // use '\n' to find the end of a sentence
    {
        if (ch == 'f')
            ch = 'X';

        else if (ch == 'F')
            ch = 'X';

        putchar(ch);
    }

    putchar(ch);
    return 0;
}

입력이 숫자라면 -> *로 바꿔주기


int main()
{


    char ch;

    while ((ch = getchar()) != '\n') // use '\n' to find the end of a sentence
    {

        if (ch >= '0' && ch <= '9')
            ch = '*';

        putchar(ch);
    }


    putchar(ch);
    return 0;
}

for문은 계속 돌아가는 것이기 때문에, 논리구조를 파악한 후 while문을 돌리는 게 선호된다.

영문자가 들어왔을 때 이를 대문자로 출력하기

int main()
{


    char ch;

    while ((ch = getchar()) != '\n') // use '\n' to find the end of a sentence
    {

        if (ch >= 'a' && ch <= 'z') //'A' = 65 'a' = 97
            ch -= 'a' - 'A';

        else if(ch >= 'A' && ch <= 'Z')
            ch += 'a' - 'A';

        putchar(ch);
    }


    putchar(ch);
    return 0;

}

07-03. ctype.h 문자 함수들


입력받은 문자들을 체크하는 함수들이 있다.(islower, isupper, tolower, toupper, iscntrl, isprint, ...)


#include <ctype.h>
int main()
{
    char ch;

    while ((ch = getchar()) != '\n') // use '\n' to find the end of a sentence
    {

        if (islower(ch)) //'A' = 65 'a' = 97
            ch = toupper(ch);

        else if (isupper(ch))
            ch = tolower(ch);

        putchar(ch);
    }


    putchar(ch);
    return 0;

}

07-04. 다중 선택 else if


종합소득세를 계산하는 문제를 풀어보자.

07-05. else와 if 짝짓기


VSCode는 Indenting을 지원한다. 하지만, 짝을 제대로 지어주지 않게 되면 컴파일 에러가 나며 잘못 인식한다.

정수 하나를 입력 받으면 크기 비교에 맞게 출력하는 숫자가 있다고 치자.


int main()
{
    int number;
    scanf("%d", &number);

    if (number > 5) 
        if (number < 10)
            printf("Larger than 5 smaller than 10\n");
    else
        printf("Less than or equal to 5"); //에러가 날 것이다.

    // compilers ignore indenting

    return 0;
}

이렇게 코드를 짜면, else문에서 error가 날 것이다.

warning: add explicit braces to avoid dangling else [-Wdangling-else]
else
^
1 warning generated.

그래서 이를 해결하기 위해서는 중괄호를 선언하여 else가 어떤 if문의 else인지를 명확하게 지정해주어야 한다.

헷갈릴 여지가 있다면 괄호를 치자!


int main()
{
    int number;
    scanf("%d", &number);

    if (number > 5) 
    {
            if (number < 10)
            printf("Larger than 5 smaller than 10\n");
    }    
    else
        printf("Less than or equal to 5");

    // compilers ignore indenting

    return 0;
}

07-06. 소수 판단 예제


  • 논리연산자 익히기

  • 마침표를 찍으면, 이전까지의 공백과 띄어쓰기를 제외한 글자수를 세주는 프로그램 짜기


#include <stdbool.h>

int main()
{
    unsigned num;
    bool isPrime; //flag, try bool type

    scanf("%u", &num);

    /* 
    TODO: Check if num is a prime number
    ex) num is 4, try num % 2, num % 3
     */

    isPrime = true;

    for (unsigned i =2; (i*i) <= num; i++)
    {
        if (num % i == 0)
        {
            isPrime = false;

            printf("%u is divisible by %u and %u. \n", num, i, num/i);
        }


    }
    if (isPrime)
        printf("%u is a prime number. \n", num);

    else
        printf("%u is not a prime number\n", num);


}

소수인지를 판단하는 문제는 이렇게 해결할 수 있다.

point:

  • isPrime = True로 할당하고 시작하기
  • for문 내에 (i*i)와 같이 제곱식을 넣어서, 똑같은 게 나오지 않도록 설정하기

07-07. 논리 연산자 Logical operators



#include <ctype.h> //islower()
#include <stdbool.h>
#include <iso646.h> //and, or, not

#define PERIOD '.'

int main()
{
    /* 
    Logical operators

    && : and
    || : or
    !  : not
    */

   bool test1 = 3>2 || 5>6; //true
   bool test2 = 3>2 && 5>6; //false
   bool test3 = !(5>6);     //true, equivalent to 5 <= 6

   printf("%d %d %d \n", test1, test2, test3);


    /* Character Counting example */

    char ch;
    int count = 0;

    while ((ch = getchar()) != PERIOD)
    {
        //TODO: make exceptions

        if (ch != '\n' && ch != ' ')
            count ++; 

    }
    printf("%d", count);



}
    /* short circuit evaluation 

    - Logical expressions are evaluated from left to right
    - && and || are sequence points

    */

   int temp = (1+2) * (3+4);

   printf("before: %d \n", temp);
   if (temp == 0 && (++temp == 1024)) //중요한 것은 (++temp) 부분이 실행이 되는지, 되지 않는지이다!! 
   {

   };

++temp가 실행되는지 보자!!

결과를 보면, before, after 모두 21이라는 결과가 나온다. 즉, ++temp 연산이 진행되지 않았다는 것이다!

07-08. 단어 세기 예제


단어를 세는 예제를 만들어보자.


#include <stdbool.h>
#define STOP '.'

int main()
{
    char c;
    int n_chars = 0;
    int n_lines = 0;
    int n_words = 0;
    bool word_flag = false;
    bool line_flag = false;

    printf("Enter Text: \n");

    while( (c=getchar()) != STOP)
    {
        if (!isspace(c))
            n_chars++;

        if (!isspace(c) && !line_flag)
        {
            n_lines++;
            line_flag = true;
        }

        if (c == '\n')
            line_flag = false;

        if (!isspace(c) && !word_flag)
        {
            n_words++;
            word_flag = true;

        }

        if (isspace(c))
            word_flag = false;

    }

    printf("Characters = %d , Words = %d, Lines = %d ", n_chars, n_words, n_lines);

}

07-09. 조건 연산자


temp 변수를 보면, true 뒤에 물음표가 있는 것이 보일 것이다. 이는, true라면 왼쪽 연산을 수행하고, false라면 오른쪽 연산을 수행한다.

이는 ternary라고 불리며, 세 개를 의미한다.


    int temp;
    temp = true ? 1024 : 7 ; //ternary oprator: 삼항연산자
    printf("%d \n", temp);

    temp = false ? 1024 : 7 ; //ternary oprator: 삼항연산자
    printf("%d \n", temp);

07-10. continue, break


a가 들어가면, 이를 제외한 문자만 출력되도록 할 수 있다.

int main()
{
    /* continue */

    int count = 0;
    while (count < 5)
    {
        int c= getchar();
        if (c == 'a')
            continue;

        putchar(c);
        count++;

    }

}

placeholder라는 것은, 하는 것 없지만 자리를 차지하는 것을 의미하며, 해당 자리에 무언가가 들어올 수 있음을 보여주는 용도로 사용한다.(null statement)

07-11. 최대, 최소, 평균 구하기 예제


ternary operator를 통해서 max, min을 정의할 수 있다.


#include <float.h>
#include <stdio.h>

int main()
{
    float max = -FLT_MAX;
    float min = FLT_MAX;
    float sum = 0.0f;
    float input;
    int n=0;

    while (scanf("%f", &input) == 1)
    {
        max= (input > max) ? input: max;
        min = (input < min) ? input: min;
        sum += input;

        n++;
    }
        if (n>0)
            printf("min = %f, max = %f, ave = %f\n", min, max, sum/n );
        else
            printf("no input\n");

        return 0;

}

07-12. 다중 선택 switch와 case


switch case문을 이용하여 몇 가지 경우의 수에 대해서 프로그래밍이 가능하다. If else문을 나열하는 것에 비해 간단하며, 가독성이 좋다.


int main()
{
    char c;
    while( (c = getchar()) != '.')
    {
        printf("You love ");

        switch (c)
        {
        case 'a':
            printf("apple");
            break;

        case 'b':
            printf("baseball");
            break;

        default:
            printf("nothing");
        }


        printf(". \n");

        while (getchar() != '\n')
            continue;


    }
}
728x90

'Computer Science > 따라하며 배우는 C' 카테고리의 다른 글

09 function, pointer  (0) 2022.03.31
08 Input Output  (0) 2022.03.31
06 For  (0) 2022.03.31
04 연산자  (0) 2022.03.11
03 문자열과 형식 맞춘 입출력  (0) 2022.03.03