2017-10-17 3 views
0

私はvoidの関数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これは動作しません。エラーmsgを表示して、残りのコードをregVaror –

+0

@TomKarzesこれは動作していません、それは単にエラーmsgを表示し、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を設定し、関数名を指定してyesまたはnoを返す1または0を返し、導入したfound変数を返します。関数が呼び出される場所に応じて、関数 'isVaraRegistered?'に答える責任が関数自体にあるので、printfを取り出します。どのユーザーI/Oもこの機能の外で実行する必要があります。

関連する問題