11월, 2022의 게시물 표시
{{ label!='' ? 'Label : ' : (q!='' ? '검색 : ' : '전체 게시글') }} {{ label }} {{ q }} {{ ('('+(pubs|date:'yyyy-MM')+')') }}

[C++] 스터디 CPPALOM 4주차: 열혈 C++ 프로그래밍 Part 3

(파워 포인트 파일(.pptx)을 Markdown으로 변환하여 업로드하였음) # <br>상속 모든 멤버를 물려받는다. UnivStudent는 WhoAreYou()에서 자신이 상속받은 WhatYorName(), HowOldAreYou()를 사용할 수 있다! ```C++ class Person { private: int age; // 나이 char name[50]; // 이름 public: Person(int myage, char * myname) : age(myage) { strcpy(name, myname); } void WhatYourName() const { cout<<"My name is "<<name<<endl; } void HowOldAreYou() const { cout<<"I'm "<<age<<" years old"<<endl; } }; ``` ```C++ class UnivStudent : public Person { private: char major[50]; // 전공과목 public: UnivStudent(char * myname, int myage, char * mymajor) : Person(myage, myname) { strcpy(major, mymajor); } void WhoAreYou() const { WhatYourName(); HowOldAreYou(); cout<<"My major is "<<major<<endl<<endl; } }; ``` #

[Troubleshooting] Noise problem in convolution using cufft 2d r2c and c2r - cufft 2d의 r2c 및 c2r을 이용한 컨볼루션 연산의 노이즈 문제 해결

이미지
설명   cufft 라이브러리를 이용한 컨볼루션 연산에서 알 수 없는 노이즈가 발생하였음. 1차적으로 확인한 현상은 이미지의 사이즈에 따라서 정상적인 동작을 할 수 있다는 것이었음.   프로세스의 절차는 다음과 같았음: 이미지와 커널의 크기를 맞추기 위해 주어진 커널을 padding 하였음. 이 때 입력은 범위가 [-π,π)가 아닌 [0,2π)이므로, 커널의 값들을 각각의 모서리에 적절히 배치하도록 하였으며 나머지는 0으로 채웠음. R2C 플랜을 작성하였고, 커널에 대해 수행함. 이미지 역시 R2C 수행함. 둘을 pointwise로 곱하였으며, 이미지의 크기만큼 나누어서 정규화해주었음. C2R 플랜을 작성하였고, 4번의 결과에 대해 수행함. 원본 이미지 정상적인 결과 비정상적인 결과 원인   cufft r2c의 경우 출력의 크기는 N/2임. c2r의 경우 입력의 크기가 N/2여야 함. 이는 2d에서 width를 기준으로 결정됨. 즉, complex 신호의 크기는 (w/2+1)*h임. 본인은 w*(h/2+1)로 계산하였으며 이로부터 예상치 못한 결과를 얻게 되었음. 해결   complex 신호의 크기를 (w/2+1)*h로 상정하고 수행하였음.

[C++] 스터디 CPPALOM 3주차: 열혈 C++ 프로그래밍 Chap 5-6

(파워 포인트 파일(.pptx)을 Markdown으로 변환하여 업로드하였음) # <br>C++ 스타일의 초기화 우리는 지금까지 다음과 같은 방식으로 초기화했다: 하지만 C++에서는 다음의 방식으로도 선언 및 초기화가 가능하다: ```C++ int num = 20; int &ref = num; ``` ```C++ int num(20); int &ref(num); ``` 다음 코드의 실행결과를 예상해보자: sim2 객체에는 복사가 일어난다. ```C++ class SoSimple { private: int num1; int num2; public: SoSimple(int n1, int n2) : num1(n1), num2(n2) { } void ShowSimpleData() { cout << num1 << endl; cout << num2 << endl; } }; ``` ```C++ int main(void) { SoSimple sim1(15, 20); SoSimple sim2 = sim1; SoSimple sim3(sim2); sim2.ShowSimpleData(); sim3.ShowSimpleData(); return 0; } ``` # <br>복사 생성자 SoSimple형 객체를 인자로 받는다. 인자로 받은 SoSimple형 객체를 복사한다. 새로운 SoSimple형 객체를 생성한다. 이러한 복사 생성자를 선언하지 않을 시, 디폴트 복사 생성자가 생성된다. ```C++ SoSimple(SoSimple &copy) { //... } ``` 복사 생성자를 직접 정의하는 것은 이와 같다: ```C++ #include <iostream> using namespace std; class SoSimple { pr

[C++] 스터디 CPPALOM 2주차: 열혈 C++ 프로그래밍 Chap 3-4

(파워 포인트 파일(.pptx)을 Markdown으로 변환하여 업로드하였음) # <br>2주차 - 열혈 C++ 프로그래밍 Chapter 3-4 # <br>구조체 * C언어에서의 구조체 * “값의 집합” * C++에서의 구조체 선언 * C++에서의 구조체 변수의 선언 ```C++ struct Car { char gamerID[ID_LEN]; int fuelGauge; int curSpeed; }; ``` ```C++ Car basicCar; Car simpleCar; ``` * 자료형이란: * 값의 집합과 연산의 집합 * C언어에서는 값의 집합만 지원하므로, 다음과 같이 연산의 집합은 전역 함수로 선언해야 한다. * 이는 error-prone한 구조이다. ```C++ void ShowCarState(Car &car) { cout<<"소유자ID: "<<gamerID<<endl; cout<<"연료량: "<<fuelGauge<<"%"<<endl; cout<<"현재속도: "<<curSpeed<<"km/s"<<endl<<endl; } ``` C++에서는 연산 역시 구조체에 선언할 수 있음 ```C++ struct Car { char gamerID[CAR_CONST::ID_LEN]; int fuelGauge; int curSpeed; void ShowCarState(); }; void Car::ShowCarState() { cout<<“ 사용자ID: "<<gamerID<<endl; cout<<“ 연료량: "<<fuelGauge<<"%"&

[소프트웨어공학] Should we test private methods?

우리는 비공개 메소드들도 시험해야 하나요?   우리는 테스트를 어떻게 해야 하나요? 소프트웨어 공학은 이에 대한 해답을 제시합니다. 단위(이를테면 클래스)부터 통합, 배포, 인수 등 다양한 측면에서의 시험을 수행해야 합니다. 중요한 것은 자동화된 테스트여야 한다는 것이죠. 세상에는 자동화된 테스트를 위한 다양한 테스트 프레임워크가 존재합니다. 대표적으로 XUnit이 있죠. 자바의 경우, JUnit입니다. JUnit   JUnit이 제공하는 클래스와 메소드들은 테스트 드라이버로서 작동하는 것들입니다. 즉, 우리가 만든 대상 클래스들의 객체를 생성하고, 그들의 메소드들을 호출하여 예측 값과 실제 값을 맞추어보는 것이죠. 다음 코드는 JUnit의 사용 예제입니다. Multiplier 객체를 생성해, multiply()의 인자에 3과 5를 주면 15를 반환하는지를 확인하죠. public class Multiplier { public int multiply ( int a , int b ) { int result = 0 ; for ( int i = 0 ; i < b ; i ++) { result += a ; } return result ; } } public class MultiplierTest { @Test public void testMultiply () { Multiplier multiplier = new Multiplier (); assertEquals ( 15 , multiplier . multiply ( 3 , 5 )); } } 복잡한 클래스의 테스트  복잡한 메소드의 경우, 수많은 비공개 메소드들을 호출합니다. 이들 역시 단위로 나누어 테스트하면 좋지 않겠습니까? 하지만 객체지향 언어의 특성상 다른 클래스는 해당 메소드들을 호출할 수 없습니다. 따라서 이들을 테스트하기 위해

[C++] 스터디 CPPALOM 1주차: 열혈 C++ 프로그래밍 Part 1

(파워 포인트 파일(.pptx)을 Markdown으로 변환하여 업로드하였음) # <br>1주차 - 열혈 C++ 프로그래밍 Part 1 # <br>cout, cin * C언어의 printf와 scanf를 대체하는 입출력 함수 * 여러 개를 ‘>>’, ‘<<‘를 이용해 동시에 입력 혹은 출력할 수 있음 * std::endl의 경우, 개행(‘\n’) * std::endl vs ‘\n’ * std::endl의 경우 출력 버퍼를 비움! ```C++ #include <iostream> int main() { std::cout << "Hi, your age?" << std::endl; int age; std::cin >> age; std::cout << "You were borned in " << 2023 - age << "!" << endl; } ``` ```C++ Hi, your age? >25 You were borned in 1998! ``` # <br>문자열 입출력 * 배열 기반의 문자열 입출력 * char는 문자 하나를 받으며, 100 크기의 char 배열은 99자의 문자열을 받을 수 있음 * 끝은 ‘\0’(NULL)으로 종결을 의미하는 문자가 필요함. ```C++ #include <iostream> int main() { char name[100]; std::cout << "이름은 무엇입니까? "; std::cin >> name; std::cout << "내 이름은 " << name << "입니다.\n"; return 0; } ``` ```C++ 이름은 무엇입니까? Subin 내 이름은 Subi

[C++] The C++ Programming Language: 7. Pointers, Arrays, and References (4) - Pointers and References

이미지
 7.7.4 Pointers and References   포인터와 참조는 복사 없이 서로 다른 공간에서 같은 객체에 접근할 수 있는 메커니즘들입니다. 이를 그림으로는 다음과 같이 나타낼 수 있죠:   이 둘은 각자 장단점이 존재합니다.   만약 여러분이 '어떤 객체를 참조할 것인지'를 변경하고 싶다면, 포인터를 사용하세요. 여러분들은 =, +=, -=, ++, --를 포인터 변수에 사용할 수 있습니다: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 void  fp(char∗ p) {      while   (∗p)      cout   < <   + + ∗p; } void  fr( char &  r) {      while   (r)           cout   < <   + + r;   // oops: increments the char referred to, not the reference      // near-infinite loop! } void  fr2( char &  r) {     char∗ p  =   & r;   // get a pointer to the object referred to      while   (∗p)           cout   < <   + + ∗p; } Colored by Color Scripter cs    반대로, 여러분이 해당 이름이 언제나 같은 객체를 참조하길 바란다면, 참조자를 활용하세요: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 template < class  T >   class  Proxy  {   // Proxy refers to the object with which it is initialized     T &  m; public:     Proxy(T &  mm)   :m{mm}   { }      // ... } ; template < c