2013-04-30 150 views
-2

我遇到了修复这个无限循环的问题。 我已经做了一些测试,所以我很确定循环不是在读取文件时。 紧跟在“printReportHeading();”之后是一个for循环。我很确定这是导致问题的原因。 我将如何去解决这个问题。 这与2维数组的初始化有关吗?无限循环与二维数组

代码:

int main(void) 
    { 
    FILE* fileIn; 
    FILE* printFile; 

    float average; 

    char letterGrade; 

    int wholeArray [MAX_STUDENTS][MAX_PROFILE], 
      letterFreq[5]; 

    printInstructions(); 

    fileIn = fopen("input11.dat", "r"); 

    if(fileIn == NULL) 
    { 
      printf("\n\nFILE COULD NOT BE LOCATED\n\n"); 
    } 
    else 
    { 
      printFile = fopen("upchurch.txt", "w"); 

      loadData(fileIn, wholeArray); 

      printReportHeading(); 

      for(int row = 0; row < MAX_STUDENTS; row++) 
      { 
        average = calcAverage(wholeArray); 
        letterGrade = determineLetter(average); 
        printLine(printFile, wholeArray, average, letterGrade); 

        switch(letterGrade) 
        { 
          case 'A': 
            letterFreq[0]++; 
            break; 
          case 'B': 
            letterFreq[1]++; 
            break; 
          case 'C': 
            letterFreq[2]++; 
            break; 
          case 'D': 
            letterFreq[3]++; 
            break; 
          default: 
            letterFreq[4]++; 
            break; 
        } 
      } 

      printHighScores(printFile, wholeArray); 
      printLowScores(printFile, wholeArray); 
      printAverageScores(printFile, wholeArray); 
      fprintf(printFile, "---------------------------------------------\n"); 

      printHistogram(printFile, letterFreq); 
    } 

    return; 
} 


/****************************************************************************** 
*Prints the instructions to the user* 
******************************************************************************/ 
void printInstructions(void) 
{ 
    printf("=================================================================\n"); 
    printf("= This program takes up to 40 student's ID and five quiz grades =\n"); 
    printf("= then finds each students letter grade, average of each quiz, =\n"); 
    printf("= highest and lowest grade of each quiz, and creates a   =\n"); 
    printf("= histogram of all of the students letter gradesa as a whole. =\n"); 
    printf("=================================================================\n\n"); 

    return; 
} 
/****************************************************************************** 
*Gets the data from the file for the user* 
******************************************************************************/ 
int loadData(FILE* fileIn, int wholeArray[][MAX_PROFILE]) 
{ 
    for(int i = 0; i < MAX_STUDENTS; i++) 
      for(int j = 0; j < MAX_PROFILE; j++) 
      { 
        fscanf(fileIn, "%d", &wholeArray[i][j]); 
      } 

    return 0; 
} 
/****************************************************************************** 
*Prints the report heading* 
******************************************************************************/ 
void printReportHeading() 
{ 
    printf("Student Quiz 1 Quiz 2 Quiz 3 Quiz 4 Quiz 5 Average Letter\n"); 

    return; 
} 

/****************************************************************************** 
*Calculates each student's average and letter grade* 
******************************************************************************/ 
float calcAverage (int wholeArray[][MAX_PROFILE]) 
{ 
    int totalGrades = 0; 

    for (int i = 1; i < MAX_PROFILE; i++) 
    { 
    totalGrades += *wholeArray[i]; 
    } 


    return (totalGrades/5.0f); 
} 
/****************************************************************************** 
*Finds the letter grade* 
******************************************************************************/ 
char determineLetter(float average) 
{ 
    char letterGrade; 

    if (average >= 90) 
      letterGrade = 'A'; 
    else if (average >= 80) 
      letterGrade = 'B'; 
    else if (average >= 70) 
      letterGrade = 'C'; 
    else if (average >= 60) 
      letterGrade = 'D'; 
    else 
      letterGrade = 'F'; 

    return letterGrade; 
} 
/****************************************************************************** 
Prints a line of students information 
******************************************************************************/ 
void printLine(FILE* printFile, int wholeArray[][MAX_PROFILE], float average, char letterGrade) 
{ 
    for(int i = 0; i <= MAX_STUDENTS; i++) 
     for(int j = 0; j < MAX_PROFILE; j++) 
     { 
      fprintf(printFile, "%d", wholeArray[i][j]); 
      if ((j = MAX_PROFILE)) 
      { 
       printf("%3.2f", average); 
       printf("%c", letterGrade); 
       j = 0; 
      } 
     } 
    fprintf(printFile, "---------------------------------------------------\n"); 

    return; 
} 

/****************************************************************************** 
Find the high score of each quiz 
******************************************************************************/ 
void printHighScores(FILE* printFile, int wholeArray[][MAX_PROFILE]) 
{ 
    int highestTest = 0; 

    fprintf(printFile, "High "); 

    for (int i = 1; i < MAX_PROFILE; i++) 
    { 
      for(int j = 0; j < MAX_STUDENTS; j++) 
      { 
        if (highestTest < wholeArray[j][i]) 
        { 
          highestTest = wholeArray[j][i]; 
        } 
      } 

      fprintf(printFile, "%3d", highestTest); 
    } 
    return; 
} 

/****************************************************************************** 
Finds the low score of each quiz 
******************************************************************************/ 
void printLowScores(FILE* printFile, int wholeArray[][MAX_PROFILE]) 
{ 
    int lowestTest = 100; 

    fprintf(printFile, "Low "); 

    for (int i = 1; i < MAX_PROFILE; i++) 
    { 
      for(int j = 0; j < MAX_STUDENTS; j++) 
      { 
        if (lowestTest > wholeArray[j][i]) 
        { 
          lowestTest = wholeArray[j][i]; 
        } 
      } 

      fprintf(printFile, "%3d", lowestTest); 
    } 
    return; 
} 

/****************************************************************************** 
Finds the average score of each quiz 
******************************************************************************/ 
void printAverageScores(FILE* printFile, int wholeArray[][MAX_PROFILE]) 
{ 
    float averageTest = 0.0; 

    int i; 

    fprintf(printFile, "Average "); 

    for (i = 1; i < MAX_PROFILE; i++) 
    { 
      for(int j = 0; j < MAX_STUDENTS; j++) 
      { 
        averageTest += wholeArray[j][i]; 

      } 
      averageTest = averageTest/i; 

      fprintf(printFile, "%5.2f", averageTest); 
    } 
    return; 
} 

/****************************************************************************** 
Prints histogram of letter frequency 
******************************************************************************/ 
void printHistogram(FILE* printFile, int letterFreq[5]) 
{ 
    for (int i = 0; i < 5; i++) 
    { 
      for (int j = 1; j <= letterFreq[i]; j++) 
        printf("*"); 
      printf("\n"); 
    } 
    return; 
} 
+0

如果问题是一个无限循环(而不是说通过'printFile'是NULL导致崩溃),循环必须在代码中你没有向我们展示。你可以编辑你的问题,包括'loadData','calcAverage','determineLetter'和'printLine'的代码吗? – simonc 2013-04-30 13:27:52

+0

我添加了其余的代码,感谢您的兴趣@simonc – 2013-04-30 13:46:24

+0

除非MAX_STUDENTS正在更改值或无法通过'int row'访问的数字,否则主循环中无法解决问题。请显示您的其他功能,以及如何定义MAX_STUDENTS。一定要通过调试器逐步完成代码,无限循环应该很容易找到。 – Mike 2013-04-30 13:47:01

回答

1

printLine,您有:

if ((j = MAX_PROFILE)) 
{ 
    … 
    j = 0; 
} 

有两件事情错。首先,j = MAX_PROFILE是一项任务,而不是比较。它将j设置为MAX_PROFILE并计算结果为真,从而导致执行if的正文。

然后if的主体将j设置为零。这会导致内部循环无限期地重复。

我怀疑你打算在这里打印的平均和打印学生的个人资料的所有行后的等级。在这种情况下,只需在j的循环之后打印它们,仍然在i的循环内。没有必要进行测试,也不需要将j设置为零。

+0

好的无限循环现在已经消失了,但是当我运行代码时,我总是收到一堆乱码。 – 2013-04-30 14:02:12

+1

@JesUppy:您应该测试和调试程序的各个部分。在从其他例程调用它之前,确保每个例程都做到了你想要的。 – 2013-04-30 14:06:59

+0

雅,可悲的是我没有这样做,一切都是混乱的......一个好的建议。我会在下次尝试,肯定 – 2013-04-30 14:13:23

1

这可能不是您的错误的原因,但letterFreq从不初始化,因此printHistogram调用未定义的行为,并可能最终打印数十亿的“*”。造成这种情况的解决方法是简单地阵列成员初始化为0

letterFreq[5] = {0}; 
+0

感谢您的补充,但! – 2013-04-30 13:59:33