C#流程控制
流程控制: 不管简单的程序还是复杂的程序,一般包含三种结构:顺序结构,选择结构,循环结构。 顺序结构:默认就是顺序结构,就是说程序自上而下依次按照顺序执行。 选择结构(分支结构):程序有条件(有选择)的去执行某些代码(单分支if 双分支if-else 多分支if-elseif-……-else switch-case) 循环结构:程序有条件的重复执行某些代码(for循环<foreach>
while循环<do-while>
)
选择结构
if
注意语法结构:
-
单分支 if
-
双分支 if else
-
多分支 if else if else if 适合条件为判断同一变量的不同区间
格式: 单分支:if+tab if(条件){成立:执行代码}
双分支:if(条件){成立:执行代码1}else{不成立:执行代码2}
单分支和双分支
/* * 1.单分支结构语法格式: * if(布尔值或者布尔表达式){ * if()里面的布尔值或者布尔表达式的结果为true的时候,执行这里面的代码 * } */ if (123>11) { Console.WriteLine("执行"); } //需求:判断用户是否成年 int age = 12; if (age > 18) { Console.WriteLine("成年"); } /* * 2.双分支结构语法格式: * if(布尔值或者布尔表达式){ * if()里面的布尔值或者布尔表达式的结果为true的时候,执行这里面的代码 * }else{ * * if()里面的布尔值或者布尔表达式的结果为false的时候,执行这里面的代码 * } */ if (age > 18) { Console.WriteLine("成年"); }else { Console.WriteLine("未成年"); }
多分支
格式: 多分支:if(条件){成立:执行代码1}elseif(条件){成立:执行代码2}……else{都不成立:执行代码n}
注意:1.判断条件是有递进关系 2.一旦一个分支执行了其他分支都不执行
/* * 3.多分支结构语法格式: * if(布尔值或者布尔表达式){ * if()里面的布尔值或者布尔表达式的结果为true的时候,执行这里面的代码 * }else if(布尔值或者布尔表达式){ * if()里面的布尔值或者布尔表达式的结果为true的时候,执行这里面的代码 * }else if(布尔值或者布尔表达式){ * if()里面的布尔值或者布尔表达式的结果为true的时候,执行这里面的代码 * .... * }else{ * if()里面的布尔值或者布尔表达式的结果为false的时候,执行这里面的代码 * } */ //执行该过程:当某个条件语句成立,则执行后面的代码块,都不成立,则执行else后的代码块, //注意:当多个条件都成立的时候,执行最上面的代码块,当前面的if()满足条件执行之后,后面的代码块就不再执行了 if (age<=12) { Console.WriteLine("儿童"); }else if (age<=18) { Console.WriteLine("青少年"); }else if (age <= 40) { Console.WriteLine("青年"); } else if (age <= 50) { Console.WriteLine("壮年"); }else { Console.WriteLine("老年"); }
分支嵌套
//4. 分支嵌套 //if(0>age<123) 错误 比较运算符不能连用的 if (age>0&&age<134) { if (age <= 12) { Console.WriteLine("儿童"); } else if (age <= 18) { Console.WriteLine("青少年"); } else if (age <= 40) { Console.WriteLine("青年"); } else if (age <= 50) { Console.WriteLine("壮年"); } else { Console.WriteLine("老年"); } } else { Console.WriteLine("输入的年龄不合法"); }
多个if和ifelse的区别?
int aa = 10; //if (aa>5) //{ // Console.WriteLine("大于5"); //} //else if(aa>6) //{ // Console.WriteLine("大于6"); //} if (aa > 5) { Console.WriteLine("大于5"); } if (aa > 6) { Console.WriteLine("大于6"); } //多个if和ifelse的区别: //多个if是所有的if都判断,条件成立都会执行 //ifelse 是只要上面的满足条件,就不再对下面的elseif进行判断
goto
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _02_goto { internal class Program { static void Main(string[] args) { //goto可以控制代码执行的顺序 //1.给代码合适的位置,打一个标记,标记的名字是自定义的,一般标记的位置比代码少一个缩进 InputSex: Console.WriteLine("请输入性别:"); string sex=Console.ReadLine(); if (sex=="男") { Console.WriteLine("爷们"); }else if (sex == "女") { Console.WriteLine("不是爷们"); } else { Console.WriteLine("输入有误"); //2.使用 goto 标记的名字 可以让代码重新回到标记的位置重新执行 goto InputSex; } } } }
switch
快捷键:switch + tab
用处:适用于多个值进行判断,或者等值条件的判断
执行过程:根据switch括号里面的变量值,选择与之对应的case语句,如果没有case语句,则执行default后面的语句
格式:
-
switch:开关
-
():变量,只要变量存在,即可进入条件语句
-
{}:代码块,与case的实例匹配的部分才能输出
-
case:值 实例,后面的值是和switch()里面的变量进行匹配
-
default:默认 和else相似,当case的实例 都不满足条件,会执行default
注意:
-
break不能省略(中断,打断)
-
case后面的值可以无序,但不能重复
-
多个case可以共用一段代码
-
default可要可不要(都匹配不上,就执行default)
-
case后面跟的具体的数据,要和switch()内的变量的值的类型完全一致
if和switch的异同点:
-
相同点:都可以用于分支判断
-
不同点:if结构适用于某个变量处于某个连续区间的情况,switch结构只用于处理等值条件的判断
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _03_switch { internal class Program { static void Main(string[] args) { //需求:用于输入1 打印星期一 输入2 打印星期二 3打印星期三................ int day = int.Parse(Console.ReadLine()); //if (day==1) //{ // Console.WriteLine("星期一"); //}else if (day==2) //{ // Console.WriteLine("星期二"); //}else if(day==3) //{ // Console.WriteLine("星期三"); //}.... switch (day) { case 1: Console.WriteLine("星期一"); break; case 2: Console.WriteLine("星期二"); break; case 4: Console.WriteLine("星期四"); break; default: Console.WriteLine("输入错误"); break; } // 用户输入月份 打印季节 // 气象划分法。在气象部门,通常以阳历3~5月为春季,6~8月为夏季,9~11月为秋季,12月~来年2月为冬季,并且常常把1、4、7、10月作为冬、春、夏、秋季的代表月份 int mouth=int.Parse(Console.ReadLine()); //语法臃肿 //switch(mouth) //{ // case 3: // Console.WriteLine("春季"); // break; // case 4: // Console.WriteLine("春季"); // break; // case 5: // Console.WriteLine("春季"); // break; // case 6: // Console.WriteLine("夏季"); // break; // case 7: // Console.WriteLine("夏季"); // break; // case 8: // Console.WriteLine("夏季"); // break; //} switch (mouth) { case 3: case 4: case 5: Console.WriteLine("春季"); break; case 6: case 7: case 8: Console.WriteLine("夏季"); break; case 9: case 10: case 11: Console.WriteLine("季"); break; default: Console.WriteLine(); break; } } } }
循环结构
循环四要素:初始条件 判断条件 循环语句 迭代变量
for循环
语法:
for循环语法格式: for(声明一个循环控制变量;循环执行的条件;循环控制变量修改){ 循环体(需要重复执行的代码块) }
执行顺序: ①先执行初始条件 int i = 0;(初始条件只执行一次) ②再执行判断条件 i < 5; 成立:执行③ 不成立:⑤ ③执行{循环语句} ④执行迭代变量 i++,然后执行② ⑤退出for循环
注意点: ①初始条件可以写到for上边,但是第一个 ; 不能省略 ②迭代变量可以写到循环语句的后面,但第二个 ; 不能省略 ③for执行完,变量 i 的值为判断条件的值
注意死循环
一定要保证循环有终止条件(没有终止条件的循环,称之为死循环)
-
for(int i=0;i<5;i--){} 迭代变量使用不当造成死循环
-
for(int i=0;i<5;){} 没有迭代变量造成死循环
-
for(int i=0;i==i;i++){} 判断条件使用不当,造成死循环
单层for循环
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _04_循环结构 { internal class Program { static void Main(string[] args) { // 循环结构:重复执行某段代码若干次 //需求:在控制台打印5次"吴亦凡" //Console.WriteLine("吴亦凡"); //Console.WriteLine("吴亦凡"); //Console.WriteLine("吴亦凡"); //Console.WriteLine("吴亦凡"); //Console.WriteLine("吴亦凡"); //以上需求:我们可以就可以使用for循环 for (int i = 0; i < 5; i++) { Console.WriteLine("吴亦凡"); } int j = 0; for (;j < 5; ) { Console.WriteLine("罗志祥"); j++; } } } }
双层for循环
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _05_双层for循环 { internal class Program { static void Main(string[] args) { //把内层循环看做是外层循环的循环体(需要重复执行的代码) //外层循环执行一次,内层循环就执行全部 //外层循环带着内层循环跑 for (int i = 0; i < 3; i++) { Console.WriteLine("内层循环开始"); // Console.WriteLine("需要重复执行的代码"); for (int j = 0; j < 3; j++) { Console.WriteLine($"i=={i}------j=={j}"); } Console.WriteLine("内存循环结束"); } //Console.WriteLine("需要重复执行的代码"); //Console.WriteLine("需要重复执行的代码"); //Console.WriteLine("需要重复执行的代码"); //for (int j = 0; j < 3; j++) //{ // Console.WriteLine("内层循环"); //} //for (int j = 0; j < 3; j++) //{ // Console.WriteLine("内层循环"); //} //for (int j = 0; j < 3; j++) //{ // Console.WriteLine("内层循环"); //} //总结: //注意:多层循环的变量名不能重复,内层循环可以使用外层循环的变量,但是外层循环不能使用内存循环的变量 //执行过程:外层循环执行一次,内层循环就执行全部 } } }
while循环
语法:
while循环格式: while (布尔值或者布尔表达式) { 布尔值或者布尔表达式成立时执行的代码块(循环体) 迭代变量 }
//while循环初始化语句在while外面 int j = 0; while ( j < 5) //判断条件 也就是while循环执行的条件,条件不满足则停止循环 { Console.WriteLine("罗志祥"); //{} 除了迭代变量之外,都是循环体 j++;//迭代变量 }
do-while
int i= 10; //while (i<10) //{ // Console.WriteLine(i); // i++; //} do { Console.WriteLine(i); i++; } while (i < 10);
while和的区别
-
while执行流程:
-
判断循环执行的条件,若值为true,则执行循环体,改变初始变量(迭代变量)
-
重复执行第一步,直到循环条件的值为false,停止循环
-
-
do-while执行流程:
-
首先执行循环体,改变迭代变量
-
判断循环条件,若值为true,则执行循环体,改变初始变量(迭代变量),
-
依次重复,直到循环条件为fasle,停止循环
-
do-while最少执行一次,while条件不成立的话,一次都不会执行
使用场景:
三个循环的使用场景:
-
for:最常用的循环,用于循环的次数明确且固定
-
while:循环的次数不固定,但是有明确的目标
-
dowhile循环:和while相似,至少执行一次
循环控制:continue,break,return
continue:跳过本次循环,继续下次循环(作用:终止本次循环)
for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j==2||j==4) { continue;//跳出本次循环,继续下一次循环(作用:终止本次循环) } Console.WriteLine(j); } }
break:终止当前循环(作用:跳出循环(一层))
for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j == 2 ) { break;//终止当前循环(作用:跳出当前这一层循环) } Console.WriteLine(j); } }
return:跳出整个方法
for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j == 2) { return;//跳出整个方法 } Console.WriteLine(j); } }
总结
//总结: 为什么要使用终止循环的关键字? //是为了达到性能优化的目的 //比如:我们要找到某些数字中第一个满足条件的值,就可以在找到第一个的时候结束循环 //找到925-1226中第一个能被3和5整数的值 for (int i = 925; i <=1226; i++) { if (i % 3 == 0 && i % 5 == 0) { Console.WriteLine(i); break; } }