http://www.pronix.de -> Forum -> C-Programmieren

Unterseiten

Forum: C-Programmieren

Moderatoren: juergen, Martin Conrad

Thema: [EDIT] - switch dreht durch

  • (nur registrierte Mitglieder)

[EDIT] - switch dreht durch

bluethoot am 19.07.2010 um 12:22

ich hab da ein problem mit der switch wenn ich einen buchstaben eingeb kommt wie zu erwarten die default meldung
doch dann kommt nur mehr die default meldung und ich kann es nur mehr "händisch" abbrechen.
wie kann ich den fehler beseitigen.

hier der code


#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    double t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19;
    int u4;
   
    do
    {
           
    printf("\n\n\n\n\n\n\n                               Turmrechnen\n\n\n\n");
    printf("                               <1> Klein 2-9\n");
    printf("                               <2> Gross 11-19\n");
    printf("                               <3> Zurueck\n");
    printf("                               ");
    scanf("%d",&u4);
    system("cls");
   
    switch(u4)
    {
              case 1:
   
    printf("\n\n                         Gieb nun die basis ein\n");
    printf("                         ");
    scanf("%lf",&t1);
    fflush(stdin);
   
    t2=t1*2;
    printf("\n                         Mal 2 =      %lf\n",t2);
    t3=t2*3;   
    printf("                         Mal 3 =      %lf\n",t3);
    t4=t3*4;
    printf("                         Mal 4 =      %lf\n",t4);
    t5=t4*5;
    printf("                         Mal 5 =      %lf\n",t5);
    t6=t5*6;
    printf("                         Mal 6 =      %lf\n",t6);
    t7=t6*7;
    printf("                         Mal 7 =      %lf\n",t7);
    t8=t7*8;
    printf("                         Mal 8 =      %lf\n",t8);
    t9=t8*9;
    printf("                         Mal 9 =      %lf\n",t9);
    t10=t9/2;
    printf("                         Durch 2 =    %lf\n",t10);
    t11=t10/3;
    printf("                         Durch 3 =    %lf\n",t11);
    t12=t11/4;
    printf("                         Durch 4 =    %lf\n",t12);
    t13=t12/5;
    printf("                         Durch 5 =    %lf\n",t13);
    t14=t13/6;
    printf("                         Durch 6 =    %lf\n",t14);
    t15=t14/7;
    printf("                         Durch 7 =    %lf\n",t15);
    t16=t15/8;
    printf("                         Durch 8 =    %lf\n",t16);
    t17=t16/9;
    printf("                         Durch 9 =    %lf\n\n\n",t17);
   
    system("pause");
    system("cls");
    break;
   
        case 2:
   
    printf("\n\n                         Gieb nun die basis ein\n");
    printf("                         ");
    scanf("%lf",&t1);
    fflush(stdin);
   
    t2=t1*11;
    printf("\n                         Mal 11 =    %lf\n",t2);
    t3=t2*12;   
    printf("                         Mal 12 =    %lf\n",t3);
    t4=t3*13;
    printf("                         Mal 13 =    %lf\n",t4);
    t5=t4*14;
    printf("                         Mal 14 =    %lf\n",t5);
    t6=t5*15;
    printf("                         Mal 15 =    %lf\n",t6);
    t7=t6*16;
    printf("                         Mal 16 =    %lf\n",t7);
    t8=t7*17;
    printf("                         Mal 17 =    %lf\n",t8);
    t9=t8*18;
    printf("                         Mal 18 =    %lf\n",t9);
    t10=t9*19;
    printf("                         Mal 19 =    %lf\n",t10);
    t11=t10/11;   
    printf("                         Durch 11 =  %lf\n",t11);           
    t12=t11/12;
    printf("                         Durch 12 =  %lf\n",t12);
    t13=t12/13;
    printf("                         Durch 13 =  %lf\n",t13);
    t14=t13/14;
    printf("                         Durch 14 =  %lf\n",t14);
    t15=t14/15;
    printf("                         Durch 15 =  %lf\n",t15);
    t16=t15/16;
    printf("                         Durch 16 =  %lf\n",t16);
    t17=t16/17;
    printf("                         Durch 17 =  %lf\n",t17);
    t18=t17/18;
    printf("                         Durch 18 =  %lf\n",t18);
    t19=t18/19;
    printf("                         Durch 19 =  %lf\n\n",t19);
   
    system("pause");
    system("cls");
    break;
   
    case 3:
         break;
         
    default :
    printf("\n\n\n\n\n\n\n\n\n\n\n                          Keine gueltige Eingabe\n\n\n\n\n\n\n\n\n\n\n\n");
    system("pause");
    system("cls");
   
}
}
while(u4!=3);     
   
system("pause");
return 0;
}


und dann noch eine frage am rand giebts eine möglichkeit bei der eingabe den punkt durch ein komma zu ersetzen


lg blue
 

[EDIT] - Re: switch dreht durch

bcc-fan am 25.07.2010 um 15:09

Leider ist das Problem vom Betriebssystem und vom Compiler
abhängig.

Aber hier schon mal ein wenig kürzer mit Kommentaren im Quelltext:

int main(int argc, char *argv[])
{
    long double t1;
    int u4;

    do
    {

        printf("\n\n\n\n\n\n\n                               Turmrechnen\n\n\n\n");
        printf("                               <1> Klein 2-9\n");
        printf("                               <2> Gross 11-19\n");
        printf("                               <3> Zurueck\n");
        printf("                               ");
        scanf("%d",&u4);
        system("cls");

        switch(u4)
        {
        case 1:

            printf("\n\n                         Gib nun die basis ein\n");
            printf("                         ");
            int tk;
            scanf("%lf",&t1);  // scanf arbeitet nicht immer wie eerwartet, deshalb werden oft Alternativen eingesetzt
            printf("Test: %lf\n", t1);
            fflush(stdin);  // unzuverlässig -> stdin
            for(tk = 1; tk < 10; tk++)
            {
                t1 = tk * t1;
                printf("                         Mal %d =    %lf\n", tk, t1);

            }

            for(tk = 1; tk < 10; tk++)
            {
                t1 = t1/tk;
                printf("                         Durch %d =    %lf\n", tk, t1);
            }

            break;

Ist nur ein Ausschnitt - sollte klar sein.

Punkt - Komma ist möglich entweder selbst was basteln oder locale.h anschauen - verstehen und nutzen.

MfG bcc-fan

--
C/C++
only just for fun

 

Re: switch dreht durch

bluethoot am 26.07.2010 um 10:43

danke werd versuchen local.h zu verstehn und zu nutzen
bin neuling und hab jezt mal ne keybord abfrage eingebaut die das problem lösen sollte
aber warum ist stdin unzuverlässig

lg blue
 

[EDIT] - Re: switch dreht durch

bcc-fan am 26.07.2010 um 12:27

zu fflush(stdin)
Auszug aus einem Normenwerk, ANSI-C:
Zitat:

7.19.5.2 The fflush function
Synopsis

#include <stdio.h>
int fflush(FILE *stream);
Description

If stream points to an output stream or an update stream in which the most recent
operation was not input, the fflush function causes any unwritten data for that stream
to be delivered to the host environment to be written to the file; otherwise, the behavior is
undefined.

If stream is a null pointer, the fflush function performs this flushing action on all
streams for which the behavior is defined above.
Returns

The fflush function sets the error indicator for the stream and returns EOF if a write
error occurs, otherwise it returns zero.


Kurz: fflush(stdout) = okay
fflush(stdin) = nicht okay => undefiniertes Verhalten

Das Dumme an der Geschichte ist das sich kaum ein Compiler 100% an solche Vereinbarungen hält. Entweder er kann weniger, oder mehr, oder auf Teilgebieten beides.

Das bedeutet im Einzelfall unter bestimmten Bedingungen kann das, manchmal auch nur hin und wieder, funktionieren aber man kann sich nicht darauf verlassen.

Oder im Zweifel die Dokumentation des Compilers lesen, es gibt mindestens einen Compiler der fflush(stdin) können will. Der Hersteller des Compiler betrachtet das als Erweiterung des C-Standards.

Nachtrag:
Hier mal eine interessante Diskussion zu dem Thema:
Eingabepuffer (externer link)

Die Jungs haben leider nicht alle ihre Testumgebung beschrieben.

MfG bcc-fan

--
C/C++
only just for fun

 

Re: switch dreht durch

ITEDVO am 04.08.2010 um 03:54

man könnte sich auch eine eigene funktion schreiben, welche den eingabepuffer leert. ich musste mal für die
schule so eine funktion ausarbeiten, keine ahnung wo ich dieses hab, wenn ichs finde poste ichs mal =b

--
Was nicht ist, kann noch werden =b
rock by vote or play by vote
<a href="http://www.selfmades.eu" target="blank"><img src="http://selfmades.eu/Clanwerbung/LinkUs/ITEDVO.jpg" alt="Clan Selfmades" title="Clan Selfmades"></a>

 
  • (nur registrierte Mitglieder)