2016-12-02 125 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