目录

第二章 运算符与流程控制

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程序,功能包括:

  1. 查询余额
  2. 存款
  3. 取款(检查余额是否足够)
  4. 退出

使用循环让用户可以连续操作。

9. 日历打印:根据用户输入的年份和月份,打印该月的日历格式。

10. 汉诺塔问题:使用递归实现汉诺塔问题的解决方案,并显示移动步骤。

本章小结

本章学习了C#的流程控制:

  1. if/else条件判断和三元运算符
  2. switch语句和switch表达式
  3. for、while、do-while循环
  4. foreach循环遍历集合
  5. break和continue控制循环
  6. 模式匹配的强大功能
  7. 空值处理运算符

掌握这些流程控制结构后,你就能编写复杂的逻辑程序了。