# array werte ausgeben/zugreifen



## Rouven50 (31. Dez 2010)

hey 
haben folgende aufgabenstellung:
Wir simulieren die Abstimmung bei "Deutschland sucht den Superstar". Die Zuschauer können anrufen und ihren Favoriten aus einer bestimmten Anzahl an Sängerinnen und Sängern wählen. Auf dem TV ausgeben wird letztendlich pro Sängerin bzw. Sänger die Anzahl an Zuschauern, die für sie bzw. ihn gestimmt haben, und zwar prozentual.
Schreiben Sie Java-Programm, in dem der Benutzer zunächst die Anzahl an Sängern und anschließend für jeden Sänger die Anzahl an Anrufen eingeben muss. Speichern Sie die Daten in einem geeigneten Array ab. Anschließend soll das Ergebnis der Abstimmung in Form eines Balkendiagramms auf den Bildschirm ausgegeben werden. Und zwar sollen entsprechend der prozentualen Verteilung der Telefonanrufe jeweils Balken aus *-Zeichen (100 % entsprechen dabei 100 *- Zeichen) sowie anschließend der absolute Wert der Telefonanrufe auf den Bildschirm ausgegeben werden.

Beispiel für einen Programmablauf (Eingaben stehen in <>):
Anzahl der Saenger (> 0): <4> 
Anrufe für Saenger 1 (>= 0): <50> 
Anrufe für Saenger 2 (>= 0): <50> 
Anrufe für Saenger 3 (>= 0): <40> 
Anrufe für Saenger 4 (>= 0): <60>
Abstimmungsergebnis: 
************************* 50 
************************* 50 
******************** 40 
****************************** 60

das ist mein code den ich bis jetzt hab... :

```
public class Ue17_aufgabe1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int zahl = IO.readInt("Bitte geben Sie die Anzahl der Saenger ein: ");
		
		int[] anzahl = new int[zahl];
		
		zuweisen(anzahl);

	}
	
	static void zuweisen(int[] anzahl){
		int zaehler = 1;
		for(int i=0; i<anzahl.length;i++){
			anzahl[i] = IO.readInt("Bitte geben Sie die Prozentzahl für Saenger "+ zaehler +" ein: ");
			zaehler++;
		}
		IO.println("---------");
	}

}
```

nun ist jetzt meine frage wie man auf die gespeicherten werte von anzahl_ zugreifen kann... wenn ich ne neue for schleife einbaue die mir dann zb für saenger 1,  40 sterne ausgeben soll dann ist i ja nicht mehr initialisiert...kann mir jemand nen tipp geben wie man das umsetzen muss..finde nichts im inet...außer wenn man halt speziell ein werteinhalt von einem array abfragen möchte...aber nicht für beliebig viele.._


----------



## nrg (31. Dez 2010)

du hast jetzt deine Werte in dem Array anzahl.

Dabei gilt:
index+1 = Nr des Sänders
Wert = Anzahl der Anrufe

Nun musst du erstmal die Summe aller Anrufe ermitteln. Das machst du einfach mittels einer for-schleife. Dann kannst du mit der Summe die prozentualen Anteile errechnen und diese dann 1zu1 in Sternchen übernehmen. Dafür benötigst du nochmal eine for-schleife (man könnte sich evtl. eine sparen, wenn man Initialisierung und Summierung kombiniert).
Wo ist da jetzt genau dein Probelm?

edit: ahja, dein zaehler ist überflüssig. könnte man auch so schreiben (das ist aber eher ein Schönheitsfehler):

```
for(int i=0; i<anzahl.length;i++){
	            anzahl[i] = IO.readInt("Bitte geben Sie die Prozentzahl für Saenger "+ (i+1) +" ein: ");
	        }
```


----------



## Rouven50 (31. Dez 2010)

ja genau..nur ich weiß nicht wie ich die summe der anrufe pro sänger ermitteln kann mit einer forschleife..

hab mir das so gedacht
for(int s=0;s<anzahl_.length;s++){
IO.print("*")
}

aber i ist dann ja nict initialisiert... ich muss ja der reihe nach die werte abfragen der einzelnen arrays... also für saenger "0" , "1" ,"2" und "3" ..da habe ich ja vorher die werte drin gespeichert(schon in prozent angegeben) aber jetzt weiß ich halt nicht wie ich die werte der gespeicherten vektoren abrufen kann

mfg



edit: das habe ich auch est so gemacht nur irgendwie hat er mir dann 01 statt 1 ausgegeben_


----------



## nrg (31. Dez 2010)

ah stimmt hast recht. musst es auch in Klammern schreiben  (siehe edit oben).

Für die Summe einfach die Werte des Arrays in einer For-Schleife addieren (man könnte hier auf foreach nehmen aber das lassen wir jetzt mal noch weg):


```
int sum = 0;
	        for (int i = 0; i < anzahl.length; i++) {
	        	sum += anzahl[i];
	        }
```


----------



## nrg (31. Dez 2010)

Rouven50 hat gesagt.:


> da habe ich ja vorher die werte drin gespeichert(schon in prozent angegeben)



das wäre aber nicht nach der Angabe. Du musst die Anzahl der Anrufe angeben und dann die Prozentanteile selbst errechnen.


----------



## Rouven50 (31. Dez 2010)

ja super klappt dankeschön!! und nen guten rutsch

man musste aber noch sum+=anzahl_ zu sum = anzahl ändern damit sich der wert nicht immer um die neue zahl erhöht...



		Java:In die Zwischenablage kopieren


int sum = 0;
        for (int i = 0; i < anzahl.length; i++) {
             sum = anzahl[i];
             for(int z=0; z<sum;z++){
            	 IO.print("*");
             }IO.println(" " +sum);
         }


edit:
ähm ja aber oben in dem beispiel (was vorgegeben war) stehen ja in den <> klammern die eingegebenen werte...und unten(in ausgeführter form) die selben werte... denk nicht das wir das extra noch umrechnen sollten...aber das wäre ja dann nicht all zu schwer ...die gesamtzahl mit gesamt +=anzahl ermitteln und die dann durch die anzahl des saengers teilen und den wert dann ausgeben lassen.._


----------



## nrg (31. Dez 2010)

Ne, das ist aber nicht nach der Angabe und hat auch nichts mehr mit einer Summierung zu tun . ich hab aus Langeweile die Aufgabe auch mal gemacht. Bin jetzt zu faul das weiter zu erklären. Habs mal an deinen Ansatz angelehnt. Vllt wird es ja dadurch für dich klarer, was du falsch machst.

(allerdings ungetestet, weil ich die Klasse IO nicht kenne)

```
public static void main(String[] args) {   
	        int[] saenger = new int[IO.readInt("Anzahl der Saenger (> 0): ")];
	        ausgeben(saenger, zuweisen(saenger));
	    }

	    private static int zuweisen(int[] saenger){
	    	int sum = 0;
	        for (int i = 0; i < saenger.length; i++) {
	        	int value = IO.readInt("Anrufe für Saenger " + (i+1) + " (>= 0): ");
	        	sum += value;
	        	saenger[i] = value;
	        }
	        return sum;
	    }
	 
	    private static void ausgeben(int[] saenger, int sum) {
	    	System.out.println("Abstimmungsergebnis:");
	    	for (int i = 0; i < saenger.length; i++) {
	    		int procent = Math.round(((100f / sum * saenger[i]) * 100) / 100);
	    		System.out.println(getStars(procent) + " " + saenger[i]);
	    	}
	    }
	    
	    private static String getStars(int amount) {
	    	StringBuilder sb = new StringBuilder();
	    	for (int i = 0; i < amount; i++)
	    		sb.append('*');
	    	return sb.toString();
	    }
```


edit:


Rouven50 hat gesagt.:


> ähm ja aber oben in dem beispiel (was vorgegeben war) stehen ja in den <> klammern die eingegebenen werte...und unten(in ausgeführter form) die selben werte... denk nicht das wir das extra noch umrechnen sollten...aber das wäre ja dann nicht all zu schwer ...die gesamtzahl mit gesamt +=anzahl_ ermitteln und die dann durch die anzahl des saengers teilen und den wert dann ausgeben lassen.._


_

ja aber alle Sterne sollen zusammen 100 ergeben. Das wird es so aber nicht _


----------



## nrg (31. Dez 2010)

Rouven50 hat gesagt.:


> ```
> int sum = 0;
> for (int i = 0; i < anzahl.length; i++) {
> sum = anzahl[i];
> ...



wenn du es so machst, kannst du dir sum sparen:


```
for (int i = 0; i < anzahl.length; i++) {
			for(int z = 0; z < anzahl[i]; z++) {
				IO.print("*");
			}
			IO.println(" " + anzahl[i]);
		}
```


----------



## Rouven50 (31. Dez 2010)

ohja darauf habe ich gar nicht geachtet..dachte die sterne sind gleich die länge der eingegebenen werte - okay top ihc bastel mal an meinem code bissl rum;D


----------

