입출력문과 라이브러리 함수
[라이브러리 함수]
- 라이브러리: 미리 작성된 함수들을 모아놓은 것
- ANCI-C에서는 : C언어 문법 + 표준 라이브러리 함수를 정의
- 표준 라이브러리 함수의 종류
입출력 함수 -> #include <stdio.h>
수학 함수 -> #include <math.h>
문자열 및 문자함수 .... 문자를 복사시키고...뭐 기타등등 #include <string.h>
동적 메모리 관리 함수 .... 필요한 양의 메모리를 동적으로 할당 ...#include <mem.h>
기타 함수
[출력함수 printf()]
#include <stdio.h>
main()
{
int a = 10;
float x = 5.5;
printf("a is %d and x is %f. \n, a, x);
}
- 제어문자열
1. 출력할 문자열
2. 출력 인수에 대한 형식 지정자
[출력함수 형식 지정자]
- 정수 형식 지정자
형식지정자 출력 형식 출력 예
%d 10진수(부호있는 정수) -32536
%u 10진수(부호없는 정수) 33000 ....int unsigned x;
%o 8진수 100350 .... 옥탈 -> o
%x 16진수(소문자 a~f 사용) 12fe .... heXa decimal -> x
%X 16진수(대문자 A~F 사용) 12FE
%ld long 자료형 .... long d
%hd short 자료형 .... short d
※ int가 32비트인 겨우에 short 자료형은 %hd, %hu를 사용함
- 실수형식 지정자
형식지정자 출력 형식 출력 예
%f 보통의 실수 표기(지수없음) 123.456000 ....float, double 출력
%e 과학용 표기 (소문자 e사용) 1.23456e+02
%E 과학용 표기 (대문자 E사용) 1.23456E+02
%g %e와 %f 중 더 짧은 표기
%G %E와 %f 중 더 짧은 표기
- 문자/문자열 형식 지정자
형식지정자 출력 형식 출력 예
%c 문자 a .... character
%s 문자열 korea .... string
%% 문자 %를 출력 %
1번
#include <stdio.h>
main()
{
printf("%o %x\n", 500, 500);
}
===결과값===
764 1f4
============
2번
#include <stdio.h>
main()
{
double r = 123.45678;
double s = 12340000.0;
printf("%f %e %g\n", r,r,r);
printf("%f %e %g\n", s,s,s);
}
====결과값====
123.456780 1.2345678e+002 123.457
12340000.000000 1.234000e+007 1.234e+007
==============
3번
#include <stdio.h>
main()
{
printf("%s and 100%%","C language");
}
=== 결과값 ===
C language and 100%
==============
4번
#include <stdio.h>
main()
{
char c = 'A';
printf("%c의 코드: 10진수 %d, 8진수 %o, 16진수 %x", c,c,c);
}
===결과값===
A의 코드: 10진수 65, 8진수 101, 16진수 241fe4
============
연습문제1
다음 두 출력문의 결과값을 비교하시오.
printf("%c %d \n", 'c','c');
printf("%c %d \n", 67, 67);
------------------
#include <stdio.h>
main()
{
printf("%c %d \n", 'C','C');
printf("%c %d \n", 67, 67);
}
====결과값====
C 67
C 67
==============
[입력함수 scanf()]
#include <stdio.h>
main()
{
int a;
float f;
scanf("%d %f", &a, &f); /* 입력 */
printf("%d %f \n", a, f); /* 입력 변수를 출력 */
}
[입력함수 형식 지정자]
- scanf() 형식 지정자
형식지정자 입력자료형 입력 형식 출력 예
%d 정수 10진수 -123
%u 부호없는 정수 10진수 30000
%o 부호없는 정수 8진수 644
%x 부호없는 정수 16진수 5f5a, 5F5A
%ld long 자료형
%hd double 자료형
%f, %e 실수(float) 임의의 실수 표기 1.23, 3.1e-2
%lf, %le 실수(double) 임의의 실수 표기
%c 문자
%s 문자열
[라인버퍼 방식 입력]
- 라인버퍼 방식 입력
키보드에서 [Enter]가 입력될때에 줄 단위로 버퍼에 저장됨
scanf()함수는 버퍼에서 입력받음
입력 12 3.4[enter] 567 a[enter]
버퍼 12 3.4 \n 567 a \n
scanf( ....... ) .... 4개를 입력주면 12 3.4 567 a 가 인풋으로 들어가지만, 2개를 입력주면 12 3.4만 인풋. 나머지는 소멸된다.
- 예제
1. 형식지정자 사이에 공백이 없어도 무방(숫자만 해당)
scanf("%d%f%lf", &i, &f, &d); ....문제는 없으나..
scanf("%d %f %lf", &i, &f, &d); ....권장함
2. (예외) 문자입력 .....입력 a b 인 경우에
scanf("%c %c, &x, &y); .....x = 'a', y = 'b' 입력
scanf("%c%c, &x, &y); ..... x = 'a', y = ' ' 입력
3. 제어문자열에 특별한 경우가 아니면 다른 문자 사용하지 않음
scanf("%d\n",&a); (x) ....잘못된 예
scanf("%d : %f", &i, &f); .... 정수와 실수 사이에 입력 ex) 5 : 12.2 --> 키보드로 입력을 똑같이 해줘라.
[문자 입출력]
- 문자입출력
getchar() 한 문자를 입력하여 반환
putchar(ch) 문자 ch를 출력
char ch; ....... int ch;를 사용하는 것이 더 일반적임
ch = getchar(); ....... 라인 버퍼 방식 입력 사용
putchar(ch);
- getche() 함수 ... 표준 함수가 아니고 일부 PC용 컴파일러 함수
PC용 컴파일러에서 제공하는 함수
문자를 입력한 즉시 프로그램에 입력 됨 ....getchar는 입력을 받으면 라인버퍼안에 저장이 되고 이를 뽑아오는 것이고, getche는 입력을 하는 즉시 반영되고 명령어의 역할은 끝이 난다.
#include <conio.h>
....
ch = getche(); ....즉시입력, 버퍼를 거치지 않는다.
연습문제2
(1) 다음 프로그램을 키보드 입력: ab, abcd, a에 대해 실행해 보시오.
#include <stdio.h>
main()
{
int c;
c=getchar();
putchar(c);
c=getchar();
putchar(c);
}
== 결과값 ==
ab[enter]
ab
============
abcd[enter]
ab
============
a[enter]
a
============
a b[enter]
a
============
<getche 써보기>
#include <conio.h>
main()
{
int c;
c=getche();
}
=== 결과 ===
c[enter] 하는 순간,
cPress any key to continue ...라고 나온다
============
<같이 써보기>
#include <conio.h>
#include <stdio.h>
main()
{
int c;
c=getche();
putchar(c);
}
== 결과 ==
c[enter] 하는 순간,
ccPress any key to continue ...라고 나온다
==========
[표준입출력 방향 전환] ...파일로 입력하고 파일에다 출력 (텍스트 파일: .txt)
- 표준입출력의 방향전환(redirection)
표준 입력과 표준 출력 장치를 변경하는 것
표준입력 방향전환: 표준입력을 키보드 대신에 파일로 변경
표준출력 방향전환: 포준출력을 화면 대신에 파일로 변경
DOS 또는 UNIX/Linux에서 제공되는 기능
C> program < infine ..... 표준입력 방향전환(infile)
C> program > outline ..... 표준출력 방향전환(outfile)
C> program < infile >outfile ..... 표준입출력 방향전환(infile, outfile)
- 방향전환 기능을 사용하면
파일에 저장된 내용으로부터 입력을 받고
출력을 파일에 저장할 수 있음
※ 실행파일 저장되는 장소: project > settings > debug 탭
#include <stdio.h>
main()
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
printf("Sum is %d\n", x + y + z);
}
[수학용 라이브러리 함수]
- 수학 라이브러리 함수
#include <math.h>
삼각함수: sin(x), cos(x), tan(x)
역삼각함수: asin(x), acos(x), atan(x), atan2(y.x)
쌍곡선함수: sinh(x), cosh(x), tanh(x)
지수/로그함수: exp(x), log(x), log10(x), pow(x,y)
기타함수: fabs(x), sqrt(x), ceil(x), floor(x), fmod(x,y)
x를 넘는 가장 큰 정수(ceil), x를 넘지 않는 가장 큰 정수(floor), fmod(실수에 대한 나머지 연산 가능), 루트(sqrt)
대부분의 수학 함수는 double 자료형을 사용함. (output이 double이다!!)
삼각함수의 각도는 radian 단위
scanf에서 %lf을 써도 printf에서는 %f를 쓴다!
[난수 생성 함수]
- 난수(random number) 생성 함수
함수를 호출할 때마다 임의의 숫자를 생성하여 반환하는 함수
임의의 데이터를 필요로 할 때에 유용
- 난수생성함수 rand()
#include <stdlib.h>
i = rand(); .... 0부터 RAND_MAX사이의 임의의 정수 반환 (RAND_MAX는 32767또는 더 큰 정수로 정의)
i = rand() % N + 1 .... 1부터 N사이의 정수 난수 생성
d = (double)rand() / (RAND_MAX + 1) .... 0과 1사이의 실수 난수 생성
- 난수생성 초기화 함수 srand() .... 계속 다른 숫자로 만들어주기 위해...
#include <stdlib.h>
#include <time.h>
srand(seed) ..... 난수생성함수 seed값 지정
srand(time(NULL)) ... 현재시간을 seed 값으로 사용
1번
#include <stdio.h>
main()
{
int a, b, c, d, e;
printf("년월일시를 입력해주세요. ex)2006/12/25 10:10\n");
scanf("%d/%d/%d %d:%d",&a,&b,&c,&d,&e);
printf("%d년 %d월 %d일 %d시 %d분", a,b,c,d,e);
}
2번
#include <stdio.h>
#include <math.h>
int main(void)
{
int a,b,c,d;
double e;
printf("좌표1을 입력하세요 ex) (2,2)일경우 2,2로 입력 : ",a,b);
scanf("%d,%d",&a,&b);
printf("좌표2을 입력하세요 ex) (2,2)일경우 2,2로 입력 : ",c,d);
scanf("%d,%d",&c,&d);
e=sqrt(pow((a-c),2)+pow((b-d),2));
printf("두 좌표간의 거리는 %f 입니다.\n",e);
return 0;
}
3번
#include <stdio.h>
#include <math.h>
int main(void)
{
float p,q;
int y;
printf("연산자 p의 값을 입력하세요 :");
scanf("%f",&p);
printf("연산자 q의 값을 입력하세요 :");
scanf("%f",&q);
y = floor(p)+ceil(q-1);
printf("결과는 %d 입니다.",y);
return 0;
}