1.为什么需要流程控制
有时候,需要根据程序运行时的具体环境,有选择地执行不同代码段;而有时候,则需要反复执行同一段代码。这时候,流程控制中的分支和循环就发挥了关键作用。分支能让代码根据条件判断结果来决定执行路径,循环则负责重复执行特定代码,提高代码的复用性和效率。
2.布尔运算符:条件判断的基石
在进行条件判断时,布尔运算符是不可或缺的工具。C# 提供了丰富的布尔运算符,包括比较运算符(如==
、!=
、<
、>
、<=
、>=
)、逻辑运算符(!
、&
、|
、^
、&&
、||
)以及布尔赋值运算符(&=
、|=
、^=
) 。这些运算符用于比较值、组合条件以及对布尔值进行操作,帮助我们构建复杂的条件表达式。例如:
int num1 = 10;
int num2 = 20;
bool result1 = num1 < num2; // true
bool result2 = num1 != num2 && num1 > 5; // true
需要注意的是,逻辑与(&&
)和逻辑或(||
)存在短路特性。&&
运算符在第一个操作数为false
时,不会计算第二个操作数;||
运算符在第一个操作数为true
时,不会计算第二个操作数。这一特性在优化代码性能和避免不必要的计算时非常有用。
3.分支结构:灵活决策的实现
(1)if 语句
if
语句是最基本的分支结构,它根据条件表达式的结果来决定是否执行特定代码块。语法如下:
if (condition)
{// 当condition为true时执行的代码
}
例如,判断一个数是否为正数:
int number = 15;
if (number > 0)
{Console.WriteLine($"{number}是正数");
}
(2)if - else 语句
if - else
语句在if
的基础上增加了条件不满足时的执行路径。
if (condition)
{// 当condition为true时执行的代码
}
else
{// 当condition为false时执行的代码
}
比如,判断一个数的奇偶性:
int num = 7;
if (num % 2 == 0)
{Console.WriteLine($"{num}是偶数");
}
else
{Console.WriteLine($"{num}是奇数");
}
(3)if - else if - else 语句
这种结构允许根据多个条件进行多分支判断。
if (condition1)
{// 当condition1为true时执行的代码
}
else if (condition2)
{// 当condition1为false且condition2为true时执行的代码
}
else
{// 当所有条件都为false时执行的代码
}
以成绩等级评定为例:
int score = 75;
if (score >= 90)
{Console.WriteLine("成绩等级为优");
}
else if (score >= 80)
{Console.WriteLine("成绩等级为良");
}
else if (score >= 60)
{Console.WriteLine("成绩等级为中");
}
else
{Console.WriteLine("成绩等级为差");
}
(4)三元运算符
三元运算符(? :
)是一种简洁的条件表达式,它可以根据条件返回两个值中的一个。
result = condition? valueIfTrue : valueIfFalse;
例如,判断一个数是否大于 10 并返回相应的字符串:
int num = 12;
string result = num > 10? "大于10" : "小于等于10";
Console.WriteLine(result);
(5)switch 语句
switch
语句用于将一个变量或表达式与多个常量值进行比较,并根据匹配结果执行相应的代码块。
switch (expression)
{case value1:// 当expression等于value1时执行的代码break;case value2:// 当expression等于value2时执行的代码break;default:// 当expression与所有case值都不匹配时执行的代码break;
}
假设我们有一个表示季节的整数变量,用switch
语句输出对应的季节名称:
int season = 2;
switch (season)
{case 1:Console.WriteLine("春季");break;case 2:Console.WriteLine("夏季");break;case 3:Console.WriteLine("秋季");break;case 4:Console.WriteLine("冬季");break;default:Console.WriteLine("无效的季节值");break;
}
switch
语句还有一些特殊用法,比如与goto
结合,以及合并多个case
来处理相同的逻辑:
switch (number)
{case 1:Console.WriteLine("数字是1");goto case 2;case 2:Console.WriteLine("数字是2或者从1跳转过来");break;case 3:case 4:Console.WriteLine("数字是3或4");break;
}
4.循环结构:重复执行的利器
(1)for 循环
for
循环适用于已知循环次数的场景,它的语法结构包含初始化、循环条件和每次循环后的操作。
for (initialization; condition; operation)
{// 循环体代码
}
例如,输出 1 到 10 的整数:
for (int i = 1; i <= 10; i++)
{Console.WriteLine(i);
}
(2)while 循环
while
循环在条件表达式为true
时,持续执行循环体代码。
while (condition)
{// 循环体代码
}
比如,计算 1 到 100 的累加和:
int sum = 0;
int num = 1;
while (num <= 100)
{sum += num;num++;
}
Console.WriteLine($"1到100的累加和为:{sum}");
(3)do - while 循环
do - while
循环与while
循环类似,但它会先执行一次循环体,再判断条件。
do
{// 循环体代码
} while (condition);
用do - while
循环实现输入验证,确保用户输入的是正数:
int input;
do
{Console.Write("请输入一个正数:");input = int.Parse(Console.ReadLine());
} while (input <= 0);
(4)循环中断语句
在循环过程中,我们常常需要根据特定条件提前终止循环或跳过某次循环。C# 提供了break
、continue
、goto
和return
等语句来实现这些功能。
break
语句用于立即终止当前循环,跳出循环体。例如,在遍历数组时,找到目标元素后停止遍历:
int[] numbers = { 1, 3, 5, 7, 9 };
int target = 5;
for (int i = 0; i < numbers.Length; i++)
{if (numbers[i] == target){Console.WriteLine($"找到目标元素,索引为:{i}");break;}
}
continue
语句会跳过当前循环的剩余部分,直接开始下一次循环。比如,只输出 1 到 10 中的偶数:
for (int i = 1; i <= 10; i++)
{if (i % 2 != 0){continue;}Console.WriteLine(i);
}
goto
语句可以跳转到指定的标签位置,但过度使用会使代码结构混乱,应谨慎使用。例如:
int count = 0;
start:
if (count < 5)
{Console.WriteLine(count);count++;goto start;
}
return
语句用于跳出当前函数,同时也会终止包含它的循环。在方法中,根据特定条件提前返回结果:
int CalculateSum(int[] numbers)
{int sum = 0;foreach (int num in numbers){if (num < 0){return -1; // 遇到负数提前返回}sum += num;}return sum;
}
5.练习
(1). 输入 5 个整数,求出其中的最大值和最小值并显示
using System;class Program
{static void Main(){int max = int.MinValue;int min = int.MaxValue;Console.WriteLine("请输入 5 个整数:");for (int i = 0; i < 5; i++){Console.Write($"请输入第 {i + 1} 个整数:");int num = int.Parse(Console.ReadLine());if (num > max){max = num;}if (num < min){min = num;}}Console.WriteLine($"最大值是:{max}");Console.WriteLine($"最小值是:{min}");}
}
(2). 让用户输入三个整数,前两个是操作数,第三个是 0 - 4 之间的数,0 代表加法,1 代表减法,2 代表乘法,3 代表除法,4 代表取模运算,计算结果
using System;class Program
{static void Main(){Console.Write("请输入第一个整数:");int num1 = int.Parse(Console.ReadLine());Console.Write("请输入第二个整数:");int num2 = int.Parse(Console.ReadLine());Console.Write("请输入 0 - 4 之间的一个数(0:加法,1:减法,2:乘法,3:除法,4:取模):");int operation = int.Parse(Console.ReadLine());double result = 0;switch (operation){case 0:result = num1 + num2;break;case 1:result = num1 - num2;break;case 2:result = num1 * num2;break;case 3:if (num2 != 0){result = (double)num1 / num2;}else{Console.WriteLine("除数不能为 0");return;}break;case 4:if (num2 != 0){result = num1 % num2;}else{Console.WriteLine("除数不能为 0");return;}break;default:Console.WriteLine("输入的操作数无效");return;}Console.WriteLine($"计算结果是:{result}");}
}
(3). 求出 1 - 1500 之间的所有能被 9 整除的数,并计算和输出每 6 个的和
using System;class Program
{static void Main(){int count = 0;int sum = 0;for (int i = 1; i <= 1500; i++){if (i % 9 == 0){sum += i;count++;if (count % 6 == 0){Console.WriteLine($"每 6 个能被 9 整除的数的和是:{sum}");sum = 0;}}}}
}
(4). 编写一个控制台程序,分别输出 1 - 150 之间的平方、立方
using System;class Program
{static void Main(){for (int i = 1; i <= 150; i++){int square = i * i;int cube = i * i * i;Console.WriteLine($"数字 {i} 的平方是:{square},立方是:{cube}");}}
}
(5). 青蛙繁殖问题。设有一对新生的青蛙,从第四个月开始它们每个月都生一对青蛙,新生的青蛙从第四个月开始又每个月生一对青蛙。按此规律,并假定青蛙没有死亡,25 个月后共有多少对青蛙?
using System;class Program
{static void Main(){int month = 25;int first = 1;int second = 1;int third = 1;int current = 0;for (int i = 4; i <= month; i++){current = first + third;first = second;second = third;third = current;}Console.WriteLine($"25 个月后共有 {current} 对青蛙");}
}
(6). 编程输出 1 - 150 中能被 4 整除但不能被 7 整除的数,并统计有多少个这样的数
using System;class Program
{static void Main(){int count = 0;for (int i = 1; i <= 150; i++){if (i % 4 == 0 && i % 7 != 0){Console.WriteLine(i);count++;}}Console.WriteLine($"共有 {count} 个这样的数");}
}
(7). 编程输出 1500 以内的所有素数
using System;class Program
{static void Main(){for (int num = 2; num <= 1500; num++){bool isPrime = true;for (int i = 2; i < num; i++){if (num % i == 0){isPrime = false;break;}}if (isPrime){Console.WriteLine(num);}}}
}
(8). 编程输出十一乘法表
using System;class Program
{static void Main(){for (int i = 1; i <= 11; i++){for (int j = 1; j <= i; j++){Console.Write($"{j} x {i} = {i * j}\t");}Console.WriteLine();}}
}
(9). 编写一个掷骰子 150 次的程序,并打印出各种点数的出现次数
using System;class Program
{static void Main(){int count1 = 0;int count2 = 0;int count3 = 0;int count4 = 0;int count5 = 0;int count6 = 0;Random random = new Random();for (int i = 0; i < 150; i++){int dice = random.Next(1, 7);switch (dice){case 1:count1++;break;case 2:count2++;break;case 3:count3++;break;case 4:count4++;break;case 5:count5++;break;case 6:count6++;break;}}Console.WriteLine($"点数 1 出现的次数:{count1}");Console.WriteLine($"点数 2 出现的次数:{count2}");Console.WriteLine($"点数 3 出现的次数:{count3}");Console.WriteLine($"点数 4 出现的次数:{count4}");Console.WriteLine($"点数 5 出现的次数:{count5}");Console.WriteLine($"点数 6 出现的次数:{count6}");}
}
(10). 一个控制台应用程序,输出 1 - 7 的平方值,分别用 for、while、do - while 语句实现
using System;class Program
{static void Main(){// for 语句实现Console.WriteLine("使用 for 语句:");for (int i = 1; i <= 7; i++){Console.WriteLine($"数字 {i} 的平方是:{i * i}");}// while 语句实现Console.WriteLine("使用 while 语句:");int j = 1;while (j <= 7){Console.WriteLine($"数字 {j} 的平方是:{j * j}");j++;}// do - while 语句实现Console.WriteLine("使用 do - while 语句:");int k = 1;do{Console.WriteLine($"数字 {k} 的平方是:{k * k}");k++;} while (k <= 7);}
}
(11). 一个控制台应用程序,要求用户输入 7 个大写字母,如果用户输入的信息不满足要求,提示帮助信息并要求重新输入
using System;class Program
{static void Main(){bool validInput = false;while (!validInput){Console.WriteLine("请输入 7 个大写字母:");string input = Console.ReadLine();if (input.Length == 7){validInput = true;for (int i = 0; i < 7; i++){if (!char.IsUpper(input[i])){validInput = false;break;}}}if (!validInput){Console.WriteLine("输入无效,请输入 7 个大写字母。");}}Console.WriteLine("输入有效。");}
}
(12). 一个控制台应用程序,要求完成下列功能
- 接收一个整数 n。
- 如果接收的值 n 为正数,输出 1 - n 间的全部整数。
- 如果接收的值 n 为负值,用 break 退出循环(这里假设用循环接收输入)。
- 如果 n 为 0 的话,继续接收下一个整数。
using System;class Program
{static void Main(){while (true){Console.Write("请输入一个整数:");int n = int.Parse(Console.ReadLine());if (n > 0){for (int i = 1; i <= n; i++){Console.WriteLine(i);}}else if (n < 0){break;}}}
}
(13). 一个控制台应用程序,求 2000 之内的所有 “完数”
using System;class Program
{static void Main(){for (int num = 2; num <= 2000; num++){int sum = 0;for (int i = 1; i < num; i++){if (num % i == 0){sum += i;}}if (sum == num){Console.WriteLine(num);}}}
}
6.总结
通过本文对 C# 流程控制的详细讲解,相信大家对分支和循环结构有了更深入的理解。从基本的条件判断到复杂的多分支决策,再到灵活的循环控制,这些知识是编写高效、健壮 C# 程序的基础。希望大家在实际编程中不断练习和运用,逐渐掌握流程控制的技巧,提升自己的编程能力。以上就是本期关于 C# 流程控制的全部内容,如果你在学习过程中有任何疑问或心得,欢迎在评论区留言分享!