2014-09-06 47 views
0

我的程序結構是這樣的: 主函數在兩個其他函數之間有一個菜單(開關)。 其中之一隻是一個計算,當它結束時,它會回到這個(主)菜單。 這正是我現在想要的(早些時候我想在計算後終止程序,並且在所有情況下我都有exit(0);。 但是另一個函數很棘手,因爲它啓動另一個函數(菜單)並且有兩種計算選項。它們還具有另一個開關如何在C中返回main()?

問題是,當我編輯其看起來像這樣的代碼通過除去出口(0);。

case 'H': 
     rhdp(0,n_hdp0, fw_vystup); 
     vyprazdni_buffer(); //buffer clearing 
     exit(0); 
     break; 

它僅適用於簡單的計算,但該程序的較深部分僅向後退一步... 任何可能的解決方案?提前致謝。


這裏是更多的代碼

void nhdp_menu(float cislo, FILE **fw_vystup) 
{ 
    char c; 
    float y, n_hdp0 = 0.0f, n_hdp1 = 0.0f; 
    do { 
     printf("Zadejte nominalni hruby domaci produkt daneho roku: "); 

    zadani_cisla(&cislo); 
    n_hdp1 = cislo; 
    } while (n_hdp1 <= 0); 
    do { 
     printf("Zadejte nominalni hruby domaci produkt predesleho roku: "); 
    zadani_cisla(&cislo); 
    n_hdp0 = cislo; 
    } while (n_hdp0 <= 0); 
    y = (n_hdp1 - n_hdp0)/n_hdp0 * 100; 
    printf("Tempo rustu nominalniho HDP je %f procent.\n", y); 
    zapis(fw_vystup, "Nominalni HDP0 = %f ; Nominalni HDP1 = %f ; Tempo rustu nominalniho HDP je %f procent.\n", n_hdp0, n_hdp1, y); 

    do { 
     printf("Dodatecne muzete take zjistit tempo rustu REALNEHO HDP:\n"); 
     printf("Pokud znate deflator HDP v danem roce - zadejte D.\n"); 
     printf("Pokud znate primo realne HDP v danem roce - zadejte H.\n"); 
     vyprazdni_buffer(); 
     scanf("%c", &c); 

     switch (c) {        //this is the last (deepest) switch 
      case 'd': 
      case 'D': 
       rhdp_ipd(0, n_hdp0, n_hdp1, fw_vystup); 
       vyprazdni_buffer(); 
       //exit(0); 
       break; 
      case 'h': 
      case 'H': 
       rhdp(0,n_hdp0, fw_vystup); 
       vyprazdni_buffer(); 
       //exit(0); 
       break; 
      case 'k': 
      case 'K': 
       printf("Konec programu.\n"); 
       break; 
      default: 
       printf("Neznama volba.\n"); 
       break; 
     } 
    } while (c != 'k' && c != 'K'); 
    return; 
} 

void tempo_menu(n_hdp0) 
{ 
    FILE *fw_vystup; 
    char c; 

    do { 
     printf("Vyberte si, v jakych cenach chcete HDP uvadet.\nPro nominalni zadejte N.\nPro realne zadejte R.\n"); 
     scanf("%c", &c); 
     vyprazdni_buffer(); 
     switch (c) { 
      case 'N': 
      case 'n': 
       nhdp_menu(0, &fw_vystup); //this here is starting another menu 
       vyprazdni_buffer(); 
       //exit(0); 
       break; 
      case 'R': 
      case 'r': 
       rhdp(0, 0, &fw_vystup); 
       vyprazdni_buffer(); 
       //exit(0); 
       break; 
      case 'k': 
      case 'K': 
       printf("Konec programu.\n"); 
       break; 
      default: 
       printf("Neznama volba.\n"); 
       break; 
     } 
    } while (c != 'k' && c != 'K'); 

    return; 
} 


int main(void) 
{ 
    char c; 
    FILE *fw_vystup; 
    do { 
     printf("Zadejte D pro vypocet deflatoru HDP nebo T pro vypocet tempa rustu HDP: "); 
     scanf("%c", &c); 
     vyprazdni_buffer(); 
     switch (c) { 
      case 'd': 
      case 'D': 
       deflator(0, &fw_vystup); //for this function everything goes well 
       // exit(0); 
       vyprazdni_buffer(); 
       break; 
      case 't': 
      case 'T': 
       tempo_menu(); 
       vyprazdni_buffer(); 
       // exit(0); 
       break; 
      case 'k': 
      case 'K': 
       printf("Konec programu.\n"); 
       break; 
      default: 
       printf("Neznama volba.\n"); 
       break; 
     } 
    } while (c != 'k' && c != 'K'); 
    return 0; 
} 
+0

您的問題並不十分清楚。請發佈完整的代碼示例。 – 2014-09-06 06:27:21

+4

'exit(0)'終止程序。爲了「返回主」,在你的函數中加入一個'return'語句。 – 2014-09-06 06:39:59

回答

0

編輯:

因此,這是假設你把return在所有的情況下,語句,因爲這是你想要的行爲。

直到您按下某些鍵之前,主要不打印的問題。在您的main功能中嘗試使用fflush(stdout)

int main(void) 
{ 
    char c; 
    FILE *fw_vystup; 
    do { 
     printf("Zadejte D pro vypocet deflatoru HDP nebo T pro vypocet tempa rustu HDP: "); 
     scanf("%c", &c); 
     vyprazdni_buffer(); 
     switch (c) { 
      case 'd': 
      case 'D': 
       deflator(0, &fw_vystup); //for this function everything goes well 
       vyprazdni_buffer(); 
       break; 
      case 't': 
      case 'T': 
       tempo_menu(); 
       vyprazdni_buffer(); 
       break; 
      case 'k': 
      case 'K': 
       printf("Konec programu.\n"); 
       break; 
      default: 
       printf("Neznama volba.\n"); 
       break; 
     } 

     fflush(stdout); // <--- right here. 
    } while (c != 'k' && c != 'K'); 
    return 0; 
} 
+0

感謝您的幫助,回報就是這麼做的。 (我只需要除了主開關之外的任何地方),但我有另一個問題...在返回之後,你必須點擊一兩個按鈕才能從主函數獲取printf ... – 2014-09-06 07:41:19

+0

我編輯了答案。清理流緩衝區似乎有問題。你還沒有提供'vyprazdni_buffer()'的代碼,所以它可能會導致麻煩? – PawelP 2014-09-06 07:57:01

+0

void vyprazdni_buffer(void) while(getchar()!='\ n') ; } – 2014-09-06 08:06:58