C语言实现多功能计算器:从基础运算到进制转换一网打尽!
引言
在日常生活中,计算器是我们不可或缺的工具。但你是否想过自己动手实现一个功能丰富的计算器?本文将带你用C语言打造一个集基本运算、三角函数、进制转换和日期计算于一体的多功能计算器!
功能概览
这个计算器拥有以下四大核心功能:
- 基本计算器 - 加减乘除、幂运算、求余、平方根
- 三角函数计算器 - 正弦、余弦、正切、余切及反三角函数
- 进制转换器 - 任意进制转十进制、十进制转任意进制、二进制转十六进制
- 日期计算 - 计算两个日期之间的天数差
运行效果

核心代码解析
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.日期计算 |
| 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;
}
“问渠哪得清如许,为有源头活水来。” - 让我们一起在编程的海洋中汲取知识的活水!


被折叠的 条评论
为什么被折叠?



