Heftiges Programm?
-
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?
-
for(a=19; a<=1 ; a=a-1);[cpp] Deine schleife setzt a = 19 und läuft solange a <= 1 ist -> die Schleife läuft garnicht. Machste so: [cpp] for( a = 19; a != 0; --a ); // oder: for( a = 19; a >= 0; --a ); // --a bedeutet a = a - 1
Greetz, Swordfish
-
huch, war die for-schleife nicht for(anfangsbedingung; abbruchbedingung; tue diesunddas); ?
hm, dann schein ich da wohl irgenwas missverstanden zu haben.
nungut, habe den code verändert, habe aber immernoch fast das selbe problem wie vorher, nur dass er mir jetzt ein sternchen anzeigt...
code:for (a=19; a!= 0; --a); { printf("|"); for (i=0; i>=12; i++); { if (n[i]>=a) { printf(" *"); } else printf(" "); i++; } printf("\n"); }
ergebnis:
| * |--+--+--+--+--+--+--+--+--+--+--+--+--+ 0 1 2 3 4 5 6 7 8 9 10 11 12
mehr wird nicht angezeigt.
-
du machst:
for( a = 19; a != 0; --a ); // deutlicher geschrieben: for( a = 19; a != 0; --a ) ; // du tust 19 mal nichts!
nimm mal:
for( a = 19; a != 0; --a ) { // dein code }
aber moment mal
printf("|"); for (i=0; i>=12; i++); // hier schon wieder { if (n[i]>=a) { printf(" *"); } else printf(" "); i++; // ich glaub' du willst // das nicht wirklich } printf("\n");
nimmste:
printf("|"); for ( i = 0; i < 12; i++ ) { if( n[ i ] >= a ) printf(" *"); else printf(" "); } printf("\n");
Greetz, Swordfish
-
uaaargh, jetzt hab ich erst gesehen, dass ich da ein ";" dahinter hatte... lol. THX Swordfish! ich glaub ich wär daran verzweifelt
hier jetzt der aktuellste stand der dinge:#include <stdio.h> #include <stdlib.h> int i,e,a; 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) { for(i = 0; i < 13; ++i) printf("%.1f..: %i\n", 1.0 + i/3.0, n[i]); printf("\n\nHistogramm:\n\n"); printf("|"); for (i=0; i>=12; i++) { if (n[i]>=20) printf(" %i", n[i]); else printf(" "); } printf("\n"); for (a=19; a!= 0; --a) { printf("|"); for (i=0;i < 12; 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"); } 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 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; }
Wie bringe ich dem jetzt noch bei, in der Datei noten.dat "wirkliche" (lesbare) Zahlen zu speichern und nicht irgendetwas anderes.
und wenn möglich bitte so, dass in jeder Zeile eine Zahl steht.
-
fprintf
-
void speichern(void) { FILE *save = fopen("noten.dat","w+b"); if( NULL == save ) { // (1) save = fopen("noten.dat","w+b"); // (2) if( NULL == save ) { // (3) fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n"); } // (4) } //... }
Wieso versuchst du wenn das öffnen der Datei fehlschlägt (1) nochmals die datei zu öffnen (2) und prüfst nochmals (3)? Außerdem müsstest du die Funktion bei (4) mit return verlassen.
also:
void speichern(void) { FILE *save = fopen("noten.dat","w+b"); if( !save ) { fprintf(stderr,"Kann \"noten.dat\" nicht öffnen!\n"); return; } //... }
Greetz, Swordfish