[C# 流程控制]-C# 中的 if/switch 选择结构

##################################################

目录

if 选择结构

代码风格

单 if 结构

if-else 结构

多重 if 结构

嵌套 if 结构

if 选择结构测试

SBS 取款业务

switch 选择结构

C# switch 与 Java 的不同

Java's switch

C# switch 标准语法

switch 小练习

银行全称

去掉 break 测试

星期白菜价

switch 与 if 选择结构综合测试

项目进阶

SBS 系统菜单


##################################################

if 选择结构

——————————

代码风格

        C# 的 if 结构的语法和 Java 中的完全相同

        不过 这里我们说一下 C# 的标准代码风格!

        为了使得 if 结构更加清晰 我们把每个 if/else 包含的语句 都用大括号括起来
        相匹配的一对 if/else 应左对齐
        内层的 if 结构要有一定的缩进

        大括号按规范写法来对比:

        C# 大括号

{

        和

}

        各占一行

        Java 左大括号

{

        紧跟条件后面

        右大括号

}

        另起新的一行

        这些编程习惯 主要是提高程序的可读性

——————————

单 if 结构

        语法如下:

if (条件表达式)
{
	// 代码块
}

——————————

if-else 结构

        语法如下:

if (条件表达式)
{
	// 代码块
}
else
{
	// 代码块
}

——————————

多重 if 结构

        语法:

if (条件表达式)
{
	// 代码块
}
else if (条件表达式)
{
	// 代码块
}
else if (条件表达式)
{
	// 代码块
}
else
{
	// 代码块
}

——————————

嵌套 if 结构

        还记得嵌套 if 吗?

只有满足外层 if 条件 才能判断内层 if 条件
另外需要注意的是 else 与最近的缺少 else 块的 if 相匹配

        语法格式:

if (条件表达式)
{
	if (条件表达式)
	{
		// 代码块
	}
	else
	{
		// 代码块
	}
}
else
{
	// 代码块
}

——————————

if 选择结构测试

%%%%%

SBS 取款业务

        在 SBS 开户业务的基础上 添加 取款功能

        需求如下:

判断输入的账号是否正确
正确 取款 否则输出 账户不存在
判断输入的密码是否正确
相符 继续 否则输出 密码有误
若取款金额大于 0 并取款金额不大于余额 则更新余额 并提示 取款成功
否则输出 取款失败

        VScode code:

namespace _6.SBS_取款业务
{
    /*  思路
     * 
     *  在 Bank 类中定义 取款方法模块 用于接收用户输入信息 并调用 User 类中的 取款方法实现模块
     *  
     *  在 User 类中定义 取款方法实现模块
     *  使用嵌套 if 来判断
     *  外层用来判断取款金额是否大于 0
     *  内层用来判断取款金额是否大于 余额
     *  
     *  在 Main() 中实例化 Bank 类的对象 调用 开户模块 开户内置调用取款模块
     */

    /// <summary>
    /// 银行类
    /// </summary>
    public class Bank
    {
        /* 字段暂缺
         * ... ...
         */

        /* 一定要声明全局对象 因为不止一个方法要用! */
        User usr = new User();

        /// <summary>
        /// 开户方法
        /// </summary>
        public void CreateAccount()
        {
            /* 初始化 */
            string account = "163729837463";    // 随机指定的账号
            /* 接收数据 */
            usr._account = account; // 得到账号
            Console.Write("请输入用户名 <<< ");
            usr._name = Console.ReadLine(); // 得到用户名
            Console.Write("请输入用户密码 <<< ");
            usr._pass = Console.ReadLine(); // 得到用户密码
            Console.Write("请输入用户身份证号 <<< ");
            usr._identityNum = Console.ReadLine();  // 得到用户身份证号
            Console.Write("请输入用户存款金额 <<< ");
            usr._balance = double.Parse(Console.ReadLine());    // 得到用户存款金额
            /* 输出信息 */
            Console.WriteLine("\n\t账户 {0}\n\t用户名 {1}\n\t存款金额 {2}\n\t创建成功!",
                usr._account, usr._name, usr._balance);
            /* 调用取款业务 */
            WithDraw();
        }

        /// <summary>
        /// 取款方法
        /// </summary>
        public void WithDraw()
        {
            /* 准备 */
            string account; // 账号
            string pwd; // 密码
            double money;   // 取款金额
            double result;  // 返回余额
            /* 接收账号验证 */
            Console.WriteLine();
            Console.Write("请输入账号 <<< ");
            account = Console.ReadLine();
            if (account.Length == 0)
            { /* 此处偷懒 仅判断账号长度 _(:з」∠)_ ! */
                Console.WriteLine("..> 输入的账号不正确..\n");
                return; // 还记得吗? 熟悉的 return !如果长度不对则返回调用方法处
            }
            /* 接收密码验证 */
            Console.Write("请输入账户密码 <<< ");
            pwd = Console.ReadLine();
            if (usr._pass != pwd)
            { /* 这回没偷懒 将刚得到的密码与 User 类的 密码字段 比较 */
                Console.WriteLine("..> 密码有误!\n");
                return;
            }
            /* 取款操作 */
            Console.Write("请输入取款金额 <<< ");
            money = double.Parse(Console.ReadLine());   // 调用 double.Parse() 将得到的字符串转换为 double 再赋给 money
            result = usr.MinusMoney(money); // 调用 User 类的 取款实现模块 得到取款后的余额
            /* 结果输出 */
            if (result == -1)
            { /* 若结果 -1 则表示取款失败辽。。 */
                Console.WriteLine("..> 取款失败!\n");
            }
            else
            {
                Console.WriteLine("..> 取款成功!当前余额: {0}\n", result);
            }
            /* 程序结束 */
            Console.ReadLine();
        }
    }

    /// <summary>
    /// 账户类
    /// </summary>
    public class User
    {
        public string _name;    // 用户名
        public string _account; // 账号
        public string _pass;    // 用户密码
        public string _identityNum; // 身份证号
        public double _balance; // 存款余额

        /// <summary>
        /// 取款实现方法
        /// </summary>
        /// <param name="money">要取得的金额</param>
        /// <returns>返回余额 若为 -1 则输入有误</returns>
        public double MinusMoney(double money)
        {
            if (money > 0)
            { /* 判断取款金额是否大于 0 */
                if (money <= _balance)
                { /* 判断取款金额是否大于余额 */
                    _balance -= money;  // -= 熟悉吗? 相当于 _balance = _balance - money
                    return _balance;
                }
                else
                {
                    return -1;
                }
            }
            else
            {
                return -1;
            }
        }
    }

    /// <summary>
    /// 主类
    /// </summary>
    class Program
    {
        /// <summary>
        /// Main 方法
        /// </summary>
        static void Main(string[] args)
        {
            /* 开户模块内置调用取款模块 调用开户即可! */
            Bank ba = new Bank();
            ba.CreateAccount();
            ba.CreateAccount();
            ba.CreateAccount();
            ba.CreateAccount();
            ba.CreateAccount();
        }
    }
}

        VSCode demo:

请输入用户名 <<< first
请输入用户密码 <<< 123456
请输入用户身份证号 <<< 111111111111111111
请输入用户存款金额 <<< 666999

        账户 163729837463
        用户名 first
        存款金额 666999
        创建成功!

请输入账号 <<<
..> 输入的账号不正确..

请输入用户名 <<< first
请输入用户密码 <<< 123456
请输入用户身份证号 <<< 111111111111111111
请输入用户存款金额 <<< 666999

        账户 163729837463
        用户名 first
        存款金额 666999
        创建成功!

请输入账号 <<< 163729837463
请输入账户密码 <<< 123
..> 密码有误!

请输入用户名 <<< first
请输入用户密码 <<< 123456
请输入用户身份证号 <<< 111111111111111111
请输入用户存款金额 <<< 666999

        账户 163729837463
        用户名 first
        存款金额 666999
        创建成功!

请输入账号 <<< 163729837463
请输入账户密码 <<< 123456
请输入取款金额 <<< -521
..> 取款失败!


请输入用户名 <<< first
请输入用户密码 <<< 123456
请输入用户身份证号 <<< 111111111111111111
请输入用户存款金额 <<< 666999

        账户 163729837463
        用户名 first
        存款金额 666999
        创建成功!

请输入账号 <<< 163729837463
请输入账户密码 <<< 123456
请输入取款金额 <<< 999666
..> 取款失败!


请输入用户名 <<< first
请输入用户密码 <<< 123456
请输入用户身份证号 <<< 111111111111111111
请输入用户存款金额 <<< 666999

        账户 163729837463
        用户名 first
        存款金额 666999
        创建成功!

请输入账号 <<< first
请输入账户密码 <<< 123456
请输入取款金额 <<< 999
..> 取款成功!当前余额: 666000

##################################################

switch 选择结构

——————————

C# switch 与 Java 的不同

        C# 的 switch 结构与 Java 不同

        Java 允许 case 中没有 break 这样程序会继续下一个 case 或执行完 switch
        紧跟在 switch 后面的表达式的值或变量可以为整形或字符型

        C# 要求每个 case 块和 default 块都必须有 break 语句!
        除非两个 case 块间没有其她语句 那么前一个 case 块就可以不包含 break

        C# 的 switch 更加灵活 判断的表达式除了变量 还可以是字符串类型
        而早期的 Java 就不能是字符串类型

%%%%%

Java's switch

        语法格式:

switch ( int/char 表达式 ) {

	case 常量表达式_1:

			// 代码块
		break;	/* 可以没有 break 语句 */

	case 常量表达式_2:

			// 代码块
		break;	/* 可以没有 break 语句 */

	case 常量表达式_N:

			// 代码块
		break;	/* 可以没有 break 语句 */

	default:

		// 代码块
}

%%%%%

C# switch 标准语法

        语法格式:

switch (int/char/string 表达式)
{
	case 常量表达式_1:
			// 代码块
		break;	/* 必须存在 */
	case 常量表达式_2:
			// 代码块
		break;	/* 必须存在 */
	case 常量表达式_N:
			// 代码块
		break;	/* 必须存在 */
	default:
			// 代码块
		break;	/* 必须存在 */
}

        如果要省略 break 语句 则两个 case 之间没有其她语句
        头一个 case 块可以省略 break 语句

        若如此 不论 switch 表达式满足前一个还是后一个 case 表达式
        都将执行前一个 case 块 又因为前一个 case 块为空
        则程序执行后面的 case 块 直到遇到 break 语句为止

        下面的例子中 case_2、case_3 之间没有任何语句
        所以 case_2 可省略 break 语句
        此时 若满足 case_2/case_3 时都将执行 case_2

        C# switch 无 break 语法格式:

switch (int/char/string 表达式)
{
	case 常量表达式_1:
			// 代码块
		break;
	case 常量表达式_2:
			/* 无内容 可省略 break 语句 */
	case 常量表达式_3:
			// 代码块
		break;
	case 常量表达式_4:
			// 代码块
		break;
	case 常量表达式_N:
			// 代码块
		break;
	default:
			// 代码块
		break;
}

        最后要说的是 switch 结构中 case 子句的摆放是没有顺序的
        就是说 可以把 default 子句放在最前面 这时需要注意的是:

任意两个 case 语句不能具有相同的值

        对了 不管是哪一种形式的 switch
        case 子句中的值必须是常量表达式 不允许使用变量

——————————

switch 小练习

%%%%%

银行全称

        现有三家银行的简称和全称对照表 请根据输入的简称输出对应银行的全称

        简称和全称对照:

ICBC        中国工商银行
CBC        中国建设银行
ABC        中国农业银行

        思路:

此类问题属于等值判断
可以简单的使用 switch 结构实现

        VSCode code:

using System;

namespace _7.小练习_银行全称
{
    /// <summary>
    /// 银行称呼类
    /// </summary>
    class FullBankName
    {
        /// <summary>
        /// 输出银行全称方法
        /// </summary>
        public void BankNameOutPut()
        { /* 通过输入简称来输出全称 */
            Console.Write("请输入银行简称 <<< ");
            string bank = Console.ReadLine().ToUpper();    // 还记得 Java 是怎么转换大写字母的嘛?
            Console.WriteLine("\n##################################################");
            switch (bank)
            {
                case "ICBC":
                        Console.WriteLine(">>> 中国工商银行");
                    break;
                case "CBC":
                        Console.WriteLine(">>> 中国建设银行");
                    break;
                case "ABC":
                        Console.WriteLine(">>> 中国农业银行");
                    break;
                default:
                        Console.WriteLine("..> 输入错误!");
                    break;
            }
            Console.ReadLine();
        }
    }

    /// <summary>
    /// 主类
    /// </summary>
    class Program
    {
        /// <summary>
        /// 主方法
        /// </summary>
        static void Main(string[] args)
        {
            FullBankName bankName = new FullBankName();
            bankName.BankNameOutPut();
            bankName.BankNameOutPut();
            bankName.BankNameOutPut();
            bankName.BankNameOutPut();
        }
    }
}

        VSCode demo:

请输入银行简称 <<< ICBC

##################################################
>>> 中国工商银行

请输入银行简称 <<< CBC

##################################################
>>> 中国建设银行

请输入银行简称 <<< ABC

##################################################
>>> 中国农业银行

请输入银行简称 <<< 5211314

##################################################
..> 输入错误!

——————————

去掉 break 测试

%%%%%

星期白菜价

        如果将刚刚的 switch 结构去掉 break 便会报错
        那么什么时候可以不用写 break 呢?

        这个在 我们有几个 case 满足条件时做相同的事情 时
        就可以将其组成一组 在最后一个 case 编写处理代码即可!
        这样可以大大减少代码量! 提高程序效率

        需求:

        根据 周一 ~ 周日 输出白菜价格
1、2、3 白菜 1000 元
4、5 白菜 2000 元
6、7 白菜 3000 元
        其她值则显示错误信息

        思路:

根据输出相同的信息 可以把 break 放到最后一个 case 中

        VSCode vode:

namespace _8.小练习_星期白菜价
{
    /// <summary>
    /// 星期类
    /// </summary>
    class Week
    {
        /// <summary>
        /// 输出星期方法
        /// </summary>
        public void PrintWeek()
        { /* 输出星期价 */
            Console.Write("请输入星期几 <<< ");
            string week = Console.ReadLine();
            Console.WriteLine("\n##################################################");
            switch (week)    // 注意此处表达式的值为字符串类型
            {
                case "一":
                case "二":
                case "三":
                    Console.WriteLine("白菜价格 >>> 1000 ¥");
                    break;

                case "四":
                case "五":
                    Console.WriteLine("白菜价格 >>> 2000 ¥");
                    break;

                case "六":
                case "日":
                    Console.WriteLine("白菜价格 >>> 3000 ¥");
                    break;

                default:
                    Console.WriteLine("..> 输入错误!");
                    break;
            }
            Console.ReadLine();
        }
    }

    /// <summary>
    /// 主类
    /// </summary>
    class Program
    {
        /// <summary>
        /// 主方法
        /// </summary>
        static void Main(string[] args)
        {
            Week we = new Week();
            we.PrintWeek();
            we.PrintWeek();
            we.PrintWeek();
            we.PrintWeek();
        }
    }
}

        VSCode demo:

请输入星期几 <<< 二

##################################################
白菜价格 >>> 1000 ¥

请输入星期几 <<< 四

##################################################
白菜价格 >>> 2000 ¥

请输入星期几 <<< 日

##################################################
白菜价格 >>> 3000 ¥

请输入星期几 <<< 八

##################################################
..> 输入错误!

##################################################

switch 与 if 选择结构综合测试

——————————

项目进阶

%%%%%

SBS 系统菜单

        在 SBS 项目取款功能 的基础上 添加 系统菜单 功能

        需求如下:

开户成功后 输出窗口显示菜单
然后实现 菜单子模块
最后根据此菜单 调用 取款子模块

        VSCode code:

namespace _9.SBS_取款业务
{
    /* 思路
     * 
     * 菜单应该用什么? 没错 switch 儿!
     * 我们使用 switch 结构选择执行特定语句
     *  
     * 在 Bank 类创建实现菜单功能的方法 输出菜单选项
     * 使用 switch 判断处理用户输入的值
     * 在 Main() 中调用
     */

    /// <summary>
    /// 银行类
    /// </summary>
    public class Bank
    {
        /* 字段暂缺
         * ... ...
         */

        /* 一定要声明全局对象 因为不止一个方法要用! */
        User usr = new User();

        /// <summary>
        /// 菜单模块
        /// </summary>
        public void ShowCustomMenu()
        {
            Console.WriteLine();
            Console.WriteLine("##########欢迎使用自动银行服务##########");
            Console.WriteLine("1.存款 2.取款 3.转账 4.查询 5.退出");
            Console.WriteLine("##################################################");
            Console.Write("请选择 <<< ");
            string option = Console.ReadLine();
            switch (option)
            {
                case "1":
                        // 存款模块
                    break;
                case "2":
                        // 取款模块
                        WithDraw(); // 调用取款方法
                    break;
                case "3":
                        // 转账模块
                    break;
                case "4":
                        // 查询模块
                    break;
                case "5":
                        // 退出系统
                    break;
                default:
                        // 错误提示
                        Console.WriteLine("..> 输入的无效值!");
                    break;
            }
            // 程序结束
            Console.ReadLine();
        }

        /// <summary>
        /// 开户方法
        /// </summary>
        public void CreateAccount()
        {
            /* 初始化 */
            string account = "163729837463";    // 随机指定的账号
            /* 接收数据 */
            usr._account = account; // 得到账号
            Console.Write("请输入用户名 <<< ");
            usr._name = Console.ReadLine(); // 得到用户名
            Console.Write("请输入用户密码 <<< ");
            usr._pass = Console.ReadLine(); // 得到用户密码
            Console.Write("请输入用户身份证号 <<< ");
            usr._identityNum = Console.ReadLine();  // 得到用户身份证号
            Console.Write("请输入用户存款金额 <<< ");
            usr._balance = double.Parse(Console.ReadLine());    // 得到用户存款金额
            /* 输出信息 */
            Console.WriteLine("\n\t账户 {0}\n\t用户名 {1}\n\t存款金额 {2}\n\t创建成功!",
                usr._account, usr._name, usr._balance);
            /* 调用取款业务 */
            WithDraw();
        }

        /// <summary>
        /// 取款方法
        /// </summary>
        public void WithDraw()
        {
            /* 准备 */
            string account; // 账号
            string pwd; // 密码
            double money;   // 取款金额
            double result;  // 返回余额
            /* 接收账号验证 */
            Console.WriteLine();
            Console.Write("请输入账号 <<< ");
            account = Console.ReadLine();
            if (account.Length == 0)
            { /* 此处偷懒 仅判断账号长度 _(:з」∠)_ ! */
                Console.WriteLine("..> 输入的账号不正确..\n");
                return; // 还记得吗? 熟悉的 return !如果长度不对则返回调用方法处
            }
            /* 接收密码验证 */
            Console.Write("请输入账户密码 <<< ");
            pwd = Console.ReadLine();
            if (usr._pass != pwd)
            { /* 这回没偷懒 将刚得到的密码与 User 类的 密码字段 比较 */
                Console.WriteLine("..> 密码有误!\n");
                return;
            }
            /* 取款操作 */
            Console.Write("请输入取款金额 <<< ");
            money = double.Parse(Console.ReadLine());   // 调用 double.Parse() 将得到的字符串转换为 double 再赋给 money
            result = usr.MinusMoney(money); // 调用 User 类的 取款实现模块 得到取款后的余额
            /* 结果输出 */
            if (result == -1)
            { /* 若结果 -1 则表示取款失败辽。。 */
                Console.WriteLine("..> 取款失败!\n");
            }
            else
            {
                Console.WriteLine("..> 取款成功!当前余额: {0}\n", result);
            }
            /* 程序结束 */
            Console.ReadLine();
        }
    }

    /// <summary>
    /// 账户类
    /// </summary>
    public class User
    {
        public string _name;    // 用户名
        public string _account; // 账号
        public string _pass;    // 用户密码
        public string _identityNum; // 身份证号
        public double _balance; // 存款余额

        /// <summary>
        /// 取款实现方法
        /// </summary>
        /// <param name="money">要取得的金额</param>
        /// <returns>返回余额 若为 -1 则输入有误</returns>
        public double MinusMoney(double money)
        {
            if (money > 0)
            { /* 判断取款金额是否大于 0 */
                if (money <= _balance)
                { /* 判断取款金额是否大于余额 */
                    _balance -= money;  // -= 熟悉吗? 相当于 _balance = _balance - money
                    return _balance;
                }
                else
                {
                    return -1;
                }
            }
            else
            {
                return -1;
            }
        }
    }

    /// <summary>
    /// 主类
    /// </summary>
    class Program
    {
        /// <summary>
        /// Main 方法
        /// </summary>
        static void Main(string[] args)
        {
            Bank ba = new Bank();
            ba.CreateAccount(); // 开户成功后
            ba.ShowCustomMenu();    // 显示系统窗口 然后选择 取款 功能即可!
        }
    }
}

        暂时只有取款模块功能和退出模块……

        VSCode demo:

请输入用户名 <<< first
请输入用户密码 <<< 123456
请输入用户身份证号 <<< 111111111111111111
请输入用户存款金额 <<< 5211314

        账户 163729837463
        用户名 first
        存款金额 5211314
        创建成功!

请输入账号 <<< 163729837463
请输入账户密码 <<< 123456
请输入取款金额 <<< 1314
..> 取款成功!当前余额: 5210000



##########欢迎使用自动银行服务##########
1.存款 2.取款 3.转账 4.查询 5.退出
##################################################
请选择 <<< 2

请输入账号 <<< 163729837463
请输入账户密码 <<< 123456
请输入取款金额 <<< 21
..> 取款成功!当前余额: 5209979

        退出功能也是 OK 的:

请输入用户名 <<< first
请输入用户密码 <<< 123456
请输入用户身份证号 <<< 111111111111111111
请输入用户存款金额 <<< 521

        账户 163729837463
        用户名 first
        存款金额 521
        创建成功!

请输入账号 <<< 163729837463
请输入账户密码 <<< 123
..> 密码有误!


##########欢迎使用自动银行服务##########
1.存款 2.取款 3.转账 4.查询 5.退出
##################################################
请选择 <<< 5

        可以看到 switch 结构是多么的重要!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燃吹

呜呜呜没钱钱吃饭了……

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值