0

私は自分のプログラムをほぼ完成させました。問題は、ポインターを使用したデバッグで少し問題があることです。どうすれば修正できるか、助けていただきたいです。悲しいことに、すべての関数プロトタイプが必要であることに注意してください。(メインで全部できれば課題はもっと楽だったのに…)

#include <stdio.h>
#include <stdlib.h>

#define STUDENTS 5

int getData(int *student, char *pass, int *hw1, int *hw2, int *hw3, int *hw4,
             int *hw5, int *hw6, int *hw7, int *mid1, int *mid2, int *final,
             int *extra);
float calcAvg(float *total);
float printTable(int student, float total);

int main(void)

{
    int student[STUDENTS];
    char pass[STUDENTS];
    int hw1[STUDENTS], hw2[STUDENTS], hw3[STUDENTS], hw4[STUDENTS], hw5[STUDENTS], hw6[STUDENTS], hw7[STUDENTS];
    int mid1[STUDENTS], mid2[STUDENTS];
    int final[STUDENTS];
    int extra[STUDENTS];
    float total[STUDENTS];

    getData(student, pass, hw1, hw2, hw3, hw4, hw5, hw6, hw7,
            mid1, mid2, final, extra);
    calcAvg(total);
    printTable(student, total);

system("pause");
return 0;
}

int getData(int *student, char *pass, int *hw1, int *hw2, int *hw3, int *hw4,
             int *hw5, int *hw6, int *hw7, int *mid1, int *mid2, int *final,
             int *extra)
{
    FILE *fpIn;
    int i;

    fpIn = fopen("data.txt", "r");
    if (!fpIn)
    {
        printf("File does not exist.");
        system("pause");
        exit (101);
    }

    for (i=0; i<STUDENTS; i++)
    {
        fscanf(fpIn, "%d", &student[i]);
        fscanf(fpIn, "%c", &pass[i]);
        fscanf(fpIn, "%d %d %d %d %d %d %d", hw1[i], hw2[i], hw3[i], hw4[i], hw5[i], hw6[i], hw7[i]);
        fscanf(fpIn, "%d %d", mid1[i], mid2[i]);
        fscanf(fpIn, "%d %d", final[i], extra[i]);
    }

    return;
}

float calcAvg(float *total)
{
    int hwtotal[STUDENTS], midtotal[STUDENTS];
    int i;

    for (i=0; i<STUDENTS; i++)
    {
        hwtotal[i] = hw1[i]+ hw2[i]+hw3[i]+hw4[i]+hw5[i]+hw6[i]+hw7[i];
        midtotal[i] = mid1[i]+mid2[i];
        total[i] = (hwavg[i]+midavg[i]+final[i]+extra[i])/3;
    }

    return total;
}

float printTable(int student, float total)
{
    int i;

    printf("==== ======= =======\n");
    printf(" ID   Score   Grade\n");
    printf("==== ======= =======\n");

    for(i=0; i<STUDENTS; i++)
    {
        printf("%d .1f  ", student[i], total[i]);

        if (total>90)
        printf("A\n");
        else if(total>80);
        printf("B\n");
        else if (total>70);
        printf("C\n");
        else if (total>60);
        printf("D\n");
        else
        printf("F\n");
    }

    return;
}
4

2 に答える 2

2

格納するデータごとに異なる配列を使用するのではなく、学生のすべての情報をカプセル化する構造体を作成することをお勧めします。

struct{ 
   int studentId;
   char pass;
   int hw[7]
   int mid[2];
   int final;
   int extra;
   float total;
} student;

 student mystudents[STDENTS];

問題が何であれ、よりコンパクトなデータ構造を使用すると検出が容易になり、変更が必要な場合も簡単になります。

于 2012-08-08T19:25:46.523 に答える
0

さて、あなたはあなたの問題を説明しませんでした、しかしこの部分が問題を引き起こすかもしれないように見えます。

int getData(...) {
    ...
    fscanf(fpIn, "%d %d %d %d %d %d %d", hw1[i], hw2[i], hw3[i], hw4[i], hw5[i], hw6[i], hw7[i]);
    fscanf(fpIn, "%d %d", mid1[i], mid2[i]);
    fscanf(fpIn, "%d %d", final[i], extra[i]);
    ...
}

intsfscanfを期待するsを渡しint *ます。あなたは以前に正しいことをしました

fscanf(fpIn, "%d", &student[i]);
fscanf(fpIn, "%c", &pass[i]);
于 2012-08-08T19:38:06.423 に答える