人工智能编程实践:C++编程5级
上QQ阅读APP看书,第一时间看更新

1 解决“牛吃草”问题

1.1 学习目标

1. 理解计算机是用来计算的机器。

2. 利用C++语言编程解决简单问题。

1.2 情境导入

数学课上,老师布置了“牛吃草”问题:有一个牧场,牧场上的牧草每天都在匀速生长。这片牧场可以供21头牛吃8天或24头牛吃6天,那么可以供18头牛吃几天?

艾罗:小明,你知道如何计算吗?

小明:这还不简单,用总草量除以18头牛每天吃的草量就可以了。

艾罗:这样算可不对哦,因为草每天都在生长呀!

小明:那应该怎么计算呢?

艾罗:下面我们就来看看如何求解“牛吃草”问题。

这道数学题,我们可以人工计算求出结果。但如果题目中所给条件改变了,我们还要按照人工计算的方法重新计算,那么有没有其他可以解决此类问题的方法呢?

1.3 知识讲解

求解过程实际上就是计算。计算是生活中非常重要的事情,如果我们没有计算能力,买东西就不知道价钱,做事情也不知道需要多少时间,生活就会变得混乱。更重要的是,如果离开了计算,我们无法建造房屋、制造机器,人类社会就不能如此快速地发展。

很早以前,人们使用手指进行计算,但手指能够表示的数有限,于是人们发明了算筹、算盘等辅助计算的工具,但这些工具存在运算速度慢、运算位数少等缺陷。直到计算机出现才彻底改变了人们的计算方式。那么计算机如何理解我们的需求,又如何将计算的结果反馈给我们呢?这就是今天我们要学习的编程。

编程是指模拟计算机的思考方式,用计算机可以理解的语言(编程语言)给出指令,从而完成程序设计。但是,在教会计算机思考之前,我们首先要理解计算机是如何思考的,才能用计算机可以听懂的语言进行沟通。

1.4 实践任务

“牛吃草问题”的难点在于草每天都在生长,草的数量在不断变化。解决这类问题的关键是抓住“一变”和“两不变”,即草的总量发生变化,而每天草的新增数量和原有草的数量不变。

在“牛吃草问题”中,我们通常假设“草每天匀速生长,1头牛每天吃1份草”。同时,我们要清楚:每个单位时间内,“每天草的新增数量”是多少、“原有的草量”是多少。如果求时间,则把“牛”的数量分成两份,一份吃“原有的草量”,另一份吃“每天匀速生长出的草”。

【问题描述】有一个牧场,牧场上的牧草每天都在均匀生长。这片牧场可以供21头牛吃8天或24头牛吃6天,那么在牧场上放18头牛可以供它们吃多少天?

【输出】可供18头牛吃草的天数t

“牛吃草问题”的参考程序如下。

#include <iostream>

using namespace std;

int main ()

{

int s1,s2,s3,s4,t;

s1=21*8;

s2=24*6;

s3=(s1-s2)/(8-6); //每天新增的草量可供多少头牛吃

s4=21*8-s3*8; //原有的草量

t=s4/(18-s3); //可供牛吃的天数

cout<<"t:"<<t<<endl;

system("pause");

return 0;

}

程序的运行结果如图1-1所示。

图1-1 “牛吃草问题”程序的运行结果

1.5 思维拓展

【问题描述】这片牧场可以供cow1头牛吃day1天或cow2头牛吃day2天,求这片牧场可以供cow3头牛吃的天数day3。修改“实践任务”中的程序,实现用键盘输入条件求解“牛吃草”问题。

【输入】牛数cow1和天数day1、牛数cow2和天数day2以及需要求解的牛数cow3。

【输出】牛吃草的天数day3。

输入条件解决“牛吃草”问题的参考程序如下。

#include <iostream>

using namespace std;

int main ()

{

int cow1,cow2,cow3,day1,day2,day3;

long s1,s2,s3,s4,t;

cout<<"cow1:";

cin>>cow1;

cout<<"day1:";

cin>>day1;

cout<<"cow2:";

cin>>cow2;

cout<<"day2:";

cin>>day2;

cout<<"cow3:";

cin>>cow3;

s1=cow1*day1;

s2=cow2*day2;

s3=(s1-s2)/(day1-day2); //每天新增草量可供多少头牛吃

s4=cow1*day1-s3*day1; //原有草量

day3=s4/(cow3-s3);

cout<<"day3:"<<day3<<endl;

return 0;

}

按照原来的题目输入cow1、day1、cow2、day2、cow3,程序运行结果如图1-2所示。

图1-2 输入条件解决“牛吃草”问题程序的运行结果

1.6 巩固练习

1. 运行下列程序后,变量s的值是( )。

#include<iostream>

using namespace std;

int main()

{

int s,i,m,n;

i=1;

m=1;

n=1;

while(i<=5)

{

s=m+n;

m=n;

n=s;

i=i+1;

}

cout<<"s:"<<s<<endl;

system("pause");

return 0;

}

A.2

B.8

C.13

D.21

2. 某游乐场在营业前有400名游客排队。营业后,每分钟来的人数是固定的。一个入口每分钟可以进10名游客,开4个入口,20分钟后所有游客就可以全部入场。如果现在开6个入口,所有游客入场完毕需要多长时间?请编程实现。

1.7 自我评价