[C언어 강좌] #2-2 printf 로 마음대로 출력하기


실수 표기하기

#include <stdio.h>
int main(){
	float a = 0.5;
	printf("10진수 정수 : %d \n", a);
	printf("10진수 정수 : %f \n", a); //6자리까지 표기 
	printf("10진수 정수 : %lf \n\n", a);
	
	printf("소수점 6자리 초과 %%f : %f \n", 0.1234567);
	printf("소수점 6자리 초과 %%lf : %lf \n\n", 0.1234567);
	
	printf("소수점 6자리 초과 %%f : %f \n", 0.123456456);
	printf("소수점 6자리 초과 %%lf : %lf \n", 0.123456456);
	return 0;	
}

10진수 정수 : 0
10진수 정수 : 0.500000
10진수 정수 : 0.500000

소수점 6자리 초과 %f : 0.123457
소수점 6자리 초과 %lf : 0.123457

소수점 6자리 초과 %f : 0.123456
소수점 6자리 초과 %lf : 0.123456

--------------------------------
Process exited after 0.3797 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

% f와 % lf는 실수(소수)를 출력할 때 사용합니다.

lf는 double 형, 이것보다 더 큰 것은 % Lf (long double)입니다.

일단은 커질수록 정확도와 표현 범위가 커진다고 이해하시면 됩니다.

 

 

그리고

float a = 0.5

가 궁금하신 분들이 계실 건데요. 아직 설명은 하지 않았지만 변수를 이용한 겁니다.

변수는 말 그대로 변하는 수로 데이터를 담을 수 있는 상자입니다.

a라는 float(실수형)의 변수에 0.5라는 값을 넣고% lf와 % f를 이용해 출력한 겁니다.

 

float a = 0.5
printf("10진수 정수 : %i \n", a);
    
10진수 정수 : 0

0.5를 % i(=%d)로 출력하면 0이 출력됩니다.

	printf("소수점 6자리 초과 %%f : %f \n", 0.1234567);
    소수점 6자리 초과 %f : 0.123457
    
	printf("소수점 6자리 초과 %%lf : %lf \n\n", 0.1234567);
    소수점 6자리 초과 %lf : 0.123457
	
	printf("소수점 6자리 초과 %%f : %f \n", 0.123456456);
    소수점 6자리 초과 %f : 0.123456
    
	printf("소수점 6자리 초과 %%lf : %lf \n", 0.123456456);
    소수점 6자리 초과 %lf : 0.123456

 

그리고 출력을 보시면 알겠지만 f와 lf 모두 소수점 6자리가 넘어가면 끝자리에서 반올림이나 내림이 적용되어

정확성이 떨어지게 됩니다.

 

%d, %i 10진수 정수 (+, - 둘다가능)
%x, %o 16진수 정수 , 8진수 정수 (+ 만 가능)
%f, %lf, %Lf 10진수 실수 (+, - 둘다 가능)
%c 한개의 문자
%s 문자열 (string)
%u 10진수 정수(+ 만 가능)
%e e 표기법에 의한 실수
%E E 표기법에 의한 실수
%g 소수점 이하 자리 수에 따라 %f, %e 둘중 하나를 선택
%G 소수점 이하 자리 수에 따라 %f, %E 둘중 하나를 선택
%% %기호 출력

% f를 직접 printf 하기 위해 %% 기호를 이용했습니다.

저번 편 표를 가져왔으니 모르시겠으면 참고해주세요 ^^

 

#include <stdio.h>
int main(){
	printf("d를 대문자로 하면 %c~ \n", 'D');
	printf("%s %i\n", "윾읶한 파일의 C언어 강의", 20191101);
	printf("%s%s", "문자열", "붙이기");
	return 0;	
}

d를 대문자로 하면 D~
윾읶한 파일의 C언어 강의 20191101
문자열붙이기
--------------------------------
Process exited after 0.021 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

 

다음은 여러 서식 문자를 이용하여 출력하는 예시입니다.

굳이 이렇게 출력할 필요는 없겠지만 이런 식으로 사용한다는 것을 알아두시면 되겠습니다.

 

표기의 한계

#include <stdio.h>
int main(){
	printf("%d \n", 2147483647);
	printf("%d \n", 2147483647+1); //오버플로우 발생
	printf("%u \n", 2147483647 * 2); //표현가능
	printf("%u \n", -1 * 2147483647 * 2); //표현불가 
}

2147483647
-2147483648
4294967294
2

--------------------------------
Process exited after 0.0227 seconds with return value 3
계속하려면 아무 키나 누르십시오 . . .

 

% d와 % i로 출력할 수 있는 int 값은 한계가 있습니다 2147483647을 기점으로 수가 넘어가게 되면 오버플로우가 발생하여 이상한 음수 값이 나옵니다. 말 그대로 표현할 수 있는 한계를 넘어 넘쳤다(OverFlow)라는 겁니다.

% u를 이용하면 % d의 출력 값의 2배를 출력할 수 있지만 음수는 출력 불가능합니다.

 

지수 표기법

e+n 10의 n제곱
e-n 10의 -n제곱

e표기법을 이용해 큰 수를 좀 더 보기 편하게 나타낼 수 있습니다.

ex) 100e+35 -> 100 x (10 ^ 35)

계산기에서 계산을 할 때 큰 수가 나오면 e가 나오기 시작하는데 이게 바로 지수 표기법입니다.

#include <stdio.h>
int main(){
	float a = 1.5;
	printf("e표기법 : %e \n", a);
	printf("E표기법 : %E \n", a);
	printf("------6자리초과------\n");
	
	printf("e표기법 : %e \n", 0.0000123457);
	printf("E표기법 : %E \n", 0.0000123457);

	printf("---------------------\n");
	printf("g표기법 : %g \n", a);
	printf("G표기법 : %G \n", a);
	printf("------6자리초과------\n");
	
	printf("e표기법 : %g \n", 0.0000123457);
	printf("E표기법 : %G \n", 0.0000123457);

	return 0;	
}

e표기법 : 1.500000e+000
E표기법 : 1.500000E+000
------6자리초과------
e표기법 : 1.234570e-005
E표기법 : 1.234570E-005
---------------------
g표기법 : 1.5
G표기법 : 1.5
------6자리초과------
e표기법 : 1.23457e-005
E표기법 : 1.23457E-005

--------------------------------
Process exited after 0.03459 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

%e와 %E를 이용해 e 표기법을 사용할 수 있습니다

e와 E는 같다고 보시면 됩니다

 

% g의 경우에는 6자리가 넘어가면 % e로 표기되고

% G의 경우에는 6자리가 넘어가면 % E로 표기됩니다.

 

필드 폭 지정

%010d 필드 폭을 10칸만큼 확보 후 오른쪽 정렬 후
나머지 공백을 0으로 채움
%-10d 필드 폭을 10칸만큼 확보 후 왼쪽 정렬함
%+10d 필드폭을 10칸만큼 확보후 부호 붙임
#include <stdio.h>
int main(){
	printf("%010d \n", 69);
	//10칸 확보후 오른쪽정렬 , 공백 0으로 채움 
	printf("%10d \n", 777);
	//10칸 확보후 오른쪽 정렬 , 공백 채움 x 
	printf("%-10d \n", 777);
	//10칸 확보후 왼쪽정렬
	
	printf("%+10d %+10d \n", 777, -888);
	
	return 0;	
}

0000000069
       777
777
      +777       -888

--------------------------------
Process exited after 0.3802 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

 

소스코드 예제를 따라 하면서 확인해보세요~

 


 

printf( )를 이용한 출력은 여기까지가 끝입니다.

어떤가요? 어려웠나요? 

정말 보는 건 한순간이지만 이 글 쓰는 게 참 고난이네요...

보는데 몇 분도 안 걸리지만 쓰는데 최소 3시간... 

 

다음 시간엔 scanf( )를 이용한 입력받기를 해보겠습니다 ^^

 

COMMENT WRITE