# Hab ein problem



## Unkownsyntax (21. Nov 2008)

Hab hier ein kleines problem: und zwar soll ich eine programm schreiben dass ein Array einliest und überprüft, ob und in welcher Weise das Array sortiert ist. Folgende Fälle sollen dabei unterschieden werden: 
! Das Array ist leer. 
! Alle Elemente sind gleich. 
! Die Elemente sind aufsteigend sortiert. 
! Die Elemente sind absteigend sortiert. 
! Die Elemente sind unsortiert. 

Zum Einlesen eines Arrays können Sie folgende Methode verwenden: 
static int[] readArray(int n) { 
 if (n<0) { 
  return null; 
 } 
 int[] arr = new int[n]; 
 if (n>0) { 
  for (int i=0; i<n; i++) { 
   arr_ = IO.readInt(); 
  } 
  IO.readLn(); 
 } 
 return arr; 
} 

Bsp. Ausgabe:

Number of elements (negative value to quit): 0 
Array is empty. 

Number of elements (negative value to quit): 3 
Elements: 1 1 1 
All elements are equal. 

Number of elements (negative value to quit): 5 
Elements: 1 3 6 6 7 
Elements are in ascending order. 

Number of elements (negative value to quit): 4 
Elements: 4 0 -5 -10 
Elements are in descending order. 

Number of elements (negative value to quit): 5 
Elements: 1 4 2 1 0 
Elements are unordered. 

Number of elements (negative value to quit): -1 

Hier ist mal der code den ich bis jetzt habe:





		Code:In die Zwischenablage kopieren


public class Main {
    
    
    
static int[] readArray(int n)
        {
if (n<0)
{
return null;       
}
int[] arr = new int[n];
if(n>0)
{
for(int i=0; i<n; i++)
 {
arr[i] = IO.readInt();
}
IO.readLn();
}    
return arr;
}

    public static void main(String[] args) {
        
     int [] zahlen;
     
     IO.writeLn("Number of elements (negative value to quit): ");
     int a=IO.readInt();
     
     if(a==0){IO.writeLn("Array is empty.");}
     else {
     IO.writeLn("Elements: ");
     zahlen = readArray(a);
     for(int i=0;i<=a;i++)
{
     for(int n=i+1;n<=a;n++)
{
     if(zahlen[i]==zahlen[n])
{ IO.writeLn("All elements are equal.");}
     else
     if(zahlen [i]<=zahlen[n])
{IO.writeLn("Elements are in ascending order. ");}
     else
     if(zahlen [i]>=zahlen[n])
{IO.writeLn("Elements are in descending order. ");}
     else
{IO.writeLn("Elements are unordered. ");}
     }
     }
     }
    }
}


Irgendwie hab ich das problem dass er mir die ausgabe in welcher form er es ausgibt öfters ist wie einmal ist....

Hat da wer einer ne idee wie es geht... ?_


----------



## Ark (21. Nov 2008)

Wie oft musst du durch ein Array gehen, um eine eventuelle Ordnung festzustellen? Wohl nur einmal, also brauchst du auch nur _eine_ Schleife! Die Definitionen von monoton steigend/fallend usw. dürften dir ja bekannt sein; und genau diese Definitionen setzt du in deine ifs ein.

Ark


----------



## Unkownsyntax (21. Nov 2008)

jo also so ca oder?



```
if(a==0){IO.writeLn("Array is empty.");}
     else {
     IO.writeLn("Elements: ");
     zahlen = readArray(a);
     for(int i=0;i<=a;i++){
   
     if(zahlen[i]==zahlen[i+1]){ IO.writeLn("All elements are equal.");}
     else
     if(zahlen [i]<=zahlen[i+1]){IO.writeLn("Elements are in ascending order. ");}
     else
     if(zahlen [i]>=zahlen[i+1]){IO.writeLn("Elements are in descending order. ");}
     else{IO.writeLn("Elements are unordered. ");}
     }
     }
```

aber dann gibt er mir die ausgabe auch noch immer öfters aus weil das array ja a stellen hat ...


----------



## Murray (21. Nov 2008)

In der Schleife solltest Du nichts ausgeben, sondern in drei Boolean-Variablen festhalten, ob das Array bis zu jeweiligen Schleifendurchlauf noch aufsteigend oder absteigend sortiert oder aus komplett gleichen Elementen besteht. Die Ausgabe erfolgt dann erst nach der Schleife.


----------



## Unkownsyntax (21. Nov 2008)

aber wenn z.b. jetzt die zahlen 1 2 1 heißen dann werden ja zwei verweigungen der if ausgeführt wie mach ich das?^^ steh schon voll auf der leitung arbeite schön länger dran^^sry


----------



## Ark (21. Nov 2008)

Vor Beginn der Schleife setzt du zwei boolesche Variablen auf true: jeweils eine für aufsteigend und die andere für absteigend. In der Schleife testet du dann, ob einmal ein Fall _nicht_ zutrifft. Wenn du also z.B. feststellst, dass das Array nicht mehr aufsteigend sortiert sein kann, dann setzt du die aufsteigend-Variable auf false. Am Ende wertest du dann die booleschen Variablen aus. Je nachdem, welche der vier möglichen Kombination auftritt, kommst du zu entsprechenden Aussagen über die Sortierung des Arrays.

Ark


----------



## Murray (21. Nov 2008)

Etwa so:

```
int prev;
       boolean eq = true;
       boolean asc = true;
       boolean desc = true;
       for(int i=0;i<=a;i++) {
         int ai = a[i];
         if ( i > 0) {
           //--- gleich, wenn bisher gleich und aktuelles Element gleich Vorgänger
           eq = eq && (ai == prev);  
           
           //--- aufsteigend, wenn bisher aufsteigend und aktuelles Element größer oder gleich Vorgänger
           asc = asc && ( ai >= prev);
           
           //--- absteigend, wenn bisher absteigend und aktuelles Element kleiner oder gleich Vorgänger
           desc = desc && (ai <= prev); 
         }
         prev = ai;
       }
```

Wenn man aufsteigend bzw. absteigend als *streng* monoton steigend bzw. fallend definiert, dann müsste man nicht mit >= und <=, sondern mit > und < prüfen.


----------



## Ark (21. Nov 2008)

Ich vermute mal stark, dass die Folgeglieder nicht streng monoton steigend/fallend sortiert sein müssen. (Es wäre zumindest praktisch nicht sehr sinnvoll.) Falls ich richtig liege, dürfte dann auch der Test auf Gleichheit redundant werden.

Ark


----------



## Unkownsyntax (21. Nov 2008)

wieso int ai = a_ 
die zeile versteh ich nicht ganz ? der rest is ganz plausibel..._


----------



## Murray (21. Nov 2008)

Da wird nur eine lokale Variable ai mit dem i-ten Element des Arrays belegt. Das kannst Du auch weglassen und später in den Vergleichen statt ai immer a_ schreiben._


----------



## Ark (21. Nov 2008)

Mir ist gerade langweilig.


```
int[] zahl=irgendwas;
boolean asc=true;
boolean dsc=true;
for(int i=0;i<zahl.length-1;i++){
	asc&=zahl[i]<=zahl[i+1];
	dsc&=zahl[i]>=zahl[i+1];
}
if(asc&&dsc) System.out.println("alles gleich");
else if(asc) System.out.println("aufsteigend");
else if(dsc) System.out.println("absteigend");
else System.out.println("unsortiert");
```
Sollte auch mit Arraylänge=1 funktionieren.

Ungetestet, wie immer.

Ark


----------



## Unkownsyntax (21. Nov 2008)

er sagt mir da array required but int found?


----------



## Ark (21. Nov 2008)

Wenn du mir jetzt noch mitteilen könntest, WO er das meldet ...

Ark


----------



## Unkownsyntax (21. Nov 2008)

e an der stelle von int ai = a_;_


----------



## Ark (21. Nov 2008)

Na, jetzt streng mal deine Birne an.  Tipp: Das Zauberwort lautet Substitution und soll dich darauf aufmerksam machen, dass hier jeder nach seinem Befinden Variablennamen einsetzt, wie er will. Die passende Entsprechung für deine Variablennamen musst du schon selbst suchen.

Ich vermute mal, dass Murray beim flüchtigen Lesen annahm, dass in deinen Quelltexten a das Array wäre, aber a ist bei dir wohl nur die Anzahl der Elemente im Array. Whatever ...

Ark


----------



## Unkownsyntax (21. Nov 2008)

oh klar danke...  also wär dann bei dem code....

beim compilen bekomm ich aber den fehler:


init:
deps-jar:
compile:
run:
Number of elements (negative value to quit): 
1
Elements: 
1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
        at arrayueberpruefun.Main.main(Main.java:49)
Java Result: 1
BUILD SUCCESSFUL (total time: 6 seconds)


fehler is in der zeile int ai = zahlen_;



		Code:In die Zwischenablage kopieren


public class Main {
    
    
    
static int[] readArray(int n)
        {
if (n<0)
{
return null;       
}
int[] arr = new int[n];
if(n>0)
{
for(int i=0; i<n; i++)
 {
arr[i] = IO.readInt();
}
IO.readLn();
}    
return arr;
}



    public static void main(String[] args) {
        
     int [] zahlen; 
     
     IO.writeLn("Number of elements (negative value to quit): ");
     int a=IO.readInt();
     
     if(a==0){IO.writeLn("Array is empty.");}
     else {
     IO.writeLn("Elements: ");
     zahlen = readArray(a);
    
        int prev=0; 
       boolean eq = true; 
       boolean asc = true; 
       boolean desc = true; 
       for(int i=0;i<=a;i++) 
       { 
         int ai = zahlen[i];
         if ( i > 0) { 
           //--- gleich, wenn bisher gleich und aktuelles Element gleich Vorgänger 
           eq = eq && (ai == prev);  
            
           //--- aufsteigend, wenn bisher aufsteigend und aktuelles Element größer oder gleich Vorgänger 
           asc = asc && ( ai >= prev); 
            
           //--- absteigend, wenn bisher absteigend und aktuelles Element kleiner oder gleich Vorgänger 
           desc = desc && (ai <= prev); 
         } 
         prev = ai; 
       }
     }
     
    }
}



und danach einfach ne if verzweigung machen mit den einzelnen boolschen var. wenn die true sind einfach io.write raushauen oder?_


----------



## Ark (21. Nov 2008)

Nun, los! Du hast von Murray und von mir nun Ansätze, fast schon Lösungen bekommen. Aus dem Rechner werden schon keine Rauchwolken aufsteigen, wenn du etwas herumexperimentierst, also trau dich gefälligst, etwas auszuprobieren, und lass dir nicht alles vorkauen. 

Ark


----------



## Gast (22. Nov 2008)

hallo
habe ein problem beim programmieren. Könnte mir jemand helfen???
Ist ganz wichtig und dringend


----------

