假设现在我们要向屏幕输出 1 到 8 之间的所有整数,可以一句一句实现,但这样非常麻烦,有规律的工作可以使用循环完成。
二、循环语句在 C#中提供了 4 种循环结构,它们都可以达到循环的目的。
- for 循环
- while 循环
- do…while 循环
- 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 和 continuebreak 语句我们并不陌生,在之前的 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