[SOLVED] CSED232 Programming Final Exam

30.00 $

Category:
Click Category Button to View Your Next Assignment | Homework

You will receive the following solution file(s) instantly after successful payment:

zip file icon final-gampg6.zip (185.5 KB)
Assignment Instructions Updated Recently? Submit Below and we will provide new Solution!
Submit New Instructions
πŸ”’ Securely Powered by:
Secure Checkout
5/5 - (2 votes)

Note: λ‹΅μ•ˆμ€ MS μ›Œλ“œλ‚˜ ν•œμ»΄ ν•œκΈ€ λ“±μœΌλ‘œ μž‘μ„± ν›„ PDF 파일둜 λ³€ν™˜ ν›„ μ œμΆœν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€. λ³Έ μ‹œν—˜μ€ Take-home exam 으둜 ꡐ재 λ‚˜ 인터넷 μƒμ˜ 자료λ₯Ό μ°Έκ³ ν•΄μ„œ 풀어도 μ’‹μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ μ‚¬λžŒκ³Όμ˜ μƒμ˜λŠ” κΈˆμ§€ν•©λ‹ˆλ‹€. λ‹΅μ•ˆμ€ 마감 μ‹œν•œ μ΄ν›„μ—λŠ” λ°›μ§€ μ•ŠμœΌλ‹ˆ κΌ­ λ§ˆκ°μ‹œκ°„ μ•ˆμ— LMS λ₯Ό 톡해 μ œμΆœν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€. λ¬Έμ˜μ‚¬ν•­μ€ μ‘°μ„±ν˜„ κ΅μˆ˜μ—κ²Œ 이메일 ([email protected]) 을 톡해 연락 λ°”λžλ‹ˆλ‹€.

1. λ‹€μŒ κ°œλ…λ“€μ΄ 각각 무엇을 λœ»ν•˜λŠ”μ§€ ν•œλ‘μ€„ λ‚΄μ™Έλ‘œ κ°„λž΅νžˆ κΈ°μˆ ν•˜μ‹œμ˜€. (각 4 점, 총 28 점)
A. Pure virtual function
B. Function overloading
C. Function overriding
D. Dynamic binding
E. Abstract base class
F. Generic programming
G. Event-driven programming

2. C++ Standard Template Library 의 algorithm 듀은 iterator λ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ„€κ³„λ˜μ–΄ μžˆλ‹€. iterator λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ˜ μž₯점이 무엇인지에 λŒ€ν•΄ κ°„λž΅ν•˜κ³  λͺ…ν™•ν•˜κ²Œ κΈ°μˆ ν•˜μ‹œμ˜€. (4 점)

3. Has-a relationship 을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ 두 κ°€μ§€ λŒ€ν‘œμ μΈ λ°©λ²•μœΌλ‘œ containment 와 private inheritance κ°€ μžˆλ‹€. Has-a relationship 이 무엇인지 κΈ°μˆ ν•˜κ³ , λ˜ν•œ containment 와 private inheritance 의 μž₯단점을 λΉ„κ΅ν•˜μ‹œμ˜€. (8 점)

4. Private inheritance 와 protected inheritance 의 차이점을 μžμ„Ένžˆ κΈ°μˆ ν•˜μ‹œμ˜€. (4 점)

5. μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œμΌ°μ„λ•Œ 좜λ ₯λ˜λŠ” λ‚΄μš©μ€ 무엇인가? 그리고 μ™œ 그런 좜λ ₯이 λ‚˜μ˜€λŠ”κ°€? λ‹€μŒ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œμΌ°μ„ λ•Œ 좜λ ₯될 λ‚΄μš©μ„ 적고, κ·Έ 이유λ₯Ό κ°„λ‹¨νžˆ κΈ°μˆ ν•˜μ‹œμ˜€. (8 점)

class Base { public:
Base(int n=0) : m_n(n) {} virtual ~Base() {}
virtual void display() const {
std::cout << “Base: ” << m_n << std::endl;
} private:
int m_n;
}; class Derived1 : public Base { public:
Derived1(int n=0) : Base(2*n), m_n(n) {}
~Derived1() {} void display() const { Base::display();
std::cout << “Derived1: ” << m_n << std::endl;
} private:
int m_n;
}; class Derived2 : public Base { public:
Derived2(int n=0) : Base(3*n), m_n(n) {}
~Derived2() {} void display() const { Base::display();
std::cout << “Derived2: ” << m_n << std::endl;
} private:
int m_n;
};
class DDerived : public Derived1, public Derived2
{ public:
DDerived(int n, int m) : Derived1(n), Derived2(m) {} ~DDerived() {}
void display() const { Derived1::display();
Derived2::display();
}
};
int main()
{
std::unique_ptr<Derived1> pt(new DDerived(3,5)); pt->display();
return 0;
}

6. λ‹€μŒμ€ μž¬κ·€ ν˜ΈμΆœμ„ μ΄μš©ν•˜μ—¬ factorial 을 κ³„μ‚°ν•˜λŠ” μ½”λ“œμ΄λ‹€.
int factorial(int n) { if(n == 0) return 1;
else return n*factorial(n-1); }
이λ₯Ό template 을 μ΄μš©ν•˜μ—¬ μ•„λž˜μ™€ 같이 λ°”κΏ€ 수 μžˆλ‹€. μ΄λ ‡κ²Œ template 을 μ΄μš©ν•˜λŠ” λ°©λ²•μ˜ μž₯점은 μ‹€μ œ factorial 계산을 λŸ°νƒ€μž„μ— ν•˜λŠ” λŒ€μ‹  컴파일 νƒ€μž„μ— ν•  수 μžˆμ–΄μ„œ ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰μ‹œκ°„μ„ λ‹¨μΆ•μ‹œν‚¬ 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€. 이 λ•Œ λΉˆμΉΈμ— ν•„μš”ν•œ μ½”λ“œλ₯Ό template
specialization 을 μ΄μš©ν•˜μ—¬ μž‘μ„±ν•˜μ‹œμ˜€. (8 점)
template<int N> struct Factorial {
enum { value = N * Factorial<N-1>::value };
};

int main()
{
using namespace std;

int a = Factorial<5>::value; cout << a << endl; return 0;
}

7. μ•„λž˜μ˜ μ½”λ“œλŠ” C++11 ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” 슀마트 포인터 쀑 ν•˜λ‚˜μΈ unique_ptr 을 κ°„λž΅ν™”ν•˜μ—¬ κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ΄λ‹€. μ•„λž˜μ˜ μ½”λ“œλ₯Ό μ™„μ„±ν•˜κΈ° μœ„ν•œ move constructor 와 move assignment operator 의 μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ‹œμ˜€. (8 점)

template<class T> class my_unique_ptr { public:
my_unique_ptr() : m_ptr(nullptr) {} explicit my_unique_ptr(T* p) : m_ptr(p) {} my_unique_ptr(const my_unique_ptr& p) = delete;
// move constructor

~my_unique_ptr() { delete m_ptr; }
my_unique_ptr& operator=(const my_unique_ptr& p) = delete;
// move assignment operator

T& operator*() { return *m_ptr; } const T& operator*() const { return *m_ptr; }
T& operator->() { return *m_ptr; }
const T& operator->() const { return *m_ptr; }
private:
T* m_ptr;
};

8. μ½”λ“œμ—λŠ” λŸ°νƒ€μž„μ—λ°œμƒν•  수 μžˆλŠ”ν•œκ°€μ§€ 문제점이 μ‘΄μž¬ν•œλ‹€. 이 문제점이 무엇인가? 그리고 이 λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ½”λ“œλ₯Ό μ–΄λ–»κ²Œ μˆ˜μ •ν•΄μ•Ό ν•˜λŠ”κ°€? SomeClass 와 SomeException ν΄λž˜μŠ€λŠ” λͺ¨λ‘ 적절히 μ •μ˜λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•œλ‹€. (8 점)

void foo() { SomeClass a(1);
SomeClass* p = new SomeClass(2); // …
if(b_error) {
delete p;
throw SomeException(); } // … delete p;
}
void bar() { SomeClass a(3);
SomeClass* p = new SomeClass(4); // … foo(); // …
delete p;
} int main() { try { bar();
}
catch(SomeException& e) {
std::cout << e.what() << std::endl;
}
return 0;
}

9. λ‹€μŒ μ½”λ“œμ—μ„œ C-style 의 type cast μ—°μ‚°μžλ“€μ„ 각각 그에 λŒ€μ‘ν•˜λŠ” static_cast, const_cast, reinterpret_cast, dynamic_cast 둜 λ³€κ²½ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ‹œμ˜€. (8 점)

class Base { // …
};
class Derived : public Base { // …
}; int main() { int a = 5; double b;
const int* c = &a;
b = (double)a;
int* d = (int*)c; int f = 0xA0000000;
unsigned char* e = (unsigned char*)f;
Base* p = new Derived;
Derived* p2 = (Derived*)p;

return 0;
}

10. μ½”λ“œμ˜ Vec2D λŠ” 2 차원 벑터λ₯Όλ‹€λ£¨κΈ° μœ„ν•œ template class 이닀. μ•„λž˜ μ½”λ“œμ˜ main ν•¨μˆ˜μ—μ„œλŠ” Vec2D<int>와 Vec2D<float>의 μ„œλ‘œ λ‹€λ₯Έ 데이터 νƒ€μž…μ˜ Vec2D 였브젝트 μ‚¬μ΄μ˜ λ§μ…ˆ 연산을 μˆ˜ν–‰ν•˜λŠ” 것을 보여쀀닀. 이 λ§μ…ˆ 연산을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ operator+ 의 μ˜€λ²„λ‘œλ”©μ΄ νŒŒλž€μƒ‰μœΌλ‘œ ν‘œμ‹œλ˜μ–΄ μžˆλ‹€. μ—¬κΈ°μ„œ 이 μ½”λ“œμ— ν•„μš”ν•œ μ μ ˆν•œ prototype 을 λΉˆμΉΈμ— μΆ”κ°€ν•˜μ‹œμ˜€. μ˜€λ²„λ‘œλ”©λœ operator+λŠ” template function 으둜 λ˜μ–΄ 있으며, Vec2D<int>와 Vec2D<float>, λ˜λŠ” Vec2D<double>κ³Ό Vec2D<long>κ³Ό 같은 μž„μ˜μ˜ μ„œλ‘œ λ‹€λ₯Έ 데이터 νƒ€μž…μ˜ Vec2D 였브젝트 κ°„μ˜ λ§μ…ˆ 연산을 μ§€μ›ν•œλ‹€. λ˜ν•œ Vec2D<int> μ˜€λΈŒμ νŠΈμ™€ Vec2D<float> 였브젝트의 λ§μ…ˆ μ—°μ‚° μ‹œ 결과둜 λ‚˜μ™€μ•Ό λ˜λŠ” νƒ€μž… (Vec2D<float>) 이 μžλ™μœΌλ‘œ κ²°μ •λœλ‹€.
(4 점)

template<typename T> class Vec2D { public: Vec2D() {}
Vec2D(T x_, T y_) : x(x_), y(y_) {}
T x, y;
};

{ return Vec2D<decltype(a.x+b.x)>(a.x + b.x, a.y + b.y) ;
}

template<typename T>
std::ostream& operator<<(std::ostream& os, const Vec2D<T>& v)
{
os << “[” << v.x << “, ” << v.y << “]”; return os;
}
int main()
{ using namespace std;
Vec2D<int> a(1,2);
Vec2D<float> b(3.0f, 2.0f);
cout << a << ” + ” << b << ” = ” << a+b << endl; return 0;
}

11. μ½”λ“œμ˜ μ§€μ—­ λ³€μˆ˜μΈ data λŠ” integer 값듀을 λ‹΄κ³  μžˆλŠ” vector 이닀. μ•„λž˜ μ½”λ“œμ—μ„œ νŒŒλž€ μƒ‰μœΌλ‘œ ν‘œμ‹œλœ μ½”λ“œλŠ” 이 data 의 각각의 κ°’λ“€μ˜ μ‘°μ‚¬ν•˜μ—¬ upper_bound 보닀 큰 값듀은 upper_bound 둜 값을 λ³€κ²½ν•˜κ³ , lower_bound 보닀 μž‘μ€ 값듀은 lower_bound 둜 λ³€κ²½ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€. μ•„λž˜ νŒŒλž€μƒ‰μœΌλ‘œ ν‘œμ‹œλœ μ½”λ“œμ™€ λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 3 κ°€μ§€μ˜ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ‹œμ˜€. 각각의 μ½”λ“œλŠ” μ•„λž˜μ— A,B,C 둜 ν‘œμ‹œλœ λ‚΄μš©μ„ 각각 ν™œμš©ν•˜μ—¬ μž‘μ„±λ˜μ–΄μ•Ό ν•œλ‹€.
(12 점)
A. for-loop 와 iterator 이용
B. std::transform ν•¨μˆ˜μ™€ lambda ν•¨μˆ˜ 이용
C. std::for_each ν•¨μˆ˜μ™€ lambda ν•¨μˆ˜ 이용
#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>

int main()
{
using namespace std;

vector<int> data{11, 17, 4, 10, 29, 4, 18, 18};
int upper_bound = 20; int lower_bound = 10;

for(int i = 0; i < data.size(); i++) { if(data[i] > upper_bound) { data[i] = upper_bound;
}
else if(data[i] < lower_bound) { data[i] = lower_bound;
} }
for(auto x: data) cout << x << ” “; cout << endl;

return 0;
}

  • final-gampg6.zip