资源下载地址:https://download.csdn.net/download/sheziqiong/85788384
资源下载地址:https://download.csdn.net/download/sheziqiong/85788384
新冠的传染性很强,随着一系列防控措施的落实,疫情也在不断变化。我们小组的目标就是通过制作一个模拟疫情扩散与防控程序,在思考疫情如何扩散的同时,加强我们对 C++ 面向对象的程序设计方法的认识,锻炼我们的建模能力、编程能力和自主学习能力。
项目的最主要功能是模拟疫情扩散。在开始模拟前,用户可以选择两种疫情防控模式,分别为默认天数改变防控模式和在模拟过程中防控模式,两种防控模式的具体实现如下表。
| 天数小于 15 | 天数小于 25 | 天数大于 25 |
|---|---|---|
| 人员流动意向强,不戴口罩,初始床位 20 | 人员流动意向中,戴口罩,床位 20 | 人员流动意向弱,戴口罩,床位 40 |
表 1.1
| 初级防控 | 人员流动意向强,不戴口罩,床位 20 |
|---|---|
| 中级防控 | 人员流动意向中,戴口罩,床位 20 |
| 高级防控 | 人员流动意向弱,戴口罩,医院床位增至 40 |
表 1.2
| 构建 person 类;实现在模拟过程中自行调整防控模式;实现图片背景的设置;构建密码系统,输入的密码自动变成*;利用 EasyX 库实现输入的同时输出输入内容;整合修改调试 | |
|---|---|
| 构建 city 类基本参数;默认天数改变人员流动意向,戴口罩,床位等情况;循环记录各种状态人数 | |
| 清屏,刷新城市;对人员分布进行正态分布;根据状态用颜色表示人;判断新一轮感染,改变人身体状况为潜伏期 | |
| 根据状况修改感染时间、床位、健康状况等;根据条件判断治愈并修改床位、身体健康等;绘制进度条,床位剩余一半时为黄色,0 时为红色 |
表 1.3
项目的主要功能包括调整疫情防控模式,判断人的状态为 orig(初始),shad(潜伏期),affe(已确诊),cure(已治愈),die(已死亡),循环记录每种状态的的人数并输出疫情现状参数,判断疫情是否结束,实时更新疫情,正态分布,判断新一轮感染,根据人的状态和床位等参数修改疫情参数,用进度条表示模拟进程等等。项目的最主要功能是模拟疫情扩散与防控。
主要分为 3 个模块,分别为 person 类、city 类、以及 main 函数。

首先枚举人的健康情况 person_condition { orig, shad, affe, cure, die }以及人的年龄分布 person_age { teenager, young_adult, middle_adult, old_adult, s_old_adult };然后在构造函数的函数体中使用 srand 函数产生 1-10000 的随机数,并用 if 选择结构确定各年龄段的人数为 25%、20%、25%、20%、10%;然后通过 change 系列的函数分别实现设置人是否在医院、是否戴口罩、改变人的身体健康状况、将未感染者感染成潜伏期;通过 set_poisition 函数设置 x,y 的坐标,并通过 show 函数返回 x,y 的坐标;通过 set_if_underhospital 和 cur_if_underhospital 函数来可写以及可读人在是否在医院;通过 set_mask 和 cur_mask 函数来可写和可读戴口罩情况;通过 cur_body_conditon 函数返回人的身体健康情况;将每个人的初始感染情况均设置为 orig。
首先设置输出屏幕的长为 1080,宽为 720,总人口为 3000。在 dist 函数内应用 abs 和 pow 函数来返回两点间的距离;定义 bool 类型的 chance 函数,使用 srand 函数,实现由 x 概率发生的功能;在 day_change_info 函数内部通过 if 选择结构默认天数变化时人员流动意向和戴口罩的情况;在 record 函数,通过 for 循环和 switch 分支结构来记录各个阶段的人数;在 output_words 函数中,通过_stprintf_s 和 outtextxy 输出天数、确诊、治愈、死亡人数、城市人数和医院剩余床位数,通过 if 选择结构输出人员流动意向及防控等级和戴口罩情况;在判断疫情是否结束的 bool 类型的函数 over 中,如果 shad+affe=0,则清屏之后输出疫情结束,如果 orig+shad=0,在清屏之后输出城市沦陷;在 set_index 函数中,通过 for 循环设置数组 Person[i]的元素编号;在 first_affe 函数,通过 for 循环改变人员 person_condition;来对 original_count 人进行初始感染;通过 refresh_city 函数对各类健康情况人数赋值为 0;在 first_move 函数中通过 for 循环、if 选择结构和 do while 循环实现人员的初始移动;在 move 函数中,使用 for 循环、if 选择结构和 do while 循环和 rand 函数来确保每个人只能在原先位置的附近 6 个坐标内移动,从而实现正态分布;在 print_hospital 函数中,运用 setlinecolor 函数和 if 选择结构打印出进度条;在 new_broad 函数中,对于是否戴口罩以及目前的感染情况等进行判断,从而实现新一轮的传播;在 print_person 函数中,首先通过 cleardevice 函数清空之前的操作,然后通过 if 选择结构和 switch 分支结构将各类人员打印出来;在 add_affe_time 函数,通过自增更新感染时间;在 into_hospital 函数中,通过 if 结构判断是否满足条件来更新医院治疗人数使满足条件的人进入医院治疗;通过 change_affe 函数使感染时间达 8 天的 shad 转化为 affe;通过 change_die 和 change_cure 函数判断是否死亡和治愈,并更新各类型的人数;通过返回值为 bool 类型的 check_pos 函数来检查坐标是否在 720*720 的城市里;通过 reset 函数重置各个参数;在疫情模拟主函数 load 中,使用 while(1)无限循环,只有输入 0 时才 break 退出循环,利用 cleardevice 清屏,利用 if 选择结构和 outtextxy 输出各类信息;在 day_load 函数中,调用 cleardevice()、reset()、set_index()、first_affe()、first_move()和 outtextxy 默认天数来自行更改等级;在 control_load 函数中,除调用 day_load 函数中的各函数之外,还使用_getch()实现输入 W 键提升防控等级,按其他键暂停的功能。
首先建立一个 City 类的对象 false_city 作为城市,然后通过 set_graph 函数设置窗口大小 背景颜色;然后通过 for 循环和 if 选择结构,调用 input()、show_bk()、show_time()、draw_title()等函数来确保有三次输入密码的机会,三次都输入错误后,显示“您输入错误已三次,无权使用该程序,程序将自动退出。”和“正在退出···”。在 reset_text 函数中,调用 settextcolor 和 settextstyle 函数来重新设置字体颜色和格式;在 show_time 函数中调用 outtextxy 和_stprintf_s 函数在指定位置输出 WHU 和日期;在 draw_title 函数中调用 reset_text、settextstyle 和 outtextxy 函数绘画出标题“计算机模拟疫情扩散”;通过 set_graph 函数设置窗口大小和背景颜色;在 show_bk 函数中,通过 loadimage 和 putimage 函数设置图片背景;在 input 函数中调用 show_bk()、show_time()、draw_title()、reset_text()、outtextxy 函数和 while 循环以及 if 选择结构来实现将输入的内容实时绘制在画布中;最后,在 success 函数中,通过再次调用 show_bk()、show_time()、draw_title()、reset_text()、outtextxy 函数和城市对象 false_city 的 load()函数实现疫情模拟,在模拟完成之后调用 closegraph()函数关闭窗口,结束模拟。
Person 类中构建了两个枚举类型的变量,人的健康情况 person_condition { orig, shad, affe, cure, die }以及人的年龄分布 person_age { teenager, young_adult, middle_adult, old_adult, s_old_adult }。然后在构造函数中利用 rand 产生随机数使得不同的人分布在不同的年龄段(年龄分布参照网上数据)。建立功能函数控制 Person 类中的私有成员变量可读可写的权限。
City类中使用了EasyX库,添加了<easyx.h><conio.h><graphics.h>三个绘图的头文件,并使用了该库中的多种函数实现批量的绘图。使用随机数引擎中的normal_distribution实现对人口的正态分布。利用循环和_getch()和_kbhit()实现对键盘输入的随时接收。不同年龄段的死亡率和防控措施参照现实中的数据。
Main中添加了<atltime.h>使用CTime类来获取系统时间。自己构思算法构建密码系统并利用EasyX库实现输入的同时输出输入内容。利用EasyX库中函数导入图片,并设置为背景。
对于初学 C++ 的我们小组成员,该小项目难度适中,比较适合我们完成大作业的同时学习理解新知识。
具体代码行数为 1092,代码量适中。
亮点:密码系统的构建;使用绘图库实现输入的同时输出输入内容;界面美观,用户体验较为良好;模拟过程清晰直观,不同身体状况的人易区别,并且程序可暂停。
收获:在初学 C++ 的一个学期后,我们完成了 C++ 大作业,尝试编写一个比较复杂的程序。在近两周的时间里,我们同组的同学共同的感受是:C++ 大作业和平时上课所接触的程序是有很大不同的,所经受的考验和克服的困难是平时所无法比拟的。好在同组的搭档们精诚合作,分工明确,有问题共同解决,攻克了计算机模拟疫情扩散这个复杂的程序。这使得我们对 C++ 有了一个更深的了解认识,对面向对象程序设计的思想有了更清晰的了解,这个学期学的知识也得到巩固。不过,我们也认识到自己还有很多的知识没学好,基础知识没理清,遇到一些小错误就会烦躁不安,以后要克服,尽量保持一颗良好的心态。





资源下载地址:https://download.csdn.net/download/sheziqiong/85788384
资源下载地址:https://download.csdn.net/download/sheziqiong/85788384