2013-12-13 46 views
-2

(注意:這是問題的更新版本) 因此,我正在升級之前處理過的項目。 現在,它將程序的輸出和組織成績一起打印到一個文件中。 到目前爲止,除了一個錯誤,一切都應該正常工作。 下面是代碼:在C++中重複聲明的問題

#include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 

struct Classes 
{ 
    double acousticGuitarEnsemble; 
    double biology; 
    double english; 
    double geometry; 
    double hebrew; 
    double jewishStudies; 
    double worldHistory; 
}; 

void grade1(Classes eitan) 
{ 
    newGrade1: 
    cout << "Which grade are you entering? (Use the following format: exampleFormat): "; 
    string classBeingEntered1; 
    cin >> classBeingEntered1; 
    cout << "Enter the new grade: "; 
    double grade1; 
    cin >> grade1; 
    cout << "Grade entered." << endl; 
    if (classBeingEntered1 == "acousticGuitarEnsemble") 
     eitan.acousticGuitarEnsemble = grade1; 
    else if (classBeingEntered1 == "biology") 
     eitan.biology = grade1; 
    else if (classBeingEntered1 == "english") 
     eitan.english = grade1; 
    else if (classBeingEntered1 == "jewishStudies") 
     eitan.jewishStudies = grade1; 
    else if (classBeingEntered1 == "geometry") 
     eitan.geometry = grade1; 
    else if (classBeingEntered1 == "hebrew") 
     eitan.hebrew = grade1; 
    else if (classBeingEntered1 == "worldHistory") 
     eitan.worldHistory = grade1; 
    else 
     cout << "Invalid class name. Try again." << endl; 
     goto newGrade1; 
} 

void grade2(Classes eitan) 
{ 
    newGrade2: 
    cout << "Which grade are you entering? (Use the following format: exampleFormat): "; 
    string classBeingEntered2; 
    cin >> classBeingEntered2; 
    cout << "Enter the new grade: "; 
    double grade2; 
    cin >> grade2; 
    cout << "Grade entered." << endl; 
    if (classBeingEntered2 == "acousticGuitarEnsemble") 
     eitan.acousticGuitarEnsemble = grade2; 
    else if (classBeingEntered2 == "biology") 
     eitan.biology = grade2; 
    else if (classBeingEntered2 == "english") 
     eitan.english = grade2; 
    else if (classBeingEntered2 == "jewishStudies") 
     eitan.jewishStudies = grade2; 
    else if (classBeingEntered2 == "geometry") 
     eitan.geometry = grade2; 
    else if (classBeingEntered2 == "hebrew") 
     eitan.hebrew = grade2; 
    else if (classBeingEntered2 == "worldHistory") 
     eitan.worldHistory = grade2; 
    else 
     cout << "Invalid class name. Try again." << endl; 
     goto newGrade2; 
} 

void grade3(Classes eitan) 
{ 
    newGrade3: 
    cout << "Which grade are you entering? (Use the following format: exampleFormat): "; 
    string classBeingEntered3; 
    cin >> classBeingEntered3; 
    cout << "Enter the new grade: "; 
    double grade3; 
    cin >> grade3; 
    cout << "Grade entered." << endl; 
    if (classBeingEntered3 == "acousticGuitarEnsemble") 
     eitan.acousticGuitarEnsemble = grade3; 
    else if (classBeingEntered3 == "biology") 
     eitan.biology = grade3; 
    else if (classBeingEntered3 == "english") 
     eitan.english = grade3; 
    else if (classBeingEntered3 == "jewishStudies") 
     eitan.jewishStudies = grade3; 
    else if (classBeingEntered3 == "geometry") 
     eitan.geometry = grade3; 
    else if (classBeingEntered3 == "hebrew") 
     eitan.hebrew = grade3; 
    else if (classBeingEntered3 == "worldHistory") 
     eitan.worldHistory = grade3; 
    else 
     cout << "Invalid class name. Try again." << endl; 
     goto newGrade3; 
} 

void grade4(Classes eitan) 
{ 
    newGrade4: 
    cout << "Which grade are you entering? (Use the following format: exampleFormat): "; 
    string classBeingEntered4; 
    cin >> classBeingEntered4; 
    cout << "Enter the new grade: "; 
    double grade4; 
    cin >> grade4; 
    cout << "Grade entered." << endl; 
    if (classBeingEntered4 == "acousticGuitarEnsemble") 
     eitan.acousticGuitarEnsemble = grade4; 
    else if (classBeingEntered4 == "biology") 
     eitan.biology = grade4; 
    else if (classBeingEntered4 == "english") 
     eitan.english = grade4; 
    else if (classBeingEntered4 == "jewishStudies") 
     eitan.jewishStudies = grade4; 
    else if (classBeingEntered4 == "geometry") 
     eitan.geometry = grade4; 
    else if (classBeingEntered4 == "hebrew") 
     eitan.hebrew = grade4; 
    else if (classBeingEntered4 == "worldHistory") 
     eitan.worldHistory = grade4; 
    else 
     cout << "Invalid class name. Try again." << endl; 
     goto newGrade4; 
} 

void grade5(Classes eitan) 
{ 
    newGrade5: 
    cout << "Which grade are you entering? (Use the following format: exampleFormat): "; 
    string classBeingEntered5; 
    cin >> classBeingEntered5; 
    cout << "Enter the new grade: "; 
    double grade5; 
    cin >> grade5; 
    cout << "Grade entered." << endl; 
    if (classBeingEntered5 == "acousticGuitarEnsemble") 
     eitan.acousticGuitarEnsemble = grade5; 
    else if (classBeingEntered5 == "biology") 
     eitan.biology = grade5; 
    else if (classBeingEntered5 == "english") 
     eitan.english = grade5; 
    else if (classBeingEntered5 == "jewishStudies") 
     eitan.jewishStudies = grade5; 
    else if (classBeingEntered5 == "geometry") 
     eitan.geometry = grade5; 
    else if (classBeingEntered5 == "hebrew") 
     eitan.hebrew = grade5; 
    else if (classBeingEntered5 == "worldHistory") 
     eitan.worldHistory = grade5; 
    else 
     cout << "Invalid class name. Try again." << endl; 
     goto newGrade5; 
} 

void grade6(Classes eitan) 
{ 
    newGrade6: 
    cout << "Which grade are you entering? (Use the following format: exampleFormat): "; 
    string classBeingEntered6; 
    cin >> classBeingEntered6; 
    cout << "Enter the new grade: "; 
    double grade6; 
    cin >> grade6; 
    cout << "Grade entered." << endl; 
    if (classBeingEntered6 == "acousticGuitarEnsemble") 
     eitan.acousticGuitarEnsemble = grade6; 
    else if (classBeingEntered6 == "biology") 
     eitan.biology = grade6; 
    else if (classBeingEntered6 == "english") 
     eitan.english = grade6; 
    else if (classBeingEntered6 == "jewishStudies") 
     eitan.jewishStudies = grade6; 
    else if (classBeingEntered6 == "geometry") 
     eitan.geometry = grade6; 
    else if (classBeingEntered6 == "hebrew") 
     eitan.hebrew = grade6; 
    else if (classBeingEntered6 == "worldHistory") 
     eitan.worldHistory = grade6; 
    else 
     cout << "Invalid class name. Try again." << endl; 
     goto newGrade6; 
} 

void grade7(Classes eitan) 
{ 
    newGrade7: 
    cout << "Which grade are you entering? (Use the following format: exampleFormat): "; 
    string classBeingEntered7; 
    cin >> classBeingEntered7; 
    cout << "Enter the new grade: "; 
    double grade7; 
    cin >> grade7; 
    cout << "Grade entered." << endl; 
    if (classBeingEntered7 == "acousticGuitarEnsemble") 
     eitan.acousticGuitarEnsemble = grade7; 
    else if (classBeingEntered7 == "biology") 
     eitan.biology = grade7; 
    else if (classBeingEntered7 == "english") 
     eitan.english = grade7; 
    else if (classBeingEntered7 == "jewishStudies") 
     eitan.jewishStudies = grade7; 
    else if (classBeingEntered7 == "geometry") 
     eitan.geometry = grade7; 
    else if (classBeingEntered7 == "hebrew") 
     eitan.hebrew = grade7; 
    else if (classBeingEntered7 == "worldHistory") 
     eitan.worldHistory = grade7; 
    else 
     cout << "Invalid class name. Try again." << endl; 
     goto newGrade7; 
} 

Classes gradeEditor(Classes eitan) 
{ 
    cout << "GradeBook 1.2" << endl; 
    grade1(eitan); 
    cout << "Editing next grade..." << endl; 
    grade2(eitan); 
    cout << "Editing next grade..." << endl; 
    grade3(eitan); 
    cout << "Editing next grade..." << endl; 
    grade4(eitan); 
    cout << "Editing next grade..." << endl; 
    grade5(eitan); 
    cout << "Editing next grade..." << endl; 
    grade6(eitan); 
    cout << "Entering next grade..." << endl; 
    grade7(eitan); 
    return eitan; 
} 

void choice(Classes eitan) 
{ 
    choiceBack: 
    cout << "Do you want to edit another grade? (If yes, you must reset all the grades) Press Y or N: "; 
    char chChoice; 
    cin >> chChoice; 
    switch (chChoice) { 
     case 'Y': 
      cout << "Alright then!" << endl; 
      do { 
      gradeEditor(eitan); 
      goto choiceBack; // Refers to beginning of choice() function 
      } while (chChoice == 'Y'); 
     case 'N': 
      cout << "Printing grades..." << endl; 
      break; 
     case 'y': 
      cout << "Alright then!" << endl; 
      do { 
      gradeEditor(eitan); 
      goto choiceBack; // Refers to beginning of choice() function 
      } while (chChoice == 'y'); 
     case 'n': 
      cout << "Printing grades..." << endl; 
      break; 
    } 
} 

void printGrades(Classes eitan) 
{ 
    cout << "Acoustic Guitar Ensemble: " << eitan.acousticGuitarEnsemble << endl; 
    cout << "Biology: " << eitan.biology << endl; 
    cout << "English: " << eitan.english << endl; 
    cout << "Jewish Studies: " << eitan.jewishStudies << endl; 
    cout << "Geometry: " << eitan.geometry << endl; 
    cout << "Hebrew: " << eitan.hebrew << endl; 
    cout << "World History: " << eitan.worldHistory << endl; 
    system("PAUSE"); 
} 

int main(Classes eitan) 
{ 
    ofstream outputFile; 
    outputFile.open("userGrades.txt"); 
    gradeEditor(eitan); 
    choice(eitan); 
    printGrades(eitan); 
    outputFile.close(); 
    cout << "Grades saved to file!" << endl; 
    return 0; 
} 

在類gradeEditor(),我進入7個年級。 但是,7次後不停止。 任何人看到如何解決這個問題? - Eitan P.S:我知道人們在使用goto時遇到了問題。但是我還沒有想出一種方法來在那裏爲那些特定的情況使用一種方法。所以除非你能告訴我一個更好的替代品,否則別提它。 P.P.S:此時,我並不清楚如何更好地格式化我的程序。我非常瞭解編程語法,但現在我已經做到了。

+0

那些' goto's應該是循環。 – chris

+0

您的'gradeX'函數永遠不會返回!他們只是在循環中永遠轉到! –

+0

而且,'gradeEditor()'和'gradeX()'函數之間沒有任何聯繫。他們應該返回什麼? –

回答

1

錯誤消息非常明確。問題不在return關鍵字。問題是試圖在不初始化的情況下使用變量。

Classes eitan; 
//several lines of code in which you do nothing with eitan, then: 
return eitan; 

如果您嘗試除return之外的其他內容,則會遇到同樣的錯誤消息。

如果您需要使用main中聲明的eitan,則將其作爲變量傳遞。

Classes gradeEditor(Classes& c) { 
    //stuff 
    return c; 
} 

,並調用它是這樣的:

gradeEditor(eitan); 

,做你所有void功能相同。

如果你不想傳遞變量,但想在多個函數中使用它,那麼你必須聲明它是一個全局變量。簡單地創建一個恰好在不同範圍內具有相同名稱的新變量並不會使這兩個變量指向相同的信息。


你卻被卡在無限循環,因爲:

else 
    cout << "Invalid class name. Try again." << endl; 
    goto newGrade2; 

沒有做什麼,你認爲它。你需要花括號:

else { 
    cout << "Invalid class name. Try again." << endl; 
    goto newGrade2; 
} 
+0

嗯,這是每個人都缺少的。我使用類eitan,因爲我在每個函數的結構中編輯變量。我只是將它分成不同的功能,以便更好地組織它。 –

+0

什麼?誰錯過了什麼? – nhgrif

+0

@ DJHead-On,​​您正在編輯*不同對象*中的變量。如果具有相同名稱並且在不同函數中本地定義的對象實際上都是同一個對象,則代碼將變得極不可維護。 – chris

0

你應該重寫代碼,並刪除所有的goto的,它被認爲是 不好的做法 - 至少在一種方案,你在做什麼。

您可以像這樣重寫choice函數,還要注意通過引用傳遞允許修改的函數。通過引用傳遞它 你可以修改它,這是你應該 在修改它的所有功能做,否則更改將 保持地方,因爲你正在傳遞一個副本功能

#include <cctype> // for std::toupper 

void choice(Classes& eitan) // pass by reference to modify argument 
{ 
    do 
    { 
    cout << "Do you want to edit another grade? (If yes, you must reset all the grades) Press Y or N: "; 
    char chChoice; 
    cin >> chChoice; 
    chChoice = std::toupper(chChoice); 
    switch (chChoice) 
    { 
     case 'Y': 
      cout << "Alright then!" << endl; 
      gradeEditor(eitan); 
      break; 
     case 'N': 
      cout << "Printing grades..." << endl; 
      break; 
     default: 
      cout << "Please answer Y or N!" << endl; 
      break; 
    } 
    } 
    while (chChoice != 'N'); 
} 
+0

什麼是std :: toupper要做的幫助?它的語法究竟是什麼? –

+0

它通過刪除一些重複的代碼來幫助 –