기초C언어 제3주 C프로그램 구성요소, 변수와 자료형 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호, hwlee@inje.ac.kr
다음 주 제1차 시험 시험 범위 : 1장 ~ 4장 시험일시 : 3월 23일(목요일) 6교시 시험 장소 : E??? 30문제 각 3점, 요약종이 준비할 것(10점) 5,6장 읽어 오기 숙제 제출은 시험 다음 주 제출
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express
이번 장에서는 C프로그램을 이루는 구성요소들을 살펴봅니다. 이번 장에서 학습할 내용 이번 장에서는 C프로그램을 이루는 구성요소들을 살펴봅니다. * 주석 * 변수, 상수 * 함수 * 문장 * 출력 함수 printf() * 입력 함수 scanf() * 산술 연산 * 대입 연산
일반적인 프로그램의 형태 데이터를 받아서(입력단계), 데이터를 처리한 후에(처리단계), 결과를 화 면에 출력(출력단계)한다.
덧셈 프로그램 #1 주석 /* 두개의 숫자의 합을 계산하는 프로그램*/ #include <stdio.h> 전처리기 int main(void) { int x; // 첫번째 정수를 저장할 변수 int y; // 두번째 정수를 저장할 변수 int sum; // 두 정수의 합을 저장하는 변수 x = 100; y = 200; sum = x + y; printf("두수의합: %d", sum); return 0; } 주석 전처리기 지시어 함수 변수선언 문장 연산
프로그램의 실행 화면 두수의 합: 300
주석(comment) /* 두개의 숫자의 합을 계산하는 프로그램 */ #include <stdio.h> 주석은 코드를 설명하는 글입니다. /* 두개의 숫자의 합을 계산하는 프로그램 */ #include <stdio.h> int main(void) { ... } 주석
3가지 방법의 주석 /* 한줄로 된 주석 */ /* ------------------------ 저자: 홍길동 날짜: 2013.3.4 여러 줄로 이루어진 주석 -------------------------- */ // 여기서부터 줄의 끝까지 주석
주석의 예 주석 /* This program accepts an array of N elements and a key. * * Then it searches for the desired element. If the search * * is successful, it displays "SUCCESSFUL SEARCH". * * Otherwise, a message "UNSUCCESSFUL SEARCH" is displayed. */ #include <stdio.h> void main() { … }
들여쓰기 들여쓰기(indentation): 같은 수준에 있는 문장들을 왼쪽 끝에서 몇 자 안 으로 들여쓰는 것
주석과 들여 쓰기가 없다면.. 실행은 되지만 무슨 처리를 하고 있는 프로그램인지 알기가 힘들고 또한 들여쓰기가 안 되어 있어서 같은 수준에 있는 문장들을 구분하기 힘듭니다. #include <stdio.h> int main(void) { int x; int y; int sum; x = 100; y = 200; sum = x + y; printf("두수의 합: %d", sum); return 0; }
중간 점검 주석은 /* /* ...... */ */와 같이 중첩할 수 있을까? 주석은 한줄 이상이 될 수 있는가? 주석에는 어떤 내용을 쓰면 좋은가? 주석은 프로그램의 동작에 어떤 영향을 끼치는가?
전처리기 #include <stdio.h> stdio.h는 표준 입출력에 대한 라이브러리 함수의 정의가 들어 있다. 외부 파일을 포함시키라는 의미의 전처리기 #기호로 시작
전처리기 /* 첫번째 프로그램 */ // stdio.h … int printf(char *,…); int main(void) { printf("Hello World!"); return 0; } // stdio.h … int printf(char *,…); #include <stdio.h> stdio.h hello.c
중간 점검 printf()를 사용하기 위하여 포함시켜야 하는 헤더 파일은 무엇인가? 전처리기 #include의 의미는 무엇인가?
함수 함수(function): 특정 기능을 수행하는 처 리 단계들을 괄호로 묶어서 이름을 붙인 것 함수는 프로그램을 구성하는 기본적인 단 위(부품) 입력 함수 출력
함수의 구조
함수안에 들어 있는 것 A) 함수 안에는 함수가 처리하는 처리 단계(문장)들이 중괄호 안에 나열 입력 출력 문장 1; 문장 2; 문장 3; ... 위에서 아래로 순차적으로 실행된다. Q) 그렇다면 함수 안에 들어 있는 것은 무엇인가? A) 함수 안에는 함수가 처리하는 처리 단계(문장)들이 중괄호 안에 나열
함수 작업을 수행하는 문장은 함수 안에 들어가야 함 여기에 작업을 넣을 것. int main(void) { … }
함수 호출 A) 함수가 호출되면 실행된다. Q) 함수 호출은 어떻게 하는가? A) 함수의 이름을 적어주면 된다. 함수B(); 함수A 문장 1; 문장 2; 문장 3; ... 함수C 문장 1; 문장 2; 문장 3; ... 함수B 문장 1; 문장 2; 문장 3; ... 프로그램
함수 호출 A) main() 함수이다. 다른 함수들은 main()으로부터 직간접적으로 호출된다. Q) 많은 함수 중에서 가장 먼저 실행되는 것은? A) main() 함수이다. 다른 함수들은 main()으로부터 직간접적으로 호출된다. input() 문장 1; 문장 2; 문장 3; ... output() process() main() input(); process(); output();
문장 함수는 여러 개의 문장으로 이루어진다. 문장들은 순차적으로 실행된다. 문장은 ;(세미콜른)으로 끝나야 한다.
return 문장
main()은 누가 호출할까?
중간 점검 모든 C 프로그램에 반드시 있어야 되는 함수는 무엇인가? 함수의 시작과 끝을 나타내는 기호는 무엇인가? 모든 문장은 어떤 기호로 끝나는가?
변수 Q) 변수란 무엇인가? int x; // 첫번째 정수를 저장하는 변수 int y; // 두번째 정수를 저장하는 변수 int sum; // 두 정수의 합을 저장하는 변수 Q) 변수란 무엇인가? 프로그램이 사용하는 데이터를 일시적으로 저장할 목적으로 사용하는 메모리 공간
변수의 종류 변수는 데이터를 담는 상자로 생각할 수 있다. 데이터 int x; 2 x 자료형 변수의 이름 변수의 이름
변수의 종류 변수에는 데이터의 종류에 따라 여러 가지 타입이 존재한다.
변수의 이름 식별자(identifier): 변수나 함수의 이름 식별자를 만드는 규칙 식별자의 예: 식별자는 영어의 대소문자, 숫자, 밑줄 문자 _로 이루어진다. 식별자는 숫자로 시작할 수 없다. 대문자와 소문자를 구별하며 C 언어의 키워드와 똑같은 이름은 허용되 지 않는다. 식별자의 예: s, s1, student_number: 올바른 식별자 $s, 2nd_student , int: 잘못된 식별자
변수 선언 변수 선언: 컴파일러에게 어떤 타입의 변수가 사용되는지를 미리 알리는 것 int x; 자료형 변수의 이름
자료형 자료형(data type): 변수가 저장할 데이터가 정수인지 실수인지, 아니면 또 다른 어떤 데이터인지를 지정하는 것
변수 선언 int x; // 첫번째 정수를 저장하는 변수 int y; // 두번째 정수를 저장하는 변수 int sum; // 두 정수의 합을 저장하는 변수 각 변수는 정수를 저장 할 수 있다. x y sum 메모리 공간에 변수 가 만들어지고 이름이 붙여진다.
값을 변경할 수 있으나 상수는 한번 값이 정해지면 변경이 불가능합니다. x = 100; y = 200; 상수 상수(constant): 그 값이 프로그램이 실행하는 동안 변하지 않는 수 변수는 실행도중에 값을 변경할 수 있으나 상수는 한번 값이 정해지면 변경이 불가능합니다. 12 12 변수 상수
중간 점검 int형 변수 i를 선언하는 문장을 작성하여 보자. double형 변수 f를 선언하는 문장을 작성하여 보자. 변수 선언은 함수의 어떤 위치에서 하여야 하는가?
수식 수식(expression): 피연산자와 연산자로 구성된 식 수식은 결과값을 가진다. sum = x + y; x2 - 5x + 6의 값을 계산하라. int x, y; x = 3; y = x * x - 5 * x + 6; printf(“%d\n”, y);
+ - * / % 산술 연산 연산 연산자 C 수식 수학에서의 기호 덧셈 x + y 뺄셈 x - y 곱셈 x * y xy 나눗셈 나머지 % x % y x mod y
산술 연산 sum = x + y; 5 2 3 = + sum x y
= ; 대입 연산 100 100 x = 100; 대입 연산(assignment operation): 변수에 값을 저장하는 연산 대입 연산 = 배정 연산 = 할당 연산 = 연산자는 변수에 값을 저장합니다. = ; 100 100 x
정리
중간 점검 변수a와 변수 b의 곱을 변수 product에 저장하는 문장을 작성하여 보자. 변수a를 변수 b로 나눈 값을 변수 quotient에 저장하는 문장을 작성하여 보자.
printf() printf(): 모니터에 출력을 하기 위한 표준 출력 라이브러리 함수
문자열 출력 printf("Hello World!\n"); 문자열(string): “Hello World!\n”와 같이 문자들을 여러 개 나열한 것 printf("Hello World!\n"); Hello Wo H e l l o W o printf()
변수값 출력
형식 지정자 형식 지정자: printf()에서 값을 출력하는 형식을 지정한다. 형식 지정자 의미 예 실행 결과 %d 10진 정수로 출력 printf(“%d \n”, 10); 10 %f 실수로 출력 printf(“%f \n”, 3.14); 3.14 %c 문자로 출력 printf(“%c \n”, ‘a’); a %s 문자열로 출력 printf(“%s \n”, “Hello”); Hello
여러 개의 변수값 출력
주의!
중간 점검 printf()에서 변수의 값을 실수 형태로 출력할 때 사용하는 형식 지정자는 무엇인가? printf()를 사용하여서 정수형 변수 k의 값을 출력하는 문장을 작성하여 보 자.
덧셈 프로그램 #2 사용자로부터 입력을 받아보자.
두번째 덧셈 프로그램 // 사용자로부터 입력받은 2개의 정수의 합을 계산하여 출력 #include <stdio.h> int main(void) { int x; // 첫번째 정수를 저장할 변수 int y; // 두번째 정수를 저장할 변수 int sum; // 2개의 정수의 합을 저장할 변수 printf("첫번째 숫자를 입력하시오:"); // 입력 안내 메시지 출력 scanf("%d", &x); // 하나의 정수를 받아서 x에 저장 printf("두번째 숫자를 입력하시오:"); // 입력 안내 메시지 출력 scanf("%d", &y); // 하나의 정수를 받아서 x에 저장 sum = x + y; // 변수 2개를 더한다. printf("두수의 합: %d", sum); // sum의 값을 10진수 형태로 출력 return 0; // 0을 외부로 반환 } 첫번째 숫자를 입력하시오:10 두번째 숫자를 입력하시오:20 두수의 합: 30
scanf()의 동작 키보드로부터 값을 받아서 변수에 저장한다. 변수의 주소를 필요로 한다.
scanf()
형식지정자 형식 지정자 의미 예 %d 정수를 10진수로 입력한다 scanf(“%d”, &i); %f float 형의 실수로 입력한다. scanf(“%f”, &f); %lf double 형의 실수로 입력한다. scanf(“%lf”, &d); %c 문자 형태로 입력한다. scanf(“%c”, &ch); %s 문자열 형태로 입력한다. char s[10]; scanf(“%s”, &s);
scanf() 형식 지정자와 변수의 자료형은 일치하여야 함
실수 입력시 주의할 점 float 형은 %f 사용 float ratio = 0.0; scanf("%f", &ratio); double scale = 0.0; scanf("%lf", &scale); double 형은 %lf 사용
중간 점검 scanf()를 시용하여서 사용자로부터 실수값을 받아서 double형의 변수 value에 저장하는 문장을 작성하여 보자.
연봉 계산 프로그램 /* 저축액을 계산하는 프로그램 */ #include <stdio.h> int main(void) { int salary; // 월급 int deposit; // 저축액 printf("월급을 입력하시오: "); scanf("%d", &salary); deposit = 10 * 12 * salary; printf("10년 동안의 저축액: %d\n", deposit); return 0; } 사용자로부터 월급을 입력받는다. 월급에 10*12를 곱하여 10년동안의 저축액을 계산한다. 결과를 출력한다. 월급을 입력하시오: 200 10년 동안의 저축액: 24000
원의 면적 프로그램 /* 원의 면적을 계산하는 프로그램*/ #include <stdio.h> int main(void) { float radius; // 원의 반지름 float area; // 면적 printf("반지름을 입력하시오: "); scanf("%f", &radius); area = 3.14 * radius * radius; printf("원의 면적: %f\n", area); return 0; } 원의 면적 계산 반지름을 입력하시오: 5.0 원의 면적: 78.500000
환율 계산 프로그램 달러에 대한 원화 환율을 입력하시오: 928.78 원화 금액을 입력하시오: 1000000 /* 환율을 계산하는 프로그램*/ #include <stdio.h> int main(void) { float rate; // 원/달러 환율 float usd; // 달러화 int krw; // 원화 printf("달러에 대한 원화 환율을 입력하시오: "); // 입력 안내 메시지 scanf("%f", &rate); // 사용자로부터 환율입력 printf("원화 금액을 입력하시오: "); // 입력 안내 메시지 scanf("%d", &krw); // 원화 금액 입력 usd = krw / rate; // 달러화로 환산 printf("원화 %d원은 %f달러입니다.\n", krw, usd); // 계산 결과 출력 return 0; // 함수 결과값 반환 } 달러에 대한 원화 환율을 입력하시오: 928.78 원화 금액을 입력하시오: 1000000 원화 1000000원은 1076.681204달러입니다.
실습: 사각형의 둘레와 면적 필요한 변수는 w, h, area, perimeter라고 하자. 변수의 자료형은 실수를 저장할 수 있는 double형으로 하자. area = w*h; perimeter = 2*(w+h); w h
프로그램의 실행 화면 사각형의 넓이: 50.000000 사각형의 둘레: 30.000000
코딩 #include <stdio.h> int main(void) { double w; double h; double area; double perimeter; w = 10.0; h = 5.0; area = w*h; perimeter = 2*(w+h); printf("사각형의 넓이: %lf", area); printf("사각형의 둘레: %lf", perimeter); return 0; } 사각형의 넓이: 50.000000 사각형의 둘레: 30.000000
도전문제 한번의 printf() 호출로 변수 perimeter와 area의 값이 동시에 출력되도 록 변경하라. 변수들을 한 줄에 모두 선언하여 보자. w와 h의 값을 사용자로부터 받도록 변경하여 보자. %lf를 사용한다.
Q & A
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express
이번 장에서 학습할 내용 이번 장에서는 변수와 각종 자료형을 살펴봅니다. * 변수와 상수의 개념 이해 * 자료형 * 정수형 * 실수형 * 문자형 * 기호 상수 사용 * 오버플로우와 언더플로우 이해
변수 12 평균 A) 프로그램에서 일시적으로 데이터를 저장하는 공간 Q) 변수는 왜 필요한가? Q) 변수(variable)이란 무엇인가? A) 프로그램에서 일시적으로 데이터를 저장하는 공간 Q) 변수는 왜 필요한가? A) 데이터가 입력되면 어딘가에 저장해야만 다음에 사용할 수 있다. 성적들의 평균을 구하려면 먼저 성적들이 어딘가에 저장되어 있어야 함 78 12 90 평균 56
변수 = 상자 변수는 물건을 저장하는 상자와 같다. 7 int i 데이터 변수의 타입 변수의 이름
변수가 만들어지는 곳 변수는 메인 메모리에 만들어진다. 1 2 3 4 2 2
메모리를 주소로 사용한다면 (Q) 만약 메모리를 변수처럼 이름을 가지고 사용하자 않고 주소로 사용하다면? “100번지에 0을 대입하라” (A) 충분히 가능하지만 불편하다. 인간은 숫자보다는 기호를 더 잘 기억한다. 100번지에 0을 .. 근데 102번지는 어떤 용도로 쓰고 있지?
변수와 상수 12 12 변수(variable): 저장된 값의 변경이 가능한 공간 상수(constant): 저장된 값의 변경이 불가능한 공간 (예) 3.14, 100, ‘A’, “Hello World!” 12 모든 애니메이션은 한번의 클릭으로 상자에 들어간 후 이동 모션까지 완료됨 클릭1 : 변수 애니메이션 클릭2 : 상수 애니메이션 클릭3 : Q&A * 변수(원) 애니메이션 : 슬라이드가 끝날 때까지 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); return 0; } 변수 상수 원의 면적을 입력하시요:10 원의 면적: 314.159210
자료형 자료형(data type): 데이터의 타입(종류) (예) short, int, long: 정수형 데이터(100) (예) double, float:실수형 데이터(3.141592) (예) char: 문자형 데이터(‘A’, ‘a’, ‘한’)
디양한 자료형이 필요한 이유 (Q) 다양한 자료형이 필요한 이유는? (A) 상자에 물건을 저장하는 것과 같다. 물건이 상자보다 크면 들어가지 않을 것이다. 물건이 상자보다 너무 작으면 공간이 낭비될 것이다.
자료형
자료형의 크기 char short int float double long double
예제: 자료형의 크기 #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 정수형 부호있음 short short형 정수 2 -32768~32767 int 정수 4 -2147483648~2147483647 long long형 정수 부호없음 unsigned short 부호없는 short형 정수 0~65535 unsigned int 부호없는 정수 0~4294967295 unsigned long 부호없는 long형 정수 문자형 char 문자 및 정수 1 -128~127 unsigned char 문자 및 부호없는 정수 0~255 부동소수점형 float 단일정밀도 부동소수점 1.2E-38~3.4E38 double 두배정밀도 부동소수점 8 2.2E-308~1.8E308 long double
변수의 이름짓기 7 100 x sum 식별자(identifier): 식별할 수 있게 해주는 이름 변수 이름 함수 이름 김영희 김철수 7 100 x sum
식별자를 만드는 규칙 (Q) 다음은 유효한 식별자인가? sum _count O king3 n_pictures 2nd_try 알파벳 문자와 숫자, 밑줄 문자 _로 구성 첫 번째 문자는 반드시 알파벳 또는 밑줄 문자 _ 대문자와 소문자를 구별 C 언어의 키워드와 똑같은 이름은 허용되지 않는다. (Q) 다음은 유효한 식별자인가? sum _count king3 n_pictures 2nd_try Dollor# double O X // 숫자로 시작 X // #기호 X // 키워드
좋은 변수 이름 변수의 역할을 가장 잘 설명하는 이름 밑줄 방식: bank_account a, b, c, d,… number, average, sum,…
키워드 auto double int struct break else long switch 키워드(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
변수 선언 컴파일러에게 어떤 변수를 사용하겠다고 미리 알리는 것 자료형 변수 이름 int index; int index
변수 선언의 예 변수 선언의 예 char c; int i; double interest_rate; int height, width; char c int i double interest_rate int int height width
변수에 값을 저장하는 방법 4.9 7 ‘a’ 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를 대입 4.9 7 double interest_rate ‘a’ int char c i
변수의 초기화 자료형 변수이름 = 초기값; 변수 초기화의 예 ‘a’ char c = ‘a’; int i = 7; 자료형 변수이름 = 초기값; 변수 초기화의 예 ‘a’ char c char c = ‘a’; int i = 7; double interest_rate = 0.05; 7 int i 0.05 double interest_rate
일반 문장이 시작된 후에 변수를 선언하는 것은 C언어에서는 곤란합니다. 변수 선언 위치 일반 문장이 시작된 후에 변수를 선언하는 것은 C언어에서는 곤란합니다. int main(void) { int i; // ○ printf("Hello World!\n"); … int sum; // ⅹ } 클릭 1 : 변수 부분 색칠, 말풍선 클릭 2 : 일반문장 부분 색칠, 말풍선 클릭 3 : 잘못된 변수 선언 말풍선 C99 새 표준에서는 가능
변수의 사용 대입 연산자를 이용하여서 값을 저장한다. 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; } 변수 선언 달러화 금액을 입력하시오: 100 달러화 100달러는 112000원입니다.
정수형 short int long ≤ ≤ ≤ ≤ 가장 기본이 되는 것은 int CPU에 따라서 크기가 달라진다. 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으로 초기화한다. year = 10; // 약 3만2천을 넘지 않도록 주의 sale = 200000000; // 약 21억을 넘지 않도록 주의 total_sale = year * sale; // 약 21억을 넘지 않도록 주의 printf("total_sale = %d \n", total_sale); return 0; } Total sale = 200000000
signed, unsigned 수식자 signed 부호를 가지는 값을 나타냄을 의미 흔히 생략 int long 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 int overflow
오버플로우 assasa s_money = -32768 u_money = 0 #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 클릭 1 : 빨간 줄 밝기 변화 클릭 2 : 오버플로우 문구 밝기 변화 클릭 3 : 실행화면 나타내기
오버플로우 규칙성이 있다. 수도 계량기나 자동차의 주행거리계와 비슷하게 동작 ... ... 2147483646 - 32768 32767 32766 32767 ... 2147483646 short 의 경우 ... 1 65534 65535 unsigned short 의 경우
정수 상수 접미사 자료형 예 u 또는 U unsigned int 123u 또는 123U l 또는 L long 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; // 8진수 int z = 0xA; // 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 EXCHANGE_RATE 1120
기호 상수를 만드는 방법 #2 1120 const int EXCHANGE_RATE = 1120; 변수가 값을 변경할 수 없게 한다. const int EXCHANGE_RATE = 1120; 1120 const 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); printf("세금은 %f입니다.", y_salary*TAX_RATE); return 0; } 기호상수 월급을 입력하시요: 100 연봉은 1200입니다. 세금은 240.000000입니다.
정수 표현 방법 1 컴퓨터에서 정수는 이진수 형태로 표현되고 이진수는 전자 스위치로 표현된 다. 클릭 1 : 0 나타내기 컴퓨터에서 정수는 이진수 형태로 표현되고 이진수는 전자 스위치로 표현된 다. 1 클릭 1 : 0 나타내기 클릭 2 : 회로 나타내기 클릭 3 : 1 밝기 변화 , 회로 밝기 변화
정수 표현 방법 양수 음수 십진수를 이진수로 변환하여 저장하면 된다. 보통은 첫번째 비트를 부호 비트로 사용한다. 문제점이 발생한다.
음수를 표현하는 첫번째 방법 첫번째 방법은 맨 처음 비트를 부호 비트로 간주하는 방법입니다. 양수와 음수의 덧셈 연산을 하였을 경우, 결과가 부정확하다. (예) +3 + (-3) 이 방법으로 표현 된 이진수를 평범하게 더하면 결과가 부정확합니다.
3-3 = 3+(-3) 컴퓨터는 덧셈만 할 수 있다 컴퓨터는 회로의 크기를 줄이기 위하여 덧셈회로만을 가지고 있다. 뺄셈은 다음과 같이 덧셈으로 변환한다. 3-3 = 3+(-3)
음수를 표현하는 두번째 방법 2의 보수로 음수를 표현한다. -> 표준적인 음수 표현 방법 2의 보수를 만드는 방법
2의 보수로 양수와 음수를 더하면 음수를 2의 보수로 표현하면 양수와 음수를 더할 때 각각의 비트들을 더하면 됩니다.
예제 /* 2의 보수 프로그램*/ #include <stdio.h> int main(void) { int x = 3; int y = -3; 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; } 음수가 2의 보수로 표현되는지를 알아보자. x = 00000003 y = FFFFFFFD x+y = 00000000
부동소수점형 컴퓨터에서 실수는 부동소수점형으로 표현 소수점이 떠서 움직인다는 의미 과학자들이 많이 사용하는 과학적 표기법과 유사
실수를 표현하는 방법 #1 고정 소수점 방식 정수 부분을 위하여 일정 비트를 할당하고 소수 부분을 위하여 일정 비트를 할당 정수 부분을 위하여 일정 비트를 할당하고 소수 부분을 위하여 일정 비트를 할당 전체가 32비트이면 정수 부분 16비트, 소수 부분 16비트 할당 과학과 공학에서 필요한 아주 큰 수를 표현할 수 없다
실수를 표현하는 방법 #2 부동 소수점 방식 표현할 수 있는 범위가 대폭 늘어난다. 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.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; x = (1.0e20 + 5.0)-1.0e20; printf("%f \n",x); return 0; } 부동소수점 연산에서는 오차가 발생한다. 5.0이 아니라 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.... 값을 출력하여야 한다. 소수점 몇 자리까 지 정확하게 출력되는가?
문자형 문자는 컴퓨터보다는 인간에게 중요 문자도 숫자를 이용하여 표현
문자형 문자는 컴퓨터보다는 인간에게 중요 문자도 숫자를 이용하여 표현 공통적인 규격이 필요하다. 아스키 코드(ASCII: American Standard Code for Information Interchange) 8비트를 사용하여 영어 알파벳 표현 (예) !는 33, ‘A’는 65, ‘B’는 66, ‘a’는 97, ‘b’는 98 !"#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `abcdefghijklmnopqrstuvwxyz{|}~
아스키 코드표 (일부)
문자 변수 char형의 변수에 문자를 저장하려면 아스키 코드 값을 대입 char형의 변수가 문자 저장 char c; char answer; char code; char c char answer char code char형의 변수에 문자를 저장하려면 아스키 코드 값을 대입 code = 65; // ‘A’ 저장 code = ‘A’; 클릭 :
예제 /* 문자 변수와 문자 상수*/ #include <stdio.h> int main(void) { char code1 = 'A'; // 문자 상수로 초기화 char code2 = 65; // 아스키 코드로 초기화 printf("문자 상수 초기화 = %c\n", code1); printf("아스키 코드 초기화 = %c\n", code2); } 문자 상수 초기화 = A 아스키 코드 초기화 = A
Quiz (Q) 1과 ‘1’의 차이점은? (A) 1은 정수이고 ‘1’은 문자 ‘1’을 나타내는 아스키코드이다. 1 49
제어 문자 인쇄 목적이 아니라 제어 목적으로 사용되는 문자들 (예) 줄바꿈 문자, 탭 문자, 벨소리 문자, 백스페이스 문자
제어 문자를 나타내는 방법 아스키 코드를 직접 사용 이스케이프 시퀀스 사용 char beep = 7; printf("%c", beep); char beep = ‘\a’; printf("%c", beep);
이스케이프 시퀀스 제어 문자 이름 제어 문자 표기 값 의미 널문자 \0 문자열의 끝을 표시 경고(bell) \a 7 문자열의 끝을 표시 경고(bell) \a 7 "삐“하는 경고 벨소리 발생 백스페이스(backspace) \b 8 커서를 현재의 위치에서 한 글자 뒤로 옮긴다. 수평탭(horizontal tab) \t 9 커서의 위치를 현재 라인에서 설정된 다음 탭 위치로 옮긴다. 줄바꿈(newline) \n 10 커서를 다음 라인의 시작 위치로 옮긴다. 수직탭(vertical tab) \v 11 설정되어 있는 다음 수직 탭 위치로 커서를 이동 폼피드(form feed) \f 12 주로 프린터에서 강제적으로 다음 페이지로 넘길 때 사용된다. 캐리지 리턴(carriage return) \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; // 태양과 지구 사이 거리 저장하는 변수 // 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초
도전문제 위의 프로그램의 출력은 8.31111...초로 나온다. 이것을 분과 초로 나누어 서 8분 20초와 같은 식으로 출력하도록 변경하라. 필요하다면 형변환을 사 용하라. 추가적인 정수 변수를 사용하여도 좋다.
Q & A