Heftiges Programm?



  • 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



  • 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 gut 🙂

    hier 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: 4

    if( 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 3

    if( condition )
    {
            code( );
    }
    
    • Whitesmiths Style

    Bekanntgeworden durch Beispiele, welche dem Whitesmiths C - Compiler beilagen.
    Tab-Size: 8, selten 4

    if( condition )
            {
            code( );
            }
    
    • GNU Style

    Benutzt im GNU EMACS und in der FSF (Free Software Foundation) und nirgendwo anders.
    Tab-Size: 4

    if( condition )
      {
        code( );
      }
    

    Die am meisten benutzten sind wohl Allan und Whitesmiths.

    Greetz, Swordfish


Anmelden zum Antworten