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