[C]Switch auswahl ruft Funktionen nicht auf

LordoftheBord

Mitglied
Hallo

Ich schreibe gerade an einem Taschenrechner, welcher alle eingegebenen Zahlen und Ergebnisse in einer externen Datei abspeichert. Der Übersicht halber, habe ich die einzelnen Aufgaben in Funktionen gepackt. Unter anderem habe ich einen Menue Funktion aus welcher man die anderen Funktionen aufrufen kann. Doch klappt dies leider nicht. Wenn ich das Programm starte und ich eine Zahl eingebe, welche normalerweise eine andere Funktion aufrufen sollte, wird das Programm beendet. Hier der Code:

Code:
#include <stdio.h> 
#include <conio.h> 

void laden();
void taschenrechner();
void menue();

int main() 
{   
    menue();
    return 0;
}

void menue()
{
    char eingabe;
    
    printf("Der Taschenrechner");
    printf("\n\n  <1> : Taschenrechner");
    printf("\n  <2> : Protokollierung");
    getchar(); 
    eingabe = getchar(); 
     
    switch(eingabe)               
    { 
        case '1': taschenrechner();                      
                break; 
        case '2': laden(); 
                break; 
    } 

    return;
}

void taschenrechner()
{
    int a,b,ergebnis;
    char opperator;
    FILE *fp;
    
    printf("Geben Sie die erste Zahl ein : ");
    scanf("%d",&a);
    printf("\nGeben Sie die zweite Zahl ein : ");
    scanf("%d",&b);   
    printf("\nGeben Sie den Opperator ein : ");
    getchar(); 
    opperator = getchar(); 
    
    switch(opperator)    // variabel für operation eingeben              
    { 
        case '+': ergebnis = a + b;                      
                break; 
        case '-': ergebnis = a - b; 
                break; 
        case '*': ergebnis= a * b; 
                break; 
        case '/': ergebnis = a / b; 
                break; 
    } 
    
    printf("\nDas Ergebnis = %d",ergebnis);
    fp = fopen("datei.dat","a");
    fprintf(fp,"%d + %d = %d\n",a,b,ergebnis);
    fclose(fp);
    
    getch();
    return;
    menue();
}

void laden()
{   
    int i,zahl_a[10],zahl_b[10],ergebnis[10];
    FILE *fp;
    
    i=0;
    fp = fopen("datei.dat","r");
    while (!feof(fp)) 
    { 
        fscanf(fp,"%d + %d = %d",&zahl_a[i],&zahl_b[i],&ergebnis[i]); 
        printf("%d + %d = %d",&zahl_a[i],&zahl_b[i],&ergebnis[i]);
        i++; 
    } 
    getch();
    return;
    menue();
}

Könnt ihr mir sagen wo der Fehler liegt?

P.S.: Bin noch ziemlicher C Noob. Können also ein paar doofe Fehler drin sein... :rolleyes:

mfg
LotB
 
OK, dass funktioniert schon mal. Danke :)

Aber ich habe noch ein Problem. Wenn eine Funktion zu Ende ist (z.B. taschenrechner()) und ich auf Enter drücke, werde ich nicht zu der Funktion menue() weitergeleitet, sondern das Programm wird einfach beendet. Aber ich habe, wie man in obigen Quellcode sehen kann, ganz ans Ende jeder Funktion menue() hingeschrieben. Wieso wird sie dann nicht aufgerufen?

mfg
LotB
 
jo, scheint zu funktionieren :)

aber es gibt zwei sachen die mich daran stören...

1. wenn man das programm startet, sieht man als erstes nur einen schwarzen bildschirm. erst wenn man ein mal auf enter drückt, bekommt man die menue() funktion zu sehen. was muss ich umschreiben, damit ich gleich was zu sehen bekomme?

2. wenn man z.b. die taschenrechner() funktion aufruft und sie zu ende ist, muss man 2 mal auf enter drücken um zurück zur menue() funktion zu kommen. was kann ich tun, dass ich nur einmal enter drücken muss?

mfg
LotB
 
moin


nochmal was zum ersten problem:
ich benutze MS Visual C 6 und habe die erfahrung gemacht das man vor einem getch() oder ähnlichem lieber erstmal ein fflush(stdin) machen sollte!


mfg
umbrasaxum
 
Hallo!

Das liegt daran, dass Deine menue() Funktion mit einer while Schleife staret.
Hier wird nämlich von der while Schleife erst mal ein zeichen eingelesen und auf ASCII 27 getestet. Ich würde es also mal mit einer do ... while Schleife probieren, welche die Schleife mindetstens einmal ausführt und dann erst testet:

aus:

void menue()
{
char eingabe;
while(getch()!=27)
{
printf("Der Taschenrechner");
.
.
.

mach:

void menue()
{
char eingabe;
do
{
printf("Der Taschenrechner");
.
.
.
}while(getch()!=27);
}

Achtung: Hierbei das ";" hinter dem while Statement nicht vergessen.

Somit sollte auch das Problem am Ende der Funktion "Taschenrechner" gelöst sein, da vorher an deren Ende und zu Beginn dee menue() Funktion getch() aufgerufen wurde und nun nur am Ende von "Taschenrechner".

MK
 
Ja, danke. Habe das mit der do...while Schleife schon gemacht :)

Aber du hast mir mit deinem Post trotzdem sehr viel weiter gehofen. Jetzt weiß ich nämlich auch wie man ein Programm mit ESC beendet. Ich habe als sowas hier probiert:

#27

da ich es so aus Pascal kenne.

Aber ein Problem habe ich noch. Da ich den Code nun schon ein bissel verändert habe, poste ich ihn nochmal komplett. Ich hoffe, dass niemand sauer ist:

Code:
#include <stdio.h> 
#include <conio.h> 
#include <windows.h>

void laden();
void taschenrechner();
void menue();

int main() 
{   
    menue();
    return 0;
}

void menue() 
{ 
    char eingabe;
    
    do 
    { 
     
      system("cls"); 
      
      printf("Der Taschenrechner"); 
      printf("\n\n <0> : Programm beenden"); 
      printf("\n <1> : Taschenrechner"); 
      printf("\n <2> : Protokollierung"); 
      eingabe = getch(); 
      
      switch(eingabe)                
      { 
          case '1': taschenrechner();                      
                  break; 
          case '2': laden(); 
                  break; 
          default: printf("Fehler bei der Eingabe");  
      } 
    } while (eingabe != '0'); 
    
    return;
} 

void taschenrechner()
{
    int a,b,ergebnis;
    char opperator;
    FILE *fp;
    
    system("cls");  
    
    printf("Geben Sie die erste Zahl ein : ");
    scanf("%d",&a);
    printf("\nGeben Sie die zweite Zahl ein : ");
    scanf("%d",&b);   
    printf("\nGeben Sie den Opperator ein : ");
    getchar();
    opperator = getchar(); 
    
    switch(opperator)    // variabel für operation eingeben              
    { 
        case '+': ergebnis = a + b;                      
                break; 
        case '-': ergebnis = a - b; 
                break; 
        case '*': ergebnis= a * b; 
                break; 
        case '/': ergebnis = a / b; 
                break; 
    } 
    
    printf("\nDas Ergebnis = %d",ergebnis);
    fp = fopen("datei.dat","a");
    fprintf(fp,"%d %c %d = %d\n",a,opperator,b,ergebnis);
    fclose(fp);
    
    getch();
    return;
}

void laden()
{   
    int i;
    char buf[1024];
    FILE *fp;
    
    system("cls");  
    
    fp = fopen("datei.dat","r");
    while (!feof(fp)) 
    { 
        fgets(buf,1024,fp); 
        printf("%s",buf);
    } 
    buf[i] = 0;
    fclose(fp); 
    getch();
    return;
}

Wenn man die Funktion laden() aufruft, wird die letzte Zeile der ausgelesenen Datei 2 mal angezeigt. Warum?

mfg
LotB
 
Ich habe noch ein Frage. Wenn ich zb einen Text eingeben will und diesen in einer Variablen speichern will, kann ich das ja zb so machen:

Code:
char text[100];
printf("Geben Sie einen Text ein : ");
fgets(text,100,stdin);

Was ist jetzt aber, wenn ich zb 5 Texte eingeben will und diese in einen Array speichern will? Da kann ich ja nicht folgendes schreiben:

Code:
char text[5];

da das ja die Anzahl der möglichen Zeichen wäre. Also, wie kann ich einen String Array mit 5 Elementen erzeugen und auf die einzelnen Elemente zugreifen?

mfg
LotB
 
Beide Probleme gelöst. Das erste mit der doppelten Ausgabe lag an dieser Zeile:

Code:
fprintf(fp,"%d %c %d = %d\n",a,opperator,b,ergebnis);

Muss so aussehen

Code:
fprintf(fp,"\n%d %c %d = %d",a,opperator,b,ergebnis);

Und ein "Array-String" geht so:

Code:
text[5][100]

Das generiert 5 Strings a 100 Zeichen.

Danke trotzdem für eure Hilfe :)

mfg
LotB
 
Original geschrieben von LordoftheBord

Aber ich habe noch ein Problem. Wenn eine Funktion zu Ende ist (z.B. taschenrechner()) und ich auf Enter drücke, werde ich nicht zu der Funktion menue() weitergeleitet, sondern das Programm wird einfach beendet. Aber ich habe, wie man in obigen Quellcode sehen kann, ganz ans Ende jeder Funktion menue() hingeschrieben. Wieso wird sie dann nicht aufgerufen?
Code:
void menue()
{
    char eingabe;
    
    printf("Der Taschenrechner");
    printf("\n\n  <1> : Taschenrechner");
    printf("\n  <2> : Protokollierung");
    getchar(); 
    eingabe = getchar(); 
     
    switch(eingabe)               
    { 
        case '1': taschenrechner();                      
                break; 
        case '2': laden(); 
                break; 
    } 

    return;
}
der fehler liegt darin, das du immer "return" benutzt, damit beendest du die funktion... bei der taschenrechner() funktion
Code:
    ...
    return;
    menue();
    ...

beendest du die funktion, bevor du die main() funktion wieder aufrufst... warum schreibst du da überall return hin?
 
Zurück