[심화프로그래밍] Week10

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

실습 보고서 작성 요령


문제분석

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

프로그램 설계 및 알고리즘

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

소스코드 및 주석

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

결과 및 결과 분석

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

소감

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

Prob 1

문제분석

friend 함수를 사용하여 656부터 789 사이의 숫자 중 7로 나누어 떨어지는 숫자를 모두 출력하고 그 숫자들의 총합을 구하는 프로그램이다. 처리 조건에 맞춰 Number 클래스를 생성하고 friend 함수를 선언한다. friend 함수는 접근 지정자의 영향을 받지 않으므로 private 멤버에 직접 접근이 가능하다. main함수에서 조건문과 반복문을 사용하여 656부터 789 중 7로 나눈 나머지가 0인 숫자들을 매개변수로 받아 정의 함수에서 출력하고 그 숫자들을 누적합을 통해 더한 후 for문을 빠져나왔을 때 출력하면 된다.

프로그램 설계 및 알고리즘

1.Number 클래스를 생성하고, 7로 나눠지는 숫자를 출력할 friend 함수를 생성한다.
2. (number function) friend 함수인 number 함수를 구현한다. 이때 받는 매개변수는 main 함수에서 조건문을 통과한 숫자이다.
3. (main function) 총합을 누적해서 저장할 int형 변수 sum을 0으로 초기화한다.
4. (main function) int형 변수 i를 656부터 789까지 하나씩 늘려가는 반복문을 만들고 그 안에 i를 7로 나눈 나머지가 0인 경우 내부 내용을 실행하는 코드를 작성한다.
5. (main function) 조건을 만족할 경우 i를 매개변수로 하여 friend함수를 호출하고 sum에 i를 누적해서 더한다.
6. (main function) for문을 모두 빠져나오면 최종적으로 sum을 출력한다.

소스코드 및 주석

#include <iostream>
using namespace std;

class Number{ // Number 클래스 생성
    friend void number(int n); // friend 함수 선언
};

void number(int n){ // number 함수 구현
    cout << "7로 나누어진 숫자는 " << n << endl; // 7로 나누어지는 숫자를 매개변수로 입력 받아 출력
}

int main(){
    cout << "656과 789 사이에서 7로 나눌 수 있는 숫자" << endl << endl;

    int sum = 0; // 총합 변수, 0으로 초기화
    for(int i = 656; i < 790; i++){ // 반복문, 656부터 하나씩 늘려 789가 될 때까지 반복
        if(i%7 == 0){ // i를 7로 나눴을 때 나머지가 0이면
            number(i); // i를 매개변수로 하여 number 함수 호출
            sum = sum + i; // sum에 i를 누적
        }
    }
    cout << "7로 나눌 수 있는 모든 수의 합은 " << sum << endl; // 총합 출력
}

결과 및 결과 분석


7로 나누어 떨어지는 숫자들이 오름차순 순서에 맞춰(for문이 오름차순이기 때문에) 잘 출력되는 것을 확인할 수 있다. 최종적으로 출력된 숫자들을 모두 더한 총합 계산도 잘 된 것을 확인할 수 있다.

소감

friend 함수는 캡슐화가 생기면서 나온 기능이기 때문에 처음 경험해봐서 사용하는데 어색함을 느꼈다. friend 함수는 '친구'로서 접근 지정자에 상관없이 직접 접근할 수 있는 것인데, 캡슐화의 목적은 '보호'의 목적이므로 실제로 friend함수를 잘 사용할까?라는 의문점이 들었다.


Prob 2

문제분석

friend 함수를 사용하여 사용자로부터 입력한 숫자에 따라 알파벳 피라미드의 층을 다르게 출력하는 프로그램이다. 알파벳의 출력은 아스키 코드값을 이용하여 출력하며, 예시 사진과 같이 양쪽 끝이 처음으로 시작하여 가운데에서 끝나야한다. 처리조건에 맞춰 Pyramid 클래스를 생성하고 아스키코드를 알파벳으로 바꿔줄 friend 함수를 선언한다. friend 함수는 접근 지정자의 영향을 받지 않고, 직접 접근이 가능하다. main함수에서 사용자에서 26이하의 숫자를 입력 받고, 조건문과 반복문을 통해 코드를 실행한다.

프로그램 설계 및 알고리즘

  1. Pyramid 클래스를 생성하고 frind 함수인 trans 함수를 선언한다.
  2. trans 함수를 구현한다. main 함수로부터 int형 변수를 매개변수로 받고 그것을 char형 변수로 저장하여 아스키코드값을 문자로 변환한다.
  3. (main function) 사용자로부터 int형 숫자를 입력 받고 26 이하인지, 아닌지를 판단하는 조건문을 이용한다. 26이하라면 정상적으로 반복문을 실행하고, 아니라면 에러메세지를 출력한다.
  4. (main function) 입력한 숫자만큼 반복하는 외부 for문을 입력하고, 그 안에 줄에 따라서 공백을 하나씩 줄여나가는 for문과 출력 알파벳 개수를 홀수에 맞춰 늘려나가는 for문을 각각 작성한다.
  5. (main function) 홀수에 맞춰 알파벳을 출력하는 반복문에서는 사용자 정의 함수에 매개변수를 넘겨 계산한다.
  6. (main function) 최종적으로 사용자가 처음 입력했던 숫자를 한번 더 출력해준다.

소스코드 및 주석

#include<iostream>
using namespace std;

class Pyramid{ // Pyramid 클래스 생성
    friend void trans(int m); // friend 함수 선언
};

void trans(int m){ // trans 함수 구현
    char alphabet; // char형 변수 선언
    alphabet = m; // int형 매개변수를 char형으로 변환
    cout << alphabet << " "; // alphabet 출력
}

int main() {
    int n;
    cout << "글자수를 입력하세요(26이하의 숫자) : ";  
    cin >> n; // 글자수 입력

    if(n <= 26){ // 입력한 수가 26이하이면
        for (int i = 1; i <= n; i++) { // 입력한 수 만큼 반복
            for (int j = 1; j <= n - i; j++){
                cout << "  "; // 문자 시작 전 공백
            }
            for (int j = 1; j <= 2*i-1; j++){
                trans(65 + i - 1 - (j - i > 0 ? j - i : -1 * (j - i))); // 아스키 코드값 계산
            }
            cout << endl;
        }
        cout << "입력한 글자수 : " << n << endl; // 입력한 글자수 출력
    }
    else{ // 26이하의 숫자가 아니면
        cout << "26이하의 숫자를 입력해주세요." << endl; // 에러메세지 출력
    }
}

결과 및 결과 분석


14를 입력했을 때 14줄로 잘 출력되는 것을 확인할 수 있다.


입력 가능 최댓값인 26을 입력했을 때 Z까지 모두 잘 출력되는 것을 확인할 수 있다.


입력 가능 최댓값인 26을 초과했을 경우 에러메세지가 출력되는 것을 확인할 수 있다.

소감

언어를 배울 때 가장 먼저 하는 것 중 하나가 피라미드에 별 찍기 였어서 그때 기억을 더듬으며 코드를 작성했다. C언어를 배울 때는 아스키코드값을 주고 출력지정자를 이용해 문자로 출력하면 되는데, C++에서는 어떻게 해야할까 고민하다가 int형 변수를 char형 변수로 받아 출력하니 정상적으로 출력되었다. 가장 어려웠던 부분은 아무래도 A부터 차례대로 출력하다가 중간을 지났을 때는 반대로 출력하는 부분이었다. 이 부분은 간단하게 표현하기 위해 삼항연산자를 사용해보았다.


Reference

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

0개의 댓글