02-C#入门(循环)
记得第一次学编程的时候,就听说过一句话:“新手学习和掌握一门编程语言是很容易的,但是如果你学会了某种编程语言,再去学习新的语言,就很难掌握了”,现在深深地感受到了这方面的阻力。
其实流程控制、循环,包括面向对象这些知识,基本所有语言都是相通的,唯一的区别就在于书写时的格式、规范不一致。而这些方面的差异,又是比较细微的,所以往往在学的时候依靠经验能很快理解,但过后却发现并未能使(掌)用(握)。
- do / while
循环的意义,其实就是重复执行语句,当然,还会有相应的条件判断,不然就成死循环了。do循环其实和while循环的区别:do循环会先执行一次循环体,才继续判断;而while循环会先判断,再决定是否执行循环体:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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结尾处需要添加 ; 号)。示例还应用了前面学习的三元运算符 ? ,根据条件判断结果,格式前面的字符串。
- for
for循环比较适合于指定次数的应用,在使用时,需初始化一个作为计数器的变量值(可放在for语句中声明,但在循环体外就不能访问该计数器变量了):
1 2 3 4 | for ( int i = 1; i <= 10; i++) { Console.WriteLine( "{0}" , i); } |
声明了for的计数器变量后,使用 ; 号隔开,接着添加条件判断的表达式(应涉及计数器变量) i <= 10,继续使用 ; 号隔开,添加对计数器变量的操作 i++(不用 ; 号结尾)。尝试把i++去掉,放在循环体内,也是可行的。
书上举了一个例子,用for循环打印出mandelbrot集,呵呵,虽然看懂代码的逻辑结构了,但是算法完全看不懂,就不贴上来了。不过,还是延伸阅读了一下mandelbrot集的创始人:本华·曼德博,以及一个数学构造:碎形(fractal)。花了点时间阅读了一些资料,感谢前人,致敬。
当然,示例的重要性不言而喻,试着回想当年学basic写的《九九乘法表》,在C#中简单做了一个。原理是相同的,主要注意细节:
1 2 3 4 5 6 7 8 9 10 11 | int i, k; for (i = 1; i < 10; i++) { Console.Write( "{0}: " , i); for (k = 1;k <= i; k++) { Console.Write( "{0}x{1}={2} " ,k, i, i * k); } Console.WriteLine( "\n" ); } Console.ReadKey(); |
这种for循环嵌套的方式,在实现横、纵向循环(输出、控制)是很有用的,之前在做excel VBA的时候,经常会用到。
- 循环的中断
以前一直没记住,倒底是该用break还是用continue,不过下面这个例子,倒是很形象地描述清楚了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int i = 1; while (i <= 10) { if (i == 6) break ; Console.WriteLine( "{0}" , i++); } for (i = 1; i <= 10; i++) { if ( i % 2 == 0) continue ; Console.WriteLine( "{0}" ,i); } Console.ReadKey(); |
其实两个都可以叫中断,只不过:break是中断当前的循环体(退出循环体),而continue是中断循环体的当次循环(不会退出循环体)。
至于goto,呵呵,暂时让它见鬼去吧。主要目前没有遇到它可以合理出现的应用场景,希望高手可以指教。
- 结语
学好数学很重要啊,编程语言只是实现理论的工(方)具(法),真正的原理还是需要很基础的理论知识才行。
到此,第4章的学习就算基本完成了。书的每一章结尾都会有练习题和小结知识点,下一篇笔记,就先把练习题做了,再把自己想实现的一个程序写出来,目的:主要是结合前面学到的知识点,综合运用,提高熟练度、加深记忆。
小小期待下~~~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库