-
[C++] 함수 - C++의 프로그래밍 모듈 (1)Programming/프로그래밍 2020. 8. 6. 00:12
C++ 기초플러스
7장. 연습문제 풀이 1 ~ 5번
함수에 관한 내용이므로 문제풀이를 웬만하면 함수를 구현하여 풀어내도록 한다.
1. 쌍을 이루는 두 수를 반복해서 입력할 것을 사용자에게 요구하는 프로그램을 작성하라.
쌍을 이루는 두 수 중에 적어도 어느 하나가 0으로 입력될 때까지 입력은 계속된다.
프로그램은 각 쌍에 대하여 두 수의 조화평균을 계산하는 함수를 사용한다.
그 함수는 계산 결과를 main()에 리턴해야 하고, main()은 그 결과를 보고해야 한다.
두 수의 조화평균은 역수들의 평균을 구한 다음, 다시 그것의 역수를 취하면 된다.
조화 평균은 다음과 같은 공식으로 구할 수 있다.
조화 평균 = 2.0 * x * y / ( x + y )코드
#include <iostream> double harmonic_mean(int x, int y); int main() { int num1, num2; double result; while(true) { std::cout << "두 수를 입력하세요." << std::endl; std::cin >> num1 >> num2; if(num1 == 0 || num2 == 0) { std::cout << "두 수 중 하나가 0을 입력하였으므로 프로그램을 종료합니다." << std::endl; break; } result = harmonic_mean(num1, num2); std::cout << result << std::endl; } return 0; } double harmonic_mean(int x, int y) { double harmonicMean; harmonicMean = 2.0 * x * y / ( x + y); return harmonicMean; }
2. 골프 스코어를 최대 10개까지 입력할 것을 사용자에게 요구하라.
배열에 저장하는 프로그램을 작성하라. 10개의 스코어를 입력하기 전이라도 사용자가 입력을 끝낼 수 있어야 한다.
프로그램은 모든 스코어를 한 줄에 출력하고, 평균 스코어를 보고해야 한다.
입력, 출력, 평균 스코어 계산을 위해 세 가지 서로 다른 배열 처리 함수를 사용하라.
코드
#include <iostream> #define maxLength 10 int scoreInput(double score[], int Length); void scoreOutput(double score[], int Length, double avg); double scoreAvg(double score[], int Length); int main() { double score[10]; int num; double avg; std::cout << "-1 입력 시, 점수 입력을 중단합니다." << std::endl; num = scoreInput(score, maxLength); avg = scoreAvg(score, num); scoreOutput(score, maxLength, avg); return 0; } int scoreInput(double score[], int Length) { int i; for(i = 0; i < Length; i++) { std::cin >> score[i]; if(score[i] == -1) break; } return i; } void scoreOutput(double score[], int Length, double avg) { std::cout << "입력된 점수는 "; for(int i = 0; score[i] != -1 && i < Length; i++) std::cout << score[i] << " "; std::cout << std::endl; std::cout << "평균 점수는 " << avg << "입니다." << std::endl; } double scoreAvg(double score[], int Length) { double avg; double sum = 0; for(int i = 0; score[i] != -1 && i < Length; i++) { sum += score[i]; } avg = sum / Length; return avg; }
3. 다음과 같은 구조체 선언이 있다.
struct box { char maker[40]; float height; float length; float volume; };
a. box 구조체를 값으로 전달받아, 각 멤버의 값을 출력하는 함수를 작성하라.
b. box 구조체의 주소를 전달받아, volume 멤버를 다른 세 가지 멤버의 곱으로 설정하는 함수를 작성하라.
c. 앞의 두 함수를 사용하는 간단한 프로그램을 작성하라.
코드
#include <iostream> struct box { char maker[40]; float height; float width; float length; float volume; }; void BoxOutput(box); void BoxVolume(box *); int main() { box WhosBox; WhosBox = {"GEOL", 20, 30, 40 }; BoxVolume(&WhosBox); BoxOutput(WhosBox); return 0; } void BoxOutput(box Box) { std::cout << Box.maker << std::endl; std::cout << Box.height << std::endl; std::cout << Box.width << std::endl; std::cout << Box.length << std::endl; std::cout << Box.volume << std::endl; } void BoxVolume(box *Box) { double volume = Box->height * Box->width * Box->length; Box->volume = volume; }
4. 시에서 운영하는 대부분의 로또 복권은 Listing 7.4에서 설명한 간단한 복권 시스템을 변형한 것이다.
이러한 변형 복권 시스템에서는, 사용자가 수의 범위를 정하고, 그 집합에서 몇 개의 수를 뽑을 수 있다.
예를 들면, 1~47 범위를 정하고 5개의 수를 뽑을 수 있다.
또한 1~27 과 같은 두 번째 범위를 정하고 ( 메가 수 또는 파워 붐이라고 부르는 ) 하나의 수를 뽑을 수 있다.
그랑프리를 타려면 뽑아 낸 모든 수가 들어맞아야 한다.
승률은 범위에 속하는 모든 수를 바르게 뽑을 확률과, 메가 수를 바르게 뽑을 확률을 곱한 것이다.
즉, 47개의 수에서 5개의 수를 바르게 뽑을 확률과, 27개의 수에서 1개의 수를 바르게 뽑을 확률을 곱한 것이다.
이러한 종류의 변형 복권 시스템의 승률을 계산할 수 있도록 Listing 7.4를 수정하라.
Listing 7.4
//lotto.cpp - 승률 구하기 #include <iostream> long double probability(unsigned numbers, unsigned picks); int main() { using namespace std; double total, choices; cout << "전체 수의 개수와 뽑을 수의 개수를 입력하세요.:" << endl; while( cin >> total >> choices && choices <= total ) { cout << "당신이 이길 확률은 "; cout << probability(total, choices); cout << "번 중에서 한 번입니다." << endl; cout << "다시 두 수를 입력하십시오. (끝내려면 q를 입력) : "; } cout << "프로그램을 종료합니다." << endl; return 0; } long double probability(unsigned numbers, unsigned picks) { long double result = 1.0; long double n; unsigned p; for(n = numbers, p = picks; p > 0; n--, p--) result = result * n / p; return result; }
최종 코드 Listing 7.4 수정
#include <iostream> using namespace std; long double probability(unsigned numbers, unsigned picks); int main() { double total, choices; long double first, twice = 0.0; cout << "1 번째로 범위의 수와 뽑을 수의 개수를 입력하세요.:" << endl; if( cin >> total >> choices && choices <= total ) { first = probability(total, choices); cout << "2 번째로 범위의 수와 뽑을 수의 개수를 입력하세요.:" << endl; if ((cin >> total >> choices) && choices <= total) { twice = probability(total, choices); cout << "승률은 " << first * twice << endl; } } cout << "프로그램을 종료합니다." << endl; return 0; } long double probability(unsigned numbers, unsigned picks) { long double result = 1.0; long double n; unsigned p; for(n = numbers, p = picks; p > 0; n--, p--) result = result * n / p; return result; }
5. 하나의 정수를 매개변수로 취하고, 그 매개변수의 계승(팩토리얼)을 리턴하는 재귀 함수를 정의하라.
3의 계승은 3!라 쓰고 3*2!과 같다. 0!은 1로 정의한다.
일반적으로 n이 0보다 클 때, n! = n * (n-1)!이다.
사용자가 다양한 값들을 입력하면 그 값들의 계승을 계산하여 보고하는 프로그램을 루프를 사용하여 작성하고, 그 함수를 테스트하라.
코드
#include <iostream> int f(int); int main() { int num, result; std::cin >> num; result = f(num); std::cout << result << std::endl; return 0; } int f(int n) { if ( n == 0 ) return 1; std::cout << "f" << n << "입니다." << std::endl; return n * f(n-1); }
반응형'Programming > 프로그래밍' 카테고리의 다른 글
[PHP] Composer classmap 사용 (0) 2020.09.05 [C++] 객체와 클래스 연습문제 (2) (0) 2020.08.16 [C++] 객체와 클래스 연습문제 (1) (0) 2020.08.14 [C++] 함수 - C++ 의 프로그래밍 모듈 (2) (0) 2020.08.07 [PHP] APM 설치 (0) 2019.01.07