zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#编程基础第四章:循环

2023-09-14 09:07:50 时间

一、为什么需要循环

假设现在我们要向屏幕输出 1 到 8 之间的所有整数,可以一句一句实现,但这样非常麻烦,有规律的工作可以使用循环完成。

二、循环语句

在 C#中提供了 4 种循环结构,它们都可以达到循环的目的。

  1. for 循环
  2. while 循环
  3. do…while 循环
  4. foreach 循环

本章只涉及前三种循环,foreach 循环将在以后学习中进行讲解。

2.1、for

在讲解 for 循环用法之前,我们首先分析一下输出 1 到 8 之间整数的这个案例。我们知道,输出
这个动作是重复执行的,需要通过循环解决。那么问题来了,循环从哪里开始,在哪里结束,每次输
出的数据是不同的,如何去控制呢?数据从 1、2、3、…一直变化到 8,我们可以让一个变量初始化为
1,然后每次输出后变量累加 1,一直到变量的值大于 8,就可以结束输出。这里的变量我们称之为 循
环变量,它控制了循环的整个过程。它的初值为 1,就表示了循环从哪里开始;每次输出后累加 1,就
表示了中间变化过程;直到大于 8,就表示了循环的结束。

2.1.1、概要

如何使用 for 循环来实现呢?先了解 for 循环的语法结构:


for( 表达式 1; 表达式 2; 表达式 3)

语句块; 

在此语法中,各个部分的含义说明如下:
(1)表达式 1:通常是用来给循环变量赋初值,一般是赋值表达式;

(2)表达式 2:通常是循环进行的条件,一般是关系或逻辑表达式;

(3)表达式 3:通常用于修改循环变量的值,一般是复合赋值语句;

(4)语句块:要重复执行的代码,也称之为循环体。

用 for 循环输出 1-8 的整数。

为什么就能输出 1 到 8 之间的整数呢?对此,我们要了解 for 循环的执行顺序。for 循环的执行

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 8; i++)
            {
                Console.WriteLine(i+",你好");
            }
        }
    }
}

顺序如下:

(1)执行表达式 1;

(2)判断表达式 2 的真假;

(3)如果为真,则执行{}中的语句块;然后执行表达式 3,回到第 2 步;

(4)如果为假,则结束 for 循环。

相应的流程图如下所示:

对照这执行过程,我们很容易就能得到输出的结果了。注意:此例的 i++也可以看做赋值表达
式,相当于 i+=1 或者 i=i+1。

小贴士:流程图是用图形的形式来描述算法的步骤,直观形象,易于理解;一般用箭头表示流程
线,矩形表示处理框,菱形表示判断框等。

2.1.2、示例

用 for 循环实现计算 1+2+3+…+20 的和。

用 for 循环求出 1-30 之间 2 的倍数的所有整数,然后输出。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //用 for 循环求出 1-30 之间 2 的倍数的所有整数,然后输出。
            for (int i = 2; i <= 30; i=i+2)
            {
                Console.WriteLine(i);
            }

        }
    }
}

用 for 循环输出 100 以内的偶数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int n = 0;
            //用 for 循环输出 100 以内的偶数。
            for (int i = 1; i <=100; i++)
            {
                //如果一个数与2求余数结果为0则是偶数
                if (i % 2 == 0)
                {
                    Console.Write("{0}\t",i);
                    n=n+1;
                }
            }
            Console.WriteLine("偶数的个数是{0}",n);
        }
    }
}

 

2.2、while

while 循环语句根据循环条件执行一个语句块零次或者多次,它的基本语法格式如下:

while( 布尔表达式) 
{ 
语句块; 
} 

while 语句的执行顺序如下:
1)计算布尔表达式;

2)如果布尔表达式的值为 true,则执行{}中的语句块,执行完毕重新计算布尔表达式的值是
否为 true;

3)如果布尔表达式的值为 false,则结束整个循环。

下面我们看一些使用 while 循环实现的例子。
例 4.5 用 while 循环输出 8 个的整数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i=1;
            while (i<=8)
            {
                Console.WriteLine("数字"+i);
                i++;
            }
        }
    }
}

从此例中可以看到,其实 while 循环语句就相当于把 for 循环的第一个表达式移到了循环的前面
赋值,而把 for 循环的第三个表达式移到了循环体的最后。所以掌握了一种循环,另外的循环就能触
类旁通了。

另外 for 循环语句一般用于确定循环次数的情况,而 while 循环语句的特点是可以没有循环变
量,可以不写第一个表达式和第三个表达式,只写一个条件表达式就够了,循环的次数是不固定的。

1-100之和

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int i=1,sum=0;
            while (i<=100)
            {
                sum += i;  //sum=sum+i;
                i++;
            }
            Console.WriteLine("和是:"+sum);
        }
    }
}

 

1-100之积

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            double i = 1, sum = 1;
            while (i<=100)
            {
                sum *= i;
                i++;
            }
            Console.WriteLine("积是:"+sum);
        }
    }
}

例 4.6 老师很生气后果很严重,老师心情不好就会罚同学们跑圈圈,跑多少圈不是固定的,要
跑到老师心情变好为止,用 while 循环实现模拟跑圈圈的功能,代码如下:

分析:老师心情不好则进入循环跑圈圈,心情好则退出循环。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            //定义变量,用于记录老师的心情好坏,yes表示好,no表示不好
            string feelGood;
            //提示输入
            Console.Write("老师的心情好吗?(yes/no):");
            //从键盘输入老师现在的心情
            feelGood = Console.ReadLine();
            //如果心情为no,则循环继续
            while (feelGood=="no")
            {
                Console.WriteLine("跑圈圈........");
                //再次提示输入老师的心情状态
                Console.Write("老师的心情好吗?(yes/no):");
                feelGood = Console.ReadLine(); //从键盘输入老师的心情 yes表示好,no表示不好
            }
        }
    }
}

输出:

2.3、 do…while

do…while 循环和 while 循环是类似的,do…while 循环的基本语法格式如下:

do
{ 
语句块; 
}while( 布尔表达式 );

while 语句的执行顺序如下:

(1)首先执行语句块;

(2)之后计算布尔表达式的值,如果为 true,则重新执行语句块,然后继续判断布尔表达式;

(3)如果布尔表达式的值为 false,则结束整个循环。

相应的流程图如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 1;
            do
            {
                Console.WriteLine(i);
                i++;
            } while (i<=10);
        }
    }
}

while 和 do…while 都用来控制代码的循环,但 while 语句适用于先条件判断,再执行循环结构
的场合;而 do…while 则适合于先执行循环结构,再进行条件判断的场合。也就是说,使用 while
时,如果一开始条件表达式不成立,循环结构一次也不会执行;而使用 do…while 时,即使条件一开
始不成立,程序也至少执行一次循环结构。这是 while 和 do…while 的区别。

例 4.7 小明过两天就要登台表演了,今天要再好好练习一下,如果排练的效果比较满意就不用
再排练了,但是如果效果还不满意则需一直排练下去,用 do…while 循环实现该功能。代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            String isOk;
            do
            {
                Console.WriteLine("小明排练一次");
                Console.WriteLine("是否满意了(yes/no)");
                isOk=Console.ReadLine();
            } while (isOk.ToLower()=="no");
        }
    }
}

 

从此例中也可以看到排练无论如何都要先做一次,然后看情况是否还要继续做。do…while 循环
语句的特点就是先执行后判断。

例 4.8 编写程序接收用户输入一个月份,如果月份输入正确给出相应提示,如果不正确则让用
户重新输入,用 do…while 循环语句实现功能。代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            //变量,月份
            int month;
            do
            {
                //提示
                Console.Write("请输入月份(1-12):");
                //输入
                month=Convert.ToInt32(Console.ReadLine());
            } while (month<1||month>12);  //如果月份小于1或月份大于12则重新输入
            //输出月份
            Console.WriteLine("您输入的月份是:"+month);
        }
    }
}

 

课堂作业:使用 do…while 循环完成下列题目

(1) 输出大写字母 A-Z。

(2) 求 1-100 之间所有偶数的和。

三、break 和 continue

break 语句我们并不陌生,在之前的 switch 语句中就使用过,它的作用是结束 switch 语句,那
如果在循环语句中使用 break 语句,它的作用就是退出循环。

在上面的例子 4.8 中,如果月份输入有误,没有错误提示就直接让用户再次输入月份了,程序的
功能虽然实现了,但对用户的操作并不友好,如果我们希望错误也有相应的提示,则可以将上面的例
子稍微改一下,加入错误提示,然后通过 break 语句来控制退出循环。代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            //变量,月份
            int month;
            do
            {
                //提示
                Console.Write("请输入月份(1-12):");
                //输入
                month = Convert.ToInt32(Console.ReadLine());
                //如果月份小于1或月份大于12则重新输入
                if (month < 1 || month > 12)
                {
                    Console.WriteLine("输入错误,请重新输入");
                }
                else
                {
                    break;  //结束循环
                }
            } while (true);  
            //输出月份
            Console.WriteLine("您输入的月份是:"+month);
        }
    }
}

另外一个关键字 continue,也常用在循环当中,不过它的作用是用于终止本次循环,去执行下一
次循环。continue 通常跟 if 语句配合,用来加速循环过程。

例 4.10 在循环中使用 continue 语句求 1-100 之间所有奇数的和。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0, sum = 0;
            while (i<100)
            {
                i++;
                //如果是偶数当次循环结束
                if (i % 2 == 0)
                {
                    continue;  //结束当次循环,开始下一次循环,后面的语句将不会执行
                }
                sum = sum + i;
            }
            Console.WriteLine("和是:"+sum);
        }
    }
}

2500

四、嵌套循环结构

没有进行嵌套的循环称为一重循环结构。循环结构(for、while、do…while)可以进行相互嵌套,
构成二重、三重,甚至更多重的循环结构,如下列举了一些二重循环的形式:

一般常用的是二重和三重循环。循环的层数越多,运行时间越长,程序越复杂。下面来使用循环
嵌套来解决问题

例 4.11 使用星号输出矩形。

分析:要画一个矩形就是要输出很多行星星,我们可以使用循环来实现输出很多行的功能,循环
一次则输出一行星号,再循环一次则再输出一行星号。

实现代码如下:

static void Main()
{
for(int i=1;i<=5;i++)  //循环5次则输出5行
{
Console.WriteLine("**********");  //输出一行星星
}
}

上面代码已经可以实现画矩形的功能了,但是每行要输出多少个星星不好控制,假如一行要输出

20 的星星,则需要我们自己数 20 个,很麻烦,那么其实输出一行星星也就是要重复的输出很多个星

星,这个重复的工作同样可以交给循环来完成,也就是在循环语句中再写循环语句,就是嵌套的循环

语句了,我们将上面代码修改成嵌套的循环看看。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 1; i <= 5; i++)
            {
                for (int j = 1; j <=10; j++)
                {
                    Console.Write("*");
                }
                Console.WriteLine();
            }
        }
    }
}

 

例 4.12 通过嵌套 for 循环打印出一个九九乘法表。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            //控制行数
            for (int i = 1; i <= 9; i++)
            {
                //控制列数
                for (int j = 1; j <= i; j++)
                {
                    //输出表达式,注意j与i的顺序
                    Console.Write("{0}x{1}={2}\t",j,i,j*i);
                }
                //一行结束时,换行
                Console.WriteLine();
            }
        }
    }
}

 

五、作业

1、输入十个数,输出最大数。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleApplication2
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             //认为第1个数是最大数
13             Console.Write("请输入第1个数:");
14             int max = Convert.ToInt32(Console.ReadLine());
15 
16             //从第二个数开始与最大数比较
17             for (int i = 2; i <= 10; i++)
18             {
19                 Console.Write("请输入第{0}个数:",i);
20                 int n = Convert.ToInt32(Console.ReadLine());
21                 //如果n比最大的数还大,最大数的数就是n
22                 if (n > max)
23                 {
24                     max = n;
25                 }
26             }
27             Console.WriteLine("最大数是:"+max);
28 
29         }
30     }
31 }
View Code

 

2、在屏幕上输出一个三角形。

    *

   ***

  *****

 *******

*********

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleApplication1
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             //外层循环控制行数 5
13             for (int i = 0; i < 5; i++)
14             {
15                 //控制每行前部的空格数  空格数=5-1-行数
16                 for (int k = 0; k < 5-1 - i; k++)
17                 {
18                     Console.Write(" ");
19                 }
20 
21                 //控制星号个数=行数*2+1
22                 for (int j = 0; j < i * 2 + 1; j++)
23                 {
24                     Console.Write("*");
25                 }
26 
27                 //换行
28                 Console.WriteLine();
29             }
30         }
31     }
32 }
View Code

 

3、完成第四章所有上机与理论作业,预习第五章

六、考试

1、使用for、while、do...while实现1-50间的数之和。

2、输入年份与月份,输出天数,要求考虑2月(润年29,平年28),当用户输入错误时要求重新输入。

3、输出下面的形状

A

BBB

CCCCC

DDDDDDD

EEEEEEEEE