2017-04-21 7 views
0

私は、ファイルからグレードのリストを読み、GPAを計算するプログラムを作った。計算とファイル読み込みの両方が同時に起こるので、私はこのようなプログラムを適切にモジュール化する方法を知らない。ここでコードを乱雑にすることなくファイルからデータを取得して分析するにはどうすればよいですか?

は、テキストファイルの内容である:ここで

Ariel Lewis 
Biology A 4.0 
Statistics C 4.0 
History A 3.0 
Tennis  A 1.0 
English B 3.0 

は私のコードは次のとおりです。注意すべき

#pragma warning (disable:4996) 


#include <stdio.h> 

#define MAX_LINE 20 

#define ERROR -1 

float GPA(int, int); 
int CoursePoints(int, int); 
int GradeToPoints(char); 


int main() 
{ 
FILE * fpCredits; 

char singleLine[MAX_LINE]; 
char gradeLetter = '_'; 
int totalPoints = 0; 
int totalCredits = 0; 
int credits = 0; 
int gradePoint = 0; 
int i = 0; 

/* 
fpCredits = fopen("grades.txt", "w"); 
fprintf(fpCredits, "Ariel Lewis\n"); 
fprintf(fpCredits, "Biology A 4.0\n"); 
fprintf(fpCredits, "Statistics C 4.0\n"); 
fprintf(fpCredits, "History A 3.0\n"); 
fprintf(fpCredits, "Tennis  A 1.0\n"); 
fprintf(fpCredits, "English B 3.0\n"); 
rewind(fpCredits); 
*/ 

fpCredits = fopen("grades.txt", "r"); 

// DISPLAY INFORMATION 
fgets(singleLine, MAX_LINE, fpCredits); 
for (i = 0; singleLine[i] != '\n'; i++) { 
    printf("%c", singleLine[i]); 
} 
printf("'s Grade Point Average Calculator\n\n"); 
printf("Course Name  Grade Earned  Number of Credits Earned\n"); 
while (!feof(fpCredits)) { 
    fgets(singleLine, MAX_LINE, fpCredits); 
    for (i = 0; singleLine[i] != ' '; i++) { 
     printf("%c", singleLine[i]); 
    } 
    printf(" "); 
    printf("\t"); 
    for (i = 0; singleLine[i] != '\0'; i++) { 
     if (singleLine[i] == 'A' || singleLine[i] == 'B' || singleLine[i] == 'C' || singleLine[i] == 'D' || singleLine[i] == 'F') { 
      if (singleLine[i - 1] == ' ' && singleLine[i + 1] == ' ') { 
       if (singleLine[i + 2] >= '0' && singleLine[i + 2] <= '4') { 
        credits = singleLine[i + 2] - '0'; 
       } 
       else { 
        printf("\n ERROR:FILE_SPACING \n"); 
        break; 
       } 
       gradeLetter = singleLine[i]; 
       printf("%c    %.1f", gradeLetter, (float)credits); 
      } 
     } 
    } 
    printf("\n"); 
} 
printf("\n"); 
rewind(fpCredits); 

// CALCULATE INFORMATION 
while (!feof(fpCredits)) { 
    fgets(singleLine, MAX_LINE, fpCredits); 
    for (i = 0; singleLine[i] != '\0'; i++) { 
     if (singleLine[i] == 'A' || singleLine[i] == 'B' || singleLine[i] == 'C' || singleLine[i] == 'D' || singleLine[i] == 'F') { 
      if (singleLine[i - 1] == ' ' && singleLine[i + 1] == ' ') { 
       if (singleLine[i + 2] >= '0' && singleLine[i + 2] <= '4') { 
        credits = singleLine[i + 2] - '0'; 
       } 
       else { 
        printf("\n ERROR:FILE_SPACING \n"); 
        break; 
       } 
       if (singleLine[i] == 'F') { 
        credits = 0; 
       } 
       totalCredits = totalCredits + credits; 
       gradePoint = GradeToPoints(singleLine[i]); 
       totalPoints = totalPoints + CoursePoints(gradePoint, credits); 
      } 
     } 
    } 
} 
rewind(fpCredits); 

printf("The GPA for this student is: %.2f and credits earned are: %d.\n\n", GPA(totalPoints, totalCredits), totalCredits); 

fclose(fpCredits); 

return 0; 
} 


float GPA(int points, int credits) 
{ 
    return (float)points/(float)credits; 
} 


int CoursePoints(int gradePoints, int credits) 
{ 
    return gradePoints * credits; 
} 


int GradeToPoints(char grade) 
{ 
switch (grade) { 
case 'A': 
    return 4; 
case 'B': 
    return 3; 
case 'C': 
    return 2; 
case 'D': 
    return 1; 
case 'F': 
    return 0; 
default: 
    printf("\n ERROR:DEFAULT \n"); 
    return ERROR; 
} 
printf("\n ERROR:SKIPPED \n"); 
return ERROR; 
} 
+0

grades.txtを投稿するか、その一部を投稿してください。あなたの入力ファイルの様子を理解する必要があります。 –

+0

さて、ファイルの内容を追加しました。 –

+0

sscanf()を使用すると、コードが簡単になります。 sscanf(singleLine、 "%s%c%f"、courseName、グレード、クレジット);ここで、courseNameはchar [20]、gradeはchar、gradeはfloat変数です。 –

答えて

0

まず最初:モジュール化は同じで読んで計算するそのOK、同時実行に関するものではありません実際の作業は、異なるモジュールで実行する必要があります。それは、どのようにこの「データセット」と連携し、

total grade = 0; 
total grade count = 0; 
for every grade in dataset: 
    print this grade 

    total grade += this grade; 
    total grade count++; 

print average grade 

は今、このアルゴリズムはファイルについて何も知りません:あなたはそれを動作させることができる方法

1つの提案は、あなたのアルゴリズムのための擬似コードで起動することですコード、1つのバリアント(擬似Cスタイル)に変換することができます。

グレードモジュール

実装することgrade.hファイル

にこれを置くことです
struct Grade { 
char gradeLetter; 
int gradeValue; 
int gradeCredits; 
} 

ファイルベースのデータセットモジュール

実装は

FILE* getDataSource() { 
    ///fopen.... 
} 

void closeDataSource(FILE*f) { 
    ///fclose 
} 

boolean hasMore(FILE*f) { 
    return !eof(f); 
} 

Grade getNextGrade(FILE*f) { 
    // your logic to read and parse string from file 
} 

メインモジュール

実装はこれがメインに置くことですFileBaseGradeDataSource.h/Cファイルにこれを置くことです。 c

FILE* datasource = getDataSource(); 

int totalPoints = 0; 
int totalCredits = 0; 
while (hasMore(datasource)) { 
    Grade grade = getNextGrade(datasource); 
    // printf, save 
} 
// print average 

closeDataSource(datasource); 
関連する問題