코딩일지(2023-12-29)
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
위 코드에서는 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
반복문에서 참일때의 실행이 한줄이면, 중괄호를 써주지 않아도 된다.
예를 들어 다음과 같은 코드가 있으면,
if (count > 0)
{
count++;
}
아래와 같이 치환이 가능하다.
if (count > 0); count++;
반대 다음과 같은 코드가 있으면,
if (count > 0); count++;
아래와 같이 치환이 가능하다.
if (count > 0)
{
;
}
count++;
즉 세미콜론(;)하나 더 붙여서 쓸모없는 코드가 되어버렸다.
원래 테트리스를 c언어로 구현해본다거나, 또는 인터럽트와 멀티스레드 등을 이용해서 자동차의 제어시스템을 구현해본다던가 해볼려고 했는데,
좀더 쉬운 프로젝트로 [raspberry pi configuration]를 흉내내보는 것도 괜찮지 않을까 하는 생각이 든다.
그리고 이거 하는 김에 백준문제도 C언어로 같이 풀어보는게 좋을 것 같다.
[백준] 10926번: ??! [C / C++]
런타임에러(NZEC)
아래코드에서 에러가 떴다.
일단 우리가 배운 상식으로는 에러가 뜰거라고 생각할 수 있는데, 그 에러가 뭔지 알아보자!
일단 syntax error는 아니다. 결론부터 말하자면 runtime error이다.
(런타임에러와 신택스에러의 차이를 아직은 잘 모르지만, 나중에 더 알아봐야 겠다.)
NZEC란, Non Zero Exit Code의 약자로 프로그램이 종료될때, exit code라는 것을 반환하게 되는데, 그게 반환되지 않았다는 것이다. 그래서 컴파일러 쪽이는 디버거 쪽이든, 어딘지는 잘 모르겠지만, 코드를 돌리는 쪽에서 탈출코드를 받지 못해서 정상적으로 종료하지를 못했다는 뜻이다.
사실 visual studio에서 <pre>return 0;</pre>를 해주지 않아도 알아서 해당 코드를 넣고 돌리는데, 일단 엄격히 따지면 개발자 딴에서 넣어주는게 맞는거다.
한가지 문제가 생겼다….
결론부터 보면 내가 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()에서 걸려버렸다ㄷㄷ. 중간고사때는 신중하자!)
댓글남기기