算法中的for循环 while循环与while循环

您当前所在位置:&>>&&>>&正文
本教程章节列表
do…while语句的用法和使用示例
创建时间:日 21:52&&阅读次数:(38102)
while和for语句都在循环开始的时候测试它们的布尔表达式。这意味着假如在首次测试时,布尔表达式就求值为false,那么循环主体一次都不会运行。do语句则不同,它的布尔表达式是在每次迭代11之后求值的,所以主体至少执行一次。do语句的语法如下(不要忘记最后的分号):dostatementwhile&(booleanExpression);如果循环主体由多个语句构成,必须使用一个语句块。下面的语句向控制台输出0~9,这一次使用的是do语句:int&i&=&0;do{Console.WriteLine(i);i++;}while&(i&&10);break语句和continue语句
在第4章,我们曾用break语句来跳出switch语句。除此之外,还可以使用break语句来跳出一个循环。执行break之后,系统会立即终止循环,并从循环之后的第一个语句继续执行。在这种情况下,循环的&更新&和&继续&条件都不会重新判断。
与此相反,continue语句会造成当前迭代结束,并立即开始下一次迭代(在对布尔表达式进行重新求值之后)。下面是在控制台上输出0~9的那个例子的另一个版本,这一次将使用break和continue语句:&int&i&=&0;while&(true){Console.WriteLine("continue&"&+&i);i++;if&(i&&10)else}这段代码看起来让人很难受。在许多编程守则中,都建议谨慎使用continue语句,或者根本不要使用它,因为它很容易造成难以理解的代码。continue语句的行为也令人捉摸不定。例如,假如在一个for语句中执行continue语句,那么会在运行for语句的"更新(控制变量)"部分之后,才开始执行下一次迭代。在下面的例子中,我们将写一个do语句来将一个正整数转换成八进制表示的字符串形式。程序基于以下算法:将十进制数存储到变量dec中do以下事情:dec除以8,将余数存储起来将dec设为上一步得到的商while&dec不等于0按相反的顺序合并每一次得到的余例如,假定要将十进制数999转换成八进制,可以执行以下步骤:1.999除以8,商124余7。2.124除以8,商15,余4。3.15除以8,商1余7。4.1除以8,商0,余1。5.按相反的顺序合并每一步得到的余,结果是1747。这就是999转换成八进制的结果。写do语句示例:1.&在Visual&Studio&2010中打开DoStatement项目,它位于“文档”文件夹下的\Microsoft&Press\Visual&CSharp&Step&by&Step\Chapter&5\DoStatement子文件夹中。2.&在设计视图中显示WPF窗体(MainWindow.xaml)。窗体中包含一个名为number的文本框。用户在此输入十进制数字。单击Show&Steps按钮后,会生成该数字的八进制形式。下方的steps文本框将显示每个计算步骤的结果。3.&在“代码和文本编辑器”窗口中显示MainWindow.xaml.cs的代码。找到showStepsClick方法。该方法会在用户单击Show&Steps按钮之后开始运行。该方法目前空白。4.&将以下加粗显示的代码添加到showStepsClick方法中:&private&void&showStepsClick(object&sender,&RoutedEventArgs&e){int&amount&=&int.Parse(number.Text);steps.Text&=&"";string&current&=&"";}第一个语句使用int类型的Parse方法,将number文本框的Text属性中存储的字符串值转换成int值。&第二个语句清除下方的文本框(名为steps)中显示的文本,这是通过将它的Text属性设为空字符串来实现的。第三个语句声明一个名为current的string变量,并把它初始化为空字符串。这个字符串用于存储每一次do循环迭代时生成的数位。5.&将以下加粗显示的do语句添加到showStepsClick方法中:private&void&showStepsClick(object&sender,&RoutedEventArgs&e){int&amount&=&int.Parse(number.Text);steps.Text&=&"";stringcurrent&=&"";do{int&nextDigit&=&amount&%&8;amount&/=&8;int&digitCode&=&'0'&+&nextDchar&digit&=&Convert.ToChar(digitCode);current&=&digit&+&steps.Text&+=&current&+&"\n";}while&(amount&!=&0);}该算法反复计算amount变量除以8所得的余数。每次得到的余数都是正在构造的新字符串的下一个数位。最终,amount变量将减小至0,循环结束。注意,循环主体至少执行一次。这个“至少执行一次”的行为正是我们所需要的,因为即使数字0,也有一个八进制的数位。进一步研究代码,do循环中的第一个语句如下:&int&nextDigit&=&amount&%&8;该语句声明一个名为nextDigit的int变量,并把它初始化为amount变量除以8所得的余数。这个值的范围在0~7之间。&第二个语句如下:&amount&/=&8;这是一个复合赋值语句,等价于amount&=&amount&/&8;。如果amount的值是999,那么在执行这个语句之后,amount的值就是124。&下一个语句是:&int&digitCode&=&'0'+&nextD这个语句需要稍微解释一下!根据Windows操作系统使用的字符集,每个字符都有一个唯一的代码。在Windows操作系统常用的字符集中,字符'0'的代码是整数值48。字符'1'的代码是49,字符'2'的代码是50,以此类推,直到字符'9',它的代码是57。C#语言允许将字符当作整数来处理,并允许对它们执行算术运算。但是,在这样做的时候,C#会将字符的代码作为该字符的值来使用。所以,表达式'0'&+&nextDigit实际会得到一个48~55之间的值(记住,nextDigit的值在0~7之间),对应于等价的八进制数位的代码。&do语句中的第四个语句如下:&char&digit&=&Convert.ToChar(digitCode);该语句声明了一个名为digit的char变量,并把它初始化为Convert.ToChar(digitCode)方法调用的结果。Convert.ToChar方法获取代表字符代码的一个整数值,返回与这个字符代码对应的字符。所以,假如digitCode的值是54,则Convert.ToChar(digitCode)返回字符'6'。总之,do循环的前4个语句能计算出和用户输入的数字对应的最低有效的八进制数位(最右边的数位)。下一个任务是将这个数位添加到要输出的字符串的前面,如下所示:&current&=&digit&+&do循环的下一个语句是:steps.Text&+=&current&+&"\n";该语句将迄今为止得到的八进制数位添加到steps文本框中。它还为每一次输出都附加了一个换行符,使每一次输出在文本框中都单独占一行。&最后,do循环末尾用while子句对循环条件进行求值:&while&(amount&!=&0)由于amount的值目前还不为0,所以开始下一次迭代。在最后一个练习中,将使用Visual&Studio&2010调试器来逐步执行上述do语句,帮助你理解其工作原理。逐步执行do语句1.&在打开了MainWindow.xaml.cs文件的“代码和文本编辑器”窗口中,将光标移到showStepsClick方法的第一个语句,如下所示:&int&amount&=int.Parse(number.Text);2.&右击第一个语句,从弹出的快捷菜单中选择“运行到光标处”命令。3.&窗体出现后,在上方的文本框中键入999,单击Show&Steps按钮。&程序将暂停运行,Visual&Studio&2010将进入调试模式。“代码和文本编辑器”窗口左侧将出现一个黄色箭头,标记出当前要执行的语句。4.&如果“调试”工具栏不可见,请显示它(选择“视图”|“工具栏”|“调试”)。5.&如果使用的是Visual&Studio&2010专业版或者Visual&Studio&2010标准版,请单击“调试”工具栏上的“断点”下箭头。&如果使用的是Visual&C#&2010学习版,请单击“调试”工具栏上的“输出”下箭头。提示:断点"或"输出"下箭头是"调试"工具栏最右侧的那个图标。&随后会出现如下图所示的菜单。提示:如果用的是Visual&C#&2010学习版,"输出"下拉菜单中的选项会少一些。6.&从这个下拉菜单中选择“局部变量”。&如果之前没有打开过“局部变量”窗口,该窗口会随之出现(见下图),其中显示了当前方法中的局部变量的名称、值和类型,其中包括amount这个局部变量。注意,amount变量的值目前是0。7.&在“调试”工具栏上单击“逐语句”按钮(或者按F11)。&调试器将运行当前语句:&int&amount&=&int.Parse(number.Text);在“局部变量”窗口中,amount的值将变成999,黄色箭头会指向下一个语句。8.&再次单击“逐语句”按钮。&调试器将运行以下语句:steps.Text&=&"";该语句不影响“局部变量”窗口的显示,因为steps是窗体上的一个控件,而不是一个局部变量。黄箭头继续指向下一个语句。9.&再次单击“逐语句”按钮。&调试器将运行以下语句:&string&current&=&"";黄箭头将指向do循环的起始大括号。在do循环主体中有三个局部变量,即nextDigit,digitCode和digit。注意,这些局部变量已经在“局部变量”窗口中显示,而且这三个变量的值均为0。10.&单击“逐语句”按钮。&黄箭头将指向do循环主体的第一个语句。11.&单击“逐语句”按钮。&调试器将运行以下语句:int&nextDigit&=&amount&%&8;在“局部变量”窗口中,nextDigit的值将变成7,这是999除以8之余。12.&单击“逐语句”按钮。&调试器将运行以下语句:amount&/=&8;在“局部变量”窗口中,digitCode的值将变成124。13.&单击“逐语句”按钮。&调试器将运行以下语句:int&digitCode&=&'0'&+&nextD在“局部变量”窗口中,digitCode变量的值将变成55。这是'7'的字符码(48&+&7)。14.&单击“逐语句”按钮。&调试器将运行以下语句:char&digit&=Convert.ToChar(digitCode);在“局部变量”窗口中,digit的值变为'7'。在“局部变量”窗口中,会同时显示一个char值的数值形式(本例是55)和字符形式(本例是'7')。&注意,在“局部变量”窗口中,current变量的值仍是""。15.&单击“逐语句”按钮。&调试器将运行以下语句:current&=&current&+&在“局部变量”窗口中,current的值变成"7"。16.&单击“逐语句”。&调试器将运行以下语句:steps.Text&+=&current&+&"\n";该语句将在steps文本框中显示文本"7",后跟一个换行符,确保以后的输出将从文本框的下一行开始(窗体隐藏在Visual&Studio后面,所以我们看不见)。黄箭头移至do循环末尾的结束大括号。17.&单击“逐语句”按钮。&黄箭头将指向while语句,准备求值while条件,判断do循环是已经结束,还是进入下一次迭代。18.&单击“逐语句”按钮。&调试器将运行以下语句:while&(amount&!=&0);amount的值是124,表达式124&!=&0的求值结果为true,所以将进行下一次迭代。黄箭头跳回do循环的起始大括号。19.&单击“逐语句”按钮。&黄箭头再次指向do循环中的第一个语句。20.&连续单击“逐语句”按钮,再重复三次do循环迭代,观察变量值在“局部变量”窗口中的变化。&21.&第4次迭代结束时,amount的值最终变成0,current的值变成"1747"。黄箭头指向do循环的while条件:while&(amount&!=&0);amount的值目前为0,所以表达式amount&!=&0的求值结果为false,do循环应该终止。22.&单击“逐语句”按钮。&调试器将实际运行以下语句:while&(amount&!=&0);如同预期的那样,do循环终止,黄箭头移至showStepsClick方法的结束大括号。23.&单击“调试”工具栏上的“继续”按钮。窗体将出现,并显示为创建999的八进制形式所经历的4个步骤:"7","47","747"和"1747"。24.&关闭窗体,返回Visual&Studio&2010编程环境。&本章讲述了如何使用复合赋值操作符更新数值变量。讲述了如何使用while,for和do语句,在Boolean条件为true的前提下重复执行代码。如果希望继续学习下一章的学习,请继续运行Visual&Studio&2010,然后阅读第6章。&如果希望现在就退出Visual&Studio&2010,请选择“文件”|“退出”。如果看到“保存”对话框,请单击“是”按钮保存项目。
第5章快速参考
在变量(variable)上加一个值(amount)
使用复合加法操作符。例如:
variable +=
从变量(variable)中减一个值(amount)
使用复合减法操作符。例如:
variable -=
条件为true时运行一个或多个语句
使用while语句。例如:
int i = 0;
while (i &10)
Console.WriteLine(i);
还可以使用for语句。例如:
i = 0; i &10; i++)
Console.WriteLine(i);
一次或反复多次执行语句
使用do语句。例如:
int i = 0;
Console.WriteLine(i);
while (i &10);
来源:.net学习网
说明:所有来源为 .net学习网 的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】
发表评论:
请输入问题&&的结果(结果是:)c#入门之循环语句使用详解(for循环、do/while)
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了c#入门之循环语句使用详解,有for循环和do/while的示例,需要的朋友可以参考下
记得第一次学编程的时候,就听说过一句话:“新手学习和掌握一门编程语言是很容易的,但是如果你学会了某种编程语言,再去学习新的语言,就很难掌握了”,现在深深地感受到了这方面的阻力。
其实流程控制、循环,包括面向对象这些知识,基本所有语言都是相通的,唯一的区别就在于书写时的格式、规范不一致。而这些方面的差异,又是比较细微的,所以往往在学的时候依靠经验能很快理解,但过后却发现并未能使(掌)用(握)。
do / while循环的意义,其实就是重复执行语句,当然,还会有相应的条件判断,不然就成死循环了。do循环其实和while循环的区别:do循环会先执行一次循环体,才继续判断;而while循环会先判断,再决定是否执行循环体:
代码如下:double benJ, liV, muB, liX;int needY = 0;Console.WriteLine("请输入您的存款数额:");benJ = Convert.ToDouble(Console.ReadLine());Console.WriteLine("请输入存款利率:");// +1,计算后的结果则为本金+利息,如只需要利息,则去掉+1。学好数学很重要啊liX = Convert.ToDouble(Console.ReadLine()) / 100.0;liV = 1 + liX;liX = benJ * liX;Console.WriteLine("请输入预期收益额:");do{&&&&muB = Convert.ToDouble(Console.ReadLine());&&&&if (muB &= benJ)&&&&{&&&&&&&&Console.WriteLine("预期收益额低于本金,请输入高于本金的收益额:");&&&&}} while (muB &= benJ);while (benJ & muB){&&&&benJ *= liV;&&&&++needY;}Console.WriteLine("每年利息 {3},存入 {0} year{4},您的本金和利息之和 {1} 能够达到预期的目标 {2}。", needY, benJ, muB, liX, needY & 1 ? "s" : "");if (needY == 0) Console.WriteLine("高起点,低目标,其实,您根本没必要存款到银行~");Console.ReadKey();
这儿遇到个很不错的do循环的应用场景:使用do循环判断用户输入的内容是否满足条件,如果没有,则重复执行,直到满足条件才退出循环(do循环的while结尾处需要添加 ; 号)。示例还应用了前面学习的三元运算符 ? ,根据条件判断结果,格式前面的字符串。
forfor循环比较适合于指定次数的应用,在使用时,需初始化一个作为计数器的变量值(可放在for语句中声明,但在循环体外就不能访问该计数器变量了): 代码如下:for (int i = 1; i &= 10; i++){&&& Console.WriteLine("{0}", i);}
声明了for的计数器变量后,使用 ; 号隔开,接着添加条件判断的表达式(应涉及计数器变量) i &= 10,继续使用 ; 号隔开,添加对计数器变量的操作 i++(不用 ; 号结尾)。尝试把i++去掉,放在循环体内,也是可行的。
书上举了一个例子,用for循环打印出mandelbrot集,呵呵,虽然看懂代码的逻辑结构了,但是算法完全看不懂,就不贴上来了。不过,还是延伸阅读了一下mandelbrot集的创始人:本华·曼德博,以及一个数学构造:碎形(fractal)。花了点时间阅读了一些资料,感谢前人,致敬。
当然,示例的重要性不言而喻,试着回想当年学basic写的《九九乘法表》,在C#中简单做了一个。原理是相同的,主要注意细节:
代码如下:int i,for(i = 1; i & 10; i++){&&&&Console.Write("{0}: ", i);&&&&for(k = 1;k &= k++)&&&&{&&&&&&&&Console.Write("{0}x{1}={2} " ,k, i, i * k);&&&&}&&&&Console.WriteLine("\n");}Console.ReadKey();
这种for循环嵌套的方式,在实现横、纵向循环(输出、控制)是很有用的,之前在做excel VBA的时候,经常会用到。
循环的中断以前一直没记住,倒底是该用break还是用continue,不过下面这个例子,倒是很形象地描述清楚了:
代码如下:int i = 1;while (i &= 10){&&& if (i == 6)&&&&&&&&&& Console.WriteLine("{0}", i++);}for (i = 1; i &= 10; i++){&&& if ( i % 2 == 0)&&&&&&&&&& Console.WriteLine("{0}",i);}Console.ReadKey();
其实两个都可以叫中断,只不过:break是中断当前的循环体(退出循环体),而continue是中断循环体的当次循环(不会退出循环体)。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具namespace mOneHourFiveQuestion1
class Program
static int[] Numbers = {1,2,3,4,5,6,7,8,9};
static int Sum1(int[] numbers)
int sum = 0;
for(int i = 0;i & numbers.L i++)
sum += numbers[i];
return sum;
static int Sum2(int[] numbers)
int sum = 0;
int i = 0;
while(i & numbers.Length)
sum += numbers[i];
return sum;
static int Sum3(int[] numbers,int index)
if(index == numbers.Length - 1)
return numbers[index];
return numbers[index] + Sum3(numbers,index + 1);
//反向求和的一个方法,从i开始一直递归到1为止
static in Sum4(int i)
if(i == 1)
return i + Sum4(i-1);
static void Main(string[] args)
Console.WriteLine(Sum1(Numbers));
Console.WriteLine(Sum2(Numbers));
Console.WriteLine(Sum3(Numbers,0));
Console.WriteLine(Sum4(100));
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2733次
排名:千里之外

我要回帖

更多关于 for循环 while循环 的文章

 

随机推荐