【C#基础详解】(七)流程控制

C#程序从Main函数进入,自上而下一行代码一行执行,C#中的流程结构包括分支结构、选择结构、循环结构。

7.1 if

语法:

if(判断条件)

{

要执行的代码;

}

判断条件:一般为关系表达式或者bool类型的值。

执行过程:程序运行到if处,首先判断if所带的小括号中的判断条件,如果条件成立,也就是返回true,则执行if收带的大括号中的代码,如果判断条件不成立,也就是返回一个false,则跳过if结构,继续向下执行。

特点:先判断,再执行,有可能一行代码都不执行,用于一种情况的判断。

如果想表示的是当b的值为true的时候去执行if中的代码,语法上b==true可以省略。

如果想表达的是当b的值为false的时候去执行if中的代码,语法上b==false不能省略。

bool b = true;
if (!b)
{
   Console.WriteLine("恭喜你长大成人了!");
}
Console.WriteLine("持续长大中");

7.2 if-else

语法:

if(判断条件)

{

执行的代码;

}

else

{

执行的代码;

}

执行过程:程序执行到if处,首先判断if所带的小括号中的判断条件是否成立,如果值为true,则执行if所带的大括号中的代码,执行完成后,跳出if结构。

如果if所带的小括号中值为false,则跳过if语句,执行else所带的大括号中的语句,执行完成后,跳出if-else结构。

特点:先判断,再执行,最少都要执行一条代码,用于两种情况的判断。

int numberOne = 10;
int numberTwo = 20;
if (numberOne > numberTwo)
{
    Console.WriteLine($"最大的数字是{numberOne}");
}
else
{
    Console.WriteLine($"最大的数字是{numberTwo}");
}

7.3 三元表达式

语法:表达式1 ?表达式2 :表达式3;

表达式1一般为一个关系表达式。

如果表达式1的值为true,那么表达式2的值就是整个三元表达式的值。

如果表达式1的值为false,那么表达式3的值就是整个三元表达式的值。

注意:表达式2的结果必须跟表达式3的结果类型一致,并且也要跟整个三元表达式的结果类型一致。

如:int i = 4 > 3 ? 4 : 3;(如果4>3成立则输出4,否则输出3)

int numberOne = 10;
int numberTwo = 20;
int i = numberOne > numberTwo ? numberOne :numberTwo;
Console.WriteLine($"最大的数字是{i}");

7.4 if else-if

语法:

if(判断条件)

{

要执行的代码;

}

else if(判断条件)

{

要执行的代码;

}

else if(判断条件)

{

要执行的代码;

}

……

else

{

要执行的代码;

}

执行过程:

程序首先判断第一个if所带的小括号中的判断条件,如果条件成立,也就是值为true,则执行该if所带的大括号中的代码,执行完成后,立即跳出if-else if结构。

如果第一个if所带的判断条件不成立,也就是值为false,则继续向下进行判断,依次地判断每一个if的判断条件,如果成立,就执行该if所带地大括号中的代码,如果不成立,则继续行下判断,如果每个if所带的判断条件都不成立,就看当前这个if-else if结构中是否存在else。

如果有else的话,则执行else中所带的代码,如果没有else,则整个if-else if结构什么都不做。else可以省略。

案例1:在不考虑相等的情况下比较3个数字的大小。
//分别提示用户输入三个数字,我们接收并且转换成int类型
Console.WriteLine("请输入第一个数字");
int numberOne = int.Parse(Console.ReadLine());
Console.WriteLine("请输入第二个数字");
int numberTwo = int.Parse(Console.ReadLine());
Console.WriteLine("请输入的三个数字");
int numberThree = int.Parse(Console.ReadLine());
// 如果第一个数字大于第二个数字并且第一个数字大于第三个数字
if (numberOne > numberTwo && numberOne > numberThree)
{
Console.WriteLine("{0}最大", numberOne);
}
// 如果第二个数字大于第一个数字并且第二个数字大于第三个数字
else if (numberTwo > numberThree)
{
Console.WriteLine("{0}最大", numberTwo);
}
// 如果第三个数字大于第二个数字并且第三个数字大于第一个数字
else 
{
Console.WriteLine("{0}最大", numberThree);
}
Console.ReadKey();
案例2:提示用户输入用户名,然后再提示输入密码,如果用户名是“彭于晏”并且密码是“123456”,则提示正确,否则,如果用户名不是“彭于晏”则提示用户名不存在,如果密码不是“123456”则提示密码错误。
Console.WriteLine("请输入用户名");
string name = Console.ReadLine();
Console.WriteLine("请输入密码");
string password = Console.ReadLine();
if (name == "彭于晏" && password == "123456")
{
Console.WriteLine("登录成功");//1、用户名和密码都输入正确
}
else if (name == "彭于晏")
{
Console.WriteLine("密码输入错误");//2、密码错误
}
else if (password == "123456")
{
Console.WriteLine("用户名输入错误");//3、用户名错误
}
else
{
Console.WriteLine("用户名和密码输入错误");//4、用户名密码错误
}
Console.ReadKey();
案例3:提示用户输入年龄,如果大于等于18,则告知用户可以游玩,如果小于10岁,则告知不允许游玩,如果大于等于10岁并且小于18,则提示用户是否继续游玩(yes、no),如果输入的是yes则提示用户请游玩,否则提示"退出,放弃游玩"。
第一种情况:年龄>= 18 可以游玩 
第二种情况:年龄< 10 不允许游玩 
第三种情况:年龄> 10 &&年龄<= 18 进行选择
Console.WriteLine("请输入你的年龄");
int age = int.Parse(Console.ReadLine());
if (age >= 18)
{
Console.WriteLine("请随便玩");
}
else if (age < 10)
{
Console.WriteLine("好好学习,长大了再来玩");
}
else//对第三种情况做判断
{
Console.WriteLine("你确定要玩吗?yes or no");
string input = Console.ReadLine();//接收用户的输入
if (input == "yes")
{
Console.WriteLine("请在父母陪同下游玩");
}
else
{
Console.WriteLine("回家去吧");
}
}
Console.ReadKey();

7.5 switch-case

语法:

switch (变量或者表达式的值)

{

case 值1:

要执行的代码1;

break;

case 值2:

要执行的代码2;

break;

…………

default:

要执行的代码;

break;

}

简介:

switch(表达式)中的变量可以是int、string、bool、char、enum或相应可以为null的类型,必须有一个定值。

每个case标签后是常量表达式的值,不必连续,也不必按特定顺序排列,但不能相同,否则会出现错误。

如果跟每个case所带的值都不匹配。就看当前这个switch-case结构中是否存在default,如果有default,则执行default中的语句,如果没有default,则该switch-case结构什么都不做。

break语句的作用是中断程序。

注意:

① case 后的常量值不可重复的,不可以是浮点型。

② case的语句块可以有多条语句,而且不使用{}。

③ case语句和default语句的顺序可以随意改变。

④ 一个switch语句中只能有一个default语句,且可以省略。

案例1:对学生的考试成绩评测

成绩>= 90 :A 90 > 成绩 >= 80 :B

80 > 成绩 >= 70 : C 70 > 成绩 >= 60 :D 成绩< 60 :E

Console.WriteLine("请输入你的分数");
int score = int.Parse(Console.ReadLine());
switch (score / 10)//把输入的分数转化为定值区间
{
case 10:
Console.WriteLine("A");
break;
case 9:
Console.WriteLine("A");
break;
case 8:
Console.WriteLine("B");
break;
case 7:
Console.WriteLine("C");
break;
case 6:
Console.WriteLine("D");
break;
//成绩<60
default:
Console.WriteLine("E");
break;
}
Console.ReadKey();
案例2:让用户在控制台中录入一个月份,根据月份 计算天数
//首先分析1 3 5 7 8 10 12 有31天4 6 9 11 有30天2 有28天
Console.WriteLine("请输入一个月份");
int month = int.Parse(Console.ReadLine());
int day;
switch (month)
{
case 2:
day = 28;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
default:
day = 0;
break;
}
Console.WriteLine("{0}月有{1}天", month, day);
Console.ReadKey();
案例3:请用户输年份,再输入月份,输出该月的天数
Console.WriteLine("请输入一个年份");
try
{
    int year = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine("请输入一个月份");
    try
    {
        int month = Convert.ToInt32(Console.ReadLine());//1-12
        if (month >= 1 && month <= 12)
        {
            int day = 0;//声明一个变量用来存储天数
            switch (month)
            {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12: day = 31;
                break;
                case 2:
            //由于2月 有平年和闰年的不同  所以首先要判断一下当年是不是闰年
                    if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
                    {
                        day = 29;
                    }
                    else
                    {
                        day = 28;
                    }
                    break;
            //4 6  9 11
                default: day = 30;
                    break;
              }
                Console.WriteLine("{0}年{1}月有{2}天", year, month, day);
            }//if判断的括号
            else
            {
                Console.WriteLine("输入的月份不符合要求,程序退出");
            }
    }  //try月份括号
    catch  //跟月份配对
    {
        Console.WriteLine("输入的月份有误,程序退出");
    }
}//try年份的括号
catch//跟年份的try配对
{
    Console.WriteLine("输入的年份有误,程序退出");
}
Console.ReadKey();
switch-case与if-else if的区别

1)都可以用来实现多路分支。

2)if else-if实现两路、三路分支比较方便,但是它主要是对布尔表达式、关系表达式或逻辑表达式进行判断的。switch…case实现三路以上分支结构更清晰,代码可读性更强,而switch分支语句主要对常量值进行判断。

3)因为case语句后面必须是定值,所以不适合做范围的判断。

4)如果在程序开发中,如果遇到多分支选择的情况,并且判断条件不是关系表达式、逻辑表达式或浮点类型,就可以使用switch语句,这样效率会更高一些。

7.6 for

语法:

for(表达式1;表达式2;表达式3)

{

循环体;

}

表达式1:一般为声明循环变量,记录循环的次数(int i=0;)

表达式2:一般为循环条件(i<10)

表达式3:一般为改变循环条件的代码,使循环条件终有一天不再成立(i++)

执行过程:程序首先执行表达式1,声明了一个循环变量用来记录循环的次数,然后执行表达式2,判断循环条件是否成立,如果表达式2返回的结果为true,则执行循环体,如果不成立,则跳出for循环。

案例1:1-100的总和
int sum = 0;
for (int i = 0; i < 100; i++)
{
sum = sum + i;
}
Console.WriteLine("1-100的总和{0}", sum);
Console.ReadKey();

输出结果:1-100的总和4950

案例2:求1~100之间不能被3整除的数之和
int sum = 0;
for (int i = 1; i <= 100; i++)  //或者int i=0;i<100;i++
{
    if (i % 3 != 0) 
{
        sum += i;
    }
}
Console.WriteLine("1-100之间不能被3整除的数之和为:{0}", sum);
Console.ReadKey();

输出结果:1-100之间不能被3整除的数之和为:3367

案例3:输出水仙花数

输出水仙花数(个位,十位,百位的立方和等于这个数本身的数),水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153 =13+53+33

① 第一种方式

Console.WriteLine("水仙花数:");
int baiWei, shiWei, geWei, sum;
for (int i = 100; i < 1000; i++)
{
    baiWei = (int)i / 100; //这个强转其实不是很有必要
    shiWei = ((int)i / 10) - baiWei * 10;
    geWei = i % 10;
    sum = (int)( Math.Pow(baiWei, 3) + Math.Pow(shiWei, 3) + Math.Pow(geWei, 3));
    if (sum==i)
    {
        Console.Write(i + "\t");
    }
}
Console.ReadKey();

输出结果:

水仙花数:

153 370 371 407

② 第二种方式

Console.WriteLine("水仙花数:");
for (int i = 100; i < 999; i++)
{
    int a = i / 100;
    int b = i / 10 - a * 10;
    int c = i % 10;
//Math.Pow(a,3):返回a3
    if (i == Math.Pow(a, 3) + Math.Pow(b, 3) + Math.Pow(c, 3))
    {
        Console.WriteLine(i.ToString());
    }
}
案例4:输出九九乘法口诀表
for (int i = 1; i < 10; i++)
{
    for (int j = 1; j < i + 1; j++)
    {
        Console.Write("{0}x{1}={2}\t", j, i, i * j);
    }
    Console.WriteLine();
}
Console.ReadKey();

7.7 while

语法:

while(条件)

{

循环语句;

}

只要给定的条件为真,C#中的while循环语句会重复执行一个目标语句。当条件为假时,程序流将继续执行紧接着循环的下一条语句。

注意:while 循环的关键点是循环可能一次都不会执行。当条件被测试且结果为假时,会跳过循环主体,直接执行紧接着while 循环的下一条语句。

案例1:打印100次"C#从入门到放弃"
int i = 1;
while (i <= 100)
{
    Console.WriteLine("C#从入门到放弃第{0}天", i);
    i++;
}
Console.ReadKey();
案例2:计算1-100的总和
int sum = 0;
int i = 0;
while (i < 100)
{
    i++;
    sum += i;
}
Console.WriteLine("1-100的总和{0}", sum);
Console.ReadKey();
案例3:输入班级人数,然后依次输入学员成绩,计算班级学员的平均成绩和总成绩
int i = 1;  //循坏变量记录循坏次数
int sum = 0;  //用来存储学生成绩总和
Console.WriteLine("请输入班级人数");  //提示用户输入班级人数
try  //用户输入的是数字
{
    int count = int.Parse(Console.ReadLine());//接收用户输入的班级人数
    while (i <= count)//小于等于输入的班级人数
    {
        Console.WriteLine("请输入第{0}个人的成绩", i);
        int score = int.Parse(Console.ReadLine());//接收学员的成绩
        sum += score;//把每一个学员的成绩累加到sum
        i++;
    }
    Console.WriteLine("学员为{0}人的平均成绩是{1}总成绩为{2}", count, sum / count, sum);
}
catch//用户输入非数字
{
    Console.WriteLine("你输入的内容不能转换成数字,程序退出");
}
Console.ReadKey();
案例3:老师问小明,这道题你会做了吗? 如果小明答"会了(yes)",则可以放学. 如果小明不会做(no),则老师再讲一遍,再问学生是否会做了…直到小明会为止,才可以放学.直到小明会或老师给他讲了10遍还不会,都要放学。
string answer = "";//声明小明的回答为空
int i = 1;//记录循坏次数
while (answer == "no" || i <= 10)//进入循坏的两个条件
{
    Console.WriteLine("小明这道题你会了吗yes/no");
    answer = Console.ReadLine();
    if (answer == "yes")//小明回答yes
    {
        Console.WriteLine("OK,放学回家");
        break;//跳出循环
    }
    else //回答不为yes
    {
        if (i == 10)//回答的次数等于10次
        {
            Console.WriteLine("晚上好好琢磨这道题,必须弄懂");
            break;//跳出循环
        }
    i++;
    }
}
Console.ReadKey();
案例4:2022年毕业人数20000人,每年增长25 %,请问按此增长速度,到哪一年毕业人数将达到10万人?
int year = 2022;//声明一个整数变量记录初始年份
double people = 20000;//增长25% ,小数类型这里用double来声明  
while (people<100000)//毕业人数大于10万跳出循坏
{
    people = people * 1.25;
    year++;//人数每增加一次 年份加1
}
Console.WriteLine("{0}年毕业人数将达到10万人",year);
Console.ReadKey();

输出结果:2030年毕业人数将达到10万人

死循环:

在while循环当中,一般总会有那么一行代码,能够改变循环条件,使之终有一天不再成立,如果没有那么一行代码能够改变循环条件,也就是循环条件永远都成立,我们称之这种循环叫做死循环

最简单的最常用的死循环:

while(true)

{

循环语句;

}

7.8 do...while

不像for和while循环,它们是在循环头部测试循环条件。do...while 循环是在循环的尾部检查它的条件。do...while循环与 while 循环类似,但是do...while 循环会确保至少执行一次循环。

语法:

do

{

循环语句;

}while(循环条件);

注意:条件表达式出现在循环的尾部,所以循环语句会在条件被测试之前至少执行一次。如果条件为真,控制流会跳转回上面的do,然后重新执行循环语句。这个过程会不断重复,直到给定条件变为假为止。

案例1
static void Main(string[] args)
{
    int a = 15;
    do
    {
        Console.WriteLine("a 的值: {0}", a);
        a = a + 1;
    } while (a < 20);
    Console.ReadLine();
}

输出结果:

a 的值: 15

a 的值: 16

a 的值: 17

a 的值: 18

a 的值: 19

案例2:明天小兰就要登台演出了,老师说再把明天的演出的歌曲唱一遍,如果满意,小兰就可以回家了.否则就需要再练习一遍,直到老师满意为止(yes / no)。

循环体:老师不停提问,小兰不停回答

循环条件:老师满意(yes)

string answer = "";//声明变量在do-while外面 避免判断条件时访问不到
do
{
    Console.WriteLine("老师,这遍我唱的你满意了嘛?yes/no");
    answer = Console.ReadLine();
} while (answer == "no");//回答no 继续执行循坏
Console.WriteLine("OK,你可以回家了");//回答yes 
Console.ReadKey();
案例3:不断要求用户输入一个数字,然后打印这个数字的二倍,当用户输入quit的时候程序退出

循环体:提示用户输入数字并打印自身的二倍

循环条件:输入的内容为不等于q

string input = "";//声明在do外面 利于后续类型转换以及条件判断 
do
{
    Console.WriteLine("请输入一个数字,我们将打印他的二倍");
    input = Console.ReadLine();//接收用户输入
    if (input != "q")//当用户输入不等于q时
    {
        int number = int.Parse(input);//把用户输入的数字转换为int类型
        Console.WriteLine(number * 2);//打印输入数字的二倍
    }
} while (input != "q");//用户输入为q 跳出循坏
Console.ReadKey();
案例4:要求用户输入用户名和密码,只要不是彭于晏和123456就一直提示用户名或密码错误,请重新输入。

循环体:提示用户输入用户名和密码

循环条件:用户名不等于彭于晏、密码不等于123456

string userName = "";//声明用户的姓名为空
string userpwd = "";//声明用户的密码为空
do
{
    Console.WriteLine("请输入用户名");//提示输入用户名
    userName = Console.ReadLine();//接收用户输入
    Console.WriteLine("请输入密码");//提示输密码
    userpwd = Console.ReadLine();//接收用户输入
} while (userName!="admin"||userpwd!="888888");//循环的两个条件 不确定逻辑与逻辑或可以代入测试
Console.WriteLine("登录成功");
Console.ReadKey();

7.9 foreach

语法:

foreach(数据类型 变量名 in 数组名/集合名)

{

//语句块;

}

注意:

每一次循环时,从集合中取出一个新的元素值。放到只读变量中去,如果括号中的整个表达式返回值为 true,foreach 语句块中的语句就能够执行。

在 foreach 循环中,如果要输出数组中的元素,不需要使用数组中的下标,直接输出变量名即可。

foreach 语句仅能用于数组、字符串或集合类数据类型。

案例1:在 Main 方法中创建一个 double 类型的数组,并在该数组中存入 5 名学生的考试成绩,计算总成绩和平均成绩。
double[] points = { 80, 88, 86, 90, 75.5 };
double sum = 0;
double avg = 0;
foreach (double point in points)
{
    sum = sum + point;
}
avg = sum / points.Length;
Console.WriteLine("总成绩为:" + sum);
Console.WriteLine("平均成绩为:" + avg);
Console.ReadKey();

输出结果:

总成绩为:419.5

平均成绩为:83.9

7.10 break

C# 中 break 语句有以下两种用法:

1)当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。如果使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。

2)它可用于终止 switch 语句中的一个 case。

注意:break一般不单独的使用,而是跟着if判断一起使用,表示,当满足某些条件的时候,就不再循环了。

示例
int a = 10;
while (a < 20)
{
    Console.WriteLine("a 的值: {0}", a);
    a++;
    if (a > 13)
    {
    //使用 break 语句终止 loop
 	break;
    }
}
Console.ReadLine();

输出结果:

a 的值: 10

a 的值: 11

a 的值: 12

a 的值: 13

7.11 continue

1)C#中的continue语句有点像break语句。但它不是强迫终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。

2)对于for循环,continue语句会导致执行条件测试和循环增量部分。对于 while和do...while 循环,continue 语句会导致程序控制回到条件测试上。

猜你喜欢

转载自blog.csdn.net/Y1RV1NG/article/details/129657701
今日推荐