感谢您试图帮助我。
我正在处理的程序应该以一英尺和几英寸的方式询问一个人的输入
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
我不知道我做错了什么,但有些事情已经结束,因为我需要一个数字后才能得到一个结果。
我很确定解析方法有问题,我只是不知道它在哪里。
这是Fraction类
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
答案 0 :(得分:1)
我很确定解析方法有问题,我只是不知道它在哪里。
绝对
出于调试目的,最好在要解析的情况下使用不同的值。对于输入字符串2' 2 2/2"
,如果尝试打印输出,则可能会收到误报。向"1' 2 3/4"5"
方法提供新的输入字符串parse
会生成int[] sA
的数组1 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(" ");
答案 1 :(得分:0)
按标题回答问题......
必须转义文字双引号:
String length = "6\"";
System.out.println(length); // 6"
有关转义字符的详细信息,请参阅JLS - 3.10.6: Escape Sequences for Character and String Literals