Java - problém s poľom

Programovacie jazyky, rady, poradňa...
macher1
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 38
Registrovaný: 07 jún 2011, 19:36

Java - problém s poľom

Príspevok od používateľa macher1 »

Zdravím vás.

Mám program na prácu s poľom ale niektoré metódy zle pracujú. Program obsahuje generátor (pseudo)náhodných čísel, s tým, že user zadá koľko prvkové pole to má byť a po aké číslo sa majú čísla generovať. Potom tam mám metódu ktorá čísla vypíše v opačnom poradí ako sú vygenerované, lenže niekde tam mám chybu kvôli ktorej sú čísla zoradené nesprávne. Potom tam mám metódu, ktorá by mala zoradiť vygenerované čísla od najmenšieho po najväčšie, lenže ani to nefunguje správne. A mám tam aj metódu ktorá by mala vypočítať priemer čísel, ale aj tam som spravil nejakú chybu, lebo ako priemer je vždy uvedená nesprávna hodnota. Takže aby som to zhrnul, nasledovné metódy nefungujú ako by som chcel:
- avg()
- bubbleSort()
- reverse()
- selectSort()
Mohol by mi niekto poradiť kde mám chybu v tých metódach? PS: tých metód je tam viacej ale tie ostatné fungujú správne.
Zdroják:

Kód: Vybrať všetko

import java.util.*;

public class IntegerArray
{
    private int [] array;
    private int n;
    public IntegerArray(int n)
    {
        array = new int[n];
        this.n=n;
    }
    public void put(int index,int value)
    {
        array [index]=value;
    }
    public int get(int index)
    {
        return array[index];
    }
    public boolean includes(int value)
    {
        for(int i=0;i<n;i++)
        if(array[i]==value)
        return true;   
        return false;          
    }
    public int indexOf(int value)
    {
        for(int i=0;i<n;i++)
            if(array[i]==value)
            return i;
        return -1;
    }
    public int lastindexOf(int value)
    {
        for(int i=n-1;i<0;i--)
            if(array[i]==value)
            return i;
        return -1;
    }
    public double avg()//vypocita priemer cisel - nefunguje spravne
    {
        return sum()/((double)n);
    }
    public int sum()//spocita sumu cisel
    {
        int sum=0;
        for(int i=0;i<n;i++)
            sum+=array[i];
        return sum;
    }
    public int max()//navrati maximalnu hodnotu v poli
    {
        int m=array[0];
        for(int i=1;i<n;i++)
            if(array[i]>m)
            m=array[i];
        return m;    
    }
    public int min()//navrati minimalnu hodnotu
    {        
        int m=array[0];
        for(int i=1;i<n;i++)
            if(array[i]<m)
            m=array[i];
        return m;        
    }
    public String toString()//vypise cisla do Stringu
    {
        String s="";
        for(int i=1;i<n;i++)
            s=s+array[i]+" ";
        return s;
    }
    public void generate(int max)//generuje cisla po zadanu hodnotu
    {
        Random rnd = new Random();
        for(int i=0;i<n;i++)
            array[i]=rnd.nextInt(max);
    }
    public boolean isSymetric()//vypise ci je pole symetricke
    {
        for(int i=0;i<=(n/2);i++)
        {
            if(array[i]!=array[n-i-1])
                 return false;
        }
        return true;
    }
    public void reverse()//zoradi cisla od posledneho po prve - nefunguje spravne
    {
        for(int i=0;i<(n/2);i++)
        {
            int c=array[i];
            array[i]=array[n-i-1];
            array[n-i-1]=c;
        }
    }
    public void ukaz()//metoda na vypis cisel do konzoly
    {
        System.out.println(this);
    }
    public void selectSort()//zoradovanie selectSort()
    {
        for(int j=0;j<n-1;j++)
        {
            int m=array[j];
            int mpos=j;
            for(int i=j;i<n;i++)
                if(m>array[i])
                {
                    m=array[j];
                    mpos=j;
                }
            int c=array[j];
            array[j]=array[mpos];
            array[mpos]=c;
        }
    }
    public void bubbleSort()//zoradovanie bubbleSort - nefunguje spravne
    {
        boolean swap=false;
        do
        {
            swap=false;
            for(int i=0;i<(n-1);i++)
            if(array[i]>array[i+1])
            {                
                int c=array[i];
                array[i]=array[i+1];
                array[i+1]=c;
                swap=true;
            }
        }while(swap);
    }
}
Veľká vďaka.
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: Java - problém s poľom

Príspevok od používateľa mirak2 »

-pri pocitani priemeru mam pocit, ze aj citatel aj menovatel musia byt double, ked chces vratit double.. takze pretypovanie by malo pomoct
-pri bubble sorte si pozri tuna optimizing bubble sort http://en.wikipedia.org/wiki/Bubble_sort#Implementation a si porovnaj, co ti tam chyba.
-select sort vo vnutornom fore mas ist od j+1 a nie iba od j
-reverse je podla mna ok

PS: debugovanie je tvoja prava aj lava ruka.
konyk87
King
King
Používateľov profilový obrázok
Príspevky: 1709
Registrovaný: 24 okt 2007, 15:56

Re: Java - problém s poľom

Príspevok od používateľa konyk87 »

Stačí, keď je jedno z čísel double...Priemer to počíta dobre - problém je pri výpise poľa, kde sa prvé číslo nevypíše, preto máš pri kontrole iné výsledky...

Kód: Vybrať všetko

public String toString()//vypise cisla do Stringu
    {
        String s = "";
        for (int i = 1; i < n; i++) {
            s = s + array[i] + " ";
        }
        return s;
    }
Bubble sort mi funguje správne (skúšal som cca 20 pokusov a ide)...
To isté aj reverse...

V select sorte máš j namiesto i...

Kód: Vybrať všetko

if (m > array[i]) {
     m = array[i];
     mpos = i;
}
macher1
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 38
Registrovaný: 07 jún 2011, 19:36

Re: Java - problém s poľom

Príspevok od používateľa macher1 »

Beriem na vedomie :) Díky moc všetkým !!
Napísať odpoveď