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# 流程控制的全部内容,如果你在学习过程中有任何疑问或心得,欢迎在评论区留言分享!