리메이크 중/C,C++ 실습 중심

C(&C++) 실습 4. pi값 계산해서 표시하기 (printf/scanf의 형식문자열)

라이피 (Lypi) 2021. 6. 7. 16:00
반응형


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이상의 십진수 정수로 나타낸된다.

■ 정밀도 사양은 출력될 문자열 문자 수나 소수 자릿수 또는 유효 자릿수의 수를 지정한다.


 

반응형