【问题标题】:Getting ASCII from char not working?从 char 获取 ASCII 不起作用?
【发布时间】: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?
  • 无处可去。只是一个任意示例,指出不同位置的数字可能会转换为不同的值

标签: java ascii


【解决方案1】:

也许他们在谈论字典顺序,而不是字符的总和?

那么 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.;
}

不要忘记折扣(数字)和最后两个字符。 祝你好运!

【讨论】:

  • compareTo(使用 lexographic)在测试后不会产生有意义的结果,所以它似乎不太可能
  • 更新了问题陈述,你可以看到它提供了一个提示,将 ASCII 与数字进行比较
  • 我没有看到关于 ASCII 值的提示...只有数字必须转换
  • 提示:考虑到当我们在键盘上输入 0 时,我们正在输入字符 '0',其 ASCII/Unicode 为 48。所以我们真正存储的是基数为 10 的数字 48。我们需要将其从字符 0 转换为整数 0。1 实际上是字符“1”,ASCII/Unicode 值为 49,依此类推。使用 ctrl+F 在我的原始帖子中找到提示,我知道它是一大段不正确间隔的文本,但它在那里
  • 不,没关系,因为您正在转换数字,但没有提到转换字母。 (顺便说一句,您也可以将 Integer.parseint() 转换为数字)
【解决方案2】:

完整的要求很明确,我很少在 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 为底的数字 25

所以需要的只是:

int discount = Integer.parseInt(input.substring(3, 5));

TL/DR:您必须在编码之前阅读并理解您的要求

【讨论】:

  • 啊,我刚刚在@Whitefret 提出它之后得到了相同的结论,我最初忽略了它,因为这个提示让我失望了,而且我对使用字典排序没有经验。我对以 10 为底的数字项目很好,这个提示让我很困惑。感谢您的帮助。
  • 您能解释一下您是如何获得折扣的吗?我做了不同的方式
【解决方案3】:

是简单的串联吗?

T=84, A=65, F=70 -- 所以 TAF = 846,570
J=74, k=75, L=76 -- 所以 JKL = 747,576

【讨论】:

  • 它没有说要使用乘法,但这可能是正确的
  • 那不是乘法。我只是将字符转换为它们的 ASCII 值并连接得到的数字。
【解决方案4】:

您应该获得规范中“小于”和“大于”位的更精确定义。我的猜测与@Whitefret 的猜测相同,可能是字典顺序,但您应该确保这一点。

【讨论】:

  • 是的,我会问,从我尝试 lex order 的方式来看,只是糟糕的措辞让我感到很不舒服处理。它以婴儿步骤给出其他所有内容的方式,迫使我们在作业中做出假设是奇怪的
  • 与您通常在实际项目中获得的要求相比,您的任务非常完美:-)
【解决方案5】:

所以在做了一些研究之后,它看起来确实是按字典顺序排列的。 所以我得到了三个可能的变量,并用 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;
        }

【讨论】:

  • 在比较字符串时避免使用==。它可以在这里工作,因为您实际上比较字符串常量,但您应该始终使用equals 方法。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2017-04-05
  • 2014-06-10
  • 2012-10-23
  • 1970-01-01
  • 2012-02-11
  • 2013-11-20
  • 1970-01-01
相关资源
最近更新 更多