c++程序课设之模拟养猪
题目:
小明开了个养猪场,一共有100个猪圈(按照0-99编号),每个猪圈最多养10头猪(按照0到9编号),猪一共有三个品种:黑猪、小花猪和大花白猪,其中黑猪不能与其他两种猪放在一个猪圈里,会打架。规定每3个月,养猪场要出圈一批猪,包括:体重超过150斤的和饲养超过1年的;同时补充一批猪崽儿(猪的品种、数量录入或者选择随机生成)。试利用随机数方法构造猪崽儿的初始体重等信息(20-50kg),利用随机数方法按照秒或次数刷新每头猪随时间的体重增长函数(一秒/一次表示一天,一天增重0.0 ~1.2kg)。试利用结构体链表形式管理猪圈的猪,为新进的猪自动分配猪圈(要求猪均匀分布在各个猪圈中),自动统计本次出圈的猪的总体售价(黑猪15元一斤,小花猪7元一斤,大花白猪6元一斤);(到此60起评)
(1)可任意查询当前某一猪圈的猪的数量和种类;
(2)可任意查询当前某一猪圈某头猪的状态信息;
(3)可任意统计当前猪场每个品种猪的数量和体重、饲养时间分布情况;(到此70起评)
(4)可任意查询近5年猪的销售记录和猪崽儿的购入记录(记录用文件形式存储);
(5)所有当前猪的信息使用文件形式保存,程序再启动时,自动读取养猪场信息并显示。(到此75起评)
(6)模拟养猪场某一只猪得了猪瘟,猪瘟的扩展几率是,同一个猪圈的猪每天被传染几率是50%,相邻猪圈的猪每天被传染的几率是15%,不相邻的猪圈的猪不传染。编写程序模拟多久后养猪场的猪死光光。
(7)当发现有猪得了猪瘟已经发病后,请采取合理的隔离措施,进行风险控制。
(到此80起评)
提高部分:(1)可使用MFC 或者QT等IDE设计用户界面;(2)显示每个品种猪的数量和体重、饲养时间分布图;(3)可根据自己的理解,加入功能(比如转换为一个养猪游戏)。(到此90起评)
这道题目重点是考察学生对链表相对应的制作管理,以及C++基础知识的考察,QT应用程序应用的考察。
解这道题的核心思路就是,存在一百个猪圈,猪圈内的猪形成了一个链表,购猪卖猪即在链表内增加或移除成员,之后就是相关分猪方法以及各功能实现,界面优化了。方法多样,我只在这阐述我自己的方法(比较冗杂)
当同时要分黑猪与花猪(小花猪和大花白猪都视为花猪)到猪圈中时,
优先将黑猪挤满一个猪圈,这样就有最大数量的猪圈去装花猪,
因为黑猪不能与花猪同装一个猪圈。
具体分法是
先得到要分的花猪数量,在已有或空的猪圈内平均分配
然后进行黑猪的分配:
如果猪场中存在空的黑猪猪圈,优先往黑猪最少的猪圈中分黑猪
如果没有黑猪猪圈,则需要占用一个空的或者已经有花猪的猪圈来存放黑猪
已有花猪的话则需要将圈内花猪均分到其他猪圈中
具体代码如下:
void Widget::addblackpig()
{
mixblack_index = 0;
while(num0)
{
//判断是否有空的黑猪圈
bool temp_judge = 0;
for(int i =0 ;i<100;i++)
{
if(pigpen[i].judge_black == true && pigpen[i].sum < 10)
{
mixblack_index = i;
temp_judge = true;
break;
}
}
if(temp_judge == true)
{
for(int i = 0;i < 100; i++)
{
if(pigpen[i].judge_black == true && pigpen[i].sum < pigpen[mixblack_index].sum)
{
mixblack_index = i;
}
}
addpig(mixblack_index,0);
num0--;
}
else
{
for(int i =0 ;i<100;i++)
{
if(pigpen[i].judge_black == false )
{
mixflower_index = i;
break;
}
}
for(int i = 0;i < 100 ; i++)
{
if(pigpen[i].judge_black == false && pigpen[i].sum < pigpen[mixflower_index].sum)
{
mixflower_index = i;
}
}
if(pigpen[mixflower_index].start != NULL) movepig(mixflower_index);
pigpen[mixflower_index].judge_black = true;
addpig(mixflower_index,0);
num0--;
}
mixblack_index = 0;
mixflower_index = 0;
}
return;
}
void Widget::addflowerpig()
{
mixflower_index = 0;
while(num1)
{
for(int i =0 ;i<100;i++)
{
if(pigpen[i].judge_black == false)
{
mixflower_index = i;
break;
}
}
for(int i = 0;i < 100 ;i ++)
{
if(pigpen[i].judge_black == false && pigpen[i].sum < pigpen[mixflower_index].sum)
{
mixflower_index = i;
}
}
addpig(mixflower_index,1);
num1--;
mixflower_index = 0;
}
while(num2)
{
for(int i =0 ;i<100;i++)
{
if(pigpen[i].judge_black == false)
{
mixflower_index = i;
break;
}
}
for(int i = 0;i < 100 ; i++)
{
if(pigpen[i].judge_black == false && pigpen[i].sum < pigpen[mixflower_index].sum)
{
mixflower_index = i;
}
}
addpig(mixflower_index,2);
num2--;
mixflower_index = 0;
}
return;
}
void Widget::addpig(int i,int s)
{
if(pigpen