====== 第二章 运算符与流程控制 ======
===== 2.1 条件语句 =====
=== if语句 ===
int score = 85;
if (score >= 90)
{
Console.WriteLine("优秀");
}
else if (score >= 80)
{
Console.WriteLine("良好");
}
else if (score >= 70)
{
Console.WriteLine("中等");
}
else if (score >= 60)
{
Console.WriteLine("及格");
}
else
{
Console.WriteLine("不及格");
}
=== 三元运算符 ===
int age = 20;
string status = age >= 18 ? "成年人" : "未成年人";
// 嵌套三元运算符
int score = 85;
string grade = score >= 90 ? "A" :
score >= 80 ? "B" :
score >= 70 ? "C" :
score >= 60 ? "D" : "F";
=== switch语句 ===
==== 基本switch ====
int day = 3;
switch (day)
{
case 1:
Console.WriteLine("星期一");
break;
case 2:
Console.WriteLine("星期二");
break;
case 3:
Console.WriteLine("星期三");
break;
case 4:
Console.WriteLine("星期四");
break;
case 5:
Console.WriteLine("星期五");
break;
case 6:
case 7:
Console.WriteLine("周末");
break;
default:
Console.WriteLine("无效的日期");
break;
}
==== switch表达式(C# 8+) ====
int day = 3;
string dayName = day switch
{
1 => "星期一",
2 => "星期二",
3 => "星期三",
4 => "星期四",
5 => "星期五",
6 or 7 => "周末",
_ => "无效的日期"
};
// 模式匹配switch表达式
string GetDescription(object obj) => obj switch
{
int i when i > 0 => $"正整数: {i}",
int i when i < 0 => $"负整数: {i}",
0 => "零",
string s => $"字符串: {s}",
null => "空值",
_ => "未知类型"
};
===== 2.2 循环语句 =====
=== for循环 ===
// 基本for循环
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"第 {i + 1} 次循环");
}
// 递减循环
for (int i = 10; i > 0; i--)
{
Console.WriteLine(i);
}
// 多变量循环
for (int i = 0, j = 10; i < j; i++, j--)
{
Console.WriteLine($"i={i}, j={j}");
}
// 省略部分表达式
int n = 0;
for (; n < 5;)
{
Console.WriteLine(n);
n++;
}
=== while循环 ===
// 基本while循环
int count = 0;
while (count < 5)
{
Console.WriteLine($"Count: {count}");
count++;
}
// 读取输入直到用户输入"exit"
string input = "";
while (input.ToLower() != "exit")
{
Console.Write("输入内容 (exit退出): ");
input = Console.ReadLine();
Console.WriteLine($"你输入了: {input}");
}
=== do-while循环 ===
// 至少执行一次
int number;
do
{
Console.Write("请输入1-100之间的数字: ");
} while (!int.TryParse(Console.ReadLine(), out number) || number < 1 || number > 100);
Console.WriteLine($"你输入了: {number}");
=== foreach循环 ===
// 遍历数组
string[] names = { "Alice", "Bob", "Charlie" };
foreach (string name in names)
{
Console.WriteLine(name);
}
// 遍历列表
List numbers = new List { 1, 2, 3, 4, 5 };
foreach (int num in numbers)
{
Console.WriteLine(num * num);
}
===== 2.3 循环控制 =====
=== break语句 ===
// 跳出循环
for (int i = 0; i < 100; i++)
{
if (i == 10)
{
break; // 当i等于10时跳出循环
}
Console.WriteLine(i);
}
// 查找第一个能被7和13整除的数
for (int i = 1; ; i++)
{
if (i % 7 == 0 && i % 13 == 0)
{
Console.WriteLine($"第一个能被7和13整除的数是: {i}");
break;
}
}
=== continue语句 ===
// 跳过当前迭代
for (int i = 0; i < 10; i++)
{
if (i % 2 == 0)
{
continue; // 跳过偶数
}
Console.WriteLine(i); // 只输出奇数
}
// 处理列表时跳过null值
List items = new List { "A", null, "B", null, "C" };
foreach (var item in items)
{
if (item == null)
{
continue;
}
Console.WriteLine(item.ToUpper());
}
=== 嵌套循环与标签 ===
// 嵌套循环
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
Console.Write($"{j}x{i}={i * j}\t");
}
Console.WriteLine();
}
// 使用标签跳出多层循环
outer: for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (i * j > 20)
{
break outer; // 跳出外层循环
}
Console.Write($"{i},{j} ");
}
Console.WriteLine();
}
===== 2.4 模式匹配(C# 7+) =====
=== is表达式 ===
object obj = "Hello";
// 类型检查并赋值
if (obj is string str)
{
Console.WriteLine($"字符串长度: {str.Length}");
}
// 带条件的模式匹配
object value = 42;
if (value is int num && num > 0)
{
Console.WriteLine($"正整数: {num}");
}
=== 属性模式 ===
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person person = new Person { Name = "张三", Age = 25 };
if (person is { Age: >= 18, Name: not null })
{
Console.WriteLine("成年人");
}
// 更复杂的属性模式
string description = person switch
{
{ Age: < 13 } => "儿童",
{ Age: >= 13 and < 20 } => "青少年",
{ Age: >= 20 and < 60 } => "成年人",
{ Age: >= 60 } => "老年人",
_ => "未知"
};
=== 列表模式(C# 11+) ====
int[] numbers = { 1, 2, 3 };
if (numbers is [1, 2, 3])
{
Console.WriteLine("匹配数组 [1, 2, 3]");
}
if (numbers is [_, _, _])
{
Console.WriteLine("包含3个元素的数组");
}
if (numbers is [1, ..])
{
Console.WriteLine("以1开头的数组");
}
// 切片模式
int[] arr = { 1, 2, 3, 4, 5 };
if (arr is [1, .. var middle, 5])
{
Console.WriteLine($"中间元素: {string.Join(", ", middle)}");
}
===== 2.5 空值处理 =====
=== 空合并运算符 ===
string name = null;
string displayName = name ?? "匿名用户"; // 如果name为null,使用"匿名用户"
// 空合并赋值(C# 8+)
name ??= "默认值"; // 如果name为null,赋值为"默认值"
=== 空条件运算符 ===
Person person = null;
// 传统方式
// int length = person.Name.Length; // 会抛出NullReferenceException
// 使用空条件运算符
int? length = person?.Name?.Length; // 安全地访问,如果任何环节为null,返回null
// 结合空合并运算符
int len = person?.Name?.Length ?? 0; // 如果为null,使用0
===== 2.6 实战示例 =====
=== 猜数字游戏 ===
Random random = new Random();
int target = random.Next(1, 101);
int attempts = 0;
int guess;
Console.WriteLine("猜数字游戏!我想了一个1-100之间的数字。");
do
{
Console.Write("请输入你的猜测: ");
if (!int.TryParse(Console.ReadLine(), out guess))
{
Console.WriteLine("请输入有效的数字!");
continue;
}
attempts++;
if (guess < target)
{
Console.WriteLine("太小了!再试一次。");
}
else if (guess > target)
{
Console.WriteLine("太大了!再试一次。");
}
else
{
Console.WriteLine($"恭喜你!用了 {attempts} 次猜对了!");
}
} while (guess != target);
=== 打印菱形 ===
Console.Write("请输入菱形的大小: ");
int size = int.Parse(Console.ReadLine());
// 上半部分(包括中间行)
for (int i = 1; i <= size; i++)
{
// 打印空格
for (int j = 1; j <= size - i; j++)
{
Console.Write(" ");
}
// 打印星号
for (int k = 1; k <= 2 * i - 1; k++)
{
Console.Write("*");
}
Console.WriteLine();
}
// 下半部分
for (int i = size - 1; i >= 1; i--)
{
for (int j = 1; j <= size - i; j++)
{
Console.Write(" ");
}
for (int k = 1; k <= 2 * i - 1; k++)
{
Console.Write("*");
}
Console.WriteLine();
}
=== 计算素数 ===
Console.Write("请输入一个正整数: ");
int n = int.Parse(Console.ReadLine());
Console.WriteLine($"1到{n}之间的素数:");
for (int num = 2; num <= n; num++)
{
bool isPrime = true;
for (int i = 2; i <= Math.Sqrt(num); i++)
{
if (num % i == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
Console.Write(num + " ");
}
}
Console.WriteLine();
===== 练习题 =====
=== 基础练习 ===
1. **成绩等级判断**:使用switch表达式重写第一章的成绩等级判断程序。
2. **乘法表**:使用嵌套循环打印9x9乘法表。
3. **数字累加**:使用for循环计算1到100所有整数的和。
4. **字符统计**:输入一段文字,统计其中字母、数字、空格和其他字符的数量。
=== 进阶练习 ===
5. **斐波那契数列**:输出前20个斐波那契数列的数字(1, 1, 2, 3, 5, 8...)。
6. **完美数**:找出1-1000之间的所有完美数(完美数是指其所有真因子之和等于它本身的数,如6=1+2+3)。
7. **数字金字塔**:根据用户输入的高度,打印如下形式的数字金字塔:
1
121
12321
1234321
123454321
=== 挑战练习 ===
8. **ATM模拟器**:实现一个简单的ATM程序,功能包括:
- 查询余额
- 存款
- 取款(检查余额是否足够)
- 退出
使用循环让用户可以连续操作。
9. **日历打印**:根据用户输入的年份和月份,打印该月的日历格式。
10. **汉诺塔问题**:使用递归实现汉诺塔问题的解决方案,并显示移动步骤。
===== 本章小结 =====
本章学习了C#的流程控制:
- if/else条件判断和三元运算符
- switch语句和switch表达式
- for、while、do-while循环
- foreach循环遍历集合
- break和continue控制循环
- 模式匹配的强大功能
- 空值处理运算符
掌握这些流程控制结构后,你就能编写复杂的逻辑程序了。