csharp:第二章运算符与流程控制
目录
第二章 运算符与流程控制
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<int> numbers = new List<int> { 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<string> items = new List<string> { "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. 乘法表:使用嵌套循环打印9×9乘法表。
3. 数字累加:使用for循环计算1到100所有整数的和。
4. 字符统计:输入一段文字,统计其中字母、数字、空格和其他字符的数量。
进阶练习
5. 斐波那契数列:输出前20个斐波那契数列的数字(1, 1, 2, 3, 5, 8…)。
6. 完美数:找出1-1000之间的所有完美数(完美数是指其所有真因子之和等于它本身的数,如6=1+2+3)。
7. 数字金字塔:根据用户输入的高度,打印如下形式的数字金字塔:
<code>
1
121
12321
1234321
123454321
</code>
挑战练习
8. ATM模拟器:实现一个简单的ATM程序,功能包括:
- 查询余额
- 存款
- 取款(检查余额是否足够)
- 退出
使用循环让用户可以连续操作。
9. 日历打印:根据用户输入的年份和月份,打印该月的日历格式。
10. 汉诺塔问题:使用递归实现汉诺塔问题的解决方案,并显示移动步骤。
本章小结
本章学习了C#的流程控制:
- if/else条件判断和三元运算符
- switch语句和switch表达式
- for、while、do-while循环
- foreach循环遍历集合
- break和continue控制循环
- 模式匹配的强大功能
- 空值处理运算符
掌握这些流程控制结构后,你就能编写复杂的逻辑程序了。
csharp/第二章运算符与流程控制.txt · 最后更改: 由 127.0.0.1
