C++ Programming Ch.11 Exercise 4 Solution

Problem: 한 줄에 '영어문장;한글문자' 형식으로 키 입력될 때, cin.ignore()를 이용하여 ';'이전에 입력된 문자열만 출력하는 프로그램을 작성하라. 아래에서 ^Z(ctrl-z) 키는 입력 종료를 나타내는 키이며, cin.get()은 EOF를 리턴한다. Execution Result: Objective & Hints: cin.get(), EOF, cin.ignore() 활용 Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include using namespace std; int main() { int ch; while( (ch = cin.get()) != EOF ) { if(ch == ';'){ cout.put('\n'); cin.ignore(100, '\n'); } else cout.put(ch); } } Explanation: ...

March 27, 2020 · 1 min · Sobamemil

C++ Programming Ch.11 Exercise 3 Solution

Problem: 한 줄에 '영어문장;한글문자' 형식으로 키 입력될 때, cin.ignore()를 이용하여 ';' 이후에 입력된 문자열을 화면에 출력하는 프로그램을 작성하라. 아래에서 ^Z(ctrl-z) 키는 입력 종료는 나타내는 키이며, cin.get()은 EOF를 리턴한다. Execution Result: Objective & Hints: cin.get(), EOF, cin.ignore() 활용 Code: 1 2 3 4 5 6 7 8 9 10 11 12 #include using namespace std; int main() { int ch; cin.ignore(100, ';'); // 영어 문장이 최대 99개의 문자로 입력된다고 가정한다. while((ch=cin.get()) != EOF) { cout.put(ch); if(ch == '\n') cin.ignore(100, ';'); // 영어 문장이 최대 99개의 문자로 입력된다고 가정한다. } } Explanation: ...

March 27, 2020 · 1 min · Sobamemil

C++ Programming Ch.11 Exercise 2 Solution

Problem: istream& get(char& ch) 함수를 이용하여 한 라인을 읽고 빈칸(' ')이 몇 개인지 출력하는 프로그램을 작성하라. Execution Result: Objective & Hints: cin으로 키 입력 연습 Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include using namespace std; int main() { char ch; int cnt; while(true){ cin.get(ch); // 키를 ch에 읽어옴 if(cin.eof()) // EOF 문자 즉 ctrl-z 키가 입력된 경우, 읽기 종료 break; if(ch == '\n') // 키가 입력된 경우 읽기 중단 break; else if(ch == ' ') cnt++; } cout << cnt; } ]( ...

March 27, 2020 · 1 min · Sobamemil

C++ Programming Ch.11 Exercise 1 Solution

Problem: int cin.get() 함수를 이용하여 키보드로부터 한 라인을 읽고 'a'가 몇 개인지 출력하는 프로그램을 작성하라. Execution Result: Objective & Hints: cin으로 키 입력 연습 Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include using namespace std; int main() { int a; int cnt=0; while( (a = cin.get() ) != EOF ){ if(a == 'a') cnt++; else if(a == '\n') break; } cout << cnt; } Explanation: ...

March 27, 2020 · 1 min · Sobamemil

Binary Search Tree Array Implementation

Problem: 배열을 이용하여 이원 탐색 트리를 만들고 탐색하는 프로그램을 작성하라. 입력 : 정렬이 되지 않은 숫자들 프로그램 : 2.1 입력된 숫자들을 하나씩 읽으면서 이원 탐색 트리 배열 만들기 2.2 숫자 하나를 입력하면 이원탐색트리 알고리즘을 적용하여 해당하는 배열의 첨자를 출력하기 (이 때 출력은 배열 원소들을 차례대로 출력하고 해당하는 배열 첨자를 출력) Execution Result: Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 #include using namespace std; void newBinarySearchTree(int *num_arr, int size, int *new_num_arr) { for(int i=0; i<size+20; i++){ // 이원탐색트리 배열 -1로 초기화 new_num_arr[i] = -1; } new_num_arr[0] = num_arr[0]; for(int i=1; i<size; i++){ int index=0; // 새로 들어올 숫자가 이원탐색트리 배열의 루트보다 작으면 왼쪽으로 이동 if(new_num_arr[0] > num_arr[i]) { for(int j=2*index+1;;) { if(new_num_arr[j] != -1){ //삽입하려는 이원탐색트리 배열공간이 NULL이 아니면 비교 if(new_num_arr[j] < num_arr[i]) j=2*j+2; // 삽입하고자 하는 숫자가 더 크면 2j+2 else if(new_num_arr[j] > num_arr[i]) j=2*j+1; // 삽입하고자 하는 숫자가 더 작으면 2j+1 z else { //같은 숫자가 나오면 오류메시지 출력 후 프로그램 비정상 종료 cout << "same data error...\n"; exit(1); } } else if(new_num_arr[j] == -1) { // 삽입하려는 이원탐색트리 배열 공간이 NULL이면 바로 삽입 new_num_arr[j] = num_arr[i]; break; } } } // 새로 들어올 숫자가 이원탐색트리 배열의 루트보다 크면 오른쪽으로 이동 else if(new_num_arr[0] < num_arr[i]) { for(int j=2*index+2;;) { if(new_num_arr[j] != -1){ // 삽입하려는 이원탐색트리 배열공간이 NULL이 아니면 비교 if(new_num_arr[j] < num_arr[i]) j=2*j+2; else if(new_num_arr[j] > num_arr[i]) j=2*j+1; else { cout << "same data error...\n"; exit(1); } } else if(new_num_arr[j] == -1) { new_num_arr[j] = num_arr[i]; break; } } } else continue; } } void find(int *new_num_arr, int size) { int x, flag; cout << "찾고자 하는 숫자 입력 : "; cin >> x; for(int i=0; i<size; i++) // 이원탐색트리 배열의 모든 원소 출력 cout << "arr[" << i << "] : " << new_num_arr[i] << endl; for(int i=0; i<size; i++){ if(new_num_arr[i] == x) { cout << "index : " << i; flag = true; break; } else flag = false; } if(!flag) // flag가 false이면 찾고자 하는 숫자가 없다고 출력 cout << "찾고자 하는 숫자 없음\n"; } int main() { int num_arr[] = {50, 40, 55, 30, 45, 54, 53, 1, 60, 301, 2}; int num_arr_size = sizeof(num_arr)/sizeof(num_arr[0]); int *new_num_arr = new int [num_arr_size + 20]; // 이원탐색트리 배열 공간 생성 newBinarySearchTree(num_arr, num_arr_size, new_num_arr); find(new_num_arr, num_arr_size + 20); } Explanation: ...

March 19, 2020 · 3 min · Sobamemil

시스템 프로그래밍 프로젝트 #7 최종 (Assembler in C)

Problem: 지금까지의 프로젝트를 참고하여 2 pass assembler를 만들면 됩니다. 먼저 어셈블러(Assembler)란? 하드웨어가 직접 이해하여 실행하는 기계어는 일반적으로 비트 열 또는 16진수로 표현되기 때문에 인간이 이해하기 어렵다. 그래서 인간이 이해하기 쉽도록 기계어와 거의 일대일로 대응하는 기호로 표현된 언어로 어셈블러 언어가 있으며, 어셈블러 언어를 기계어로 번역하는 프로그램을 어셈블러, 번역하는 것을 어셈블이라고 합니다. 어셈블러의 역할을 그림으로 간단하게 나타내 보면 다음과 같습니다. 이 글에서 구현 할 2 패스 어셈블러의 알고리즘을 보겠습니다. pass 1 : ...

March 19, 2020 · 6 min · Sobamemil

Merge Sort Algorithm

합병 정렬(Merge Sort)이란? 분할 정복 알고리즘(=Divide and conquer algorithm 즉, 그대로 해결할 수 없는 문제를 작은 문제로 분할하여 문제를 해결하는 방법이나 알고리즘입니다.)의 하나로 O(n log n)의 시간 복잡도를 가지고 있습니다. 합병 정렬의 작동 알고리즘은 아래와 같습니다. 리스트의 길이가 1 이하이면 이미 정렬된 것으로 본다. 그렇지 않은 경우에는 분할(divide) : 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눈다. 정복(conquer) : 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다. 결합(combine) : 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한다. 이때 정렬 결과가 임시배열에 저장된다. 복사(copy) : 임시 배열에 저장된 결과를 원래 배열에 복사한다. 이해가 잘 안간다면 아래 애니메이션을 통해 작동 원리를 쉽게 이해할 수 있습니다. ...

March 18, 2020 · 3 min · Sobamemil

Insertion Sort Algorithm

삽입 정렬(Insertion Sort)이란? 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘입니다. 삽입 정렬의 시간 복잡도는 O(n2)이며 안정 정렬입니다. 또한 배열이 길어질수록 효율이 매우 떨어지지만 구현이 간단하다는 장점이 있습니다. 삽입 정렬의 예 삽입 정렬의 애니메이션 -Simpsons contributor- 삽입 정렬 알고리즘을 구현하기 전에 의사코드(Pseudocode)로 먼저 이해를 하고 코드를 작성하는 것이 더 쉽게 작성할 수 있을 것입니다. Pseudocode : 1 2 3 4 5 6 7 8 9 //InsertionSort pseudo code InsertionSort(A,n) // sort A[1...n] for j <- 2 to n do key <- A[j] i <- j-1 while i>0 and A[i]>key do A[i+1] <- A[i] i <- i-1 A[i+1] <- key CCode: ...

March 17, 2020 · 3 min · Sobamemil

C++ Programming Ch.10 Exercise 16 Solution

Problem: vector<Shape*> v;를 이용하여 간단한 그래픽 편집기를 콘솔 바탕으로 만들어보자. 생성된 도형 객체를 v에 삽입하고 관리하라. 9장 Exercise Problem 10번의 힌트를 참고하라. Shape과 Circle, Line, Rect 클래스는 다음과 같다. 2019/11/26 - [C++/명품 C++ programming] - 명품 C++ programming Exercise Problem 9장 10번 [명품 C++ programming Exercise Problem 9장 10번 Problem: 간단한 그래픽 편집기를 콘솔 바탕으로 만들어보자. 그래픽 편집기의 기능은 "삽입", "삭제", "모두보기", "종료" 의 4가지이고, 실행 과정은 다음과 같다. Objective & Hints: 추상 클래스, 상속 종합 응용 S.. ...

March 11, 2020 · 3 min · Sobamemil

C++ Programming Ch.10 Exercise 15 Solution

Problem: vector를 이용하여 아래 Circle 클래스의 객체를 삽입하고 삭제하는 프로그램을 작성하라. 삭제 시에는 이름이 같은 모든 원을 삭제한다. 1 2 3 4 5 6 7 8 9 10 class Circle { string name; // 이름 int radius; // 반지름 public: Circle(int radius, string name) { this->radius = radius; this->name = name; } double getArea() { return 3.14*radius*radius; } string getName() { return name; } }; Execution Result: ...

March 11, 2020 · 2 min · Sobamemil