프로그래밍기초 제5주 실습과제

       

함수

       


아래 모든 문제에 적용되는 지시 사항

  • 클래스 선언문 바로 위에 그 클래스에 대한 설명을 주석으로 넣으시오.
  • main 함수 외의 함수에도 주석을 넣으시오.
  • 주석의 첫 부분은 /** 로 시작하고 끝 부분은 */로 마칩니다.
  • 주석을 적어 넣지 않거나 들여쓰기를 하지 않으면 감점합니다.

       

P1

아래 그림의 주석에 있는 설명에 맞는 클래스를 구현하시오. 클래스 이름은 VendingMachine으로 지으시오. 함수를 여러 개 만들지 말고 main 함수 내부에서 모든 기능을 구현하시오.

img

실행화면은 아래와 같습니다.

img

사용자는 주어진 번호 중 하나를 입력한다고 가정합니다.

(주어진 번호가 아닌 엉뚱한 번호를 입력하는 경우에 대해서도 적절한 안내문을 출력하고 계속하도록 하면 더 좋습니다.)

사용자가 종료를 선택할 때까지 프로그램이 반복적으로 실행되어야 합니다. 사용자가 종료를 선택할 때까지 반복적으로 어떤 작업을 하도록 하는 프로그램의 뼈대는 지난 주 강의자료 끝부분에 있습니다.

       

P2 (함수에 의한 추상화, 작은 덩어리로 나누어 구현하기)

위 p1 문제의 기능을 똑같이 구현하되 여러 개의 함수를 정의하고 main에서는 그 함수들을 이용(호출)하는 방식으로 구현하시오. 클래스 이름은 VendingMachine2로 지으시오. 실행화면은 p1과 같습니다. 아래와 같이 구현하면 main 함수가 간결해지고 main 함수를 읽는 사람이 main 함수의 기능을 빨리 이해할 수 있습니다.

img

위 그림에서 빨간색 네모의 + 모양을 클릭하면 파란색 네모 부분이 펼쳐져서 각 함수의 코드가 보여지면서 빨간색 네모의 + 표시가 - 표시로 바뀝니다. - 표시를 클릭하면 반대로 작동합니다.

printMenu, printIceCreamMenu, printCoffeeMenu, printDrinkMenu 함수는 그 이름에 충실하게 작동하는 것이 좋습니다. 단순히 메뉴와 프롬프트를 출력하는 일만 하는 것이 좋습니다. 사용자 입력을 읽어 들이는 일은 하지 않습니다.

(1) 이름과 다르게 동작하게 만들면 코드를 읽을 때 혼란스럽습니다.

(2) 입력에 따라 작동이 달라져야 하므로 입력 받는 일과 입력에 따라 작동하는 일을 모두 main에 모아 놓은 것이 편리합니다.

       

P3 (파라미터를 갖는 함수, 코드 재활용)

첫 주 실습과제에 섭씨 온도를 화씨 온도로 바꾸는 프로그램을 작성하는 문제가 있었습니다. 아래에 그 프로그램과 출력이 있습니다.

img

img

섭씨 온도를 화씨 온도로 바꿔주는 프로그램을 작성하되 섭씨 -40도에서 섭씨 100도까지 1도 간격으로 온도를 변환해 출력하는 프로그램을 작성하시오. 클래스 이름은 CelciusToFarenheit로 지으시오. 단, 주어진 하나의 섭씨 온도를 화씨 온도로 변환하여 그 결과를 화면에 출력하는 함수를 convertAndPrint라는 이름으로 작성하고, main 함수는 converAndPrint 함수를 반복하여 이용(호출)함으로써 작업을 수행하도록 하시오.

실행화면은 아래와 같습니다.

img

중간 생략

img

참고:

섭씨 온도를 화씨 온도로 바꾸어 출력하는 함수를 (호출하여) 사용할 때 어떻게 사용하는 게 자연스러운가요? 가령 섭씨 온도 5.5도를 화씨 온도로 바꾸어 출력하게 하려면 아래와 같이 하면 될 것입니다.

convertAndPrint(5.5); // 섭씨 5.5도를 화씨 온도로 바꾸어 그 값을 출력하라.

위 예에서 보듯이 이 함수를 호출할 때는 double 타입 값 하나를 인자(argument)로 주어야 하므로 convertAndPrint 함수는 double 타입 파라미터 한 개를 가져야 합니다. 그러니까, convertAndPrint 함수는 아래와 같이 선언하면 됩니다.

img

파라미터 이름은 임의로 지으면 되지만 그 의미를 알 수 있게 짓는 것이 좋습니다. (일반적으로는 온전한 단어로 파라미터 이름을 지어야 의미가 명확하지만 이 문제의 경우 화씨 온도, 섭씨 온도를 단순히 f와 c로 불러도 의미가 명확하므로 한 글자로 짓겠습니다.) 그리고 이 함수는 계산 결과를 출력할 뿐 아무 값도 반환하지 않습니다. 그러니까 이 함수는 void 타입 함수입니다.

함수를 선언할 때 함수 바로 위에 그 함수에 대한 설명을 주석으로 적어 넣어야 합니다.

       

P4 (파라미터를 갖고 값을 반환하는 함수, 코드 재활용)

위 3번 문제를 조금 다르게 구현해 봅니다. p3 프로그램을 아래와 같이 변경하시오.

  1. 출력은 p3과 똑같이 나오게 합니다.
  2. 클래스 이름은 CelciusToFarenheit2로 지으시오.
  3. convertAndPrint 함수의 이름을 convert로 바꾸시오.
  4. convert 함수는 섭씨온도를 변환하여 얻은 화씨 온도를, 화면에 출력하는 대신, convert 함수를 호출한 자에게 반환(return)하게 하시오.
  5. main 함수 내의 convertAndPrint 함수를 호출하는 부분도 위 변경에 맞춰 적절히 변경하시오.

(참고)

섭씨 온도를 화씨 온도로 바꾸는 convert 함수는 어떻게 사용(호출)할까요? 가령, 섭씨 온도 5.5도가 화씨 온도로 얼마인지 알아보려면 아래와 같이 하면 될 것입니다.

double farenheit; //화씬 온도를 저장하기 위한 double 타입 변수를 선언한다.
farenheit = convert(5.5);    // 섭씨 5.5도를 화씨 온도로 바꾸어라. 그러면 화씨 온도가 반환되는데 이 **반환되는 값을 ferenheit에 저장하라**.

섭씨 온도를 화씨 온도로 바꾸는 convert 함수는 어떻게 작성할까요? convert 함수는 convertAndPrint 함수와 달리 변환된 값을 출력하는 대신 반환해야 합니다. 반환되는 값도 double 타입입니다. 그러니까 이 함수의 (반환) 타입은 double이며 함수는 반드시 계산된 double 타입 값을 반환하는 return 문장을 포함해야 합니다.

//double 타입 값을 반환하는 함수 구현
double convert(double c){
    double f;
    f = .....; //C로부터 f를 계산한다.

    return f; //f를 반환한다. f는 double 타입 값이어야 한다.
}

       

P5 (파라미터를 갖는 함수, 코드 재활용)

자연수의 합을 구하는 프로그램을 작성하시오. 클래스 이름은 Summations로 지으시오. 주어진 자연수 이하의 자연수들을 모두 더하여 그 결과를 반환하는 함수를 작성한 후, main에서 이 함수를 호출하고, 이 함수로부터 반환되는 값을 출력하는 방식으로 구현하시오.

실행화면은 아래와 같습니다.

img

참고:

주어진 자연수 이하의 자연수들을 모두 더하여 그 결과를 반환하는 함수를 작성해야 합니다. 함수 이름은 가령 sum으로 지으면 될 것입니다. 함수를 정의할 때 바로 위에 함수에 대한 설명을 주석으로 적어 넣어야 합니다.

img

       

P6 (두 개의 파라미터를 갖는 함수, 코드 재활용)

10부터 20까지의 자연수를 더한 값, 20부터 30까지의 자연수를 더한 값, 30부터 40까지의 자연수를 더한 값, 40부터 50까지의 자연수를 더한 값, …, 90부터 100까지의 자연수를 더한 값을 출력하는 프로그램을 작성하시오. 클래스 이름은 Summations2로 지으시오. 한 수에서 다른 수까지의 자연수의 합을 구하여 그 결과를 반환하는 함수를 작성하고, main에서 이 함수를 호출하고 이 함수로부터 반환되는 값을 출력하는 방식으로 구현하시오.

실행화면은 아래와 같습니다.

img

힌트:

한 수에서 다른 수까지의 자연수의 합을 구하는 함수를 작성해야 합니다. 그러니까 이 함수는 두 개의 파라미터를 갖습니다. 함수 이름은 가령 sum으로 지으면 될 것입니다. 함수를 정의할 때 바로 위에 함수에 대한 설명을 주석으로 적어 넣어야 합니다.

img

       

P7 (파라미터를 갖는 함수, 코드 재활용)

키보드로부터 정수 두 개를 입력 받아 두 수 사이에 있는 모든 짝수들의 합을 구하여 화면에 출력하는 일을 반복하는 프로그램을 작성하시오. 같은 수 두 개를 입력하면 프로그램이 끝나게 하시오. 클래스 이름은 EvensSum으로 지으시오. 입력 받은 두 수 각각도 짝수라면 합에 포함되도록 하시오. 사용자는 음수나 0을 입력할 수도 있어야 합니다. 또 사용자는 작은 수를 먼저 입력할 수도, 큰 수를 먼저 입력할 수도 있어야 합니다.

아래 그림과 같은 함수를 완성하고 이 함수를 이용하여 프로그램을 완성하시오.

img

실행화면은 아래와 같습니다.

img

힌트:

getEvensSum 함수는 두 개의 파라미터를 갖는데 첫 파라미터 값이 두 번째 파라미터 값보다 크지 않아야 한다는 전제조건이 붙어 있다. 따라서 이 함수를 호출할 때는 두 개의 값을 인자로 주되 첫 수가 두 번째 수보다 크지 않아야 한다. 이 함수를 구현할 때는 첫 수가 두 번째 수보다 작거나 같다고 가정하고 프로그램을 작성하면 된다.

그런데 사용자는 큰 수를 먼저 입력할 수도 있고 작은 수를 먼저 입력할 수도 있으므로, main 함수 내에서 사용자 입력 두 수를 비교하여 큰 수와 작은 수를 구분해야 한다. getEvensSum 함수를 호출할 때는 작은 수를 첫 번째 인자로, 큰 수를 두 번째 인자로 주어야 한다.

전체적인 프로그램 구조가 복잡하므로 종이에 프로그램의 전체 뼈대를 손으로 작성한 후 코딩을 시작한다. 이 때 자바 문법을 정확히 사용하지 않고 한글이나 영어를 사용하면 된다. 이렇게 작성하는 뼈대를 의사코드(pseudocode)라고 부른다.

의사코드 예:

img

       

P8 (프로그램 추적)

프로그램이 실행되는 과정을 한 단계 한 단계 차례로 따라가 보는 문제입니다. 우선 예를 하나 보이겠습니다.

아래 프로그램 Triangle1이 실행되면 27번 줄과 28번 줄은 여러 번 실행됩니다. 27번 줄이 실행될 때마다, 27번 줄이 실행되기 직전에 프로그램 실행을 잠시 중단시킨다고 생각합시다. 28번 줄이 실행될 때도, 28번 줄이 실행되기 직전에 프로그램 실행을 잠시 중단시킨다고 생각합시다. 그리고 프로그램 실행이 잠시 중단된 순간 변수 i와 j의 값이 각각 얼마일지를 기록합니다. 또, 잠시 중단된 줄을 실행하면 무엇이 출력될지를 예측하여 적습니다.

img

사용자가 삼각형의 크기를 3으로 입력했다면 기록(추적표)은 아래 그림과 같이 됩니다.

img

26번 줄의 for 문장 내부에서 선언된 변수 j는 for 문장 내부에서만 유효합니다. 프로그램이 26번 줄 ~ 27번 줄의 for 문장을 빠져나가면 변수 j가 존재하지 않습니다. 위 표에서 j 값이 x로 표기된 것은 그 당시 j가 존재하지 않는다는 의미입니다.

아래에 문제가 있습니다.

   

아래 프로그램 Triangle2가 실행되면 29번 줄, 31번 줄, 32번 줄이 여러 번 실행됩니다. 29번, 31번, 32번 줄이 실행될 때마다, 그 줄이 실행되기 직전에 프로그램 실행을 잠시 중단시킨다고 생각합시다. 그리고 프로그램이 잠시 중단되는 순간, 변수 i와 j의 값이 각각 얼마인지 시간 순으로 기록합니다. 사용자가 삼각형의 크기를 3으로 입력했다면 어떻게 기록이 될지 위에서 보인 추적표와 같은 형태로 추적표를 작성하시오.

  • 빈칸을 출력할 때는 빈 네모(ㅁ)를 적으시오.
  • 기록표의 아래에는 최종 출력이 어떻게 될지 그림으로 그리시오.
  • 아래 프로그램에서 변수 j가 28번 줄과 30번 줄로 시작하는 두 개의 for 문장 바깥에 선언되어 있음에 유의하시오. 변수 j의 유효범위는 몇 번 줄부터 몇 번 줄까지인지도 추적표에 적으시오.
  • 추적표는 컴퓨터로 그리지 말고 손으로 작성하시오.

img

img

[그림] Triangle2의 변수값 추적 – 일부분.

   

위 [그림]의 표를 완성하여 사진으로 찍거나 스캔하여 과제 제출물에 포함 하시오.

[참고] eclipse에 그림 파일을 붙여 넣은 모습

img

       

P9 (이중 for 문장) (Nested for-loop)

아래 예와 같은 모양의 삼각형을 그리는 프로그램을 작성하시오. 클래스 이름은 Triangle3로 지으시오. 삼각형을 그리는 기능은 별도의 함수로 작성하고, main에서는 화면에 프롬프트를 내보내고 사용자로부터 입력을 받아들인 후, 별도의 함수를 호출하는 방식으로 작성하시오.

img

img

끝.