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",& ...
随机推荐
- POJ3046--Ant Counting(动态规划)
Bessie was poking around the ant hill one day watching the ants march to and fro while gathering foo ...
- 第四章-shceme和数据类型优化
选择数据类型的原则: 1.更小通常更好.因为占用更少磁盘,内存和cpu缓存.但是要确保没有低估,因为进行alter时,是很耗时和头疼的操作.所以当无法确定数据类型的时候,选择不会超过范围的最小类型. ...
- 万能头文件#include <bits/stdc++.h>
最近在做题的时候看到别人的题解发现别人都用这个 突然之间打开新世界的大门 去百度之后才知道#include <bits/stdc++.h>包含了目前所有的c++头文件 也就是说只要用#in ...
- ListView 指定显示最后一行,scrollView显示最底部
实现方式: 一. mListView.setSelection(adapter.getCount()-1); 二.在ListView的xml添加以下属性: android:stackFromBotto ...
- uva10905同一思路的两种做法,前一种WA,后一种AC
这道题应该算一道普通的排序吧,实际上就是另一种形式地比大小,自己最开始是用int型存,后来觉着不行,改用long,结果还是WA,这是第一个程序. 第二个程序是改用string处理,确实比int方便很多 ...
- JMS 消息队列
1.jms broker服务器:Broker:消息队列核心,相当于一个控制中心,负责路由消息.保存订阅和连接.消息确认和控制事务
- 运行批处理文件怎么不显示DOS命令窗口
运行批处理文件怎么不显示DOS命令窗口 BAT没法不显示DOS窗口.你可以考虑用脚本保持以下到文本文件,重命名为AutoUp_ddyy.vbs set WshShell = WScript.Cre ...
- Android-Java-对象在内存中的简单关系图
代码案例一: package android.java.oop02; class Student { public int age; public String name; public void s ...
- python--求参赛两队所有可能的比赛组合情况
朋友遇到一个面试题,让我帮忙实现,题目如下: 红队有A1,B1,C1三名队员,蓝队有A2,B2,C2三名队员,每轮比赛各队出一名队员参加,一名队员只能参加一次比赛,假设A1不会和B2打,B1不会和B2 ...
- AEAI Portal 权限体系说明
1.概述 在数通畅联的产品体系中,AEAI Portal毫无疑问的占据了很重要的地位,在这里我们将通过参考Portal样例,讲述一下AEAI Portal权限体系的控制方法.在Portal使用过程中, ...