[C] 계산기 프로그램 (사칙연산, 삼각함수, 거듭제곱, 진법변환)

2021. 11. 20. 22:45C

728x90
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
 
//연산기호 문자상수를 정의함
#define Mul 42
#define Plus 43
#define Minus 45
#define Div 47
 
#define PI 3.1415926535
 
#define Inv 94
 
//계산기 프로그램 종료
void Finish()
{
    char select;
 
    printf("\n계산기 프로그램을 종료하려면 n(N), 계속 하려면 y(Y)를 입력해주세요.\n");
    printf("입력 : ");
    scanf(" %c", &select);
 
    if (select == 'n' || select == 'N')     //사용자가 종료를 원해서 N을 입력했을 때
    {
        printf("\n사칙연산 계산기가 종료되었습니다.\n");
        exit(0);
    }
    else if (select == 'y' || select == 'Y')       // Y를 입력해서 계산기 프로그램을 계속 실행할 때
    {
        printf("\n계산기 프로그램을 계속 실행합니다.\n");
        printf("\n=====================================================================\n");
    }
    else        // Y와 N이 아닌 키를 입력했을 때
    {
        printf("\n보기에 없는 입력을 하셨습니다.\n다시 선택해주세요.\n");
        //계산기 프로그램을 종료할 건지 물어보는 함수 호출
        Finish();
    }
}
 
//사칙연산
void Arithmetic()
{
    int num1, num2, result;
    char operator = 0;
 
    //사칙연산을 수행하기 위한 방법 소개
    printf("\n사칙연산을 수행할 연산식을 입력해주세요.\n(+, -, *, /)\n");
    printf("(입력 예시) 102 + 308 [엔터]\n");
    printf("입력 : ");
    scanf(" %d %c %d", &num1, &operator, &num2);        //연산식 입력
 
    //사칙연산 수행
    if (operator == 43) {
        result = num1 + num2;
        printf("\n%d + %d = %d\n", num1, num2, result);     //덧셈
    }
    else if (operator == 45) {
        result = num1 - num2;
        printf("\n%d - %d = %d\n", num1, num2, result);     //뺄셈
    }
    else if (operator == 42) {
        result = num1 * num2;
        printf("\n%d × %d = %d\n", num1, num2, num1 * num2);    //곱셈
    }
    else if (operator == 47) {
        result = num1 / num2;
        printf("\n%d ÷ %d = %.2f\n", num1, num2, (double)result);       //나눗셈
    }
}
 
//삼각함수를 구하기 위한 함수
double getRadian(int num)
{
    return num * (PI / 180);
}
 
//삼각함수
void Trigonometrical()
{
    int formula;
    double num, result;
    char select;
 
    printf("\n삼각함수 계산을 합니다. 원하는 기능을 선택해주세요.\n");
    printf("1. sin\n2. cos\n3. tan\n");
    printf("\n선택 : ");
    scanf(" %c", &select);
 
    switch (select) {
    case '1':
        //sin 계산을 위한 안내
        printf("\nsin 함수값을 계산합니다.\n계산을 원하는 값을 입력해주세요.\n");
        printf("90을 입력하면 sin(90)이 계산됩니다.\n");
        printf("\n입력 : ");
        scanf(" %d", &formula);
 
        //sin 계산
        num = getRadian(formula);   //계산을 위한 함수 호출
 
        result = sin(num);
        printf("\nsin(%d)는 %f입니다.\n", formula, result);
 
        break;
    case '2':
        //cos 계산을 위한 안내
        printf("\ncos 함수값을 계산합니다.\n계산을 원하는 값을 입력해주세요.\n");
        printf("90을 입력하면 cos(90)이 계산됩니다.\n");
        printf("\n입력 : ");
        scanf(" %d", &formula);
 
        //cos 계산
        num = getRadian(formula);   //계산을 위한 함수 호출
 
        result = cos(num);
        printf("\ncos(%d)는 %f입니다.\n", formula, result);
 
        break;
    case '3':
        //tan 계산을 위한 안내
        printf("\ntan 함수값을 계산합니다.\n계산을 원하는 값을 입력해주세요.\n");
        printf("90을 입력하면 tan(90)이 계산됩니다.\n");
        printf("\n입력 : ");
        scanf(" %d", &formula);
 
        //tan 계산
        num = getRadian(formula);   //계산을 위한 함수 호출
 
        result = tan(num);
        printf("\ntan(%d)는 %f입니다.\n", formula, result);
 
        break;
    }
}
 
//거듭제곱
void Involution()
{
    unsigned long long temp = 0, num1, num2;
    char operator = 0;
 
    //거듭제곱을 수행하기 위한 방법 소개
    printf("\n거듭제곱을 계산할 연산식을 입력해주세요.\n");
    printf("(2의 10제곱의 입력 예시) 2 ^ 10 [엔터]\n\n");
    printf("입력 : ");
    scanf("%lld %c %lld", &num1, &operator, &num2);
 
    temp = num1;
 
    //거듭제곱을 하는 함수
    if (num2 == 0)
        num1 = 1;
 
    if (num2 % 2 == 0)
    {
        //n제곱을 할 수가 짝수일 때
        num1 = pow((num1 * num1), (num2 / 2));
    }
    else
    {
        //n제곱을 할 수가 홀수일 때
        num1 = num1 * pow((num1 * num1), ((num2 - 1) / 2));
    }
 
    printf("%llu의 %llu 제곱은 %llu입니다.\n", temp, num2, num1);
}
 
//2진법으로 변환
void Binary(int num)
{
    int binary[50] = { 0, };
    int i, position = 0;
 
    while (1)
    {
        binary[position] = num % 2;    // 2로 나누었을 때 나머지를 배열에 저장
        num = num / 2;             // 2로 나눈 몫을 저장
 
        position++;    // 자릿수 변경
 
        if (num == 0)    // 몫이 0이 되면 반복을 끝냄
            break;
    }
 
    // 배열의 요소를 역순으로 출력
    for (i = position - 1; i >= 0; i--)
    {
        printf("%d", binary[i]);
    }
}
 
//진법변환
void Numeral()
{
    int formula, select;
 
    //진법변환을 수행하기 위한 방법 소개
    printf("\n진법을 변환할 수를 입력해주세요.\n");
    printf("(입력 예시) 100 [엔터]\n");
    printf("입력 : ");
    scanf(" %d", &formula);
 
    printf("\n몇 진법으로 변환할지 원하는 진법을 선택해주세요.\n");
    printf("1. 2진수\n2. 8진수\n3. 16진수\n");
    printf("입력 : ");
    scanf(" %d", &select);
 
    if (select == 1) {
        printf("\n%d를 2진수로 표현하면 ", formula);
 
        Binary(formula);     //2진법으로 변환하는 함수를 호출
        printf("입니다.\n");
    }
    else if (select == 2) {         //8진수로 변환
        printf("\n%d를 8진수로 표현하면 %o입니다.\n", formula, formula);
    }
    else if (select == 3) {         //16진수로 변환
        printf("\n%d를 16진수로 표현하면 %x입니다.\n", formula, formula);
    }
}
 
int main()
{
    char select;
 
    //계산기 소개
    printf("<MultiFunction Calculator Program >\n다기능 계산을 수행하는 계산기입니다.");
 
    while (1)
    {
        //원하는 계산 종류 선택
        printf("\n원하는 기능을 선택하세요.\n");
        printf("1. 사칙연산\n2. 삼각함수\n3. 거듭제곱\n4. 진법변환\nx. 종료\n\n");
 
        printf("선택 : ");
        scanf(" %c", &select);
 
        switch (select) {
        case '1':
            Arithmetic();    //사칙연산을 하는 함수를 호출
 
            break;
        case '2':
            Trigonometrical();     //삼각함수 계산을 하는 함수를 호출
 
            break;
        case '3':
            Involution();       //거듭제곱을 하는 함수를 호출
 
            break;
        case '4':
            Numeral();       //진법변환을 하는 함수를 호출
 
            break;
        case 'x':
            Finish();       //프로그램을 종료할 건지 물어보는 함수 호출
        default:
            printf("\n보기에서 없는 키를 입력하셨습니다.\n");
 
            Finish();       //프로그램을 종료할 건지 물어보는 함수 호출
        }
 
        Finish();              //프로그램을 종료할 건지 물어보는 함수 호출
    }
 
    return 0;
}
728x90