第三章 花式玩盒子
第三章 花式玩盒子
一个盒子还能怎么玩?
红富士苹果的重量一般是180克到200克。能进入榨汁生产线的苹果也是设定在这个范围中间,太大了卡主机器,太小了一刀削没了。
前面第二章的所有的程序语句都是顺序执行的,即使给了不合格的苹果,照样会继续在流水线上处理。为何不给流水线加个称呢,质量不达标的扔掉就行。
这就涉及到决策,有条件地执行某些代码块,实现程序逻辑。
决策结构 if...else
if 语句计算条件,如果条件为 true,则执行代码块。
// 红富士最大合格重量200克
int applemax = 200;
// 最小合格重量180克
int applemin = 180;
// 一个苹果,重30克
int apple = 100;
if (apple < applemin)
{
// 苹果的质量为100,小于最小合格质量180克
// apple < applemin的判断结果为不符合
// 判断结果的布尔值为真,即true,执行下面的语句
Console.WriteLine("苹果太小,要扔掉");
}
// 再来一个苹果
int apple2 = 190;
if (apple2 < applemin)
{
// 苹果2的重量为190克,大于最小重量
// 上述判断结果为假,即flase,不执行下面的语句
// 所以这里没有输出结果
Console.WriteLine("苹果太小,要扔掉");
}
上述程序的第二个苹果明明符合条件,为什么没结果呢?符合条件的苹果当然是要放入生产线的。既然是决策结构,那就要做好程序的分支,如果条件成立,则做什么,否则,要做什么。这就是分支。完善一下上面的程序。
加上分支语句else,else 语句提供了在 if 语句中的条件为 false 时要执行的代码块。
int applemax = 200, applemin = 180;
int apple3 = 230;
if (apple3 < applemin)
{
Console.WriteLine("苹果太小,要扔掉");
}
else
{
// 苹果3的重量为190克,大于最小重量
// 上述判断结果为假,即flase,不执行上面的语句
// 执行下面的语句
Console.WriteLine("苹果符合最小重量,放入流水线");
}
看到了没,苹果符合最小重量,放入流水线。放屁,那么大的苹果,会把机器卡主的。怎么办?那就再加一个称,让苹果的重量也符合最大合格重量。
加上分支判断else if 语句,将多个条件链接在一起,判断多个条件。
int applemax = 200, applemin = 180;
int apple4 = 190;
if (apple4 < applemin)
{
Console.WriteLine("苹果太小,要扔掉");
}
else if (apple4 > applemax)
{
Console.WriteLine("苹果太大,要扔掉");
}
else
{
Console.WriteLine("苹果大小符合要求,放入流水线");
}
循环结构
1. for循环
if...else可以将多个条件链接在一起,直到符合要求才执行后续程序。比如苹果削皮,皮是红色的,果肉是白色的,让削皮机器看到红色的就砍一刀,直到所有的红色全部消失,才算是削完皮。
一个苹果那么大,一刀砍下去那么小,削完一个苹果皮的程序,岂不是要写满屏的if...else判断?NO NO NO,重复的事情交给计算机去做,计算机擅长做这个。反复削苹果皮,直到红色的苹果皮消失,这个动作过程就是循环。
当事先知道迭代次数时,使用 for 循环。它由三个部分组成:初始化、条件和迭代。
根据削皮刀刀片大小计算,每一颗苹果皮可以分割为100块红颜色区域,机器要挥刀100次,才能把苹果削完。
int redcolor = 100;
for(int i =1;i<=100; i++)
{
Console.WriteLine($"砍下第{i}刀,还剩下{100 - i}刀");
// 一个=号是赋值,两个==号是判断
if (i == 100)
{
Console.WriteLine("已经砍下100刀,削完苹果皮,交给下一个机器处理");
}
}
for循环的第一个条件是初始条件。初始条件是一个临时的变量i ,表示砍下第一刀时,执行的程序,自然,程序的输出结果是“砍下第一刀,还剩下99刀”,显然是还没削完,那就继续砍下第二刀。
for循环的第三个条件是计数器。砍下第二刀的过程就是重复第一次的过程,计算机也不是智障,每做一遍,计数器会帮它记着+1。
for循环的第二个条件是计数次数。削皮刀也不会无限制的砍下去,否则就变成了死循环。
做个题吧!有趣的数学故事:把1到100的整数写下来,然后把它们加起来,和是多少?天才数学家高斯利用数字的对称性,很快就算出来结果是5050。交给计算机来算,是一个怎样的计算方法呢?
思路:第一个数字为1,1加到100要加100次,也就是初始条件为1,加的次数为100。我们拿来一个盒子,存放数值,还没开始加,所以这个数值是0。第一次执行程序时,我们把这个数值加1再放进这个盒子里,2比1多个1,3比2多个1,如此循环100次,自然是加到100了。最后输出结果即可。
int a = 0;
for(int i = 1; i <= 100; i++)
{
a =a+i;
}
Console.WriteLine(a);
2. foreach循环
前面给盒子升级成了箱子,介绍了数组,也介绍了列表(List
尝试使用for循环对数组的每一个元素进行处理。
string[] ABagOfApples = { "红富士A", "红富士B", "红富士C", "红富士D", "红富士E" };
for(int i = 0; i < ABagOfApples.Length; i++)
{
// 找出苹果,数组的起始元素标号为0,所以i最初定义为等于0
Console.WriteLine(ABagOfApples[i]);
// 给苹果削皮
Console.WriteLine(ABagOfApples[i]+"已削皮");
}
如此简单,我们已经利用循环,对一堆盒子里的苹果进行了批量处理。
对于列表和字典,for循环已经不适用。我们把盒子升级到箱子,同样,也可以加强一下for循环,因为列表和字典属于OOP编程中的对象,其中的元素属于对象的属性值,自然要使用foreach这种高级一点的方式才能处理。
List<string> storage = new List<string> { "红富士A", "红富士B", "红富士C", "红富士D", "红富士E" };
foreach(string storageItem in storage)
{
Console.WriteLine(storageItem);
}
Dictionary<string, int> apples = new Dictionary<string, int> { { "红富士A", 200 }, { "红富士B", 180 }, { "红富士C", 190 } };
foreach (var apple in apples)
{
Console.WriteLine(apple);
Console.WriteLine($"苹果: {apple.Key},重量是: {apple.Value}");
}

浙公网安备 33010602011771号