C++ 调用windows系统DOS命令的函数 system(char* command)

除了我们经常用的system("pause");暂停命令外,还有以下这些功能也很不错:

system("title C++颜色设置程序"); //设置控制台窗口的标题,即cmd.exe的标题

system("mode con cols=48 lines=25"); //设置窗口宽度高度

system("date /t");  //显示日期

system("time /t");  //显示时间

system("shutdown -s -t 3600");  //延时关机  3600秒即一小时后关机

system("shutdown -a");  //取消延时关机

system("color 0B");  //设置文本和背景颜色

当然基本上所有的DOS命令当能被system()调用,下面主要说一下color命令的颜色设置,一共有16种颜色,编号0~15,由十六进制的0~F来指定。

E:\>color /?
设置默认的控制台前景和背景颜色。

COLOR [attr]

  attr        指定控制台输出的颜色属性

颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:

    0 = 黑色       8 = 灰色
    1 = 蓝色       9 = 淡蓝色
    2 = 绿色       A = 淡绿色
    3 = 浅绿色     B = 淡浅绿色
    4 = 红色       C = 淡红色
    5 = 紫色       D = 淡紫色
    6 = 黄色       E = 淡黄色
    7 = 白色       F = 亮白色

如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台窗口、/T 命令行开关或
DefaultColor 注册表值。

如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令
会将 ERRORLEVEL 设置为 1。

例如: "COLOR fc" 在亮白色上产生亮红色

E:\>

写一个遍历所有颜色的程序:

#include <iostream>
#include <ctime>
#include <iomanip>
#include <windows.h> 
 
using namespace std;

int main(void)
{
	char Color[9]="color ";

	for (int i=0;i<16;i++){
		for(int j=0;j<16;j++){
			Color[6]=(i>9?i-10:i)+(i>9?'A':'0');
			Color[7]=(j>9?j-10:j)+(j>9?'A':'0');
			system(Color);
			cout<<setw(4)<<(j|(i*16));
		}
		cout<<endl; 
	}
	system("color 0F");
	
 	return 0;
}

运行中间过程:

自定义函数systemColor(),color参数用两个10进制数代替:

#include <iostream>
#include <ctime>
#include <iomanip>
#include <windows.h> 
 
using namespace std;

void systemColor(unsigned short forecolor=15, unsigned short bgcolor=0)
{
	char Color[9]="color ";
	int i=bgcolor%16;
	int j=forecolor%16;
	Color[6]=(i>9?i-10:i)+(i>9?'A':'0');
	Color[7]=(j>9?j-10:j)+(j>9?'A':'0');
	system(Color);
}

int main(void)
{
	systemColor(14,1);  
	cout<<"title C++颜色设置程序"<<endl;
	
	return 0;
}

缺点:颜色设置范围是整个控制台窗口并非是指定输出文本,而且如果循环中多次调用运行速度偏慢。

设置文本颜色属性的优化

使用<windows.h>库函数SetConsoleTextAttribute()优化一下,定义函数用以设置控制台文本颜色属性,顺带引进一个设置光标位置的函数SetConsoleCursorPosition()。

SetConsoleTextAttribute()的颜色参数只用BLUE GREEN RED三原色,还有是否高亮INTENSITY,相当于三原色通过或运算来合成16种颜色的编号。这种配色方案记忆起来比较繁琐,还是用systemcolor的方法,用两个10进制数代替编号比较方便。

#include <iostream>
#include <ctime>
#include <iomanip>
#include <windows.h> 
 
using namespace std;

void setColor(unsigned short foreColor=15,unsigned short bgColor=0) 
{	//设置输出文本的前景色和背景色 
	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hConsole, (foreColor%16)|((bgColor%16)*16));
}

void gotoXY(unsigned short x, unsigned short y)
{	//设置光标位置,坐标从左上角(0,0)起始 
    COORD position;
    position.X = x;
    position.Y = y;
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hConsole, position);
}

int main(void)
{
	SetConsoleTitle("程序执行时控制台的标题");  //相当于system("程序执行时控制台的标题"); 
	for (int i=0;i<16;i++){
		for(int j=0;j<16;j++){
			gotoXY(j*4,i);
			setColor(i,j);
			cout<<setw(4)<<(j|(i*16));
		}
	cout<<endl; 
	}
	setColor();
 	return 0;
}

 运行结果如下:

颜色编号的或运算

前景色背景色各16种,相互叠加一共256种颜色搭配方案。前、背景颜色是通过按位或 “|” 运算求得的,背景色前景色编号都是0~15,对应4位的二进制数0000~1111,所以背景色编号需要乘以16,成为8位的二进制数。比如 setColor(14,1),14=1110,14*16=1110 0000,相当于背景色移到高四位而低四位全为0,前景色不变它的高四位全为0。这样处理后变成2个8位二进制数按位求或:1110 0000 | 0000 0001 = 1110 0001,结果为225。与上面的颜色表截图对比,225代表蓝色背景淡黄色前景。

位运算符

位运算除了或运算 |,还有:与运算 &、异或 ^ 、求反 ~、右位移 >>、左位移 <<

异或 ^ ,两数对应位上相反为真,相同为假。 总有:a^0=a, a^b^b=a  ==>对调两数: int x=1,y=2; y=x^y; x=x^y; y=x^y; 注意大数的溢出

右位移 >> 一个数每右移一位相当于被整除2; 左位移 >> 每左移一位相当于乘以2,注意有溢出另算。

<<=    左移且赋值运算符    C <<= 2 等同于 C = C << 2
>>=    右移且赋值运算符    C >>= 2 等同于 C = C >> 2
|=       按位或且赋值运算符    C |= 2 等同于 C = C | 2
&=     按位与且赋值运算符    C &= 2 等同于 C = C & 2
^=      按位异或且赋值运算符    C ^= 2 等同于 C = C ^ 2
注意:没有~=

#include <iostream>
using namespace std;

int main(void)
{
	int i=25;  // 0001 1001 
	int j=12;  // 0000 1100 
	cout << (i|j) <<endl;  //或运算:0001 1101 = 29 
	cout << (i&j) <<endl;  //与运算:0000 1000 = 8 
	cout << (i^j) <<endl;  //异或运算: 0001 0101 = 21 
	cout << (i<<3) <<endl; //向左移3位: 1100 1000 = 200
	cout << (i>>2) <<endl; //向右移2位: 0000 0110 = 6
	cout << (~i) <<endl;   //求反运算: 整数共32位,后8位:1110 0110
	//计算机中整型数是以32位二进制补码形式存储的,补码等于反码+1。
	//求反把最高的符号位也反了,所以不论正负都有整数n求反:~n=-(n+1)
	
	return 0;
}

/*
运算结果:
 
29
8
21
200
6
-26

--------------------------------
Process exited after 1.833 seconds with return value 0
请按任意键继续. . .
*/

 

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hann Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值