【发布时间】:2016-03-24 07:55:24
【问题描述】:
我正在创建一个遵循以下格式的票务系统:
编写一个名为 Ticket.java 的 Java 程序,用于提示(询问)用户 输入票号。有效票的格式为 CCCCD[C][C] 其中 D = 一个数字,C = 一个字符,[C] 表示字符 在这个位置是可选的。开头的三个字符可能是 任何字符(字母)。如果只有一个可选字符 票字符串的结尾,那么该字符只能是 'S' 或 'M' 如果票的末尾有两个可选字符 字符串,那么字符只能是'S'和'M'的顺序。
一个示例输入是 LMN25S
现在要获得价格,我必须将前三个字符格式化为 ASCII,将它们加在一起并与下面的规则进行比较。
如果前三个字符“小于”JKL,则底价为 $50,如果前三个字符“大于或等于”JKL 和“低于” TAF,底价为 100 美元,否则底价为 $150
问题是,问题指南(上面)规定,如果商品小于 TAF 但等于或大于 JKL,则价格必须为 100 美元。但这些项目等于以下内容:
char j = 'J';char k = 'K';char l = 'L';
int JKL = (int)j + (int)k + (int)l;
char t = 'T';char a = 'A';char f = 'F';
int TAF = (int)t + (int)a + (int)f;
Print("JKL:" + JKL + "\nTAF:" + TAF);
打印 JKL:225, TAF:219 从而使规则为空,因为 TAF 根据我的转换方式变小了。
这是我的整个代码以便更好地理解
import java.util.Scanner;
public class Ticket {
public static void main(String[] args) {
Print("Please enter a ticket number:");
String ticket = getInput();
if(countValid(ticket) && checkCharacters(ticket) && checkDigits(ticket) && checkLastCharacter(ticket)) {
Print("Valid!");
Print("Ticket pricing is " + PrintPrice(ticket));
}
}
public static double PrintPrice(String input) {
int first = (int)input.charAt(0);
Print("" + first);
int second = (int)input.charAt(1);
Print("" + second);
int third = (int)input.charAt(2);
Print("" + third);
double price = 0;
Print("Total:" + (first+second+third) + "");
//225
char j = 'J';char k = 'K';char l = 'L';
int JKL = (int)j + (int)k + (int)l;
char t = 'T';char a = 'A';char f = 'F';
int TAF = (int)t + (int)a + (int)f;
Print("JKL:" + JKL + "\nTAF" + TAF);
char one = input.charAt(0);
char two = input.charAt(1);
char three = input.charAt(2);
int value = (int)one + (int)two + (int)three;
Print("next total:" + value);
if(value < JKL) {
price += 50;
}else if(value >= JKL && value < TAF) {
price += 100;
}else{
price += 150;
}
String discountString = "" + Character.getNumericValue(input.charAt(3)) + Character.getNumericValue(input.charAt(4));
Print(discountString);
if(input.length() > 5) {
if(input.charAt(5) == 'S') {
price+= 17.45;
}else if(input.charAt(5) == 'M') {
price+=29.70;
}
}else if(input.length() > 6) {
//price+=41.25;
}
double discount = Double.parseDouble(discountString);
Print((price * (discount/100)) + "");
//price = price - (price * (discount/100));
//price = price * factor;
return price;
}
public static boolean checkLastCharacter(String input) {
boolean success = false;
int successCount = 0;
if(input.length() == 5) {
success = true;
}else{
if(input.length() == 6) {
char temp = input.charAt(5);
if(temp == 'S' || temp == 'M') {
success = true;
}else{
success = false;
Print("Failed due to character not matching 'S' or 'M', '" + temp + "' is invalid");
}
}else if(input.length() == 7) {
char temp = input.charAt(5);
char temp1 = input.charAt(6);
if(temp == 'S' && temp1 == 'M') {
success = true;
}else{
success = false;
Print("Failed due to characters not matching 'SM', '" + temp + temp1 + "' is invalid");
}
}else{
Print("Input characters overloaded! Only accepts up to 7 inputs");
}
}
return success;
}
public static boolean countValid(String input) {
boolean success = false;
if(input.length() < 9 && input.length() > 4) {
success = true;
}else{
Print("The count is invalid, only numbers between 5 and 7 are accepted!");
}
return success;
}
public static boolean checkCharacters(String input) {
boolean success = false;
int successCount = 0;
for(int i = 1; i < 3; i++) {
char temp = input.charAt(i);
if(Character.isLetter(temp)) {
successCount++;
}
}
if(successCount == 2) {
success = true;
}else{
Print("First three characters must be letters!");
}
return success;
}
public static boolean checkDigits(String input) {
boolean success = false;
int successCount = 0;
for(int i = 3; i < 5; i++) {
char temp = input.charAt(i);
if(Character.isDigit(temp)) {
successCount++;
}
}
if(successCount == 2) {
success = true;
}else{
Print("The inputs after 3 letters must be 2 digits!");
}
return success;
}
//Easier way to print to system.out
public static void Print(String input) {
System.out.println(input);
}
//Gets the input from a scanner
public static String getInput() {
Scanner sc = new Scanner(System.in);
return sc.nextLine();
}
}
请忽略所有各种打印,仅用于测试目的。我的转换是否正确或问题规则是否正确并且我转换错误/格式错误
编辑:下面的完整问题陈述以寻求帮助:
用户可以输入任意长度的票证字符串。有效长度 根据上述条件,一张票在 5 到 7 之间。任何 不在此长度范围内的票证将自动失效。一个 因任何原因无效的票证将导致消息 显示在屏幕上说该票无效,并且没有 处理将使用该票完成。这包括不显示 任何费用。应尽一切努力给出确切的原因 票无效。例如,长度错误,以无效开头 字符,或以无效字符结尾。这些不是唯一的 票证无效的原因,您的部分任务是列出所有票证 使票证无效的条件并编写代码以涵盖这些条件 案例。检查用户输入的长度后,您的程序需要 检查字符串中的前三个字符是否确实 字母('A' - 'Z' 和/或 'a' - 'z',用户输入必须是大小写 不敏感)。如果前三个字符中的任何一个不是字母, 然后会在屏幕上显示相应的错误消息,并且 程序关闭。清除此检查后,您的程序必须 检查字符串中接下来的 2 个字符是否确实是数字 (介于 0 - 9 之间)。同样,如果没有 2 位数字,则程序 显示适当的错误消息并关闭。提示:考虑一下 当我们在键盘上输入 0 时,我们正在输入字符 '0' 它的 ASCII/Unicode 为 48。所以我们真正存储的是 基数为 10 的数字 48。我们需要将其从字符 0 转换为整数 0. 1 实际上是字符 '1' 与 ASCII/Unicode v 价值 49 等等。如果票是有效的,那么票的费用 计算出来并显示在屏幕上。如果前三个 字符是“小于”JKL,底价是 50 美元,如果第一个 三个字符分别是“大于等于”JKL和“小于” TAF,底价为 $100,否则底价为 $150 两位数 字符必须转换为以 10 为底的整数。这是 折扣应用于机票的最终成本。如果 2 数字是,例如,25,那么这将被转换为 以 10 为基数的二十五。这意味着有 25% 最终票价上的折扣,我们拥有后的最终含义 处理“S”和/或“M”可选字符(如果存在)。 票证字符串末尾的字符“M”,如果它是唯一的 可选字符增加了 29.70 美元的票价。这 票证字符串末尾的字符“S”,如果它是唯一的 可选字符增加了 17.45 美元的票价。这 字符 'S' 和 'M',按顺序排列,如果有可选的话 票字符串末尾的字符将成本增加 41.25 美元, 票。
【问题讨论】:
-
210 大于 178 但 2+1+0 = 3 小于 1+7+8 = 16。JKL 小于 TAF,因为 J
-
你从哪里得到 178?
-
无处可去。只是一个任意示例,指出不同位置的数字可能会转换为不同的值