头文件
#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平台运行。