2017-10-17 41 views
0

我有空隙功能void isVaraRegistered應檢查是否有引入在regVaror varanummer數組中存在的號碼。如果引入的號碼已經存在,它應該從regVaror函數中斷開。我不知道該怎麼做。事實上,如何將isVaraRegistered設置爲true或false或任何組合。請幫忙!如何突破功能?

 //lager program lab 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdbool.h> 

#define DEPOSIT 10 
#define WORDLENGTH 30 
#define MAX 10 

struct varor{ 
    int varunummer; 
    char namn[WORDLENGTH]; 
    int lagersaldo; 
}; 
typedef struct varor Vara; 

Vara createVara(int varunummer, char namn[], int lagersaldo){ 
    Vara v; 
    v.varunummer=varunummer; 
    strcpy(v.namn, namn); 
    v.lagersaldo=lagersaldo; 
    return v; 
} 
void isVaraRegistered(Vara reg[], int varunummer){ 
    for(int n=0; n<MAX; n++){ 
     if(reg[n].varunummer==varunummer) { 
      printf("\nError! Varunummer finns redan!\n\n"); 

     } 
     break; 
    } 
} 

void regVaror(Vara reg[], int *pNrOfVaror){ 

    char confirm; 
    char namn[WORDLENGTH], 
      tmp[WORDLENGTH]; 
    int varunummer, lagersaldo; 
    printf("\nÄr du säkert att du vill registrera nya varor?\n1: Ja - (fortsätt)\n2: Nej - (gå tillbaka till menyn)\n"); 
    scanf(" %c%*c", &confirm);// %*c för att inte skippa raden dvs skipppa ange varunummer 
    switch(confirm){ 
    case '1': 
    do{ 
     printf("Ange varunummer:"); 
     gets(tmp); 
     varunummer=atoi(tmp); 
     isVaraRegistered(reg,varunummer); 


     printf("Ange namn:"); 
     gets(namn); 
     printf("Ange lagersaldo:"); 
     gets(tmp); 
     lagersaldo=atoi(tmp); 
     reg[*pNrOfVaror]=createVara(varunummer,namn,lagersaldo); 
     (*pNrOfVaror)++; 
     printf("\nRegristrera mer varor?\n1: Ja - (fortsätt)\n2: Nej - (gå tillbaka till menyn)\n"); 
     scanf(" %c%*c", &confirm); 
    }while(confirm=='1'); 

    case '2': break; 

    } 
} 


int main(){ 
    int run=1; 
    Vara vRegister[MAX]; 
    int nrOfVaror=0; 
    while(run){ 
     char choice; 
     printf("\n\t\tMeny - Lager Program\n\n\ 
     (1) Regristrera nya varor\n\b\b\b\b\ 
     (2) Skriva ut alla varor\n\ 
     (3) Söka efter varor\n\ 
     (4) Ändra lagersaldot för varor\n\ 
     (5) Sortera varor\n\ 
     (6) Avregristrera varor\n\ 
     (7) Avsluta programmet\n"); 
     scanf(" %c%*c", &choice); 

     if(choice=='1') regVaror(vRegister, &nrOfVaror); 
     else if(choice=='7') run=0; 


    } 
    return 0; 
} 
+1

要立即退出void函數,只需執行一個空的'return'語句,即'return;' –

+0

@dasblinkenlight這不起作用,它只是顯示錯誤消息,然後繼續與regVaror中的其餘代碼 –

+0

@TomKarzes這是行不通的,它只是顯示錯誤味精,然後保持與代碼的regVaror –

回答

0

一個直接返回將做到這一點,但我傾向於在特殊情況下傾向於更受控制的退出並讓函數運行。很顯然,有些情況下可以有多個回報,但我會盡量在開始時保持警惕,在完成前可能會遇到一些特殊情況。但我不會從循環內返回。只是讓我覺得髒:)

所以在你情我願實際上打破,你正在做的已經將反正返回...您的代碼是罰款。但我傾向於這種方法:

void isVaraRegistered(Vara reg[], int varunummer){ 
    int found = 0; 
    for(int n=0; found == 0 && n<MAX; n++){ 
     if(reg[n].varunummer==varunummer) { 
      printf("\nError! Varunummer finns redan!\n\n");//existing error msg 
      found++; 
     } 
    } 
} 

請注意,這只是一種個人編碼風格的東西。幾年前轉向C#,是我們公司推動標準化和編寫一種特定方式,而這種讓全功能運行的控制執行是首選。

---編輯: 我是在迴應的原代碼,你就從我開始響應更新。

順便說一句,應該將int設置爲返回類型並返回1或0,表示是或否給出函數的名稱並返回我介紹的found變量。然後在函數被調用的地方響應....並取出printf,因爲函數本身有一個責任就是回答「isVaraRegistered?」這個問題。任何用戶I/O都應在此功能之外完成。