2012-02-11 2 views
1

Я читаю файл .txt для создания многочленов. У меня возникают проблемы с печатью полиномов (после того, как они были помещены в связанный список). Я не совсем уверен, как идти о 'связывании' связанного списка и полиномиального метода ...Создание многочлена из текстового файла Int.

Текст файла:

P1 = 3 5 1 -1 0 8 
P2 = 5 6 2 -1 1 7 0 -4 
p3 = p1 + p2 
p4 = p3 - p1 

Код:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.LinkedList; 
import java.util.Scanner; 

public class Polynomial { 
    public Term first; 
    public Term last; 
    private int[] coef; // coefficients 
    private int deg; // degree of polynomial (0 for the zero polynomial) 

    // a * x^b 
    public Polynomial(int a, int b) { 
     coef = new int[b + 1]; 
     coef[b] = a; 
     deg = degree(); 
    } 

    // return the degree of this polynomial (0 for the zero polynomial) 
    public int degree() { 
     int d = 0; 
     for (int i = 0; i < coef.length; i++) 
      if (coef[i] != 0) 
       d = i; 
     return d; 
    } 

    // return c = a + b 
    public Polynomial plus(Polynomial b) { 
     Polynomial a = this; 
     Polynomial c = new Polynomial(0, Math.max(a.deg, b.deg)); 
     for (int i = 0; i <= a.deg; i++) 
      c.coef[i] += a.coef[i]; 
     for (int i = 0; i <= b.deg; i++) 
      c.coef[i] += b.coef[i]; 
     c.deg = c.degree(); 
     return c; 
    } 

    // return (a - b) 
    public Polynomial minus(Polynomial b) { 
     Polynomial a = this; 
     Polynomial c = new Polynomial(0, Math.max(a.deg, b.deg)); 
     for (int i = 0; i <= a.deg; i++) 
      c.coef[i] += a.coef[i]; 
     for (int i = 0; i <= b.deg; i++) 
      c.coef[i] -= b.coef[i]; 
     c.deg = c.degree(); 
     return c; 
    } 

    // convert to string representation 
    public String toString() { 
     if (deg == 0) 
      return "" + coef[0]; 
     if (deg == 1) 
      return coef[1] + "x + " + coef[0]; 
     String s = coef[deg] + "x^" + deg; 
     for (int i = deg - 1; i >= 0; i--) { 
      if (coef[i] == 0) 
       continue; 
      else if (coef[i] > 0) 
       s = s + " + " + (coef[i]); 
      else if (coef[i] < 0) 
       s = s + " - " + (-coef[i]); 
      if (i == 1) 
       s = s + "x"; 
      else if (i > 1) 
       s = s + "x^" + i; 
     } 
     return s; 
    } 

    // test client 
    public static void main(String[] args) throws IOException { 

     // Welcome message 
     System.out 
       .println("Welcome! The following program processes single-variable polynomials represented as linked lists.\n" 
         + "Test Data will appear below, and is also saved to a text file (userSpecification.txt) \n" 
         + "-------------------------------" + "\n"); 

     String content = new String(); 
     String name = new String(); 
     File file = new File("polynomialTest.txt"); 
     LinkedList<String> list = new LinkedList<String>(); 

     try { 
      Scanner sc = new Scanner(new FileInputStream(file)); 
      while (sc.hasNext()) { 
       name = sc.next(); 
       content = sc.nextLine(); 

       // ..just checking things as they come in. 
       System.out.println("name " + name + " content " + content); 

       list.add(content); 

      } 

      sc.close(); 
     } catch (FileNotFoundException fnfe) { 
      fnfe.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println("\nProgram terminated Safely..."); 
     } 

     Iterator<String> i = list.iterator(); 
     while (i.hasNext()) { 
      System.out.println(name + i.next() + "\n"); 

     } 

    private class Term { 
     int coef; 
     int expo; 
     Term next; 

     Term(int coef, int expo, Term n) { 
      this.coef = coef; 
      this.expo = expo; 
      this.next = n; 
     } 
    } 
} 

Желаемый результат:

P1 = 5X^3 – 4X + 8 
P2 = 6X^5 -2X^2 +7X -4 
P3 = 6X^5 +5X^3 -2X^2 +3X +4 
P4 = 6X^5 -2X^2 +7X -4 

Выход прямо сейчас:

Project #2 
Welcome! The following program processes single-variable polynomials represented as linked lists. 
------------------------------- 

P1 = 3 5 1 -1 0 8 

P2 = 5 6 2 -1 1 7 0 -4 

p3 = p1 + p2 

p4 = p3 - p1 

[P1 = 3 5 1 -1 0 8, P2 = 5 6 2 -1 1 7 0 -4, p3 = p1 + p2, p4 = p3 - p1] 
+0

Это должно быть: P1 = 5X^3 - X + 8, ваше первое уравнение неверно, или ваши входные данные неверны. – eternaln00b

+0

Спасибо, меня не так беспокоит число, так как я получаю полиномы для фактического отображения (например, ожидаемого вывода). Хороший улов, хотя, я это изменил! – tommy1370

ответ

1

Вы понимаете концепцию LinkedList и ее использование в вашей программе? Из того, что я собрал из вашего кода (который, если вы хотите получить больше ответов, должен быть очень кратким и содержать только код, который абсолютно необходим для запуска вашей программы), у вас есть этот класс Term, который представляет собой реализацию LinkedList, в этом классе Polynomial, который в основном просто держит класс Term и не делает много с ним и вместо этого сам позаботится обо всем вашем коде. То, что вы должны сделать, это думать о самом Term как о наборе узлов, представляющих выражение полинома. В вашей функции main вы должны считывать переменные, превращая их в экземпляры Term и добавляя их к корневому объекту Term (по одному на полиномиальное выражение) в виде большего количества узлов. Когда вы добавляете Term (вместе с полными полиномиальными выражениями), все, что вам нужно сделать, это цикл и объединение всех тех, которые имеют одинаковый показатель.