Heftiges Programm?
-
Hallo Leute!
Ich habe mal wieder die Aufgabe bekommen ein programm zu schreiben. in diesem programm sollen Klausurnoten eingelesen werden können, in einer Datei (noten.dat) gespeichert werden und dann grafisch ausgegeben werden können.
Ich habe mal angefangen zu programmieren, hänge mich aber direkt an der Sache auf, die Noten in eine Datei zu schreiben. in meinem tutorial habe ich leider keinen Befehl dafür gefunden... meine idee ist das so zu machen:[...] printf("Bitte anzahl der Noten mit dem schnitt 1.0 eingeben"); scanf("%i", anzahl ); (Schreibe noten in die 1. Zeite von datei Noten.dat) printf("Bitte anzahl der noten mit dem schnitt von 1.3 eingeben"); scanf("%i",&anzahl); (schreibe Noten in die 2. Zeite der Datei Noten.dat) [...]
ist sowas machbar?
-
Abgesehen davon das du schon in deinem oberen programm fehler hast, ist das ganze schon machbar. Schau dir dazu in der headerdatei stdio.h die befehle
fopen(),fread(),fwrite(),fclose() an.
Damit kannst du deine Daten in Dateien schreiben.PS: Bist du sicher in dem was du tust? Ich würde in jede Zeile eine Note schreiben mit dem entsprechenden Namen der Person.
//EDIT: Achja wenn das ganze dann noch grafisch sein soll, solltest du dich zuerst noch mit der WinApi auseinandersetzten.
-
nee, ist schon richtig. wir sollen die noten in 12 kategorieen einlesen
0=1.0 / 1=1.3 / 2=1.7 / ... und das soll dann grafisch ungefähr so dargestellt werden:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| *
| *
| *
--+--+--+--+--+--+--+--+--+--+--+--+--+--+
--0--1--2--3--4--5--6--7 ...jedes Sternchen steht dann eben für eine Note
davor grauts mir jetzt schon....
ok, ich guck mir die header datei mal an. thx!
-
C von A bis Z --> 18. Ein-/Ausgabe - Funktionen
-
Achja wenn das ganze dann noch grafisch sein soll, solltest du dich zuerst noch mit der WinApi auseinandersetzten.
warum das?
-
Weil Winapi Grafik hübscher aussieht als ascii art
-
so, da bin ich wieder. dank eurer tipps und einer langen suche über google hab ich ein programm zusammenbekommen. allerdings habe ich dort einen fehler drin, bei dem ich nicht weis, wie ich den auslöschen kann. und zwar werden die noten als "char" eingelesen. wenn ich sie aber als "char" einlese, dann bekomme ich die fehlermeldung :
operands of >= have illegal types 'pointer ot char' and 'int'
das wird definitiv daran liegen, dass ich eben wie gesagt mit char arbeite. wie ich das ganze prigramm jetzt auf int umstelle kapiere ich nicht so richtig.
wäre super, wenn mir das einer von euch erklären könnte!hier mein Programm:
#include <stdio.h> #include <stdlib.h> struct { char null[3]; char eins[3]; char zwei[3]; char drei[3]; char vier[3]; char fuenf[3]; char sechs[3]; char sieben[3]; char acht[3]; char neun[3]; char zehn[3]; char elf[3]; char zwoelf[3]; } noten; void speichern(void) { FILE *save =fopen("noten.dat","w+b"); if( NULL == save ){ save = fopen("noten.dat","w+b"); if( NULL == save ) { fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n"); //return 0; //EXIT_FAILURE; } } // FILE-Zeiger save auf das Ende der Datei setzen //fseek(save, 0, SEEK_END); //wir schreiben eine note ans ende von "noten.dat" if(fwrite(¬en,sizeof(noten), 1, save) != 1) { fprintf(stderr, "Fehler bei fwrite...!!!\n"); //return 0; //EXIT_SUCCESS; } //wir geben unseren FILE-Zeiger wieder frei fclose(save); } void ausgabe(void) { FILE *output = fopen("noten.dat","r+b"); if( NULL == output ) { fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n"); //return 0; //EXIT_FAILURE; } //Wir lesen alle noten aus "noten.dat" while(fread(¬en,sizeof(noten), 1, output) == 1) { printf("1.0...: %s",noten.null); printf("1.3...: %s",noten.eins); printf("1.7...: %s",noten.zwei); printf("2.0...: %s",noten.drei); printf("2.3...: %s",noten.vier); printf("2.7...: %s",noten.fuenf); printf("3.0...: %s",noten.sechs); printf("3.3...: %s",noten.sieben); printf("3.7...: %s",noten.acht); printf("4.0...: %s",noten.neun); printf("4.3...: %s",noten.zehn); printf("4.7...: %s",noten.elf); printf("5.0...: %s",noten.zwoelf); printf("\n\n"); // hier kommt jetzt das gerüst des Histogramms, wie ich es mir vorgestellt habe. bisher ist allerdings nur die erste Zeile bearbeitet, das ist also kein Fehler ;) printf("\n\nHistogramm:\n\n|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|\n"); printf("|"); if (noten.null>=1) printf(" *"); else printf(" "); if (noten.eins>=1) printf(" *"); else printf(" "); if (noten.zwei>=1) printf(" *"); else printf(" "); if (noten.drei>=1) printf(" *"); else printf(" "); if (noten.vier>=1) printf(" *"); else printf(" "); if (noten.fuenf>=1) printf(" *"); else printf(" "); if (noten.sechs>=1) printf(" *"); else printf(" "); if (noten.sieben>=1) printf(" *"); else printf(" "); if (noten.acht>=1) printf(" *"); else printf(" "); if (noten.neun>=1) printf(" *"); else printf(" "); if (noten.zehn>=1) printf(" *"); else printf(" "); if (noten.elf>=1) printf(" *"); else printf(" "); if (noten.zwoelf>=1) printf(" *\n"); else printf(" \n"); printf("--+--+--+--+--+--+--+--+--+--+--+--+--+\n"); printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12\n"); } fclose(output); } void eingabe(void) { printf("1.0...:"); fgets(noten.null, sizeof(noten.null), stdin); printf("1.3...:"); fgets(noten.eins, sizeof(noten.eins), stdin); printf("1.7...:"); fgets(noten.zwei, sizeof(noten.zwei), stdin); printf("2.0...:"); fgets(noten.drei, sizeof(noten.drei), stdin); printf("2.3...:"); fgets(noten.vier, sizeof(noten.vier), stdin); printf("2.7...:"); fgets(noten.fuenf, sizeof(noten.fuenf), stdin); printf("3.0...:"); fgets(noten.sechs, sizeof(noten.sechs), stdin); printf("3.3...:"); fgets(noten.sieben, sizeof(noten.sieben), stdin); printf("3.7...:"); fgets(noten.acht, sizeof(noten.acht), stdin); printf("4.0...:"); fgets(noten.neun, sizeof(noten.neun), stdin); printf("4.3...:"); fgets(noten.zehn, sizeof(noten.zehn), stdin); printf("4.7...:"); fgets(noten.elf, sizeof(noten.elf), stdin); printf("5.0...:"); fgets(noten.zwoelf, sizeof(noten.zwoelf), stdin); 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 grafisch 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 EXIT_SUCCESS; }
Desweiteren weis ich nicht, wie ich die Ausgabedatei "noten.dat" ordentlich formatiert bekomme ( so dass die noten alle fein säuberlich untereinander stehen und die Anzahl dann dahinter. eventuell noch mit
1.0 = 5
1.3 = 7
1.7 = ...etc
-
Ne daran liegt es nicht! Also an den chars.
Es liegt daran das du einen pointer (bzw. einen array) mit einer Zahl vergleichen tust.noten.null>=1
Das geht nicht!
Hab auch nicht den blassesten Schimmer was du damit überhaupt bezwecken willst.Aber ich glaube ein paar schleifen hier und da würden dein Programm erheblich lesbarer machen. verscuh mal deine ausgaben in ne schleife zu packen.
-
also, wie ich es in eine schleife packe weis ich jetzt nicht, da ich ja nicht mit i++ arbeiten kann....
naya, anyway. auf jeden fall wollte ich dies bezwecken:
lese Datei noten.dat ein
wenn die erste Zahl darin >=1 ist, gebe ein "*" aus, andererseits drei leerzeilen
(entspricht dem sprung nach rechts in der ausgabe)
wenn die 2. Zwahl >=1 ist, gebe ein '+' aus , ...
halt immer so weiter, bis die reihe durch ist. wenn ich das mit allen mache sollte dann sowas rauskommen:| | * * | * * * | * * * * |--+--+--+--+--+ 0 1 2 3 4
so soll unsere Ausgabe aussehen.
aber ich kann mich mal dransetzen und eine schleife basteln, dauert nur ein bischen
-
http://www.pronix.de/pronix-4.html
solltest du mal lesen, wirklich.
-
anahnd deren beispielen bin ich ja so weit gekommen. ich hatte eigentlich gehofft das hier jemand sag mach doch einfach dasundas oder versuchs mal so...
denn dafür gibt es dieses forum doch, oder?
ich häng mich dabei eben einfach auf und weis weder wonach ich suchen muss, noch, wie ich das dann verwende.
-
Du könntest mal darüber nachdenken, ob du die Struktur noten nicht vielleicht doch lieber als mehrdimensionales Array realisieren solltest. Dann kannst du auch mit "i++ arbeiten".
-
hm, wäre vielleicht zu überlegen. ich muss nur so erstmal den kampf mit dem progremm gewinnen ^^
ok, eine einzige frage habe ich ncoh und bitte beantwortet mir die nicht mit "hol dir ein buch" oder "googel mal"..
wie kann ich in meinem sruct auf die einzelnen werte zugreifen?
ich habe es mal damit versucht, aber das scheint auch nicht zu funktionieren:if (noten.null[i]>=1)
ich will ihm im prinzip sagen, dass er überprüfen soll, ob der wert, der unter noten.null gespeichert ist größer oder gleich 1 ist. wie muss ich das formulieren, damit er das auch macht
-
Wandle doch bitte die eingegebenen Werte erst mit
int value = atoi( eins );
in Integer um! Dann sinngemäß
if( note.null >= 1 ) ; // do something
wobei du bitte die null, eins, usw. member von note als Integer deklarierst!
Greetz, Swordfish
-
ok, wenn ich den kompletten struckt also in int mache
struct { int null; int eins; int zwei; ...} noten;
dann habe ich direkt zwei neue probleme:
1. Bei der eingabeabfrage werden, sobalt ich beim ersten wert eine zahl eingebe der zweite übersprungen und mit dem dritten in eine zeile gequetscht. abgefragt wird dann aber nur der dritte.
2. Das speichern funktioniert nichtmehr:
Da ich ja dann nichtmehr mit char arbeite, kann ich den befehl:fgets(noten.null, sizeof(noten.null), stdin);
ja nichtmehr benutzen, sondern den fgetc(Waszumteufelkommthierrein?);
wenn ich da nur stdin drin stehen lasse, meckert er nichtmehr, schreibt aber auch nix mehr in meine Datei rein.
-
#include <stdio.h> #include <stdlib.h> struct noten_t { int null; int eins; int zwei; int drei; int vier; int fuenf; int sechs; int sieben; int acht; int neun; int zehn; int elf; int zwoelf; }; noten_t noten; bool speichern( void ) { FILE *save = fopen( "noten.dat", "w+b+a+" ); if( !save ) { fprintf( stderr, "\"noten.dat\" konnte nicht geöffnet werden!\n" ); return false; } if( fwrite( ¬en, sizeof( noten ), 1, save ) != 1 ) { fprintf( stderr, "Fehler beim schreiben in \"noten.dat\"!\n" ); fclose( save ); return false; } fclose(save); return true; } bool ausgabe( void ) { FILE *input = fopen( "noten.dat", "r+b" ); if( !input ) { fprintf( stderr, "\"noten.dat\" konnte nicht geöffnet werden!\n" ); return false; } while( fread( ¬en, sizeof( noten ), 1, input ) == 1 ) { printf("1.0...: %i\n", noten.null ); printf("1.3...: %i\n", noten.eins ); printf("1.7...: %i\n", noten.zwei ); printf("2.0...: %i\n", noten.drei ); printf("2.3...: %i\n", noten.vier ); printf("2.7...: %i\n", noten.fuenf ); printf("3.0...: %i\n", noten.sechs ); printf("3.3...: %i\n", noten.sieben ); printf("3.7...: %i\n", noten.acht ); printf("4.0...: %i\n", noten.neun ); printf("4.3...: %i\n", noten.zehn ); printf("4.7...: %i\n", noten.elf ); printf("5.0...: %i\n", noten.zwoelf ); printf("\n\n"); } fclose( input ); } void eingabe( void ) { printf( "1.0...: " ); scanf( "%i", ¬en.null ); printf( "1.3...: " ); scanf( "%i", ¬en.eins ); printf( "1.7...: " ); scanf( "%i", ¬en.zwei ); printf( "2.0...: " ); scanf( "%i", ¬en.drei ); printf( "2.3...: " ); scanf( "%i", ¬en.vier ); printf( "2.7...: " ); scanf( "%i", ¬en.fuenf ); printf( "3.0...: " ); scanf( "%i", ¬en.sechs ); printf( "3.3...: " ); scanf( "%i", ¬en.sieben ); printf( "3.7...: " ); scanf( "%i", ¬en.acht ); printf( "4.0...: " ); scanf( "%i", ¬en.neun ); printf( "4.3...: " ); scanf( "%i", ¬en.zehn ); printf( "4.7...: " ); scanf( "%i", ¬en.elf ); printf( "5.0...: " ); scanf( "%i", ¬en.zwoelf ); speichern( ); printf( "\nEingabe gespeichert!\n\n" ); } int main( ) { int wahl; do { printf( "Was möchten Sie machen:\n\n" ); printf("-1- Neue Datensaetze eingeben\n"); printf("-2- Datensaetze grafisch 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( "\nDas Programm wird beendet...\n" ); break; default: printf( ">> %d << ???\n",wahl ); break; } } while( wahl != 3 ); return EXIT_SUCCESS; }
aber elegant ist der Codehaufen nicht...
Greetz, Swordfish
-
so, ich bin heute mal ein bischen fleißig gewesen und mein programm funktioniert (fast)
ich arbeite jetzt mit einem array, was mir ne ganze menge arbeit erspart, danke für den tipp!
hier mal das ganze Programm:#include <stdio.h> #include <stdlib.h> int i,e; int n[13]; void speichern(void) { FILE *save =fopen("noten.dat","w+b"); if( NULL == save ){ save = fopen("noten.dat","w+b"); if( NULL == save ) { fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n"); } } if(fwrite(&n,sizeof(n), 1, save) != 1) { fprintf(stderr, "Fehler bei fwrite...!!!\n"); } fclose(save); } void ausgabe(void) { FILE *output = fopen("noten.dat","r+b"); if( NULL == output ) { fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n"); } while(fread(&n,sizeof(n), 1, output) == 1) { printf("1.0..:%i\n", n[0]); printf("1.3..:%i\n", n[1]); printf("1.7..:%i\n", n[2]); printf("2.0..:%i\n", n[3]); printf("2.3..:%i\n", n[4]); printf("2.7..:%i\n", n[5]); printf("3.0..:%i\n", n[6]); printf("3.3..:%i\n", n[7]); printf("3.7..:%i\n", n[8]); printf("4.0..:%i\n", n[9]); printf("4.3..:%i\n", n[10]); printf("4.7..:%i\n", n[11]); printf("5.0..:%i\n", n[12]); printf("\n\nHistogramm:\n\n"); /*printf("|"); for (i=0; i>=12; i++); if (n[i]>=20) { printf(" %i", n[i]); } else printf(" "); printf("\n");*/ printf("|"); for (i=0; i>=12; i++); if (n[i]>=19) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=18) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=17) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=16) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=15) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=14) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=13) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=12) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=11) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=10) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=9) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=8) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=7) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=6) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=5) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=4) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=3) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=2) { printf(" *"); } else printf(" "); printf("\n"); printf("|"); for (i=0; i>=12; i++); if (n[i]>=1) { printf(" *"); } else printf(" "); printf("\n"); printf("|--+--+--+--+--+--+--+--+--+--+--+--+--+\n"); printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12\n"); } fclose(output); } void eingabe(void) { printf("1.0...:"); scanf("%i", &e); n[0] = e; printf("1.3...:"); scanf("%i", &e); n[1] = e; printf("1.7...:"); scanf("%i", &e); n[2] = e; printf("2.0...:"); scanf("%i", &e); n[3] = e; printf("2.3...:"); scanf("%i", &e); n[4] = e; printf("2.7...:"); scanf("%i", &e); n[5] = e; printf("3.0...:"); scanf("%i", &e); n[6] = e; printf("3.3...:"); scanf("%i", &e); n[7] = e; printf("3.7...:"); scanf("%i", &e); n[8] = e; printf("4.0...:"); scanf("%i", &e); n[9] = e; printf("4.3...:"); scanf("%i", &e); n[10] = e; printf("4.7...:"); scanf("%i", &e); n[11] = e; printf("5.0...:"); scanf("%i", &e); n[12] = e; 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 grafisch 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 EXIT_SUCCESS; }
mein probleme bestehen jetzt darin, dass bei der ausgabe meines histogramms die schleife anscheinend nicht richtig bearbeitet wird. das programm bearbeitet nur die erste spalte ( n[0] ) und den rest ignoriert es einfach
eine zeile ausgabe:
printf("|"); for (i=0; i>=12; i++); if (n[i]>=1) { printf(" *"); } else printf(" "); printf("\n");
desweiteren werden in der datei noten.dat keine wirklichen zahlen gespeichert.
das programm speichert zwar irgendwas und liest das dann auch wieder als Zahlen aus, aber wenn ich die Datei öffne und mir die zahlen angucken will, stehen die 1. alle in einer zeile (laut aufgabe soll in jeder zeile eine zahl stehen! <- wie krieg ich das hin ??)
und 2. sieht man nur kästchen anstatt zahlen.
woran liegt das?
(kann die kästchen leider nicht mit anzeigen, das forum scheint die nicht zu erkennen?)
-
schlecht. benutze einen for-loop um die sich aehnelnden teile deines codes zusammenzufassen.
-
eine bitte was??
also, ich weis, was ne for-schleife ist. und da ich mal ganz grob loop mit schleife übersetzen würde, gehe ich davon aus, dass du meinst ich soll eine for-schleife benutzen.aber wo soll ich denn da was zusammenfassen?
kannst du mir da evtl. ein kleines Beispiel geben, das wäre super!
-
printf("1.0..:%i\n", n[0]); printf("1.3..:%i\n", n[1]); printf("1.7..:%i\n", n[2]); printf("2.0..:%i\n", n[3]); printf("2.3..:%i\n", n[4]); printf("2.7..:%i\n", n[5]); printf("3.0..:%i\n", n[6]); printf("3.3..:%i\n", n[7]); printf("3.7..:%i\n", n[8]); printf("4.0..:%i\n", n[9]); printf("4.3..:%i\n", n[10]); printf("4.7..:%i\n", n[11]); printf("5.0..:%i\n", n[12]);
wird zu
for(i = 0; i < 13; ++i) printf("%.1f..: %i\n", 1.0 + i/3.0, n[i]);
-
hui, super!
das ist natürlich um einiges kürzer!
habe jetzt den ersten teil der ausgabe und den teil der eingabe drastisch verkürzen können. Jetzt versuche ich mich an der ausgabe meines histogramms. leier funtkioniert das nicht so, wie ich es will. hier ist mein code:for(a=19; a<=1 ; a=a-1); { printf("|"); for (i=0; i>=12; i++); { if (n[i]>=a) { printf(" *"); } else printf(" "); i++; } printf("\n"); a=a-1; }
in der ausgabe sieht das dann so aus:
| |--+--+--+--+--+--+--+ 0 1 2 3 4 5 6
allerdings solletn da 20 striche untereinander sein, nicht nur einer...
und eben für jede zahl sterne oder ein leerzeile, ich bekomme aber garkeine sternchen angezeitg (abfrage ist 100%ig richtig, hat ja ohne schleife geklappt).
bsp:| | * * | * * * * * | * * * * * * * |--+--+--+--+--+--+--+--+ 0 1 2 3 4 5 6 7...
wenn ich mir mein "a" ausgeben lasse, bekomme ich auch nur 19 angezeigt. ich habe das gefühl, dass der irgendwo ein problem mit fen for-schleifen hat. liege ich da richtig?
und wie könnte man das ausbügeln? ich habs schonmal mit do-while schleifen probiert, ich bekam aber das selbe erbebnis. hat jemand ne idee?