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

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

Ticket票据类

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售货员

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
}
}

  

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

出拳类型 枚举

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
}
}

  工具帮助类

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
}
}

  裁判类

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
}
}

  玩家类

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
}
}

  机器人类

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
}
}

  

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");
}
}
}

  

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. Eclipse环境下如何配置tomcat,并且把项目部署到Tomcat服务器上

    打开Eclipse,单击“Window”菜单,选择下方的“Preferences”. 单击“Server”选项,选择下方的“Runtime Environments”.  点击“Add”添加Tomca ...

  2. centos修改主机名命令

    centos修改主机名命令   需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.首先切换到root用户.    vi / ...

  3. JavaScript常用事件参考

      onabort 图像加载被中断 onblur 元素失去焦点 onchange 用户改变域的内容 onclick 鼠标点击某个对象 ondblclick 鼠标双击某个对象 onerror 当加载文档 ...

  4. codeforce868c

    C. Qualification Rounds time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  5. Advice from an Old Programmer

    You’ve finished this book and have decided to continue with programming. Maybe it will be a career f ...

  6. poj 2046&&poj1961KMP 前缀数组

    Power Strings Time Limit: 3000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Jav ...

  7. .NET Core下开源任务调度框架Hangfire的Api任务拓展(支持秒级任务)

    HangFire的拓展和使用 看了很多博客,小白第一次写博客. 最近由于之前的任务调度框架总出现问题,因此想寻找一个替代品,之前使用的是Quartz.Net,这个框架方便之处就是支持cron表达式适合 ...

  8. 【转】OAuth的改变

    原文地址:http://huoding.com/2011/11/08/126 去年我写过一篇<OAuth那些事儿>,对OAuth做了一些简单扼要的介绍,今天我打算写一些细节,以阐明OAut ...

  9. Python3.5 学习二十四

    本节课程大纲: -------------------------------------------------------------------------------------------- ...

  10. Nmap命令的常用实例

    一.Nmap简介 nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端.确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting).它是网络管 ...