Präprozessor in eine Variable umbauen, Programm tuts nicht mehr
-
Wutz schrieb:
Üblicherweise verwendet man Grossbuchstaben für Konstanten oder #define wie im Beispiel. Wenn diese auch noch variabel sein soll, wie du jetzt offenbarst, dann muss für C89, wo Arraydefinition nur für konstante Größen definiert ist, auch l dynamisch definiert werden, z.B. mittels
int *l=calloc(imaxw,sizeof(int)); /* sollte vor Ende auch wieder freigegeben werden */
Verwirr ihn doch nicht entgültig.
Da er sein gepostetes Programm offensichtlich bis zur Ausführung gebracht hat, dürfen wir, denke ich, davon ausgehen, dass er einen C99-Compiler einsetzt.
-
Leideer nicht,
ich benütze den Compiler Cygwin_4.x.
Was aber dennoch funktioniert ^^
-
Programmiersprache C...bevor noch irgendwelche Missverständnisse aufkommen^^
-
Der dürfte aber schon C99 unterstützen, sonst hätte dein Programm nicht übersetzt werden können. Aber egal...
Ich habe deinen Code mal notdürftig umgestrickt, damit du wenigstens wieder was Funktionierendes hast. Schön ist der Code deshalb noch lange nicht. Nutze bitte mal die Suchfunktion des Forums und suche nach "Eingabepuffer leeren", dann findest du sicher eine (standardkonforme) Alternative für fflush(stdin), die auch funktioniert.
#include <cmath> #include <cstring> #include <cstdio> #include <cstdlib> void wlist(char *s, int *l, int maxW) { char *t; for (t = strtok(s, " ?!.,\n"); t; t = strtok(0, " .,\n")) if (*t && strlen(t) <= maxW) l[strlen(t) - 1]++; } int main() { char strtmp[10]; char x[256]; int i, weiter = 1, lauf = 0; int maxW; printf("\nWas soll die Maximale Wortlaenge sein?\n"); scanf("%i\0\n", &maxW); fflush(stdin); int *l=calloc(maxW,sizeof(int)); //dynamisch Speicher per calloc alloziert //bei dir dürfte alternativ auch das hier funktionieren: //int l[maxW]; printf("Schreiben Sie ihren Text: \n"); fgets(x,sizeof x,stdin); //Eingabe des zu bearbeitenden Textes wlist(x, l, maxW); printf("\nHistogramm der Wortlaenge eines Textes\n" "----------------------------------------------------------------------------\n"); for (i = 0; i < maxW; ++i) printf("%3d", i + 1); puts(""); while (weiter) { ++lauf; weiter = 0; for (i = 0; i < maxW; ++i) printf(" %c", l[i] && l[i] >= lauf ? '*' : ' '), weiter = !weiter ? l[i] > lauf : weiter; puts(""); } printf("\n----------------------------------------------------------------------------\n"); for (i = 0; i < maxW; ++i) printf("%3s", l[i] > 7 ? (sprintf(strtmp,"%d",l[i]),strtmp) : ""); printf("\n"); return 0; }
-
Bei deinem Code wird die Texteingabe übersprungen,
da "scanf" das \n an "fgets" übergiebt, weshalb ich das "getchar()"
nach "scanf" hatte
-
Phenny schrieb:
Bei deinem Code wird die Texteingabe übersprungen,
da "scanf" das \n an "fgets" übergiebt, weshalb ich das "getchar()"
nach "scanf" hatteBei mir nicht. Bei mir funktioniert ja auch fflush(stdin) (MS-Compiler). Bei dir offensichtlich nicht. Das Ziel der Zeile ist es ja, den Eingabepuffer zu leeren. Wenn bei dir was übrig bleibt, wurde dieses Ziel nicht erreicht. Ein Grund mehr, endlich auf mich zu hören, und das mal durch was Vernünftiges zu ersetzen.
-
Du Schlingel^^
"clearbuff()" jaja, du hast mir die Brotkrümel sozusagen gelegt^^Ja, nun ist mein letzes Problem eigentlich die Wörter, die
Länger sind als "maxW" ganz hinten als Zahl darzustellen,
also genau wie die einzelnen Wörter bearbeitet werden, so müssen auch
diese bearbeitet werden die zulang sind. Sprich also die Wörter die
größer sind als maxW werden dann ganz hinten unter
"sagen wir mal maxW = 10"----------------------------------------------------- 1 2 3 4 5 6 7 8 9 10 * * * * * * * * * * * * * * * * * * --------------------------------------------------------
ungefähr halt so, ich denke ich kann
printf("\nHistogramm der Wortlaenge eines Textes\n" "----------------------------------------------------------------------------%i\n", maxW);
machen, aber wie krieg ich bloß die sterne da so nach hinten?
-
Na du kannst doch zählen, und du weißt doch, wieviele Zeichen in der Breite du zur Verfügung hast. Wo ist jetzt die Schwierigkeit, entsprechend viele Spaces zu drucken?
Hast du eigentlich schon mal gesehen, wie deine Ausgabe aussieht, wenn du für maxW 40 eingibst? Wer auch immer das Programm geschrieben hat, wird sich beim ursprünglichen Wert schon was gedacht haben...
-
1. Das Programm habe ich mithilfe eines Freundes erstellt
und 2. Das Programm ist auch nicht dafür ausgelegt "zuulange Wörter" aufzugreifen,
weshalb es den Bereich mit maxW gibt ^^Dennoch kann ich nicht einfach Leerzeichen einfügen, da ich doch sonst auch die anderen
Sternchen verschieben würde.
-
So etwas wie "was ist wenn jemand mal was anderes macht als vorhergesehen ist"
sind dann letzte Feinheiten wie:printf("Was soll die maximale Wortlaenge sein? (Darf nicht länger als 25 sein)");
mit eingebautem "switch" mit "default" bereich wären das wie gesagt nur
letzte Verfeinerungen. Dennoch muss ja das Programm ersteinmal so laufen,
das kein "neugieriger Freidenker" irgendeinen Unsinn eingibt ^^
-
Phenny schrieb:
So etwas wie "was ist wenn jemand mal was anderes macht als vorhergesehen ist"
sind dann letzte Feinheiten wie:printf("Was soll die maximale Wortlaenge sein? (Darf nicht länger als 25 sein)");
mit eingebautem "switch" mit "default" bereich wären das wie gesagt nur
letzte Verfeinerungen. Dennoch muss ja das Programm ersteinmal so laufen,
das kein "neugieriger Freidenker" irgendeinen Unsinn eingibt ^^Hehe, gut, ist akzeptiert (auch wenn dir ein solches Vorgehen bei größeren Projekten Probleme bereiten könnte).
Zum Problem: du druckst doch zeilenweise. Du musst einfach den Sonderfall "Häufigkeiten von Wörten >=maxW" in jeder Zeile behandeln. Zur Not musst du deinen Code halt ein wenig umstricken, aber sowas ist problemlos möglich. Vielleicht hilft es vom Verständnis her, wenn du deine Ausgaberoutine mal schrittweise mit dem Debugger durchgehst. Vielleicht findest du dann eher den Punkt, an dem du ansetzen musst.
Habe bitte Verständnis, dass ich dir nicht alles bis ins Einzelne vorkauen will. Das bringt ja für dich nichts (der Lerneffekt läuft dann gegen Null). Das ist genauso wie die Sache mit dem Eingabepuffer, da kannst du auch ganz einfach - sogar direkt hier im Forum - die Lösung finden.