Zum Inhalt springen

Zeichen zählen und ein Histogramm erstellen.


Psycho~zicke

Empfohlene Beiträge


#include <stdio.h>

#include <stdlib.h>


int main(void) {

	char *wort; 

	int liste[100]; 

	int i=0;

	int ende=0;


	for(i=0;i<100;i++) {

		liste[i]=0; 

	}

	i=0;

	while(ende==0){

// habs auf 5 eingaben beschränkt... zum testen

		if(i>4){ 

			ende=1; 

		}else{

			fgets(wort,25,stdin); 

			printf("eingabe: %s\n",wort);

			if(liste[i]==0){

// -1 weil der das enter als zeichen mitzählt (also nehm ich an)

				liste[i]=strlen(wort)-1;

				i++;

			}else{

				i++;

			}

		}

	}


	for(i=0;i<100;i++) {

		if(liste[i]==0){break;}

		printf("liste: %d\n",liste[i]);

	}

}

^^ der geht

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Antworten 51
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema


#include <stdio.h>

#include <stdlib.h>


int main(void) {

	char wort[25]; 

	int liste[100]; 

	int i=0;

	int ende=0;


	for(i=0;i<100;i++) {

		liste[i]=0; 

	}

	i=0;

	while(ende==0){

// habs auf 5 eingaben beschränkt... zum testen

		if(i>4){ 

			ende=1; 

		}else{

			fgets(wort,25,stdin); 

			printf("eingabe: %s\n",wort);

			if(liste[i]==0){

// -1 weil der das enter als zeichen mitzählt (also nehm ich an)

				liste[i]=strlen(wort)-1;

				i++;

			}else{

				i++;

			}

		}

	}


	for(i=0;i<100;i++) {

		if(liste[i]==0){break;}

		printf("liste: %d\n",liste[i]);

	}

}

dann halt so ... was mich wundert is dann nur das er bei 25 zeichen nur 23 erkennt... also ka an was das liegt...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich hab mal wieder bissel im INet rumgeschaut un hab mir da nen anfang zusammen gebastelt ich hoff ja ma das er nun so einigermassen stimmt. Wäre lieb wenn ihr ma drüber schauen könntet. Dacht mir bevor ich da nun weiter bastel un es jetzt schon falsch is frag ich lieber ma nach.

#include <stdio.h>

#define IN 1

#define OUT 0

#define Maxhist 15

#define Maxword 11

void main()

{

int iEingabe, iEingabe2, nc, state;

int langeb;

int maxvalue;

int uberlaufe;

int wl[Maxword];

state = OUT;

nc = 0;

uberlaufe = 0;

while (getchar() != 'A')

{

if (iEingabe == ' ' || iEingabe == '\n' || iEingabe == '\t')

{

state = OUT;

}

if (iEingabe2 = 0; iEingabe2 < Maxword; ++iEingabe2)

{

wl[iEingabe2]=0;

}

if (nc >0 && nc < Maxword)

{

++wl[nc];

}

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

if (iEingabe == ' ' || iEingabe == '\n' || iEingabe == '\t')
iEingabe wird nirgends etwas zugewiesen. Daher ist es sinnlos, den Inhalt zu prüfen.

if (iEingabe2 = 0; iEingabe2 < Maxword; ++iEingabe2)

Sollte das mal eine for-Schleife werden?

Ich glaube, es bringt gar nichts, wenn du dir irgendwelche Sachen irgendwoher kopierst und dann daran rumfrickelst. Programmieren bedeutet nicht "Basteln bis es passt". So kommst du auf keinen grünen Zweig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

23/25

ich rate mal [25] -> 0..24 -1 '\n' = 23 +0

zu dir zicke ^^

welche aufgabe soll dein wuell texteigentlich erfüllen

ausserdem is der überhaupt windows kompatibel scheint aus nem linux board zu sein spekulier ich jetzt mal // aber egal

wenn du dem ganzen geposte aufmerksam gefolgt bist müsstest du jetzt ohne weiteres eine lösung für dein problem zusammen kopieren können

andern falls würd ich an deiner stell von dem ausgehen was du bereits kennst also die einfachen funktionen und nochmal anfangen ohne im internet sachen zu kopiern die dir noch verschlossen sind

geh rückwärts statt vorwärts

realisiere die eigentliche aufgabe (die ich am anfang selber nicht so richtig verstanden hab)

dann bilde die teilprozesse (also die eigentlichen arbeitsschritte)

zB: (auf die lösung bezogen die im grunde genommen schon fertig ist)

die eingabe eines wortes // könnte eine ganz einfache funktion sein ^^

auswerten der daten // also prüfen der wortlänge

speichern der information // die anzahl der buschstaben ausgeben

ausgabe des ergebnis // die liste ausgeben

und dann überleg ob die einteilung der arbeitsschritte so funktioniert

und dann wie du die einzelnen teile umsetzen kannst

aber nur mit den mitteln die du schon kennst und deren aufgabe du verstehst

Link zu diesem Kommentar
Auf anderen Seiten teilen

hi,

kan man das mit fgets oder scanf machen? geht bestimmt, aber dann muss ich doch den string untersuchen ob kein whitespace drin ist oder?

diese funktionen lesen doch beide bis zu einem \n wenn ich mich recht entsinne.

mein ansatz wäre zeichenweise einlesen

dabei die buchstaben(eingabe) mitzählen solange bis ein lerrzeichen ein return oder tab oder ähnliches(also was ein wort unterbricht) eingegeben wird.

und dann so in dem int array speichern wie klotkopp es schon sagte

nur ne idee...

gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

fgets liest bis zum ersten Zeilenumbruch ein, scanf bis zum ersten Leerzeichen.

Damit aber nicht mehr eingelesen wird wie in das Array passt sollte man auch hier die Länge begrenzen. Also anstatt


char szString[512];
scanf("%s",szString);
[/PHP]

so

[PHP]
char szString[512];
scanf("%511s",szString);

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo jungs!

ich hab weder aufgegeben noch gekündigt ;) lieg nur leider flach und mein inet zuhause ist heut irgendwie auch nicht wirklich begeistert vom funktionieren.

Bin ab morgen wieder auf der arbeit und werde noch einma versuchen diese doofe Aufgabe zu lösen.

Aber wie heißt es so schön, aller Anfang ist schwer.

Aber ich danke euch trotzdem sehr für eure hilfe!!!

Liebe grüße

die Zicke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Öhm, also als ich damals mit dem Programmieren angefangen habe, MUSSTE ich zur jeder Aufgabe ein Struktogramm erstellen. Wenigstens nen Pseudocode. Ich denke das sollte hier der erste Schritt sein. Denn so leid es mir tut, aber ich werde das Gefühl nicht los, das die Psycho~zicke gar nicht weiß wie sie das Problem angreifen soll. Wenn das klar ist, dann kann sie anfangen mal über die einzelnen Befehle nachzudenken. Also Psycho~zicke versuche doch bitte mal unabhängig von irgendwelchen Befehlen mit deinen Worten zu beschreiben wie du das Problem lösen würdest.

MVG

need-some-blood

PS:

Hier elementare Grundlagen

Nassi-Shneiderman-Diagramm - Wikipedia

Da auch

Pseudocode - Wikipedia

und der sowieso

Programmablaufplan - Wikipedia

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich hab das Programm jetzt mal so geschrieben. Es ist zwar nicht als Histogramm aber das kann man ja noch mal ändern. Leider gibt es mir die längen der Wörter immernoch nicht aus. Evt sieht ja jemand von euch den fehler.

Liebe grüße

die Zicke


#include <stdio.h>


#define Maxword 11

#define IN 1

#define OUT 0


void main()

{  

    // deklaration der Variablen

    int iEingabe, iEingabe2, nc, state;

    int langeb; 

    int maxvalue;

    int uberlaufe; 

    int wortl[Maxword];  


    // Zuordnung der Werte

    iEingabe = 0;

    state = OUT;    

    nc = 0;     // die Anzahl der Zeichen in einem Wort

    uberlaufe = 0;  // Anzahl der Wörter die länger sind als Maxword vorgibt


    // Wird solange ausgeführt bis (iEingabe = getchar () != 'A') zutrifft.

    while ((iEingabe = getchar()) != 'A')

    // Wenn iEingabe ein ' ' oder ein \n oder ein \t ist dann 

    if (iEingabe == ' ' || iEingabe == '\n' || iEingabe == '\t')

    {

      state = OUT; // beenden wir das eingebene Wort durch state = OUT. Ansonsten 

                   // geht die Schleife weiter.

    }

    /* For gibt iEingabe2 den wert 0,  dann kommt die Bedinung ( iEingabe2 < Maxword), 

    sie kontrolliert die Ausführung der Schleife, schließlich wird die Ikrementierung 

    (++iEingabe2) ausgeführt un die Bedinung der Schleife wird neu überprüft.*/

    for (iEingabe2 = 0; iEingabe2 < Maxword; ++iEingabe2)

    {

      wortl[iEingabe2] =0; // Die Wortlänge von iEingabe2 = 0

    }

    if (nc >0)  // wenn nc größer als 0 ist 

        if (nc < Maxword) // und wenn nc kleiner als Maxword ist

        {

          ++wortl[nc]; // dann schreib die Wortlänge von nc + 1 hin

        }

        else 

        {

          ++ uberlaufe; // ansonsten uberlaufe +1

          nc = 0;     // und nc = 0

        } 

        else if (state == OUT )  // wenn die oberen funktionen in frage kommen dann 

        {                        //beenden wir ein Wort und schreiben state == OUT 

         state = IN;        // wenn die oberen funktionen nicht in frage kommen dann 

         nc = 1;   // ist nc = 1

        }

        else 

        {

          ++nc;   // ansonsten +1 nc

        }

        maxvalue = 0;   // der maximale Wert der Wortlänge ist = 0

        /* For gibt iEingabe2 den wert 1,  dann kommt die Bedinung ( iEingabe2 < Maxword), 

         *  sie kontrolliert die Ausführung der Schleife, schließlich wird die Ikrementierung 

         *(++iEingabe2) ausgeführt un die Bedinung der Schleife wird neu überprüft.*/

        for (iEingabe2 = 1; iEingabe2 < Maxword; ++iEingabe2)

          if (wortl[iEingabe2] > maxvalue) // Wenn die Wortlänge von iEingabe2 größer ist wie 

                                        // der maximale Wert der Wortlänge (maxvalue)

          maxvalue = wortl[iEingabe2];     // dann ist der maximale Wert der Wortlänge(macvalue) gleich der 

                                        // Wortlänge von iEingabe2

         /* For gibt iEingabe2 den wert 1,  dann kommt die Bedinung ( iEingabe2 < Maxword), 

         *  sie kontrolliert die Ausführung der Schleife, schließlich wird die Ikrementierung 

         *(++iEingabe2) ausgeführt un die Bedinung der Schleife wird neu überprüft.*/

        for (iEingabe2 = 1;iEingabe2 < Maxword; ++iEingabe2)

        {

          // trifft die For schleife zu wird prinf ausgeführt.

          printf ("%5d - %5d: " , iEingabe2, wortl[iEingabe2]);

        }

        if (wortl[iEingabe2] > 0) // Wenn die Wortlänge von iEingabe2  größer ist als 0

        {

          langeb = 1;         // dann schreibt langeb = 1 (länge des Balken)

        }

        else  

          langeb = 0;       // ansonsten ist die länge des balken = 0 

        while (langeb > 0)  //  Wenn die länge des balken größer wie 0 

        {

          putchar('*');     // dann geb ein * aus.

        }

        if (uberlaufe > 0)  // wenn überläufe größer wie 0 sind 

        // dann gib aus "das sind ?? viele wörter, newlines, überläufe und Maxword"

        printf ("Es sind %d Wörter,%d\n, %d uberlaufe, %d Maxword");

        printf ("fertig"); // Beendet das Programm.

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das sieht IMHO viel zu kompliziert aus. Deine Kommentare an den for-Schleifen machen den Code nicht gerade lesbarer. Zudem bringen sie keine Zusatzinformationen. Sie beschreiben nur genau das, was die jeweilige Schleife tut, nicht den Grund oder Zweck.

Ich picke mal eine Stelle heraus:

while (langeb > 0)  //  Wenn die länge des balken größer wie 0 
{
putchar('*'); // dann geb ein * aus.
}[/code]

Dieser Code bewirkt, dass entweder gar nichts passiert, oder unendlich viele Sternchen ausgegeben werden, denn langeb wird in dieser Schleife nie verändert. Wenn es einmal größer als 0 ist, ist das eine Endlosschleife.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin in C schon etwas eingerostet, aber ich würde das so machen:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// Maximale Wortlänge
#define MAX_WORD_LENGTH 100
// Maximale Balkenlänge
#define MAX_BAR_LENGTH 70

int main()
{
int counter[MAX_WORD_LENGTH + 1];
int max_count = 1;
int longest = 1;
int i, j;
int len = 0;

memset( counter, 0, sizeof( counter ) );

for( ; ; )
{
int c = getchar();
if( c == EOF || c == 'A' || len > MAX_WORD_LENGTH )
{
break;
}

// Auf Whitespace (Leerzeichen, Tab, Zeilenumbruch) prüfen
if( isspace( c ) )
{
// Zähler für die aktuelle Wortlänge hochzählen
++counter[len];
// Länge zurücksetzen
len = 0;
}
else
{
++len;
}
}

// Länge des längsten Wortes und größte Anzahl ermitteln
for( i=1; i <= MAX_WORD_LENGTH; ++i )
{
if( counter[i] > max_count ) max_count = counter[i];
if( counter[i] > 0 ) longest = i;
}

// Histogramm ausgeben
for( i=1; i<=longest; ++i )
{
// Balkenlänge berechnen
int bar_length = counter[i] * MAX_BAR_LENGTH / max_count;

printf( "\n%3d (%3d) ", i, counter[i] );
for( j=0; j<bar_length; ++j )
{
putchar( '*' );
}
}
}[/code]

Fragen oder Verbesserungsvorschläge sind willkommen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich find meine eingabe ****tion besser ^^


#include <stdio.h> 

#include <conio.h> 


char* LeseString(char* s) 

 { 

 int i=0; 

 do 

  { 

  s[i]=char(getch()); 

  if(s[i]>char(31)) 

   { 

   printf("%c",s[i]); 

   i++; 

   } 

   else 

    if((s[i]==char(8))&&(i>0)) 

    { 

    i--; 

    gotoxy(wherex()-1,wherey()); 

    clreol(); 

    } 

  }while(s[i]!=char(13)); 

 return s; 

 } 

--------------------------------------------------------------------

HarHaarr, ich bin auch ein Mächtiger Pirat.

Ich habe den Schwertmeister von Melee Island besiegt!

aber jetzt muss ich erstmal zum mars

(wer hat sich eigentlich den mist mit den flugcodes ausgedacht)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...