c++模拟养猪

本文介绍了使用C++实现模拟养猪系统的过程,包括猪圈管理、猪的生长、销售记录、疾病传播模拟等功能。核心是利用链表管理猪圈内的猪,并通过随机数模拟体重增长和猪瘟扩散。此外,系统支持查询、统计和文件存储等功能,可以进一步扩展为图形用户界面和数据分析图表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值