[C++] 심화프로그래밍 Week1

Yoons·2022년 9월 12일
0
post-thumbnail

실습 보고서 작성 요령


문제분석

  • 결과 화면을 캡쳐 하여 첨부, 해당 결과가 도출된 이유와 타당성 분석

프로그램 설계 및 알고리즘

  • 해결 방법에 따라 프로그램 설계 및 알고리즘 등 기술
  • e.g.) 문제 해결 과정 및 핵심 알고리즘 기술

소스코드 및 주석

  • 소스코드와 그에 해당하는 주석 첨부
  • 각각의 함수가 수행하는 작업, 매개변수, 반환 값 등을 명시
  • 소스코드 전체 첨부(소스코드 화면 캡처X, 소스코드는 복사/붙여넣기로 첨부)

결과 및 결과 분석

  • 결과 화면을 캡쳐 하여 첨부, 해당 결과가 도출된 이유와 타당성 분석

소감

  • 실습 문제를 통해 습득할 수 있었던 지식, 느낀 점 등을 기술

Prob 1


문제분석

이름, 학번, 날짜, 인사말을 각각 type에 맞게 선언한다. 각 정보를 사용자로부터 입력받고 특정 횟수만큼 정보를 출력한다.

프로그램 설계 및 알고리즘

이름과 인사말은 string으로, 학번과 날짜는 int형으로 입력받는다. 처리조건에 맞춰 코드를 작성해야하므로 string type은 getline()으로 입력받고, int형 변수는 cin으로 입력받는다. for문과 cout을 이용해 특정 횟수만큼 원하는 정보를 출력할 수 있도록 코드를 작성한다.

소스코드 및 주석

#include <iostream>
#include <string>
using namespace std;

int main(void)
{
    string name;
    int studentNumber;
    int date;
    string introduce;
    
    // 정보 입력
    getline(cin, name);
    cin >> studentNumber;
    cin >> date;
    cin.ignore(); 
    getline(cin, introduce);
    
    // 10회 출력
    for(int i = 0; i < 10; i++)
    {
        cout << name << studentNumber << date << introduce << endl;
    }
    return 0;
}

결과 및 결과 분석


이름, 학번, 날짜, 인사말을 순서대로 입력받았다. 날짜를 입력받고 cin.ignore()를 넣어줬다. 그 이유로 우리는 보통 정보를 입력하고 Enter를 입력해 '모두 입력했다'라는 메세지를 전달한다. cin.ignore()를 해주지 않으면 입력한 Enter가 그대로 다음 입력정보인 인사말에 입력되면서 올바른 정보가 입력되지 않는다. 정보를 모두 입력받고 for문을 이용해 10회 출력을 진행했더니 원하는 결과를 얻을 수 있었다.

소감

C언어를 학습하면서도 버퍼 오류로 애를 썼던 기억이 난다. cin.ignore()를 올바른 부분에 적절히 사용할 수 있게 된 것이 이번 문제에서 가장 큰 깨달음이라고 생각한다.


Prob 2


문제분석

정렬에 관련된 문항이다. 조건문과 반복문을 사용해야하므로 문제에서 요구하는 정렬해야 할 숫자의 갯수만큼 크기를 비교하며 정렬하는 코드를 작성하고 정렬된 결과를 출력한다.

프로그램 설계 및 알고리즘

int형 숫자 10개를 할당받을 배열을 선언한다. 10개의 숫자를 직접 받는다. 정렬 알고리즘에서는 for문과 if문을 이용해 index를 하나씩 키워가며 숫자를 비교하고 큰 숫자와 작은 숫자의 위치를 바꿔가며 정렬한 후 for문과 cout을 이용해 결과를 출력한다.

소스코드 및 주석

#include <iostream>
using namespace std;

int main()
{
    int num[10];

    cout << "숫자 10개 입력 : ";
    for (int i = 0; i < 10; i++){
        cin >> num[i];
    }

    cout << "데이터 출력 : ";
    for (int i = 0; i < 10; i++) {
		cout << num[i] << ' ';
	}

    cout << endl;
    cout << "오름차순 정렬 : ";
    for (int i = 0; i < 10; i++){
        int min_index = i;

		// i 기준 다음 index부터 탐색
		for (int j = i + 1; j < 10; j++)
		{
			// min index에 있는 값보다 현재 탐색 값이 더 작으면 min_index를 갱신
			if (num[j] < num[min_index])
				min_index = j;
		}
		// 배열 바꾸기
		swap(num[i], num[min_index]);
    }
    for (int i = 0; i < 10; i++) {
		cout << num[i] << ' ';
	}

    return 0;
}

결과 및 결과 분석


정렬 알고리즘을 거친 후에는 오름차순으로 잘 정렬된 것을 확인할 수 있다.

소감

이번 문항에서는 C언어에서 수행했던 과제와 크게 다를 바가 없었다. 그 이유는 C++언어는 C언어에서 조금 더 발전시킨 것이기 때문에 출력 방식을 제외하고는 유사한 점이 많았다.


Prob 3


문제분석

조건문과 반복문만을 이용해 수를 정렬한 2번 문항과는 달리 algolithm 라이브러리에 내장돼 있는 sort() 함수를 사용하여 코드를 수정한다. 이 문항에서는 클래스와 객체를 사용해야 하므로 알맞은 부분에 조건문을 사용하여 코드를 작성한다.

프로그램 설계 및 알고리즘

이 문항에서는 클래스와 객체를 사용해야 한다. 기본적으로 비교를 위해서는 먼저 기준(어떤 것을 더 우선순위로 둘 것인지)이 있어야 한다. 이 기준을 세우기 위해서는 비교 연산자를 사용해야하는데, 객체 내부에서 비교 연산자를 사용하기 위해서는 연산자 오버라이딩을 해줘야한다. 이 과정을 거치지 않으면 객체 내부에서 비교 연산자가 어떤 기능을 수행해야할지 모르기 때문에 오류가 발생한다. 비교연산자를 거쳐 조건문을 통해 정렬을 할지, 안할지 결정하고 최종적으로 정렬된 배열을 출력해주면 된다.

소스코드 및 주석

#include <iostream>
#include <algorithm>

using namespace std;

// Number 클래스 생성
class Number {
public:
    int num;

    bool operator<(const Number &arr) const{ // const : 객체 상태 고정
        if (this->num < arr.num) // 들어온 숫자가 이전 배열의 숫자보다 작다면
            return true; // true를 반환한다. 즉, 작은 값이 우선순위가 된다
    
        return false; // 아니라면 false. 정렬하지 않음
    }
};

int main(void) {
    Number arr[10];  // 객체 생성

    cout << "숫자 10개 입력 : ";
    for (int i = 0; i < 10; i++){
        cin >> arr[i].num; // 값 입력받기
    }

    cout << "데이터 출력 : ";
    for (int i = 0; i < 10; i++) 
    {
        cout << arr[i].num << ' '; 
    }

    cout << endl; 

    sort(arr, arr + 10);

    cout << "오름차순 정렬 :";

    for (int i = 0; i < 10; i++) 
    {
        cout << arr[i].num << " "; // 정렬 후 출력
    }
    
    return 0;
}

결과 및 결과 분석


2번 문항과 같이 무작위로 정렬된 수가 오름차순으로 올바르게 정렬된 것을 확인할 수 있다.

소감

객체 지향 언어에 익숙하지 않아 이 문항을 해결하는데 많은 시간이 걸렸다. 정렬하기 위해서 그냥 sort함수를 쓰면 되는데, 왜 굳이 복잡하게 해결하는 것인지 의문이 들었다. 이 과정을 거치는 이유가 '객체 내부에서 동작하기 위함'이라는 것을 깨닫고 클래스와 객체의 역할에 대해서 다시 한번 생각해봤다. 클래스와 객체는 많은 데이터를 묶어서 처리한다는 데 의미가 있음을 깨닫고, 많은 데이터를 처리해야하는 실무에서는 단순히 sort로 정렬하는 것이 아니라 해당 문항과 같은 과정을 거쳐야 다소 복잡하게 보이는 데이터들을 수월하게 처리할 수 있음을 알게되었다.


참고 Reference

profile
모든 글은 저의 눈물을 머금으며 작성한 글이니..재밌게 봐주세요 :) 깃헙 맞팔@

0개의 댓글