你的位置:首页 > ASP.net教程

[ASP.net教程]C#语句2——循环语句(for穷举、迭代和while循环)


一、for循环拥有两类:

(一)、穷举:

把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况。

1.单位给发了一张150元购物卡,拿着到超市买三类洗化用品。洗发水15元,香皂2元,牙刷5元。求刚好花完150元,有多少种买法,没种买法都是各买几样?

int ci = 0;

            int biao = 0;//标记变量

            for (int x = 0; x <= 10; x++)

            {

                for (int y = 0; y <= 30; y++)

                {

                    for (int z = 0; z <= 75; z++)

                    {

                        ci++;

                        if (15 * x + y * 5 + z * 2 == 150)

                        {

                            biao++;

                            Console.WriteLine("第{0}种买法:洗发水{1}瓶,牙刷{2}支,香皂{3}块。", biao, x, y, z);

                        }

                    }

                }

            }

            Console.WriteLine("总共有{0}种买法。", biao);

            Console.WriteLine(ci);

            Console.ReadLine();

2.百鸡百钱:公鸡2文钱一只,母鸡1文钱一只,小鸡半文钱一只,总共只有100文钱,如何在凑够100只鸡的情况下刚好花完100文钱?(或者大马驼2石粮食,中等马驼1石粮食,两头小马驼1石粮食,要用100匹马,驼100石粮食,该如何分配?)

            int ci = 0;

            for (int x = 0; x <= 50; x++)

            {

                for (int y = 0; y <= 100; y++)

                {

                    for (int z = 0; z <= 200; z++)

                    {

                        if (2 * x + y + z * 0.5 == 100 && x + y + z == 100)

                        {

                            Console.WriteLine("公鸡{0}只,母鸡{1}只,小鸡{2}只。", x, y, z);

                            ci++;

                        }

                    }

                }

            }

            Console.WriteLine(ci);

            Console.ReadLine();

3. 有1分钱,2分钱,5分钱的硬币,要组合出来2角钱,有几种组合方式,分别各多少个?

            int ci = 0;

            for (int x = 0; x <= 100; x++)

            {

                for (int y = 0; y <= 50; y++)

                {

                    for (int z = 0; z <= 20; z++)

                    {

                        if (x + 2 * y + 5 * z == 100)

                        {

                            Console.WriteLine("1分钱{0}枚,2分钱{1}枚,5分钱{2}枚。", x, y, z);

                            ci++;

                        }

                    }

                }

            }

            Console.WriteLine(ci);

            Console.ReadLine();

(二)、迭代:

从初始情况按照规律不断求解中间情况,最终推导出结果。

1.五个小朋友排成一队,问第一个多大了,第一个说比第二个大两岁,问第二个多大了,第二个说比第三个大两岁。。。以此类推,问第5个小朋友,说自己3岁了。问第一个小朋友几岁了?

            int sum = 3;

            for (int i = 1; i < 5; i++)

            {

                sum += 2;

            }

            Console.WriteLine(sum);

            Console.ReadLine();

2.纸张可以无限次对折,纸张厚度为0.07毫米。问多少次对折至少可以超过8848?

            double height = 0.07;

            int ci = 0;

            while (height <= 8848000)

            {

                ci++;

                height *= 2;

            }

            Console.WriteLine(ci);

            Console.ReadLine();

二、while循环

while 循环,其实是for循环的变形写法

for(int i = 1; i<=5;i++)

{

         循环体;

}

上面的for循环可以写成

int i= 1;

for(;i<=5;)

{

         循环体;

         i++;

}

写成while就是以下样式

int i= 1;

while(表达式(i<=5))//在括号内直接限制循环条件

{//需要在中括号内给出改变方式,否则将会进入死循环

         循环体;

         状态改变(i++);//在中括号内给予值得改变方式

}

跳转语句:

break:跳出整个循环

continue:跳出本次循环,继续下次循环。

注:●do

{

    循环体;

    状态改变(i++);

}while(表达式(i<=5))

注意:do while是不管满不满足表达式,我都会先执行一遍。

●while死循环

while (true)//死循环一

{

       循环体;

       状态改变;

}

while (1 == 1)//死循环二

{

     循环体;

     状态改变;

}

While循环例题:

1、100节楼梯,前50节每节分数等于阶梯数,当到第30节时直接跳到第50节得100分, 51节开始每节10分

            int n = 0;

            int m = 0;

            while (n < 100)

            {

                n++;

                if (n <= 30)

                {

                    m = m + n;

                    Console.WriteLine("到{0}层时的分数是{1}。", n, m);

                }

                if (n > 30 && n <= 50)

                {

                    if (n == 50)

                    {

                        m += 100;

                        Console.WriteLine("到50层的分数" + m);

                    }

                    continue;

                }

                if (n > 50)

                {

                    m += 10;

                    Console.WriteLine("到{0}层时的分数是{1}。", n, m);

                }

            }

            Console.ReadLine();

2、do  while

                       

 

增补循环语句一——for循环

1、有一对幼兔,幼兔1个月后长成小兔,小兔1个月后长成成兔并生下一对幼兔,问几年后有多少对兔子,幼兔、小兔、成兔对数分别是多少。成兔每月生下一对幼兔。

 

成兔对数

0

0

1

1

2

3

5

小兔对数

0

1

0

1

1

2

3

幼兔对数

1

0

1

1

2

3

5

月份

1

2

3

4

5

6

7

总对数

1

1

2

3

5

8

13

根据上表可以得到结论:

本月的成兔=上月的小兔+上月的成兔。

本月的小兔=上月的小兔。

本月的幼兔=本月的成兔。

Console.Write("请输入月数:");

            int m = int.Parse(Console.ReadLine ());

            int a = 0, b = 0, c = 1, d = 1;

            int i = 1;

            for (; i <= m; i++)

            {

                if (i == 1)

                {

                    a = 0;

                    b = 0;

                    c = 1;

                }

                else

                {

                    a = b + a;

                    b = c;

                    c = a;

                }

                d = a + b + c;

              

            }

            Console.WriteLine("{0}个月后成兔对数是{1}", i, a);

            Console.WriteLine("{0}个月后小兔对数是{1}", i, b);

            Console.WriteLine("{0}个月后幼兔对数是{1}", i, c);

            Console.WriteLine("{0}个月后兔总对数是{1}", i, d);

            Console.ReadLine();