流程控制-循环-for循环

    现在介绍最后一类循环——for循环。这类循环可以执行指定的次数,并维护它自己的计数器。要定义for循环,需要下述信息:

     *初始化计数器变量的一个起始值。

     *继续循环的条件,它应设计到计算器的变量。

     *在每次循环的最后,对计数器变量执行一个操作。

    例如,如果要在循环中,使计数器从1递增到10,递增量为1,则起始值为1,条件是计数器小于或等于10,在每次循环的最后,要执行的操作是给计数器加1。

    这些信息必须放在for循环的结构中,如下所示:

     for(<initialization>;<condition>;<operation>)

     {

          <code to loop>

     }

    它的工作方式与下述while循环完全相同:

     <initialization>

     while(<condition>)

     {

          <code to loop>

          <operation>

     }

    但for循环的格式使代码更易于阅读,因为其语法是在一个地方包括循环的全部规则,而不是把几个语句放在代码的不同地方。

    前面使用do和while循环输出了从1~10的数字。下面看看如果使用for循环完成这个任务。

     int i;

     for(i = 1;i <= 10;++i)

     {

          Console.WriteLine("{0},i");

     }

    计数器变量是一个整数i,它的起始值是1,在每次循环的最后递增1。在每次循环过程中,把i的值写到控制台上。

    注意当i的值为11时,将执行循环后面的代码。因为在i等于10的循环末尾,i会递增为11。这是在测试条件i<=10之前发生的,所以此时循环结束。

    与while循环一样,第一次执行前,只在条件测定为true时for循环才执行,所以循环中的代码可能根本就不会执行。

    最后要注意,可以把计数器变量声明把在for循环里,如下所示:

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

     {

          Console.WriteLine("{0}",i);

     }

    但如果这么做,变量i就不能在循环外部使用。

    下面介绍一个使用for循环的示例。它将显示一个Mandelbrot图像(使用纯文本字符)!

 

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

namespace for循环
{
    
class Program
    {
        
static void Main(string[] args)
        {
            
double realCoord, imagCoord;
            
double realTemp, imagTemp, realTemp2, arg;
            
int iterations;

            
for (imagCoord = 1.2;imagCoord >= -1.2; imagCoord -= 0.05)
            {
                
for (realCoord = -0.6; realCoord <= 1.77; realCoord += 0.03)
                {
                    iterations 
= 0;
                    realTemp 
= realCoord;
                    imagTemp 
= imagCoord;
                    arg 
= (realCoord * realCoord) + (imagCoord * imagCoord);

                    
while ((arg < 4&& (iterations < 40))
                    {
                        realTemp2 
= (realTemp * realTemp) - (imagTemp * imagTemp) - realCoord;
                        imagTemp 
= (2 * realTemp * imagTemp) - imagCoord;
                        realTemp 
= realTemp2;
                        arg 
= (realTemp * realTemp) + (imagTemp * imagTemp);
                        iterations 
+= 1;
                    }
                    
switch (iterations % 4)
                    {
                        
case 0:
                            Console.Write(
".");
                            
break;
                        
case 1:
                            Console.Write(
"o");
                            
break;
                        
case 2:
                            Console.Write(
"O");
                            
break;
                        
case 3:
                            Console.Write(
"@");
                            
break;
                    }
                }
                Console.Write(
"\n");
            }
            Console.ReadKey();
        }
    }
}

 

    示例的说明,首先不打算详细说明如何计算Mandelbrot图像,而是解释为什么需要在这段代码中使用循环。如果对数学不感兴趣,可以快速浏览下面两端,因为它们对代码的理解非常重要。

    Mandelbrot图像中的每个位置都对应共识N=x+y*i中的一个复数。实数部分是x,虚数部分是y,i是-1的平方根。图像中各个位置的x和y坐标对应于虚数的x和y部分。

    图像中的每个位置用参数N来表示,它是x*x+y*y的平方根。如果这个值大于或等于2,则这个数字对应的位置值是0。如果参数N的值小于2,就把N的值改为N*N-N(即N=(x*x-y*y)+(2*x*y-y)*i),并再次测试这个新N值。如果这个值大于或等于2,则这个数字对应的位置值是1。这个过程一直继续下去,直到给图像中的位置赋一个值,或迭代执行的次数多余指定的次数为止。

    根据给图像中每个点赋予的值,在图形环境下,屏幕上会显示某种颜色的像素。但是,本例使用的是文本环境,所以屏幕上显示的是一个字符。

posted @ 2009-03-19 15:17    阅读(1233)  评论(0编辑  收藏  举报