[심화프로그래밍] Week9

Yoons·2022년 11월 8일
0
post-thumbnail

실습 보고서 작성 요령


문제분석

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

프로그램 설계 및 알고리즘

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

소스코드 및 주석

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

결과 및 결과 분석

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

소감

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

Prob 1

문제분석

생성자 함수 중복을 사용하여 다양한 도형의 부피와 면적을 계산하는 프로그램이다. 생성자 함수 중복이 가능하려면, 매개변수의 개수 또는 매개변수의 type이 달라야한다. 계산해야 하는 7개의 종류 중 같은 개수의 매개변수를 받아야하는 것들이 조금 보이는데, 이는 매개변수 double형과 int형으로 적당히 받아서 처리해야 할 것으로 보인다. 입력한 숫자에 따라 다른 action을 취해야하므로 함수 정의에서 사전 입력한 매개변수와 타입에 맞춰 작성하면 된다.

프로그램 설계 및 알고리즘

  1. measure 클래스와 멤버 변수를 선언한다.
  2. 각 역할을 수행할 생성자를 작성한다. 이때 매개변수의 개수를 다르게 작성하거나, 같다면 매개변수의 type을 다르게 해야하므로 구분하여 작성한다.
  3. 선언부에 각 생성자를 잘 선언하고, 생성자의 역할에 따라 구현부에 알맞은 계산을 수행한다.
  4. (main function) 변수를 선언한다. 변수는 type 구분을 위해 int형 double형으로 나눠 선언한다.
  5. (main function) 보기를 보여주고 진행하고자 하는 번호를 선택한다.
  6. (main function) 조건문을 사용해 해당 번호에 맞는 객체를 생성하여 생성자를 호출한다. 이때 각 생성자 매개변수에 맞춰 값을 입력 받은 후 그 값을 그대로 전달한다. 선택한 번호가 1-7에 없는 경우 에러메세지를 출력하며 종료한다.

소스코드 및 주석

#include <iostream>
using namespace std;

class measure{ // class 선언
private: // private 접급지정자
    int radius; // 반지름
    int width; // 가로길이
    int height; // 세로 길이, 높이
public: // public 접근지정자
    measure(); // 기본생성자
    measure(int radius); // 원 면적
    measure(int width, int height); // 직사각형, 정사각형
    measure(double width, int height); // 삼각형
    measure(int radius, double height); // 원뿔 부피
    measure(double radius); // 구 부피
    measure(double radius, double height); // 실린더 부피
};

measure::measure(int radius){ // 원의 면적을 구하는 생성자
    this -> radius = radius; // 매개변수 값을 멤버 변수에 저장
    cout << "원의 면적은 " << 3.14*(this->radius)*(this->radius) << endl; // 3.14*pi*반지름^2
}

measure::measure(int width, int height){ // 직사각형, 정사각형의 면적을 구하는 생성자
    this -> width = width; // 매개변수 값을 멤버 변수에 저장
    this -> height = height;
    cout << "사각형의 면적은 " << (this->width)*(this->height) << endl; // 가로길이*세로길이
}

measure::measure(double width, int height){ // 삼각형의 면적을 구하는 생성자
    this -> width = width; // 매개변수 값을 멤버 변수에 저장
    this -> height = height;
    cout << "삼각형의 면적은 " << (this->width)*(this->height)/2 << endl; // 사각형 면적/2
}

measure::measure(int radius, double height){ // 원뿔의 부피를 구하는 생성자
    this -> radius = radius; // 매개변수 값을 멤버 변수에 저장
    this -> height = height;
    cout << "원뿔의 부피는 " << 0.33*3.14*(this->radius)*(this->radius)*(this->height) << endl; // 1/3*pi*반지름^2*높이
}

measure::measure(double radius){ // 구의 부피를 구하는 생성자
    this -> radius = radius; // 매개변수 값을 멤버 변수에 저장
    cout << "구의 부피는 " << 1.33*3.14*(this->radius)*(this->radius)*(this->radius) << endl; // 4/3*pi*반지름^3
}

measure::measure(double radius, double height){ // 실린더의 부피를 구하는 생성자
    this -> radius = radius; // 매개변수 값을 멤버 변수에 저장
    this -> height = height;
    cout << "실린더의 부피는 " << 3.14*(this->radius)*(this->radius)*(this->height) << endl; // pi*반지름^2*높이
}


int main(){
    int radius; // int형 radius
    double radius_d; // double형 radius
    int width; // int형 width
    double width_d; // double형 width
    int height; // int형 height
    double height_d; // double형 height
    
    cout << "면적 및 부피 계산기" << endl << endl;

    cout << "1. 원의 면적" << endl; // 보기 출력
    cout << "2. 직사각형의 면적" << endl;
    cout << "3. 삼각형의 면적" << endl;
    cout << "4. 정사각형의 면적" << endl;
    cout << "5. 원뿔 부피" << endl;
    cout << "6. 구 부피" << endl;
    cout << "7. 실린터 부피" << endl << endl;

    cout << "입력 : "; // 보기 숫자 입력
    int num;
    cin >> num;

    if (num == 1){ // 선택한 것이 1번이라면
        cout << "원의 반지름 입력 (int radius): ";
        cin >> radius;
        measure obj(radius); // int형 radius 전달, obj 객체 생성
    }
    else if(num == 2){ // 선택한 것이 2번이라면
        cout << "직사각형 밑변, 높이 입력 (int radius, int height): ";
        cin >> width >> height;
        measure obj(width, height); // int형 width, int형 height 전달, obj 객체 생성
    }
    else if(num == 3){ // 선택한 것이 3번이라면
        cout << "삼각형 밑변, 높이 입력 (double width, int height): ";
        cin >> width_d >> height;
        measure obj(width_d, height); // double형 width, int형 height 전달, obj 객체 생성
    }
    else if(num == 4){ // 선택한 것이 4번이라면
        cout << "정사각형 한 변의 입력 (int width): ";
        cin >> width;
        measure obj(width, width); // int형 width 전달, obj 객체 생성
    }
    else if(num == 5){ // 선택한 것이 5번이라면
        cout << "원뿔의 밑반지름, 높이 입력 (int radius, double height): ";
        cin >> radius >> height_d;
        measure obj(radius, height_d); // int형 radius, double형 height 전달, obj 객체 생성
    }
    else if(num == 6){ // 선택한 것이 6번이라면
        cout << "구의 반지름 입력 (double radius): ";
        cin >> radius_d;
        measure obj(radius_d); // double형 radius 전달, obj 객체 생성
    }
    else if(num == 7){ // 선택한 것이 7번이라면
        cout << "실린더 밑반지름, 높이 입력 (double radius, double height): ";
        cin >> radius_d >> height_d;
        measure obj(radius_d, height_d); // double형 radius, double형 height 전달, obj 객체 생성
    }
    else { // 선택한 것이 1-7 사이의 숫자가 아니라면
        cout << "1-7 사이의 숫자를 입력해주세요. 프로그램을 종료합니다."; // 에러 메세지 출력
    }
}

결과 및 결과 분석


보기를 표시한 후 원하는 번호를 입력한다. 입력 후에는 해당 번호에 맞는 동작이 실행되며, 위 사진의 경우 원뿔의 밑반지름, 높이를 입력 받아 부피를 잘 계산하는 것을 확인할 수 있다.


7번을 입력했을 때 실린더의 밑반지름과 높이를 입력 받아 올바르게 부피를 계산 및 출력하는 것을 확인할 수 있다.


보기의 숫자가 아닌 다른 문자나 숫자를 입력했을 때는 에러메세지와 함께 프로그램이 종료되는 것을 확인할 수 있다.

소감

생성자 중복을 선언할 때 생성자의 역할에 맞춰 작성했지만 계속 에러메세지가 나왔다. 이유를 잘 모르고 애꿎은 문제만 잡으려고 했지만 매개변수 이름만 바꾸면 된다고 생각해 실행 시 함수가 중복되었다는 메세지가 나오는 것이었다..매개변수 개수나 매개변수의 type이 달라야한다는 것을 깨닫고 수정을 하는데, 매개변수로 2개를 받는 생성자가 4개나 있었다..설마 int, double형을 번갈아가면서 써서 일부로 4개를 맞추신건가..?하는 생각이 들었다. 일단 실행해보니 문제는 없이 잘 실행됐다. 문제가 조금 지협적이라는 생각이 들었지만 생성자가 중복되기 위해서는 어떻게 해야할지 확실히 알 수 있는 문제였다. 출제 의도 또한 이렇지 않을까..생각해본다.


Prob 2

문제분석

차량에 대한 정보를 입력하고 출력하는 예제이다. 정적 멤버 변수를 사용해서 입출력하며 입출력시 객체이름이 아닌 클래스의 이름만을 가지고 접근한다. static은 객체가 아닌 클래스의 멤버 변수라는 점에서 사용하는 방법이 조금 다를 뿐 사용하는데는 큰 어려움이 없을 것이다.

프로그램 설계 및 알고리즘

  1. Car class를 생성하고 차량 번호, 이름, 표시 번호를 저장할 정적 멤버 변수를 선언한다.
  2. 객체 생성 시 생성 메세지 출력을 위해 기본생성자를 선언한다.
  3. 구현부에 "객체가 생성되었습니다."라는 메세지를 출력하는 생성자를 구현한다.
  4. 정적 멤버 변수를 초기화한다. 접근 시에는 'Car::정적멤버변수 이름'형식을 이용하고, 차량 번호는 '0000', 차량 이름은 'None', 표시번호는 1로 초기화한다.
  5. (main) 객체를 생성하고 생성 메세지를 출력한다.
  6. (main) 'Car::정적멤버변수 이름'형식을 이용해 각각 정보를 입력한다.
  7. (main) 입력한 정보를 출력한다.

소스코드 및 주석

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

class Car{ // Car class 생성
public: // public 접근 지정자
    static int carNum; // carNum int형 정적 변수
    static string carName; // carName string형 정적변수
    static int checkNum; // checkNum int형 정적변수

    Car(); // 기본 생성자
};

Car::Car(){ // Car 기본 생성자 구현
    cout << "객체가 생성되었습니다." << endl; // 출력 메세지
}

// 정적변수 초기화
int Car::carNum = 0000;
string Car::carName = "None";
int Car::checkNum = 1;  

int main(){
    Car car1; // car1 객체 생성

    cout << "차량 번호 입력 : ";
    cin >> Car::carNum; // 차량 번호 입력 후 정적 변수 carNum에 저장

    cout << "차량 이름 입력 : ";
    cin >> Car::carName; // 차량 이름 입력 후 정적 변수 carName에 저장

    cout << "표시 (1-10) : ";
    cin >> Car::checkNum; // 표시 번호 입력 후 정적 변수 checkNum에 저장

    cout << endl << "차량 번호 : " << Car::carNum << endl; // 차량 번호 출력
    cout << "차량 이름 : " << Car::carName << endl; // 차량 이름 출력
    cout << "표시 : " << Car::checkNum << endl << endl; // 표시 번호 출력
}

결과 및 결과 분석


객체 생성 후 객체가 생성되었다는 메세지를 출력하고, 차량 번호, 이름, 표시 번호를 입력 받는다. 이 값들은 각각의 정적 멤버 변수에 저장되며 입력 받은 정보를 올바르게 출력하는 것을 확인할 수 있다.

소감

static과 같이 추가적으로 무언가를 추가할 때마다 "이건 또 뭐ㅈ..어떻게 쓰지.."와 같은 불안함이 들었다. static 멤버 변수는 각 객체에 대한 변수가 아닌, 모든 객체가 공유하는, 즉 클래스에 대한 변수라는 점에서 "이렇게 쓸 수도 있구나"라는 점을 인식했다. 이번 과제를 통해 직접 사용해보니, 클래스, 객체이름을 통해 접근하는 것 뺴고는 "어쨌든 변수구나!"라는 것을 깨달았다.


음식 배달 프로젝트(CLI)

필수로 들어가야 할 기능

  • 회원관리
  • 회원가입/탈퇴
    • 로그인/로그아웃
    • 회원등급
    • 포인트 충전 등

  • 음식 메뉴
    • 목록
    • 상세 설명
    • 가격
    • 음식 선택 등

  • 주문
    • 배달/포장 선택
    • 배달/포장 완료 시간
    • 장바구니 등


      각 부분에서 최소 2개 씩 총 6개는 들어가야함

프로젝트 계획

  1. 구현 목표
  • 최근 배달 서비스가 각광 받으며 수많은 사람들이 이용하기 시작했다. 배달 서비스는 소수가 아닌 다수에게 동등한 기능을 제공해야한다. 프로그램 작동 중 만들어지는 데이터베이스는 프로그램이 종료되면 모두 reset되기 때문에 회원 정보를 온전히 보호 및 유지하기 어렵다. 따라서 회원 정보를 저장하고 수정가능하며 프로그램이 종료되어도 회원 정보가 남게끔 할 수 있는 방법을 고안하여 적용할 것이다. 이 프로젝트의 최종적인 목적은 많은 회원정보를 데이터베이스에 저장가능하게 하고, 원하는 기능을 반복적으로 사용가능하게 하는데 있다.

  1. 구현할 기능
  • 회원관리
    • 로그인/로그아웃
    • 포인트 충전
    • 회원등급

  • 음식 메뉴
    • 목록(가격)
    • 상세 설명
    • 음식 선택

  • 주문
    • 배달/포장 선택
    • 주문 및 결제

  1. 구현에 필요한 기능
  • 데이터를 담을 JSON 파일 생성 후 C++ 파일에서 include하여 데이터 사용하기

  • 회원관리
    • 로그인 함수 : JSON 데이터와 비교하여 로그인 및 객체 생성
    • 로그아웃 함수 : 로그아웃하여 객체 소멸
    • 포인트 충전 함수 : JSON 데이터에서 현재 보유 포인트를 가져오고 원하는 만큼 포인트 충전
    • 회원 정보 출력 함수 : JSON으로 부터 이름, 회원 등급, 보유 포인트에 대한 정보를 가져와 출력

  • 음식 메뉴
    • 메뉴 출력 함수 : 메뉴 목록과 가격을 출력
    • 메뉴 상세 설명 함수 : 메뉴 번호를 입력하면 해당 메뉴에 대한 상세 설명을 출력
    • 음식 선택 함수 : 음식 선택 시 메뉴 이름과 가격을 저장

  • 주문
    • 주문 방법 선택 : 배달/포장을 선택
    • 최종 주문 및 결제 함수 : 최종 주문을 확인하며 결제

Reference

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

0개의 댓글