380 likes | 608 Views
Multimedia Programming (Part 1: C/C++ Programming). Hyunki Hong Dept. of Image Eng., GSAIM ChungAng Univ. Contents. 상수와 변수 수식과 연산자 제어 명령문 파생자료형 ( 배열 , 포인터 , 구조체 등 ) C++ 함수 클래스와 객체. 키보드로부터 입력받고 이를 계산 ( 예 : 2 배 곱셈 ) 하는 프로그램이라면 , 1. 입력받는 기능 ( 함수 )
E N D
Multimedia Programming(Part 1: C/C++ Programming) Hyunki Hong Dept. of Image Eng., GSAIM ChungAng Univ.
Contents 상수와 변수 수식과 연산자 제어 명령문 파생자료형(배열, 포인터, 구조체 등) C++ 함수 클래스와 객체
키보드로부터 입력받고 이를 계산 (예: 2배 곱셈)하는 프로그램이라면, 1. 입력받는 기능(함수) 2. 연산(곱셈)하는 기능(함수) 3. 결과 출력하는 기능(함수) 2 4 C 프로그램의 구조 작성규칙 1. 함수는 ‘{’로 시작하고 ‘}’로 끝남. 2. 문장 끝에는 반드시 ‘;’ 3. main() 함수의 위치와 관계없이 프로그램은 항상 main()에서 시작 4. 주석문은 ‘/*’로 시작하고 ‘*/’로 끝남. cf. ‘//’
// 선행처리 지시자 // 프로그램 시작 // 변수선언 // 함수원형 // 프로그램 문장 C 프로그램의 구성요소 # include <헤더 파일> void main() { 선언문; …. }
C++ 개발환경 Microsoft Visual C++ 통합개발환경 : Windows 2000 등의 운영체제에서 실행 가능한 프로그램 개발하도록 하는 컴파일러 원시코드 입력, 편집, 컴파일, 실행 및 오류 수정 등을 지원하는 여러 도구 포함. 그래픽 편집기 등 이용해 윈도우 표준자원(메뉴, 그림, 아이콘 등) 처리 가능 미리 작성된 다양한 클래스 등 사용 가능
Visual C++ Console 프로그래밍 소스코드 입력 및 저장 한 개 또는 여러 개 관련 파일 등을 묶어 ‘프로젝트 작업공간(Workspace)’로 관리: *.dsw 새로운 프로젝트: File – New 도스형 프로그램(콘솔 응용프로그램) 선택 An empty project & Finish
Visual C++ Console 프로그래밍 소스코드 입력 및 저장 ‘An empty project’ 형태인 경우 소스 파일 생성 : File – New ‘C++ Source File’ 선택: 자동으로 *.cpp 생성 ‘C++ Header File’ : 헤더 파일 작성 프로젝터 내 모든 파일 한번에 저장: [Save Workspace], 각 파일 저장은 File – Save 저장된 프로젝트 열기: [File – Open Workspace]
콘솔 프로그램 컴파일과 실행 실행파일 만들기 : 소스파일을 실행파일로 번역하기 위해 [Build – Build HelloCpp.exe] 선택
콘솔 프로그램 컴파일과 실행 작성된 프로그램 실행하기 소스파일이 오류없이 build되었다면, exe 파일 생성 프로젝트 디렉토리 하위에 자동으로 생성되는 Debug에 생성됨. [Project – Settings] 메뉴에서 변경 가능 Visual C++ 내에서 실행: [Build – Execute HelloCpp.exe] 선택 도스 창이나 윈도우 ‘명령 프롬프트’ 내에서 실행하려면, 실행파일이 저장된 곳으로 이동하여 실행
전처리기(preprocessor) • 컴파일하기 전에 프로그램에 대한 일련의 작업 수행 • 일반적으로 함수 외부에 기술 • #기호를 명령어 앞에 붙이고 마지막에 ; 기호 사용× • #include, #define문이 대표적 • 표준헤더 파일에서 많이 볼 수 있다.
#include • 각종 라이브러리 함수의 원형, 구조체의 데이터 형 선언 등이 들어 있는 헤더 파일을 프로그램에 포함시키고자 할 때 • #include <iostream.h> • #include “c:\header_file\han.h” • #include “graphics.h” 표준 헤더의 디렉토리(include) 에서 찾아 포함 시킴 ..VC98\include\*.h 프로그래머가 만든 화일 포함시킬 때 디렉토리 생략하면 현재 작업 디렉토리 나 표준 헤더 디렉토리
#define • 매크로 상수 • 프로그램 전체에서 하나의 기호 상수나 자료형을 다른 이름으로 대치시키도록 선행처리기에게 알려주고, 실제 매크로가 호출되면 호출된 자리에 정의된 기호상수나 자료형으로 대치 • #define 매크로명 상수 또는 문자열 • #define SIZE 100 ….. char ch[SIZE]; • 매크로 함수 • 인수 있는 매크로(함수) • #define 매크로명(매개변수,…) (치환리스트) • #define sum3(i,j,k) ((i)+(j)+(k)) 보통 대문자 형식매개변수는 부작용 방지를 위해 일일이 괄호로 묶어 준다
매크로 상수/함수 #include <stdio.h> #define sum3(i,j,k) ((i)+(j)+(k)) #define AA 2 void main() { printf("%d",sum3(AA,3,5)); printf("\n%d",AA); } 1.printf("%d",sum3(2,3,5)); 2.printf("%d", ((2)+(3)+(5)) );
Contents 상수와 변수 수식과 연산자 제어 명령문 파생자료형(배열, 포인터, 구조체 등) C++ 함수 클래스와 객체
식별자(identifier) • : 변수, 함수, 상수 등에 부여한 이름 • 변수(variable) • : 프로그램이 실행되는 동안 수정될 수 있는 값을 • 저장하기 위한 기억장소(메모리 위치)의 이름 • 상수(constant) • : 항상 그 값이 변하지 않는 수(문자상수, 숫자상수) 식별자, 변수, 상수
식별자 명명 규칙 • 영문자(A-Z, a-z), 숫자(0-9), 밑줄(_)로 구성 • 첫 글자는 반드시 영문자 또는 밑줄로 시작 • 대문자와 소문자는 다른 변수(Max,max) • 처음부터 32문자까지만 식별 • 이름은 자료 의미나 기능을 알 수 있도록 • 예약어는 식별자로 사용 불가 • counter, var1, s_p, _han, SUM1 O • if, for, float, else, void, class, private ×
예약어(keyword) • 그 의미가 컴파일러에 의해 미리 정해져 있는 단어
설명문(comment) • 프로그램의 수행과 무관하게 프로그램의 목적, 수행과정, 알고리즘에 대한 설명을 프로그램 내에 기술하는 프로그램의 이해를 돕기 위한 문장 • 행(line) 설명문: ‘//’(C++에서 추가), 블록 설명문: ‘/*’, ‘*/’ /*#########################*/ /* 화일이름 : HelloCpp.cpp */ /* 목 적 : 연습 2 */ /* 작성일 : 2007. 9. 13 */ /*########################*/ #include <iostream.h> void main() { int i; int sum; /*누적합 위한 변수*/ for(i=0;i<10;i++) cout<<i; } /*#########################*/ /* 화일이름 : HelloCpp.cpp */ /* 목 적 : 연습 */ /* 작성일 : 2007. 9. 13 */ /*########################*/ //#include <iostream.h> #include <stdio.h> // 전처리기 void main() /* 리턴값이 없는 main 함수*/ { /* 함수의 시작*/ printf("안녕하세요? "); /*화면에 출력하는 함수*/ //cout<<"안녕하세요? "; } /* 함수의 끝*/
기본 입출력문 • C에서는 <stdio.h> 통해 양식에 의한 입출력 함수 사용 : printf(), scanf() • C++는 <iostream.h> 통해 스트림 입출력 - cin >> :키보드부터 문자열, 표준자료형 변수에 자료 할당 - cout <<: 모니터에 문자열, 표준자료형 출력 #include <iostream.h> main(void) { int inData; cout<<"정수를 입력하시오: " ; cin >> inData; cout << "입력한 정수는"<< inData <<"입니다.\n"; cout << "끝" ; }
선언과 정의 • 선언: 변수를 사용하기 위해 자료형을 미리 컴파일러에게 알려 주어 기억 장소를 확보 → 자료형과 함께 변수 이름 나열 • 정의: 선언 개념에 더하여 객체(변수)에 필요한 기억장소가 할당되는 동작 포함 char ch; // 문자형 변수 ch 선언 int count = 1; // 정수형 변수 count 선언 및 초기화 char *name = “Kim”; // 문자 포인터 변수 name 선언 및 초기화 struct complex {float re, im;}; //새로운 구조체 자료형 complex cvar; // 구조체 변수 정의
자료형 • 자료가 저장될 기억장소들의 형(type) 정의 : 할당되는 메모리 크기가 다름. • 기본 자료형 - 기본형 1) 문자형: char, unsigned char 2) 정수형: unsigned int, short int, int, unsigned long 3) 실수형: float, double - 포인트형: * - 구조형: 배열형 [], 구조체 struct, 공용체 union - 열거형: enum - 무형: void
기본 자료형의 크기와 종류 단정도 실수형 (유효 7자리) 배정도 실수형 (유효 15자리) sizeof(자료형)
잘못된 자료형 선택 예 • 문제점은? #include <iostream.h> main(void) { int kor1=97, eng1=98, math1=95, sum1=0, ave1=0; int kor2=96, eng2=98, math2=95, sum2=0, ave2=0; sum1 = kor1 + eng1 + math1; ave1 = sum1 / 3; sum2 = kor2 + eng2 + math2; ave2 = sum2 / 3; if(ave1 > ave2) cout << "1번 학생이 우승!!!\n" ; else if(ave1 < ave2) cout << "2번 학생이 우승!!!\n" ; else cout << "공동 우승!!!\n"; }
상수(constant) • 항상 그 값이 변하지 않은 요소 : 문자상수, 숫자상수 • 정수형 • 실수형 • 문자 상수 • 문자열 상수
실수형(real) 상수 • 소수점 포함, 기본적으로 double형 실수, 실수 상수 뒤에 F, f를 붙이면 float형, l을 붙이면 long double형 • 십진형 • 정수부, 소수점, 소수부 • 125.76, 100. , -0.7 • 지수적 표기법 • 10진수의 소수부와, 지수부는 e나 E, 부호, 지수로 구성 • 지수는 정수형만 사용 • 부호를 생략하면 양수 • 0.345e+02(0.345×102), -3.14E-2 • 10293847.0 = 1.0293847×107 = 1.0293847e7
문자형(character) 상수 • 단일 인용부호(‘ ’)로 묶어 사용하는 하나의 문자 • 실제 기억장소에 기억될 때는 해당 ASCII 코드값이 저장 • ‘A’: 영문자 A, ‘\n’: 새 줄 문자, ‘\t’: 수평탭 #include <stdio.h> #include <iostream.h> void main() { printf("%d\n", 'A'+'B'+'C'); //A=65, B=66, C=67 cout<<'A'+'B'+'C'; }
문자열(string) 상수 • 여러 문자를 나타낼 경우 이중 인용부호(“ ”)로 묶음 • 문자형 배열에 저장됨 • “H N1” • 문자열 상수의 내부 표현 • “ ” 안에 escape 문자 사용 가능 • “안녕\n” • ‘A’: 문자상수 (1바이트 저장), • “A”: 문자열 상수(2바이트 저장) 문자열 상수에서는 문자열의 끝을 의미하는 NULL 문자가 자동적으로 붙여짐 #include <iostream.h> void main() { cout<<"문자\'A\'의 크기는" <<sizeof('A')<<endl; cout<<"문자\"A\"의 크기는" <<sizeof("A")<<endl; cout<<"문자\"1234\"의 크기는" <<sizeof("1234")<<endl; }
변수(Variable) • 수정될 수 있는 값을 저장하기 위해 사용된 특정 메모리 위치의 이름 • 변수 선언 • 모든 변수는 사용하기 전에 선언 • 동일한 자료형을 갖는 두개 이상의 변수는 “,” 로 변수와 변수를 구분 • int a, b, c; • double sum, ave, number; • int num=10, sum=0; int a; int b; int c; int a; int b;int c;
지역변수와 전역변수 • 블록(block): 서로 밀접한 선언문, 실행문을 하나의 단위로 묶어 프로그램 실행 단위로 나누고, 블록 내 변수의 유효범위를 결정하기 쉽도록 하는 언어적 개념. 블록 지정은 ‘{’ 와 ‘}’ 사용 • 유효영역(scope): 프로그램 한 블록에서 다른 블록의 자료나 코드의 조회에 대한 규칙 • 지역변수: 한 블록에서 선언된 변수. 선언된 블록 안에서 유효영역이 제한됨. • 전역변수: 프로그램 전체에서 사용. 실행 끝까지 값 보존 • 영역지정 연산자(::): 동일 이름의 전역, 지역변수 구별 가능 지역변수와 전역변수 이름이 같을 때 전역변수임을 알려줌.
지역, 전역변수 사용예 #include <iostream.h> int j = 10; void main() { int j=0; int i=0; for(i=0;i<=10;i++){ j +=i; } cout<<"::j=" <<::j<<endl; cout<<"j=" <<j; } // 프로그램 시작 전역 j // main 함수 블록 시작 지역 j 지역 i // for 블록 시작 // for 블록 끝 // main 함수 블록 끝 // 프로그램 종료
기억장소에 따른 변수 • 변수의 기억장소: 주기억 장소와 레지스터 - 레지스터 변수: 예약어 register 사용 • 주기억 장소에 저장되는 변수 - 자동(auto) 변수: 블록 안에서 생명주기 가지는 지역변수와 일치. 변수 정의시 auto 추가, auto 예약어 없어도 컴파일러가 모두 자동변수로 해석 - 정적(static)변수: 전역변수의 개념 - 외부(extern)변수: 대형 프로젝트에서 한 프로그램에서 정의된 전역변수를 다른 프로그램에서 사용하려면 extern 선언. cf. 분리 컴파일
자동변수와 정적변수 비교 #include <iostream.h> void sub1(); void sub2(); void main() { int i = 0; for(i=0;i<5;i++) sub1(); for(i=0;i<5;i++) sub2(); } void sub1() { auto int j=0; j=j+1; cout << "자동변수 j =" << j << endl; } void sub2() { static int k=0; k=k+1; cout << "정적변수 k =" << k << endl; } k를 전역변수로 바꾸면?
자료의 형변환(type conversion) • 자동 형변환: 산술 계산 등에서 다른 자료형을 혼합하여 계산하거나 대입문으로 기억시킬 때, 자동으로 자료형 변환 - 가장 큰 자료형으로 자동 변환됨. #include <iostream.h> void main() { int i = 2, j = 3; float f; i = j/i; // 정수형 = 정수형/정수형 cout << i << endl; // i 값 출력 f = j/i + 3.2; // 실수형 = 정수결과 + 실수형 상수 cout << f << endl; // f값 출력 f = j; f = f/i; // 실수형 = 정수형/실수형 = 실수형/정수형 cout << f << endl; // f값 출력 j = f /i + 3.2; // 정수형 = 실수형결과 + 실수형상수 cout << j << endl; // j값 출력 }
자료의 형변환(type conversion) • 강제 형변환: 프로그래머가 의도적으로 자료형 변환 - 캐스트 형변환: (변환 자료형) 변수이름 - 형변환 함수법: 변환 자료형 (변수 이름) #include <iostream.h> void main() { int a, b, c, i = 5; float f; c= 3.56 + 7.89; f= 3.56 + 7.89; cout << "int(3.56)+int(7.89)=" << int(3.56)+int(7.89) << endl; cout << "(int)(3.56+7.89)=" << (int)(3.56+7.89) << endl; cout << "22/7=" << 22/7 << endl; cout << "float(22)/7=" << float(22)/7 << endl; cout << "c=" << c << endl; cout << "f=" << f << endl; }
변수의 동적 초기화 • 컴파일 시간이 아닌, 실행시간에 초기값이 결정 #include <iostream.h> #include <string.h> void main() { char name[] = "HongKilDong"; // 문자열을 위한 배열변수 int k = strlen(name); // 동적 초기화 변수 k cout << "k=" << k << endl; for (int i=0; i<k;i++) // 문자열 길이만큼(필요한 만큼..)만 출력 cout<<name[i]; }
기호 상수(symbolic constant) 선언 • 프로그램 내에서 변하지 않는 상수값 가지는 변수, 자료형 앞에 const 명시하여 정의 • 관례상 일반변수는 소문자로 시작, 상수변수는 대문자로만 또는 대문자로 시작 #include <iostream.h> main() { const float PI = 3.141592; cout << PI; } #include <iostream.h> #define PI 3.141592; main() { cout << PI; }