# Inhalt eines Arrays vergleichen



## kareem (14. Apr 2011)

hi,

bin ganz neu in der java welt und hoffe jemand kann mir bei einem simplem problem (simpel für die meisten von euch) helfen.

wie kann ich den inhalt eines arrays mit einem wert vergleichen?!
also, ich soll eine zahl 'n' (z.B.:4) per eingabe festlegen, wie groß mein array werden soll. dann soll ich die einzelnen elemente 'z' per eingabe füllen (z.B.: 1,2,3,4  -> da durch 'n' bestimmt).
soweit kein problem.
mein problem ist hierbei, dass ich bestimmen soll wieviel werte eingegeben worden sind abzüglich der Nullen, also 'n' minus Null-eingaben. danach muss das arithmetische mittel bestimmt werden, wobei die Nullen ebenso nicht einbezogen werden sollen. 
habe es mit schleifen versucht, aber es klappt einfach nicht.

wäre dankbar für jeden tipp...

gruß


----------



## SlaterB (14. Apr 2011)

wenn du Aufgaben bekommst, dann vorher keine Erklärung von Java, Lehrbuch, Übungsprogramme oder irgendetwas?

wie sieht dein Code denn bisher aus, und nicht so viel auf einmal, versuche zunächst eine Zahl einzulesen und wieder auszugeben,
funktioniert das soweit? oder welche konkrete Frage hast du?
als nächstes mehrere Zahlen in ein Array einlesen oder was immer deine Aufgabe zum Teil ist,
aber dabei noch nicht an 'n' minus Null und ähnlich komisches denken, eins nach dem anderen, um immer Code posten


----------



## kareem (14. Apr 2011)

hi,

bin mit dem groben ablauf fertig. sprich, summe, mittelwert und anzahl der zahlen. nur, bekomme ich es unter der randbedingung nicht hin, dass die manuellen eingaben 'Null' nicht mitgezzählt werden.

ich hoffe ich füge meinen quelltext jetzt richtig ein...


```
import static Prog1Tools.IOTools.*;

public class GanzeZahlen {

	
	public static void main(String[] args) {
		
		int n = readInteger("Wie viele Zahlen sollen eingegeben werden? >");
		int z[] =new int [n];
		int Anzahl=0;
		int summe=0;
		double mittelwert;
		
		for (int i =0; i < z.length; i++){
			z[i] = readInteger("Zahl Nr."+(i+1)+" : > ");
			summe += z[i];
			}
		
		Anzahl = n;
		
		mittelwert = (summe/(double)n);
		
			
		
		
		System.out.println("Die Summe beträgt = "+summe);
		System.out.println("Die Anzahl der Werte abzüglich z =0 beträgt: "+Anzahl);	
		System.out.println("Das Aritmethische Mittel beträgt " + mittelwert);	
		}
		
	}
```


gebe ich z.B. die werte ein: 2,3,4 , dann soll als anzahl zahlen 3 rauskommen und als arith. mittel auch 3. das läuft auch so.
nur bekomme ich es mit keiner schleife oder ähnliches hin, dass er mir bei einer eingabe von 2,0,6  nur die ganzen zahlen, ausser null, berücksichtig. also also anzahl zahlen 2(nicht drei) und als arithm.mittel (8/2 =4).

danke


----------



## SlaterB (14. Apr 2011)

bisher setzt du Anzahl = n,
Variablen übrigens klein schreiben!

definiere eine neue Variable anzahlNichtNull = 0, und die zählst du in der Schleife hoch, immer +1, es sei denn es wurde eine 0 eingegeben,
also per if unterscheiden

du kannst auch später nach der Eingabe nochmal das Array durchlaufen und mit if zählen, wieviele Elemente 0 sind oder eben nicht


----------



## kareem (14. Apr 2011)

hmm...habe es auch mit einer hilfsvariablen versucht. leider bekomme ich es nicht lauffähig  ???:L


----------



## SlaterB (14. Apr 2011)

if (z_ ...) { hilfsvariable erhöhen }

?_


----------



## kareem (14. Apr 2011)

bringt mir leider überhaupt nichts. zerbreche mir seit zwei stunden deswegen schon den kopf.
ehrlich gesagt kann ich nicht mal nachvollziehen weshalb ich hier eine hilfsvariable benötige.
war fest dran, den inhalt des arrays prüfen zu lassen z.B.: z_ == 0; aber das geht ja nciht.
wie gesagt, bin ganz neu in der welt von java. musste jetzt in zwei wochen ein ganzes semester nachholen. bin jetzt aber voll überladen.
trotzdem vielen dank für deine hilfe._


----------



## akimoon (15. Apr 2011)

kleine Frage: sind "Null"-Eingaben eingaben wo etwas falsches, oder wo "0" eingegeben wurde?

gerade nochmal drübergelesen.. ich glaube, du meinst "0", oder?
Wenn ja:

Versuch doch mal, die Anzahl hochzuzählen in deiner Schleife, wenn der Wert nicht "0" ist?
Pseudocode:

```
anzahlOhneNullen = 0;
for(jedes Element in den Eingegebenen Zahlen){
 if(eingegebene Zahl [x] != 0){
  anzahlOhneNullen um eins erhöhen.
 }
}
```


----------



## kareem (15. Apr 2011)

hi,

ich habe es auch mit der if anweisung versucht [  if (array_ !=0  ) {.... }], aber der Compiler, also die IDE (eclipse) meckert mit mir und meldet nen fehler. dachte eventuell, dass ich den inhalt einer arrays an einer position vllt gar nicht mit "0" vergleichen kann.
Bin leider auf dem Sprung zur arbeit. werde das heute abend oder morgen früh mal testen.
aber erstmal vielen dank!_


----------



## akimoon (15. Apr 2011)

wo schreibst du das denn genau hin?  Evtl kannst du ja nochmal den quelltext-auszug posten?
Die Syntax stimmt eigentlich soweit. Vielleicht schreibst du evtl auch dazu was eclipse sagt, das macht die Fehlersuche meist einfacher =) (und vllt findest du ihn sogar selbstständig? ^^)


----------



## kareem (15. Apr 2011)

hey,

nochmals danke. komme echt nicht weiter. habe es mir verschriftlicht und mir grafisch niedergeschrieben. ich denke es hapert an einem gedankenfehler. ich glaube das ich eine abfangschleife direkt zeile 26 einbringen müsste. in dieser zeile gibt er mir aber eine fehlermeldung    mir ist es total peinlich den code euch online zu stellen, weil einige mit sicherheit bzgl solch eines problems schmunzeln müssen 
ach ja, wo ich gerade bei bin. wie kann ich in java eine abbruchbedingung implenmentieren um zB. die Nuller-eingaben, also "0" abzufangen. finde das in meinem dicken schinken nicht.


```
import static Prog1Tools.IOTools.*;

public class GanzeZahlen {
	
	//statische methoden
	public static double berechneMittelwert(int summe, double n){
		double mittelwert =(summe/n);
		return mittelwert;
		}
	
	public static int berechneAnzahl(int n){
		int anzahl = n;
		return anzahl;
	}
	
	
	//Hauptprogramm
	public static void main(String[] args) {
		
		int n = readInteger("Wie viele Zahlen sollen eingegeben werden? >");
		int z[] =new int [n];
		int summe=0;
				
		for (int i =0; i < z.length; i++){
			z[i] = readInteger("Zahl Nr."+(i+1)+" : > ");
			for (z[i]!=0){
				z[i]+=1;
			
			}
			summe += z[i];
			}		
		
		System.out.println("Die Summe beträgt = "+summe);
		System.out.println("Die Anzahl der Werte abzüglich z =0 beträgt: "+berechneAnzahl(n));	
		System.out.println("Das Aritmethische Mittel beträgt " + berechneMittelwert( summe, n));	
		}
		
	}
```


----------



## akimoon (15. Apr 2011)

Ich geb dir einfach mal zwei Tipps:

1. if-Abfragen macht man mit if(Bedingung){..}, nicht mit for 
2. mach dir doch eine extra int-Variable, die du immer um eins hochzählst, wenn der eingegebene Wert z_ nicht null ist. Aber achte darauf, diese Variable außerhalb der Schleife anzulegen, damit du sie nicht jedes mal auf 0 setzt 

Hoffe die zwei Tipps helfen dir.

PS: Für Abbrüche gibt es mehr möglichten. Von einem einfachen Return, über Exceptions (darüber solltest du was finden ) bis hin die Virtuelle Maschine abzuschießen. Aber.. in deinem Fall wäre es vielleicht freundlicher, dem Benutzer auf die Falsch-Eingabe hinzuweisen und anschließend die Möglichkeit zu geben sie zu wiederholen?  Abbrüche sind selten wirklich notwendig.._


----------



## kareem (15. Apr 2011)

zu 1: *kopfschüttel*... durch das ganze testen und löschen ist mir das nicht aufgefallen 

zu 2: ich versuche es mal. ich glaube ich dneke was du meinst.eine variable die, die ganzen zahlen zählt und eine die nur die nullen zählt. mal sehen ob ich es umsetzten kann, habe schon kein kopf mehr dafür...

kenne nur die return anweisung noch aus C++ zeiten. mein prof verlangt leider, dass das progi abbricht, wenn der nutzer null eingibt (teilaufgabe)


----------



## kareem (15. Apr 2011)

also, der tipp war klasse. an sowas simples denke ich halt noch nicht. vielen dank!
bin jetzt eine ganze ecke stolzer    habe es sogar ganz ordentlich gelöst, wie ich finde 
muss jetzt nur nochmal sehen wie ich eine abbruchbedingung rein bekomme....


hier mein code: 



```
import static Prog1Tools.IOTools.*;

public class GanzeZahlen {
	
	//statische methoden
	public static double berechneMittelwert(int summe, double n){
		double mittelwert =(summe/n);
		return mittelwert;
		}
	
	public static int berechneAnzahl(int n, int anzahlNull){
		int anzahl = n - anzahlNull;
		return anzahl;
	}
	
	
	//Hauptprogramm
	public static void main(String[] args) {
		
int n = readInteger("Wie viele Zahlen sollen eingegeben werden? >");
	if (n>0) {
		int z[] =new int [n];
		int summe=0;
		int anzahlNull=0;
				
		for (int i =0; i < z.length; i++){
			z[i] = readInteger("Zahl Nr."+(i+1)+" : > ");
			if (z[i]==0){
			/*	System.out.print("Das Programm wird Abgebrochen");     // Abbruch bei Eingabe von Null
				System.exit(0);*/
				
				anzahlNull +=1;
			}
				summe += z[i];	         
			}		
		
		System.out.println("Die Summe beträgt = "+summe);
		System.out.println("Du hast insgesamt " + anzahlNull + " mal die '0' eingegeben");
		System.out.println("Die Anzahl der Werte abzüglich z =0 beträgt: "+berechneAnzahl(n,anzahlNull));	
		System.out.println("Das Aritmethische Mittel beträgt " + berechneMittelwert( summe, n));	
		}
	else {
		System.out.println("Keine Eingabe gewünscht, dann halt nicht!");
		}
	}
		
}
```




Edit: neuer überarbeiteter Code! habe jetzt eine System.exit(0) Abbruchbedingung implementiert.
jetzt läufts genau so, wie es soll 

danke euch!!!


----------



## akimoon (15. Apr 2011)

zu 2.: Naja, ich meinte eher eine Variable, die quasi mitzählt, wieviele Werte eingegeben wurden, die nicht 0 sind.


```
int anzEingabenNichtNull = 0;
for(....){
 z[i] = input...;
 if(z[i] != 0){
   anzEingabenNichtNull++;
 }
}
```

Wegen dem Beenden: Entweder über return. Es gibt, meist für Anfänger/Beginner die Möglichkeit, das Programm auch mit System.exit(0) zu beenden, wobei man hiermit alle laufenden Threads beendet soviel ich weiß (ist in diesem Fall nicht schlimm, aber führt in größeren Anwendungen zu manchen Fehlern.. z.B. wenn das Logging plötzlich versagt ^^)


----------



## kareem (15. Apr 2011)

ist das nicht das geliche was ich gemacht habe? nur das ich bei den natürlichen werten die werte in summe speichere und die '0' in anzahl Null :autsch:


----------



## akimoon (15. Apr 2011)

doch :-/
Ich war nur gerade schon am schreiben&abschicken als du deins geschrieben hast ^^


----------



## kareem (15. Apr 2011)

haha,
jedenfalls vielen dank!
mache mich jetzt mit vollem tatendrang an die nächsten Übungen    :rtfm: :rtfm: :rtfm:


----------

