2015-04-02 116 views
-1

該程序編譯好,但有時它會產生分割錯誤。我不斷得到分段錯誤:11錯誤,我不明白爲什麼... C++

程序應該讓用戶輸入學生姓名,理論成績(70%)和實際成績(30%)。這些數據應該保存到文件中,最後程序應該顯示/存儲學生的姓名和標記。

#include <iostream> 
#include <fstream> 

void disp(int); 
using namespace std; 
void stunames(int n) { 

    int count = 0; 
    string names; 

    cout << "Input student names :" << endl; 
    ofstream na("names.txt"); 

    while(count <= n) { 

     getline(cin,names); 
     na << names << endl; 
     count++; 
    } 
    na.close(); 
} 
void theomarks(int size) { 

    double marks; 
    int count = 0; 
    ofstream tho("T.txt"); 

    while(count < size) { 
     cin >> marks; 
     if((marks > 100) ||(marks < 0)){ 
      cout << "Invalid marks, Re-enter" << endl; 
      count = count-1; 
     } 
     else 
      tho << marks*.7 << endl; 
     count++; 
    } 

    tho.close(); 

} 
void pracmarks(int size) { 

    ofstream pr("P.txt"); 
    double marks; 
    int count = 0; 

    while(count < size) { 

     cin >> marks; 
     if((marks > 100) ||(marks < 0)){ 
      cout << "Invalid marks, Re-enter" << endl; 
      count = count-1; 
     } 
     else 
      pr << marks*.3 << endl; 
     count++; 
    } 
    pr.close(); 
} 


void calc(int size) { 

    ifstream na("names.txt"); 
    ifstream readr("T.txt"); 
    ifstream mo("P.txt"); 
    string x; 
    double pracc[1][size]; 
    double theory[1][size]; 
    cout << "NAME\t\tMARKS" << endl; 

    for(int row = 0; row < size; row++) { 

     for(int col = 0; col < 1; col++) { 

      mo >> pracc[row][col]; 
      readr >> theory[row][col]; 
      na >> x; 
      cout << x << "\t\t" << theory[row][col]+pracc[row][col]; 
     } 
     cout << endl; 
    } 
    readr.close(); 
    mo.close(); 
    na.close(); 
} 

int main() { 

    int no;  
    cout << "Input the number of student: " << endl; 
    cin >> no; 
    stunames(no); 
    cout << "Input Theory Paper Marks" << endl; 
    theomarks(no); 
    cout << "Input practical Paper Marks" << endl; 
    pracmarks(no); 
    calc(no); 

    return 0; 
} 
+0

行和列看起來混合起來。 – Grumbel 2015-04-02 20:18:50

+1

作爲學生在編程中可以做出的最佳投資是花一些時間學習使用調試器並熟練掌握它。傳奇程序員Donald Knuth曾經被問到他最喜歡的計算機語言是什麼,他的回答是「有一個好的調試器」。 – amdn 2015-04-02 20:20:06

回答

1

你做

mo>>pracc[row][col]; 

但是你的數組定義:

double pracc[1][size]; 

row必須高於1,那麼你會越過數組的邊界。你可能想要

double pracc[size][1]; 
+0

否,double prac [1] [size]意味着數組2 * size的大小,prac [1] [size] = {{21},{67},... n}; etc。 – rama41222 2015-04-02 20:23:13

+0

事實上,你的循環訪問pracc [row] [col],並且行高於1,所以你的數組定義是錯誤的。或者你可以保持數組定義相同,並執行[col] [row]。無論哪種方式工作。 – Almo 2015-04-02 20:25:55

+0

是的,謝謝!!!! – rama41222 2015-04-02 20:27:30

2

In expression pracc [row] [col];行和列範圍都搞亂了。行必須小於1; 使用:: std :: array代替C風格的數組會更好。它會在相應的時刻爲您提供適當的調試斷言,而不是突然出現分段故障。