# Kleinbuchstaben zählen



## Carlos Valderra (25. Jun 2012)

Hallo, 

das Programm soll Kleinbuchstaben, die man eingibt oder die von einer .txt-Datei eingelesen werden zählen, aber ich erhalte immer "0" als Antwort.


```
import IOulm.*;

public class CountChar {
public static void main (String[] args) {
int b=0;
char KB=' ';

while(Urc.readChar()){
KB=Urc.getChar();
}
if (Character.isLowerCase(KB))
b=b+1;

System.out.println(b);
}
}
```


----------



## ssoul26 (25. Jun 2012)

Weil die while geschlossen wird und du somit nur das letzte Char liest. Verändere die Position deiner geschweiften Klammern.


----------



## Carlos Valderra (25. Jun 2012)

Natürlich, dummer Fehler von mir . Danke.


----------



## Carlos Valderra (25. Jun 2012)

Ich muss leider nochmal "öffnen":

In der nächsten Teilaufgabe wird gefordert die Kleinbuchstaben einzeln aufzuzählen. Also nachdem Schema:

a: 1x
b: 11x
c: 0x
d: 4x
...
(Der Text entählt 1'a', 11'b', 0'c', 4'd',...)

Hier mein Quellcode dazu:

```
import IOulm.*;

public class CountChar {
public static void main (String[] args) {
int b=0, i=0;
char KB=' ';


while(Urc.readChar()){
KB=Urc.getChar();

if (Character.isLetter(KB)) { //Buchstabe
         i = (int) KB;
		 
if (Character.isLowerCase(KB))
System.out.println(i);
b=b+1;
for(char a = 'a', z = 'z'; a <= z; a++) 
System.out.println(a+": "+b+"x");
}

}
}
}

int anzahl[] = new int[122];
for(int i = 0; i< allezahlen.size; i++)
{
anzahl[allezahlen.get(i)]++;
}

for(int j = 1; j <= anzahl.length;j++)
{
System.out.println("zahl: " + j + " anzahl: " + anzahl[j-1]);
}
```

Mit 

```
if (Character.isLowerCase(KB))
System.out.println(i);
b=b+1;
for(char a = 'a', z = 'z'; a <= z; a++) 
System.out.println(a+": "+b+"x");
```

geb ich die Buchstaben von 'a' bis 'z' aus. Dementsprechend soll später 'b' die Anzahl sein.

Mein aktueller Ansatz ist wahrscheinlich zu kompliziert gedacht: Ich will die Buchstaben in ASCII-Nummern umwandeln (97-122), diese zählen und dann wieder in Buchstaben umwandeln.

```
if (Character.isLetter(KB)) { //Buchstabe
         i = (int) KB;
```

wandelt die Buchstaben in ASCII-Nummern um.


----------



## Templarthelast (26. Jun 2012)

Ausversehen doublepost -.-


----------



## Templarthelast (26. Jun 2012)

Da kanst du ja mir dem char Datentyp arbeiten. d.h. Falls ein Buchstabe klein ist, wird er zum char umgewandelt. 


```
String test = "hallo test";
int anzahl[] = new int[26];
for(int i =0; i < test.length(); i++) {
	if(Character.isLetter(test.charAt(i)) && Character.isLowerCase(test.charAt(i))) {
                anzahl[Character.getNumericValue(test.charAt(i))-10]++;
		System.out.println("Buchenstabenanzahl von \""+test.charAt(i)+"\" wurde auf "+anzahl[Character.getNumericValue(test.charAt(i))-10]+" erhöht.");
		
		
		
	}
}
```


----------



## ssoul26 (26. Jun 2012)

Leg dir ein int [] Array der Größe 26 an. Dann hol dir das Char und führe modulo 97 (da 'a' bei 97 liegt) aus. Das int [] array an der Stelle (also Ergebnis des Modulo) inkrementierst du dann um eins.  
-> Kleinbuchstaben liegen zwischen 97 und 122. Tippst du jetzt z. B 'b' (also 98 (ASCII)) dann solltest du wie folgt vorgehen.
1. int ch= 'b'; -> 98
2. array[ch%26]= array[ch%26]+1; // 98 % 97= 1, also -> b
3. beim auslesen einfach den ArrayIndex + 97 auf Char casten. Dann hast du erst einmal den Buchstaben und der Inhalt des Array an dieser Stelle gibt dir an, wie oft es vorkam. 
Beachte: Führe die Überprüfungen nur dann aus, wenn die Eingabe zwischen >=97 und <=122 liegt.


----------



## Carlos Valderra (26. Jun 2012)

Templarthelast hat gesagt.:


> Da kanst du ja mir dem char Datentyp arbeiten. d.h. Falls ein Buchstabe klein ist, wird er zum char umgewandelt.
> 
> 
> ```
> ...



Dein ist schon ganz gut, aber ich brauch noch ne Möglichkeit den 
	
	
	
	





```
String Test
```
 der Standardeingabe zuzuordnen. Hab es mit


```
import java.util.Scanner;
[...]
public static void main(String[] args)
	{
		String test = Eingabe();
[...]
}


static String Eingabe()
	{
		Scanner s = new Scanner(System.in);
		String text = s.next();
		return text;
	}
[...]
```

versucht, aber das hat nicht so recht geklappt.


----------



## Templarthelast (26. Jun 2012)

```
try{
	    BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
	    String s = bufferRead.readLine();
 
	   
	}
	catch(IOException e)
	{
		e.printStackTrace();
	}
```


----------



## Carlos Valderra (3. Jul 2012)

Danke für die Hilfe, hier übrigens die Lösung:


```
import IOulm.*;
import java.util.Formatter;

public class CountChar{
   public static void main(String[] args) {
      /*abc[0] repraesentiert Anzahl von 'a';
        abc[1] repraesentiert Anzahl von 'b'...*/
      int abc[] = new int[26];
      Formatter f = new Formatter(System.out);
      
      while (Urc.readChar()) {
         char c = Urc.getChar();
         if (Character.isLowerCase(c)) {
            abc[c-97]++;
         }
      }

      for (int i=0; i<abc.length; i++) {
         f.format("%c: %3dx\n", (char)(i+97), abc[i]);
      }
   }
}
```


----------



## so0jvpwemm (3. Jul 2012)

Sowohl Deine als auch meine Lösung berücksichtigt keine Umlaute:

```
String text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor " +
				"invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam " +
				"et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem " +
				"ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod " +
				"tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam " +
				"et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";
		
		int length = text.length();
		for(int i='a'; i<='z'; i++) {
			String letter = String.valueOf((char)i);
			text = text.replaceAll(letter, "");
			System.out.println(letter + ": " + (length - text.length()));
			length = text.length();
		}
```


----------

