0. 문제
ⅰ. 파이 값 계산하기
■ π2/12 = ∞∑n=1((-1)n+1/n2)임을 이용하여 π의 근사값을 소수점 8자리까지 표시하라.
ⅱ. 해결 코드 (C 스타일)
#include <stdio.h>
#include <math.h>
int main()
{
double p = 0;
for(int n = 1; n < 100001; n++) {
p += pow(-1,n+1)/pow(n,2);
}
p = sqrt(12*p);
printf("%.8f \n",p);
return 0;
}
ⅲ. 해결 코드 (C++ 스타일)
#include <iostream>
#include <iomanip>
//setprecision() 함수 정의
#include <math.h>
using namespace std;
int main()
{
double p = 0;
for(int n = 1; n < 100001; n++) {
p += pow(-1,n+1)/pow(n,2);
}
p = sqrt(12*p);
streamsize prec = cout.precision();
//기본 정밀도 저장
cout.precision(8); //정밀도 지정
cout << fixed << p << endl;
//소수점 고정 (정밀도가 소수점 이하의 자리수에만 영향을 주도록함)
cout << setprecision(prec); //기본 정밀도로 복원
return 0;
}
■ cout 객체의 메소드와 C++의 iostream에 대한 내용은 추후에 다룰 예정.
1. printf/scanf의 형식문자열(format string)
ⅰ. 형식 문자열(format string)의 형태
■ 형식 문자열은 printf나 scanf의 첫번째 인수인 문자열에 포함되어, 두번째 이후의 인수를 어떻게 표현할지를 지정한다.
■ 형식 문자열은 항상 %로 시작한다.
■ 그렇기 때문에 printf함수에서 %문자를 그대로 표시하려면 %%라고 표시해야한다.
■ %[flags][width][.precision][size]type
■ flags : [optional] 출력 양쪽 맞춤, 기호, 공백 등을 지정하는 기호.
■ width : [optional] 변환 사양에 의해서 출력될 최소 문자 수. 1이상인 10진수로 표시한다.
■ precision : [optional] 변환 사양에 의해서 출력될 전체 문자 수. .(온점)과 1이상인 10진수로 표시한다.
■ size : [optional] 형식 지정자에 대한 인수 길이 한정자.
■ type : 형식 지정자
ⅱ. 형식 지정자(type)
■ 형식 지정자는 필수요소이며 변환사양의 맨 마지막
■ c : 문자 인수 // 단일 바이트 문자를 지정(printf 기준)
■ C : 문자 인수 // 와이드 문자를 지정(printf 기준)
■ d, i : 정수 인수 // 부호 있는 10진 정수
■ u : 정수 인수 // 부호 없는 10진 정수
■ o : 정수 인수 // 부호 없는 8진수 정수
■ x, X : 정수 인수 // 부호 없는 16진수 정수 x : "abcdef" 사용 X : "ABCDEF" 사용
■ e/nan/inf는 형식 지정자를 소문자로 쓰면 소문자로 표시되고, 대문자로 쓰면 대문자료 표시됨.
■ e, E : 실수 인수 // 지정된 실수를 [-]d.dddd ± dd 형식의 10진수 지수표기법으로 표기.
■ f, F : 실수 인수 // 지정된 실수를 고정형 숫자 표기법으로 표기.
■ g, G : 실수 인수 // 지정된 실수의 지수가 e-5 이하이면 지수표기법으로 아니면 고정형 숫자 표기법으로 표기.
■ a, A : 실수 인수 // 지정된 실수를 [-]0xh.hhhh ± dd 형식의 16진수 지수표기법으로 표기.
■ p : 포인터 인수 // 인수의 주소를 16진수로 표시
■ s, S : 문자열 인수 // 단일바이트 또는 멀티바이트 문자열을 지정
■ 관련 예제 코드와 결과 화면
#include <stdio.h>
int main()
{
char c = 'c';
printf("문자표시('c')\n");
printf("%%c: %c, %%C: %C \n",c, c);
printf("\n");
int i = -123;
printf("정수표시(-123)\n");
printf("%%d: %d, %%i: %i \n",i, i);
printf("\n");
unsigned int u = 123;
printf("부호없는 정수표시(123)\n");
printf("%%o:%o \n%%u:%u \n", u, u);
printf("%%x:%x %%X:%X \n", u, u);
printf("\n");
double d = 1.123456;
printf("실수표시 (1.123456)\n");
printf("%%e:%e, %%E:%e\n",d,d);
printf("%%f:%f, %%F:%f\n",d,d);
printf("%%g:%g, %%G:%g\n",d,d);
printf("%%a:%a, %%A:%A\n",d,d);
printf("\n");
return 0;
}
ⅲ. 플래그(flags)
■ 플래그 지시자는 선택사항이며 필요에 따라 1개 이상 추가할 수 있다.
■ - : 지정된 필드 너비 내에서 문자열을 좌측 정렬한다. (기본값은 우측 정렬)
■ + : 부호있는 자료형의 부호(+또는 -)를 항상 표시한다. (기본값은 -만 표시)
■ 0 : 최소 너비에 맞게 선행 0을 표시한다.
■ (공백) : 부호있는 자료형을 표시할 때 +대신 공백을 표시한다. +flag와 함께 쓰이면 무시된다.
■ # : 형식지정자 o(8진법)나 0x,0X(16진법)와 함께 쓰일 경우 0 외의 양수에 순서대로 0,0x,0X 접두사를 붙인다.
ⅳ. 너비(width)
■ 너비 사양은 선택 사항이며 출력될 최소 문자수를 지정하는 1이상의 십진수 정수이다.
■ 출력값의 최소 문자수가 너비보다 적을 경우 flag에 따라 0이나 공백으로 채운다.
ⅳ. 정밀도(precision)
■ 정밀도 사양은 선택 사항이며 .(온점)과 뒤의 0이상의 십진수 정수로 나타낸된다.
■ 정밀도 사양은 출력될 문자열 문자 수나 소수 자릿수 또는 유효 자릿수의 수를 지정한다.