이번장에서학습할내용 * 변수와상수의개념이해 * 자료형 * 정수형 * 실수형 * 문자형 * 기호상수사용 * 오버플로우와언더플로우이해 이번장에서는변수와각종자료형을살펴봅니다.
변수 Q) 변수 (variable) 이란무엇인가? A) 프로그램에서일시적으로데이터를저장하는공간 Q) 변수는왜필요한가? A) 데이터가입력되면어딘가에저장해야만다음에사용할수있다. 78 90 56 성적들의평균을구하려면먼저성적들이어딘가에저장되어있어야함 12 평균
변수 = 상자 변수는물건을저장하는상자와같다. int i 7 데이터 변수의타입 변수의이름
변수가만들어지는곳 변수는메인메모리에만들어진다. 0 1 2 2 2 3 4
메모리를주소로사용한다면 (Q) 만약메모리를변수처럼이름을가지고사용하자않고주소로사용하다면? 100 번지에 0 을대입하라 (A) 충분히가능하지만불편하다. 인간은숫자보다는기호를더잘기억한다. 100 번지에 0 을.. 근데 102 번지는어떤용도로쓰고있지?
변수와상수 변수 (variable): 저장된값의변경이가능한공간 상수 (constant): 저장된값의변경이불가능한공간 ( 예 ) 3.14, 100, A, Hello World! 12 12 변수 상수
상수의이름 (Q) 상수도이름을가질수있는가? (A) 보통상수는이름이없다. 이러한상수를리터럴 (literal) 이라고한다. 하지만필요하다면상수에도이름을붙일수있다. 이것을기호상수라고한다. MAX_SIZE
예제 : 변수와상수 /* 원의면적을계산하는프로그램 */ #include <stdio.h> int main(void) { 변수 float radius; float area; // 원의반지름 // 원의면적 printf(" 원의면적을입력하시요 :"); scanf("%f", &radius); area = 3.141592 * radius * radius; printf(" 원의면적 : %f \n", area); 상수 원의면적을입력하시요 :10 원의면적 : 314.159210 } return 0;
자료형 자료형 (data type): 데이터의타입 ( 종류 ) ( 예 ) short, int, long: 정수형데이터 (100) ( 예 ) double, float: 실수형데이터 (3.141592) ( 예 ) char: 문자형데이터 ( A, a, 한 )
디양한자료형이필요한이유 (Q) 다양한자료형이필요한이유는? (A) 상자에물건을저장하는것과같다. 물건이상자보다크면들어가지않을것이다. 물건이상자보다너무작으면공간이낭비될것이다.
자료형
자료형의크기 char short int float double long double char short int sizeof 연산자는변수나데이터타입의크기를바이트단위로반환합니다.
예제 : 자료형의크기 #include <stdio.h> int main(void) { int x; } printf(" 변수 x의 크기 : %d", sizeof(x)); printf("char형의 크기 : %d", sizeof(char)); printf("int형의 크기 : %d", sizeof(int)); printf("short형의 크기 : %d", sizeof(short)); printf("long형의 크기 : %d", sizeof(long)); printf("float형의 크기 : %d", sizeof(float)); printf("double형의크기 : %d", sizeof(double)); return 0; 변수 x 의크기 : 4 char 형의크기 : 1 int 형의크기 : 4 short 형의크기 : 2 long 형의크기 : 4 float 형의크기 : 4 double 형의크기 : 8
자료형의종류 정수형 문자형 부호있음 부호없음 자료형 설명 바이트수 short short 형정수 2-32768~32767 범위 int 정수 4-2147483648~2147483647 long long 형정수 4-2147483648~2147483647 unsigned short 부호없는 short 형정수 2 0~65535 unsigned int 부호없는정수 4 0~4294967295 unsigned long 부호없는 long 형정수 4 0~4294967295 부호있음 char 문자및정수 1-128~127 부호없음 unsigned char 문자및부호없는정수 1 0~255 부동소수점형 float 단일정밀도부동소수점 4 1.2E-38~3.4E38 double 두배정밀도부동소수점 8 2.2E-308~1.8E308 Long double 두배정밀도부동소수점 8 2.2E-308~1.8E308
변수의이름짓기 식별자 (identifier): 식별할수있게해주는이름 변수이름 함수이름 김영희 김철수 앞으로 x 라고불러주세요 x 7 100 sum 앞으로 sum 라고불러주세요
식별자를만드는규칙 알파벳문자와숫자, 밑줄문자 _ 로구성 첫번째문자는반드시알파벳또는밑줄문자 _ 대문자와소문자를구별 C 언어의키워드와똑같은이름은허용되지않는다. (Q) 다음은유효한식별자인가? sum _count king3 n_pictures 2nd_try O O O O X // 숫자로시작 Dollor# X // # 기호 double X // 키워드
좋은변수이름 변수의역할을가장잘설명하는이름 밑줄방식 : bank_account 단어의첫번째글자를대문자 :BankAccount a, b, c,,d, number, average, sum,
키워드 키워드 (keyword): C언어에서고유한의미를가지고있는특별한단어 예약어 (reserved words) 라고도한다. auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while
변수선언 변수선언 : 컴파일러에게어떤변수를사용하겠다고미리알리는것 자료형변수이름 ; 변수선언의예 char c; int i; char c double interest_rate; int height, width; int i int height int width double interest_rate
변수에값을저장하는방법 char c; // 문자형변수 c 선언 int i; // 정수형변수 i 선언 double interest_rate; // 실수형변수 interest_rate 선언 c = 'a'; // 문자형변수 c에문자 'a' 를대입 i = 60; // 정수형변수 i에 60을대입 interest_rate = 4.9; // 실수형변수 interest_rate에 82.9를대입 char c a int i 7 4.9 double interest_rate
자료형변수이름 = 초기값 ; 변수의초기화 변수초기화의예 char c = a ; int i = 7; double interest_rate = 0.05; char c int a i 7 double interest_rate 0.05
변수선언위치 int main(void) { int i; // printf("hello World!\n"); int sum; // ⅹ } 일반문장이시작된후에변수를선언하는것은 C 언어에서는곤란합니다.
변수의사용 대입연산자를이용하여서값을저장한다. int value; value = 10; value = 20;
변수의사용 저장된값은변경이가능하다. int value1 = 10; int value2; value2 = value1;
예제 : 변수의선언 #include <stdio.h> 변수선언 int main(void) { int usd; int krw; // 달러화 // 원화 printf(" 달러화금액을입력하시오 : "); scanf("%d", &usd); } krw = 1120 * usd; printf(" 달러화 %d달러는 %f원입니다.", usd, krw); return 0; 1120000 달러화금액을입력하시오 : 100 달러화 100 달러는 112000 원입니다. krw 1120 = ** 100 usd
정수형 short, int, long short int long 16비트 (2바이트) 32비트 (4바이트) 32비트 (4바이트) 가장기본이되는것은 int CPU에따라서크기가달라진다. 16비트, 32비트, 64비트 (Q) 왜여러개의정수형이필요한가? (A) 용도에따라프로그래머가선택하여사용할수있게하기위하여
정수형선언의예 short grade; // short형의변수를생성한다. int count; // int형의변수를생성한다. long distance; // distance형의변수를생성한다.
정수형의범위 int 형 약 -21 억에서 +21 억 short 형 long 형 보통 int 형과같음
예제 /* 정수형자료형의크기를계산하는프로그램 */ #include <stdio.h> int main(void) { short year = 0; // 0 으로초기화한다. int sale = 0; // 0 으로초기화한다. long total_sale = 0; // 0 으로초기화한다. 200000000 100 0 0 Short year * = 2000000000 int sale long total_sale year = 10; // 약 3만2천을넘지않도록주의 sale = 200000000; // 약 21억을넘지않도록주의 total_sale = year * sale; // 약 21억을넘지않도록주의 printf("total_sale = %d \n", total_sale); Total sale = 200000000 } return 0;
signed, unsigned 수식자 unsigned 음수가아닌값만을나타냄을의미 unsigned int signed 부호를가지는값을나타냄을의미 흔히생략 short int long
unsigned 수식자 unsigned int speed; // 부호없는 int형 unsigned distance; // unsigned int distance와같다. unsigned short players; // 부호없는 short형 unsigned long seconds; // 부호없는 long형
오버플로우 오버플로우 (overflow): 변수가나타낼수있는범위를넘는숫자를저장하려고할때발생 2147483648 int OverFlow
오버플로우 #include <stdio.h> #include <limits.h> int main(void) { short s_money = SHRT_MAX; // 최대값으로초기화한다. 32767 unsigned short u_money = USHRT_MAX; // 최대값으로초기화한다. 65535 } s_money = s_money + 1; printf("s_money = %d", s_money); u_money = u_money + 1; printf("u_money = %d", u_money); return 0; 오버플로우발생!! assasa s_money = -32768 u_money = 0
오버플로우 규칙성이있다. 수도계량기나자동차의주행거리계와비슷하게동작 -32768-32767... 32766 32767 short 의경우 0 1... 65534 65535 unsigned short 의경우
정수상수 숫자를적으면기본적으로 int형이된다. sum = 123; // 123은 int형 상수의자료형을명시하려면다음과같이한다. sum = 123L; // 123은 long형 접미사 자료형 예 u 또는 U unsigned int 123u 또는 123U l 또는 L long 123l 또는 123L ul 또는 UL unsigned long 123ul 또는 123UL
10 진법, 8 진법, 16 진법 10 진법이외의진법으로도표기가능 int x = 10; int y = 012; int z = 0xA; // 8 진수 // 16 진수
예제 /* 정수상수프로그램 */ #include <stdio.h> int main(void) { int x = 10; // 10 은 10 진수이고 int 형이고값은십진수로 10 이다. int y = 010; // 010 은 8 진수이고 int 형이고값은십진수로 8 이다. int z = 0x10; // 010 은 16 진수이고 int 형이고값은십진수로 16 이다. } printf("x = %d", x); printf("y = %d", y); printf("z = %d", z); return 0; x = 10 y = 8 z = 16
기호상수 기호상수 (symbolic constant): 기호를이용하여상수를표현한것 ( 예 ) area = 3.141592 * radius * radius; area = PI * radius * radius; income = salary - 0.15 * salary; income = salary - TAX_RATE * salary; 기호상수의장점 가독성이높아진다. 값을쉽게변경할수있다.
기호상수의장점
기호상수를만드는방법 1 #define 기호상수이름값 ( 예 ) #define EXCHANGE_RATE 1120
기호상수를만드는방법 2 const 자료형변수이름 = 초기값 ( 예 ) const int EXCHANGE_RATE = 1120; 1120 EXCHANGE_ RATE 상수
예제 : 기호상수 #include <stdio.h> #define TAX_RATE 0.2 기호상수 int main(void) { const int MONTHS = 12; int m_salary, y_salary; // 변수선언 printf( " 월급을입력하시요 : "); // 입력안내문 scanf("%d", &m_salary); y_salary = MONTHS * m_salary; // 순수입계산 printf(" 연봉은 %d입니다.", y_salary); 월급을입력하시요 : 100 연봉은 1200 입니다. 세금은 240.000000 입니다. printf(" 세금은 %f 입니다.", y_salary*tax_rate); } return 0;
정수표현방법 컴퓨터에서정수는이진수형태로표현되고이진수는전자스위치로표현된다. 0 0 01 0 01 0 0 0
정수표현방법 양수 십진수를이진수로변환하여저장하면된다. 음수 보통은첫번째비트를부호비트로사용한다. 문제점이발생한다.
음수를표현하는첫번째방법 첫번째방법은맨처음비트를부호비트로간주하는방법입니다. 양수와음수의덧셈연산을하였을경우, 결과가부정확하다. ( 예 ) +3 + (-3) 이방법으로표현된이진수를평범하게더하면결과가부정확합니다.
음수를표현하는두번째방법 2의보수로음수를표현한다. 현재사용되는표준적인음수표현방법 2의보수를만드는방법
2 의보수로양수와음수를더하면 음수를 2 의보수로표현하면양수와음수를더할때각각의비트들을더하면됩니다.
예제 /* 2 의보수프로그램 */ #include <stdio.h> int main(void) { int x = 3; int y = -3; 음수가 2 의보수로표현되는지를알아보자. printf("x = %08X\n", x); // 8자리의 16진수로출력한다. printf("y = %08X\n", y); // 8자리의 16진수로출력한다. printf("x+y = %08X\n", x+y); // 8자리의 16진수로출력한다. } return 0; x = 00000003 y = FFFFFFFD x+y = 00000000
부동소수점형 컴퓨터에서실수는부동소수점형으로표현 소수점이떠서움직인다는의미 과학자들이많이사용하는과학적표기법과유사 실수의정밀도를나타낸다. 실수의표현범위를나타낸다. 1.49598ⅹ10 8 가수부분 지수부분
실수를표현하는방법 #1 고정소수점방식 정수부분을위하여일정비트를할당하고소수부분을위하여일정비트를할당 전체가 32비트이면정수부분 16비트, 소수부분 16비트할당 과학과공학에서필요한아주큰수를표현할수없다
실수를표현하는방법 #2 부동소수점방식 부호비트 (1 비트 ) 149598000 = 1.49598 10 8 0 1.49598 8 0 1 가수부분 (23비트) 23 24 지수부분 (8비트) 31 표현할수있는범위가대폭늘어난다. 10-38 에서 10 +38
부동소수점형 float < double long double 64 비트
/* 부동소수점자료형의크기계산 */ #include <stdio.h> int main(void) { float x = 1.234567890123456789; double y = 1.234567890123456789; 예제 printf("float 의크기 =%d\n", sizeof(float)); printf("double 의크기 =%d\n", sizeof(double)); printf("long double 의크기 =%d\n", sizeof(long double)); } printf("x = %30.25f\n",x); printf("y = %30.25f\n",y); return 0; float 의크기 =4 double 의크기 =8 long double 의크기 =8 x = 1.2345678806304932000000000 y = 1.2345678901234567000000000
부동소수점상수 일반적인실수표기법 3.141592 (double형) 3.141592F (float형) 지수표기법 1.23456e4 = 12345.6 1.23456e-3 = 0.00123456 유효한표기법의예 1.23456 2. // 소수점만붙여도된다..28 // 정수부가없어도된다. 0e0 2e+10 // + 나 -기호를지수부에붙일수있다. 9.26E3 // 9.26e3 //
#include <stdio.h> 부동소수점오버플로우 int main(void) { float x = 1e39; printf("x = %e\n",x); } 숫자가커서오버플로우발생 x = 1.#INF00e+000 계속하려면아무키나누르십시오...
#include <stdio.h> 부동소수점언더플로우 int main(void) { float x = 1.23456e-38; float y = 1.23456e-40; float z = 1.23456e-46; } printf("x = %e\n",x); printf("y = %e\n",y); printf("z = %e\n",z); 숫자가작아서언더플로우발생 x = 1.234560e-038 y = 1.234558e-040 z = 0.000000e+000
부동소수점형사용시주의사항 오차가있을수있다! #include <stdio.h> int main(void) { double x; 부동소수점연산에서는오차가발생한다. 5.0 이아니라 0 으로계산된다. } x = (1.0e20 + 5.0)-1.0e20; printf("%f \n",x); return 0; 0.000000
중간점검 1. 부동소수점형에속하는자료형을모두열거하라. 2. float형대신에 double형을사용하는이유는무엇인가? 3. 부동소수점형에서오차가발생하는근본적인이유는무엇인가? 4. 12.345처럼소수점이있는실수를 int형의변수에넣을경우, 어떤일이발생하는가? 5. 수식 (1.0/3.0) 을 float형변수와 double형변수에각각저장한후에출력하여보자. (1.0/3.0) 은 0.333333... 값을출력하여야한다. 소수점몇자리까지정확하게출력되는가?
문자형 문자는컴퓨터보다는인간에게중요 문자도숫자를이용하여표현 C 에서문자는숫자로표현됩니다. 65 69 71 74 78
문자형 문자는컴퓨터보다는인간에게중요 문자도숫자를이용하여표현 공통적인규격이필요하다. 아스키코드 (ASCII: American Standard Code for Information Interchange) 8비트를사용하여영어알파벳표현 ( 예 )! 는 33, A 는 65, B 는 66, a 는 97, b 는 98!"#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `abcdefghijklmnopqrstuvwxyz{ }~
아스키코드표 ( 일부 )
문자변수 char 형의변수가문자저장 char c; char answer; char code; char c char answer char code char 형의변수에문자를저장하려면아스키코드값을대입 code = 65; code = A ; // A 저장 int code 65 A
예제 /* 문자변수와문자상수 */ #include <stdio.h> int main(void) { char code1 = 'A'; char code2 = 65; } // 문자상수로초기화 // 아스키코드로초기화 printf(" 문자상수초기화 = %c\n", code1); printf(" 아스키코드초기화 = %c\n", code2); 문자상수초기화 = A 아스키코드초기화 = A (Q) 1 과 1 의차이점은? (A) 1 은정수상수이고 1 은문자상수이다.
제어문자 인쇄목적이아니라제어목적으로사용되는문자들 ( 예 ) 줄바꿈문자, 탭문자, 벨소림문자, 백스페이스문자제어문자를나타내는방법 아스키코드를직접사용 char beep = 7; printf("%c", beep); 이스케이프시퀀스사용 char beep = \a ; printf("%c", beep);
이스케이프시퀀스 제어문자이름 제어문자표기 값 의미 널문자 \0 0 문자열의끝을표시 경고 (bell) \a 7 " 삐 하는경고벨소리발생 백스페이스 (backspace) \b 8 커서를현재의위치에서한글자뒤로옮긴다. 수평탭 (horizontal tab) \t 9 커서의위치를현재라인에서설정된다음탭위치로옮긴다. 줄바꿈 (newline) \n 10 커서를다음라인의시작위치로옮긴다. 수직탭 (vertical tab) \v 11 설정되어있는다음수직탭위치로커서를이동 폼피드 (form feed) \f 12 캐리지 return) 리턴 (carriage 주로프린터에서강제적으로다음페이지로넘길때사용된다. \r 13 커서를현재라인의시작위치로옮긴다. 큰따옴표 \ 34 원래의큰따옴표자체 작은따옴표 \ 39 원래의작은따옴표자체 역슬래시 (back slash) \\ 92 원래의역슬래시자체
예제 #include <stdio.h> int main() { int id, pass; printf(" 아이디와패스워드를 4 개의숫자로입력하세요 :"); printf("id: \b\b\b\b"); scanf("%d", &id); printf("pass: \b\b\b\b"); scanf("%d", &pass); printf( \a 입력된아이디는 \ %d\ 이고패스워드는 \ %d\ 입니다.", id, pass); return 0; } 아이디와패스워드를 4 개의숫자로입력하세요 : id: 1234 pass: 5678 입력된아이디는 "1234" 이고패스워드는 "5678" 입니다.
정수형으로서의 char 형 8 비트의정수를저장하는데 char 형을사용할수있다.. char code = 65; printf("%d %d %d", code, code+1, code+2); // 65 66 67이출력된다. printf("%c %c %c", code, code+1, code+2); // A B C가출력된다. 65 66 67A B C
중간점검 컴퓨터에서는문자를어떻게나타내는가? C에서문자를가장잘표현할수있는자료형은무엇인가? 경고음이발생하는문장을작성하여보자.
실습 : 태양빛도달시간 태양에서오는빛이몇분만에지구에도착하는지를컴퓨터로계산해보고자한다. 빛의속도는 1초에 30만 km를이동한다. 태양과지구사이의거리는약 1억 4960만 km이다.
실행결과 빛의속도는 300000.000000km/s 태양과지구와의거리 149600000.000000km 도달시간은 8.311111 초
힌트 문제를해결하기위해서는먼저필요한변수를생성하여야한다. 여기서는빛의속도, 태양과지구사이의거리, 도달시간을나타내는변수가필요하다. 변수의자료형은모두실수형이어야한다. 왜냐하면매우큰수들이기때문이다. 빛이도달하는시간은 ( 도달시간 = 거리 / ( 빛의속도 )) 으로계산할수있다. 실수형을 printf() 로출력할때는 %f나 %lf를사용한다.
소스 #include <stdio.h> int main(void) { double light_speed = 300000; double distance = 149600000; double time; // 빛의속도저장하는변수 // 태양과지구사이거리저장하는변수 // 149600000km로초기화한다. // 시간을나타내는변수 time = distance / light_speed; // 거리를빛의속도로나눈다. time = time / 60.0; // 초를분으로변환한다. printf(" 빛의속도는 %fkm/s \n", light_speed); printf(" 태양과지구와의거리 %fkm \n", distance); printf(" 도달시간은 %f 초 \n", time); // 시간을출력한다. } return 0;
실습 : 태양빛도달시간 태양에서오는빛이몇분만에지구에도착하는지를컴퓨터로계산해보고자한다. 빛의속도는 1초에 30만 km를이동한다. 태양과지구사이의거리는약 1억 4960만 km이다.
도전문제 위의프로그램의출력은 8.3333... 초로나온다. 이것을분과초로나누어서 8 분 20 초와같은식으로출력하도록변경하라. 필요하다면형변환을사용하라. 추가적인정수변수를사용하여도좋다.
Q & A