카테고리 없음

202208026이종윤 14주차 c프로그래밍 과제

jong133 2024. 12. 3. 13:50

제네릭 프로그래밍을 알기쉽게 뤼튼에게 물어보았다. 제네릭 프로그래밍은 자료형이 실행할때 결정이 된다.
이렇게 함수를 줄여서 세줄에 실행될수있다. 원인은 템플릿을 사용해서이다. 정리하자면 이 프로그램은 제네릭 프로그래밍을 통해 다양한 데이터 타입(정수, 실수, 문자)에 대해 동일한 Max 함수를 사용하여 두 값 중 큰 값을 찾는 예를 보여줍니다. 템플릿을 사용함으로써 코드의 재사용성을 높이고, 다양한 타입에 대해 유연하게 동작할 수 있도록 한다.
제네릭프로그래밍을 구현하는방법을 프로그래밍언어별로 예를들어 설명해주라고 뤼튼에게 물어보았다.
class대신에 typename을 써도된다.
class와 typename의 차이
class T3까지 추가해서 클래스를 3번째까지 하면 계속 찍어낼수있다.
1.헤더 파일 포함: #include <iostream>는 C++의 입출력 기능을 사용하기 위해 필요한 헤더 파일입니다. 2.네임스페이스 사용: using std::cout;와 using std::endl;는 std 네임스페이스에서 cout과 endl을 직접 사용할 수 있게 해줍니다. 이렇게 하면 std::를 매번 붙이지 않아도 됩니다. 3.템플릿 함수 정의: template <class T1, class T2, class T3>는 세 개의 템플릿 매개변수를 가진 함수를 정의합니다. 이 함수는 다양한 타입의 인자를 받을 수 있습니다. 4.함수 본체: void fun(T1 x, T2 y, T3 z)는 세 개의 매개변수를 받아서, 이들을 출력하는 기능을 합니다. cout을 사용하여 각 매개변수를 출력하고, endl로 줄바꿈을 합니다. 5.main 함수: 프로그램의 시작점입니다. 여러 번 fun 함수를 호출하여 다양한 타입의 인자를 전달합니다. 각 호출에서 템플릿 매개변수의 타입이 자동으로 추론됩니다. 6.함수 호출 예시: fun("Han", 30, 1);: 문자열, 정수, 정수를 인자로 전달합니다. fun(25, 50.5, 1.2);: 정수, double, double을 인자로 전달합니다. fun(1, 2, 3);: 모두 정수인 인자를 전달합니다. fun('a', 3.5, 1);: 문자, double, 정수를 인자로 전달합니다. 이 코드는 다양한 타입의 인자를 받아 출력하는 템플릿 함수의 사용 예시를 보여줍니다. C++의 템플릿 기능을 활용하여 코드의 재사용성을 높이고, 다양한 데이터 타입을 처리할 수 있습니다.

1단계. template를 쓰고 2단계. <>를 쓴다 그리고 3단계. 클래스의 개수에맞게 class T1,T2를 써준다.

근데 에러가 발생했다. 바로 메인에서인데 결정되지 않는 자료형이 2개가있어서 결정체를 꺽세 안에다가 차례대로 넣어서 실행한다. 이것이 템플릿클래스다.
코드 설명 헤더 파일 포함: #include <iostream>는 C++의 입출력 기능을 사용하기 위해 필요한 헤더 파일입니다. 네임스페이스 사용: using std::cout;와 using std::endl;는 std 네임스페이스에서 cout과 endl을 직접 사용할 수 있게 해줍니다. 이렇게 하면 std::를 매번 붙이지 않아도 됩니다. 템플릿 클래스 정의: template <class T1, class T2>는 두 개의 템플릿 매개변수를 가진 클래스를 정의합니다. 이 클래스는 다양한 타입의 데이터를 저장할 수 있습니다. 멤버 변수: T1 x;와 T2 y;는 각각 템플릿 매개변수에 따라 타입이 결정되는 멤버 변수입니다. 생성자: CCC(T1 xx, T2 yy)는 두 개의 매개변수를 받아서 멤버 변수 x와 y를 초기화합니다. 생성자는 객체가 생성될 때 호출됩니다. Print 메서드: void Print()는 멤버 변수 x와 y의 값을 출력하는 메서드입니다. cout을 사용하여 두 값을 쉼표로 구분하여 출력합니다. main 함수: 프로그램의 시작점입니다. 여러 개의 CCC 클래스 인스턴스를 생성하고, 각 인스턴스의 Print 메서드를 호출하여 값을 출력합니다. 인스턴스 생성 및 메서드 호출: CCC<int, int> c1(10, 20);: int 타입의 x와 y를 가지는 CCC 객체 c1을 생성합니다. CCC<double, double> c2(3.5, 5.5);: double 타입의 x와 y를 가지는 CCC 객체 c2를 생성합니다. CCC<char, const char*> c3('I', "Love You!");: char 타입의 x와 const char* 타입의 y를 가지는 CCC 객체 c3를 생성합니다. 출력 결과: c1.Print();는 10,20을 출력합니다. c2.Print();는 3.5,5.5을 출력합니다. c3.Print();는 I,Love You!을 출력합니다. 이 코드는 C++의 템플릿 클래스를 사용하여 다양한 데이터 타입을 처리하는 방법을 보여줍니다. 템플릿을 사용하면 코드의 재사용성을 높이고, 다양한 타입의 데이터를 유연하게 다룰 수 있습니다.
게임회사들어가기전에 필수STL들이다.
c++벡터클래스에서 자주사용하는것은 push_back 개수가 몇개인지알고싶으면 size
예외처리 키워드별 언어별로 프로그래밍을 표로 쉽게 설명했다.
프로그래밍하고나서 제일 마지막에 하는 일

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

try로 묶고 throw로 던지고 catch로 받아서 처리하는것이 예외처리이다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

이렇게 간단한것은 if로 대신예외처리를 할수있다. 분모가 0이아닐때 나와라라는 소스이다. 그래서 원래라면 inf가 나와야되지만 아무것도 안나왔다.
1단계 실행할때 에러가 발생할수있는 줄을 try로 묶는다
해당조건에서 예외값을 던지는 키워드는 throw 던지는것이다 이게 2단계이다.
3단계 catch블록안에 예외형태를 넣고 cout 표기를 넣는다.정리하자면 헤더 파일 포함: #include <iostream>는 C++의 입출력 기능을 사용하기 위해 필요한 헤더 파일입니다. 네임스페이스 사용: using std::cout;, using std::cin;, using std::endl;는 std 네임스페이스의 cout, cin, endl을 직접 사용할 수 있게 해줍니다. Div 함수: Div 함수는 두 개의 double 타입 매개변수 ja (분자)와 mo (분모)를 받아서 나누기를 수행합니다. try 블록 내에서 분모가 0인지 확인하고, 0일 경우 throw mo;를 통해 예외를 발생시킵니다. 나누기 결과를 출력합니다. catch 블록은 발생한 예외를 처리합니다. 여기서는 int와 double 타입의 예외를 모두 같은 메시지로 처리하고 있습니다. main 함수: main 함수는 프로그램의 시작점입니다. 사용자로부터 분자와 분모를 입력받고, Div 함수를 호출하여 나누기를 수행합니다. 예외 처리 이 코드에서는 분모가 0일 때 예외를 발생시키고, 이를 catch 블록에서 처리하여 사용자에게 오류 메시지를 출력합니다. catch 블록에서 int와 double 타입의 예외를 모두 같은 메시지로 처리하고 있지만, 실제로는 throw mo;에서 mo는 double 타입이므로 catch (double) 블록이 실행됩니다. catch (int) 블록은 이 경우에는 실행되지 않습니다.
요약 ()는 함수 호출, 매개변수 정의, 조건문 및 수학적 우선순위 지정에 사용됩니다. {}는 코드 블록, 구조체 및 클래스 정의, 초기화 리스트에 사용됩니다. []는 배열 접근 및 템플릿 정의에 사용됩니다. <>는 템플릿 정의 및 STL에서 타입 지정에 사용됩니다. 이러한 괄호들은 C++의 문법에서 매우 중요한 역할을 하며, 각각의 용도를 이해하는 것이 중요합니다.
요약 ()는 타입 캐스팅, 람다 표현식, 예외 처리 등에서 사용됩니다. {}는 리스트 초기화, 범위 기반 for 루프, 네임스페이스 정의 등에서 사용됩니다. []는 배열 선언, 포인터와 배열의 관계, 구조체의 멤버 접근 등에서 사용됩니다. <>는 템플릿 인스턴스화, 타입 정의, C++ 표준 라이브러리에서 사용됩니다. 이러한 괄호들은 C++의 다양한 문법 요소에서 중요한 역할을 하며, 각 용도를 이해하는 것이 프로그래밍에 도움이 됩니다.
rx = x에서 x 가 바뀌면 rx도 바뀌고 rx가 바뀌면 x가 바뀐다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

요약 이 코드는 C++에서 참조자를 사용하는 방법을 보여줍니다. 참조자는 원래 변수를 직접 수정할 수 있는 방법을 제공하며, 참조자가 가리키는 변수의 값이 변경되면 참조자 자체도 그 변화를 반영합니다.
fill('')는 width(숫자) 숫자만큼 빈공간에다가 ''문자안에 넣은걸로 채우는것이다. 그리고 precision()는 ()안에 숫자를 넣은만큼 소수점까지 출력이 되는것이다.
setw나 setfill이 더 간편한데 이 소스를 쓸려면 iomanip헤더파일을 포함시켜줘야된다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

파일입출력을할때 3개의 소스가있는데 ifstream과 ofstream만 쓰면되는데 ifstream은 파일 읽기동작이고 ofstream은 파일쓰기동작이다. 5점짜리 문제

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

ofstream으로 lout이 실행됬을때 그 문자열을 파일에 저장을해주고 원래 그대로 cout에 출력하고싶은것은 그대로 출력된다, 대신에 헤더 fstream을 추가해야된다.
파일을 만들어서 저장했으면 .close를 사용하여 반드시 닫아줘야된다. 그러므로 123이 제대로 출력이 된다.

c++로 stl과 file입출력을 이용해서 성적처리 프로그램을 만들고싶어

답변

검색 과정

C++에서 STL(Standard Template Library)과 파일 입출력을 이용하여 성적 처리 프로그램을 만드는 방법을 설명하겠습니다. 이 프로그램은 학생의 이름과 성적을 입력받아 파일에 저장하고, 저장된 데이터를 읽어와서 출력하는 기능을 포함합니다.

프로그램 구조
학생 정보를 저장할 구조체: 학생의 이름과 성적을 저장합니다.
STL 컨테이너: std::vector를 사용하여 학생 정보를 저장합니다.
파일 입출력: std::ofstream과 std::ifstream을 사용하여 파일에 데이터를 저장하고 읽어옵니다.
코드 예제
cpp


#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

// 학생 정보를 저장할 구조체
struct Student {
    string name;
    double score;
};

// 학생 정보를 파일에 저장하는 함수
void saveToFile(const vector<Student>& students, const string& filename) {
    ofstream outFile(filename);
    if (!outFile) {
        cerr << "파일을 열 수 없습니다: " << filename << endl;
        return;
    }

    for (const auto& student : students) {
        outFile << student.name << " " << student.score << endl;
    }

    outFile.close();
}

// 파일에서 학생 정보를 읽어오는 함수
vector<Student> loadFromFile(const string& filename) {
    vector<Student> students;
    ifstream inFile(filename);
    if (!inFile) {
        cerr << "파일을 열 수 없습니다: " << filename << endl;
        return students;
    }

    Student student;
    while (inFile >> student.name >> student.score) {
        students.push_back(student);
    }

    inFile.close();
    return students;
}

// 학생 정보를 출력하는 함수
void printStudents(const vector<Student>& students) {
    cout << "학생 성적 목록:" << endl;
    for (const auto& student : students) {
        cout << "이름: " << student.name << ", 성적: " << student.score << endl;
    }
}

int main() {
    vector<Student> students;
    string filename = "students.txt";
    int numStudents;

    cout << "학생 수를 입력하세요: ";
    cin >> numStudents;

    // 학생 정보 입력
    for (int i = 0; i < numStudents; ++i) {
        Student student;
        cout << "학생 이름: ";
        cin >> student.name;
        cout << "학생 성적: ";
        cin >> student.score;
        students.push_back(student);
    }

    // 학생 정보를 파일에 저장
    saveToFile(students, filename);

    // 파일에서 학생 정보 읽기
    vector<Student> loadedStudents = loadFromFile(filename);

    // 학생 정보 출력
    printStudents(loadedStudents);

    return 0;
}
코드 설명
구조체 정의: Student 구조체는 학생의 이름과 성적을 저장합니다.
파일 저장 함수: saveToFile 함수는 std::ofstream을 사용하여 학생 정보를 파일에 저장합니다.
파일 읽기 함수: loadFromFile 함수는 std::ifstream을 사용하여 파일에서 학생 정보를 읽어와 std::vector에 저장합니다.
출력 함수: printStudents 함수는 학생 정보를 출력합니다.
메인 함수:
사용자로부터 학생 수를 입력받고, 각 학생의 이름과 성적을 입력받아 std::vector에 저장합니다.
학생 정보를 파일에 저장한 후, 파일에서 다시 읽어와 출력합니다.
사용 방법
코드를 컴파일하고 실행합니다.
프로그램이 학생 수를 묻고, 각 학생의 이름과 성적을 입력받습니다.
입력이 완료되면, 학생 정보가 students.txt 파일에 저장됩니다.
프로그램은 파일에서 학생 정보를 읽어와 출력합니다.
이 프로그램은 기본적인 성적 처리 기능을 제공하며, 필요에 따라 추가적인 기능(예: 성적 평균 계산, 성적 정렬 등)을 구현할 수 있습니다.