Study/C언어

[C언어] 코딩도장 공부 (Unit 21~40)

dDong2 2022. 9. 22. 01:12

Unit 21. 논리 연산자

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int num1, num2;

    scanf("%d %d", &num1, &num2);

    printf("%s\n", num1 && num2 ? "참" : "거짓");
    printf("%s\n", num1 || num2 ? "참" : "거짓");
    printf("%s\n", !num1 ? "참" : "거짓");

    return 0;
}

&&는 and를 ||는 or을 !은 반대를 의미한다.

 

 

Unit 22. 불 자료형

#include <stdio.h>
#include <stdbool.h>

int main()
{
    bool b1 = false;
    bool b2 = true;

    if (b1 != true)
            printf("참\n");
    else
            printf("거짓\n");

    printf("%s\n", b2 == false ? "참" : "거짓");

    return 0;
}

bool 자료형은 true와 false로 구분된다.

 

 

Unit 23. 비트 연산자

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    unsigned int num1, num2;

    scanf("%d %d", &num1, &num2);

    printf("%u\n", num1 ^ num2);
    printf("%u\n", num1 | num2);
    printf("%u\n", num1 & num2);
    printf("%u\n", ~num1);

    return 0;
}

XOR, OR, AND, NOT

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    unsigned long long num1;

    scanf("%llu", &num1);

    printf("%llu\n", num1 << 20 >> 4);

    return 0;
}

왼쪽으로 20 시프트, 오른쪽으로 4 시프트

 

 

Unit 24. 비트 연산자 응용

#define __USE_MINGW_ANSI_STDIO 1 // Dev-C++(MinGW)에서 %hhu를 사용하기 위한 설정
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    unsigned char flag = 16;
    unsigned char num1, num2;

    scanf("%hhu %hhu", &num1, &num2);

    flag |= num1 << 3;
    flag &= ~(num2 >> 2);
    flag ^= 1 << 7;

    printf("%u\n", flag);

    return 0;
}

왼쪽으로 3시프트 키고, 오른쪽으로 2시프트 끄고,

1자리를 8비트에 맞춰서 한다.

 

Unit 25. 연산자 우선순위

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int num1;
    int num2;
    int num3;

    scanf("%d %d %d", &num1, &num2, &num3);

    printf("%d\n", (num1 + num2)*10 - num3);

    return 0;
}

 

 

Unit 26. switch

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    char memu;

    scanf("%c", &memu);

    switch (memu)
    {
        case 'f':
            printf("환타");
            break;
        case 'c':
            printf("콜라");
            break;
        case 'p':
            printf("포카리스웨트");
            break;
        default:
            printf("판매하지 않는 메뉴");
            break;
    }

    return 0;
}

 

 

Unit 27. for

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    char text1;

    scanf("%c", &text1);

    for (int i=0; text1+i<= 'z'; i++)
        printf("%c", text1+i);

    return 0;
}

a부터 z까지이기 때문에 부등호 있는 <= 연산자를 사용한다.

 

 

Unit 28. while

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int balance;

    scanf("%d", &balance);

    while (balance >= 1200)
    {
        balance -= 1200;
        printf("%d\n", balance); 
    }
        
    return 0;
}

while 함수 내에 변화식을 작성해준다.

 

 

Unit 29. do while

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    unsigned int num1;
    unsigned int sum = 0;

    scanf("%d", &num1);

    unsigned int i = 0;
    do
    {
        sum += i;
        i++;
    } while (i <= num1);

    printf("%d\n", sum);

    return 0;
}

 

 

Unit 30. break, continue

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int num1;
    int num2;
    int i;

    scanf("%d %d", &num1, &num2);

    i = num1;

    while (1)
    {

        if (i > num2)
            break;

        if (i % 10 == 7)
        {
            i++;
            continue;
        }
            
        printf("%d ", i);
        i++;
    }

    return 0;
}

10으로 나눈 나머지가 7이면 그냥 ++해주고 continue!

 

 

Unit 31. 계단식

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int num1;

    scanf("%d", &num1);

    for (int i = 1; i <= num1; i++)
    {
        for (int j = i; j < num1; j++)
        {
            printf(" ");
        }

        for (int j = 0; j < (i * 2) - 1; j++)
        {
            printf("*");
        }

        printf("\n");
    }

    return 0;
}

j가 입력받은 값보다 작을때 공백으로,

j가 i값 (i*2)-1보다 작을때 *로

이렇게하면 1,3,5보다 작은만큼 별이 출력되어

산 모양의 형태가 된다.

 

 

 

Unit 32. goto

#include <stdio.h>

int main()
{
    int num1 = 0;

    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if (num1 == 10)
                goto EXIT2;

                num1++;
        }
    }

EXIT1:
    printf("100\n");

EXIT2:
    printf("200\n");

EXIT3:
    printf("300\n");

    return 0;
}

 

 

Unit 33. FizzBuzz

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int num1, num2;

    scanf("%d %d", &num1, &num2);

    for (int i=num1; i<=num2; i++) 
    {
        if ((i % 5 == 0) && (i % 11 == 0))
            printf("FizzBuzz\n");
        else if (i % 5 == 0)
            printf("Fizz\n");
        else if (i % 11 == 0)
            printf("Buzz\n");
        else
            printf("%d\n", i);
    }

    return 0;
}

 

 

Unit 34. 포인터

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int *numPtr1;
    int **numPtr2;
    int num1;

    scanf("%d", &num1);

    numPtr1 = &num1;
    numPtr2 = &numPtr1;
    
    printf("%d\n", **numPtr2);

    return 0;
}

중첩 포인터를 사용한건데,

num1에 10이 입력되면 &num1을 가리키게 되고,

numPtr1을 접근시킨다음에 10을 저장한다.

그다음 numPtr2를 접근시키고 값이 저장된 &연산자를 불러온다.

마지막에 **numPtr2로 역참조를 해서 값을 불러온다.

 

 

Unit 35. 메모리 사용

변수는 스택에, malloc 함수는 힙에 저장된다.

이때, 스택과 힙의 가장 큰 차이점은 메모리 해제다.

malloc 함수에 선언된 메모리는 해제해주어야 한다.

free(포인터); 와 같은 방법으로 해제한다.

이러한 해제를 해주지 않으면 메모리 누수(memory leak)가

발생하게 된다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int num1;
    int num2;

    int *numPtr1 = malloc(sizeof(int));
    int *numPtr2 = malloc(sizeof(int));

    scanf("%d %d", &num1, &num2);

    *numPtr1 = num1;
    *numPtr2 = num2;

    printf("%d\n", *numPtr1 + *numPtr2);

    free(numPtr1);
    free(numPtr2);

    return 0;
}

 

 

Unit 36. 배열 사용

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int numArr[5];
    int smallestNumber;

    scanf("%d %d %d %d %d", &numArr[0], &numArr[1], &numArr[2], &numArr[3], &numArr[4]);
    
    smallestNumber = numArr[0];

    for (int i = 1; i < sizeof(numArr) / sizeof(int); i++)
    {
        if (smallestNumber > numArr[i])
            smallestNumber = numArr[i];
        else
            smallestNumber = smallestNumber;
    }
    
    printf("%d\n", smallestNumber);

    return 0;
}

 

 

Unit 37. 2차원 배열

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int matrix[5][5];

    scanf("%d %d %d %d %d",
        &matrix[0][0], &matrix[0][1], &matrix[0][2], &matrix[0][3], &matrix[0][4]);
    scanf("%d %d %d %d %d",
        &matrix[1][0], &matrix[1][1], &matrix[1][2], &matrix[1][3], &matrix[1][4]);
    scanf("%d %d %d %d %d",
        &matrix[2][0], &matrix[2][1], &matrix[2][2], &matrix[2][3], &matrix[2][4]);
    scanf("%d %d %d %d %d",
        &matrix[3][0], &matrix[3][1], &matrix[3][2], &matrix[3][3], &matrix[3][4]);
    scanf("%d %d %d %d %d",
        &matrix[4][0], &matrix[4][1], &matrix[4][2], &matrix[4][3], &matrix[4][4]);

    for (int i = 0; i < sizeof(matrix[0]) / sizeof(int); i++)
    {
        for (int k = 0; k < sizeof(matrix) / sizeof(matrix[0]); k++)
        {
            printf("%d ", matrix[k][i]);
        }
        printf("\n");
    }
    
    return 0;
}

 

 

Unit 38. 포인터와 배열 응용

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {

    int num1;

    scanf("%d", &num1);

    int **matrix = malloc(sizeof(int*) * num1);

    for (int i = 0; i < num1; i++) 
    {
        matrix[i] = malloc(sizeof(int) * num1);
        for (int j = 0; j < num1; j++) 
        {
            matrix[i][j] = 0;
        }
    }

    for (int i = 0; i < num1; i++) 
    {
        matrix[i][i] = 1;
    }

    for (int i = 0; i < num1; i++) 
    {
        for (int j = 0; j < num1; j++) 
        {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }


    for (int i = 0; i < num1; i++) {
        free(matrix[i]);
    }
    free(matrix);

    return 0;
}

모든 배열의 값이 0으로 초기화 된 다음,

[0][0], [1][1] ... 대각선으로 행렬을 만들어준다.

 

 

Unit 39. 문자열

#include <stdio.h>

int main()
{
    
    char s1[] = "Beethoven\n9th\nSymphony";

    printf("%s\n", s1);

    return 0;
}

 

 

Unit 40. 입력 값 저장

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *s1 = malloc(sizeof(char) * 30);
    char *s2 = malloc(sizeof(char) * 30);
    char *s3 = malloc(sizeof(char) * 30);
    char *s4 = malloc(sizeof(char) * 30);

    scanf("%s %s %s %s", s1, s2, s3, s4);
    
    printf("%s\n%s\n%s\n%s\n", s1, s2, s3, s4);

    free(s1);
    free(s2);
    free(s3);
    free(s4);

    return 0;
}

 

화이팅..!