我正在创建一个遵循以下格式的票务系统:
编写一个名为Ticket.java的Java程序,提示(询问)用户 输入票号。有效票证的格式是CCCDD [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之间。任何 不在此长度范围内的故障单自动无效。一个 由于任何原因无效的票证将导致消息 显示在屏幕上说票证无效,没有 处理将使用该票证完成。这包括不显示 任何费用。应该尽一切努力给出确切原因 票无效。例如,错误的长度,以无效开头 字符,或以无效字符结尾。这些不是唯一的 票证无效的原因,部分任务是列出所有票据 使票证无效的条件并编写代码来覆盖这些条件 案例。检查用户输入的长度后,您的程序需要 检查字符串中的前三个字符是否确实存在 字母(&#39; A&#39; - &#39; Z&#39;和/或&#39; a&#39; - &#39; z&#39;,用户输入必须是大小写 不区分大小写)。如果前三个字符中的任何一个不是字母, 然后在屏幕上显示相应的错误消息 程序结束。清除此检查后,您的程序必须 检查String中接下来的2个字符是否确实是数字 (0-9之间)。再次,如果没有2位数,那么程序 显示相应的错误消息并关闭。提示:考虑一下 当我们在键盘输入0时,我们正在输入字符&#39; 0&#39; 0 它的ASCII / Unicode为48.所以我们真正存储的是 base 10 number 48.我们需要将它从字符0转换为整数 0. 1实际上是字符&#39; 1&#39;使用ASCII / Unicode v 49号等等。 f票证有效,然后是票证的费用 计算并显示在屏幕上。如果前三个 字符小于&#34;小于&#34; JKL,基本价格是50美元,如果是第一个 三个字符大于或等于&#34; JKL和&#34;小于&#34; TAF,基本价格是100美元,否则基本价格是150美元2位数 必须将字符转换为基数10整数。这是 折扣适用于机票的最终费用。如果2 例如,数字是25,那么这将被转换为 基地10号二十五号。这意味着有25% 最终票价折扣,最终含义后我们有 处理了&#39; S&#39;和/或&#39; M&#39;可选字符,如果它们存在。 角色&#39; M&#39;在票证字符串的末尾,如果它是唯一的 可选字符为票证的成本增加29.70美元。该 人物&#39; S&#39;在票证字符串的末尾,如果它是唯一的 可选字符增加了票价的17.45美元。该 人物&#39; S&#39;和&#39; M&#39;,按顺序,如果有可选项 票证末尾的字符增加了41.25美元的费用 门票。
答案 0 :(得分:2)
也许他们在谈论词典顺序,而不是char的总和?
然后JFK不如TAF,PAM = 100 $。
在这种情况下,您只需要比较字符串: (感谢@Serge Ballesta的回答)
// to upperCase is a safety to match the case insensitiv requirement
String priceString = input.substring(0, 3).toUpperCase();
double price;
if (priceString.compareTo("JKL") < 0){
price = 50.;
}
else if (priceString.compareTo("TAF") < 0){
price = 100.;
}
else{
price = 150.;
}
不要忘记折扣(数字)和最后两个字符。 祝你好运!
答案 1 :(得分:1)
完整的要求很明确,我很少在SO问题中看到这么好的规格。
要求您将2位数字转换为整数值,但在将其设为大写后,您应将字符串 CCC与"JKL"
和"TAF"
进行比较(用户输入必须不区分大小写)
所以是的@Whitefret猜测是正确的。测试应该只是:
String priceString = input.substring(0, 3).toUpperCase();
double price;
if (priceString.compareTo("JKL") < 0) {
price = 50.;
}
else if (priceString.compareTo("TAF") < 0) {
price = 100.;
}
else {
price = 150.;
}
你到底在哪里看到你被要求添加ascii值?
再次阅读折扣规格:必须将2位数字转换为10位整数。这是应用于票证最终成本的折扣。例如,如果2个数字是25,那么这将转换为基数为10的数字
所以我们只需要:
int discount = Integer.parseInt(input.substring(3, 5));
TL / DR:在编码之前,您必须阅读并理解您的要求
答案 2 :(得分:0)
这是一个简单的串联吗?
T = 84,A = 65,F = 70 - 所以TAF = 846,570
J = 74,k = 75,L = 76-所以JKL = 747,576
答案 3 :(得分:0)
您应该对规范的“小于”和“大于”位进行更精确的定义。我的猜测与@ Whitefret的相同,它可能是一个词典顺序,但你应该确保这一点。
答案 4 :(得分:-1)
因此,在做了一些研究之后,它看起来确实是词法秩序。 所以我得到了三个可能的变量并用Arrays.sort对它们进行了排序,然后选中了并检查了它。
String[] array = new String[] {"JKL", "TAF", input.substring(0,3)};
Arrays.sort(array);
String result = array[1];
if(result=="JKL") {
price+=50;
}else if(result=="TAF") {
price+=150;
}else{
price+=100;
}