12.07.2015 Views

C 프로그래밍 기초 - 한국기술교육대학교

C 프로그래밍 기초 - 한국기술교육대학교

C 프로그래밍 기초 - 한국기술교육대학교

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

©copyright 2008프로그래밍기초(BSM540)C 프로그래밍 기초한국기술교육대학교 인터넷미디어공학부 김상진강의목표키워드식별자변수상수자료유형오버플로우/언더플로우/round-off d 오류변수: 선언위치, 선언방법, 초기화, 제한사항, 가시영역2/27


키워드프로그래밍 언어에서 키워드(keyword)란 고유한 의미를 가지는예약되어 있는 단어를 말한다.이들 단어는 사용자가 다른 용도로 사용할 수 없다.auto _Bool break case char_Complex const continue default restrictdo double else enum externfloat for goto if _Imaginaryinline int long register returnshort signed sizeof static structswitch typedef union unsigned voidvolatile whileC99에 정의된 키워드main은 키워드가 아니다. 하지만 main처럼 다른 용도로 사용하면혼란을 가져다 줄 수 있는 이름들이 있다.컴파일러마다 예약하여 사용하는 단어들도 있다.3/27식별자프로그램을 작성할 때 프로그래머가 새롭게 이름을 부여해야 하는경우가 많다. 이들을 식별자(identifier)라한다.예3.1)함수 이름, 변수 이름, 상수 이름 등식별자는 정해진 규칙에 따라 명명되어야 한다.식별자 명명 규칙영문자, 숫자, 밑줄문자(_)만을 사용할 수 있으며, 숫자로 시작할 수없다.예3.2)_total, sum, box01 등은 유효,12dice, white-box 등은 유효하지 않음중간에 공백 문자가 포함될 수 없다.int와 같은 키워드는 식별자로 사용할 수 없다.식별자는 대소문자를 구분한다.4/27


식별자 – 계속식별자의 종류에 따라 통일성 있게 이름을 명명하는 것이 바람직하다.식별자의 형태만 보면 이것이 어떤 식별자인지 알 수 있어야 한다.주로 낙타 형태(camel case)의 표기법(예: MasterCard)을사용한다.두 개 이상의 단어를 연결하여 하나의 식별자로 사용할 때각 단어의 첫 문자를 대문자로 사용하고 나머지는 모두 소문자로사용하는 형태를 말함종류에 따른 표기법상수: 모두 대문자, 예3.3)MAX변수: 소문자로 시작하여 낙타 형태 표기법 사용, 예3.4) 34)lastName함수: 변수와 동일, 예3.5)printStudent()타입: 대문자로 시작하여 낙타 형태의 표기법 사용, , 예3.6)) Student5/27데이터프로그램을 작성하기 전에 반드시 분석해야 하는 것 중 하나는이 프로그램에서 어떤 데이터가 필요한지 분석하는 것이다.프로그램에서 사용되는 데이터는 크게 상수(constant)와 변수(variable)로 구분될 수 있다.상수: 프로그램이 실행되는 동안 변하지 않는 값변수: 프로그램이 실행되는 동안 값이 변할 수 있는 데이터프로그램에서 필요한 데이터의 종류는 다양하며, 데이터의 종류를자료유형 또는 타입(type)이라 한다.학생의 나이를 기록할 때에는 정수가 필요하고,학생 성적의 평점을 기록할 때에는 실수가 필요하고,'F'와 같은문자데이터, "KUT"와 같은 문자열 데이터도 필요하다.C 언어에서는 이런 데이터를 표현하기 위해 몇 가지 기본 자료유형을제공한다.문자형, 정수형, 실수형(부동소수형), 문자열형6/27


변수변수: 어떤 값을 저장하는 곳long컴퓨터에서 값이 저장되는 곳은 주기억장치프로그램 과정에서 데이터를 일시적으로 보관하기 위해 사용한다.일시적으로 저장한다는 것은 나중에 다시 사용한다는 것을말한다. 따라서 저장하는 값마다 이름을 할당해야 그것을 나중에접근할 수 있다.이 이름을 변수 이름이라 한다.변수를 사용하기 위해서는 먼저 변수를 선언해야 하며,이 때 어떤 종류의 데이터를 저장할 것인지(자료유형),그리고 이 데이터를 어떤 이름(변수이름)으로 접근할지를알려주어야 한다.intsum7/27자료유형자료유형은 다음 두 가지 특성에 의해 정의된다.도메인: 어떤 한 자료유형이 가질 수 있는 값들의 집합자료유형에 적용할 수 있는 연산들의 집합자료유형에 따라 필요한 공간의 크기가 다르며, 크기에 의해자료유형에 저장할 수 있는 값의 범위가 결정된다.예3.6)크기가 1바이트이고 양의 정수만 저장한다면 0에서255까지만 저장할 수 있다.정수형 타입에는 곱셈이라는 연산이 존재하지만 문자형의 경우에는의미가 없는 연산이다.정수형과 부동소수형은 모두 나눗셈 연산을 가지고 있지만 그것의평가 방법은 다르다.예3.7)3/2 = 1, 3.0/2.0 = 1.5어떤 연산을 데이터에 적용하기 전에 해당 연산이 적용하고자 하는자료유형에 정의되어 있는지 있다면 어떤 기능을 수행하는지파악하여야 한다.8/27


기본 자료유형C95문자형 char signed char unsigned char정수형[signed] short [int] [signed] [int] [signed] long [int]정수형unsigned short [int] unsigned int unsigned long [int]부동소수형 float double long doubleC99에 추가된 자료형long longVisual C++ 6.0에서는 지원하지 않지만 Visual Studio 5.0은long long 타입 지원부동소수점 수(floating point number): C 언어에서는 실수를부동소수점 수라 한다.여기서 점(point)은 소수점을 말하며, 수를 표현할 때 소수점을위치를 수의 어느 위치에나 사용할 수 있기 때문에 부동소수점 수라한다.9/27signed vs. unsignedsigned와 unsigned의 차이signed는 음수/양수를 모두 나타낼 수 있지만 unsigned는양수만 나타낸다.부호가 있는 경우에는 첫 비트는 부호 비트로 사용해야 하며,양수만 표현할 경우에는 부호 비트가 필요 없다.따라서 4비트로 수를 표현하면 signed(2의 보수)는 –8에서 7,unsigned는 0에서 15까지 표현할 수 있다.unsigned을 사용하고 싶을 경우에만 unsigned를 사용한고,signed는 주로 생략한다.따라서 정수형들은 기본형과 unsigned형 두 가지만 기억하면 된다.10/27


기본 자료유형의 크기보통 char는 1 byte, short는 2 byte, int는 4 byte, long은 4 byte이상이다. 하지만 컴파일러마다 차이가 있을 수 있다. 하지만 다음은항상 성립한다.sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long)정수형에서 기본이 되는 형은 int이다.보통 float는 4 byte, double는 8 byte, long double은 8 byte이상이다. 하지만 컴파일러마다 차이가 있을 수 있다. 하지만 다음은항상 성립한다.sizeof(float) ≤ sizeof(double) ≤ sizeof(long double)부동소수형에서 기본이 되는 형은 double이다.11/27기본 자료유형의 크기 – sizeof 연산자sizeof는 기본 자료유형의 크기(단위: 바이트)를 알려주는 연산자이다.하지만 사용은 마치 함수처럼 사용된다.문법 1. sizeof (변수명)문법 2. sizeof (자료형명)문법 3. sizeof 변수명예3.8)int n = 10;sizeof n == sizeof(n) == sizeof(int)12/27


오버플로우특정한 자료유형은 컴파일러에 따라 다를 수 있지만 고정된 크기의공간을 사용한다. 따라서 특정 자료유형의 변수에 저장할 수 있는 값의범위는 제한적이다.예3.9)unsigned char 변수의 크기는 보통 1 byte이므로 이와 같은변수에는 0에서 255까지의 값만 유지할 수 있다.unsigned char n1 = 200;unsigned char n2 = 100;n1 = n1 + n2;하지만 n1에는 크기 제한 때문에300이 저장될수없다.이와 같이 유지할 수 있는 값보다 큰 값을 저장하고자 할 때 발생하는현상을 오버플로우(overflow)라 한다.C 언어는 자료유형에 대해 엄격한 언어가 아니다.따라서 오버플로우가 일어나면 오류가 발생하지 않고, 현재 형이수용할 수 있는 형태로 바뀐다.예3.10)예3.9에서 300의 이진형태 100101100이므로 n1에 실제저장되는 것은 00101100 = 44이다.13/27언더플로우정수형들을 사용할 때에는 오버플로우만 걱정하면 되지만부동소수형들을 사용할 때에는 언더플로우(underflow)도 걱정해야한다.언더플로우: 0과 가까운 매우 작은 수를 나타낼 수 없는 현상하지만 부동소수형을 사용할 때 가장 주의해야 하는 것은 round-offoff오류이다. 예를 들어 8비트를 이용하여 부동소수를 표현한다고가정하면 256개의 다른 소수값 밖에 나타낼 수 없다. 즉, 특정 소수값의표현은 불가능하며, 가장 가까운 값으로 대신 표현할 수 밖에 없으며,이 차이에 의해 발생하는 오류를 말한다.overflowunderflowoverflow014/27


부동소수 표현방식부동소수 표현방식부호(1비트) 지수(8비트) 가수(23비트)예3.11)8비트: 1/2/53.75 10 = 11.11 2 = 1.111 × 2 1 0 10 11100위 예서 알 수 있듯이 가수 부분으로 나타낼 수 있는 수는 총 2 5 이며,지수 부분이 나타낼 수 있는 값의 범위는 –1부터 2이다.양수, 음수, 지수를 고려하여도 전체적으로 8비트를 사용하므로나타낼 수 있는 수는 총 2 8 이다.round-off 오류: 이 표현방식으로 나타낼 수 있는 실수는 매우제한적이다.언더플로우: 2 -1 보다 작은 수는 표현할 수 없다.15/27변수의 선언선언(declaration) 위치: 함수 외부 또는 함수 내부함수 외부에 선언된 변수: 전역 변수(global variable)함수 내부에 선언된 변수: 지역 변수(local variable)함수 내부에 변수를 선언할 때 선언 위치함수 시작 부분에 선언하며, 변수를 선언하는 문장이아닌 다른 프로그래밍 문장이 기술된 이후에는 선언할 수 없음변수 선언 문법예3.12)int sum;typename variablename;변수는 선언과 동시에 초기화할 수 있다. 즉, 값을 선언과 동시에저장할 수 있다. 그것의 문법은 다음과 같다.typename variablename = initial_value;예3.13)int sum = 0;sumsum16/27


변수의 선언 – 계속변수를 선언한 후에 나중에 대입문을 이용하여 초기화할 수 있다.하지만 두 가지 방법의 차이가 프로그램에 영향을 주지 않으면선언과 동시에 초기화하는 것이 효율적이다.예3.14)int sum;sum = 0;초기화하지 않은 변수에는 어떤 값이?예3.15)int sum;printf("%d\n", sum);변수의 종류에 따라 다르지만함수 내부에 선언되는 지역변수가초기화되지 않은 경우에는 이 변수가초기에 어떤 값을 가지게 될지는알수없다.17/27변수의 선언 – 계속동일 유형의 여러 개의 변수를 동시에 선언할 수도 있다.예3.16)int sum, n1, n2;하지만 한 줄에 하나의 변수만 사용하며, 변수의 용도를 주석처리하는 것이 가장 좋은 변수 선언 방법이다.int n1;int n2;int sum;// 사용자로부터 입력 받을 정수// 사용자로부터 입력 받을 정수// 사용자로부터 입력 받은 두 정수의 합int n1, // 사용자로부터 입력 받을 정수n2, // 사용자로부터 입력 받을 정수sum; // 사용자로부터 입력 받은 두 정수의 합18/27


변수의 선언 – 계속변수는 선언된 이후에만 사용할 수 있다.선언된 줄 이후부터 사용할 수 있다.예3.17)옆코드지역변수: n1, n2, n3광역변수: g1지역변수는 그것이 선언된 함수 내에서만사용할 수 있다.광역변수는 그것이 선언된 이후에 정의된모든 함수에서 사용할 수 있다.변수가 사용될 수 있는 범위를가시영역(scope)이라 한다.사용할 수 있는 범위가 같은 영역에같은 이름의 변수를 선언할 수 없다.void f1(void){int n1;} // f4()int g1;void f2(void){int n2;} // f2()void f3(void){int n3;} // f3()19/27변수의 사용예3.18)두 개의 정수를 입력 받아 합을 출력하는 프로그램/* sum.c */#include int main(void){int sum;int n1;int n2;printf("첫 번째 정수를 입력하시오: ");scanf("%d", &n1);printf("두 두 번째 정수를 입력하시오: ");scanf("%d", &n2);sum = n1+n2;printf("%d + %d = %d\n", n1, n2, sum);return 0;}20/27


문자의 저장단일 문자는 char 유형을 사용한다.문자 상수는 작은 따옴표를 사용하여 표현한다.예3.19)char c = 'a';실제 c 변수에 문자 'a'에 대한7비트 아스키코드 값이 저장된다.대부분의 문자코드는 알파벳 순서로 코드 값이 부여된다.즉 'c' –'a'는 2이다.따라서 c ='n'+2이면 n+2이면 c 변수에 문자 'p'에 에 해당하는 코드가저장된다.21/27scanf/printfscanf는 표준입력(키보드)으로부터 데이터를 입력 받기 위해 사용하고,printf는 표준출력(화면)에 데이터를 출력하기 위해 사용한다.표준입력으로 데이터를 입력 받기 위해서는 어떤 자료유형의 값을받을지 알려주어야 한다.이를 위해 변환(conversion) 지시자를 사용하며, 변환 지시자는 %기호로 시작된다.정수 데이터를 입력 또는 출력 받고 싶을 경우에는 %d를 보통사용한다.제어문자열 또는 출력문자열 내에 변환 지시자와 이들 문자열 다음에나열되는 값의 개수가 같아야 하며, , 순서에 따라 1:1 매핑된다.printf("%d + %d = %d\n", n1, n2, sum);입력 받을 경우에는 입력 받을 값을 임시로 저장할 변수이름을제어문자열 다음에 나열한다. 이 때 변수이름 앞에 & 기호를 사용한다.출력의 경우에는 &기호가 필요 없다.22/27


대입문과 표현식대입문(assign statement)은 변수에 값을 저장하기 위해 사용하는프로그램 문장이다.sum = n1+n2;variable = expression;l-value = expression;표현식(expression): 항(term)과 연산자(operator)로 구성된 식을말하며, 표현식은 평가(evalutate)되어 어떤 결과 값을 주게 된다.항이 될 수 있는 것상수, 변수, 함수 호출, 괄호로 된 표현식 3 + 6이항 산술 연산자n + 2sqrt(2) + 3.5+: 덧셈 (단항연산자로 사용 가능)(4+2) / 3–: 뺄셈 (단항연산자로 사용 가능)*: 곱셈/: 나눗셈 (정수 나눗셈과 부동소수 나눗셈의 의미가 다름)%: 나머지 (두 피연산자가 모두 양의 정수)23/27표현식의 평가표현식의 평가에 있어 중요한 것은 연산자의 우선순위(precedence)와결합성(associativity)이다.표현식 a+b*c는 는 a+(b*c)와 같이 평가된다.즉, + 연산자보다 * 연산자가 우선순위가 높다.두 개의 연산자가 공통되는 피연산자를 가지면 우선순위가 높은연산자부터 평가된다.표현식 a*b*c는 (a*b)*c와 같이 평가된다.첫 번째 * 연산자와 두 번째 * 연산자는 모두 b라는 공통된피연산자를 가진다. 따라서 우선순위를 고려해야 하는데, 동일한연산자이므로 우선순위가 같다.우선순위가 같으면 결합성에 따라 평가방법이 결정된다.결합성이라 평가하는 순서 방향을 나타낸다.* 연산자는 왼쪽에서 오른쪽으로 평가된다.24/27


상수상수(constant): 변하지 않는 값을 상수라 한다.보통 자료값 자체를 프로그램에 직접 표현하면 이들은 모두 상수로간주된다.예3.20)int sum = 0;여기서 0은 정수 상수 값이다.동일한 상수를 여러 번 사용할 경우에는 값 자체를 직접 표현하지않고, 상수에도 이름을 할당하여 값 대신에 이름을 사용할 수도있다.25/27상수 – 계속정수 상수보통 10진수로 표현하지만 8진수 또는 16진수로 표현 가능8진수는 앞에 '0'을, 16진수는 앞에 "0x" 또는 "0X"를 붙인다.예3.21)10, 012, 0xAU 또는 u 접미사: unsigned 타입의 상수 정의L 또는 l 접미사: long int 타입의 상수 정의부동소수점 상수일반적인 표기법과 과학적 표기법 두 가지 방법으로 표현 가능예3.22)2.9978, 2.99E-2(=0.0299)접미사를 사용하지 않는 부동소수점 상수는 double 타입이다.F 또는 f 접미사: float 타입의 상수 정의L 또는 l 접미사: long double 타입의 상수 정의26/27


상수 – 계속문자열 상수: 큰 따옴표를 붙여 표현예3.23)"KUT"문자열 상수는 끝에 null 문자 '\0'(=0)를 포함한다.문자열 상수들은 컴파일 시간에 결합할 수 있으며, 이 기능은긴 문자열을 여러 줄에 걸쳐 작성하는데 널리 사용된다.예3.24)"한기대 ""인터넷미디어공학부"와"한기대 인터넷미디어공학부"는같다.문자 상수: 작은 따옴표를 붙여 표현예3.25)'K''K'와 "K"는 큰 차이가 있다. 전자는 단일 문자이며, 후자는단일 문자로 구성된 문자열이다.27/27

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!