3 분 소요

족보정리

[[필기유형][(다음코드의 출력문을 적어라)]]: 증가,감소 연산자 전/후 위치 차이 아는지 묻는 문제

(실기) (1)실수 입력 받아서 정수 부분, 실수 부분 따로 출력하기

(실기) (2)정수 a,b 받고 [a,b]에서 약수가 홀수개인 정수 개수 구하기

(실기) (3)크기 n과 n개의 수 입력받고 등차수열인지 등비수열인지 판단하기

(실기) (4)n과 n개의 수 입력 받고 평균과 표준편차 구하기

(실기) (5)숫자 다이아몬드 출력(ex: 1 121 12321 121 1)

(실기) (6) 정수 n 입력받고 1부터 n^2까지 나선형으로 출력하기

[[필기유형][(다음코드의 출력문을 적어라)]]: 증가,감소 연산자 전/후 위치 차이 아는지 묻는 문제

전위연산자: l-value(ex) ++cnt), 후위연산자: r-value(ex) cnt++)

전위연산자의 경우 값을 1 증가시킨 후 다른작업을 진행한다(우선순위 높음)

후위연산자의 경우 다른 작업을 진행하고 나중에 증가시킨다(우선순위 낮음)

※또 다른 차이(중요!)

1.l-value

int num = 10;

++num = 30;

=>동작과정을 보면, 메모리에 있는 num 객체의 값을 직접 1 증가시킨다.그리고 num객체를 반환한다.(이는 전위연산자가 자기 객체를 반환하며, 주소값을 가지고 있다는 뜻이다.)

2.r-value

int num = 10;

num++ = 30;

후위연산자는 전위와 달리 추가적인 메모리를 필요로 하는데, 이는 후위연산자가 들어가 있는 연산을 진행한 후에, 값을 변화시키기 때문이다.

변화한 값으로 다른 연산을 진행한 후에 가져와야 하기 때문에 추가적인 메모리가 필요하다.

출처:https://m42-orion.tistory.com/68

1.실수 입력 받아서 정수 부분, 실수 부분 따로 출력하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    float n;
    scanf("%f", &n); //n = 3.141592라 하자.
    printf("정수부: %d\n", (int)n);  //정수부: 3
    printf("실수부: %f\n", n - (int)n); //실수부: 0.141592

    return 0;
}

한가지 고찰이있다면, 실수부 출력하는 부분에서 n-(int)n을 할때 첫번째 피연산자가 float 타입이고 두번째 피연산자가 (int)타입이라서 둘다 자료형을 통일시켜줘야 하지 않나? 두번째 피연산자에서 캐스팅을 한번더 해줘서 3.000000이 되도록 해줘야 하는거 아닌가 하는 생각이 들었는데, 연산에서 결과값을 리턴할때 첫번째 핀연산자의 자료형을 그대로 결과값에 반환해주는 것 같다. 이는 예전에 몫을 구하는 상황에서 한번 목격했었다.

a = (float)b/c를 해줄때, b가 float, c가 int라 할때, 첫번째 피연산자 b의 자료형이 a에 반환된다. 즉 a가 float형이 된다는 것을 목격했다. 위에서도 같은 맥락이 적용되는 것 같다.

출처: https://blog.naver.com/tipsware/221287165038

2.정수 a,b 받고 [a,b]에서 약수가 홀수개인 정수 개수 구하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void gdcCount(int n)
{
    int cnt = 0;

    for (int i = 1; i <= n; i++)
    {
        if (n % i == 0)
        {
            cnt++;
        }
    }

    if (!(cnt % 2))
        printf("%d의 약수의 개수는 짝수개 입니다.(%d개)\n", n, cnt);
    else
        printf("%d의 약수의 개수는 홀수개 입니다.(%d개)\n", n, cnt);
}

int main() {
    int a,b;
    scanf("%d %d", &a, &b);
    
    gdcCount(a);
    gdcCount(b);

    return 0;
}

3.크기 n과 n개의 수 입력받고 등차수열인지 등비수열인지 판단하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    int n, p[50];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &p[i]);
    }
    if (p[1] - p[0] == p[3] - p[2])
    {
        printf("%d", p[n - 1] + (p[1] - p[0]));
    }
    else {
        printf("%d", p[n - 1] * (p[1] / p[0]));
    }
    return 0;
}

코드리뷰: 등차수열과 등비수열의 개념과 원형식만 알면 충분히 풀 수 있다.

위 식은 주어진 배열의 값이 등비수열 또는 등차수열일거라 가정하고 접근하고 있다.

따라서 등차수열일 경우, p[1] - p[0] == p[3] - p[2]가 성립하고, 그렇지 않을 경우 등비수열일 것이다.

출처: https://lgana1021.tistory.com/24

4.평균과 표준편차 구하기

5명의 키를 측정하여, 평균과 분산 그리고 표준편차를 구해보자.

image-20240105030510321

코드>

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

#define SIZE 5
int main() {
    int num[SIZE] = {175, 177, 179, 181, 183};
    int sum = 0,denominator=0;
    float mean = 0, var = 0, sd = 0;
    for (int i = 0; i < SIZE; i++)
    {
        sum += num[i];
    }
    printf("sum: %d\n", sum);

    mean = (float)sum / SIZE;
    printf("mean: %.2f\n", mean);

    printf("denominator>>");
    for (int i = 0; i < SIZE; i++)
    {
        int temp;
        temp = pow(num[i] - mean, 2.0);
        printf("%d ", temp);
        denominator += temp;
    }
    var = (float)denominator / SIZE;
    printf("\nvar: %.2f\n", var);
    //standard deviation
    sd = sqrt(var);
    printf("sd: %.2f\n", sd);
    return 0;
}

결과>

image-20240105031434136

출처: https://learnx.tistory.com/entry/%ED%86%B5%EA%B3%84%EC%9D%98-%EA%B8%B0%EC%B4%88%EC%9D%B8-%ED%8F%89%EA%B7%A0-%EB%B6%84%EC%82%B0-%ED%91%9C%EC%A4%80%ED%8E%B8%EC%B0%A8

5.숫자 다이아몬드 출력(ex: 1 121 12321 121 1)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    int n;

    printf("숫자를 입력해주세요 : ");
    scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {
        for (int j = 1; j < n - i; j++)
        {
            printf(" ");
        }
        for (int k = 1; k < i + 1; k++)
        {
            printf("%d", k);
        }
        for (int x = i + 1; x > 0; x--)
        {
            printf("%d", x);
        }
        printf("\n");
    }

    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < i + 1; j++)
        {
            printf(" ");
        }
        for (int k = 1; k < n-i; k++)
        {
            printf("%d", k);
        }
        for (int x = n-i-2; x > 0; x--)
        {
            printf("%d", x);
        }
        printf("\n");
    }
    return 0;
}

출처: https://m.blog.naver.com/wook1379/150005637582

6.정수 n 입력받고 1부터 n^2까지 나선형으로 출력하기

코드>

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    int a[15][15] = { 0, };
    int num = 1, x = 0, y = 0;
    int i, k, j;
    int size, sign = 1;

    printf("크기를 입력해주세요(MAX 14) : ");
    scanf("%d", &size);

    for (k = 0; k < size; ++k) {
        a[y][x] = num++;
        x += sign;
    }
    x -= 1;
    for (i = size - 1; i > 0; --i) {
        for (j = 0; j < i; j++) {
            y += sign;
            a[y][x] = num++;
        }
        sign *= -1;
        for (j = 0; j < i; j++) {
            x += sign;
            a[y][x] = num++;
        }
    }

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

    return 0;
}

결과>

image-20240105045658463

출처: https://wnsdyd0807.tistory.com/1

※띵언

(isCaffeine())?while(true){ continue; }:0;

카페인이 있다면 무한히 할 수 있다

댓글남기기