자료구조 실험 PSLab. 이태호
Big O 실습-1 2의 세제곱을 구하는 프로그램을 작성하시오. O(n)의 시간복잡도를 가지는 프로그램을 작성하 시오.
구조체 구조체 구조체도 배열처럼 여러 개의 데이터를 그룹으로 묶어서 하나의 자료형으로 정의하고 사용하는 자료형 구조체도 배열처럼 여러 개의 데이터를 그룹으로 묶어서 하나의 자료형으로 정의하고 사용하는 자료형 배열은 같은 자료형 만을 그룹으로 묶을 수 있지만, 구조체는 서로 다른 자료형을 그룹으로 묶을 수 있으므로 복잡한 자료 형태를 정의하는데 유용하게 사용 레코드(record) 자료를 체계적으로 관리하기 위해서 구성한 일정한 단위 형식 으로 필드(field) 레코드를 구성하는 하위 항목 파일(file) 여러 레코드가 모여서 하나의 파일을 구성 여러 자료형의 필드를 가지고 있는 레코드를 만들 때 구조 체 사용
구조체 필드와 레코드, 파일의 관계
구조체 구조체 선언 여러 자료형의 변수들을 그룹으로 묶어서 하나의 자료형으로 선언 구조체이름, 자료형, 데이터 항목으로 구성 여러 자료형의 변수들을 그룹으로 묶어서 하나의 자료형으로 선언 구조체이름, 자료형, 데이터 항목으로 구성 구조체의 이름 - 구조체로 정의하는 새로운 자료형의 이름 항목 - 구조체를 구성하는 내부 변수들의 이름 구조체의 항목은 배열의 각 배열요소에 해당 배열요소는 모두 같은 자료형으로 되어있으므로 배열요소 에 대한 선언 없이 사용이 가능하지만, 구조체에서는 각 항 목이 다른 자료형을 가질 수 있기 때문에 항목별로 자료형 과 항목이름(변수이름)을 선언해야 한다.
구조체 구조체 사용 예) 직원 관리 구조체 구조체 선언 구조체 employee의 구조
구조체 구조체 변수 선언 struct employee Lee, Kim, Park;
구조체 구조체 변수의 선언 유형 struct employee Park; Park.year = 1983; Lee.year = 1982; Lee.year = 1982;
구조체 구조체의 초기화 구조체 변수 선언 시에 각 데이터 항목에 대한 값 을 중괄호 안에 나열
구조체 구조체 데이터 항목의 참조 구조체 변수에 있는 각 데이터 항목을 참조하기 위해서 구조체 연산자 사용
구조체 점 연산자 : . 구조체 변수에 있는 데이터 항목을 개별적으로 지정할 때 사용 예)
구조체 화살표 연산자 : -> 구조체 포인터 변수에서 포인터가 가리키는 구조체 변수의 데이터항목을 지정하기 위해서 화살표 연산자 사용 예)
구조체의 크기 왜 9가 아니고 12일까요?? 1word = 4byte 구조체는 1word 단위로 메모리 공간을 할당한다 #include "stdafx.h“ int _tmain(int argc, _TCHAR* argv[]) { struct Good{ int a; int b; char c; }gh; printf("%d\n", sizeof(int)); printf("%d\n", sizeof(char)); printf("%d", sizeof(gh)); return 0; } 왜 9가 아니고 12일까요?? 1word = 4byte 구조체는 1word 단위로 메모리 공간을 할당한다 어셈블리의 offset, PC 증가와도 관련…
함수 포인터 함수 이름을 저장하는 변수를 선언할 수 있다 규?? #include <stdio.h> void testout1(const char *s) { printf("시험출력1:%s\n", s); } void testout2(const char *s) { printf("시험출력2:%s\n", s); // 함수포인터 변수 void (*funcPtr)(const char *s); int main() { // 함수포인터를 testout1, testout2로 각각 대입해보고 실행해본다. funcPtr = testout1; funcPtr("테스트"); funcPtr = testout2;
함수 포인터 그럼 어디다가 씁니까? 구조체에 함수를 내장할 수 있다!! Callback 함수를 선언할 때 사용한다. 콜백함수는 또 뭡니까… #include "stdafx.h" int sum(int a, int b){ return a+b; } int _tmain(int argc, _TCHAR* argv[]) { struct Good{ int a; int b; int (*sum)(int a, int b); }gh; scanf("%d", &gh.a); scanf("%d", &gh.b); gh.sum = sum; printf("%d", gh.sum(gh.a,gh.b)); return 0; 마치 구조체에 함수가 내장된 것처럼 사용할 수 있음 즉, sum함수를 구조체의 맴버로 인식시킬 수 있음
콜백함수 우리가 printf 함수를 사용할 때 뭐라고 합니까? 그렇습니다. 시스템이 우리에게 Call 하는 것이 콜백입니다. 그럼 Callback은? 거꾸로 콜?? 그렇습니다. 시스템이 우리에게 Call 하는 것이 콜백입니다. 즉 Call : 우리가 시스템에 만들어진 함수를 부르는 것 Callback : 시스템이 우리가 만든 함수를 부르는 것
콜백함수 음… 그런데 제가 알기론 컴퓨터는 깡통인데 어떻게 우리가 만 든 함수 이름을 알 수 있나요? 그렇습니다. 그래서 시스템 개발자들은 함수 포인터 변수를 선 언해둡니다. 우리는 시스템이 우리 코드를 실행 할 수 있도록 시스템 개발 자들이 선언한 함수 포인터 변수에 우리 함수 이름을 넣기만 하면 됩니다. //콜백이 일어날 때 sum 함수를 실행 시키도록 하고 싶다 int sum(int a, int b){ return a + b; } … System.callbackPtr = sum; //이렇게 하면 시스템이 프로그램을 실행하다가 특정 이벤트를 만나면 //자동으로 sum 함수를 실행 할 것이다
함수 포인터 a와 b에 값을 사용할 수 있음 gh이라는 객체를 생성 sum 함수를 사용할 수 있음 왜 이런 어려운 것을 하나요? 객체지향적 프로그래밍 방법론을 이해하기 위하여… 어떤 언어로든 절차지향, 객체지향 프로그램을 할 수 있다… 다만 언어를 설계할 때 방법론에 최적화되게 설계해서 그런거임… gh이라는 객체를 생성 a와 b에 값을 사용할 수 있음 sum 함수를 사용할 수 있음
함수 포인터 a와 b에 값을 사용할 수 있음 gh이라는 객체를 생성 sum 함수를 사용할 수 있음 #include "stdafx.h" int sum(int a, int b){ return a+b; } int _tmain(int argc, _TCHAR* argv[]) { struct Good{ int a; int b; int (*sum)(int a, int b); }gh; scanf("%d", &gh.a); scanf("%d", &gh.b); gh.sum = sum; printf("%d", gh.sum(gh.a,gh.b)); return 0; gh이라는 객체를 생성 a와 b에 값을 사용할 수 있음 sum 함수를 사용할 수 있음
구조체 실습 실습-2 구조체를 이용한 성적관리 프로그램 미리 하다가 걸리지 마세요. 구조체에 들어갈 데이터들 학생 5개 입력 학생 이름 국어 영어 수학 총점 학생 5개 입력 입력을 마쳤으면 화면에 입력한 것을 출력하도록 합니 다. 미리 하다가 걸리지 마세요.
구조체 + 포인터 실습-3 위 성적관리 프로그램에서 생성한 구조체의 포인 터를 생성 생성한 포인터로 값을 넣고 빼세요
향상 문제!! – 구조체 + 함수포인터 실습-4 총점을 내는 함수를 구조체에 내장해보자!! 함수 포인터를 사용하여 총점을 구하는 함수를 구 조체에 내장합니다. 총점 필드를 제거합니다. 내장한 함수의 리턴값을 이용하여 총점을 출력하 도록 만듭니다.