《编程珠玑》第四章 习题6 一个模拟程序

        这是一道“咖啡罐问题”,一个盛装一些黑豆和白豆的咖啡罐,然后重复一下过程,直到罐中只剩下一粒豆子为止:
        随机从罐中选择两粒豆子。如果他们的颜色相同,就将它们都扔掉,并且在罐中放入一粒额外的黑豆。如果他们的颜色既有白色也有黑色,则将白豆返回罐中,同时扔掉黑豆。我们可以很容易的证明最后罐中会剩下一粒豆子,因为每次我们都会从罐中取走一粒种子。仔细观察,我们发现,每次操作相当于两种操作:1、取出两粒白豆 2、取出一粒白豆。由此可见,当白豆原有奇数时,最后剩下的就是白豆。偶数的话,剩下的就是黑豆。
        写了一个模拟程序,给定豆子数以及白色豆子的个数,随机取豆操作,直至剩下最后一粒豆子:
void WhiteBlack(int coffee[])
{
	//operation
    int col1,col2;
	while (!OnlyOne(coffee)) 
	{
		col1 = TakingOne(coffee);
		col2 = TakingOne(coffee);
		cout<<col1<<'\t'<<col2<<endl;
		if (col1 == col2) PutingInOne(coffee,2);  //the same color,put into a black one
		else PutingInOne(coffee,1);               //remain the white one
	}
	cout<<"ok"<<endl;
}

        TakingOne()和 PutingInOne()是随机选取豆子和放入豆子。OnlyOne()则是判断当前咖啡罐是否只剩下一个豆子。

        本章就到此结束,主要是对程序进行验证,写断言好像哈不太习惯,不过assert对程序的理解和维护都很重要的,自己都是些注释比较习惯。此外,花了大概一个小时写了一个二分查找程序,还好,程序没错,就是不够优美,把最后一次比较提取出判断了,导致程序代码重复,多写了5~6行冗余代码。对边界的把握还有待提高。

你可能感兴趣的:(编程)