除了我们经常用的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
请按任意键继续. . .
*/