-
JUNGOL 기초다지기 12 함수2보관함 2019. 12. 11. 21:19
프로그래밍에서 가장 기초적인 내용을 다루는 기초 다지기입니다.
이번 포스팅은 기초 다지기 중 열두 번째인 함수2 문제를 풀어보도록 하겠습니다.
기초 내용인 만큼 다른 설명없이 문제와 코드만 간단하게 작성하도록 하겠습니다.
579 : 함수2 - 자가진단1
#include <iostream> using namespace std; void PrintDesc(int arr[], int n); void Swap(int& a, int& b); int main(void) { int* arr = nullptr; int n; cin >> n; arr = new int[n]; for (int i = 0; i < n; ++i) { cin >> arr[i]; } PrintDesc(arr, n); delete[] arr; } void PrintDesc(int arr[], int n) { for (int i = 0; i < n; ++i) { int max = i; for (int j = i + 1; j < n; ++j) { if (arr[max] < arr[j]) max = j; } Swap(arr[i], arr[max]); cout << arr[i] << ' '; } cout << endl; } void Swap(int& a, int& b) { int temp = a; a = b; b = temp; }
580 : 함수2 - 자가진단2
#include <iostream> using namespace std; bool IsValidDate(int m, int d); int main(void) { int m, d; cin >> m >> d; if (IsValidDate(m, d)) cout << "OK!" << endl; else cout << "BAD!" << endl; } bool IsValidDate(int m, int d) { static int arr[13]{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (m > 12) return false; if (m < 1) return false; if (d > arr[m]) return false; if (d < 1) return false; return true; }
581 : 함수2 - 자가진단3
이번 문제는 특정 자료형으로 함수를 만들어야 하는데 연습삼아 템플릿을 사용해 봤습니다.
#include <iostream> using namespace std; template <typename T> void PrintBig(T a, T b); template <typename T> void PrintSmall(T a, T b); template <typename T> T GetAbsolute(T num); int main(void) { int var1, var2; cin >> var1 >> var2; cout.setf(ios::fixed); cout.precision(2); PrintBig(var1, var2); float var3, var4; cin >> var3 >> var4; PrintSmall(var3, var4); } template <typename T> void PrintBig(T a, T b) { T big = (GetAbsolute(a) > GetAbsolute(b)) ? a : b; cout << big << endl; } template <typename T> void PrintSmall(T a, T b) { T small = (GetAbsolute(a) < GetAbsolute(b)) ? a : b; cout << small << endl; } template <typename T> T GetAbsolute(T num) { if (num > 0) return num; else return -num; }
582 : 함수2 - 자가진단4
이번에는 루트값을 구해야하기 때문에 cmath를 인클루드하여 사용하였습니다.
#include <iostream> #include <cmath> using namespace std; void PrintRadius(float size); int main(void) { float var; cin >> var; cout.setf(ios::fixed); cout.precision(2); PrintRadius(var); } void PrintRadius(float size) { float radius = sqrt(size / 3.14); cout << radius << endl; }
583 : 함수2 - 자가진단5
#include <iostream> #include <cmath> using namespace std; void PrintSpecificValue(float a, float b, float c); float GetBig(float a, float b); float GetSmall(float a, float b); float GetMid(float a, float b, float c); int main(void) { float var1, var2, var3; cin >> var1 >> var2 >> var3; PrintSpecificValue(var1, var2, var3); } void PrintSpecificValue(float a, float b, float c) { int big = ceil(GetBig(GetBig(a, b), c)); int small = floor(GetSmall(GetSmall(a, b), c)); int rest = floor(GetMid(a, b, c) + 0.5f); cout << big << ' ' << small << ' ' << rest << endl; } float GetBig(float a, float b) { if (a > b) return a; else return b; } float GetSmall(float a, float b) { if (a < b) return a; else return b; } float GetMid(float a, float b, float c) { float big = GetBig(GetBig(a, b), c); float small = GetSmall(GetSmall(a, b), c); if (a != big && a != small) return a; if (b != big && b != small) return b; if (c != big && c != small) return c; }
584 : 함수2 - 자가진단6
#include <iostream> using namespace std; void PrintAll123(); int main(void) { PrintAll123(); } void PrintAll123() { for (int i = 1; i <= 3; ++i) { for (int j = 1; j <= 3; ++j) { cout << i << " + " << j << " = " << i + j << endl; } } }
585 : 함수2 - 자가진단7
#include <iostream> using namespace std; void PrintBubbleSort(int arr[]); void Swap(int& a, int& b); void PrintArr(int arr[]); int main(void) { int arr[10]; for (int i = 0; i < 10; ++i) { cin >> arr[i]; } PrintBubbleSort(arr); } void PrintBubbleSort(int arr[]) { for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9 - i; ++j) { if (arr[j] < arr[j + 1]) Swap(arr[j], arr[j + 1]); } PrintArr(arr); } } void Swap(int& a, int& b) { int temp = a; a = b; b = temp; } void PrintArr(int arr[]) { for (int i = 0; i < 10; ++i) { cout << arr[i] << ' '; } cout << endl; }
586 : 함수2 - 자가진단8
오랜만에 매크로 함수가 나왔습니다. 여기에서 함정이 발생하는데 pow2(var1 - var2)로 작성하면 var1 - var2 * var1 - var2가 되어 예상과는 다른 답이 나옵니다.
#include <iostream> #define pow2(a) a * a #define pow3(a) a * a * a using namespace std; int main(void) { int var1, var2; cin >> var1 >> var2; cout << "(" << var1 << " - " << var2 << ") ^ 2 = " << pow2((var1 - var2)) << endl; cout << "(" << var1 << " + " << var2 << ") ^ 3 = " << pow3((var1 + var2)) << endl; }
175 : 함수2 - 형성평가1
#include <iostream> using namespace std; void PrintDesc(int arr[], int n); int main(void) { int n; cin >> n; int* arr = new int[n]; for (int i = 0; i < n; ++i) { cin >> arr[i]; } PrintDesc(arr, n); delete[] arr; } void PrintDesc(int arr[], int n) { for (int i = 0; i < n; ++i) { int max = i; for (int j = i; j < n; ++j) { if (arr[max] < arr[j]) max = j; } cout << arr[max] << ' '; int temp = arr[max]; arr[max] = arr[i]; arr[i] = temp; } cout << endl; }
176 : 함수2 - 형성평가2
이 문제는 단순히 생각만 가지고 풀려고하면 헷갈리는 부분이 있습니다.
이런 경우에는 중간 값을 출력하거나 디버그 기능을 사용해서 값을 확인하면서 풀면 쉽게 해결이 가능합니다.
#include <iostream> #include <cmath> using namespace std; void PrintIntCount(float var1, float var2); int main(void) { float var1, var2; cin >> var1 >> var2; PrintIntCount(var1, var2); } void PrintIntCount(float var1, float var2) { int beg = ceil(sqrt((var1 < var2) ? var1 : var2)); int end = floor(sqrt((var1 > var2) ? var1 : var2)); int count = 0; for (int i = beg; i <= end; ++i) count++; cout << count << endl; }
177 : 함수2 - 형성평가3
#include <iostream> using namespace std; void PrintAbsSum(int arr[]); int main(void) { int arr[5]; for (int i = 0; i < 5; ++i) cin >> arr[i]; PrintAbsSum(arr); } void PrintAbsSum(int arr[]) { int sum = 0; for (int i = 0; i < 5; ++i) { sum += arr[i] > 0 ? arr[i] : -arr[i]; } cout << sum << endl; }
178 : 함수2 - 형성평가4
#include <iostream> using namespace std; int Pow2(int n); int main(void) { int n; cin >> n; cout << Pow2(n) << endl; } int Pow2(int n) { int result = 1; for (int i = 0; i < n; ++i) result *= 2; return result; }
179 : 함수2 - 형성평가5
#include <iostream> using namespace std; void Func(float a, float b, float c); int main(void) { float a, b, c; cin >> a >> b >> c; Func(a, b, c); } void Func(float a, float b, float c) { float sumf = a + b + c; float avgf = sumf / 3; int avg = static_cast<int>(avgf + 0.5f); cout << avg << endl; sumf = static_cast<int>(a + 0.5f) + static_cast<int>(b + 0.5f) + static_cast<int>(c + 0.5f); avgf = sumf / 3; avg = static_cast<int>(avgf + 0.5f); cout << avg << endl; }
180 : 함수2 - 형성평가6
#include <iostream> #define COUNT 7 using namespace std; void Swap(int& a, int& b); int main(void) { int arr[COUNT]; for (int i = 0; i < COUNT; ++i) cin >> arr[i]; for (int i = 0; i < 3; ++i) { for (int j = 0; j < COUNT - 1 - i; ++j) { if (arr[j + 1] < arr[j]) Swap(arr[j + 1], arr[j]); } } for (int i = 0; i < COUNT; ++i) cout << arr[i] << ' '; cout << endl; } void Swap(int& a, int& b) { int temp = a; a = b; b = temp; }
181 : 함수2 - 형성평가7
이 문제는 C++ 코드로 처리할 수 없습니다.
float GetCircleSize(float r) { return PI * r * r; }
이렇게 함수를 작성하면 결과는 다음과 같이 버림 처리를 해야하는 것으로 나옵니다.
그래서 버림 처리를 하면 결과에 반올림을 해야 하는 것으로 나옵니다.
결과적으로 C언어로 처리하면 해결은 가능합니다만 영 결과가 찜찜하네요.
#include <iostream> using namespace std; #define PI 3.141592 void func(double radius) { printf("area = %.3f\n", PI * radius * radius); } int main(void) { double radius; cout << "radius : "; cin >> radius; func(radius); return 0; }
위 문제를 문의한 결과 정밀도 문제인 것 같네요. double을 사용하면 해결이 가능합니다.
#include <iostream> #define PI 3.141592 using namespace std; double GetCircleSize(double r); int main(void) { double radius; cout << "radius : "; cin >> radius; cout.setf(ios::fixed); cout.precision(3); cout << "area = " << GetCircleSize(radius) << endl; } double GetCircleSize(double r) { return PI * r * r; }
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&sca=10c0