기말고사
9.1주차
- 클래스
- 캡슐화
- 생성자
- 인스턴스 메모리 용량
9.2주차
- 소멸자 + 구체적으로 스택이나 힙에 영역이 할당되고, 언제 소멸하는지, 무엇이 소멸하는지
- copy constructor(구현 ver.
Sample(Sample &a);
) - this
10.1주차 :: 실습 4
- 오버로딩 vs 오버라이딩
- 동적 할당과 소멸자
pointer = new type[number_of_elements];
delete [] pointer;
- static members
- friend members
10.2주차
-
여기 실습 문제 부터가 찐…
k진수에서 10진수로 바꾸기
// k진수에서 10진수로 바꾸기 int Number::getDec() { int i = 1; int num = 0; for (int m = n.size() - 1; m >= 0; m--) { num += (n[m] - '0') * i; i *= k; } return num; }
10진수에서 k진수로 바꾸기
// 10진수에서 k진수로 바꾸기 void Number::changeToK(int k) { int dec = getDec(); this->k = k; int i = 1; this->n = ""; for (int m = dec; m > 0; m /= k) { this->n = (char)('0' + (m % k)) + this->n; } }
-
상속
11.1주차 :: 실습 5
- 상속이 어떻게 진행이 되는지 확실히 보여주는 실습 문제 (MyString을 만들어서 상속받거나 기존의 string을 상속받거나)
int P5::length()
{
// 부모 멤버 함수를 사용하고 싶을 때.
return string::length() * 3;
}
11.2주차
- virtual 🌟
- 추상 클래스는 인스턴스를 만들 수 없다. (추상 클래스는 추상적인 명세만 나열, 상속을 염두)
- 상속의 힘이 두배가 된다.
- 다중 상속
12.1주차
- template
12.2주차
실습 8, 9, 10 한 번에 풀었던 주차임
- 소수 구하기
bool Util::isPrime(int num) { int i; for (i = 2; i < num; i++) { if (isDiv(num, i)) { break; } } if (i == num) return true; else return false; }
13.1주차
- 코드 많이 보기 + 코드의 아름다움을 느끼기❣️ (실습 11)
- stream 개요
13.2주차
- 코드 많이 보기 + 코드의 아름다움을 느끼기❣️ (실습 12)
14.1주차 🌟🌟
-
this의 멤버 변수가 아닌 경우
arr.values[0]
처럼 사용해주기TDArray TDArray::operator*(TDArray arr) { vector<vector<int>> v; for (int i = 0; i < values.size(); i++) { vector<int> row; for (int j = 0; j < arr.values[0].size(); j++) { row.push_back(getInnerProduct(arr, i, j)); } v.push_back(row); } }
14.2주차 🌟
개중요………
- 코드 많이 보기 + 코드의 아름다움을 느끼기❣️ (실습 14)
15.1주차
- SevenSeg 클래스, SevenSegs 클래스 만들기
- Puzzle 클래스 만들기
많이 쓰이는 코드 모음
최대 공약수(gcd)
int min = n > m ? m : n;
int max = n > m ? n : m;
int gcd = 0;
// 최대 공약수 구하기
for (int i = min; i > 0; i--)
{
if (Util::isDiv(min, i) && Util::isDiv(max, i))
{
gcd = i;
break;
}
}
최소 공배수(lcm)
int min = n > m ? m : n;
int max = n > m ? n : m;
int lcm = 0;
// 최소 공배수 구하기
for (int i = max;; i++)
{
if (Util::isDiv(i, max) && Util::isDiv(i, min))
{
lcm = i;
break;
}
}
전체 합과 개수를 이용해서 해당하는 등차수열 값 구하기
int total = 15;
int num = 5;
// 전체 합과 개수를 이용해서 해당하는 등차수열 값 구하기
vector<int> answer;
int middleNum = total / num;
int loop = num / 2;
if (num % 2 == 0)
loop--;
int standard = middleNum - loop;
for (int i = standard; i < num + standard; i++)
{
answer.push_back(i);
}
ASCII
문자열 -> 대문자보다 소문자가 숫자가 더 크다
따라서, 대문자를 소문자로 바꾸려먼 (‘a’ - ‘A’)의 값을 더하면 되고, 소문자를 대문자로 바꾸기 위해서는 (‘a’ - ‘A’)의 값을 빼면 된다.
2진수 덧셈
int getDigit(string bin, int idx)
{
if (bin.length() > idx)
{
return bin[bin.length() - idx - 1] - '0';
}
else
{
return 0;
}
}
string makeAnswer(string answer, int s)
{
if (s == 1)
{
return "1" + answer;
}
else
{
return "0" + answer;
}
}
int main()
{
// 2진수 덧셈
string num1 = "1100";
string num2 = "100";
string answer = "";
int a, b, c, s;
c = 0;
int len = num1.size();
if (len < num2.size())
{
len = num2.size();
}
for (int i = 0; i < len; i++)
{
a = getDigit(num1, i);
b = getDigit(num2, i);
s = (a + b + c) % 2;
c = (a + b + c) / 2;
answer = makeAnswer(answer, s);
}
if (c == 1)
{
answer = makeAnswer(answer, c);
}
cout << answer << endl;
}
stoi
// string -> int로 바꿔줌
int my_stoi(string num)
{
int k = 1;
int n = 0;
for (int i = num.length() - 1; i >= 0; i--, k *= 10)
{
n += (num[i] - '0') * k;
}
return n;
}
itos
// int -> string으로 바꿔줌
string my_itos(int n)
{
string num = "";
for (int i = n; i > 0; i /= 10)
{
char temp = (i % 10) + '0';
num = temp + num;
}
return num;
}
소인수 집합 구하기
vector<int> answer;
for (int i = 1; i <= 24; i++)
{
cout << i << endl;
if (n % i == 0)
{
answer.push_back(i);
while (n % i != 0)
{
n = n / i;
}
}
}
중복 제거
vec.erase(unique(vec.begin(), vec.end()), vec.end());
k 진수 변환
-> 실습4
// 10진수에서 k진수로 바꾸기
void Number::changeToK(int k)
{
int num = getDec(); // string -> int로 바꾸어줌
this->k = k;
this->n = "";
for (int i = num; i > 0; i /= k)
{
this->n = (char)((i % k) + '0') + this->n;
}
}
// k진수에서 10진수로 바꾸기
int Number::getDec()
{
int num = 0;
int deli = 1;
for (int i = n.size() - 1; i >= 0; i--, deli *= k)
{
num += (n[i] - '0') * deli;
}
return num;
}
비트 비교
int FX::diff(long long num, long long compare)
{
int len = sizeof(n) * 8;
long long mask = 1;
int count = 0;
for (int i = 0; i < len; i++)
{
if ((num & mask) != (compare & mask))
{
count++;
}
mask = mask << 1;
}
return count;
}
« 오퍼레이터 오버로딩
ostream &operator<<(ostream &os, TDArray &ar)
{
for (int i = 0; i < ar.values.size(); i++)
{
for (int j = 0; j < ar.values[0].size(); j++)
{
os << ar.values[i][j] << " ";
}
os << endl;
}
return os;
}
* 오퍼레이터 오버로딩
TDArray TDArray::operator*(TDArray &ar)
{
vector<vector<int>> v;
for (int i = 0; i < values.size(); i++)
{
vector<int> row;
for (int j = 0; j < ar.values[0].size(); j++)
{
row.push_back(getInnerProduct(ar, i, j));
}
v.push_back(row);
}
return TDArray(v);
}
== 오퍼레이터 오버로딩
// -> friend로 정의
bool operator==(Path &a, Path &b)
{
if ((a.x1 == b.x1) && (a.y1 == b.y1) && (a.x2 == b.x2) && (a.y2 == b.y2))
return true;
if ((a.x1 == b.x2) && (a.y1 == b.y2) && (a.x2 == b.x1) && (a.y2 == b.y1))
return true;
return false;
}
실수 모음
- class 멤버 함수의 메개 변수나 데이터 타입을 바꿀 때, 정의 부분까지 다 바꾸어야 한다.
- 멤버 함수가 아니면 반드시 namespace 작성!(Util 클래스 같은 경우!)
- 클래스 마지막에 ; 찍기
- this가 아닌 다른 객체의 멤버 변수 사용하기
- 상속받을 클래스
: public parent
안씀 🌟 - 멤버 함수 정의할 때 앞에 클래스 이름 꼭 붙히기!
- 상속을 해서 멤버에 접근하려면 무조건 protected로 바꾸기
댓글남기기