看到一位同学发布的博文,模拟了掷骰子。很好的题目,初学编程,就可以这样,找到一个很小,很好玩的需求去完成,这是未来做大项目的"引子".
他用代码实现了需求,这是最重要的。
我也按捺不住,给一个新的版本。目前,同学们习惯了面向过程的思维,只管着让程序按照流程做完事即可,对面向对象程序的结构还没有感觉。类的封装,该如何体现?函数的接口,怎样才算简洁?这些问题,用讲的方式起个头可以,更重要的是,在用的过程中得到领悟。
学生的程序是:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class shaizi
{
public:
void yaodian();
private:
int a;
};
int main()
{
cout 《 "摇出的点数" 《 endl;
shaizi s1;
s1.yaodian();
return 0;
}
void shaizi::yaodian()
{
int x;
srand(time(0));
x=rand()%5+1;
a=x;
cout《a;
}
我改写的程序是:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class shaizi
{
public:
int getdian();
private:
int dian;
};
int main()
{
shaizi s1;
cout 《 "摇出的点数" 《s1.getdian()《endl;
return 0;
}
int shaizi::getdian()
{
srand(time(0));
dian=rand()%6+1;
return dian;
}
这个程序的结构要好一些。输出的工作交给main,对象s1只管提供数就行了。
一个很简单的要求,输入输出尽可能交给测试函数,类只做围绕数据的处理工作。除非实在必要,不要在成员函数中用cin和cout.
学习了后面的构造函数,这个简单程序还可以别的改造。
再写了一个好玩的,希望用常量定下局数后,能够多轮决输赢。例如,下面的程序,想9局5胜。
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class shaizi
{
public:
void setdian();
int getdian();
private:
int dian;
};
const int round=9; //round必须置一个奇数
int main()
{
shaizi s1,s2;
int i=1,n1=0,n2=0;
while(i<=round)
{
s1.setdian();
s2.setdian();
cout《"第"《i《"轮: 甲 "《s1.getdian()《",乙: "《s2.getdian();
if(s1.getdian()>s2.getdian())
n1++;
else if (s2.getdian()>s1.getdian())
n2++;
else
{
cout《",平局重掷 ";
continue;
}
i++;
cout《endl;
if(n1==(round/2+1)||n2==(round/2+1))
break;
}