C语言实现多功能计算器:从基础运算到进制转换一网打尽!附带源码

C语言实现多功能计算器:从基础运算到进制转换一网打尽!

引言

在日常生活中,计算器是我们不可或缺的工具。但你是否想过自己动手实现一个功能丰富的计算器?本文将带你用C语言打造一个集基本运算、三角函数、进制转换和日期计算于一体的多功能计算器!

功能概览

这个计算器拥有以下四大核心功能:

  1. 基本计算器 - 加减乘除、幂运算、求余、平方根
  2. 三角函数计算器 - 正弦、余弦、正切、余切及反三角函数
  3. 进制转换器 - 任意进制转十进制、十进制转任意进制、二进制转十六进制
  4. 日期计算 - 计算两个日期之间的天数差

运行效果

在这里插入图片描述

核心代码解析

1. 优雅的界面设计

void showMenu()
{
    cout << "欢迎使用多功能计算器 *^_^*" << endl;
    cout << "\t\t\t\t\t\t问渠哪得清如许,为有源头活水来。" << endl;
    cout << "\t\t\t\t\t\t|----------------------------|" << endl << endl;
    cout << "\t\t\t\t\t\t|       1.基本计算器         |" << endl<<endl;
    // ... 更多菜单选项
}

2. 基本运算实现

加减乘除等基础运算简洁明了:

case 1: // 加法
{ 
    cout << "请输入两个数进行加法,如:a+b" << endl;
    cin >> num1 >> num2;
    cout << "结果为:" << num1 + num2 << endl;
    break;
}
case 5: // 幂运算
{ 
    cout << "请输入两个数进行幂运算,如:a^n" << endl;
    cin >> num1 >> num2;
    cout << "结果为:" << pow(num1, num2) << endl;
    break;
}

3. 三角函数计算

支持角度制输入,自动进行弧度转换:

case 1: // 正弦函数
{
    cout << "请输入要进行正弦运算的数:" << endl;
    cin >> num1;
    cout << "结果为:" << sin(num1 * pi / 180) << endl;
    break;
}

4. 智能进制转换

三种进制转换方式满足不同需求:

// 任意进制转十进制
void jinzhi1() {
    int x, p;   // x输入数字, p该数的进制数  
    cin >> x >> p;
    int y = 0, product = 1;
    while (x != 0) {
        y = y + (x % 10) * product;
        x = x / 10;
        product = product * p;
    }
    cout << "结果为:" << y << endl;
}

5. 精准日期计算

使用结构体存储日期,精确计算日期差:

typedef struct Date {
    int year;
    int yue;
    int r;
} Data;

int Cha_zhi(Data s1, Data s2) {
    // 复杂的日期差计算逻辑
    // 考虑了闰年、月份天数差异等因素
    return 计算出的天数;
}

技术亮点

  1. 模块化设计 - 每个功能独立封装,便于维护和扩展
  2. 用户友好 - 清晰的菜单导航和提示信息
  3. 错误处理 - 对用户输入进行基本验证
  4. 界面美观 - 使用系统清屏和颜色设置提升用户体验
  5. 算法优化 - 日期计算考虑了闰年等特殊情况

使用示例

欢迎使用多功能计算器 *^_^*
问渠哪得清如许,为有源头活水来。
|----------------------------|
|       1.基本计算器         |
|       2.三角函数计算器     |
|       3.进制转换           |
|       4.日期计算           |
|       0.退出多功能计算器   |
|----------------------------|

选择相应功能后,按照提示输入即可获得计算结果。

扩展思路

这个计算器还有很大的扩展空间:

  • 添加复数运算功能
  • 实现矩阵计算
  • 增加单位换算
  • 添加计算历史记录
  • 图形化界面改造

结语

通过这个项目,我们不仅实现了一个实用的计算工具,更深入理解了C语言的函数封装、菜单设计、数学运算等核心概念。希望这个项目能激发你对编程的兴趣,在编码的世界里不断探索!

源码已完整展示,欢迎下载使用和进一步改进!

#include <iostream>
#include <math.h>
#include <cmath>
#include <Windows.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
const double pi = 3.1415926;
double num1, num2 = 0;
int select0 = 0;
int q = 0;

//日期的结构体
typedef struct Date
{
    int year;
    int yue;
    int r;
}Data;

//主页面
void showMenu()
{
    cout << "欢迎使用多功能计算器 *^_^*" << endl;
    cout << "\t\t\t\t\t\t问渠哪得清如许,为有源头活水来。" << endl;
    cout << "\t\t\t\t\t\t|----------------------------|" << endl << endl;
    cout << "\t\t\t\t\t\t|       1.基本计算器         |" << endl<<endl;
    cout << "\t\t\t\t\t\t|       2.三角函数计算器     |" << endl << endl;
    cout << "\t\t\t\t\t\t|       3.进制转换           |" << endl << endl;
    cout << "\t\t\t\t\t\t|       4.日期计算           |" << endl << endl;
    cout << "\t\t\t\t\t\t|       0.退出多功能计算器   |" << endl<<endl;
    cout << "\t\t\t\t\t\t|----------------------------|" << endl << endl;

}

//基本计算器页面
void show1() {
    cout << "\t\t\t\t\t\t|________________________|" << endl;
    cout << "\t\t\t\t\t\t|       1.加法: a+b      |" << endl;
    cout << "\t\t\t\t\t\t|       2.减法: a-b      |" << endl;
    cout << "\t\t\t\t\t\t|       3.乘法: a*b      |" << endl;
    cout << "\t\t\t\t\t\t|       4.除法: a/b      |" << endl;
    cout << "\t\t\t\t\t\t|       5.幂运算: a^n    |" << endl;
    cout << "\t\t\t\t\t\t|       6.求余运算:a%b  |" << endl;
    cout << "\t\t\t\t\t\t|       7.求平方根:a的1/2次幂 |" << endl;
    cout << "\t\t\t\t\t\t|       0.退出基本计算器 |" << endl;
    cout << "\t\t\t\t\t\t|________________________|  " << endl;
}

//三角函数计算器
void show2() {
    cout << "\t\t\t\t\t\t|__________________________|" << endl;
    cout << "\t\t\t\t\t\t|     1.正弦函数,sinx      |" << endl << endl;
    cout << "\t\t\t\t\t\t|     2.余弦函数,cosx      |" << endl << endl;
    cout << "\t\t\t\t\t\t|     3.正切函数,tanx      |" << endl << endl;
    cout << "\t\t\t\t\t\t|     4.余切函数,cotx      |" << endl << endl;
    cout << "\t\t\t\t\t\t|     5.反正弦函数,arcsin  |" << endl << endl;
    cout << "\t\t\t\t\t\t|     6.反余弦函数,arccosx |" << endl << endl;
    cout << "\t\t\t\t\t\t|     0.退出三角函数计算器 |" << endl << endl;
    cout << "\t\t\t\t\t\t|__________________________|" << endl << endl;
}

//日期计算
int Cha_zhi(Data s1, Data s2)
{
    int i1, i2, i3, j1, j2 = 0;/*定义起始天数为0天*/
    int sum;
    //先计算年份
    j1 = s2.year - s1.year;
    //找二个年份之间月份的天数(不包括二个年份的本月)	
    if (s1.yue > s2.yue)
    {
        i2 = s1.yue; i3 = s2.yue;
    }
    else { i2 = s2.yue; i3 = s1.yue; }
    for (i2 = i2 + 1; i2 < i3; i2++)
    {
        switch (i2)
        {
        case 1: j2 = j2 + 31; break;
        case 2: j2 = j2 + 28; break;
        case 3: j2 = j2 + 31; break;
        case 4: j2 = j2 + 30; break;
        case 5: j2 = j2 + 31; break;
        case 6: j2 = j2 + 30; break;
        case 7: j2 = j2 + 31; break;
        case 8: j2 = j2 + 31; break;
        case 9: j2 = j2 + 30; break;
        case 10: j2 = j2 + 31; break;
        case 11: j2 = j2 + 30; break;
        case 12: j2 = j2 + 31; break;
        }
    }
    //根据本月份来算之间的天数	
    if (s1.yue == s2.yue)
    {
        if (s1.r <= s2.r)
        {
            j2 = j2 + (s2.r - s1.r);
        }
        else
        {
            j2 = j2 + (s1.r - s2.r); //多余天数}	
        }
    }
    else {
        switch (s1.yue)
        {
        case 1: j2 = j2 + (31 - s1.r); break;
        case 2: j2 = j2 + (28 - s1.r); break;
        case 3: j2 = j2 + (31 - s1.r); break;
        case 4: j2 = j2 + (30 - s1.r); break;
        case 5: j2 = j2 + (31 - s1.r); break;
        case 6: j2 = j2 + (30 - s1.r); break;
        case 7: j2 = j2 + (31 - s1.r); break;
        case 8: j2 = j2 + (31 - s1.r); break;
        case 9: j2 = j2 + (30 - s1.r); break;
        case 10: j2 = j2 + (31 - s1.r); break;
        case 11: j2 = j2 + (30 - s1.r); break;
        case 12: j2 = j2 + (31 - s1.r); break;
        }
        j2 = j2 + s2.r;//加上下年份的过天数	
    }
    //根据日期大小来算总天数	
    if (s1.yue <= s2.yue && s1.r <= s2.r)//满了一年
        sum = j1 * 365 + j2;
    if (s1.yue > s2.yue || s1.r > s2.r)  //没满一年		
        sum = j1 * 365 - j2;
    //存在闰年	
    if (s1.yue % 4 == 0 && s1.yue <= 2)
        sum++;
    for (i1 = s1.year + 1; i1 < s2.year; i1++)
    {
        if (i1 % 4 == 0)	sum++;
    }
    return sum;
}

//进制转换
void show3() {
    cout << "\t\t\t\t\t\t|------------------------------|" << endl << endl;
    cout << "\t\t\t\t\t\t|     1.任意进制转换十进制     |" << endl << endl;
    cout << "\t\t\t\t\t\t|     2.十进制转换任意进制     |" << endl << endl;
    cout << "\t\t\t\t\t\t|     3.二进制转换为十六进制   |" << endl << endl;
    cout << "\t\t\t\t\t\t|     0.退出进制转换器         |" << endl << endl;
    cout << "\t\t\t\t\t\t|------------------------------|" << endl;
}

//任意进制转换十进制
void jinzhi1() {
    cout << "任意进制转换十进制" << endl;
    cout << "请输入两个数,分别为该数与其对应的进制数" << endl;
    int x, p;   //x输入数字  p该数的进制数  
    cin >> x >> p;
    int i = x;
    int y = 0, product = 1;
    while (x != 0) {
        y = y + (x % 10) * product;
        x = x / 10;
        product = product * p;
    }
    cout << "结果为:" << endl;
    cout << i << "的" << p << "进制为:" << y << endl;

}

//十进制转换任意进制
void jinzhi2() {
    cout << "十进制转换任意进制" << endl;
    cout << "请输入两个数,分别为十进制数与其对应的进制大小" << endl;
    int x, p; //x为十进制数,p为目标进制大小 
    cin >> x >> p;
    int i = x;
    int a[100]; //存放余数 
    int count = 0;
    do {
        a[count++] = x % p;
        x = x / p;
    } while (x != 0);//当商不为0时进行循环 

    cout << "结果为:" << endl;
    cout << i << "的" << p << "进制为:";
    for (int i = count - 1; i >= 0; i--) {
        cout << a[i];
    }
}

//二进制转换为十六进制
void jinzhi3() {
    char binary[17];
    cout << "请输入一个16位以内的二进制数:" << endl;
    cin >> binary;

    int decimal = strtol(binary, NULL, 2); //strtol()函数将参数1的字符串,转换成给定的 参数3的一个长整数(类型为 long int 型)
    cout << "十进制数为: " << decimal << endl;

    char hex[6];
    sprintf_s(hex, "%X", decimal);
    cout << "十六进制数为: " << hex << endl;

    /*在这个程序中,用户输入一个16位以内的二进制数,并用`strtol`函数将其转换为十进制数。
    然后,将该十进制数用`sprintf`函数转换为十六进制字符串。最后,输出该字符串即可得到结果。*/
}

//加载页面
void proc()
{
    int i = 0;
    printf("\n\n\n\n\n");
    for (i = 1; i <= 20; i++)
    {
        printf("\t\t\t\t\t系统加载中:");
        printf("[%.1f%%]\r", (i + 1) * 5.0);
        fflush(stdout);//清缓存
        Sleep(100);
    }
    printf("\t");
    printf("\n");
    system("cls");
}


int main()
{
    system("color 0B");

    proc();
    while (1) {
        showMenu();
        cout << "------------------------------------------------------------------------------------------------------------------------";
        cout << "请输入数字0--4" << endl;
        cin >> select0;
        system("pause");  //请按任意键继续
        system("cls");  //清屏操作
        switch (select0)
        {
        case 1:
            //基本计算器
        {
            while (1) {
                show1();
                cout << "------------------------------------------------------------------------------------------------------------------------";
                cout << "请输入数字:0--7" << endl;
                cin >> q;
                switch (q)
                {
                case 1:
                { cout << "请输入两个数进行加法,如:a+b" << endl;
                cin >> num1 >> num2;
                cout << "结果为:";
                cout << num1 + num2 << endl;
                system("pause");  //请按任意键继续
                system("cls");  //清屏操
                break;
                }
                case 2:
                { cout << "请输入两个数进行减法,如:a-b" << endl;
                cin >> num1 >> num2;
                cout << "结果为:";
                cout << num1 - num2 << endl;
                system("pause");  //请按任意键继续
                system("cls");  //清屏操
                break;
                }
                case 3:
                {  cout << "请输入两个数进行乘法,如:a*b" << endl;
                cin >> num1 >> num2;
                cout << "结果为:";
                cout << num1 * num2 << endl;
                system("pause");  //请按任意键继续
                system("cls");  //清屏操
                break;
                }
                case 4:
                { cout << "请输入两个数进行除法,如:a/b" << endl;
                cin >> num1 >> num2;
                cout << "结果为:";
                cout << num1 / num2 << endl;
                system("pause");  //请按任意键继续
                system("cls");  //清屏操
                break;
                }
                case 5:
                { cout << "请输入两个数进行幂运算,如:a^n" << endl;
                cin >> num1 >> num2;
                cout << "结果为:";
                cout << pow(num1, num2) << endl;
                system("pause");  //请按任意键继续
                system("cls");  //清屏操
                break;
                }
                case 6:
                {   cout << "请输入两个数进行求余运算,如a%b" << endl;
                cin >> num1 >> num2;
                cout << "结果为:";
                cout << (int)num1 % (int)num2 << endl;
                system("pause");  //请按任意键继续
                system("cls");  //清屏操
                break;
                }
                case 7:
                {   cout << "请输入进行平方根的数字" << endl;
                cin >> num1;
                cout << "结果为:";
                cout << sqrt(num1) << endl;
                system("pause");  //请按任意键继续
                system("cls");  //清屏操
                break;
                }
              
                case 0:
                    break;
                default:
                {cout << "输入错误,请重新输入!" << endl;
                system("pause");  //请按任意键继续
                system("cls");  //清屏操作
                }
                break;
                }
                //退出这一层循环
                if (q == 0) {
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操
                    cout << "\n\n\n\t\t\t\t\t欢迎下次使用!!!" << endl;
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操作
                    break;
                }
                //system("pause");  //请按任意键继续
                //system("cls");  //清屏操作
            }
            break;
        }
        case 2:  //三角函数计算器
        {   
            while (1) {
                show2();
                cout << "------------------------------------------------------------------------------------------------------------------------";
                cout << "请输入数字:0--6" << endl;
                cin >> q;
                switch (q)
                {
                case 1: {
                    cout << "请输入要进行正弦运算的数:" << endl;
                    cin >> num1;
                    cout << "结果为:";
                    cout << sin(num1 * pi / 180) << endl;   //将弧度转换为度
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操
                    break;
                }
                case 2: {
                    cout << "请输入度数,进行的余弦运算:" << endl;
                    cin >> num1;
                    cout << "结果为:";
                    cout << cos(num1 * pi / 180) << endl;   //将弧度转换为度
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操
                    break;
                }
                case 3: {
                    cout << "请输入度数,进行的正切运算:" << endl;
                    cin >> num1;
                    cout << "结果为:";
                    cout << tan(num1 * pi / 180) << endl;
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操
                    break;
                }
                case 4: {
                    cout << " 请输入度数,进行的余切运算:" << endl;
                    cin >> num1;
                    cout << "结果为:";
                    cout << sqrt(1 - pow(sin(num1), 2)) << endl;
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操
                    break;
                }
                case 5: {
                    cout << "请输入[-1,1]的数,进行反正弦运算:" << endl;
                    //角度值 = 弧度值 * 180 / 3.1415926
                    cin >> num1;
                    cout << "结果为:";
                    cout << asin(sin(num1 * pi / 180.0)) * 180 / pi << endl;
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操
                    break;
                }
                case 6: {
                    cout << "请输入[-1,1]的数,进行反余弦运算:" << endl;
                    cin >> num1;
                    cout << "结果为:";
                    cout << acos(cos(num1 * pi / 180.0)) * 180.0 / pi << endl;
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操
                    break;
                }
                case 0: {
                    break;
                }
                default:
                {cout << "输入错误,请重新输入!" << endl;
                system("pause");  //请按任意键继续
                system("cls");  //清屏操作
                break;
                }
                }
                if (q == 0) {
                    cout << "\n\n\n\t\t\t\t\t欢迎下次使用!!!" << endl;
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操作
                    break;
                }
                //system("pause");  //请按任意键继续
                //system("cls");  //清屏操作
            }

            break;
        }
        case 3:  //进制转换
        {   
            while (1) {
                show3();
                cout << "------------------------------------------------------------------------------------------------------------------------";
                cout << "请输入数字:0--3" << endl;
                cin >> q;
                switch (q)
                {
                case 1:
                {
                    jinzhi1();
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操作
                    break;

                } 
                case 2:
                {
                    jinzhi2();
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操作
                    break;
                }
                   
                case 3:
                {
                    jinzhi3();
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操作
                    break;
                }
                case 0:
                    break;
                default:
                {cout << "输入错误,请重新输入!" << endl;
                system("pause");  //请按任意键继续
                system("cls");  //清屏操作
                break;
                }
                }
                if (q == 0) {
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操
                    cout << "\n\n\n\n\t\t\t\t\t欢迎下次使用!!!" << endl;
                    system("pause");  //请按任意键继续
                    system("cls");  //清屏操作
                    break;
                }
                //system("pause");  //请按任意键继续
                //system("cls");  //清屏操作
            }
            break;
        }
        case 4://日期计算
        {
            struct Date s1, s2; int data, hour;
            cout << "\n\n\n\t\t\t\t\t\t欢迎使用日期差计算工具 !!!!(*--*)\n";
            cout << "输入第一个日期(包括 年,月,日)" << endl;
            cin >> s1.year;
            cin >> s1.yue;
            cin >> s1.r;
            printf("第一个时间为:%d年%d月%d日。\n", s1.year, s1.yue, s1.r);
            cout << "输入第二个日期 (包括 年,月,日)" << endl;
            cin >> s2.year;
            cin >> s2.yue;
            cin >> s2.r;
            printf("第二个时间为:%d年%d月%d日。\n", s2.year, s2.yue, s2.r);
            // printf("这二个时间的差值为:\n");
            data = Cha_zhi(s1, s2);
            hour = data * 24;
            cout << "这二个年份相差的天数为:";
            cout << data << endl;
            cout << "这二个年份相差的小时为:";
            cout << hour << endl;
            system("pause");  //请按任意键继续
            system("cls");  //清屏操
            break;
        }
        case 0:
            cout << "\n\n\n\n\t\t\t\t欢迎下次使用!!!" << endl;
            return 0;
            break;
        default:
            break;
        }
    }
    return 0;
}

“问渠哪得清如许,为有源头活水来。” - 让我们一起在编程的海洋中汲取知识的活水!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员春至

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值