2 분 소요

double과 float, 그리고 %f와 %lf

float로 선언할때는 %f를, double로 선언할 때는 %lf를 사용해야 한다.

※Code

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

int main() {
    double base, exponent, result;

    //사용자로부터 밑(base)과 지수(exponent) 입력받기
    printf("밑(base)를 입력하세요: ");
    scanf("%.1f", &base);
    
    printf("지수(exponent)를 입력하세요: ");
    scanf("%.1f", &exponent);

    //pow() 함수를 사용하여 거듭제곱 계산
    result = pow(base, exponent);

    //결과 출력
    printf("%.2f의 %.2f의 거듭제곱은 %.2f입니다.\n", base, exponent, result);

    return 0;
}

※Output

image-20231229100008258

위 코드에서는 double로 선언되었음에도 형식지정자를 %.1f로 써서 소수자리가 제대로 처리가 되지 않은 것 같다.(확실한 이유는 모르겠지만 그냥 받아들이도록 하자)

이번에는 형식지정자를 다시 %lf로 정정해주겠다.

※Code

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

int main() {
    double base, exponent, result;

    //사용자로부터 밑(base)과 지수(exponent) 입력받기
    printf("밑(base)를 입력하세요: ");
    scanf("%lf", &base);
    
    printf("지수(exponent)를 입력하세요: ");
    scanf("%lf", &exponent);

    //pow() 함수를 사용하여 거듭제곱 계산
    result = pow(base, exponent);

    //결과 출력
    printf("%lf의 %lf의 거듭제곱은 %lf입니다.\n", base, exponent, result);

    return 0;
}

※Output

image-20231229100501523

반복문에서 참일때의 실행이 한줄이면, 중괄호를 써주지 않아도 된다.

예를 들어 다음과 같은 코드가 있으면,

if (count > 0)
{
    count++;
}

아래와 같이 치환이 가능하다.

if (count > 0); count++;

반대 다음과 같은 코드가 있으면,

if (count > 0); count++;

아래와 같이 치환이 가능하다.

if (count > 0)
{
    ;
}
count++;

즉 세미콜론(;)하나 더 붙여서 쓸모없는 코드가 되어버렸다.

원래 테트리스를 c언어로 구현해본다거나, 또는 인터럽트와 멀티스레드 등을 이용해서 자동차의 제어시스템을 구현해본다던가 해볼려고 했는데,

좀더 쉬운 프로젝트로 [raspberry pi configuration]를 흉내내보는 것도 괜찮지 않을까 하는 생각이 든다.

그리고 이거 하는 김에 백준문제도 C언어로 같이 풀어보는게 좋을 것 같다.

[백준] 10926번: ??! [C / C++]

image-20231229133545660

런타임에러(NZEC)

아래코드에서 에러가 떴다.

image-20231229132418157

일단 우리가 배운 상식으로는 에러가 뜰거라고 생각할 수 있는데, 그 에러가 뭔지 알아보자!

일단 syntax error는 아니다. 결론부터 말하자면 runtime error이다.

(런타임에러와 신택스에러의 차이를 아직은 잘 모르지만, 나중에 더 알아봐야 겠다.)

NZEC란, Non Zero Exit Code의 약자로 프로그램이 종료될때, exit code라는 것을 반환하게 되는데, 그게 반환되지 않았다는 것이다. 그래서 컴파일러 쪽이는 디버거 쪽이든, 어딘지는 잘 모르겠지만, 코드를 돌리는 쪽에서 탈출코드를 받지 못해서 정상적으로 종료하지를 못했다는 뜻이다.

사실 visual studio에서 <pre>return 0;</pre>를 해주지 않아도 알아서 해당 코드를 넣고 돌리는데, 일단 엄격히 따지면 개발자 딴에서 넣어주는게 맞는거다.

한가지 문제가 생겼다….

image-20231229133444403

결론부터 보면 내가 C언어의 삼중자 개념을 몰랐기 떄문에 틀린 문제인 것이다.(이건 또 뭐야??? 왜 이런게 있는거야ㄷㄷㄷ)

c++이후의 언어들에 대해서는 삼중자가 제거되었는데, 그 이전에 있었던 중세시대, 아니 옛날 고대언어인 C언어에는 삼중자를 엄격히 지켜야 한다.ㄷㄷ

잘 모르겠다면 MS_DOCS를 보자(링크)

예를 들어, 아래 코드를 출력한다면 있는 그대로 착!각! 할 수 있다.

printf("What??!\n");

실제로는 출력은 "What|"으로 출력된다. "|"이라는 특수문자로 변환된 것이다.

자세한 것은 <table>을 참고하자.

삼중자 문장 분호 문자
??= #
??/ \
??( [
??) ]
??’ ^
??< {
??> }
??! |
??- ~
삼중자 문장 분호 문자
??= #
??/ \
??( [
??) ]
??' ^
??< {
??> }
??! \|
??- ~

암튼 이런게 있단다 ㅋㅋㅋ

그래서 올바른 답은 다음과 같다.

#include <stdio.h>
int main(void) {
    char id[50];             // 1. 크기가 50인 char형 배열 선언
    scanf("%s", id);         // 2. 입력받은 문자열을 id에 저장
    printf("%s?\?!", id);    // 3. 입력받은 id와 "??!"를 붙여서 출력
    //    (문자열을 출력하므로 서식문자는 %s 사용)
    //    ("??!"는 삼중자이므로 물음표 사이에 이스케이프문자 삽입)
    return 0;
}

아 근데 추가적으로 백준에서는 #define _CRT_SECURE_NO_WARNINGS를 안넣어줘도 컴파일러가 제대로 돌아간다. 참고하자.

실습4-1

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int x=0,y=0;             
    scanf("%d %d", x,y);       

    
    if (x > 0)
    {
        if (y > 0)
        {
            printf("1");
        }
        else if (y < 0)
        {
            printf("4");
        }

    }
    else if (x < 0)
    {
        if (y > 0)
        {
            printf("2");
        }
        else if (y < 0)
        {
            printf("3");
        }
    }
    
    return 0;
}

위 코드에서는 널포인터 엔러가 떴는데, 자세히 보니 scanf()의 기본원칙인 주소값에 넣어주는 짓을 해주지 않았다. &x, &y로 고치자.

실습4-2

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

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

    if (t >= 25)
    {
        printf("반팔 티셔츠를 추천합니다.");
    }
    else if (t > 15)
    {
        printf("긴팔 티셔츠를 추천합니다.");
    }
    else if (t > 5)
    {
        printf("자켓을 추천합니다.");
    }
    else 
    {
        printf("코트를 추천합니다.");
    }
    
    
    return 0;
}

처음 짠 위코드에도 문제가 있다. scanf()에서 ““사이에 띄어쓰기를 넣었기 때문이다. scanf()에서 화이트스페이스(공백)은 매우 민감한 문제이다.(또 scanf()에서 걸려버렸다ㄷㄷ. 중간고사때는 신중하자!)

댓글남기기