Problem bei C Programm



  • Ich empfehle die Warnstufe deines Compilers zu steigern, dann sollte sowas auch bemängelt werden.

    PS: In Zukunft bitte die [cpp]-Tags verwenden.



  • und was sind jetzt deine anderen 2 Probleme?



  • Wen interessieren schon Warnungen, relevant sind doch nur die Errors 🙂

    Nö ernsthaft: Werd ich mal schaun wo ich das machen kann.

    Dass es extra C/C++ Tags gibt hab ich im Eifer des Gefechts ganz übersehen.

    Aussderdem merk grad, ich dass ich für ein spezielles C/C++ Forum auch nicht wirklich ne Aussagekräftige Überschrift verwendet hab.

    Beim nächsten mal werd ich das beachten.

    Da ist das ganze jetzt schon ein bisschen heftiger und einiges mehr an Aufwand nötig, aber ich werd die Problemstellung mal kurz erläutern:

    Erst mal hier ein bestehendes Programm das funktioniert und erweitert werden soll, wie genau weiter unten:

    /* Programm zur Zinsberechnung */
    
    #include <stdio.h>
    
    int main(void)
    { 
    
    	float kapital;
    	float skapital;
    	float zinssatz;
    	float zinsen;
    	int jahre;
    	int i;
    
    	/* Einlesen der Variablem */
    
    	printf( "Startkapital?\n" );
    	scanf_s ("%f", &skapital);
    
    	printf( "Zinssatz?\n" );
    	scanf_s ("%f", &zinssatz);
    
    	printf( "Jahre?\n" );			
    	scanf_s ("%d", &jahre);
    
    	printf( "\n\n\n" );
    
    	/* Ausgabe der eingelesenen Variablen */ 
    
    	printf( "Startkapital in Euro: %.0f\n", skapital );
    	printf( "Zinssatz in %: %.0f\n", zinssatz );
    	printf( "Laufzeit in Jahren: %.0d\n\n", jahre );
    
    	/* Kopzeile Tabelle */ 
    
    	printf( "Jahre |   Zinsen |    Kapital \n" );
    	printf( "----------------------------- \n" );
    
    	kapital = skapital;
    
    	/* Schleife zur Zinsberechnung */
    
    	i = 1;
    	while (i <= jahre)
    	{
    
    		zinsen = kapital * zinssatz / 100;
    		kapital = zinsen + kapital;
    
    		/* Ausgabe der jeweiligen Zeile */
    
    		printf("%5.0d |", i );
    		printf("%9.2f |", zinsen );
    		printf("%11.2f \n", kapital );
    
    	     i++;
    	}
    
    	printf( "\n" );
    
    	return 0;
    }
    

    So und jetzt soll hier folgendes passieren: bei einer Fehleingabe ala "100x" oder "1x00", sprich halt einfach keine reine Zahl, soll solange nachgefragt werden bis der Anwender ne reine Zahl einhackt.

    Ich weiß, dass man irgendwie ne while Schleife und if Bedingung ins Spiel bringen muss die den Funktionswert von scanf checkt, aber das wie stellt mich vor ein Rätsel...



  • du kannst den rueckgabewert von scanf dazu verwenden



  • du kannst den rueckgabewert von scanf dazu verwenden



  • Einen bestimmten Werteberich kannst Du (meines Wissens) so erzwingen:

    int var;
    
    while ( var < MIN || var > MAX )
       scanf("%d", &var);
    

    Wenn man Buchstaben eingibt kackt bei mir das ganze Programm ab.

    Alternative wäre halt ein String, den man auf andere Zeichen als Ziffern untersucht und dann mit atoi in ein Integer konvertiert.
    Ist etwas komplizierter und es gibt sicherlich eine elegantere Lösung dafür...



  • mit scanf kannst du deine eingabe überprüfen, aber auch nur, wenn du entweder nur buchstaben oder nur zahlen eingibts. bei 100x würde die variante verssagen.

    while(scanf("%d", &pos) != 1)
    {
       printf ("\nFehler! Sie muessen eine Zahl eingeben!\n");
       fflush(stdin);
    }
    

    wenn du nen char hast, kannt du wie mein vorgänger schon gesagt hat,deine eingabe wie 100x auch abfangen, (kannst z.b. deine eingaben ueber den ascii code ueberpruefen)

    mir ist nicht bekannt, wie man scanf 100x abfangen kann 😢



  • Hab Dir mal ne Alternative geschrieben.
    Da ich selber noch Anfänger bin ist das sicherlich nicht so elegant - funktioniert aber:

    // Benutzer darf nur Zahlen eingeben zwischen MIN und MAX
    
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    #define MIN 10
    #define MAX 20
    #define JA 1
    #define NEIN 0
    #define MAXZIFFERN 10
    
    int main(void)
    {
    	int cnt;
    	int var = (MAX+1);
    	int is_zahl = 0;
    	int austritt = NEIN;
    	int austritt2 = NEIN;
    	int tmp_int;
    	unsigned int lange = 0;
    	char tmp_string[MAXZIFFERN+1];
    
    while ( austritt2 == NEIN )		// Legt Wertebereich fest
    {
    		while ( austritt == NEIN )					
    		{	
    				printf("\nEingabe ==> ");
    				fgets(tmp_string, (MAXZIFFERN+1), stdin);				// LIEßT STING EIN
    
    				lange = strlen(tmp_string);					
    				for(cnt=0; cnt<(lange-1); cnt++)	// lange-1, weil wir '\0' nicht vergleichen wollen
    				{
    					tmp_int = tmp_string[cnt];
    					is_zahl = isdigit(tmp_int);
    					if ( is_zahl == 0 )		// Wenn keine Ziffer --> Schleife startet neu
    					{
    							austritt = 0;
    							//puts("Fehlermeldung: Falsches Zeichen");
    							break;
    					}
    					else
    						austritt = 1;       // Wenn nur Ziffern --> Beendet Schleife
    				}
    		  var = atoi(tmp_string);		// Umwandlung in ein Integer
    		  if ( var < MIN || var > MAX )
    		  {
    		  	austritt2 = NEIN;
    		  	austritt = NEIN;
    		  }
    		  else
    		  	austritt2 = JA;
    		}
    
    }
    
    printf("\nDie Zahl lautet: %d\n", var);
    return 0;
    }
    


  • Hallo!

    Hier sind mal die Funktionen, die ich für solche Fälle vorrätig habe. Hier nur für int.

    int StringContainsNumber_Int( char *String, int StringLength )
    {
       int i = 0 ;
    
       for( i = 0 ; i < StringLength ; i++ )
       {
          if( !isdigit( String[i]) && String[i] != '-' )
          {
             return 0 ;  /* Wrong char found */
          }
          /* no else. Character is ok. Just continue searching. */
       }
    
       return 1 ;
    }
    
    int GetNumberFromUser_Int( int *pNumberToGet )
    {
       char Input[80] = "" ;
    
       scanf( "%s" , Input );
    
       if( StringContainsNumber_Int( Input, strlen(Input) ) )
       {
          *pNumberToGet = atoi( Input) ;
    
          return 1 ;
       }
       /* no else. Input is not a number.*/
    
       return 0 ;
    }
    
    int GetNumberFromUser_Int_MinMax( int *pNumberToGet, int Min, int Max )
    {
       int Number = 0 ;
    
       if(   GetNumberFromUser_Int( &Number )
          && Min    <= Number
          && Number <= Max )
       {
          *pNumberToGet = Number ;
          return 1 ;
       }
       /* no else. Input is not a number or it is out of range. */
    
       return 0 ;
    }
    
    int main(int argc, char* argv[])
    {
       int Zahl = 0 ;
    
       int Min = -5 ;
       int Max = 10 ;
    
       printf( "Geben Sie eine Zahl zwischen %d und %d ein :  ", Min, Max );
    
       if( GetNumberFromUser_Int_MinMax( &Zahl, Min, Max ) )
       {
          printf( "Danke schön!" );
       }
       else
       {
          // Mach was anderes.
       }
       getch();
       return 0;
    }
    


  • So sollte es gehen

    do{
    fflush(stdin);
    printf( "Startkapital?\n" );
    }while(!scanf ("%f", &skapital));

    do{
    fflush(stdin);
    printf( "Zinssatz?\n" );
    }while(!scanf ("%f", &zinssatz));

    do{
    fflush(stdin);
    printf( "Jahre?\n" );
    }while(!scanf ("%d", &jahre));

    printf( "\n\n\n" );

    /* Ausgabe der eingelesenen Variablen */
    printf( "Startkapital in Euro: %.0f\n", skapital );
    printf( "Zinssatz in %: %.0f\n", zinssatz );
    printf( "Laufzeit in Jahren: %d\n\n", jahre );



  • Emetiel schrieb:

    So sollte es gehen

    Oder auch nicht - fflush(stdin) ist nicht definiert (und bringt nur auf MS-Compilern etwas).



  • [/quote]Oder auch nicht - fflush(stdin) ist nicht definiert (und bringt nur auf MS-Compilern etwas).[/quote]

    Für fflush muss natürlich die entsprechende .h includet werden. 🙂

    Äääähhhh stimmt geht nur MS-Comps. Hatte ich doch glatt vergessen 🙂



  • Emetiel schrieb:

    Für fflush muss natürlich die entsprechende .h includet werden. 🙂

    Das meinte ich nicht - laut ANSI Standard räumt fflush() nur den Ausgabepuffer eines FILE's aus. Aber stdin ist eine reine Eingabedatei und hat deshalb keinen Ausgabepuffer - daß fflush(stdin) stattdessen dessen Eingabepuffer entsorgt, ist wie gesagt eine Erfindung von MS.

    Standardkonform wäre folgendes, um den Rest der Eingabezeile zu vernichten:

    while(fgetc(stdin)!='\n');
    


  • scanf hat doch einen rückgabewert. du kannst ja ganz einfach checken ob die eingabe funktioniert hat:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int var;
        int check=scanf("%d",&var);
        if (check==0)
           printf("\nFehler bei Eingabevorgang. Bitte erneute Eingabe taetigen!\n\n");
        else
            printf("\nAlles in Ordnung\n\n");
        system("pause");
    };
    

    das musst du dann nur noch in eine while schleife verpacken.

    wenn du mittels fgets() einen String in ein char array einliest und den dann umwandelst kannst du ja bei jedem einzelnen zeichen überprüfen obs in dem gültigen wertebereich liegt. ASCII-Zeichen sind intern auch nur Zahlen und haben alle einen bestimmten wert mit dem man das oben genannte überprüfen kann.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        for (int i=30;i<=125;i++)
            printf("** %d: %c **\t",i,i);
        system("pause");
    };
    

Anmelden zum Antworten