개정판 누구나 즐기는 C언어 콘서트 제3장 변수와 자료형 출처: pixabay
이번 장에서 학습할 내용 변수와 상수의 개념을 이해한다. C에서 사용가능한 변수의 종류를 알고 있다. 정수형 변수와 상수를 선언하고 사용할 수 있다. 부동 소수점형 변수와 상수를 선언하고 사용할 수 있다. 기호 상수를 사용할 수 있다. 오버플로우와 언더플로우를 이해한다.
이번 장에서 만들 프로그램
변수 프로그램에서 값들이 저장되는 공간을 변수(variable)라고 한다.
변수가 만들어지는 곳 변수는 메인 메모리에 만들어진다.
변수가 필요한 이유 (Q) 만약 메모리를 변수처럼 이름을 가지고 사용하자 않고 주소로 사용하다면? “219번지에 0을 대입하라” (A) 충분히 가능하지만 불편하다. 인간은 숫자보다는 기호를 더 잘 기억한다.
변수 선언 변수는 사용하기 전에 반드시 미리 선언(declare)하여야 한다.
자료형이 다양한 이유는 커피 전문점에 다양한 컵의 사이즈가 있는 것과 같습니다. 자료형(data type): 데이터의 타입(종류) 정수형 데이터(100) 실수형 데이터(3.141592) 문자형 데이터(‘A’)
자료형 char c; // 문자형 변수 c 선언 int i; // 정수형 변수 i 선언 double interest_rate; // 부동소수점형 변수 interest_rate 선언
변수의 초기화
변수의 이름 알파벳 문자와 숫자, 밑줄 문자 _로 이루어진다. 이름의 중간에 공백이 들어가면 안 된다. 첫 번째 문자는 반드시 알파벳 또는 밑줄 문자 _이여야 한다. 따라 서 이름은 숫자로 시 작할 수 없다. 대문자와 소문자를 구별하여 서로 다른 것으로 취급한다. 따라서 변 수 index와 Index, INDEX은 모두 서로 다른 변수이다. C언어에서 사용하고 있는 키워드와 똑같은 이름은 허용되지 않는다.
변수의 이름 sum // 영문 알파벳 문자로 시작 _count // 밑줄 문자로 시작할 수 있다. number_of_pictures // 중간에 밑줄 문자를 넣을 수 있다. King3 // 맨 처음이 아니라면 숫자도 넣을 수 있다. 2nd_base(☓) // 숫자로 시작할 수 없다. money# // #과 같은 기호는 사용할 수 없다. double // double은 C 언어의 키워드이다.
자료형의 종류 자료형 바이트수 범위 정수형 short 2 -32768~32767 int 4 -2147483648~2147483647 long long long 8 –9,223,372,036,854,775,808~ 9,223,372,036,854,775,807 문자형 char 1 -128~127 부동소수점형 float 1.2E-38~3.4E38 double 2.2E-308~1.8E308 long double
왜 다양한 자료형을 사용할까?
자료형과 형식 지정자 int x; “%d” long x; “%ld” long long x; “%lld” float x; double x; “%lf”
상수 area = 3.14 * radius * radius;
정수형 가장 기본이 되는 것은 int CPU에 따라서 크기가 달라진다. 16비트, 32비트, 64비트 (Q) 왜 여러 개의 정수형이 필요한가? (A) 용도에 따라 프로그래머가 선택하여 사용할 수 있게 하기 위하여
정수 표현 방법 음수 보통은 첫 번째 비트를 부호 비트로 사용한다. 문제점이 발생한다.
정수형이 나타내는 정수의 범위 -32768에서 +32767까지의 정수
unsigned unsigned는 변수가 음수가 아닌 값만을 나타낸다는 것을 의미한다.
unsigned 수식자 #include <stdio.h> int main(void) { unsigned int speed; // 부호없는 int형 unsigned distance; // unsigned int distance와 같다. unsigned short players; // 부호없는 short형 unsigned long seconds; // 부호없는 long형 return 0; }
오버플로우 정수형이 나타낼 수 있는 범위를 넘어가는 것
오버플로우 #include <stdio.h> int main(void) { short s_money = 32767; // 최대값으로 초기화한다. s_money = s_money + 1; printf("s_money = %d\n", s_money); return 0; }
정수형 상수
16진수
10진수, 16진수, 8진수 출력 #include <stdio.h> int main(void) { printf("%d %#x %#o \n", 128, 128, 128); return 0; }
기호 상수 기호 상수(symbolic constant)는 상수에 이름을 붙인 것 리터럴 상수(literal)라고도 한다. #define EXCHANGE_RATE 1120 기호 상수의 장점 프로그램을 읽기가 쉬워진다. 변경을 쉽게 할 수 있다
기호 상수
Lab: 달러를 원화로 계산하기 변수를 선언하고 사용하는 예제로 달러화를 원화로 계산하는 프로 그램은 작성하여 보자.
Sol: 달러를 원화로 계산하기 #include <stdio.h> #define EXCHANGE_RATE 1120 // 기호 상수 정의 int main(void) { int usd; // 달러화 int krw; // 원화 printf("달러화 금액을 입력하시오: "); // 입력 안내 메시지 scanf("%d", &usd); // 달러화 금액 입력 krw = EXCHANGE_RATE * usd; // 원화로 환산 printf("달러화 %d달러는 %d원입니다.\n", usd, krw); // 계산 결과 출력 return 0; // 함수 결과값 반환 }
Lab: 재산 계산하기 한 달에 500만원씩 30년 동안 저금하면 얼마가 될까?
Sol: 재산 계산하기 #include <stdio.h> int main(void) { int property; int saving; printf("매달 저축 금액을 입력하시오: "); scanf("%d", &saving); property = saving * 12 * 30; printf("30년 후의 재산 = %d원 \n", property); return 0; }
Lab: 변수의 값 교환하기 변수 x 와 변수 y의 값을 서로 바꾸는 코드를 작성하여 보자. int a = 100; int b = 200; int tmp; tmp = a; // ① a = b; // ② b = tmp; // ③
Lab: 16진수로 하드웨어 제어하기 첫 번째 LED를 빛나게 하려면 어떤 값을 16진수로 하드웨어에 써야 하는가?
Sol: 16진수로 하드웨어 제어하기
부동소수점형 컴퓨터에서 실수는 부동소수점형으로 표현 소수점이 떠서 움직인다는 의미 과학자들이 많이 사용하는 과학적 표기법과 유사
부동소수점형
부동 소수점 상수
형식 지정자 float형의 값을 출력하거나 입력하려면 형식 지정자로 “%f”를 사용 한다. double형의 값을 입출력하려면 “%lf”을 사용한다. double radius; printf("반지름 값을 입력하시오: "); scanf("%lf", &radius); // 반드시 “%lf"을 사용하여야 한다.
예제 #include <stdio.h> int main(void) { float fvalue = 1234567890.12345678901234567890; double dvalue = 1234567890.12345678901234567890; printf("float형 변수=%30.25f\n", fvalue); printf("double형 변수=%30.25lf\n", dvalue); return 0; }
오버플로우와 언더플로우 #include <stdio.h> int main(void) { float x = 1e39; float y = 1.23456e-46; printf("x=%e\n", x); printf("y=%e\n", y); return 0; }
Lab: 태양빛 도달 시간 태양에서 오는 빛이 몇 분 만에 지구에 도착하는 지를 컴퓨터로 계 산해보고자 한다. 빛의 속도는 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; // 태양과 지구 사이 거리 저장하는 변수 // 149600000km로 초기화한다. double time; // 시간을 나타내는 변수 time = distance / light_speed; // 거리를 빛의 속도로 나눈다. time = time / 60.0; // 초를 분으로 변환한다. printf("빛의 속도는 %fkm/s \n", light_speed); printf("태양과 지구와의 거리 %fkm \n", distance); printf("도달 시간은 %f초\n", time); // 시간을 출력한다. return 0; } 빛의 속도는 300000.000000km/s 태양과 지구와의 거리 149600000.000000km 도달 시간은 8.311111초
Lab: 온도 변환하기 사용자로부터 화씨온도를 받아서 섭씨온도로 바꾸는 프로그램을 작 성해보자.
Sol: 재산 계산하기 #include<stdio.h> int main(void) { double celsius, fahrenheit; // 변수 선언 printf("화씨온도="); scanf("%lf", &fahrenheit); // 부동소수점형으로 입력받는다. celsius = (fahrenheit - 32.0) * 5.0 / 9.0; printf("섭씨온도=%lf \n", celsius); return 0; }
Lab: 원의 면적 계산하기 사용자로부터 원의 반지름을 받아서 원의 면적을 계산하는 프로그 램을 작성해보자.
Sol: 원의 면적 계산하기 /* 원의 면적을 계산하는 프로그램*/ #include <stdio.h> #define PI 3.141592 int main(void) { double radius; // 원의 반지름 double area; // 원의 면적 printf("원의 반지름을 입력하시요:"); scanf("%lf", &radius); area = PI * radius * radius; printf("원의 면적: %f \n", area); return 0; }
문자형 문자는 컴퓨터보다는 인간에게 중요 문자도 숫자를 이용하여 표현
문자형 문자는 컴퓨터보다는 인간에게 중요 문자도 숫자를 이용하여 표현 공통적인 규격이 필요하다. 아스키 코드(ASCII: American Standard Code for Information Interchange) 8비트를 사용하여 영어 알파벳 표현 (예) !는 33, ‘A’는 65, ‘B’는 66, ‘a’는 97, ‘b’는 98 !"#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `abcdefghijklmnopqrstuvwxyz{|}~
아스키 코드
예제 #include <stdio.h> int main(void) { char c; // 변수 선언 printf("문자를 입력하시오: "); // 입력 안내문 scanf("%c", &c); printf("입력된 문자는 %c입니다\n", c); return 0; }
Quiz (Q) 1과 ‘1’의 차이점은? (A) 1은 정수이고 ‘1’은 문자 ‘1’을 나타내는 아스키코드이다. 1 49
제어 문자 인쇄 목적이 아니라 제어 목적으로 사용되는 문자들 (예) 줄바꿈 문자, 탭 문자, 벨소리 문자, 백스페이스 문자
제어 문자를 나타내는 방법 아스키 코드를 직접 사용 이스케이프 시퀀스 사용 char beep = 7; printf("%c", beep); char beep = ‘\a’; printf("%c", beep);
이스케이프 시퀀스
예제 #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; }
Q & A