偶然翻到了自己大一时候写的一些代码,代码冗余,但还是想保存下来,以作纪念。

文章目录

  • 1.运行效果
  • 2.运行环境
  • 3.完整代码

1.运行效果



2.运行环境

源码(Dev5.4.0版本下可直接(.cpp文件)运行 gcc 4.7.2)

注意:由于部分代码为C11标准,后缀名应改为cpp运行

编译器下载链接:https://pan.baidu.com/s/1Hywq6hxzxMzX1-22ig2HdA
提取码:kd65
下载后解压即可使用

3.完整代码

#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>
using namespace std;
typedef long long ll;/************全局变量*****************/
typedef struct
{int x,y;
}pos;string op="0123456789+-*/C()E";int key[10][10]={{0,0,0,0,0},{0,14,13,12,11},{0,7,8,9,10},{0,4,5,6,10},{0,1,2,3,17}, {0,0,15,16,17}
};char mp[500][1000] = {{"            C语言计算器1.0"},{""},{"         作者:山河"},{""},{"                                                           说明"},{"┌───────────────────────────────────┐                               "},{"│┌─────────────────────────────────┐│      WASD或者↑↓←→可操作虚拟光标的移动"},{"││                         ││    "},{"│└─────────────────────────────────┘│      当光标在虚拟键盘上时,按下空格可以将虚拟键盘上的数字输入       "},{"├────────┬────────┬────────┬────────┤                                     "},{"│   │    │    │    │      让光标移动在Enter上面按下空格可计算结果  "},{"│    C   │    /   │    *   │    -   │                                               "},{"│   │    │    │    │      支持括号等混合运算(除法自动向下取整,懒得施工了)"},{"├────────┼────────┼────────┼────────┤"},{"│  │    │    │    │      小彩蛋:按F可进入输入模式(不建议使用,未施工完毕)"},{"│    7   │    8   │    9   │        │"},{"│    │    │    │    │      健壮性未完善(懒得修复),刷算法的一个小玩意(懒)"},{"├────────┼────────┼────────┤    +   │"},{"│   │    │    │    │      其它小游戏用H5写去咯,随缘更新,对C的一点爱好吧,毕竟不能总是黑框框"},{"│    4   │    5   │    6   │        │"},{"│  │    │    │    │    "},{"├────────┼────────┼────────┼────────┤"},{"│    │    │    │    │    "},{"│    1   │    2   │    3   │    E   │"},{"│    │    │    │    n   │    "},{"├────────┼────────┼────────│    t   │"},{"│    │    │    │    e   │    "},{"│    0   │    (   │    )   │    r   │"},{"│    │    │    │    │    "},{"└────────┴────────┴────────┴────────┘"}
};/************函数声明*****************/
void gotoxy(int x, int y);//坐标函数
void HideCursor();//隐藏光标
void ShowCursor();//显示光标
void move();//控制虚拟键盘的指针移动函数
void load();//加载画面
void init();//初始化设置颜色和窗口大小
int pr(char o);//传入操作符,返回优先级
int find(char o);//判断是否为符号
string exp_deal(string in);//对表达式进行处理,避免多个数字相连
string exp_to_postexp(string in);//中缀表达式转为后缀表达式
ll calc(ll x,ll y,char o);//x为栈顶数,y为次顶数 y在算式前,x在后
string postexp_val(string in);//后缀表达式求值
string calc_res(string in);//传入输入的中缀表达式,计算结果 void gotoxy(int x, int y) //坐标函数
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle, pos);
}void HideCursor()//隐藏光标
{CONSOLE_CURSOR_INFO cursor_info={1,0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}void ShowCursor()//显示光标
{CONSOLE_CURSOR_INFO cursor_info={1,1};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}//控制虚拟键盘的指针移动函数
void move()
{int flag=0; string in="";//输入的字符串 char ch1,ch2;pos now_key,now_mp,last_key,last_mp;//key用来获取符号值,mp用来获取图上的位置 now_key.x=1,now_key.y=1;now_mp.x=20,now_mp.y=17;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),57);gotoxy(now_mp.x,now_mp.y);cout<<"C"; //同时启用wasd和方向键while(1){ch1=getch();if(ch1==-32)//方向键为双键值{flag=0;ch2=getch();switch(ch2){case 72:ch1='w';break;//上case 80:ch1='s';break;//下case 75:ch1='a';break;//左case 77:ch1='d';break;//右default: break;}}switch(ch1){case 'w':case 'W':if(now_key.x>1){last_key.x=now_key.x,last_key.y=now_key.y;last_mp.x=now_mp.x,last_mp.y=now_mp.y;if(now_key.x==5&&now_key.y==4)break;if(key[now_key.x][now_key.y]==10){now_key.x-=2,now_mp.y-=6;break;}if(key[now_key.x][now_key.y]==17){now_key.x--,now_mp.y-=6;break;}now_key.x--;now_mp.y-=4;}break;case 's':case 'S':if(now_key.x<5){if(now_key.x==4&&now_key.y==4)break;last_key.x=now_key.x,last_key.y=now_key.y;last_mp.x=now_mp.x,last_mp.y=now_mp.y;if(key[now_key.x][now_key.y]==11){now_key.x+=2,now_mp.y+=6;break;}if(key[now_key.x][now_key.y]==10){now_key.x++,now_mp.y+=6;break;}now_key.x++;now_mp.y+=4;}break;case 'a':case 'A':if(now_key.y>1){last_key.x=now_key.x,last_key.y=now_key.y;last_mp.x=now_mp.x,last_mp.y=now_mp.y;now_key.y--;if(key[now_key.x][now_key.y]==9){now_mp.x-=9,now_mp.y-=2;break;}if(key[now_key.x][now_key.y]==6){now_mp.x-=9,now_mp.y+=2;break;}now_mp.x-=9;}break;case 'd':case 'D':if(now_key.y<4){last_key.x=now_key.x,last_key.y=now_key.y;last_mp.x=now_mp.x,last_mp.y=now_mp.y;if(key[now_key.x][now_key.y]==9){now_key.y++,now_key.x++,now_mp.x+=9,now_mp.y+=2;break;}if(key[now_key.x][now_key.y]==6){now_key.y++,now_mp.x+=9,now_mp.y-=2;break;}if(key[now_key.x][now_key.y]==16){now_key.y++,now_key.x--,now_mp.x+=9,now_mp.y-=4;break;}now_key.y++;now_mp.x+=9;}break;case 'F'://启动键盘输入模式,提示光标闪烁 case 'f':flag=1;system("color 70");//设置颜色 gotoxy(50,13);ShowCursor();//显示光标char c;while(1){while((c=getch())!='k'){in+=c;gotoxy(50-32,13);for(int i=0;i<32;i++)cout<<" ";gotoxy(50-in.length(),13);cout<<in;}HideCursor();gotoxy(50-32,13);for(int i=0;i<32;i++)cout<<" ";in=calc_res(in);gotoxy(50-in.length(),13);cout<<in;in="";//清空}break;case ' '://选中小键盘时 system("color 70");//设置颜色 flag=1;int val=key[now_key.x][now_key.y];if(val==14){gotoxy(50-32,13);for(int i=0;i<32;i++)cout<<" ";in="";//清空}else if(val==17){//提交int len=in.length();in=calc_res(in);gotoxy(50-len,13);for(int i=0;i<len;i++)cout<<" ";gotoxy(50-in.length(),13);cout<<in;in="";  break;}else in+=op[val];//填入中缀表达式 gotoxy(50-in.length(),13);cout<<in;   break;}if(!flag){//先绘制移动前的符号 system("color 70");//设置颜色 gotoxy(last_mp.x,last_mp.y);cout<<op[key[last_key.x][last_key.y]];//绘制当前移动到的符号 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),57);if(key[now_key.x][now_key.y]==17){string s="Enter";for(int i=0;i<5;i++){gotoxy(now_mp.x,now_mp.y+i);cout<<s[i];}}else{gotoxy(now_mp.x, now_mp.y);cout<<op[key[now_key.x][now_key.y]];}}}} void load()
{for (int i = 0; i <= 30; i++){gotoxy(15,6+i);cout<<mp[i]<<endl;}
}void init()
{system(" mode con cols=150 lines=40");//设置宽高 system("color 70");//设置颜色 HideCursor();load();move();
}int pr(char o)//传入操作符,返回优先级
{int pri[6]={0,1,1,2,2,0};//左括号加减乘除 优先级 char op[6]={'(','+','-','*','/','#'};//#做栈底使用for(int i=0;i<6;i++)if(op[i]==o)return pri[i];
}int find(char o)
{char op[10]={'#','(','+','-','*','/','^',')'};for(int i=0;i<10;i++)if(op[i]==o)return 1;return 0;
}string exp_deal(string in)//对表达式进行处理,避免多个数字相连
{string t="";for(int i=0;i<in.length();i++){t+=in[i];if(in[i]>='0'&&in[i]<='9'&&find(in[i+1]))t+='@';}return t;
}string exp_to_postexp(string in)//中缀转后缀
{int pri[6]={0,1,1,2,2,0};//左括号加减乘除 优先级 char op[6]={'(','+','-','*','/','#'};//#做栈底使用stack<char>s;string res="";s.push('#');for(int i=0;i<in.length();i++){if((in[i]>='0'&&in[i]<='9'||in[i]=='@')){res+=in[i];}else {//处理符号 if(in[i]=='(')s.push(in[i]);else{if(in[i]==')'){while(s.top()!='('){res+=s.top();s.pop();}s.pop();//弹出左括号 continue;}//当前扫描到的符号 if(pr(in[i])>pr(s.top()))s.push(in[i]);//优先级大于栈顶 else if(pr(in[i])<=pr(s.top())){//优先级小于等于栈顶 while(pr(in[i])<=pr(s.top())){res+=s.top();s.pop();}s.push(in[i]);}}}}while(s.top()!='#'){res+=s.top();s.pop();}return res;
}ll calc(ll x,ll y,char o)//x为栈顶数,y为次顶数 y在算式前,x在后
{switch(o){case '+':return x+y;case '-':return y-x;case '*':return x*y;case '/':return y/x; case '^':return pow(y,x);//虽然我忘记搞这个的界面了,以后再加? }
}string postexp_val(string in)//后缀表达式求值,维护一个栈即可
{stack<ll>s;ll m,n,now=0;for(int i=0;i<in.length();i++){if(in[i]>='0'&&in[i]<='9'){//读入数字 now*=10;now+=in[i]-'0';}else if(in[i]=='@')s.push(now),now=0;if(find(in[i])){m=s.top();s.pop();n=s.top();s.pop();s.push(calc(m,n,in[i]));}}ll num=s.top();stringstream ss;ss<<num;return ss.str();
}string calc_res(string in)//传入输入的中缀表达式,计算结果
{in=exp_deal(in);//把中缀表达式进行处理in=exp_to_postexp(in);//转为后缀表达式return postexp_val(in);//后缀表达式求值
}int main()
{init();return 0;
}

【C语言小游戏】计算器相关推荐

  1. c语言小游戏代码矿井逃生_如何选择编程语言和逃生教程炼狱

    c语言小游戏代码矿井逃生 A few weeks ago, I posted about my experience attempting to learn JavaScript, C#, Pytho ...

  2. c语言min函数_C语言探索之旅 | 第一部分第十课:第一个C语言小游戏

    内容简介 前言 准备工作和建议 我的代码 改进方案 第一部分第十一课预告 1. 前言 上一课是 C语言探索之旅 | 第一部分第九课:循环语句 . 经过前面这么多课的努力,我们终于迎来了第一个比较正式的 ...

  3. C语言小游戏:文字冒险游戏

    这是一个用Dev新写的游戏:冒险4.0,可选角色,可买彩票,可抽奖... 资源我放在了C语言小游戏.文字冒险-cocos2D文档类资源-CSDN文库,适合初学者学习

  4. C语言小游戏-五子棋

    C语言小游戏-五子棋 全部代码如下: #include <easyx.h> #include <graphics.h> #include <conio.h> #in ...

  5. C语言小游戏设计报告

    C语言小游戏设计报告 课程设计名称:贪吃蛇小游戏 专业班级:计科15-2 学号:150809229 姓名:XXX 一.设计目标 通过设计,培养学生对电脑的动手能力,使学生巩固<C语言程序设计&g ...

  6. C语言小游戏大全,C语言贪吃蛇小游戏(附源码)

    一.C语言小游戏大全,C语言贪吃蛇小游戏(附源码) 贪吃蛇小游戏源码和更多C语言课设项目小游戏源码免 费 下 载 链 接 如下: c语言项目课设小游戏源码资料压缩包.zip-C文档类资源-CSDN下载 ...

  7. C语言小游戏,数字炸弹,手动设置炸弹的值和回合数。

    C语言小游戏,数字炸弹,手动设置炸弹的值和回合数. 效果图: 代码部分: #include <stdio.h> void main() {int a,b;int d=35; //在这里手动 ...

  8. c语言课时设计猜坐标游戏,c语言小游戏课程设计报告.docx

    c语言小游戏课程设计报告 中国地质大学 本科生课程论文封面 课程名称c语言课程设计 教师姓名陈喆老师 本科生姓名周宜诺 本科生学号XX 本科生专业土地资源管理 所在院系公共管理学院 类别: 日期: 课 ...

  9. c语言小游戏-飞机大战

    今天我们来尝试用easyx图形库实现c语言小游戏-飞机大战(源代码和图片已经在结尾给出) 先引用头文件 #include<stdio.h> #include<time.h>// ...

  10. c语言小游戏vc,C语言探索之旅:第一个C语言小游戏

    C语言探索之旅:第一个C语言小游戏-1.jpg (37.05 KB, 下载次数: 0) 2018-10-8 19:23 上传 内容简介 1.课程纲领 2.第一部分第八课:第一个C语言小游戏 3.第一部 ...

最新文章

  1. Cocos 属性常用参数
  2. 我和AI打了六局王者荣耀,心态崩了
  3. Hadoop MapReduce容错性分析
  4. 各个大厂APP,如何保护打工人的隐私信息?
  5. C++最全输入方式总结(cin、get、getchar、getline)
  6. 用python排教室_开学季,教你用Python画大学教室座位神分区图!网友直呼“中枪”...
  7. python字符串截取_Python-变量-No3
  8. 深度学习-人工神经网络概述
  9. [Kafka与Spark集成系列三] Spark编程模型
  10. 【渝粤教育】广东开放大学 动画概论 形成性考核 (44)
  11. python中csv模块是自带的吗_python csv模块 Python的CSV模块,怎么新建为添加模式
  12. Spring Boot加入websocket后,单元测试报错(javax.websocket.server.ServerContainer not available)
  13. 操作 mysql 不生成日志_利用Python操作MySQL数据库,以后不懂这些是要被鄙视的!...
  14. python在匿名函数作和_python之路——内置函数和匿名函数
  15. bootstrap交互式网页设计工具_3款强大的BootStrap的可视化制作工具推荐
  16. 完全卸载exchange2010
  17. HTML基础知识笔记
  18. 计算机有哪些交叉专业研究生,与理工科交叉的计算机专业考研方向有哪些?
  19. win7休眠设置在哪里_win7怎么开启休眠模式
  20. 渗透测试如何学习? (*╹▽╹*) 信息收集 ~ 其一

热门文章

  1. Centos7.5下pip安装第三方库时出现提示:You are using pip version 8.1.2, however version 10.0.1 is available.
  2. i tell you
  3. ArduPilot — Building the code(Linux/Ubuntu)
  4. Intelligent Parking Building
  5. uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了
  6. windows下之定时执行bat脚本
  7. Java中 9 种常见的 CMS GC 问题分析与解决
  8. 面向对象——类和对象
  9. Linux下常用打流方式
  10. matlab集群版,分布式Matlab计算集群建立方法与Demo