#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
//以上两行避免strcat与sprintf报错
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <Windows.h>//避免 C4013 “_sleep”未定义;假设外部返回 int 警告
#include "unistd.h"//引用内部头文件unistd.h用于延时
void OutputThePanel(void);
void swap(float* a, float*b);
int main(void)
{
int Oper;//存储操作序号
float a, b;//存储需要计算的数据
float Num[50];//存储9号功能的数据,也就是排序的初始数据
char HistoryOperate[5][1250] = { "EMPTY", "EMPTY", "EMPTY", "EMPTY", "EMPTY" };//用于存储五步历史步骤,0表示最新的记录
/*当历史记录为"EMPTY"时,表示这个位置目前是空的*/
int i, j;//循环参数
double Ans;//用于存储答案
char A[16] = "", B[16] = "", ANS[16] = "";//用于储存输入的数据与答案的字符串形式
do {
OutputThePanel();
//输出面板
OperateWrong://如果输入的编号不是1-9的整数,就跳回这里让用户重新输入
printf_s("\n\033[35m*\033[32mPlease input the number of the operate you want:\033[0m");
//以上代码负责显示界面
/*
\033[32m表示绿色输出,\033[0m表示白色输出
\033[35m表示紫色输出,\033[31m表示红色输出
\033[33m表示黄色输出
*/
scanf_s("%d", &Oper);
if ((Oper != 1) &&
(Oper != 2) &&
(Oper != 3) &&
(Oper != 4) &&
(Oper != 5) &&
(Oper != 6) &&
(Oper != 7) &&
(Oper != 8) &&
(Oper != 9) &&
(Oper != 10) &&
(Oper != 11) &&
(Oper != 12) &&
(Oper != 13) &&
(Oper != 14))//判断是否符合输入操作编号为1-9的整数
{
printf_s("[\033[31mERROR\033[0m]\033[60mThe Number You Input Is Not Allowed!\033[0m\n");
printf_s("Please try it again.Choose your operate and input the number of it.\n");
goto OperateWrong;//不符合输入条件则警告后跳回输入步骤
}
//以上确保输入的操作是符合规定的操作序号,也就是一定符合1<=Oper<=9且是整数
switch (Oper)
{
case 1://当选择1操作时应当为加法操作
printf_s("\n\033[35m*\033[32mPlease input the two numbers you want to sum up:\033[0m");
//提示用户输入两个需要相加的数字
scanf_s("%f", &a);
scanf_s("%f", &b);//读取两个float浮点数
Ans = a + b;
for (i = 3; i >= 0; i--)//用原来的0-3总计四条记录覆盖掉1-4的记录,实现记录的后移,为新记录腾出空间
{
strcpy(HistoryOperate[i + 1], HistoryOperate[i]);
}
if ((ceil(a) == (int)a) && (floor(a) == (int)a))
sprintf(A, "%d", (int)a);
else sprintf(A, "%0.4f", a);
if ((ceil(b) == (int)b) && (floor(b) == (int)b))
sprintf(B, "%d", (int)b);
else sprintf(B, "%0.4f", b);
if ((ceil(Ans) == (int)Ans) && (floor(Ans) == (int)Ans))
sprintf(ANS, "%d", (int)Ans);
else sprintf(ANS, "%0.4f", Ans);
//将a、b、Ans从float型数据转为字符串并分别存储与A、B、ANS中
strcpy(HistoryOperate[0], "");//清空
strcat(HistoryOperate[0], "\033[32m ");
strcat(HistoryOperate[0], A);
strcat(HistoryOperate[0], " + ");
strcat(HistoryOperate[0], B);
strcat(HistoryOperate[0], " = ");
strcat(HistoryOperate[0], ANS);
strcat(HistoryOperate[0], "\033[0m");
//连接字符串函数,用于存储最新的记录
//分多句连接避免"strcat实参过多"警告
//存储记录时就把颜色存进去,增强页面美化的兼容性
printf_s("\033[35m>\033[32mThe answer is :\033[0m%s\n", ANS);
printf_s("\n\033[35m*\033[32mThe operate has been saved temporarily.\n\033[35m*\033[32mIf you exit the software,the memory will lost.\033[0m");
break;
case 2://当选择1操作时应当为减法操作
printf_s("\n\033[35m*\033[32mPlease input the two numbers you want to subtract:\033[0m");
//提示用户输入两个需要相减的数字
scanf_s("%f", &a);
scanf_s("%f", &b);//读取两个float浮点数
Ans = a - b;
for (i = 3; i >= 0; i--)//用原来的0-3总计四条记录覆盖掉1-4的记录,实现记录的后移,为新记录腾出空间
{
strcpy(HistoryOperate[i + 1], HistoryOperate[i]);
}
if ((ceil(a) == (int)a) && (floor(a) == (int)a))
sprintf(A, "%d", (int)a);
else sprintf(A, "%0.4f", a);
if ((ceil(b) == (int)b) && (floor(b) == (int)b))
sprintf(B, "%d", (int)b);
else sprintf(B, "%0.4f", b);
if ((ceil(Ans) == (int)Ans) && (floor(Ans) == (int)Ans))
sprintf(ANS, "%d", (int)Ans);
else sprintf(ANS, "%0.4f", Ans);
//将a、b、Ans从float型数据转为字符串并分别存储与A、B、ANS中
strcpy(HistoryOperate[0], "");//清空
strcat(HistoryOperate[0], "\033[32m ");
strcat(HistoryOperate[0], A);
strcat(HistoryOperate[0], " - ");
strcat(HistoryOperate[0], B);
strcat(HistoryOperate[0], " = ");
strcat(HistoryOperate[0], ANS);
strcat(HistoryOperate[0], "\033[0m");
//连接字符串函数,用于存储最新的记录
//分多句连接避免"strcat实参过多"警告
//存储记录时就把颜色存进去,增强页面美化的兼容性
printf_s("\033[35m>\033[32mThe answer is :\033[0m%s\n", ANS);
printf_s("\n\033[35m*\033[32mThe operate has been saved temporarily.\n\033[35m*\033[32mIf you exit the software,the memory will lost.\033[0m");
break;
case 3://当选择1操作时应当为乘法操作
printf_s("\n\033[35m*\033[32mPlease input the two numbers you want to multiply:\033[0m");
//提示用户输入两个需要相乘的数字
scanf_s("%f", &a);
scanf_s("%f", &b);//读取两个float浮点数
Ans = a * b;
for (i = 3; i >= 0; i--)//用原来的0-3总计四条记录覆盖掉1-4的记录,实现记录的后移,为新记录腾出空间
{
strcpy(HistoryOperate[i + 1], HistoryOperate[i]);
}
if ((ceil(a) == (int)a) && (floor(a) == (int)a))
sprintf(A, "%d", (int)a);
else sprintf(A, "%0.4f", a);
if ((ceil(b) == (int)b) && (floor(b) == (int)b))
sprintf(B, "%d", (int)b);
else sprintf(B, "%0.4f", b);
if ((ceil(Ans) == (int)Ans) && (floor(Ans) == (int)Ans))
sprintf(ANS, "%d", (int)Ans);
else sprintf(ANS, "%0.4f", Ans);
//将a、b、Ans从float型数据转为字符串并分别存储与A、B、ANS中
strcpy(HistoryOperate[0], "");//清空
strcat(HistoryOperate[0], "\033[32m ");
strcat(HistoryOperate[0], A);
strcat(HistoryOperate[0], " * ");
strcat(HistoryOperate[0], B);
strcat(HistoryOperate[0], " = ");
strcat(HistoryOperate[0], ANS);
strcat(HistoryOperate[0], "\033[0m");
//连接字符串函数,用于存储最新的记录
//分多句连接避免"strcat实参过多"警告
//存储记录时就把颜色存进去,增强页面美化的兼容性
printf_s("\033[35m>\033[32mThe answer is :\033[0m%s\n", ANS);
printf_s("\n\033[35m*\033[32mThe operate has been saved temporarily.\n\033[35m*\033[32mIf you exit the software,the memory will lost.\033[0m");
break;
case 4://当选择1操作时应当为除法操作
DividedByZero://如果输入分母为0,则重新询问数据
printf_s("\n\033[35m*\033[32mPlease input the two numbers you want to divide:\033[0m");
//提示用户输入两个需要相除的数字
scanf_s("%f", &a);
scanf_s("%f", &b);//读取两个float浮点数
if (b != 0)//分母不能为0
{
Ans = a / b;
for (i = 3; i >= 0; i--)//用原来的0-3总计四条记录覆盖掉1-4的记录,实现记录的后移,为新记录腾出空间
{
strcpy(HistoryOperate[i + 1], HistoryOperate[i]);
}
if ((ceil(a) == (int)a) && (floor(a) == (int)a))
sprintf(A, "%d", (int)a);
else sprintf(A, "%0.4f", a);
if ((ceil(b) == (int)b) && (floor(b) == (int)b))
sprintf(B, "%d", (int)b);
else sprintf(B, "%0.4f", b);
没有合适的资源?快使用搜索试试~ 我知道了~
C语言实现简单计算器功能V1.1
共26个文件
tlog:6个
ipch:4个
pdb:2个
需积分: 1 0 下载量 179 浏览量
2023-10-24
20:53:59
上传
评论
收藏 27.96MB ZIP 举报
温馨提示
C语言实现简单计算器功能。 【更新内容】修复了部分bug,并新增了5个功能,包含新增的平均值计算与排序和平均值计算同时进行,且所有PLUS功能均有auto-counter模式,无需输入需要处理的数据总数。 实现方法:主要是do while循环与switch语句分流控制运算操作的选择。通过一个void型函数实现基础面板的输出与数字的转换(swap)。内容比较基础。 颜色设置:采用\033[0m形式控制输出内容的颜色。 用到的结构:三大基本结构,适用于初学者深入学习三大基本结构。 基础排版:可能有点难懂,把两行数据以不同颜色写在同一个字符串内,实现一次性输出。 主要功能:加(Add)、减(Sub)、乘(Multi)、除(Div)、整除(Int_Div)、取余(Mod_Div)、数据排序(选择排序)的功能。 适用对象:适用于C语言初学者对C语言基础的加强,适合初学者个人使用。也适于能力较强者从该源程序中找到该源文件的不足、避开短处,减少犯别人已经犯过的错误,加强自己的编程能力与对细节的处理。 最后,感谢您下载本资源,如发现有不足之处,请与作者联系,让我们共同努力、共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
CalculaterV1.1.zip (26个子文件)
Calculater
Calculater
Calculater.vcxproj 8KB
unistd.h 189B
Calculater.c 38KB
Calculater.vcxproj.user 165B
Calculater.vcxproj.filters 1KB
Debug
vc141.pdb 100KB
vc141.idb 395KB
Calculater.log 123B
Calculater.obj 79KB
Calculater.tlog
CL.write.1.tlog 552B
CL.command.1.tlog 2KB
link.command.1.tlog 2KB
Calculater.lastbuildstate 233B
link.read.1.tlog 2KB
link.write.1.tlog 522B
CL.read.1.tlog 20KB
.vs
Calculater
v15
Browse.VC.db 32.24MB
.suo 32KB
ipch
AutoPCH
49d216f8fe7345d0
CALCULATER.ipch 3.06MB
4641511b2abb5a50
CALCULATER.ipch 29.19MB
dbbac2473f384e3c
CALCULATER.ipch 39.63MB
1e133210ffcde32c
UNISTD.ipch 2.25MB
Calculater.sln 1KB
Debug
Calculater.exe 63KB
Calculater.ilk 481KB
Calculater.pdb 676KB
共 26 条
- 1
资源评论
青が絶える(青绝悲)
- 粉丝: 572
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功