1

感谢您尝试帮助我。

我正在开发的程序应该要求一个人输入英尺和英寸

2' 2 2/2"<---(此格式)

但是,我想不出一种方法来实现这种用户输入。

该计划由三个班级组成

  • 分数
  • 一对
  • 混合

爪哇:

import java.util.Scanner;
class Mix extends Fraction {

  public Mix ( int n, int m) {
    super (n,m);
  }

  public String displayMix() {
  String str="";
    if (first < second) 
    str=first+ "'" + first%second +"/"+second+"\"";
    else 
    str=first+"'" +(first+second)+"/"+second+"\"";

    return str; 
  } //display

  public static String get () {
    Scanner scan = new Scanner(System.in);
    System.out.print("Please enter a mixed-format number:");
    String userInput = scan.nextLine();
    userInput = userInput.trim();
    System.out.println("Input is: "+ userInput);
    return (userInput);
  } //get


  public static void main(String [] args) {
    String userInput;
    int[]iA = {0,0,0,1};

    userInput = Mix.get();
    iA=parse(userInput);
    Mix f = new Mix ( iA[0] , (iA[1]*iA[2])+(iA[3]) );
    System.out.println("Number = " + f.displayMix());

    userInput = Mix.get();
    iA=parse(userInput);
    Mix g = new Mix ( iA[0] , iA[1] * iA[3] + iA[2]);
    System.out.println("Number = " + g.displayMix());

    Mix h = Mix.add (f,g);
    System.out.println("Sum ="+ h.displayMix());
  } // main


  public static Mix add (Mix f, Mix g) {
    int gtop=       f.first+g.first;

    int gbottom=    f.second+g.second;
    return(new Mix ( gtop, gbottom));
  } //add


  public static int[] parse (String userInput) {
    int [] sA = {0,0,0,1};
    int pos = userInput.indexOf("'");

    String sNum0 = userInput.substring(0,pos);
    pos = userInput.indexOf("'");
    sA[0]= Integer.parseInt(sNum0);

    String sNum = userInput.substring(0,pos);
    pos = sNum.indexOf("  ");
    sA[1]= Integer.parseInt(sNum);

    String sNum2 = userInput.substring(pos + 1);
    pos = sNum2.indexOf("/");

    String sTop= sNum2.substring (pos +3);
    pos = sNum2.indexOf("\"");
    sA[2] = Integer.parseInt(sTop);

    String sBot = sNum2.substring(pos +1);

    sA[3] = Integer.parseInt(sBot);

    // 2' 2 2/2
    return (sA);
  }
} //parse

输入后我设法得到结果

2' 2 2/2"1

我不知道我做错了什么,但有些东西不对劲,因为我需要在 " 后面加上一个数字才能得到结果。

我很确定解析方法有问题,我只是不知道它在哪里。

这是分数类

public class Fraction extends Pair {
  //attributes: NONE

  public Fraction(int n, int m) {
    super(n,m);
    int g=gcd(n,m);
    first = first;
    second=second/g;
  } //Fraction


  public void display2() {
    System.out.print(first);
    System.out.print("/");
    System.out.println(second);
  } //display


  public Fraction add (Fraction f1, Fraction f2) {
    int gtop=f1.first * f2.second
    + f2.first * f1.second;
    int gbottom= f1.second * f2.second;
    return (new Fraction(gtop,gbottom));
  }


  public static int gcd (int n, int m) {
    while ( n!=m) {
      if (n>m) n=n-m;
      else m=m-n;
    } //while
    return (n);
  } //gcd
} //class

这是对类

public class Pair {
  int first;
  int second;

  public Pair(int n, int m) {
    first=n;
    second=m;
  } //Pair


  public void display() {
    //pseudo_code is here
    System.out.print("First integer="+first);
    System.out.println();
    System.out.println("Second integer="+second);
  } //display


  public static void main(String[] args) {
    //pseudo-code is here
    Pair f= new Pair(2,4);
    f.display();
  } //main
} //class
4

2 回答 2

1

我很确定解析方法有问题,我只是不知道它在哪里。

绝对地。

出于调试目的,最好在解析的情况下使用不同的值。对于您的输入字符串2' 2 2/2",如果您尝试打印输出,您可能会收到误报。"1' 2 3/4"5"为您的方法提供一个新的输入字符串会产生parse一个. 现在来寻找问题。int[] sA1 1 5 5

int pos = userInput.indexOf("'");

String sNum0 = userInput.substring(0, pos);
pos = userInput.indexOf("'"); //why getting a position you already have?
sA[0] = Integer.parseInt(sNum0);

该片段用于检索第一个数字。在我提供的评论中,一个奇怪的地方很明显。接下来问题开始了,

 String sNum = userInput.substring(0, pos);
 pos = sNum.indexOf("  ");
 sA[1] = Integer.parseInt(sNum);

您再次从输入中得到相同2的结果,然后尝试在 1 字符长度的字符串中查找双空格。你的pos成为-1,你复制你的数据分配sA[0]sA[1]具有相同的价值。

String sNum2 = userInput.substring(pos + 1);
pos = sNum2.indexOf("/");

接下来,因为你pos现在是-1你的子字符串,所以整个 userInput 导致sNum2和 userInput 基本上是.equals()相互的。pos现在等于 6。

String sTop = sNum2.substring(pos + 3);
pos = sNum2.indexOf("\"");
sA[2] = Integer.parseInt(sTop);

pos + 3这就是为什么你必须输入额外的输入字符。

我不会详细介绍如何以及在何处解决这些问题,因为有多种解决方案。但是,如果您被允许使用该.split()方法,我强烈建议您利用它。

 String[] tokens = "1' 2 3/4\"".split(" ");
于 2013-10-06T04:08:47.307 回答
0

按照标题回答问题...

必须转义文字双引号:

String length = "6\"";
System.out.println(length); // 6"

有关转义字符的更多信息,请参阅JLS - 3.10.6:字符和字符串文字的转义序列

于 2013-10-06T01:33:41.153 回答