《2017年11月20日》【连续041天】
标题:熄灯问题的程序和构造函数的学习;
内容:A.观看MOOC(三)2.2;
B.a.昨天的程序经过排查,发现一个++i写成了+i;此解法重点运用了位运算来优化程序;
int GetBit(char c,int i){
return(c>>i)& 1;
}
void SetBit(char& c,int i,int v){
if(v) c |=(1<<i);
else c&= ~(1<<i);
}
void Flip(char&c,int i){
c ^=(1<<i);
}
void OutputResult(int t,char result[])
{
cout<<"PUZZLE #"<<t<<endl;
for(int i=0;i<5;++i){
for(int j=0;j<6;++j){
cout<<GetBit(result[i],j);
if(j<5)
cout<<" ";
}cout<<endl;
}
}
int main()
{
char oriLights[5];
char lights[5];
char result[5];
char switchs;
int T;
cin>>T;
for(int t=1; t<=T;++t){
memset(oriLights,0,sizeof(oriLights));
for(int i=0;i<5;i++){
for(int j=0;j<6;++j){
int s;
cin>>s;
SetBit(oriLights[i],j,s);
}
}
for(int n=0;n<64;++n){
memcpy(lights,oriLights,sizeof(oriLights));
switchs =n;
for (int i=0;i<5;++i){
result[i]=switchs;
for(int j=0;j<6;++j){
if(GetBit(switchs,j)){
if(j>0) Flip(lights[i],j-1);
Flip(lights[i],j);
if(j<5)Flip(lights[i],j+1);
}
}
if(i<4)
lights[i+1]^=switchs;
switchs=lights[i];
}
if(lights[4]==0){
OutputResult(t,result);
break;
}
}
}
return 0;
}
(b).构造函数(Constructor)
成员函数的一种,可以有参数,不能有返回值(void也不行)
作用是对对象进行初始化;
如果定义类时没写构造函数,则编译器自动生成一个默认的无参数构造函数;此函数不足任何操作;
一个类可以有多个构造函数;
class Complex{private: double real,imag; public: Complex(double r,double i=0);};
Complex::Complex(double r,double i){real = r; imag=i;}
Complex c1; //error,缺参数
Complex*pc=new Complexl //error,同上;
Complex c1(2); //OK Complex c1(2,4),c2(3,5);
多个构造函数,参数个数或 类型不同(类似于重载函数);
构造函数最好是public;
class Test{public: Test(int n){ } //(1) Test(int n,int m){ } //(2) Test() { } //(3)};
Test array1[3]={1,Test(1,2)}; //3个元素,分别用(1)(2)(3)初始化;
Test array2[3]={Test(2,3),Test(1,2),1}; //3个元素分别用(2)(2)(1)初始化;
Test *pArray[3]={new Test(4),new Test(1,2)}; //2个元素分别用(1)(2)初始化;
明日计划:学习复制构造函数;