Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

SYDev

[객체지향프로그래밍] 9주차 정리 본문

3학년 1학기 전공/객체지향 프로그래밍

[객체지향프로그래밍] 9주차 정리

시데브 2024. 5. 6. 15:34
경희대학교 이대호 교수님의 수업 자료를 바탕으로 작성한 글입니다.

 

File Streams

#include <iostream>
#include <fstream>

void save_vector (const std::string& filename, const std::vector<int>& vec) {
    std::ofstream out(filename);
    if(out.good()) {
        int n = vec.size();
        for(int i = 0; i < n; i++) {
            out << vec[i] << " ";
        }
        out << '\n';
        out.close();
    }
    else {
        std::cout << "Unable to save the file\n";
    }
}

void load_vector(const std::string& filename, std::vector<int>& vec) {
    std::ifstream in(filename);
    if(in.good()) {
        vec.clear();
        int value;
        while(in >> value) vec.push_back(value);
        in.close();
    }
    else {
        std::cout << "Unable to load in the file\n";
    }
}

void print_vector(const std::vector<int>& vec) {
    std::cout << "{";
    int len = vec.size();
    if(len > 0) {
        for(int i = 0; i < len - 1; i++) {
            std::cout << vec[i] << ", ";
        }
        std::cout << vec[len - 1];
    }
    std::cout << "}\n";
}

int main() {
    std::vector<int> list;
    bool done = false;
    char command;
    
    while(!done) {
        std::cout << "I)nsert <item> P)rint "
            << "S)ave <filename> L)oad <filename> "
            << "E)rase Q)uit: ";
        
        std::cin >> command;
        int value;
        std::string filename;
        switch (command) {
            case 'I':
            case 'i':
                std::cin >> value;
                list.push_back(value);
                break;
            case 'P':
            case 'p':
                print_vector(list);
                break;
            case 'S':
            case 's':
                std::cin >> filename;
                save_vector(filename, list);
                break;
            case 'L':
            case 'l':
                std::cin >> filename;
                load_vector(filename, list);
                break;
            case 'E':
            case 'e':
                list.clear();
                break;
            case 'Q':
            case 'q':
                done = true;
                break;
        }
    }
    
    return 0;
}

-> ofstream type + <<으로 파일에 입력

-> ifstream type + >>으로 파일 불러오기

 

Endl vs. \n

endl → buffer를 비우고 출력

\n → buffer를 비우지 않고 바로 출력

→ 그렇기 때문에 \n이 더 빠르다.

https://yechoi.tistory.com/48

 

[C++] std::endl이 \n과 다른 점 - 출력버퍼 이해하기

C++ 시작하는 친구가 문득 std::endl이랑 '\n'이랑 뭐가 다르냐고 물었다. 이전에 훑어보기론 std::endl은 출력버퍼를 비우고 \n은 그렇지 않다고 봐, 이렇게 설명을 해줬다. 그랬더니 버퍼가 뭐냐, 버퍼

yechoi.tistory.com

 

 

Binary format

#include <iostream>
#include <fstream>
 
int main(void) {
    std::ofstream ofs;
    ofs.open("123.bin", std::ios::binary);  //binary format으로 파일에 저장
    if(ofs.good()) {
        int x = 65;
        ofs.write((const char*)&x, sizeof(int));
        ofs.close();
    }
    
    std::ifstream ifs;
    ifs.open("123.bin", std::ios::binary);
    if(ifs.good()) {
        int x;
        ifs.read((char *)&x, sizeof(int));
        std::cout << x << std::endl;
        ifs.close();
    }
    
    return 0;
}

-> 기존 txt format에서는 123을 1, 2, 3 각각 char 형태로 바꿔서 저장

-> binary format은 int type은 그대로 int type의 size(4 byte)대로 저장!

 

Complex

  • complex<실수부, 허수부 data type(double, int, float, ..)> 형태로 선언 -> complex<double> c1( 4.0, 3.0 )
  • .imag(), .real()로 허수부, 실수부 추출
  • 비멤버 함수 abs, norm -> std::norm(z), std::abs(z)

 

sstream

#include <iostream>
#include <sstream>

int main(void) {
    std::stringstream ss;
    
    for(int i = 0; i < 10; i++) {
        ss << i << ", ";
    }
    
    std::cout << ss.str() << std::endl;
    
    return 0;
}

-> 다른 type의 입력을 string 하나로 묶을 때

-> string에서 문자, 정수 등의 형태를 추출하고 싶을 때 사용

 

PseudoRandomNumber

-> %10000으로 rand()를 이용했을 때, 공평하지 않은 확률로 결과값이 도출됨

 

#include <iostream>
#include <iomanip>
#include <random>

int main(void) {
    std::random_device rdev;
    std::mt19937 mt(rdev());   //random number를 정하는 알고리즘 설정
    std::uniform_int_distribution<int> dist(0, 99); //분포형태 결정
    // std::normal_distribution<double> dist(50., 10.);
    
    int histogram[100] = { 0 };
    for(int i = 0; i < 1000000; i++) {
        int r = dist(mt);
        // if(r >= 0 && r <= 99)
        histogram[r]++;
    }
    for(int i = 0; i < 100; i++) {
        std::cout << i << ": " << histogram[i] << std::endl;
    }
    
    return 0;
}