입출력문과 라이브러리 함수

[라이브러리 함수]
- 라이브러리: 미리 작성된 함수들을 모아놓은 것
- 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;
}


by Joe & Soohy 2006. 12. 28. 09:57