배열이란? 배열의 선언? - 배열과 포인터의 관계? 문자열이란? 문자배열 연결 리스트

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제1장 기초 사항.
제14장 동적 메모리.
연결리스트(linked list).
제 9 장 구조체와 공용체.
-Part2- 제3장 포인터란 무엇인가.
8. 객체와 클래스 (기본).
C++ Espresso 제9장 다형성.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
5장 배열 작성자 : 변재현.
Lesson 5. 레퍼런스 데이터형.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
상속이란? - 기반클래스로부터 다른 클래스를 파생하는 법 protected란? 가상함수 (virtual function)
5장. 참조 타입.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제 3장. C보다 나은 C++ II.
C 프로그래밍.
Dynamic Memory and Linked List
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
C ++ 프로그래밍 시작.
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
스택(Stack) 김진수
자료구조: CHAP 4 리스트 (3) 순천향대학교 컴퓨터공학과 하 상 호.
프로그래밍 랩 – 7주 리스트.
14장. 포인터와 함수에 대한 이해.
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
Introduction To Data Structures Using C
C#.
13. 연산자 오버로딩.
인터넷응용프로그래밍 JavaScript(Intro).
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
Chapter 1 C와는 다른 C++. 최호성.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
포인터 1차원 배열과 포인터 2차원 배열과 포인터 문자열 배열과 포인터 포인터 배열
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
루프와 카운트 Looping and counting
멤버 함수인 operator+()가 실행, 또는 전역 함수인 operator+()가 실행 Point p3 = p1+p2; 에서
멤버함수 중첩( 복사 생성자 ) - 연사자 중첩 - 동적 메모리를 가지는 클래스를 지원 하도록 멤버 함수 작성
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
A Basic of C++.
객체기반 SW설계 팀활동지 4.
조 병 규 Software Quality Lab. 한 국 교 통 대 학 교
데이터 동적 할당 Collection class.
포인터와 배열 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
제 4 장 Record.
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
어서와 C언어는 처음이지 제21장.
13. 포인터와 배열! 함께 이해하기.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

배열이란? 배열의 선언? - 배열과 포인터의 관계? 문자열이란? 문자배열 연결 리스트 배열과 연결 리스트 배열이란? 배열의 선언? - 배열과 포인터의 관계? 문자열이란? 문자배열 연결 리스트

배열이란 배열 배열의 선언 배열의 원소 배열의 끝을 지나 값을 저장할 경우 동일한 자료형을 저장하는 장소들의 모임 배열내의 각각의 저장 장소 변위(offset)을 지정하여 접근 배열의 끝을 지나 값을 저장할 경우 항의 존재 유무를 검사하지 않는다 “offset X 각 원소의 크기” 위치에 무조건 저장 형 배열의이름 [항의개수] ; long LongArray[25] ; LongArray[0] ~ LongArray[24]

#include <iostream> using namespace std; int main() { long sentinelOne[3]; long TargetArray[25]; long sentinelTwo[3]; for (int i=0; i<3; i++) sentinelOne[i] = sentinelTwo[i] = 0; for (i=0; i<25; i++) TargetArray[i] = 0; cout <<"Test 1: \n"; cout <<"TargetArray[0]: "<<TargetArray[0] << "\n"; cout <<"TargetArray[24]: “<<TargetArray[24]<<"\n\n"; for (i = 0; i<3; i++) cout << "sentinelOne[" << i << "]: "; cout << sentinelOne[i] << "\n"; cout << "sentinelTwo[" << i << "]: "; cout << sentinelTwo[i]<< "\n"; } list 13.2

cout << "\nAssigning..."; for (i = 0; i<=25; i++) TargetArray[i] = 20; cout << "\nTest 2: \n"; cout << "TargetArray[0]: " << TargetArray[0] << "\n"; cout << "TargetArray[24]: " << TargetArray[24] << "\n"; cout << "TargetArray[25]: " << TargetArray[25] << "\n\n"; for (i = 0; i<3; i++) { cout << "sentinelOne[" << i << "]: "; cout << sentinelOne[i]<< "\n"; cout << "sentinelTwo[" << i << "]: "; cout << sentinelTwo[i]<< "\n"; } return 0;

배열의 초기화 (X) (O) array 크기 = sizeof( IntegerArray ) ={쉼표로 분리된 초기값들} int IntegerArrary[5] = { 10, 20, 30, 40, 50 } ; int IntegerArrary[5] = { 10, 20, 30, 40, 50 } ; int IntegerArrary[5] = { 10, 20, 30, 40, 50, 60 } ; (X) int IntegerArrary[5] = { 10, 20} ; (O) int IntegerArrary[ ] = { 10, 20, 30, 40, 50 } ; array 크기 = sizeof( IntegerArray ) / sizeof( IntegerArray[0] ) ;

기타 배열명 배열의 차원 (사용자 정의)객체의 배열 같은 범위 내에서 같은 변수명이나 배열명과 겹쳐서는 안됨 배열명은 배열을 가지고 있는 메모리의 주소 ( 제일 첫번째 원소의 주소 ) 배열의 차원 상수형 또는 나열형 변위는 변수가 가능하나 선언 시 배열의 크기는 변수가 되어서는 안됨 (사용자 정의)객체의 배열 모든 객체(내장+사용자 정의)는 배열에 저장 가능

#include <iostream> using namespace std; class CAT { public: CAT() { itsAge = 1; itsWeight=5; } ~CAT() {} int GetAge() const { return itsAge; } int GetWeight() const { return itsWeight; } void SetAge(int age) { itsAge = age; } private: int itsAge; int itsWeight; }; int main() CAT Litter[5]; for (int i = 0; i < 5; i++) Litter[i].SetAge(2*i +1); for (i = 0; i < 5; i++){ cout << "Cat #" << i+1<< ": "; cout << Litter[i].GetAge() << endl; } return 0;

다차원 배열 n n 차원의 배열은 n개의 첨자를 가짐 다차원 배열 초기화 형 배열의이름 [항의개수][항의갯수] … [항의개수] ; n SQUARE Board[8][8] ; int Array[4][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } ; Array[0][ ] Array[1][ ] int Array[4][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} } ;

포인터 배열 (포인터가 저장된 배열) 포인터 배열 사용 예 각 객체는 자유 기억 공간에 저장 그 포인터(자유 기억 공간의 주소)를 포인터 배열에 저장 제한된 스택 메모리의 공간을 절약

#include <iostream> using namespace std; class CAT { public: CAT() { itsAge = 1; itsWeight=5; } ~CAT() {} int GetAge() const { return itsAge; } int GetWeight() const { return itsWeight; } void SetAge(int age) { itsAge = age; } private: int itsAge; int itsWeight; }; list 13.6

int main() { CAT * Family[500]; int i; CAT * pCat; for (i = 0; i < 500; i++) pCat = new CAT; pCat->SetAge(2*i +1); Family[i] = pCat; } cout << "Cat #" << i+1 << ": "; cout << Family[i]->GetAge() << endl; return 0;

자유기억공간에 배열 선언 CAT *Family = new CAT [500] ; CAT *pCat = Family ; 배열을 가지고 있는 포인터가 반환 포인터의 연산은 다음 객체를 가리키도록 연산됨 자유 기억 공간의 배열 지우기 CAT * Family = new CAT[ 500 ] ; CAT *Family = new CAT [500] ; CAT *pCat = Family ; pCat->SetAge(10) ; // Family[0] pCat++; pCat ->SetAge(20) ; // Family[1] delete [ ] Family ;

포인터와 배열명 FamilyOne은 500개의 Cat 배열 Family = &FamilyOne[ 0 ] FamilyTwo 는 500개의 Cat에 대한 포인터를 저장하는 배열 (포인터 배열) FamilyThree는 자유기억공간상에 500개의 Cat 배열의 처음을 가리키는 포인터 Cat FamilyOne[ 500 ] ; Cat * FamilyTwo[ 500 ] ; Cat * FamilyThree = new Cat [ 500 ] ;

#include <iostream> class CAT { public: CAT() { itsAge = 1; itsWeight=5; } ~CAT(); int GetAge() const { return itsAge; } int GetWeight() const { return itsWeight; } void SetAge(int age) { itsAge = age; } private: int itsAge; int itsWeight; }; CAT :: ~CAT() // cout << "Destructor called!\n"; } list 13.7

int main() { CAT * Family = new CAT[500]; int i; for (i = 0; i < 500; i++) Family[i].SetAge(2*i +1); } std::cout << "Cat #" << i+1 << ": "; std::cout << Family[i].GetAge() << std::endl; delete [] Family; return 0;

Char 배열 (문자 배열) 문자열 초기화되지 않은 문자 배열 생성 가능 널(‘\0’) 문자로 끝나는 문자의 배열 널 (‘\0’) 문자 : 문자열의 끝임을 표시 초기화되지 않은 문자 배열 생성 가능 cin을 통하여 문자 배열 채우기 가능 공백 문자를 입력의 끝으로 간주하는 문제 cin.get( char *, int , char = ‘\n’ ) 채워야 할 버퍼 입력 최대 문자 수 입력 종료 문자 char Greeting [ ] = { ‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘ ‘, ‘W’, ‘o’, ‘r’, ‘l’, ‘d’, ‘\0’ } ; char Greeting [ ] = “Hello World” ;

#include <iostream> int main() { char buffer[80]; std::cout << "Enter the string: "; std::cin >> buffer; std::cout << "Here is's the buffer: “ << buffer << std::endl; return 0; } list 13.8 #include <iostream> using namespace std; int main() { char buffer[80]; cout << "Enter the string: "; cin.get(buffer, 79); cout << "Here's the buffer: " << buffer << endl; return 0; } list 13.9

문자열 함수 #include <string.h> strcpy( char * des, const char * src ) 문자열 복사 strncpy( char *des, const char * src, unsigned int num ) num개의 문자열 복사 strlen ()

#include <iostream> #include <string.h> int main() { const int MaxLength = 80; char String1[ ] = "No man is an island"; char String2[MaxLength+1]; strncpy(String2,String1,MaxLength); std::cout << "String1: " << String1 << std::endl; std::cout << "String2: " << String2 << std::endl; return 0; } list 13.11

String class 문자열을 표현하기 위한 class 필요한 만큼의 정확한 메모리를 할당하고 유지 operator [ ] ( USHORT offset ) offset 번째의 문자 값 반환 operator + ( const String & ) 두 문자열을 연결 operator += ( const String & ) 두 문자열을 연결하여 원래의 문자에 덮어 씀

#include <iostream> #include <string.h> using namespace std; class String { public: String(); String(const char *const); String(const String &); ~String(); char & operator[ ] (unsigned short offset); char operator[ ] (unsigned short offset) const; String operator+ (const String&); void operator+= (const String&); String & operator= (const String &); unsigned short GetLen()const { return itsLen; } const char * GetString() const { return itsString; } private: String (unsigned short); char * itsString; unsigned short itsLen; }; list 13.12

String::String() { itsString = new char[1]; itsString[0] = '\0'; itsLen=0; } String::String(unsigned short len) itsString = new char[len+1]; for (unsigned short i = 0; i<=len; i++) itsString[i] = '\0'; itsLen=len; String::String(const char * const cString) itsLen = strlen(cString); itsString = new char[itsLen+1]; for (unsigned short i = 0; i<itsLen; i++) itsString[i] = cString[i]; itsString[itsLen]='\0';

String::String (const String & rhs) { itsLen=rhs.GetLen(); itsString = new char[itsLen+1]; for (unsigned short i = 0; i<itsLen;i++) itsString[i] = rhs[i]; itsString[itsLen] = '\0'; } String::~String () delete [ ] itsString; itsLen = 0;

String& String::operator=(const String & rhs) { if (this == &rhs) return *this; delete [ ] itsString; itsLen=rhs.GetLen(); itsString = new char[itsLen+1]; for (unsigned short i = 0; i<itsLen;i++) itsString[i] = rhs[i]; itsString[itsLen] = '\0'; } char & String::operator[ ](unsigned short offset) if (offset > itsLen) return itsString[itsLen-1]; else return itsString[offset]; char String::operator[ ](unsigned short offset) const

String String::operator+(const String& rhs) { unsigned short totalLen = itsLen + rhs.GetLen(); String temp(totalLen); unsigned short i; for ( i= 0; i<itsLen; i++) temp[i] = itsString[i]; for (unsigned short j = 0; j<rhs.GetLen(); j++, i++) temp[i] = rhs[j]; temp[totalLen]='\0'; return temp; } void String::operator+=(const String& rhs) unsigned short rhsLen = rhs.GetLen(); unsigned short totalLen = itsLen + rhsLen; String temp(totalLen); for (i = 0; i<itsLen; i++) temp[i] = rhs[i-itsLen]; *this = temp;

int main() { String s1("initial test"); cout << "S1:\t" << s1.GetString() << endl; char * temp = "Hello World"; s1 = temp; char tempTwo[20]; strcpy(tempTwo,"; nice to be here!"); s1 += tempTwo; cout << "tempTwo:\t" << tempTwo << endl; cout << "S1[4]:\t" << s1[4] << endl; s1[4]='x'; cout << "S1[999]:\t" << s1[999] << endl;

String s2(" Another string"); cout << "My Break\n"; s3 = s1+s2; cout << "S3:\t" << s3.GetString() << endl; String s4; s4 = "Why does this work?"; cout << "S4:\t" << s4.GetString() << endl; return 0; }

연결리스트 (Linked List) 데이터 포인터 데이터와 포인터의 쌍으로 이루어지는 자료 구조 노드 연결 리스트의 종류 데이터를 필요한 만큼 쓸 수 있음 삽입과 삭제가 용이 노드 포인터는 연결된 다른 노드를 가리킴 첫 번째 노드를 헤더( Header ) 마지막 노드를 테일( Tail ) 연결 리스트의 종류 단방향 연결 ( Singly linked ) 양방향 연결 ( Doubly linked ) 트리 ( Tree ) 데이터 포인터

연결리스트 (Linked List) 단방향 연결 : Singly linked 양방향 연결 : Doubly linked 데이터 포인터 포인터 포인터 포인터 데이터 데이터 데이터 데이터 포인터 포인터 포인터 포인터 포인터 포인터 포인터 포인터

연결리스트 (Linked List) 트리 (Tree) 데이터 포인터 포인터 데이터 데이터 포인터 포인터 포인터 포인터 데이터

#include <iostream> using namespace std; enum { kIsSmaller, kIsLarger, kIsSame}; class Data { public: Data(int val):myValue(val){ } ~Data(){ } int Compare(const Data &); void Show() { cout << myValue << endl; } private: int myValue; }; int Data::Compare(const Data & theOtherData) if (myValue < theOtherData.myValue) return kIsSmaller; if (myValue > theOtherData.myValue) return kIsLarger; else return kIsSame; } list 13.13

class Node { public: Node(){ } virtual ~Node(){ } virtual Node * Insert(Data * theData)=0; virtual void Show( ) = 0; private: }; class InternalNode: public Node InternalNode(Data * theData, Node * next); ~InternalNode() { delete myNext; delete myData; } virtual Node * Insert(Data * theData); virtual void Show( ) myData->Show(); myNext->Show(); } Data * myData; Node * myNext;

InternalNode::InternalNode(Data * theData, Node * next): myData(theData),myNext(next) { } Node * InternalNode::Insert(Data * theData) int result = myData->Compare(*theData); switch(result) case kIsSame: case kIsLarger: InternalNode * dataNode = new InternalNode(theData, this); return dataNode; case kIsSmaller: myNext = myNext->Insert(theData); return this;

class TailNode : public Node { public: TailNode(){ } ~TailNode(){ } virtual Node * Insert(Data * theData); virtual void Show() { } private: }; Node * TailNode::Insert(Data * theData) InternalNode * dataNode = new InternalNode(theData, this); return dataNode; }

class HeadNode : public Node { public: HeadNode(); ~HeadNode() { delete myNext; } virtual Node * Insert(Data * theData); virtual void Show() { myNext->Show(); } private: Node * myNext; }; HeadNode::HeadNode() myNext = new TailNode; } Node * HeadNode::Insert(Data * theData) myNext = myNext->Insert(theData); return this;

class LinkedList { public: LinkedList(); ~LinkedList() { delete myHead; } void Insert(Data * theData); void ShowAll() { myHead->Show(); } private: HeadNode * myHead; }; LinkedList::LinkedList() myHead = new HeadNode; } void LinkedList::Insert(Data * pData) myHead->Insert(pData);

int main() { Data * pData; int val; LinkedList ll; for (;;) cout << "What value? (0 to stop): "; cin >> val; if (!val) break; pData = new Data(val); ll.Insert(pData); } ll.ShowAll(); return 0;