Heftiges Programm?
-
oh, hab ich garnicht bemert! danke für den tipp, habs mal geändert.
wie benutze ich denn jetzt fprinf um n[i] in sie zu schreiben?ich habe mir gedacht, dass es evtl. auch einfach nur daran liegen kann, dass ich ja einen eindimensionalen array genommen habe. bei dem steht ja alles hintereinender... wenn ihc jetzt aber einen mehrdimensionalen benutzen würde, der 1 spalte, aber 13 zeilen hat, müsste das doch klappen, oder?
*edit*
habe das gerade mal ausprobiert, bringt aber garnix. ich denke mal, dass ich dann wohl doch auf fprintf zurückgreifen muss.
aso, hier mal ein screenshot von dem, was in meiner datei gespeichert wird:[img] http://www.bilder-hochladen.net/files/6ue-q.jpg [/img]
das sollten eigentlich zahlen sein ?!?
-
-
ok, ich habe es mittlerweile geschafft, dass ich in der datei "noten.dat" richtige zahlen speichere. allerdings stehen die immernoch in einer zeile und haben anstatt leerzeilen ein kästchen dazwischen. Ich habe mittlerweile festgestellt, dass das kästchen für mein "\n" gebildet wird. nur, wenn ihc in eine neue Zeile gehen will, wie kann ich das denn sonst machen, ausser mit \n ????
for ( i=0; i<12;i++) { fprintf(save, "%i\n", n[i][1]); }
desweiteren werden meine Werte jetzt nichtmehr eingelesen? ich denke, dass ich auch dafür den befehl dann verändern muss, oder?
*EDIT*
habe den 2. Teil schon gelöst, bleibt nurnoch die Farge nach den Zeilen
-
probier mal \r\n oder oeffne die datei als "r" statt "rb"
-
SUper, danke!!! mit \r\n klappt alles. aber, wofür steht da das \r ? im internet finde ich nix dazu ?!
-
\r\n auch bekannt als CR-LF steht fuer carriage return, line feed.
unix-gebraeuchlich reicht ein \n fuer das was du willst.
richtiger ist aber \r\n, weil ein \n eigentlich nur in die naechste zeile springt, aber der cursor nicht wieder an den anfang geht. kannst du bei ner telnet session beobachten/ausprobieren, wenn du dir schon mal sockets angeguckt hast.dein notepad (nimm einen anderen editor oder gleich hex editor bitte) versteht \n allein nicht und zeigt dreck an.
-
ah, ok, dann ist das natürlich einleuchtend, warum das so nicht klappen wollte. hat zwar ne neue zeile gemacht, aber trotzdem in der alten weitergeschrieben.
Vielen, vielen Dank, du hast mir wirklich super geholfen!!!!!!
Jetzt muss ich das programm erstmal koomplett durcharbeiten und verdauen, aber ich denke, für nen totalen einsteiger ist das doch schon ganz guthier nochmal der komplette code, falls sich irgendwer für interessiert
#include <stdio.h> int i,e,a; int n[13]; void speichern(void) { FILE *save = fopen("noten.dat","w+b"); if( !save ){ fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n"); return; } for (i=0; i<=13; i++) { fprintf(save, "%i\r\n", n[i]); } fclose(save); } void ausgabe(void) { FILE *output = fopen("noten.dat","r+b"); if( NULL == output ) { fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n"); } for (i=0; i<=13; i++) { fscanf(output,"%i ",&n[i]); } /*for(i = 0; i <= 13; ++i) { printf("%.1f..: %i\n", 1.0 + i/3.0, n[i][1]); //bei interesse einfach wieder eingliedern... }*/ printf("\n\nHistogramm:\n\n"); printf("|"); for (i=0; i<=13; i++) { if (n[i]>=20) printf(" %i",n[i]); else printf(" "); } printf("\n"); for (a=19; a!= 0; --a) { printf("|"); for (i=0; i<=13 ; i++) { if (n[i]>=a) printf(" *"); else printf(" "); } printf("\n"); } printf("|--+--+--+--+--+--+--+--+--+--+--+--+--+\n"); printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12\n\n\n"); fclose(output); } void eingabe(void) { for(i = 0; i < 13; ++i) do { printf("%.1f..:" , 1.0 + i/3.0); scanf("%i", &e); n[i] = e; } while (i>=13); printf("\n Eingabe gespeichert! \n\n"); speichern(); } int main (void) { int wahl; do { printf("Was wollen sie machen:\n\n"); printf("-1- Neue Datensaetze eingeben\n"); printf("-2- Datensaetze im Histogramm ausgeben\n"); printf("-3- Programm beenden\n\n"); printf("Wahl: "); do { scanf("%d", &wahl); } while(getchar() != '\n'); switch(wahl) { case 1 : eingabe(); break; case 2 : ausgabe(); break; case 3 : printf("...Programm wird beendet\n"); break; default: printf(">> %d << ???\n",wahl); } }while(wahl != 3); return 0; }
-
int i, a, e; // würd ich nicht global lassen // ... void ausgabe(void) { FILE *output = fopen( "noten.dat", "r+b" ); if( !output ) { fprintf( stderr, "Kann \"noten.dat\" nicht öffnen!\n" ); // hier würd' ich and einer statt abbrechen: return; }
So, jetzt musst dir nur noch einen eindeutigen Bracing-Style zulegen, richtig "intenden" und schon hast du fertig. Meine Gratulation
Greetz, Swordfish
-
Swordfish schrieb:
So, jetzt musst dir nur noch einen eindeutigen Bracing-Style zulegen, richtig "intenden" und schon hast du fertig. Meine Gratulation
Greetz, Swordfish
lol, bitte was? o.O
ok, das mit dem return ist keine schlechte idee, muss ich wohl einfach vergessen haben ?. aber was bedeutet das andere?!?
-
Bracing-Style: Du sollst dir einen Stil zulegen, wie du die geschweiften Klammern anordnest, und den konsequent durchziehen.
Indentation: Zu deutsch Einrückung.
Beides ist bei dir noch Kraut und Rüben
-
aaah! ok, ja, das feintuning wollte ich eh noch machen, hab ja noch fast 4 wochen Zeit mit der abgabe, lol
mal gucken, wenn ich's überarbeitet habe, poste ich's nochmal, dann könnt ihr mir mal sagen, was ihr davon haltet . thxthxthx!!!
-
so, mal gucken, ob ich jetzt richtig "intended" hab ^^
#include <stdio.h> //Standard-Input-Output Funktion int i,e,a; //Dekalrieren der Variablen int n[13]; //Deklariern des Eindimensionalen Arrays fuer die Noten int wahl; //Deklarieren der Variablen "Wahl" void speichern(void) //Unterfunktion Speichern { FILE *save = fopen("noten.dat","w+b"); //Datei "noten.dat" oeffnen und ueberschreiben if( !save ) //wenn dies nicht möglich ist { fprintf(stderr,"Kann \"noten.dat\" nicht oeffnen!\n"); //gebe dies aus return; //und gehe wieder zum anfang zurueck } for (i=0; i<=13; i++) //ansonsten nehme i und arbeite damit den array durch { //i steht fuer je eine Zahl im array fprintf(save, "%i\r\n", n[i]); //und schreibe das zeilenweise in die datei } fclose(save); //schliesse Datei } void ausgabe(void) //Unterfunktion Ausgabe { FILE *output = fopen("noten.dat","r+b"); //oeffne Datei "noten.dat" mit leseberechtigung if ( NULL == output ) //falls nicht vorhanden { fprintf(stderr,"Kann \"noten.dat\" nicht oeffnen!\n"); //gebe das aus return; //und gehe zum anfang zurueck } for (i=0; i<=13; i++) { fscanf(output,"%i ",&n[i]); //lese die zahlen aus der datei zeilenweise } //und ordne sie in das array ein printf("\n\nHistogramm:\n\n"); //gebe die ueberschrift aus printf("|"); //und dann in der ersten zeile Zeile: for (i=0; i<=13; i++) //ueberpruefe jede zahl, ob diese groesser oder { //gleich 20 ist und gebe dann entweder die komplette if (n[i]>=20) //Zahl printf(" %i",n[i]); else printf(" "); //oder eine Leerzeile aus } printf("\n"); //wechsele in die naechste zeile for (a=19; a!= 0; --a) //beginne un in der 19. Zeile und arbeite dich nach unten { printf("|"); //jeweils am anfang ein | for (i=0; i<=13 ; i++) //arbeite den array durch { if (n[i]>=a) //und gebe wenn benoetigt ein sternchen printf(" *"); else printf(" "); //oder eine leerzeile aus } printf("\n"); //und wechsele dann in die naechste Zeile } printf("|--+--+--+--+--+--+--+--+--+--+--+--+--+\n"); //x-Achse des Histogramms printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12\n\n\n"); //und die Beschriftung fclose(output); //Schliesse nun die Datei wieder } void eingabe(void) //Unterfunktion Eingabe { for(i = 0; i < 13; ++i) //arbeite dich wieder durch das array do { printf("%.1f..:" , 1.0 + i/3.0); //Beginne bei Note 1.0 und addiere immer i/3.0 scanf("%i", &e); //lese Die Zahl ein n[i] = e; //und fuege sie dem array zu } while (i>=13); //solange bis i>=13 ist printf("\n Eingabe gespeichert! \n\n"); //Gebe aus: speichern(); //fuehre nun die speichern-Funktion durch } int main (void) //Hauptmenue { do { printf("Was wollen sie machen:\n\n"); // ausgabe des Hauptmenues printf("-1- Neue Datensaetze eingeben\n"); printf("-2- Datensaetze im Histogramm ausgeben\n"); printf("-3- Programm beenden\n\n"); printf("Wahl: "); //ausgabe der eingabeaufforderung do { scanf("%d", &wahl); //lese die Eingabe ein und } //ordne sie der Variablen "wahl" zu while(getchar() != '\n'); //bis zum letzten eingabeteil switch(wahl) //"wahl-Funktion" { case 1 : eingabe(); //Bei 1 fuehre Funktion "eingabe" aus break; case 2 : ausgabe(); //Bei 2 fuehre Funktion "ausgabe" durch break; case 3 : printf("...Programm wird beendet\n"); //bei 3 gebe aus, dass das programm beendet wird break; default: printf(">> %d << ???\n",wahl); //bei fehleingabe gebe dies aus } } while(wahl != 3); //solange wahl ungleich 3 ist return 0; //ruecklieferungswert }
-
abgesehen von meiner persoenlichen abneigung zu diesem stil hast du eine inkonsistenz drin, naemlich beim for-loop nach dem printf("|").
ein array[13] geht von [0] bis [12]. du benutzt aber [13]...
-
Jaaaaa! Sieht nett aus
Bracing Styles, just FYI:
- Kernighan & Ritchie Style
AKA: 1TBS (One True Brace Style), Kernel Style
Tab-Size: C: 8, C++/Java: 4if( condition ) { code( ); }
- Allman Style
AKA: BSD Style
benannt nach Eric Allman, einem Berkeley-Hacker der viele BSD Utilities damit geschrieben hat.
Tab-Size: C: 8, C++/Java: 4 oder 3if( condition ) { code( ); }
- Whitesmiths Style
Bekanntgeworden durch Beispiele, welche dem Whitesmiths C - Compiler beilagen.
Tab-Size: 8, selten 4if( condition ) { code( ); }
- GNU Style
Benutzt im GNU EMACS und in der FSF (Free Software Foundation) und nirgendwo anders.
Tab-Size: 4if( condition ) { code( ); }
Die am meisten benutzten sind wohl Allan und Whitesmiths.
Greetz, Swordfish
-
http://en.wikipedia.org/wiki/One_True_Brace_Style
ich wuerde whitesmith nicht als "oftbenutzt" bezeichnen. seh den kaum in der wildnis. ich find den aber auch nicht zumutbar.
ich seh aber sehr oft allman unter den C-lern und k&r unter den PHPlern.
-
ich finde den k+r style absolut ätzend
immer wenn ich fremden code sehe, der so geschrieben ist, muss ich den umformatieren. sonst blicke ich da nicht durch...
-
@c.crackwitz: ich seh' bei PHP'lern oft _garkeinen_ Stil
@net: was findest du an k&r so ätzend!? Aber, moment mal, das würd ja heißen du blickst bei meimem Code nicht durch... :pGreetz, Swordfish