1

我是 Java 新手,所以我正在尝试编写随机程序来解决这个问题。我正在尝试编写一些将用户输入作为二次方程的东西,如下所示:x^2 + 3x -1

也许这太高级了(或者可能不是),但我想知道如何在循环中一个接一个地提取字符。如果都是数字,我想我可以使用.isDigit()它们并将它们保存到一个数组中,但是因为它们是不同的数据类型,我不知道如何去做。到目前为止,我的“代码”看起来像这样

import java.lang.String;
import java.lang.StringBuffer;
import java.util.Scanner;
import java.lang.Character;

public class Lab
{
    public static void main(String[] args)
    {
        Scanner user_input = new Scanner(System.in);
        System.out.print("Please input the quadratic equation (ex: 2x^2 + 3x - 2): ");

        String request = user_input.nextLine();
            int myArr[];
        String lettArr[];
        for (int i = 0; i <= request.length(); i++)
        {
            String c = request.charAt(i);

            if (request.isDigit(c))
            {
                myArr[1] += c;
            }
            if(request.isLowerCase(c))
            {
                lettArr[1] += c;
            }
        }
        System.out.println(myArr[0]);
    }
}

我的.isDigit().isLowerCase()方法不起作用。我认为我在正确的意义上使用它们。这对我的水平来说相当复杂,我想知道这是一个死胡同还是一个可以接受的策略。

谢谢。

4

2 回答 2

2

我认为您要做的是从用户输入中提取系数。您的方法可能有效,但您必须考虑很多情况(例如 +/- 符号)。相反,你为什么不试试 Java 的正则表达式

String input = "2x^2 - 4x + 1";
input = input.replaceAll("\\s", ""); //removes  all whitespaces

Pattern p = Pattern.compile("(-?\\d+)x\\^2((\\+|-)\\d+)x((\\+|-)\\d+)");
Matcher m = p.matcher(input);

if (!m.matches()) {
    System.out.println("Incorrect input");
    return;
}

int a, b, c;
a = Integer.parseInt(m.group(1));
b = Integer.parseInt(m.group(2));
c = Integer.parseInt(m.group(4));

System.out.println(String.format("a=%d, b=%d, c=%d", a, b, c));

您可以调整此片段并在您的代码中使用它。但是,我假设您的系数是整数。相反,如果您需要它们,则double必须更改给定正则表达式的格式并更改Integer.parseIntDouble.parseDouble. 如果你有兴趣,我可以写得更详细。

于 2013-11-07T23:15:38.140 回答
1

您的代码有一些问题:

public class Lab
{
    public static void main(String[] args)
    {
        Scanner user_input = new Scanner(System.in);
        System.out.print("Please input the quadratic equation (ex: 2x^2 + 3x - 2): ");

        String request = user_input.nextLine();
        int myArr[];        //not initialized
        String lettArr[];   //should be a character type & not initialized
        for (int i = 0; i <= request.length(); i++)
        {
            String c = request.charAt(i); // returns a char

            if (request.isDigit(c))
            {
                myArr[1] += c;  // not right, myArr is ints and c is a char
            }
            if(request.isLowerCase(c))
            {
                lettArr[1] += c; // not right
            }
        }
        System.out.println(myArr[0]); //only prints one char (you might want this
     }
 }

1. 您正在从输入字符串中提取一个字符并尝试将其添加到未初始化数组的第二个条目中。您的代码行是:

myArr[1] += c;

myArr 是一个整数数组,c 是一个字符。你不能在java中做到这一点。更重要的是,您正在尝试将 char 添加到 int 中,而 int 最初并未初始化!数组中所有内容的类型必须相同。当涉及到继承等时,这变得更加复杂,但现在只知道你不能这样做。如果你想要一个字符的整数值,你可以使用:

Integer.parseInt(c)

我不确定你想对你的陈述做什么,但我 90% 确定它没有试图做你想做的事。以供参考:

myCharArr[i] = c;

将第 i 个元素(从 0 开始)赋给 c 的值。所以如果 i=1 并且 myCharArr 被初始化为 3 个元素,它看起来像这样:

[ ? | c | ?]

在哪里 ?只是一个垃圾值。

2.在java中你需要初始化你的数组,或者使用更动态的List对象。原始数组的问题是它们的大小不能改变,即当初始化原始数组时:

int arr[] = new int[5];

它保持相同的大小(在本例中为 5)。如果您使用 ArrayList 之类的东西,则可以添加任意数量的内容。初始化 ArrayLists 的方式如下:

ArrayList<Integer> intArr = new ArrayList<Integer>();
ArrayList<Character> charArr = new ArrayList<Character();

和那些初始化你可以做:

intArr.add(someInt);  
charArr.add(someChar);

您可以使用原始数组来解决这个问题,但如果您使用列表,它会为您节省一些麻烦。

阅读数组。

于 2013-11-07T23:28:45.770 回答