第三章 花式玩盒子

第三章 花式玩盒子

一个盒子还能怎么玩?
红富士苹果的重量一般是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)和字典(Dictionary<int, string>)。
尝试使用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}");
}
posted @ 2025-05-26 18:13  冲浪的奶糖  阅读(18)  评论(0)    收藏  举报