C - Programm



  • hi,

    habe folgende Aufgabe:

    Schreiben Sie ein Programm, das folgende Ausgabe produziert. Verwenden Sie dabei für die Zahlen Variablen und keine Stringkonstanten.

    Artikelnummer Anzahl Preis
    0000000123212 1 0.99

    Hier der Code: (In C)

    /* Aufgabe im Buch S. 115 Nr 2 */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    
        unsigned int artikelnummer;
    	unsigned int anzahl;
    	unsigned float preis;
    
    	printf("Artikelnummer : ");
    	scanf_s("%d", &artikelnummer);
    	fflush(stdin);
    
    	printf("Anzahl : ");
    	scanf_s("%d", &anzahl);
    	fflush(stdin);
    
    	printf("Preis : ");
    	scanf_s("%.2f", &preis);
    	fflush(stdin);
    
    	printf("Die Artikelnummer bertraegt : %-10d\n", artikelnummer);
    	printf("Die Anzahl betraegt         : %-10d\n", anzahl);
    	printf("Der Preis betraegt          : %-10d Euro\n", preis);
    
    	system("PAUSE");
    	return 0;
    
    }
    

    Ich kann die Zahlen noch eingeben, aber danach stürzt die Eingabeaufforderung ab und Ich bekomme eine Compiler Fehlermeldung.

    Was habe Ich falsch gemacht? Bitte um Verbesserung und Erklärung für einen absoluten Neuling.

    Danke im Voraus!
    Micha



  • Der Compiler gbt mir ja auch kurioser Weise keine Fehlermeldung beim Kompilieren 😕



  • Michael991 schrieb:

    Ich kann die Zahlen noch eingeben, aber danach stürzt die Eingabeaufforderung ab und Ich bekomme eine Compiler Fehlermeldung.

    Und die Fehlermeldung (ich tipp mal auf den Fehlschlag einer Assertion) lautet!? (Kristallkugel in Reperatur, sorry)

    imvho unterstützt scanf_s keine Präzisionsangaben für Fließkommaeingaben...
    unsigned float ist quatsch. Der Typspezifizierer unsigned gilt nur für Integertypen.

    Michael991 schrieb:

    printf("Der Preis betraegt          : %-10d Euro\n", preis);
    

    Einen float als Integer ausgeben willst du nicht wirklich...

    greetz, Swordfish

    PS: Dass der Compiler nicht meckert, heißt nicht, dass es nix zu meckern gäbe 😉



  • habe jetzt leider noch nicht die Lösung daraus schließen können. In meinem Buch ist auch float mit scanf_s verbunden und unsigned ist um das alles im positiven Bereich zu machen...

    Fehlermeldung:

    Microsoft Visual Studio C Runtime Library hat einen schwerwiegenden Fehler in Projekt_Lernen2.exe gefunden.

    Klicken Sie auf "Unterbrechen", um das Programm zu debuggen, oder auf "Weiter", um es zu beenden.

    Unterbrechen:

    "Projekt_Lernen2.exe": "C:\Dokumente und Einstellungen\mamaundpapa\Eigene Dateien\Visual Studio 2005\Projects\Projekt_Lernen2\release\Projekt_Lernen2.exe" geladen, Symbole wurden geladen.
    "Projekt_Lernen2.exe": "C:\WINDOWS\system32\ntdll.dll" geladen, Keine Symbole geladen.
    "Projekt_Lernen2.exe": "C:\WINDOWS\system32\kernel32.dll" geladen, Keine Symbole geladen.
    "Projekt_Lernen2.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.163_x-ww_681e29fb\msvcr80.dll" geladen, Keine Symbole geladen.
    "Projekt_Lernen2.exe": "C:\WINDOWS\system32\msvcrt.dll" geladen, Keine Symbole geladen.
    Microsoft Visual Studio C Runtime Library hat einen schwerwiegenden Fehler in Projekt_Lernen2.exe gefunden.

    Klicken Sie auf "Unterbrechen", um das Programm zu debuggen, oder auf "Weiter", um es zu beenden.
    Das Programm "[440] Projekt_Lernen2.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.



  • Swordfish hat ja auch nicht geschrieben, dass scanf_s() nicht mit float umgehen kann, sondern dass es seiner Meinung nach keine Prezisionsangaben unterstützt.

    Meinst du du kannst deinem Visual Studio entringen was das für ein schwehrwiegender Fehler war?

    Außerdem hat Swordfish bereits richtigerweise angemerkt dass du hier:

    printf("Der Preis betraegt          : %-10d Euro\n", preis);
    

    einen float übergibst aber "%d" verwendest und nicht "%f"

    (Nebenbei: scanf_s ist kein ISO-C++ - wenn du scanf_s() nimmst, es gibt doch auch printf_s() oder?)



  • Es gibt keinen unsigned float... 🙄

    Warum stellst du Fragen zu C eigentlich im C**++** Forum?

    flush( stdin );
    

    ist undefiniert!

    #include <stdio.h>
    
    void flush_stdin( ) {
    
    	int ch;
    	while( ( ( ch = getchar( ) ) != EOF ) && ( ch != '\n' ) );
    }
    
    int main( ) {
    
    	unsigned long product_code;
    	unsigned int amount;
    	float cost;
    	int result = 1;
    
    	do {
    		if( !result ) {
    
    			puts( "\nFehlerhafte Eingabe!\n" );
    		}
    
    		printf( "Artikelnummer: " );
    		result = scanf_s( "%10lu", &product_code );
    
    		if( getchar( ) != '\n' ) {
    
    			flush_stdin( );
    			result = 0;
    		}
    
    	} while( !result );
    
    	do {
    		if( !result ) {
    
    			puts( "\nFehlerhafte Eingabe!\n" );
    		}
    
    		printf( "Anzahl:        " );
    		result = scanf_s( "%6i", &amount );
    
    		if( getchar( ) != '\n' ) {
    
    			flush_stdin( );
    			result = 0;
    		}
    
    	} while( !result );
    
    	do {
    		if( !result ) {
    
    			puts( "\nFehlerhafte Eingabe!\n" );
    		}
    
    		printf( "Preis:         " );
    		result = scanf_s( "%f", &cost );
    
    		if( getchar( ) != '\n' ) {
    
    			flush_stdin( );
    			result = 0;
    		}
    
    	} while( !result );
    
    	puts( "\nArtikelnummer   Anzahl       Preis" );
    	printf( "   %010lu   %6i   %9.2f\n", product_code, amount, cost );
    }
    

    Warum willst du eigentlich unbedingt scanf_s? In diesem Fall bietet es nicht wirklich mehr Sicherheit als das ANSI scanf...

    greetz, Swordfish



  • Swordfish schrieb:

    Warum willst du eigentlich unbedingt scanf_s? In diesem Fall bietet es nicht wirklich mehr Sicherheit als das ANSI scanf...

    Darf ich raten?

    I) Weil dann der Compiler nicht mehr diese nervigen Warnungen ausspuckt
    II) Stand im Buch scanf_s()



  • Ok habe es jetzt soweit gelöst:

    /* Aufgabe im Buch S. 115 Nr 2 */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    
        long artikelnummer;
    	int anzahl;
    	float preis;
    
    	printf("Artikelnummer : ");
    	scanf("%ld", &artikelnummer);
    	fflush(stdin);
    
    	printf("Anzahl : ");
    	scanf("%d", &anzahl);
    	fflush(stdin);
    
    	printf("Preis : ");
    	scanf("%.2f", &preis);
    	fflush(stdin);
    
    	printf("Die Artikelnummer bertraegt : %ld\n", artikelnummer);
    	printf("Die Anzahl betraegt         : %d\n", anzahl);
    	printf("Der Preis betraegt          : %.2f Euro\n", preis);
    
    	getchar();
    	return 0;
    
    }
    

    Aber wenn ich den Preis angebe übernimmt er dies nciht korrekt 😕



  • /* Aufgabe im Buch S. 115 Nr 2 */ 
    
    #include <stdio.h> 
    #include <stdlib.h> 
    
    int main() 
    { 
    
        long artikelnummer; 
        int anzahl; 
        float preis; 
    
        printf("Artikelnummer : "); 
        scanf("%ld", &artikelnummer); 
        fflush(stdin); 
    
        printf("Anzahl : "); 
        scanf("%d", &anzahl); 
        fflush(stdin); 
    
        printf("Preis : "); 
        scanf("%f", &preis); 
        fflush(stdin); 
    
        printf("Die Artikelnummer bertraegt : %ld\n", artikelnummer); 
        printf("Die Anzahl betraegt         : %d\n", anzahl); 
        printf("Der Preis betraegt          : %.2f Euro\n", preis); 
    
        getchar(); 
        return 0; 
    
    }
    

    funktioniert bei mir.
    Swordfish hat schon wie oft(?) angemerkt dass beim einlesen _keine_ Genauigkeit angegeben werden kann.


Anmelden zum Antworten