2016-12-02 124 views
0

我要從.ssv文件讀取數據並創建一個包含名稱,ID,Exam1,Exam2,Project1,Project2,Average和Grade(letter)的學生數據庫。平均數不在文件中,因此必須進行計算。我不確定我的平均計算和結構聲明。任何其他修補程序將受到歡迎。c中的結構數組

#include <stdio.h> 

typedef struct { 
    char name[26]; 
    int I_D[25]; 
    int exam[3]; 
    int project[3] 
    float average[3]; 
    char grade[3]; 
} STUDENT; 

void printStuAry(int size, STUDENT stuAry[]); 


int main(int argc, char* argv[]) 
{ 
    if (argc != 2) { 
     printf("ERROR\n"); 
     return 1; 
    } 

    STUDENT stuAry[5]; 

    FILE* f = fopen(argv[1], "r"); 
    if (f == NULL) { 
     printf("Error opening file %s.\n", argv[1]); 
     return 1; 
    } 

    char line[65]; 
    int ind = 0; 
    while (fgets(line, sizeof(line), f) != NULL) { 
     sscanf(line, "%25[^;] ; %d %d %d %d %d %c", 
           stuAry[ind].name, 
           &stuAry[ind].I_D, 
           &stuAry[ind].exam[0], 
           &stuAry[ind].exam[1], 
           &stuAry[ind].project[0], 
           &stuAry[ind].project[1] 
           &stuAry[ind].grade); 


    float stuAry.average = stuAry.exam[0] + stuAry.exam[1] + stuAry.project[0] + stuAry.project[1]/4; 
    ind++; 
    } 
    printStuAry(5, stuAry); 


    if (fclose(f) == EOF) { 
     printf("Error closing file %s.\n", argv[1]); 
     return 1; 
    } 

    return 0; 
} 

void printStuAry(int size, STUDENT stuAry[]) 
{ 
    for (int i=0; i<size; i++) { 
     printf("Student \"%s\" score %d, %d and %d and %d on midterms, " 
        "and %c on the final.\n", 
        stuAry[i].name, stuAry[i].exam[0], 
        stuAry[i].exam[1], stuAry[i].project[0], 
        stuAry[i].project[1], stuAry[i].average, 
        stuAry[i].final); 
    } 
} 
+1

建議不是一個解決方案。結構元素的順序會節省一些空間。整理char變量。 –

+1

你知道如何用手計算平均值嗎?你有沒有測試過你的代碼?你在運行時使用調試器來查看一些變量值嗎? – Ripi2

+0

@ Ripi2我已編譯它並收到一些錯誤。其中之一是'錯誤:無效的操作數到二進制*(有'int *'和'int')' – josmar

回答

1

我不會爲你重寫代碼,只是指出你的錯誤。

int I_D[25]; why an array for the id, just an integer

int exam[3];

int project[3]

  • 因爲你只有2次考試和2個項目,大小應該是2
  • 失蹤;

float average[3];

char grade[3];

不應該陣列...

while (fgets(line, sizeof(line), f) != NULL) { sscanf(line, "%25[^;] ; %d %d %d %d %d %c", etc...

正確的參與方式DA格式良好的文件是這樣的:

while(7 == fscanf(f, "%25[^;] ; %d %d %d %d %d %c", etc..)) 

float stuAry.average = stuAry.exam[0] + stuAry.exam[1] + stuAry.project[0] + stuAry.project[1]/4;

  • 圓括號總和
  • 除以4.0以避免整數除法,並得到一個浮子除法與float結果
  • 索引陣列由[ind]爲當前學生工作。

stuAry[ind].average = (stuAry[ind].exam[0] + stuAry[ind].exam[1] + stuAry[ind].project[0] + stuAry[ind].project[1])/4.0;

有可能是其他錯誤,但是這應該給你一些好的開始

+1

我修改了我的代碼根據你的建議,我留下了一個編譯錯誤'錯誤:無效操作數到二進制+ (有'int *'和'int *')',錯誤在line49'stuAry [ind] .avg =(stuAry [ind] .exam1 + stuAry [ind] .exam2 + stuAry [ind] .project1 + stuAry [ind ] .project2)/4.0;' – josmar

+0

你是如何在struct中聲明'exam1'和'exam2','project1','project2'的?作爲數組?他們不應該是數組。 –

+0

好的我的程序運行,但有記錄如何打印問題。由於該文件是records.ssv如何構造我的sscanf。 – josmar