흥달쌤 C언어 특강 11~20

이윤설·2024년 6월 12일

흥달쌤 C언어 특강

목록 보기
3/10

11강. 진법변환, 비트연산

10진수 -> 2진수

19를 2진수로 변환해보자.

나머지를 역순으로 읽으면 10011이다.
따라서, 19를 2진수로 변환하면 10011이다.

하지만 위 방법보다 훨씬 간편한 방법이 있다.
만약 19의 2진수를 구한다고 할 때,
32 16 8 4 2 1 순으로 숫자들을 정렬해놓고,
19를 만들기 위해 필요한 숫자에 1을 채워넣으면 된다.
19를 만들기 위해서는 16+2+1을 수행하면 된다.
따라서 0 1 0 0 1 1 -> 1 0 0 1 1이 19의 2진수다.

2진수 -> 8진수

2진수를 8진수로 만들기 위해선 세가지 스텝을 거쳐야 한다.

  1. 이진수를 3개씩 나누고, 4 2 1 모자를 씌운다.
  2. 숫자가 1인 모자를 구한다. 예제에서는 첫번째 토막이 2, 두번째 토막이 2,1에 1이 있다.
  3. 2에서 구한 모자들을 더한다. 따라서 10진수 19의 8진수는 '2 3'이다.

2진수 -> 16진수

2진수를 16진수로 만들기 위해선 2진수를 8진수로 만드는 것과 거의 유사하다.

  1. 이진수를 4개씩 나누고, 8 4 2 1 모자를 씌운다.
  2. 숫자가 1인 모자를 구한다. 예제에서는 첫번째 토막이 1, 두번째 토막이 2,1에 1이 있다.
  3. 2에서 구한 모자들을 더한다. 따라서 10진수 19의 16진수는 '1 3'이다.

16진수/8진수 -> 2진수

2진수 -> 8진수/16진수의 스텝을 반대로 수행하면 된다.

비트연산


5,3 의 여러가지 비트연산 결과를 구해보자.

  1. 논리곱: 5 & 3 = 1
    둘다 참이면 참이다.

  2. 논리합: 5 | 3 = 7
    둘 중 하나만 참이여도 참이다.

  3. 배타적 논리합: 5 ^ 3 = 6
    둘이 달라야 참이다.


실행 결과를 구하라.

#include<stdio.h>
void main() {
  int x = 0x11;
  int y,z;
  y = x & 0x0f;
  z = x | 0x0f;
  printf("x=%d, y=%d, z=%d", x, y, z);
}

12. 매크로, 비트연산

매크로

매크로: 반복적인 일들을 쉽게 하기 위해 만들어 놓은 것.

  • #define N 10: 앞으로 나오는 모든 N은 10으로 대체한다고 선언한다.
  • #define SQR(X) XX: 함수의 파라미터로 X를 받으면 XX를 한다고 선언한다.
#define N 10
#define SQR(X) X*X

SQR(N);
SQR(N+2);
  • SQR(N) = SQR(10) = SQR(10*10) = 100
  • SQR(12) = SQR(12*12) = 144

라고 풀면 틀리는 것이다. 왜냐하면 매크로 != 함수이기 때문이다.

N+2가 X가 된다.
따라서 N+2 N+2가 된다. 10+2 10+2 이므로, 연산자 우선순위를 적용하면 10+(2*10)+2이므로, SQR(N+2) = 20+10+2 = 32다.

비트연산

좌시프트: 너 죽어!! 우측의 요소를 낭떠러지로 떨어뜨린다.
우시프트: 너 이리 들어와!! 0을 우측에 추가한다.

  • 시프트 연산: 10>>2
  1. 10을 2진수로 바꾼다. 1010이다.
  2. ">>2"의 뜻은 2개를 밀라는 뜻이다. 즉, 우측으로 떨어뜨리라는 뜻이다.

    따라서 결과는 "1 0" 이다.
  • 시프트 연산: 10<<2
  1. 10을 2진수로 바꾼다. 1010이다.
  2. 좌측으로 2개를 밀라는 뜻이다. 0 2개를 우측에 붙여주면 1 0 1 0 1 0이다.
  3. 비트는 차례대로 32,16,8,4,2,1이므로 32 + 8 = 40이다.

  • 모든 VALUE1은 1로, VALUE2는 2로 바꾸는 매크로가 있다.
  • i는 float이여서 실수를 받을 수 있다. 하지만 100/300은 정수 나누기 정수이다.
    정수 나누기 정수는 정수이다. 따라서 i = 0.0이다.
  • 1은 0001, 2는 0010이다. AND연산을 수행하면 0000이다. 따라서 j=0이다.
  • 1은 0001, 2는 0010이다. OR연산을 수행하면 0011이다. 따라서 k=3이다.
  • if문: 0 && 3은 좌측과 우측과 둘 다 참일 때 참을 리턴한다. 그런데 좌측이 0이다. 프로그래밍에서 0은 거짓이다. 따라서 j&&k=0이다.
  • (0 || i(0))은 거짓이다. 따라서 m = i+j;를 수행하지 않는다.
  • 결국 else문을 실행한다. m = 0+3 = 3이다.
  • i = %.1f: 소수점 1자리까지만 출력한다. 따라서 0.0을 출력한다.
  • m = %03d: 3개의 공간을 만들어 놓고, 3을 3번째에 넣고 나머지는 0으로 채워서 출력한다. 따라서 003을 출력한다.
  • 따라서 i=0.0, j=0, k=3, m=003

13강. 삼항 연산자

condition ? expression1 : expression2;

condition이 참이면 expression1이 실행되고, 거짓이면 expression2가 실행된다.

#include <stdio.h>

int main() {
    int age;
    int ticketPrice;

    printf("클래식 연주회 티켓 가격 계산기\n");
    printf("관객의 나이를 입력하세요: ");
    scanf("%d", &age);

    // 삼항 연산자를 사용하여 티켓 가격 결정
    ticketPrice = (age < 18 || age >= 60) ? 5000 : 10000;

    printf("관객의 나이: %d\n", age);
    printf("티켓 가격: %d원\n", ticketPrice);

    return 0;
}
  • 출력 결과 값을 구해라.
void main(void) {
	int a,b;
    a = 20;
    b = (a > 10) ? a+a : a*a;
    printf("b=%d\n",b);
}

a = 20;
b = 20이 10보다 크다는 것은 사실이다. 따라서 20+20=40 이 b에 들어간다.

printf("b=%d\n", b)는 "b=40"을 출력한다.
%d는 b와 매핑되고, \n은 줄바꿈이다.

14강. if문, switch문

  • if문
    if - else if - else를 사용한다.
#include <stdio.h>

int main() {
    int age;
    int ticketPrice;

    printf("클래식 연주회 티켓 가격 계산기\n");
    printf("관객의 나이를 입력하세요: ");
    scanf("%d", &age);

    // if문을 사용하여 티켓 가격 결정
    if (age < 18) {
        ticketPrice = 5000;  // 청소년 할인
    } else if (age >= 60) {
        ticketPrice = 5000;  // 노인 할인
    } else {
        ticketPrice = 10000; // 일반 가격
    }

    printf("관객의 나이: %d\n", age);
    printf("티켓 가격: %d원\n", ticketPrice);

    return 0;
}
  • switch문
switch (변수) {
    case 값1:
        // 변수의 값이 값1일 때 실행되는 코드
        break;
    case 값2:
        // 변수의 값이 값2일 때 실행되는 코드
        break;
    default:
        // 변수의 값이 어떤 case에도 해당하지 않을 때 실행되는 코드
}
#include <stdio.h>

int main() {
    int choice;

    printf("클래식 연주회 음악 장르 선택기\n");
    printf("원하는 장르를 선택하세요:\n");
    printf("1. 교향곡\n");
    printf("2. 협주곡\n");
    printf("3. 실내악\n");
    printf("4. 오페라\n");
    printf("선택: ");
    scanf("%d", &choice);

    // switch문을 사용하여 음악 장르 결정
    switch (choice) {
        case 1:
            printf("선택한 장르: 교향곡\n");
            break;
        case 2:
            printf("선택한 장르: 협주곡\n");
            break;
        case 3:
            printf("선택한 장르: 실내악\n");
            break;
        case 4:
            printf("선택한 장르: 오페라\n");
            break;
        default:
            printf("잘못된 선택입니다. 1부터 4 사이의 숫자를 선택하세요.\n");
            break;
    }

    return 0;
}

15강. 반복문, for문

  • 반복문 종류
  1. for: 정해진 횟수만큼 반복
  2. while: 조건이 만족하는 동안 반복
  3. do - while: 무조건 한번 수행 후, 조건이 만족하는 동안 반복
#include <stdio.h>

int main() {
    int count = 10;

    // do-while문: 조건이 처음부터 거짓이지만, do 블록은 최소 한 번 실행됨
    do {
        printf("이 메시지는 무조건 한 번 출력됩니다.\n");
        printf("현재 카운트: %d\n", count);
        count++;
    } while (count < 10); // 조건이 처음부터 거짓

    printf("반복문 종료 후의 카운트: %d\n", count);

    return 0;
}

// 이 메시지는 무조건 한 번 출력됩니다.
// 현재 카운트: 10
// count++; (이 때, count = 11)

이 코드는 do-while문이므로, 조건이 거짓임에도 불구하고 do문 안에 있는 세 줄의 코드가 한 번 실행된다.

16강~ 20강

skip

profile
화려한 외면이 아닌 단단한 내면

0개의 댓글