##################################################
目录
##################################################
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 结构是多么的重要!