-목차-
1. C Standard Library
2. reference page 살펴보기
3. Type Casting/Conversion Operator
4. 문자 입출력 함수 getchr(), putchar()
1. C Standard Library ( C언어에서 기본적으로 사용할 수 있는 서비스 함수의 집합 )
※ Dev-cpp의 MinGW64 폴더 안에..
- include 폴더에는 표준 라이브러리 함수 헤더(프로토타입/선언)파일이 있음
- 해당 library 서비스 함수의 definition은 미리 compile되어 object 파일로 lib 폴더 내에 저장됨
- Library 속 함수들의 설명서인 reference를 이용하는 습관은 프로그래밍 역량 배양에 중요함
- reference 즐찾하고 상시 활용하자!! (https://en.cppreference.com/w/)
ex) math.h
# include <stdio.h>
# include <math.h>
int main(void){
double x = 3.0;
double y, z;
y = log(x);
x = exp(x);
printf("log(x)=%f, exp(x)=%f\n",y,z);
return 0;
}
- 모든 함수는 그 사용 이전에 prototype 또는 definition이 필요하기에 #include <math.h>를 통해 math.h의 exp(), log() 함수의 정의를 불러오자.
2. reference page 살펴보기
ex) rand 함수의 reference
① 함수가 어떤 헤더파일에 선언되어있는지 나타냄
② 함수 작성 형식
③ 함수에 대한 개괄적 설명
④ 함수 인자 정보
⑤ 함수의 반환값 정보
⑥ 함수 부가정보
⑦ 예제코드
⑧ 표준 문서 및 참고 문헌
⑨ 함수와 관련된 다른 함수나 MACRO
+) rand( ), srand( ) 함수들로 [0,1] 사이의 실수값을 무작위로 출력해보자
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i;
float ranval;
double uranval;
srand(time(0)); // 현재 시간을 기준으로 하기에 무작위값을 매번 다르게 구함
for (i=0;i<10;i+=1){
ranval = rand(); // 0~RAND_MAX까지의 무작위값
uranval = ranval/RAND_MAX; // 0~1까지의 무작위값
printf("Uniform random value on [0,1] : %f\n",uranval);
}
return 0;
}
3. Type Casting/Conversion Operator
※ 변수값의 Type을 변경시키는 것
1. 묵시적 타입 변경 (컴파일러가 함)
- 묵시적 확대 대입
#include <stdio.h>
int main(void){
int n = 2;
double r = 3.14;
r = n; // 묵시적 확대 대입
return 0;
}
- 묵시적 축소 대입
#include <stdio.h>
int main(void){
int n = 2;
double r = 3.14;
n = r;
return 0; // 묵시적 축소 대입, 정보의 손실 발생 가능
}
2. 명시적 타입 변경 (type casting operator)
#include <stdio.h>
int main(void){
int a = 2, b = 4;
double r;
r = (double)a/b; // 명시적 타입 변경
return 0;
}
- 참고로 명시적 타입 변경은 우선선위가 제일 높음
ex) 주사위 던지기 모의 실험
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define N_DICE 10
double urand(void){
return (double)rand()/(RAND_MAX+1); // 명시적 확대 대입
// RAND_AMX + 1을 안나눠주면 주사위값으로 7이 나올 수 있음
}
int main(void) {
int i,diceval;
srand(time(0));
for (i=0;i<10;i+=1){
diceval = (int)(urand()*6)+1;
printf("%dth Dice Value : %d\n",i,diceval);
}
return 0;
}
- urand라는 함수를 통해 반환값을 0~1로 잡는다.
- diceval 변수를 통해 주사위값이 1~6 사이의 숫자가 나타나도록 한다.
ex) 주사위 1개를 던졌을 때 나오는 수의 확률이 정말 1/6인가..??
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define N_DICE 1000000
double urand(void){
return (double)rand()/(RAND_MAX+1);
}
int main(void) {
int i,diceval;
int N[6] = {0,0,0,0,0,0};
double P[6];
srand(time(0));
for (i=0;i < N_DICE;i+=1){
diceval = (int)(urand()*6)+1;
N[diceval-1] += 1;
}
for (i=0;i<6;i+=1){ // 1/6 = 0.1666......에 근사하는가
P[i] = (float)N[i]/N_DICE;
printf("Pr(Dice=%d) == %f\n",(i+1),P[i]);
}
return 0;
}
- 위의 코드를 통해 알아보자.
ex) Monte-Carlo Simulation을 통해 파이값을 구해 보자
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define N_MAX 1000000
int main(void) {
double monte_pi, x, y;
int num_in = 0, num_out = 0;
int n, i;
srand(time(0));
scanf("%d",&n);
for (i=0; i < n; i+=1){
x = (double)rand()/RAND_MAX;
y = (double)rand()/RAND_MAX;
if ((x*x + y*y) <= 1){
num_in += 1;
} else {
num_out += 1;
}
}
monte_pi = (double)num_in/n*4; // (원의 넓이 : 파이/4) = (찍힌 점 : num_in / n)
printf("Monte-Carlo PI = %.20f, (Number of Sample : %d)\n",monte_pi,n);
return 0;
}
4. 문자 입출력 함수 getchar( ), putchar( )
○ getchar( ), putchar( ) : 문자 입출력
※ int getchar(void)
- param : 없음
- description : 사용자로부터 문자를 표준입력(standard input)으로 받는 함수
- return : 성공시 읽어드린 문자 한 개를 아스키코드값으로 변환하여 반환하고 실패시 EOF
※ int putchar(int ch)
- param : 문자의 아스키코드값(정수형태로)
- description : 매개변수로 들어온 문자 ch를 표준출력(standard output)으로 출력해주는 함수
- return : 성공시 ch값을 문자로 출력, 실패시 EOF 반환 및 오류 표시자 설정
#include <stdio.h>
int main(void) {
int ch;
while( (ch=getchar()) != EOF){
putchar(ch);
}
return 0;
}
- EOF(ctrl + z)가 입력되기 전까지 계속 코드가 진행된다.
+) printf( )의 이해
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i, ranval;
printf("+-----------------------------+\n");
printf("|123456|123456|123456|12345678|\n");
printf("+-----------------------------+\n");
srand(time(0));
for (i=0; i<10; i+=1){
ranval = rand();
printf("|%-6d",ranval);
printf("|0x%04x",ranval);
printf("|0o%06o\n|\n",ranval);
}
printf("+-----------------------------+\n");
return 0;
}
- %-6d : 왼쪽부터 6개의 숫자만 출력
- %04x : 길이가 4, 나머지 부분은 0으로 채우는 16진수 출력
- %06o : 길이가 6, 나머지 부분은 0으로 채우는 8진수 출력
'CS > C, C++' 카테고리의 다른 글
[C/C++] 08 - 1 포인터 개념 (0) | 2021.11.12 |
---|---|
[C/C++] 07 - 3 함수와 모듈러 프로그래밍 (0) | 2021.11.02 |
[C/C++] 07 - 1 함수와 변수, 함수인자 (0) | 2021.10.27 |
[C/C++] 03 - 2 반복문과 배열 기초 (0) | 2021.10.17 |
[C/C++] 03 - 1 제어 구조와 조건문 기초 (0) | 2021.10.17 |