私は、ファイルからグレードのリストを読み、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;
}
grades.txtを投稿するか、その一部を投稿してください。あなたの入力ファイルの様子を理解する必要があります。 –
さて、ファイルの内容を追加しました。 –
sscanf()を使用すると、コードが簡単になります。 sscanf(singleLine、 "%s%c%f"、courseName、グレード、クレジット);ここで、courseNameはchar [20]、gradeはchar、gradeはfloat変数です。 –