此程序的目的是询问用户输入将在二进制文件中输入多少次考试。当我们获得用户输入时,例如5,do while循环要求输入考试的课程名称和收到的成绩。这将被写入exams.bin并打开以供阅读并找到用户输入的关键字的出现,该关键字应该计算等级平均值。它找到该特定课程的成绩,将它们相加并将它们与参加考试的学生数量(课程名称的重复次数)分开。然后打印出一个浮子。这一切都在下面的代码中工作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char courseName[30];
int grade;
} exam;
int main()
{
exam firstExam, secondExam;
int examNumber, i = 1, j = 1, gradeSum = 0, studentNumber = 0, mostFreq = 0;
float gradeAverage;
char subjectName[30];
char mostFrequent[30];
FILE *pointerBinExam = NULL;
char fileName[13] = "exams.bin";
pointerBinExam = fopen(fileName, "w+b");
if(pointerBinExam == NULL)
{
printf("File doesn't exist!");
exit(EXIT_FAILURE);
}
printf("How many exams will you input: ");
scanf("%d", &examNumber);
fflush(stdin);
do{
printf("\nCourse name: ");
fgets(firstExam.courseName, 30, stdin);
printf("\nGrade: ");
scanf("%d", &firstExam.grade);
fwrite(&firstExam, sizeof(exam), 1, pointerBinExam);
fflush(stdin);
i++;
}while(i < examNumber+1);
rewind(pointerBinExam);
printf("\nInput the name of the course you wish to calculate grade average: ");
fgets(subjectName, 30, stdin);
do{
fread(&secondExam, sizeof(exam), 1, pointerBinExam);
if (strncmp(subjectName, secondExam.courseName, 30) == 0){
gradeSum += secondExam.grade;
studentNumber += 1;
}
j++;
}while(j < examNumber+1);
gradeAverage = (float)gradeSum/studentNumber;
printf("\nNumber of students who took the exam: %d\n", studentNumber);
printf("\nGrade average: %f", gradeAverage);
studentNumber = 0;
rewind(pointerBinExam);
strcpy(mostFrequent, secondExam.courseName);
rewind(pointerBinExam);
do{
fread(&secondExam, sizeof(exam), 1, pointerBinExam);
if (strncmp(mostFrequent, secondExam.courseName, 30) == 0){
mostFreq += 1;
studentNumber += 1;
}
j++;
}while(j < examNumber+1);**
fclose(pointerBinExam);
return 0;
}
代码的最后一部分,new do while循环对我的问题不是一个好方法。我的目标是将指针放在二进制文件的开头并再次读取它。它应该在二进制文件中找到最常用的课程名称。我该怎么做呢?是否有一个我不知道的命令,或者是否应该使用2D数组来处理二进制中的字符串。我一无所知,只是开始理解二进制文件,这是我需要练习的测试任务。任何提示都将受到高度赞赏!
答案 0 :(得分:0)
要找出最常用的课程,如果二进制文件是由exam
形式的记录构成的,你需要从头到尾阅读文件,然后为每门课程设置一些计数器。 / p>
这可以通过多种方式完成,例如:将每个课程名称编码为一个唯一的整数,然后每次在文件中找到相同的课程时计算++ 1,或者您可以找到遇到的课程列表然后搜索列表 - 如果您发现相同的课程添加到计数器或添加新的列表中的节点,计数器= 1