C#基础篇九OOP属性结构枚举
1.设计一个Ticket类,有一个距离属性(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,价格属性只读,并且根据距离计算价格(1元/公里):-----------
0-100公里 票价不打折
101-200公里 总额打9.5折
201-300公里 总额打9折
300公里以上 总额打8折
有一个方法,可以显示这张票的信息.
业务:
不需要设计太多,只需要 提示用户 拥有的票的种类,然后让用户选择,选择后 按照价格打折后 显示给用户
强调:只需要两个类(Ticket 票据类,Saler 售票员类)
Ticket票据类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace S01Morning { /// <summary> /// 票据类 /// </summary> public class Ticket { /// <summary> /// 票据的编号 种子 /// </summary> public static int idSeed = 1; /// <summary> /// 票据编号 /// </summary> public int id; /// <summary> /// 距离 /// </summary> public int distance; /// <summary> /// 出发地 /// </summary> public string startLocation; /// <summary> /// 目的地 /// </summary> public string endLocation; public Ticket( int dis, string start, string end) { this .id = idSeed++; this .distance = dis; this .startLocation = start; this .endLocation = end; } #region 1.0 价格 + int Price() /// <summary> /// 价格 /// </summary> /// <returns></returns> public int Price() { return distance * 1; } #endregion #region 2.0 显示票据内容 + void Show() /// <summary> /// 显示票据内容 /// </summary> public void Show() { Console.WriteLine( "编号:{0},出发地:{1} -> 目的地:{2},票价:{3}" , this .id, this .startLocation, this .endLocation, this .Price()); } #endregion #region 2.1 根据 优惠 输出打折后的价格信息 +void ShowWithDaZhe(float rate) /// <summary> /// 2.1 根据 优惠 输出打折后的价格信息 /// </summary> /// <param name="rate">折率</param> public void ShowWithDaZhe( float rate) { Console.WriteLine( "编号:{0},出发地:{1} -> 目的地:{2},票价:{3}" , this .id, this .startLocation, this .endLocation, this .Price() * rate); } #endregion } } |
Saler售货员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace S01Morning { /// <summary> /// 售票员 /// </summary> public class Saler { /// <summary> /// 票据数组 /// </summary> Ticket[] list; #region 构造函数 初始化票据 /// <summary> /// 构造函数 初始化票据 /// </summary> public Saler() { list = new Ticket[10]; list[0] = new Ticket(600, "广州" , "长沙" ); list[1] = new Ticket(150, "广州" , "深圳" ); list[2] = new Ticket(1900, "广州" , "北京" ); list[3] = new Ticket(1000, "广州" , "台北" ); list[4] = new Ticket(40, "广州" , "东莞" ); list[5] = new Ticket(800, "广州" , "丽江" ); list[6] = new Ticket(3000, "广州" , "拉萨" ); list[7] = new Ticket(3000, "广州" , "东京" ); list[8] = new Ticket(10000, "广州" , "巴黎" ); list[9] = new Ticket(7000, "广州" , "莫斯科" ); } #endregion #region 0.0 开始工作 +void StartWork() /// <summary> /// 0.0 开始工作 /// </summary> public void StartWork() { do { Selling(); Console.WriteLine( "\n是否要继续购买呢?(y/n)" ); } while (Console.ReadLine()== "y" ); } #endregion #region 1.0 卖票 +void Selling() /// <summary> /// 1.0 卖票 /// </summary> public void Selling() { while ( true ) { //1.0 显示 当前的票 ShowTickts(); Console.WriteLine( "您要买去哪的票呢?" ); int tId = int .Parse(Console.ReadLine().Trim()); //2.0 根据用户选择 票据编号 获取 票据对象 Ticket t = GetTicketById(tId); if (t != null ) { Console.WriteLine( "恭喜您购买成功了如下车票:" ); if (t.distance > 0 && t.distance <= 100) //0-100公里 票价不打折 { t.Show(); } else if (t.distance > 100 && t.distance <= 200) //101-200公里 总额打9.5折 { t.ShowWithDaZhe(0.95f); } else if (t.distance > 200 && t.distance <= 300) //201-300公里 总额打9折 { t.ShowWithDaZhe(0.9f); } else //300公里以上 总额打8折 { t.ShowWithDaZhe(0.8f); } break ; } else { Console.WriteLine( "对不起,您输入的编号有误,请重新输入!" ); } } } #endregion #region 1.1 显示票据信息 -void ShowTickts() /// <summary> /// 1.1 显示票据信息 /// </summary> private void ShowTickts() { //循环票据数组 for ( int i = 0; i < list.Length; i++) { Ticket t = list[i]; t.Show(); } } #endregion #region 1.2 根据id 查找票据对象 -Ticket GetTicketById(int ticketId) /// <summary> /// 1.2 根据id 查找票据对象 /// </summary> /// <param name="ticketId">id</param> /// <returns>票据对象</returns> private Ticket GetTicketById( int ticketId) { for ( int i = 0; i < list.Length; i++) { Ticket t = list[i]; if (t.id == ticketId) { return t; } } return null ; } #endregion } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace S01Morning { class Program { /// <summary> /// 阅读代码:找到 程序的入口! /// </summary> /// <param name="args"></param> static void Main( string [] args) { //1.0 创建售票员 Saler s = new Saler(); //2.0 开始工作 s.StartWork(); Console.ReadLine(); } } } |
2.猜拳游戏---------------
先接收一个玩家的名字,玩家和机器人猜拳
接收玩家的 输入(1-石头;2-剪刀;3-布)
机器人 随机生成 1-3之间的数值
两个数值 按照规则 进行比较,最终显示输赢!
玩家类(Player)、机器人类(Robot)、裁判类(Judge)
//-----------------------------------------------
1.当 程序员 规定 一组数据(石头、剪刀、布) 用 【数值类型】来标识 的时候,需要严格的【限制】 这组 数值 的【取值范围】!
且 对这组数据 要求 有明确 的 【可读性】!
且 提供 给程序员 明确便捷的 操作语法!不容易写错!
解决方案:
【枚举-Enum】
1.1枚举的定义语法:
public enum FistType
{
/// <summary>
/// 枚举值:石头
/// </summary>
Rock = 1,
/// <summary>
/// 枚举值:剪刀
/// </summary>
Scissors = 2,
/// <summary>
/// 枚举值:布
/// </summary>
Cloth = 3
}
1.2枚举类型 变量 的访问
FistType type = FistType.Rock;
type = FistType.Scissors;
1.3可以直接将 枚举类型 作为 方法的 返回值类型 或者 参数类型
2.在C#中,class后跟的 是类名,但其只是 整个类的名字 的一部分而已!
真正的完整的类名 是 命名空间.类名!如:
namespace A
{
public class DongGuan
{
}
}
类名:DongGuan
类的全名称:A.DongGuan
出拳类型 枚举
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace S02猜拳 { /// <summary> /// 出拳类型 枚举 /// 枚举的本质 就是 用代码的枚举值 来 替代 对应的 数值! /// </summary> public enum FistType { /// <summary> /// 枚举值:石头 /// </summary> Rock = 1, /// <summary> /// 枚举值:剪刀 /// </summary> Scissors = 2, /// <summary> /// 枚举值:布 /// </summary> Cloth = 3 } } |
工具帮助类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace S02猜拳 { /// <summary> /// 工具类 /// </summary> public class Helper { #region 1.0 获取用户输入的一个 整型数值 +int GetAUserNum() /// <summary> /// 1.0 获取用户输入的一个 整型数值 /// </summary> /// <returns></returns> public static int GetAUserNum( string strMsg) { int num=-1; while ( true ) { Console.Write(strMsg); string strNum = Console.ReadLine(); if ( int .TryParse(strNum, out num)) { break ; } else { Console.WriteLine( "请输入数值!" ); } } return num; } #endregion } } |
裁判类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace S02猜拳 { /// <summary> /// 裁判类 /// </summary> public class Judger { #region 1.0 机器人 判定 两个输入 的输赢 void Judge(int playerNum, int robotNum) /// <summary> /// 1.0 机器人 判定 两个输入 的输赢 /// </summary> /// <param name="playerFistType">玩家输入</param> /// <param name="robotFistType">机器人输入</param> public void Judge(FistType playerFistType, FistType robotFistType) { //1.0 如果相等,则是平局 if (playerFistType == robotFistType) { Console.WriteLine( "平局~~!" ); } else //2.否则,对各种情况进行判断 { // 石头1 吃 剪刀2 吃 布3 吃 石头 //直接 用 两个 枚举值 进行 相减运算 (实际运算的 是 两个枚举值对应的 数值) int num = playerFistType - robotFistType; if (num == -1 || num == 2) { Console.WriteLine( "玩家赢了~~~~" ); } else { Console.WriteLine( "机器人赢了~~~~" ); } } } #endregion } } |
玩家类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace S02猜拳 { /// <summary> /// 玩家类 /// </summary> public class Player { public string name; public Player( string name) { this .name = name; } #region 1.0 玩家进行 猜拳 +int Play() /// <summary> /// 1.0 玩家进行 猜拳 /// </summary> /// <returns></returns> public FistType Play() { while ( true ) { int num = Helper.GetAUserNum( "输入值(1-石头;2-剪刀;3-布):" ); if (num >= 1 && num <= 3) { //if (num == 1) // return FistType.Rock; //else if (num == 2) // return FistType.Scissors; //else // return FistType.Cloth; return (FistType)num; //直接将 接收到 的 1~3 的一个数值 转成对应的枚举值! } else { Console.WriteLine( "数值必须在 1-3之间!" ); } } } #endregion } } |
机器人类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace S02猜拳 { /// <summary> /// 机器人 类 /// </summary> public class Robot { Random ran = new Random(); #region 1.0 机器人返回 猜拳编号 +int Play() /// <summary> /// 1.0 机器人返回 猜拳编号 /// </summary> /// <returns></returns> public FistType Play() { int num = ran.Next(1, 4); // 1 <= x < 4 FistType type = (FistType)num; //将 数值 转成对应的 枚举值 switch (type) { case FistType.Rock: { Console.WriteLine( "机器人出的 是 【石头】!" ); break ; } case FistType.Scissors: { Console.WriteLine( "机器人出的 是 【剪刀】!" ); break ; } default : { Console.WriteLine( "机器人出的 是 【布】!" ); break ; } } return type; } #endregion } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace S02猜拳 { class Program { /* 先接收一个玩家的名字,玩家和机器人猜拳 接收玩家的 输入(1-石头;2-剪刀;3-布) 机器人 随机生成 1-3之间的数值 两个数值 按照规则 进行比较,最终显示输赢! 玩家类(Player)、机器人类(Robot)、裁判类(Judger) */ static void Main( string [] args) { //1.创建玩家 (接收玩家名字) Console.WriteLine( "请输入玩家的名字:" ); string strName = Console.ReadLine().Trim(); Player player = new Player(strName); //2.创建机器人 Robot robot = new Robot(); //3.创建 裁判 Judger judger = new Judger(); do { //1.接收玩家的输入 FistType typeA = player.Play(); //2.接收机器人的输入 FistType typeB = robot.Play(); //3.将两个输入 传给 裁判,判断并显示结果 judger.Judge(typeA, typeB); //4.是否继续 Console.WriteLine( "是否继续?(y/n)" ); } while (Console.ReadLine() == "y" ); } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?