c++中如何实现按键操作

文章介绍了C++中conio.h头文件及其提供的getch(),getche(),kbhit(),clrscr()等函数在控制台计算器中的应用,包括基本输入、输出操作和异常处理。
摘要由CSDN通过智能技术生成

头文件

#include<conio.h>

        conio.h 头文件是 C 和 C++ 语言中一个可选的标准头文件,它主要在控制台环境中提供了一些常用的函数。 它的名称来源于“console input/output”,即控制台输入/输出。

        该头文件通常在 Windows 中经常被使用,但在其他平台上可能不支持或不可用。 它定义了一些用于控制台输入和输出的函数,例如getch()getche()kbhit()clrscr()等。 这些函数可以用来实现一些简单的交互式控制台程序,如游戏等。

getch()函数

getch()是C语言的一个函数,用于获取用户输入的字符,包括特殊字符和非可见字符。该函数从键盘缓冲区读取一个字符,不需要等待用户按下回车键。常常被用于游戏开发和控制台程序中。

getche()函数

getche()是C语言的一个函数,和getch()类似,用于从键盘读取用户输入的字符,但是它会把读取到的字符直接输出到显示器上。这个函数会在用户按下键之后立即读取并显示输入的字符,不需要等待用户按下回车键。常用于密码输入或者用户输入时需要直接显示输入字符的场景。

kbhit()函数

kbhit()函数用于判断键盘是否有输入,如果有,则返回一个非零值,否则返回零。如果程序在等待键盘输入时需要执行其他的操作,可以使用这个函数来判断是否有键盘输入。

clrscr()函数

clrscr()是C语言中的一个函数,用于清空屏幕。当程序需要清空控制台屏幕时,可以使用这个函数来实现。该函数常用于控制台程序或游戏开发中。

光说无用,实战走起:

核心部分在switch循环选择功能中

//头文件
#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>

//命名空间
using namespace std;


void name()
{
	system("title ●计算器●");
 	Sleep(100);
	system("title 计算器");
}

void name_error()
{
	system("title !计算器!");
	Sleep(100);
	system("title 计算器");
}

//浮点型转字符串
string f_s(long double Num)
{
	ostringstream oss;
    oss<<Num;
    string str(oss.str());
    return str;
}

//goto_()函数
void goto_(short x,short y)
{
	HANDLE hOutput;
	COORD loc;
	loc.X=x;
	loc.Y=y;
	hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOutput,loc);
}

//隐藏光标
void hide_cursor()
{
	CONSOLE_CURSOR_INFO cur={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);
}

//显示光标
void show_cursor()
{
	CONSOLE_CURSOR_INFO cur={1,1};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);
}

void copy_(const string& text)
{
    //打开剪切板
    if (!OpenClipboard(NULL))
    {
        return;
    }

    //清空剪切板内容
    EmptyClipboard();

    //分配内存并复制字符串到剪切板
    const char*char_text=text.c_str();
    HGLOBAL hMem=GlobalAlloc(GMEM_MOVEABLE,strlen(char_text)+1);
    if(hMem!=NULL)
    {
        char*mem_text=static_cast<char*>(GlobalLock(hMem));
        if(mem_text!=NULL)
        {
            strcpy_s(mem_text,strlen(char_text)+1,char_text);
            GlobalUnlock(hMem);
            SetClipboardData(CF_TEXT,hMem);
        }
        else
        {
            GlobalFree(hMem);
        }
    }

    //关闭剪切板
    CloseClipboard();
}

//阶乘函数
unsigned long long fact(short val)
{
	//局部变量
	unsigned long long int ret = 1;
	while(val > 1)
	{
	    ret *= val--;
	}
	//返回结果
  	return ret;
}

//次方根函数
long double root(long double x,long double y)
{
	long double z;
	z=pow(x,1/y);
	return z;
}

//复制得数
void _copy_(long double z)
{
	system("title 计算器");
	cout<<endl<<"复制:0  继续:任意";
	hide_cursor();
    switch(_getch())
    {
    	case'0':
			copy_(f_s(z));
			cout<<endl<<"!:复制成功"<<endl;
        	break;
		default:
			cout<<endl;
			break;
    }
    show_cursor();
}

//结果正常
void over()
{
	cout<<"\a";
	name();
}

//结果异常
void over_error()
{
	cout<<"\a";
	name_error();
}

//输入流异常
void cin_error()
{
	cout<<"!:输入错误"<<endl;
	cin.clear();
	cin.ignore();
	over_error();
}

//主函数
int main()
{

	//切换输入法
	keybd_event(160,0,0,0);
	keybd_event(160,0,KEYEVENTF_KEYUP,0);

	//窗口命名
	system("title 计算器");

    //浮点数设置
 	cout<<setprecision(19);

 	//定义变量
	long double x/*操作数1*/ , y/*操作数2*/ , z/*得数*/;
	char mod/*运算模式*/ ;

	//π值
	long double pi[18]
	={
		3,3.1,
		3.14,3.141,
		3.1415,3.14159,
		3.141592,3.1415926,
		3.14159265,3.141592653,
		3.1415926535,3.14159265358,
		3.141592653589,3.1415926535897,
		3.14159265358979,3.141592653589793,
		3.1415926535897932,3.14159265358979323
	};
	
	//计数
	unsigned long long time=1;
	
	//换页
	string line="\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";

	//计算器
	for(;;++time)
	{

  		//换页
		if(time%5==0)
		{
			cout<<line;
			//文本光标移动到页首
			goto_(0,0);
		}

		//提示
		cout<<endl<<time<<". 1:+  2:-  3:×  4:÷  5:mod  6:y√(x) 7:!n  8:x^y  9:π  0:清屏"<<endl<<endl;

		//输入x
		cin>>x;
		if(cin.fail())
		{
			cin_error();
			continue;
		}

		//选择模式
		switch(mod=_getch())
		{
			case'1'://加法
				cout<<'+'<<endl;
				cin>>y;
				if(cin.fail())
				{
					cin_error();
					break;
				}
				z=x+y;
				cout<<x<<" + "<<y<<" = "<<z<<endl;
				over();
				_copy_(z);

				break;

			case'2'://减法
				cout<<'-'<<endl;
				cin>>y;
				if(cin.fail())
				{
					cin_error();
					break;
				}
				z=x-y;
				cout<<x<<" - "<<y<<" = "<<z<<endl;
				over();
				_copy_(z);

				break;

			case'3'://乘法
				cout<<"×"<<endl;
				cin>>y;
				if(cin.fail())
				{
					cin_error();
					break;
				}
				z=x*y;
				cout<<x<<" × "<<y<<" = "<<z<<endl;
				over();
				_copy_(z);

				break;

			case'4'://除法
				cout<<"÷"<<endl;
				cin>>y;
				if(cin.fail())
				{
					cin_error();
					break;
				}
				//特殊情况
				if(y==0)
				{
					cout<<"!:除数不能为0"<<endl;
					over_error();
				}
				//正常情况
				else
				{
					z=x/y;
					cout<<x<<" ÷ "<<y<<" = "<<z<<endl;
					over();
					_copy_(z);
				}

				break;

			case'5'://取模
				cout<<"mod"<<endl;
				cin>>y;
				if(cin.fail())
				{
					cin_error();
					break;
				}
	   			//特殊情况
	   			if(y==0)
	   			{
	   				cout<<"!:除数不能为0"<<endl;
	   				over_error();
	   			}
	   			//正常情况
	   			else
	   			{
	   				z=int(x)%int(y);
	   				cout<<int(x)<<" mod "<<int(y)<<" = "<<z<<endl;
	   				over();
	   				_copy_(z);
	   			}

				break;

			case'6'://"x"的"y"次方根
				cout<<"√"<<endl;
				cin>>y;
				if(cin.fail())
				{
					cin_error();
					break;
				}
				z=root(x,y);
				cout<<y<<"√("<<x<<") = "<<z<<endl;
				over();
				_copy_(z);

				break;

			case'7'://阶乘

				if(x<0)
				{
					cout<<"!:无效输入"<<endl;
					over_error();
				}
				else
				{
					z=fact(int(x));
					cout<<"fact ("<<int(x)<<") = "<<z<<endl;
					over();
					_copy_(z);
				}

				break;

			case'8'://"x"的"y"次方
				cout<<'^'<<endl;
				cin>>y;
				if(cin.fail())
				{
					cin_error();
					break;
				}
				//特殊情况
				if( x==0 && y<0 )
				{
					cout<<"!:无效输入"<<endl;
					over_error();
					break;
				}
				//正常情况
				else
				{
					z=pow(x,y);
					cout<<x<<" ^ "<<y<<" = "<<z<<endl;
					over();
					_copy_(z);
				}

				break;

			case'9'://复制π值

				//正常情况
				if(x<=19)
				{
					copy_(f_s(pi[short(x-1)]));
					cout<<"!:复制成功"<<endl;
					over();
				}
				//特殊情况
				else
				{
					copy_(f_s(pi[18]));
					cout<<"!:复制成功"<<endl;
					over();
				}

				break;

			case'0'://清除数据

				if ( x==0 )
				{
		   			time=0;
	 				system("cls");
					over();
				}
				//双保险
				if ( x!=0 )
				{
					cout<<"!:二次确认失败,请重试" <<endl;
					over_error();
				}

				break;

			default://判断模式输入对错

				cout<<"!:无效运算" <<endl;
				over_error();
		}
	}
}

以上是一个简单的计算器代码,仅支持在Windows平台运行。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值