wortlänge bestimmen



  • hab ein programm dass mir die anzahl der buchstaben errechnet und dann auch graphisch darstellt. jetzt wollte ich noch bestimmen wieviele worte mit 1, 2, 3, 4 usw bis 100 buchstaben vorkommen. nur leider funktioniert das nicht so wie ich es gedacht habe. hoffe ihr könnt weiterhelfen:

    #include <stdio.h>
    
    void balken(int zeichen)
    {
    	int i;
    
    	for(i=zeichen;i>0;i--)
    	{
    		printf("#");
    	}
    }
    
    void relativ(int zeichen, int max)
    {
    	int i;
    	int verh;
    
    	verh=((float)zeichen/max)*60+0.5;
    
    	for(i=(int)verh; i>0; i--)
    	{
    		printf("#");
    	}
    }
    
    int main() 
    {
        char inhalt[]="Im Schatten des Hauses, in der Sonne des Flußufers Booten, im Schatten des Salwaldes, im Schatten des Feigenbaumes wuchs Siddhartha auf, der schöne Brahmanen, der junge Falke, zusammen mit seinem Freunde, dem Brahmanensohn. Sonne bräunte seine lichten Schultern am Flußufer, beim Bade, bei den heiligen Waschungen, bei den heiligen Opfern. Schatten floß in seine schwarzen Augen im Mangohain, bei den Knabenspielen, beim Gesang der Mutter, bei den heiligen Opfern, bei den Lehren seines Vaters, des Gelehrten, beim Gespräch der Weisen. Lange schon nahm Siddhartha am Gespräch der Weisen teil, übte sich mit Govinda im Redekampf, übte sich mit Govinda in der Kunst der Betrachtung, im Dienst der Versenkung.  Schon verstand er, lautlos das Om zu sprechen, das Wort der Worte, es lautlos in sich hinein zu sprechen mit dem Einhauch, es lautlos aus sich heraus zu sprechen mit dem Aushauch, mit gesammelter Seele, die Stirn umgeben--vom Glanz des klardenkenden Geistes.  Schon verstand er, im Innern seines Wesens Atman zu wissen, unzerstörbar, eins mit dem Weltall.";
        int anz_buchstaben[26];
    	int wortl[100];
    	int i,j, buchstaben_maximum = 0;
    
        for(i=0; i<26; i++)
        {
        	anz_buchstaben[i] = 0;
    
        	for(j=0; inhalt[j] != '\0'; j++)
        	{
        		if(inhalt[j] == 'a' + i || inhalt[j] == 'A' + i)
        			anz_buchstaben[i]++;
        	}
    
    		if(anz_buchstaben[i] > buchstaben_maximum) 
    		{
    			buchstaben_maximum = anz_buchstaben[i];
    		}
        }
    
    	for(i=0; i<100; i++)
    	{
    		wortl[i]=0;
    
    		for(j=0; inhalt[j] != '\0'; j++)
    		{
    			if(((inhalt[j] >= 'a' && inhalt[j] <= 'z') && (inhalt[j] >= 'A' && inhalt[j] <= 'Z')) && inhalt[j+i+1] == ' ')
    			{
    				wortl[i]++;
    			}
    		}
    	}
    
        printf("Inhalt:\n%s\n\n", inhalt);
    
        for(i=0; i<26; i++)
    	{
        	printf("%c: %3d ", 'a' + i, anz_buchstaben[i]);
    
    		if(buchstaben_maximum>60)
    		{
    			relativ(anz_buchstaben[i], buchstaben_maximum);
    		}
    		else
    		{
    			balken(anz_buchstaben[i]);			
    		}
    
    		printf("\n");
    	}
    
    		printf("\n");
    
    	for(i=0; i<100; i++)
    	{
    		printf("%3d: %d\n", i+1, wortl[i]);
    	}
    
        return 0;
    }
    


  • bin grad nicht in der stimmung, deinen code breitzutreten, deswegen gibts von mir erstmal nur hilfe zur selbsthilfe.
    wenn mein film zu ende ist, seh ich nochmal vorbei.

    reduziere das programm auf eine funktionsfaehige version.
    dann fuege langsam funktionalitaet hinzu und vergewissere dich immer, dass sich das programm noch wie erwartet verhaelt.



  • tras schrieb:

    nur leider funktioniert das nicht so wie ich es gedacht habe.

    Wie hast du dir das gedacht ?
    Kurt



  • zeile 58 wird nie ausgefuehrt:

    if(((inhalt[j] >= 'a' && inhalt[j] <= 'z') && (inhalt[j] >= 'A' && inhalt[j] <= 'Z')) && inhalt[j+i+1] == ' ')
    {
        wortl[i]++; // das war bei mir zeile 58
    }
    

    ueberleg mal, wieso.

    ausserdem motzt mein compiler, dass...
    - wichtiger: es "int main(void)" heissen soll
    - eher unwichtiger: der "char inhalt" in main() groesser ist, als vom standard zugesichert



  • c.rackwitz schrieb:

    zeile 58 wird nie ausgefuehrt:

    if(((inhalt[j] >= 'a' && inhalt[j] <= 'z') && (inhalt[j] >= 'A' && inhalt[j] <= 'Z')) && inhalt[j+i+1] == ' ')
    {
        wortl[i]++; // das war bei mir zeile 58
    }
    

    ueberleg mal, wieso.

    ausserdem motzt mein compiler, dass...
    - wichtiger: es "int main(void)" heissen soll
    - eher unwichtiger: der "char inhalt" in main() groesser ist, als vom standard zugesichert

    if(((inhalt[j] >= 'a' && inhalt[j] <= 'z') || (inhalt[j] >= 'A' && inhalt[j] <= 'Z')) && inhalt[j+i+1] == ' ')
    {
        wortl[i]++;
    }
    

    sollte ein oder sein und kein und. deshalb wurde zeile 58 nie ausgeführt. hab das schon ausgebessert nur hier die falsche version gepostet. also das programm läuft nur eben das bestimmen der wortlänge klappt nicht. hab mir das so gedacht dass wenn 1 buchstabe eingelesen wird und das nachfolgende element im array ein leerzeichen ist. dann wird zähler für wörter mit 1 buchstaben um 1 erhöht. beim nächsten durchlauf wenn das übernächste element ein leerzeichen dann counter für wörter mit 2 buchstaebn erhöht usw. bis für wörter mit 100 buchstaben. nur klappt das nicht so wie ich das implementiert hab



  • Ich würd das so machen.
    erstmal brauchst du eine schleife über den ganzen text.
    wenn das momentane zeichen kein ' ' oder '\n' oder '\t' ist dann erhöhst du einen buchstaben-zähler. wenns eines dieser zeichen ist dann erhöhst du den zugehörigen wort-zähler und setzt den buchstaben-zähler wieder zurück
    Kurt


Anmelden zum Antworten