1.设计一个Ticket类,有一个距离属性(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,价格属性只读,并且根据距离计算价格(1元/公里):-----------
0-100公里 票价不打折
101-200公里 总额打9.5折
201-300公里 总额打9折
300公里以上 总额打8折
有一个方法,可以显示这张票的信息.

业务:
不需要设计太多,只需要 提示用户 拥有的票的种类,然后让用户选择,选择后 按照价格打折后 显示给用户
强调:只需要两个类(Ticket 票据类,Saler 售票员类)

Ticket票据类

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace S01Morning
  7. {
  8. /// <summary>
  9. /// 票据类
  10. /// </summary>
  11. public class Ticket
  12. {
  13. /// <summary>
  14. /// 票据的编号 种子
  15. /// </summary>
  16. public static int idSeed = 1;
  17. /// <summary>
  18. /// 票据编号
  19. /// </summary>
  20. public int id;
  21.  
  22. /// <summary>
  23. /// 距离
  24. /// </summary>
  25. public int distance;
  26.  
  27. /// <summary>
  28. /// 出发地
  29. /// </summary>
  30. public string startLocation;
  31.  
  32. /// <summary>
  33. /// 目的地
  34. /// </summary>
  35. public string endLocation;
  36.  
  37. public Ticket(int dis, string start, string end)
  38. {
  39. this.id = idSeed++;
  40. this.distance = dis;
  41. this.startLocation = start;
  42. this.endLocation = end;
  43. }
  44.  
  45. #region 1.0 价格 + int Price()
  46. /// <summary>
  47. /// 价格
  48. /// </summary>
  49. /// <returns></returns>
  50. public int Price()
  51. {
  52. return distance * 1;
  53. }
  54. #endregion
  55.  
  56. #region 2.0 显示票据内容 + void Show()
  57. /// <summary>
  58. /// 显示票据内容
  59. /// </summary>
  60. public void Show()
  61. {
  62. Console.WriteLine("编号:{0},出发地:{1} -> 目的地:{2},票价:{3}", this.id, this.startLocation, this.endLocation, this.Price());
  63. }
  64. #endregion
  65.  
  66. #region 2.1 根据 优惠 输出打折后的价格信息 +void ShowWithDaZhe(float rate)
  67. /// <summary>
  68. /// 2.1 根据 优惠 输出打折后的价格信息
  69. /// </summary>
  70. /// <param name="rate">折率</param>
  71. public void ShowWithDaZhe(float rate)
  72. {
  73. Console.WriteLine("编号:{0},出发地:{1} -> 目的地:{2},票价:{3}", this.id, this.startLocation, this.endLocation, this.Price() * rate);
  74. }
  75. #endregion
  76. }
  77. }

  Saler售货员

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace S01Morning
  7. {
  8. /// <summary>
  9. /// 售票员
  10. /// </summary>
  11. public class Saler
  12. {
  13. /// <summary>
  14. /// 票据数组
  15. /// </summary>
  16. Ticket[] list;
  17.  
  18. #region 构造函数 初始化票据
  19. /// <summary>
  20. /// 构造函数 初始化票据
  21. /// </summary>
  22. public Saler()
  23. {
  24. list = new Ticket[10];
  25. list[0] = new Ticket(600, "广州", "长沙");
  26. list[1] = new Ticket(150, "广州", "深圳");
  27. list[2] = new Ticket(1900, "广州", "北京");
  28. list[3] = new Ticket(1000, "广州", "台北");
  29. list[4] = new Ticket(40, "广州", "东莞");
  30. list[5] = new Ticket(800, "广州", "丽江");
  31. list[6] = new Ticket(3000, "广州", "拉萨");
  32. list[7] = new Ticket(3000, "广州", "东京");
  33. list[8] = new Ticket(10000, "广州", "巴黎");
  34. list[9] = new Ticket(7000, "广州", "莫斯科");
  35. }
  36. #endregion
  37.  
  38. #region 0.0 开始工作 +void StartWork()
  39. /// <summary>
  40. /// 0.0 开始工作
  41. /// </summary>
  42. public void StartWork()
  43. {
  44. do{
  45. Selling();
  46. Console.WriteLine("\n是否要继续购买呢?(y/n)");
  47. }while(Console.ReadLine()=="y");
  48. }
  49. #endregion
  50.  
  51. #region 1.0 卖票 +void Selling()
  52. /// <summary>
  53. /// 1.0 卖票
  54. /// </summary>
  55. public void Selling()
  56. {
  57. while (true)
  58. {
  59. //1.0 显示 当前的票
  60. ShowTickts();
  61. Console.WriteLine("您要买去哪的票呢?");
  62. int tId = int.Parse(Console.ReadLine().Trim());
  63. //2.0 根据用户选择 票据编号 获取 票据对象
  64. Ticket t = GetTicketById(tId);
  65. if (t != null)
  66. {
  67. Console.WriteLine("恭喜您购买成功了如下车票:");
  68. if (t.distance > 0 && t.distance <= 100)//0-100公里 票价不打折
  69. {
  70. t.Show();
  71. }
  72. else if (t.distance > 100 && t.distance <= 200)//101-200公里 总额打9.5折
  73. {
  74. t.ShowWithDaZhe(0.95f);
  75. }
  76. else if (t.distance > 200 && t.distance <= 300)//201-300公里 总额打9折
  77. {
  78. t.ShowWithDaZhe(0.9f);
  79. }
  80. else//300公里以上 总额打8折
  81. {
  82. t.ShowWithDaZhe(0.8f);
  83. }
  84. break;
  85. }
  86. else
  87. {
  88. Console.WriteLine("对不起,您输入的编号有误,请重新输入!");
  89. }
  90. }
  91. }
  92. #endregion
  93.  
  94. #region 1.1 显示票据信息 -void ShowTickts()
  95. /// <summary>
  96. /// 1.1 显示票据信息
  97. /// </summary>
  98. private void ShowTickts()
  99. {
  100. //循环票据数组
  101. for (int i = 0; i < list.Length; i++)
  102. {
  103. Ticket t = list[i];
  104. t.Show();
  105. }
  106. }
  107. #endregion
  108.  
  109. #region 1.2 根据id 查找票据对象 -Ticket GetTicketById(int ticketId)
  110. /// <summary>
  111. /// 1.2 根据id 查找票据对象
  112. /// </summary>
  113. /// <param name="ticketId">id</param>
  114. /// <returns>票据对象</returns>
  115. private Ticket GetTicketById(int ticketId)
  116. {
  117. for (int i = 0; i < list.Length; i++)
  118. {
  119. Ticket t = list[i];
  120. if (t.id == ticketId)
  121. {
  122. return t;
  123. }
  124. }
  125. return null;
  126. }
  127. #endregion
  128. }
  129. }

  

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace S01Morning
  7. {
  8. class Program
  9. {
  10. /// <summary>
  11. /// 阅读代码:找到 程序的入口!
  12. /// </summary>
  13. /// <param name="args"></param>
  14. static void Main(string[] args)
  15. {
  16. //1.0 创建售票员
  17. Saler s = new Saler();
  18. //2.0 开始工作
  19. s.StartWork();
  20.  
  21. Console.ReadLine();
  22. }
  23. }
  24. }

  

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. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace S02猜拳
  7. {
  8. /// <summary>
  9. /// 出拳类型 枚举
  10. /// 枚举的本质 就是 用代码的枚举值 来 替代 对应的 数值!
  11. /// </summary>
  12. public enum FistType
  13. {
  14. /// <summary>
  15. /// 枚举值:石头
  16. /// </summary>
  17. Rock = 1,
  18.  
  19. /// <summary>
  20. /// 枚举值:剪刀
  21. /// </summary>
  22. Scissors = 2,
  23.  
  24. /// <summary>
  25. /// 枚举值:布
  26. /// </summary>
  27. Cloth = 3
  28. }
  29. }

  工具帮助类

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace S02猜拳
  7. {
  8. /// <summary>
  9. /// 工具类
  10. /// </summary>
  11. public class Helper
  12. {
  13. #region 1.0 获取用户输入的一个 整型数值 +int GetAUserNum()
  14. /// <summary>
  15. /// 1.0 获取用户输入的一个 整型数值
  16. /// </summary>
  17. /// <returns></returns>
  18. public static int GetAUserNum(string strMsg)
  19. {
  20. int num=-1;
  21. while (true)
  22. {
  23. Console.Write(strMsg);
  24. string strNum = Console.ReadLine();
  25. if (int.TryParse(strNum, out num))
  26. {
  27. break;
  28. }
  29. else
  30. {
  31. Console.WriteLine("请输入数值!");
  32. }
  33. }
  34. return num;
  35. }
  36. #endregion
  37. }
  38. }

  裁判类

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace S02猜拳
  7. {
  8. /// <summary>
  9. /// 裁判类
  10. /// </summary>
  11. public class Judger
  12. {
  13. #region 1.0 机器人 判定 两个输入 的输赢 void Judge(int playerNum, int robotNum)
  14. /// <summary>
  15. /// 1.0 机器人 判定 两个输入 的输赢
  16. /// </summary>
  17. /// <param name="playerFistType">玩家输入</param>
  18. /// <param name="robotFistType">机器人输入</param>
  19. public void Judge(FistType playerFistType, FistType robotFistType)
  20. {
  21. //1.0 如果相等,则是平局
  22. if (playerFistType == robotFistType)
  23. {
  24. Console.WriteLine("平局~~!");
  25. }
  26. else//2.否则,对各种情况进行判断
  27. {
  28. // 石头1 吃 剪刀2 吃 布3 吃 石头
  29. //直接 用 两个 枚举值 进行 相减运算 (实际运算的 是 两个枚举值对应的 数值)
  30. int num = playerFistType - robotFistType;
  31. if (num == -1 || num == 2)
  32. {
  33. Console.WriteLine("玩家赢了~~~~");
  34. }
  35. else {
  36. Console.WriteLine("机器人赢了~~~~");
  37. }
  38. }
  39. }
  40. #endregion
  41. }
  42. }

  玩家类

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace S02猜拳
  7. {
  8. /// <summary>
  9. /// 玩家类
  10. /// </summary>
  11. public class Player
  12. {
  13. public string name;
  14.  
  15. public Player(string name)
  16. {
  17. this.name = name;
  18. }
  19.  
  20. #region 1.0 玩家进行 猜拳 +int Play()
  21. /// <summary>
  22. /// 1.0 玩家进行 猜拳
  23. /// </summary>
  24. /// <returns></returns>
  25. public FistType Play()
  26. {
  27. while (true)
  28. {
  29. int num = Helper.GetAUserNum("输入值(1-石头;2-剪刀;3-布):");
  30. if (num >= 1 && num <= 3)
  31. {
  32. //if (num == 1)
  33. // return FistType.Rock;
  34. //else if (num == 2)
  35. // return FistType.Scissors;
  36. //else
  37. // return FistType.Cloth;
  38.  
  39. return (FistType)num;//直接将 接收到 的 1~3 的一个数值 转成对应的枚举值!
  40. }
  41. else
  42. {
  43. Console.WriteLine("数值必须在 1-3之间!");
  44. }
  45. }
  46. }
  47. #endregion
  48. }
  49. }

  机器人类

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace S02猜拳
  7. {
  8. /// <summary>
  9. /// 机器人 类
  10. /// </summary>
  11. public class Robot
  12. {
  13. Random ran = new Random();
  14.  
  15. #region 1.0 机器人返回 猜拳编号 +int Play()
  16. /// <summary>
  17. /// 1.0 机器人返回 猜拳编号
  18. /// </summary>
  19. /// <returns></returns>
  20. public FistType Play()
  21. {
  22. int num = ran.Next(1, 4);// 1 <= x < 4
  23. FistType type = (FistType)num;//将 数值 转成对应的 枚举值
  24. switch (type)
  25. {
  26. case FistType.Rock:
  27. {
  28. Console.WriteLine("机器人出的 是 【石头】!");
  29. break;
  30. }
  31. case FistType.Scissors:
  32. {
  33. Console.WriteLine("机器人出的 是 【剪刀】!");
  34. break;
  35. }
  36. default:
  37. {
  38. Console.WriteLine("机器人出的 是 【布】!");
  39. break;
  40. }
  41. }
  42. return type;
  43. }
  44. #endregion
  45. }
  46. }

  

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace S02猜拳
  7. {
  8. class Program
  9. {
  10. /* 先接收一个玩家的名字,玩家和机器人猜拳
  11. 接收玩家的 输入(1-石头;2-剪刀;3-布)
  12. 机器人 随机生成 1-3之间的数值
  13. 两个数值 按照规则 进行比较,最终显示输赢!
  14. 玩家类(Player)、机器人类(Robot)、裁判类(Judger)
  15. */
  16. static void Main(string[] args)
  17. {
  18. //1.创建玩家 (接收玩家名字)
  19. Console.WriteLine("请输入玩家的名字:");
  20. string strName = Console.ReadLine().Trim();
  21. Player player = new Player(strName);
  22. //2.创建机器人
  23. Robot robot = new Robot();
  24. //3.创建 裁判
  25. Judger judger = new Judger();
  26. do
  27. {
  28. //1.接收玩家的输入
  29. FistType typeA = player.Play();
  30. //2.接收机器人的输入
  31. FistType typeB = robot.Play();
  32. //3.将两个输入 传给 裁判,判断并显示结果
  33. judger.Judge(typeA, typeB);
  34. //4.是否继续
  35. Console.WriteLine("是否继续?(y/n)");
  36. } while (Console.ReadLine() == "y");
  37. }
  38. }
  39. }

  

C#基础篇九OOP属性结构枚举的更多相关文章

  1. 2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>

    前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励.现在开始继续做WPF2000系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件 ...

  2. Vue.js 源码分析(十三) 基础篇 组件 props属性详解

    父组件通过props属性向子组件传递数据,定义组件的时候可以定义一个props属性,值可以是一个字符串数组或一个对象. 例如: <!DOCTYPE html> <html lang= ...

  3. 2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  4. C++入门到理解阶段二基础篇(5)——C++流程结构

    1.顺序结构 程序从上到下执行 2.选择结构(判断结构) 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). ​ C++ 编程 ...

  5. (七)SpringBoot2.0基础篇- application.properties属性文件的解析及获取

    默认访问的属性文件为application.properties文件,可在启动项目参数中指定spring.config.location的参数: java -jar myproject.jar --s ...

  6. Vue.js 源码分析(五) 基础篇 方法 methods属性详解

    methods中定义了Vue实例的方法,官网是这样介绍的: 例如:: <!DOCTYPE html> <html lang="en"> <head&g ...

  7. Linux基础篇九:用户管理

    查看当前用户的ID信息(也可以查看其他用户的ID信息) 每个进程都会有一个用户身份运行 cat /etc/passwd 账号的操作: useradd  (新建用户) 例题:   groupadd  s ...

  8. HTML基础篇之HTML基本结构

    课堂知识总结 第一接触和学习HTML知识在学习过程中对所属的标签的自己认为的理解和解释. HTML元素:文档里面的标签和内容. 比如:<h1>大家好</h1>  左边的是开始标 ...

  9. Python基础篇(九)

    Key Words: 文件迭代器,标准输入,GUI工具包,数据库操作SQLlite,socket编程 文件迭代器 >>> f= open("some.txt",& ...

随机推荐

  1. POJ3046--Ant Counting(动态规划)

    Bessie was poking around the ant hill one day watching the ants march to and fro while gathering foo ...

  2. 第四章-shceme和数据类型优化

    选择数据类型的原则: 1.更小通常更好.因为占用更少磁盘,内存和cpu缓存.但是要确保没有低估,因为进行alter时,是很耗时和头疼的操作.所以当无法确定数据类型的时候,选择不会超过范围的最小类型. ...

  3. 万能头文件#include <bits/stdc++.h>

    最近在做题的时候看到别人的题解发现别人都用这个 突然之间打开新世界的大门 去百度之后才知道#include <bits/stdc++.h>包含了目前所有的c++头文件 也就是说只要用#in ...

  4. ListView 指定显示最后一行,scrollView显示最底部

    实现方式: 一. mListView.setSelection(adapter.getCount()-1); 二.在ListView的xml添加以下属性: android:stackFromBotto ...

  5. uva10905同一思路的两种做法,前一种WA,后一种AC

    这道题应该算一道普通的排序吧,实际上就是另一种形式地比大小,自己最开始是用int型存,后来觉着不行,改用long,结果还是WA,这是第一个程序. 第二个程序是改用string处理,确实比int方便很多 ...

  6. JMS 消息队列

    1.jms  broker服务器:Broker:消息队列核心,相当于一个控制中心,负责路由消息.保存订阅和连接.消息确认和控制事务

  7. 运行批处理文件怎么不显示DOS命令窗口

    运行批处理文件怎么不显示DOS命令窗口   BAT没法不显示DOS窗口.你可以考虑用脚本保持以下到文本文件,重命名为AutoUp_ddyy.vbs set WshShell = WScript.Cre ...

  8. Android-Java-对象在内存中的简单关系图

    代码案例一: package android.java.oop02; class Student { public int age; public String name; public void s ...

  9. python--求参赛两队所有可能的比赛组合情况

    朋友遇到一个面试题,让我帮忙实现,题目如下: 红队有A1,B1,C1三名队员,蓝队有A2,B2,C2三名队员,每轮比赛各队出一名队员参加,一名队员只能参加一次比赛,假设A1不会和B2打,B1不会和B2 ...

  10. AEAI Portal 权限体系说明

    1.概述 在数通畅联的产品体系中,AEAI Portal毫无疑问的占据了很重要的地位,在这里我们将通过参考Portal样例,讲述一下AEAI Portal权限体系的控制方法.在Portal使用过程中, ...