차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
activity:public:2021:cpp:210527 [2021/05/30 00:50:07] – [1.6. 팩토리얼 계산하기] Algern0nactivity:public:2021:cpp:210527 [2021/05/30 00:52:30] (현재) Algern0n
줄 1: 줄 1:
 +======C++ 스터디 #7: 계산기======
 +
 +| 시간 | 2021년 5월 27일 목요일 20:30 ~  |
 +| 장소 | Google Meet |
 +| 참가자 |  |
 +
 +{{youtube>gjWajegD_fg?medium}}
 +
 +=====1. 계산기 예제=====
 +====1.1. 사칙연산 계산기====
 +두 수의 사칙연산을 수행하는 프로그램 작성하기
 +
 +\\
 +
 +<fs large>**출력**</fs>
 +
 +  * 첫 줄에 두 수와 연산자 기호를 입력한다.
 +  * 입력한대로 사칙연산을 수행하여 계산 결과를 출력한다.
 +  * 0으로 나누려고 하면 경고 문구를 출력한다.
 +  * 사칙연산 기호 외의 문자를 입력하면 경고 문구를 출력하며 프로그램을 종료한다.
 +  * 그전까지는 계속 사칙연산을 수행한다.
 +
 +\\
 +
 +<fs large>**출력 예시**</fs>
 +
 +<sxh; gutter: false>
 +1 + 3.5
 += 4.5
 +20 * 2.1
 += 42
 +2 / 0
 +0으로 나눌 수 없습니다.
 +1.5 % 6.7
 +정의되지 않은 연산입니다.
 +</sxh>
 +
 +\\
 +
 +<fs large>**코드**</fs>
 +
 +<sxh cpp>
 +#include <iostream>
 +using namespace std;
 +
 +int main() {
 +   double a, b;
 +   char c;
 +   while (true) {
 +      cin >> a >> c >> b;
 +
 +      if (c == '+') cout << "= " << a + b << endl;
 +      else if (c == '-') cout << "= " << a - b << endl;
 +      else if (c == '*') cout << "= " << a * b << endl;
 +      else if (c == '/') {
 +         if (b == 0) cout << "0으로 나눌 수 없습니다." << endl;
 +         else cout << "= " << a / b << endl;
 +      }
 +      else {
 +         cout << "정의되지 않은 연산입니다.";
 +         return 0;
 +      }
 +</sxh>
 +      
 +\\
 +
 +====1.2. 거듭제곱 계산기====
 +지수 연산을 수행하는 함수 작성하기
 +
 +\\
 +
 +<fs large>**출력**</fs>
 +
 +  * 입력한대로 지수 연산을 수행하여 계산 결과를 출력한다.
 +  * 지수는 정수만 입력된다.
 +  * 앞에서 한 예제에 추가하기
 +
 +\\
 +
 +<fs large>**출력 예시**</fs>
 +
 +<sxh; gutter: false>
 +3 ^ 4
 += 81
 +2 ^ -3
 += 0.125
 +5.2 ^ 0
 += 1
 +</sxh> 
 +
 +\\
 +
 +<fs large>**코드**</fs>
 +
 +<sxh cpp>
 +#include <iostream>
 +using namespace std;
 +
 +double power(double a, int n) {
 +   if (n == 0) return 1;
 +   else if (n < 0) return 1 / power(a, -n);
 +   else return a * power(a, n - 1);
 +}
 + 
 +int main() {
 +   double a, b;
 +   char c;
 +
 +   while (true) {
 +      cin >> a >> c >> b;
 +      if (c == '^') cout << "= " << power(a, (int)b) << endl;
 +      else return 0;
 +   }
 +}
 +</sxh>
 +
 +\\
 +
 +====1.3. 입력한 순서대로 계산하기====
 +입력한 순서대로 계산하는 프로그램 작성하기
 +
 +\\
 +
 +<fs large>**출력**</fs>
 +
 +  * 연산자의 우선 순위는 생각하지 않고 입력 순서대로 사칙연산을 수행한다. '='이 입력되면 그때까지의 결과를 출력하고 프로그램을 종료한다.
 +  * 0으로 나누려고 하면 경고 문구를 출력한다.
 +  * 사칙연산 기호 외의 문자를 입력하면 경고 문구를 출력한다.
 +
 +
 +\\
 +
 +<fs large>**출력 예시**</fs>
 +
 +<sxh; gutter: false>
 +1.5 =
 +1.5
 +</sxh>
 +<sxh; gutter: false>
 +3 / 2 – 1 * 5 =
 +2.5
 +</sxh>
 +<sxh; gutter: false>
 +5 / 0 + 3 =
 +0으로 나눌 수 없습니다.
 +</sxh>
 +<sxh; gutter: false>
 +6 % 4 =
 +정의되지 않은 연산입니다.
 +</sxh>
 +
 +
 +\\
 +
 +<fs large>**코드**</fs>
 +
 +<sxh cpp>
 +#include <iostream>
 +using namespace std;
 +
 +int main() {
 +   double num = 0, ans = 0;
 +   char op;
 +   bool DIVIDED_BY_0 = false;
 +
 +   cin >> num;
 +   ans = num;
 +
 +   while (true)
 +   {
 +      cin >> op;
 +      if (op == '=') {
 +         if (DIVIDED_BY_0 == true) {
 +            cout << "0으로 나눌 수 없습니다." << endl;
 +            DIVIDED_BY_0 = false;
 +         }
 +         else cout << ans;
 +         return 0;
 +      }
 +      cin >> num;
 +      if (op == '+')
 +         ans += num;
 +      else if (op == '-')
 +         ans -= num;
 +      else if (op == '*')
 +         ans *= num;
 +      else if (op == '/') {
 +         if (num == 0) DIVIDED_BY_0 = true;
 +         else ans /= num;
 +      }
 +      else {
 +         cout << "정의되지 않은 연산입니다.";
 +         return 0;
 +      }
 +   }
 +}
 +</sxh>
 +
 +\\
 +
 +====1.4. 입력한 순서대로 계산하기 += 거듭제곱====
 +입력한 순서대로 계산하는 프로그램 작성하기
 +
 +\\
 +
 +<fs large>**출력**</fs>
 +
 +  * 연산자의 우선 순위는 생각하지 않고 입력 순서대로 사칙연산과 거듭제곱 계산을 수행한다. '='이 입력되면 그때까지의 결과를 출력하고 프로그램을 종료한다.
 +  * 0으로 나누려고 하면 경고 문구를 출력한다.
 +  * 연산 기호 +, -, *, /, ^ 외의 문자를 입력하면 경고 문구를 출력한다.
 +
 +\\
 +
 +<fs large>**출력 예시**</fs>
 +
 +<sxh; gutter: false>
 +1 + 2 ^ 3 =
 +27
 +</sxh>
 +
 +<sxh; gutter: false>
 +3 / 2 – 1 * 5 =
 +2.5
 +</sxh>
 +
 +<sxh; gutter: false>
 +5 / 0 + 3 =
 +0으로 나눌 수 없습니다.
 +</sxh>
 +
 +<sxh; gutter: false>
 +6 % 4 =
 +정의되지 않은 연산입니다.
 +</sxh> 
 +
 +\\
 +
 +<fs large>**코드**</fs>
 +
 +<sxh cpp>
 +#include <iostream>
 +using namespace std;
 +
 +double power(double a, int n) {
 +   if (n == 0) return 1;
 +   else if (n < 0) return 1 / power(a, -n);
 +   else return a * power(a, n - 1);
 +}
 +
 +int main() {
 +   double num = 0, ans = 0;
 +   char op;
 +   bool DIVIDED_BY_0 = false;
 +
 +   cin >> num;
 +   ans = num;
 +
 +   while (true)
 +   {
 +      cin >> op;
 +      if (op == '=') {
 +         if (DIVIDED_BY_0 == true) {
 +            cout << "0으로 나눌 수 없습니다." << endl;
 +            DIVIDED_BY_0 = false;
 +         }
 +         else cout << ans;
 +         return 0;
 +      }
 +      cin >> num;
 +      if (op == '+')
 +         ans += num;
 +      else if (op == '-')
 +         ans -= num;
 +      else if (op == '*')
 +         ans *= num;
 +      else if (op == '/') {
 +         if (num == 0) DIVIDED_BY_0 = true;
 +         else ans /= num;
 +      }
 +      else if (op == '^')
 +         ans = power(ans, (int)num);
 +      else {
 +         cout << "정의되지 않은 연산입니다.";
 +         return 0;
 +      }
 +   }
 +}
 +</sxh>
 +
 +\\
 +
 +====1.5. 입력한 순서대로 계산하기 += 무한루프====
 +입력한 순서대로 계산하는 프로그램 작성하기
 +
 +\\
 +
 +<fs large>**출력**</fs>
 +  * 연산자의 우선 순위는 생각하지 않고 입력 순서대로 사칙연산과 거듭제곱 계산을 수행한다. '='이 입력되면 그때까지의 결과를 출력한다.
 +  * 0으로 나누려고 하면 경고 문구를 출력한다.
 +  * 연산 기호 +, -, *, /, ^ 외의 문자를 입력하면 경고 문구를 출력하며 프로그램을 종료한다.
 +  * 그전까지는 계속 사칙연산을 수행한다.
 +
 +\\
 +
 +<fs large>**출력 예시**</fs>
 +
 +<sxh; gutter: false>
 +17 =
 +17
 +1 + 2 ^ 3 =
 +27
 +3 / 2 – 1 * 5 =
 +2.5
 +5 / 0 + 3 =
 +0으로 나눌 수 없습니다.
 +6 % 4 =
 +정의되지 않은 연산입니다.
 +</sxh>
 +
 +\\
 +
 +<fs large>**코드**</fs>
 +
 +<sxh cpp>
 +#include <iostream>
 +using namespace std;
 +
 +double power(double a, int n) {
 +   if (n == 0) return 1;
 +   else if (n < 0) return 1 / power(a, -n);
 +   else return a * power(a, n - 1);
 +}
 +
 +int main() {
 +   double num = 0, ans = 0;
 +   char op;
 +   bool DIVIDED_BY_0 = false;
 +
 +   cin >> num;
 +   ans = num;
 +
 +   while (true)
 +   {
 +      cin >> op;
 +      if (op == '=') {
 +         if (DIVIDED_BY_0 == true) {
 +            cout << "0으로 나눌 수 없습니다." << endl;
 +            DIVIDED_BY_0 = false;
 +         }
 +         else cout << ans << endl;
 +         
 +         cin >> num;
 +         ans = num;
 +         continue;
 +      }
 +      cin >> num;
 +      if (op == '+')
 +         ans += num;
 +      else if (op == '-')
 +         ans -= num;
 +      else if (op == '*')
 +         ans *= num;
 +      else if (op == '/') {
 +         if (num == 0) DIVIDED_BY_0 = true;
 +         else ans /= num;
 +      }
 +      else if (op == '^')
 +         ans = power(ans, (int)num);
 +      else {
 +         cout << "정의되지 않은 연산입니다.";
 +         return 0;
 +      }
 +   }
 +}
 +</sxh>
 +     
 +\\
 +
 +====1.6. 팩토리얼 계산하기====
 +팩토리얼을 계산하는 함수를 작성하기
 +
 +\\
 +
 +<fs large>**출력**</fs>
 +  * 입력한대로 팩토리얼 연산을 수행하여 출력한다.
 +  * 음이 아닌 정수만 입력된다.
 +
 +
 +\\
 +
 +<fs large>**출력 예시**</fs>
 +<sxh; gutter: false>
 +5 ! =
 +120
 +</sxh>
 +
 +\\
 +
 +<fs large>**코드**</fs>
 +
 +<sxh cpp>
 +#include <iostream>
 +using namespace std;
 +
 +int factorial(int n) {
 +   if (n == 0) return 1;
 +   else return n * factorial(n - 1);
 +}
 + 
 +int main() {
 +   int num;
 +   char op;
 +
 +   while (true) {
 +      cin >> num >> op;
 +      if (op == '!') cout << "= " << factorial(num) << endl;
 +      else return 0;
 +   }
 +}
 +</sxh>
 +      
 +\\
 +
 +====1.7. 입력한 순서대로 계산하기 += 팩토리얼====
 +입력한 순서대로 계산하는 프로그램 작성하기
 +
 +\\
 +
 +<fs large>**출력**</fs>
 +  * 연산자의 우선 순위는 생각하지 않고 입력 순서대로 사칙연산과 거듭제곱 계산, 팩토리얼 계산을 수행한다. '='이 입력되면 그때까지의 결과를 출력한다.
 +  * 0으로 나누려고 하면 경고 문구를 출력한다.
 +  * 연산 기호 +, -, *, /, ^, ! 외의 문자를 입력하면 경고 문구를 출력하며 프로그램을 종료한다.
 +  * 그전까지는 계속 연산을 수행한다.
 +
 +\\
 +
 +<fs large>**출력 예시**</fs>
 +<sxh; gutter: false>
 +1.5 =
 +1.5
 +1 + 2 ^ 3 =
 +27
 +4 / 2 * 3 ! =
 +720
 +5 / 0 + 3 =
 +0으로 나눌 수 없습니다.
 +6 % 4 =
 +정의되지 않은 연산입니다.
 +</sxh>
 +
 +\\
 +
 +<fs large>**코드**</fs>
 +
 +<sxh cpp>
 +#include <iostream>
 +using namespace std;
 +
 +double power(double a, int n) {
 +   if (n == 0) return 1;
 +   else if (n < 0) return 1 / power(a, -n);
 +   else return a * power(a, n - 1);
 +}
 +
 +int factorial(int n) {
 +   if (n == 0) return 1;
 +   else return n * factorial(n - 1);
 +}
 +
 +int main() {
 +   double num, ans = 0;
 +   char op;
 +   bool DIVIDED_BY_0 = false;
 +
 +   cin >> num;
 +   ans = num;
 +
 +   while (true)
 +   {
 +      cin >> op;
 +      
 +      if (op == '=') {
 +         if (DIVIDED_BY_0 == true) {
 +            cout << "0으로 나눌 수 없습니다." << endl;
 +            DIVIDED_BY_0 = false;
 +         }
 +         else cout << ans << endl;
 +
 +         cin >> num;
 +         ans = num;
 +         continue;
 +      }
 +
 +      if (op == '!') {
 +         ans = factorial((int)ans);
 +         continue;
 +      }
 +
 +      cin >> num;
 +      if (op == '+')
 +         ans += num;
 +      else if (op == '-')
 +         ans -= num;
 +      else if (op == '*')
 +         ans *= num;
 +      else if (op == '/') {
 +         if (num == 0) DIVIDED_BY_0 = true;
 +         else ans /= num;
 +      }
 +      else if (op == '^')
 +         ans = power(ans, (int)num);
 +      else {
 +         cout << "정의되지 않은 연산입니다.";
 +         return 0;
 +      }
 +   }
 +}
 +</sxh>
 +
 +
 +