Presentation is loading. Please wait.

Presentation is loading. Please wait.

프로그래밍1 및 실습 (C언어) - 3장 기본자료형 (3.6부터 끝까지) -

Similar presentations


Presentation on theme: "프로그래밍1 및 실습 (C언어) - 3장 기본자료형 (3.6부터 끝까지) -"— Presentation transcript:

1 프로그래밍1 및 실습 (C언어) - 3장 기본자료형 (3.6부터 끝까지) -
숭실대학교 컴퓨터학부 2007년 1학기 김완섭

2 지난 수업 복습 C언어에서의 데이터형의 종류 문자가 입력되는 방식 정수가 입력되는 방식 질문
문자 : char, unsigned char, signed char 정수 : int, short int, long int … (unsigned , signed) 실수 : float, double, long double 문자가 입력되는 방식 정수가 입력되는 방식 양수와 음수의 표현 방식 ex) 5, -5 질문 C언어에서 기본 자료형을 가지고 표현할 수 있는 가장 큰 정수형 값의 크기는 얼마인가? 그렇다면, 이 값보다 더 큰 값을 표현해야 할 경우는 어떻게 해야하는가?

3 큰 정수를 표현하는 방법 (약 20억보다 큰 수) 방법1 : unsigned long 데이터형을 사용.
방법2 : Long(4Byte)보다 더 큰 저장공간을 사용한다. 그러나 ANSI-C에는 그러한 자료형이 없다. ISO C99 Spec에서는 추가적인 데이터형을 정의하고 있다. (llong) 컴파일러에 따라 그러한 자료형을 제공하고 있다. ( __int64 ) __int64 big1, big2, big3; big1= ; big2= ; big3=big1+big2; printf("%I64d %I64d %I64d", big1, big2, big3);

4 큰 정수를 표현하는 방법 (약 20억보다 큰 수) #define BIG 2000000000 main() {
int sum1 = BIG + BIG; // singed int long sum2 = BIG + BIG; // signed long int unsigned long sum3 = BIG + BIG; printf(" sum1 = %d \n", sum1 ); printf(" sum2 = %d \n", sum2 ); printf(" sum3 = %u \n\n", sum3 ); // 부호없는 정수 (%u) }

5 큰 정수를 표현하는 방법 (약 40억보다 큰 수) #define BIG 2000000000 main() {
int num1=BIG, num2=BIG, num3=BIG; int sum1 = num1 + num2 + num3; long sum2 = num1 + num2 + num3; __int64 sum3 = num1 + num2 + num3; __int64 sum4 = (__int64)num1+(__int64)num2 +(__int64)num3; printf(" num1 = %d \n", num1 ); printf(" num2 = %d \n\n", num2 ); printf(" sum1 = %d \n", sum1 ); printf(" sum2 = %d \n", sum2 ); printf(" sum3 = %I64d \n", sum3 ); printf(" sum4 = %I64d \n\n", sum4 ); }

6 3.5 보충 (접미사의 사용) 접미사의 사용 정수 상수에 그 형을 명시하기 위해서 접미사를 붙인다.
접미사를 붙이지 않으면 정수 상수의 형은 int, long int, unsinged long int 중 하나로 인식된다. 시스템은 이 세가지 중에서 그 정수 상수를 표현할 수 있는 첫번째 것을 선택하여 그 정수 상수의 형으로 사용한다. // 2바이트 워드 컴퓨터라고 가정한다. long int num1 = 100; // 100은 int로 인식된다. long int num2 = 32000; // 32000은 int로 인식된다. long int num3 = 33000; // 33000은 long int로 인식. long int num4 = ; // 30억, unsigned long int로 인식

7 3.5 보충 (접미사의 사용) : 추가예제 main() { float sum, average;
printf(" 총합 : %8.2f \n", sum ); printf(" 평균 : %8.2f \n", average ); } main() { float sum, average; sum = ; average = (82.0f f f) / 3.0f ; printf(" 총합 : %8.2f \n", sum ); printf(" 평균 : %8.2f \n", average ); }

8 3.5 보충 (접미사의 사용) 수식을 사용할 때 데이터 형이 일치하는 것을 권장.
그렇지 않으면 Warning이 발생하며 값이 손실이 가능. main() { int a, b ; a = ; b = 3.0 / 2.0 ; printf(" a = %d \n" , a ); printf(" b = %d \n" , b ); }

9 실행 결과 Warning 발생 (09) int a, b ; (10) a = 1.0 + 2.0 ;
(13) printf(“ a = %d \n”, a ); (14) printf(“ b = %d \n”, b ); 실행 결과 Warning 발생

10 3.6 부동형 (Floating Type) 부동형(?) = 실수 값 ANSI C는 세 가지 부동형을 제공한다.
실수 : Floating Point Number 쉽게 말하면 , 같은 실수 값을 부동형이라고 한다. 정수를 부동형 상수로 표현할 때에는 소수점을 사용해야 함. 예를 들어, 1.0과 2.0은 double 형이지만 1, 2는 int 이다. ANSI C는 세 가지 부동형을 제공한다. 구분` 자료형 설명 실수 (3가지) float 실수 ( 부동형 ) double 정밀한 실수 ( 부동형 ) long double 더 정밀한 실수 (부동형)

11 3.6 부동형 (부동형 상수의 표기법) 부동형 상수(실수) 표기의 예 3.0 3.14159 123.456 314.159e-2F
잘못된 부동형 상수의 표기 예 e-2F e+2 0e0 E+2F 1. 3.14, // 콤마 허용 안 됨.  1, // 정수형으로 인식됨. .e // 실수 부분이 필요함. // 상수가 아니고 수식임. 

12 3.6 부동형 (부동형 상수의 표기법) BNF에 따른 부동형(실수) 상수의 표현
구성 : 정수 부분, 소수점, 소수부분, 지수부분. floating_constant ::= f_constanct {f_suffix}opt f_constant ::= i_part f_part e_part | i_part f_part | i_part . | f_part | f_part e_part | i_part e_part i_part ::= integer_part ::= {digit}1+ f_part ::= fractional_part ::= {digit}1+ e_part ::= expoential_part ::= {e|E}1{+|-}opt{digit}1+ f_suffix ::= floating_suffix ::= f | F | l | L

13 3.6 부동형 (표현 가능한 범위: float) 참고 프로그램 (float 형의 표현 범위) main() {
float num1 = ; float num2 = ; printf(" num1 = %f \n", num1 ); printf(" num2 = %f \n", num2 ); }

14 3.6 부동형 (표현 가능한 범위: double) 참고 프로그램 (double 형의 표현 범위) main() {
double num1 = ; double num2 = ; printf(" num1 = %.20f \n", num1 ); printf(" num2 = %.20f \n", num2 ); }

15 3.6 부동형 (표현 가능한 범위) 기억 장소의 크기 (Byte) Float 의 표현 범위 (정밀도)
float : 4 Byte double : 8 Byte long double : 8 byte 참고 : long과 long double은 크기가 같다. Float 의 표현 범위 (정밀도) 대략 유효자리 6자리이고, 범위는 10-38에서 10+38이다. Double의 표현 가능 범위 (정밀도) 대략 유효자리 15자리이고, 범위는 대략 에서 이다.

16 3.6 부동형 알아두어야 할 내용 (1) 모든 실수를 다 표현할 수는 없다.
프로그램 시 반올림의 영향, 비율 등을 고려하는 것이 필요하다. (1) 모든 실수를 다 표현할 수는 없다. (2) 정수 산술 연산과 달리 부동형 산술 연산은 정확하지 않다.

17 3.6 부동형 접미사의 사용 접미사를 아래와 같이 명시한다. 접미사를 사용하지 않으면 double 형으로 인식된다.
문제. 0을 10000번 더하면 어떻게 될까? 접미사 예제 f 또는 F float 3.7F l 또는 L long double 3.7L

18 예제 코드 접미사 사용의 필요성 int main(void) { float num1 = 3.14;
printf(" %.20f \n %.20f \n %.20f \n ", num1, num2, num3); return 0; }

19 예제 코드 return 0; /* 접미사를 사용하는 코드 */ int main(void) { float num1 = 3.14;
float num2 = ; // double로 인식 float num3 = ; // double로 인식 double num4 = F; // 접미사 F, f 가능 double num5 = L; // 접미사 L, l 가능 printf(" %.20f \n ", num1); printf(" %.20f \n ", num2); printf(" %.20f \n ", num3); printf(" %.20f \n ", num4); printf(" %.20f \n ", num5); return 0; }

20 3.7 typedef 의 사용 Typedef 기능 프로그래머가 형(type)과 식별자를 연관 지을 수 있게 한다.
typedef char uppercase; typedef int INCHES, FEET; typedef unsigned long size_t; main() { uppercase u; INCHES length, width; u = ‘A’; length = 3; }

21 3.7 typedef 의 사용 typedef 를 사용하는 목적 (1) 긴 선언문을 축약하여 사용할 수 있다.
(2) 사용 목적에 맞게 형 이름을 결정할 수 있다. typedef int height ; typedef unsigned long int bonus; height std1 = 175; bonus kim1 = ;

22 3.8 sizeof 연산자 sizeof는 단항 연산자이다. sizeof는 객체를 저장하는데 필요한 Byte 수를 알려준다.
main() { printf ( " char : %d \n" , sizeof(char) ) ; printf ( " short : %d \n" , sizeof(short) ) ; printf ( " int : %d \n" , sizeof(int) ) ; printf ( " long : %d \n" , sizeof(long) ) ; printf ( " unsinged : %d \n" , sizeof(unsigned ) ) ; printf ( " float : %d \n" , sizeof(float) ) ; printf ( " double : %d \n" , sizeof(double) ) ; printf ( " long double : %d \n" , sizeof(long double) ) ; }

23 3.8 sizeof 연산자 C언어에서 자료형을 위한 기억장소의 크기는 컴퓨터에 따라 다르지만 다음 조건은 항상 만족한다.
sizeof(char) = 1 sizeof(short) <= sizeof(int) <= sizeof(long) sizeof(signed) = sizeof(unsigned) = sizeof(int) 마지막 박스의 내용 수정할 것.

24 3.9 getchar() 와 putchar()의 사용
Stdio.h 함수 안에 정의된 매크로이다. (함수가 아님) 함수와 같이 형식으로 사용할 수 있다. getchar() : 한 문자를 읽어들인다.  c = getchar(); putchar() : 한 문자를 출력한다.  putchar(c); main() { char c; printf(“알파벳 입력 : ”); c = getchar(); putchar(c); }

25 * 추가 * while 반복문 이해하기 while ( 조건 ) { 조건이 만족될 경우 실행되는 문장들 }
void main(void) { int num; printf(“양의 정수를 입력하세요(종료 0) : ”); scanf(“%d”, &num); while( num != 0) printf(“%d를 입력했습니다.”, num); if( num%2 == 0 ) printf(“ 짝수입니다. \n”); else printf(“홀수입니다. \n”); }

26 * 추가 * if else 조건문 이해하기 while ( 조건 ) { 조건이 만족될 경우 실행되는 문장들 }
main(void) { int age; printf(“당신의 나이를 입력하세요 : ”); scanf(“%d”, &age); if(age>=100) { printf(“당신이 입력한 수는 100보다 큽니다.\n”); printf(“제대로 입력하세요”); } else { printf(“당신의 나이는 %d이군요.\n”, age); printf(“10년 후에는 %d살입니다.\n”, age+10);

27 * 추가 * if else 조건문 이해하기 while ( 조건 ) { 조건이 만족될 경우 실행되는 문장들 } 논리 연산자
main(void) { int age; printf(“당신의 나이를 입력하세요 : ”); scanf(“%d”, &age); if(age>=100 || age<0) { printf(“나이를 잘못 입력하셨습니다.\n”); printf(“제대로 입력하세요”); } else { printf(“당신의 나이는 %d이군요.\n”, age); printf(“10년 후에는 %d살입니다.\n”, age+10); 논리 연산자 && : 그리고 || : 또는

28 3.9 getchar() 와 putchar()의 사용
#define EOF (-1) // end-of-file 의 약자이다. <stdio.h> int c; // int 형은 char 형을 대신하여 사용될 수 있다. P.126의 중간에 있는 문단을 읽어보자. Scanf()함수는 성공적으로 변환한 개수를 리턴한다. (엔터, quit 등 입력) #include <stdio.h> int main(void) { int c; while( (c=getchar()) != EOF ) { putchar(c); } return 0;

29 3.9 getchar() 와 putchar()의 사용
#include <stdio.h> int main(void) { int c; c = getchar(); while( c != EOF ) { putchar(c); } return 0; ABC[엔터]를 입력했을 때 어떻게 되겠는가?

30 3.9 getchar() 와 putchar()의 사용
#include <stdio.h> int main(void) { int c; while( (c=getchar() ) != EOF ) if( c>= 'a' && c<= 'z' ) putchar( c + 'A' - 'a'); else putchar(c); return 0; } If 조건문 : c >=‘a’ && c <= ‘z’ 의미 : 입력한 알파벳이 소문자인가? 즉, 소문자일때는 putchar(c + ‘A’ – ‘a’ ) 이 실행 대문자일때는 putchar(c) 가 실행된다.

31 3.10 수학 함수 C언어에서는 다양한 수학함수들을 사용할 수 있다. C언어에는 수학함수가 내장되어 있지 않다.
math.h 라는 파일에 다양한 수학 함수들이 정의 되어 있다. 함수 설명 사용 예 sqrt() 루트 값 result = sqrt( 4 ); pow() 제곱 근 result = pow(2, 3); exp() 지수 곱 result = exp(1); log() 로그 함수 result = log(1); sin() 사인 함수 result = sin(0); cos() 코사인 함수 result = cos(0); tan() 탄젠트 함수 result = tan(0);

32 3.10 수학 함수 (함수 예제) #include <math.h> int main(void) {
double num, result; num = 4; result = sqrt(num); printf(" root(4) = sqrt(4) = %.2f \n", result); result = pow(2,3); printf(" 2의 3승 = %.2f \n", result); return 0; }

33 3.10 수학 함수 (p.129 예제 프로그램 해석) #include <math.h>
#include <stdio.h> int main(void) { double x; printf("\n%s", "The following will be computed :\n” "\n” " the square root of x \n” " x raised to the power x\n” "\n” );

34 3.10 수학 함수 (p.129 예제 프로그램 해석) while(1) { printf( “Input x : ”);
if(scanf(“%lf”, &x) != 1) break; if( x>=0.0) printf(“\n%15s%22.15e\n%15s%22.15e\n %15s%22.15e\n\n”, “x = ”, x, “sqrt(x) = ”, sqrt(x), “pow(x, x) = “, pow(x, x)); else { printf(“\nSorry, your number must be nonnegative.\n”); break; } } printf(“\nBye!\n\n”); return 0; 3.10 수학 함수 (p.129 예제 프로그램 해석)

35 3.11 변환과 캐스트 산술 수식은 값과 형을 가짐 필요에 따라 수식을 구성하는 형들은 변환이 일어남 정수적 승격
signed/unsigned char, signed/unsigned short, 열거형, signed/unsigned int는 정수적 수식에 사용될 수 있음 이 수식에서 모든 형들은 int나 unsigned int로 변환됨 char c = ‘A’; Unsigned char uc = 10; short s = 20; // unsigned short int s = 20; 과 동일 int i = 100; // singed int i = 100과 동일 int result = c + s + i ; // 이 산술수식에서의 형변환은 ?

36 3.11 변환과 캐스트 산술 변환은 이항 연산자의 피연산자를 계산할 때 일어남 규칙
둘 중 하나가 long double 형이면, 다른 하나는 long double 형으로 변환 아니면, 둘 중 하나가 double 형이면, 다른 하나는 double 형으로 변환 아니면, 둘 중 하나가 float 형이면, 다른 하나는 float 형으로 변환 아니면, 정수적 승격이 일어나고, 다음 규칙 사용: 둘 중 하나가 unsigned long 형이면, 다른 하나는 unsigned long 형으로 변환 아니면, 둘 중 하나가 long 형이고 다른 하나가 unsigned 형이면, 다음 수행: 만일 long 형이 unsigned 형의 모든 값을 표현할 수 있다면, unsigned 형은 long 형으로 변환 아니면, 두 피연산자는 unsigned long 형으로 변환 아니면, 둘 중 하나가 long 형이면, 다른 하나는 long 형으로 변환 아니면, 둘 중 하나가 unsigned 형이면, 다른 하나는 unsigned 형으로 변환 아니면, 두 피연산자는 int 형을 가짐

37 3.11 변환과 캐스트 (추가) long double result; long double ld = 10000.0;
둘 중 하나가 long double 형이면, 다른 하나는 long double 형으로 변환 아니면, 둘 중 하나가 double 형이면, 다른 하나는 double 형으로 변환 아니면, 둘 중 하나가 float 형이면, 다른 하나는 float 형으로 변환 아니면, 정수적 승격이 일어나고, 다음 규칙 사용: long double result; long double ld = ; double d = ; float f = 100.0; int i = 10; char c = 5; result = ld + d + f + i + c; // 이 산술수식에서의 형변환은 ? result = d + f + i + c; // 이 산술수식에서의 형변환은 ? result = f + i + c; // 이 산술수식에서의 형변환은 ? result = i + c; // 이 산술수식에서의 형변환은 ?

38 3.11 변환과 캐스트 (추가) unsigned long result; unsigned long UL = 30억 ;
둘 중 하나가 unsigned long 형이면, 다른 하나는 unsigned long 형으로 변환 아니면, 둘 중 하나가 long 형이고 다른 하나가 unsigned 형이면, 다음 수행: 만일 long 형이 unsigned 형의 모든 값을 표현할 수 있다면, unsigned 형은 long 형으로 변환 아니면, 두 피연산자는 unsigned long 형으로 변환 아니면, 둘 중 하나가 long 형이면, 다른 하나는 long 형으로 변환 아니면, 둘 중 하나가 unsigned 형이면, 다른 하나는 unsigned 형으로 변환 아니면, 두 피연산자는 int 형을 가짐 unsigned long result; unsigned long UL = 30억 ; long L = 15억; // signed long unsigned UI1= 5억, UI2 = 22억; result = UL + L; // 이 산술수식에서의 형변환은 ? result = L + UI1; // 이 산술수식에서의 형변환은 ? result = L + UI2; // 이 산술수식에서의 형변환은 ?

39 3.11 변환과 캐스트 자동 변환 묵시적 변환 강압 승격 확대

40 3.11 변환과 캐스트 (자동변환 예제) 선언 수식 형 c - s / i u * 2.0 - i c + 3 c + 5.0
char c; short s; int i; long l; unsigned u; unsigned long ul; float f; double d; long double ld; 수식 c - s / i u * i c + 3 c + 5.0 d + s 2 * i / l int double long u * 7 - i f * 7 - i 7 * s * ul ld + c u - ul u - l unsigned float unsigned long long double system-dependent

41 3.11 변환과 캐스트 명시적인 변환 캐스트 예제 잘못된 캐스트 (double) i (long) ('A' + 1.0)
x = (float) ((int) y + 1) (double) (x = 77) 잘못된 캐스트 (double) x = 77 /* equivalent to ((double) x) = 77, error */

42 3.12 16진 상수와 8진 상수 C 원시 코드에서 0으로 시작하는 양의 정수 상수는 8진 정수이고
0x 또는 0X로 시작하는 양의 정수 상수는 16진 정수임 예제 프로그램 int main(void) { printf("%d %x %o\n", 19, 19, 19); printf("%d %x %o\n", 0x1c, 0x1c, 0x1c); printf("%d %x %o\n", 017, 017, 017); printf("%d\n", x ); printf("%x\n", ); printf("%d\n", 0x1FfFFf); return 0; }


Download ppt "프로그래밍1 및 실습 (C언어) - 3장 기본자료형 (3.6부터 끝까지) -"

Similar presentations


Ads by Google