LordTerra Geschrieben 27. August 2007 Geschrieben 27. August 2007 #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 Zitieren
Bläk Geschrieben 27. August 2007 Geschrieben 27. August 2007 kann ich mal deinen quell text sehen du scheinst ein paar schreib fehler gemacht zu haben Zitieren
Guybrush Threepwood Geschrieben 27. August 2007 Geschrieben 27. August 2007 Der "geht" garantiert nicht weil da unkontrolliert im Speicher rumgeschrieben wird und außerdem auch nicht das Aufgabenziel erreicht wird. Zitieren
LordTerra Geschrieben 27. August 2007 Geschrieben 27. August 2007 also ich hab hier nen lauffähiges programm ... und da wird nix unkontroliert geschrieben ,... ich beleg in dem fall sogar mehr speicher als benötigt... aber es sollte ja net dynamisch werden Zitieren
Guybrush Threepwood Geschrieben 27. August 2007 Geschrieben 27. August 2007 So? Wo reservierst du den Speicher für Wort? Zitieren
LordTerra Geschrieben 27. August 2007 Geschrieben 27. August 2007 #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... Zitieren
Psycho~zicke Geschrieben 27. August 2007 Autor Geschrieben 27. August 2007 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]; } } Zitieren
Klotzkopp Geschrieben 27. August 2007 Geschrieben 27. August 2007 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. Zitieren
Bläk Geschrieben 27. August 2007 Geschrieben 27. August 2007 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 Zitieren
Guybrush Threepwood Geschrieben 27. August 2007 Geschrieben 27. August 2007 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 Das wage ich doch ganz stark zu bezweifeln wenn ich mir den Thread zu durchlese Zitieren
pit030771 Geschrieben 27. August 2007 Geschrieben 27. August 2007 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ß Zitieren
Guybrush Threepwood Geschrieben 28. August 2007 Geschrieben 28. August 2007 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); Zitieren
LordTerra Geschrieben 28. August 2007 Geschrieben 28. August 2007 \n als 2 zeichen hatrte ich auch vermutet ... Zitieren
Bläk Geschrieben 28. August 2007 Geschrieben 28. August 2007 '\n' is nur 1 zeichen erntweder die zicke hat aufgegeben oder gekündigt ^^ wenn nicht kannste dir ja mal melden @psycho~zicke Zitieren
LordTerra Geschrieben 28. August 2007 Geschrieben 28. August 2007 mein ich doch ... vertippt Zitieren
Psycho~zicke Geschrieben 28. August 2007 Autor Geschrieben 28. August 2007 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 Zitieren
pit030771 Geschrieben 28. August 2007 Geschrieben 28. August 2007 oh da hab ich wohl falsch entsinnt. :-) das mit dem zeichenweise erscheint mir aber am naheliegensden. naja ist ja auch geschmacksache. Zitieren
need-some-blood Geschrieben 29. August 2007 Geschrieben 29. August 2007 Ö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 Zitieren
Psycho~zicke Geschrieben 30. August 2007 Autor Geschrieben 30. August 2007 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. } Zitieren
Klotzkopp Geschrieben 30. August 2007 Geschrieben 30. August 2007 Ich habe mir mal erlaubt, Code-Tags einzufügen, damit die Einrückung des Codes nicht verlorengeht. Zitieren
Klotzkopp Geschrieben 30. August 2007 Geschrieben 30. August 2007 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. Zitieren
Klotzkopp Geschrieben 30. August 2007 Geschrieben 30. August 2007 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 Zitieren
Guybrush Threepwood Geschrieben 30. August 2007 Geschrieben 30. August 2007 Also ich denke wenn man plattformunabhängig bleiben möchte bekommt man das nicht viel besser hin. PS: return 0 fehlt am Ende Zitieren
Bläk Geschrieben 30. August 2007 Geschrieben 30. August 2007 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) Zitieren
Guybrush Threepwood Geschrieben 30. August 2007 Geschrieben 30. August 2007 Sag mal Bläk kennst du eigentlich ctx? Zitieren
Empfohlene Beiträge
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.