# Vokale aus String zählen



## wusel81 (5. Jan 2005)

Hallo wieder mal was schönes... Hab es eigentlich schon soweit fertig. muss nur noch verfeinert werden...
Habe mir den unteren Teil jedoch zusammengesucht und versteh es noch nicht ganz. (siehe Comment)


```
import vfh.prog1.bib.Konsole;

public class Vokale{
  public static void main(String[] args){

	  String text;
	  String anzahl;
	  byte[] eingabe = new byte[200];
	  int[] anzahleingabe = new int[26];
	  int i;

	  System.out.println("Geben Sie bitte eine Text ein:");
	  System.out.println("");

// Text wird über die Konsole eingegeben
	  text = Konsole.getInputString();
	  System.out.println("");

// Eingegebener Text wird wieder ausgegeben
    System.out.println("Die Ausgaben enthaelt die Vokale x mal:");
    System.out.println("---------------------------------------");
    

// Text in Bytes umwandeln
eingabe = text.getBytes();


for (i = 0; i < eingabe.length; i++)
            if (eingabe[i]>90) eingabe[i]-=32;         // Alles nach Großbuchstaben umwandeln
            	                                                     // Versteh ich nicht ganz...


for (i = 0; i < eingabe.length; i++)
            anzahleingabe[(eingabe[i]-65)]++;              // und jetzt zählen ;-) Wieso 65 ???

for (i = 0; i < 26; i++)
            System.out.println((char) (i+65) + " \t*\t " + anzahleingabe[i]);       // Ergebnis ausgeben



}


}
```

Ich brauch das ganze jetzt so,
das er nur die Vokale a,e,i,o,u ausgibt und nicht komplette das ganze Alphabet.


----------



## Student (5. Jan 2005)

mit ner abfrage, ob eben das zeichen einer der fünf vokale ist.


----------



## hugo (5. Jan 2005)

> ```
> for (i = 0; i < eingabe.length; i++)
> if (eingabe[i]>90) eingabe[i]-=32;         // Alles nach Großbuchstaben umwandeln
> // Versteh ich nicht ganz...
> ```


Die Buchstaben werden als ASCII Zeichen gepsichert dabei liegt das kleine a 32 hinter dem großen A, damit werden also alle Werte für Großbuchstaben herausgenommen


> ```
> for (i = 0; i < eingabe.length; i++)
> anzahleingabe[(eingabe[i]-65)]++;              // und jetzt zählen ;-) Wieso 65 ???
> ```


Dadurch, dass die Zeichen bei 65 beginnen, werden alle Zeichen um 65 erniedrigt um A auf die Stelle 0 zu bringen.

In der letzten Zeile werden dann nur noch die Häufigkeiten der einzelnen Buchstaben ausgegeben. Wenn du also wissen willst, wie of du ein A drin hast, musst du nur die anzahleingabe[0] ausgeben lassen. Also mal schauen, an welcher Stelle im Alphabet die Vokale stehen und dann immer -1 damit du die Stelle im Feld findest.


----------



## wusel81 (5. Jan 2005)

Also ich habs jetzt so gelöst...

```
// Ergebnis ausgeben
for (i = 0; i==0; i++)
            System.out.println((char) (i+65) + " \t*\t " + anzahleingabe[i]);

for (i = 4; i==4; i++)
            System.out.println((char) (i+65) + " \t*\t " + anzahleingabe[i]);

for (i = 8; i==8; i++)
            System.out.println((char) (i+65) + " \t*\t " + anzahleingabe[i]);

for (i = 14; i==14; i++)
            System.out.println((char) (i+65) + " \t*\t " + anzahleingabe[i]);

for (i = 20; i==20; i++)
            System.out.println((char) (i+65) + " \t*\t " + anzahleingabe[i]);
```

Völlig umständlich wie ich finde... wie krieg ichs mit ner switch case anweisung hin ?

Außerdem muckt er rum wenn leerzeichen im eingegebenem text sind...


----------



## Guest (5. Jan 2005)

Hi,
also allgemein könntest du ja ne methode  schreiben, welche angibt ob das zeichen ein vokal - ungefähr so:


```
//wir wandeln in kleinbuchstabe um, um weitere vergleiche zu sparen...
public boolean is_vokal(char ch)
{
ch = Character.toLowerCase();

return (ch=='e') || (ch=='a') || (ch=='i') || (ch == 'o') || (ch == 'u');
}
```

Um zu zählen wie wieviele Vokale vorkommen einfach ne int-variable als counter benutzen und je nach rückgabewert von is_vokal() inkrementieren. wenn du noch wissen willst wie oft ein entsprechender vokal vorkam, kannst ja ein array anlegen, welches entsprechend für jeden vokal inkrementiert...

hab jetzt gerad leider nicht viel zeit um das ganze in deinen source einzubauen,hoffe ich konnte dir trotzdem helfen.

btw. wenn 65 etc. irgendwo vorkommt:

65 = a


greets
mic_checker[/code]


----------



## mic_checker (5. Jan 2005)

wusel81 hat gesagt.:
			
		

> Also ich habs jetzt so gelöst...
> 
> ```
> // Ergebnis ausgeben
> ...



Also tatsächlich ist die Anwendung einer for-Schleife in diesem Beispiel umständlich.

Allgemein kannst ja mit switch für solche fälle besser operieren:


```
switch(i)
{
case 0: //Mache was für i == 0
break;
case 4: //Mache was für i == 4
break;
case 8: //Mache was für i == 8
break;
case 14: //....
break;
case 20: //...
break;
default: //ansonsten
break;
}
```

Oder wenn du die Fälle i == 0, i == 4 .... zusammen abhandeln willst:


```
switch(i)
{
case 0:
case 4:
case 8:
case 14:
case 20: //mach was für diese fälle
break;
default: //ansonsten
break;
}
```


greets
mic_checker


----------



## wusel81 (5. Jan 2005)

Ich peils einfach nich...


```
switch(i)
{
case 0: 	System.out.println((char) (i+65) + " \t*\t " + anzahleingabe[i]);
case 4: 	System.out.println((char) (i+65) + " \t*\t " + anzahleingabe[i]);
case 8: 	System.out.println((char) (i+65) + " \t*\t " + anzahleingabe[i]);
case 14:	System.out.println((char) (i+65) + " \t*\t " + anzahleingabe[i]);
case 20: 	System.out.println((char) (i+65) + " \t*\t " + anzahleingabe[i]);
break;
}
```

So gehts nicht... anders weiß ich irgendwie nich... bin ich echt zu blöd zu...
das problem mit den leerzeichen wäre damit doch auch nicht gelöst oder ?


----------



## mic_checker (5. Jan 2005)

Zuerst einmal musst du nach jedem case ein break setzen, ansonsten läuft er bis zum ende der switch anweisung durch (außer dieses verhalten ist gewollt). außerdem war das nur ein allgemeines beispiel für switch.

also, erstmal ob ich die frage richtig verstanden hab. du liest einen text ein, der vom user eingegeben wird. danach willst du so was in der art ausgeben:

a = 10 mal
e = 32 mal
i = 21 mal
o = 11 mal
u = 13 mal

Oder ?

greets
mic_checker


----------



## wusel81 (5. Jan 2005)

genau so !


----------



## mic_checker (5. Jan 2005)

Hi,
also ich hab mal gerade ganz schnell nen source aufgesetzt, ist nicht sehr elegant...aber müsste so eigentlich funktionieren....


```
//In Eingabe habe ich Methoden zum Einlesen diverser Dinge, wie Strings etc.
import Eingabe.*;

public class CountVokal
{
	public static void main(String[] args)
	{
		String str = TEingabe.readStr();
		char ch;
		
		/*
		* count[0] = a
		* count[1] = e
		* count[2] = i
		* count[3] = o
		* count[4] = u
		*/
		int[] count = new int[5];
		
		for(int i = 0;i < str.length();i++)
		{
			ch = str.charAt(i);
			
			if(ch == 'a' || ch == 'A')
				count[0]++;
			else if(ch == 'e' || ch == 'E')
				count[1]++;
			else if(ch == 'i' || ch == 'I')
				count[2]++;
			else if(ch == 'o' || ch == 'O')
				count[3]++;
			else if(ch == 'u' ||ch == 'U')
				count[4]++;
		}
		
		System.out.println("a = "+count[0]+" mal");
		System.out.println("e = "+count[1]+" mal");
		System.out.println("i = "+count[2]+" mal");
		System.out.println("o = "+count[3]+" mal");
		System.out.println("u = "+count[4]+" mal");
	}
}
```

wie gesagt, ist ganz schnell gemacht, hoffe es funzt, ansonsten -> post

greets
mic_checker


----------



## wusel81 (5. Jan 2005)

Super das hat gefunzt und ich hab es auch verstanden ! DANKE !!!


----------



## mic_checker (5. Jan 2005)

kein problem.

du kannst ja mal selber probieren das ganze noch etwas umzuprogrammieren, so dass du ne switch anweisung verwenden kannst....ist nicht allzu schwer.

greets
mic_checker


----------



## wusel81 (5. Jan 2005)

Ja erstmal mach ich mich noch an die andere Aufgabe... aber da werd ich denk ich nochn Thread zu aufmachen...

|| Das bedeutet ja nur das er z.B. ch == 'a' und ch == 'A' gleichsetzt richtig ? (Oder is das || nur zum trennen da , konnte es nich finden)


----------



## L-ectron-X (5. Jan 2005)

So wie es ein logisches UND gibt (&&) gibt es in Java ein logisches ODER (||).
Beim logischen UND müssen alle Bedingungen zu true ausgewertet werden. Beim logischen ODER genügt eine Auswertung zu true. Also: entweder dies ODER das ODER jenes ODER ...


----------



## mic_checker (5. Jan 2005)

habs eben mal schnell mit switch umgesetzt und auch sonst etwas umgeschrieben, ist jetzt etwas kürzer..aber probier ruhig erstmal selber dran rum , denn nur so lernst du es 


greets
mic_checker


----------



## wusel81 (5. Jan 2005)

Werd ich machen ! Danke !!!


----------



## Jaraz (5. Jan 2005)

Hi,

ich würde es so machen.


```
public static void main(String[] args) {
		int[] a = new int[32];
		byte [] c = "dies ist ein Test Text in dem Oft Vokale vorkommen Ofen Ufo".getBytes();
		for (int i = 0; i < c.length; i++) {
			a[(c[i]%32)]++;
		}
		System.out.println("a: "+a[1]+" e: "+a[5]+" i: "+a[9]+" o: "+a[15]+" u: "+a[21]);
	}
```

Gruß Jaraz


----------



## schrobi (5. Jun 2009)

Hallo liebe Leute.

Ich wollte keinen neuen Thread aufmachen da dieser hier mein Problem schon ganz gut beschreibt.
Habe auch die Aufgabe aus einer Texteingabe die Vokale zu zählen.
Mein Programm sieht folgendermaßen aus:

Testklasse:

```
import java.io.*;

public class VokaleTester {

    public static void main(String[] args) {
        Vokale test = new Vokale();
        test.muh();
    }
}
```

Hauptklasse:

```
import java.io.*;

public class Vokale {
	
	//Eingabe des Users
	String input;
	//Integer zum erfassen der laenge des Strings.
    int int02;
    //Array zum zaehlen der Vokale. 0=a, 1=e, 2=i, 3=o, 4=u
    int[] vocal = {0, 1, 2, 3, 4};
    
    /**
     *Methode zum einlesen der Usereingabe.
     */
    private void readIn() {
        BufferedReader br = new BufferedReader(
                    new InputStreamReader(System.in));
        try {            
            input = br.readLine();
        } catch (IOException e) {
        }
    }
	
	
	public final void muh() {
		System.out.println("Bitte einen Text eingeben.");
		readIn();
		int02 = input.length();
		
		for (int i = 0; i< int02; i++) {
			
			switch (input.charAt(i)) {
				case 'a': vocal[0]++;
					break;
				case 'A': vocal[0]++;
					break;
				case 'e': vocal[1]++;
					break;
				case 'E': vocal[1]++;
					break;
				case 'i': vocal[2]++;
					break;
				case 'I': vocal[2]++;
					break;
				case 'o': vocal[3]++;
					break;
				case 'O': vocal[3]++;
					break;
				case 'u': vocal[4]++;
					break;
				case 'U': vocal[4]++;
					break;
			}
		}
			
		System.out.println("Laenge der Eingabe: " + int02);
		System.out.println("");
		System.out.println("a = " + vocal[0] + " mal!");
		System.out.println("e = " + vocal[1] + " mal!");
		System.out.println("i = " + vocal[2] + " mal!");
		System.out.println("o = " + vocal[3] + " mal!");
		System.out.println("u = " + vocal[4] + " mal!");
	}

}
```

Bekomme momentan als Ausgabe total falsche Werte bei den gezählten Vokalen und denk mal, dass es an dem switch-case-Block liegt. Aber habe keine Ahnung wie ich es ändern muss.
Hoffe ihr könnt mir hier weiterhelfen.

Schrobi


----------



## Roar (5. Jun 2009)

ne, das liegt daran dass du schon vorher reinschreibst wieviele vokale da sind:
vocal = {0, 1, 2, 3, 4};
=>
vocal = new int[5];
?


----------



## schrobi (5. Jun 2009)

Tausend Dank. Jetzt läuft es wie gewünscht :applaus::toll:

Schrobi


----------

