C#初级教程(4)——流程控制:从基础到实践

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# 提供了**breakcontinue、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). 一个控制台应用程序,要求完成下列功能

  1. 接收一个整数 n。

  2. 如果接收的值 n 为正数,输出 1 - n 间的全部整数。

  3. 如果接收的值 n 为负值,用 break 退出循环(这里假设用循环接收输入)。

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

相关推荐
猷咪3 小时前
C++基础
开发语言·c++
IT·小灰灰3 小时前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧3 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q3 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳03 小时前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾3 小时前
php 对接deepseek
android·开发语言·php
2601_949868363 小时前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
星火开发设计3 小时前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识
qq_177767373 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
一匹电信狗3 小时前
【LeetCode_21】合并两个有序链表
c语言·开发语言·数据结构·c++·算法·leetcode·stl