Avatar
Adam Dvořák:

Ahoj, dělám program na výpočet linearní rovnice, ale hází mi to chybu(dole uvidíte jakou) a nevím proč, popřípadě poradí mě někdo jak to předělat?

import java.util.InputMismatchException;
import java.util.Scanner;





public class rovnice2 {

    public static double vysl=0;
    public static double c1=0;
    public static double c2=0;
    public static double ko=0;
    public static String rovnice="";
    public static boolean b1,b2=true;
    public static Scanner skener=new Scanner(System.in);
    public static int konecna=0;

    public static void main(String[] args) {
        double ko[] = new double[100];
        float[] konstanta = new float[100];
        b1=true;
        while(b1){
            b1=false;
        System.out.println("Zadej rovnici");

        rovnice = skener.nextLine();
        rovnice += "\n";

        for (int i = 0, j = 0, k = 0; i < rovnice.length() - 1;)
        {
            if (rovnice.charAt(i + 1) == 'x' && i < rovnice.indexOf("="))
            {
                if (i != 0 && rovnice.charAt(i - 1) == '-')
                {
                    String x = rovnice.substring(i, i + 1);
                    if (x != "+" && x != "-")
                    {
                        int n = -(Integer.parseInt(x, 10));
                        ko[j++] = n;
                    }
                } else
                {
                    String x = rovnice.substring(i, i + 1);
                    if (x != "+" && x != "-")
                    {
                        int n = Integer.parseInt(x, 10);
                        ko[j++] = n;
                    }
                }
                i += 3;
            }
            if (rovnice.charAt(i + 1) == 'x' && i > rovnice.indexOf("="))
            {
                if (rovnice.charAt(i - 1) == '-')
                {
                    String x = rovnice.substring(i, i + 1);
                    if (x != "+" && x != "-")
                    {
                        int n = Integer.parseInt(x, 10);
                        ko[j++] = n;
                    }
                } else
                {
                    String x = rovnice.substring(i, i + 1);
                    if (x != "+" && x != "-")
                    {
                        int n = -(Integer.parseInt(x, 10));
                        ko[j++] = n;
                    }
                }
                i += 3;
            }
            if (rovnice.charAt(i + 1) != 'x' && i < rovnice.indexOf("="))
            {
                if (rovnice.charAt(i - 1) == '-')
                {
                    String x = rovnice.substring(i, i + 1);
                    if (x != "+" && x != "-")
                    {
                        int n = -(Integer.parseInt(x, 10));
                        konstanta[k++] = n;
                    }
                } else
                {
                    String x = rovnice.substring(i, i + 1);
                    if (x != " + " && x != " - ")
                    {
                        int n = Integer.parseInt(x, 10);
                        konstanta[k++] = n;
                    }
                }
                i += 2;
            }
            if (rovnice.charAt(i + 1) != 'x' && i > rovnice.indexOf("="))
            {
                if (rovnice.charAt(i - 1) == '-')
                {
                    String x = rovnice.substring(i, i + 1);
                    if (x != "+" && x != "-")
                    {
                        int n = Integer.parseInt(x, 10);
                        konstanta[k++] = n;
                    }
                } else
                {
                    String x = rovnice.substring(i, i + 1);
                    if (x != "+" && x != "-")
                    {
                        int n = -(Integer.parseInt(x, 10));
                        konstanta[k++] = n;
                    }
                }
                i += 2;
            }

        }
        for (int i = 0; i < ko.length; i++)
            c1 += ko[i];
        for (int i = 0; i < konstanta.length; i++)
            c2 += konstanta[i];
        vysl = c2 / c1;
        if(vysl==0){
            System.out.println("Nemá řešeni(x=0)");
        }else{
        System.out.println("x = " + (-vysl));
        }
            System.out.println("Cheš řešit dalšà rovnici? 1 pro ano 2 pro ne");
        while (b2) {
                Scanner sc=new Scanner(System.in)   ;
                konecna = 0;
                b2 = false;
                try {

                    konecna = sc.nextInt();
                } catch (InputMismatchException IE) {
                    System.out.println("nezadávej pĂsmena!");
                    b2 = true;


                }
                if(konecna<=0){
                    System.out.println("zadej správnĂ© ÄŤĂslo(toto je moc malĂ©)");
                }
                if(konecna>2){
                    System.out.println("zadej správnĂ© ÄŤĂslo(toto je moc velkĂ©)");
                }

            }
            switch (konecna) {
                case 1:
                    b1 = true;
                    break;
                case 2:
                    b1 = false;
                    break;
            }
        b1=true;
        }
    }
}

chyba:

 
Odpovědět 27. května 17:08
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Adam Dvořák
pocitac770:

Parsování příkladů správně je sviňárna, jde o to, abys nad tím několik hodin dumal a vymyslel, jak to správně zachytit a správně použít. Proto ti asi nepomůžu s tím, jak to vyřešit, ale zde máš chybu:

StringIndexOutOfBoundsException

Říká ná to, že jsme něco chtěli hledat na Stringu podle indexu, ale zadali jsme neplatný index.

at java.lang.String.charAt(.....)

Výborně, a už i víme, kterou metodu jsme použili špatně! Tak hledáme v kódu, hledáme... A narazíme na toto:

if (rovnice.charAt(i - 1) == '-')

Není náhoda, kdy se o stalo, přesněji při iterování, když to bylo u prvního prvku. Ten prvek má index 0. Když to kontrolovalo podmínku

if (rovnice.charAt(i + 1) == 'x' && i > rovnice.indexOf("="))

Tak to prošlo dál, přeci znak na pozici 1 je "x". Ale když se to dostalo k naší špatné podmínce, tak se to kouklo na znak na pozici -1 a bum, už tu byl problém.
Vyřešit by se to dalo možná zavedením podmínky, která by vyřešila tento konkrétní případ, ale to je jenom záplatování, a třeba je těch děr více... To se musí poté už odskoušet.

Editováno 27. května 17:20
 
Nahoru Odpovědět 27. května 17:19
Avatar
Odpovídá na pocitac770
Adam Dvořák:

díky, ale kdyby někdo věděl jak to udělat klidně sem pište, jinak se to budu snažit udělat

 
Nahoru Odpovědět 27. května 17:27
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.