C#基础篇九OOP属性结构枚举
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属性结构枚举的更多相关文章
- 2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励.现在开始继续做WPF2000系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件 ...
- Vue.js 源码分析(十三) 基础篇 组件 props属性详解
父组件通过props属性向子组件传递数据,定义组件的时候可以定义一个props属性,值可以是一个字符串数组或一个对象. 例如: <!DOCTYPE html> <html lang= ...
- 2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- C++入门到理解阶段二基础篇(5)——C++流程结构
1.顺序结构 程序从上到下执行 2.选择结构(判断结构) 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). C++ 编程 ...
- (七)SpringBoot2.0基础篇- application.properties属性文件的解析及获取
默认访问的属性文件为application.properties文件,可在启动项目参数中指定spring.config.location的参数: java -jar myproject.jar --s ...
- Vue.js 源码分析(五) 基础篇 方法 methods属性详解
methods中定义了Vue实例的方法,官网是这样介绍的: 例如:: <!DOCTYPE html> <html lang="en"> <head&g ...
- Linux基础篇九:用户管理
查看当前用户的ID信息(也可以查看其他用户的ID信息) 每个进程都会有一个用户身份运行 cat /etc/passwd 账号的操作: useradd (新建用户) 例题: groupadd s ...
- HTML基础篇之HTML基本结构
课堂知识总结 第一接触和学习HTML知识在学习过程中对所属的标签的自己认为的理解和解释. HTML元素:文档里面的标签和内容. 比如:<h1>大家好</h1> 左边的是开始标 ...
- Python基础篇(九)
Key Words: 文件迭代器,标准输入,GUI工具包,数据库操作SQLlite,socket编程 文件迭代器 >>> f= open("some.txt",& ...
随机推荐
- 用IrisSkin2.dll美化你的WinForm
From:http://hi.baidu.com/tr0j4n 在WinForm中,可以方便地给自己的程序添加皮肤,做出各种绚丽的效果,而只需要很简单的几句代码即可搞定,下面来领略下. 前期准备:1. ...
- java基础-day25
第02天 java基础加强 今日内容介绍 u Properties的基本操作 u 反射综合案例 u BeanUtils概述及使用 第1章 Properties的基本操作 1.1 Properti ...
- POJ2566 Bound Found 2017-05-25 20:05 32人阅读 评论(0) 收藏
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4056 Accepted: 1249 Spe ...
- OpenGL中的拾取模式( Picking)
1. Opengl中的渲染模式有三种:(1)渲染模式,默认的模式:(2)选择模式, (3)反馈模式.如下 GLint glRenderMode(GLenum mode) mode可以选取以下三种模式之 ...
- java poi 合并单元格
java poi 合并单元格 2017年03月29日 16:39:01 翠烟你懊恼 阅读数:26561 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.n ...
- bootstrap1.3
<html> <head> <meta charset="UTF-8"> <title></title> ...
- AngularJS 路由及SPA理解
一.路由及SPA理解 路由允许我们通过不同的 URL 访问不同的内容,可实现多视图的单页web应用(SPA);通常我们的URL形式为 http://runoob.com/first/page,但在单页 ...
- SpringMVC源码分析(3)DispatcherServlet的请求处理流程
<springmvc源码分析(2)dispatcherservlet的初始化>初始化DispatcherServlet的多个组件. 本文继续分析DispatcherServlet解析请求的 ...
- Python 中的深拷贝和浅拷贝
一.浅拷贝python中 对象赋值时 默认是浅拷贝,满足如下规律:1. 对于 不可变对象(字符串,元组 等),赋值 实际上是创建一个新的对象:例如: >>> person=['nam ...
- Python基础语法-内置数据结构之列表
列表的一些特点: 列表是最常用的线性数据结构 list是一系列元素的有序组合 list是可变的 列表的操作, 增:append.extend.insert 删:clear.pop.remove 改:r ...