这是我的作业:http://oi40.tinypic.com/o9l3wn.jpg
概要
顺序访问文件"inf.txt"
包含一些学生记录,其中包含每个学生的以下内容:
编写C main函数来读取文件"inf.txt"
记录,首先计算每个学生的最终数字等级,然后使用下面的评分系统将其转换为字母等级,最后将每个学生的记录写入顺序访问文件"outf.txt"
。
"outf.txt"
文件的记录将包含每个学生的以下内容:
在读取和写入文件记录时,程序将使用struct
变量(即将声明和定义C结构以表示文件记录)。
评分系统:
NUMERIC:HOMEWORK 15%,MIDTERM 35%,FINAL 50%
信:0-40 FF,41-45 DD,46-52 DC,53-60 CC,61-69 CB,70-79 BB,80-89 BA,90 ++ AA。
要测试程序,您应该创建(使用任何编辑器)具有至少10条记录的输入文本文件(inf.txt
)。输入文件的典型记录可能如下所示:
ID FIRST NAME LAST NAME HOMEWORK MIDTERM FINAL
xx xxxxxxxxxx xxxxxxxxx 75 55 80
这就是我所拥有的。你能帮我吗?
#include <stdio.h>
#include <stdlib.h>
struct info
{
int ID, HWORK, MIDTERM, FINAL, NUMGRADE;
char NAME[20], LASTNAME[20];
} rec;
int main()
{
FILE *fptr1, *fptr2;
int NUMGRADE;
char LETGRADE[3] = "";
fptr1 = fopen("inf.txt.", "r");
fptr2 = fopen("outf.txt.", "w");
while(!feof(fptr1))
{
fscanf (fptr1, "%d %s %s %d %d %d", &rec.ID, rec.NAME, rec.LASTNAME, &rec.HWORK, &rec.MIDTERM, &rec.FINAL);
NUMGRADE = rec.HWORK * 0, 15 + rec.MIDTERM * 0, 35 + rec.FINAL * 0, 5;
if(NUMGRADE >= 0 && NUMGRADE <= 40) LETGRADE[3] = "FF";
else if (NUMGRADE >= 41 && NUMGRADE <= 45) LETGRADE[3] = "DD";
else if (NUMGRADE >= 46 && NUMGRADE <= 52) LETGRADE[3] = "DC";
else if (NUMGRADE >= 53 && NUMGRADE <= 60) LETGRADE[3] = "CC";
else if (NUMGRADE >= 61 && NUMGRADE <= 69) LETGRADE[3] = "CB";
else if (NUMGRADE >= 70 && NUMGRADE <= 79) LETGRADE[3] = "BB";
else if (NUMGRADE >= 80 && NUMGRADE <= 89) LETGRADE[3] = "BA";
else if (NUMGRADE >= 90) LETGRADE[3] = "AA";
fprintf (fptr2, "%d %s %s %d %s", &rec.ID, rec.NAME, rec.LASTNAME, &NUMGRADE, LETGRADE);
}
fclose(fptr1);
fclose(fptr2);
return 0;
}
答案 0 :(得分:1)
您需要做的第一件事是将错误检查添加到您调用的每个函数中。查看fopen
的文档。你如何判断呼叫是否失败?如果错误,您如何准确报告错误?最有可能的是,一旦你做了这些事情,问题就会变得很明显。
我的书中没有错误检查就可以编写代码。这是因为在您尝试完成功能时,添加错误检查会分散您的注意力。但是,您必须返回并添加错误检查,然后才能认为代码已完成。显然,你需要它来弄清楚代码无法正常工作的原因。
答案 1 :(得分:0)
在这里猜测,但我想你可能想要删除一些&amp;从这一行:
fprintf(fptr2,“%d%s%s%d%s”,&amp; rec.ID,rec.NAME,rec.LASTNAME,&amp; NUMGRADE,LETGRADE);
答案 2 :(得分:0)
在fprintf语句中,您不需要获取rec.ID或NUMGRADE
的地址fprintf (fptr2, "%d %s %s %d %s",rec.ID,rec.NAME,rec.LASTNAME,NUMGRADE,LETGRADE);
^^^^^^ ^^^^^^^
答案 3 :(得分:0)
如果你说它不起作用你的意思是它没有编译是因为你的代码中有很多错误。例如,以下代码行是错误的:
LETGRADE[3]="DD"
变量LETGRADE
是char
的数组,这意味着数组的每个元素都是char
,因此您无法将字符串分配给char。假设你的LETGRADE
数组必须存储两个你不需要的字符,它有三个大小(两个就足够了)。然后,您可以使用以下代码分配字符串AA
:
char LETGRADE[2];
/* ... */
LETGRADE[0] = 'A';
LETGARDE[1] = 'A';
答案 4 :(得分:-1)
试试这个:
#include <stdio.h>
#include <stdlib.h>
typedef struct info {
int ID,HWORK,MIDTERM,FINAL,NUMGRADE;
char NAME[20], LASTNAME[20];
} rec;
int main() {
FILE *fptr1,*fptr2;
int NUMGRADE;
char* LETGRADE="";
fptr1=fopen("inf.txt","r");
fptr2=fopen("outf.txt","w");
rec* reg = malloc(sizeof(rec));
while (EOF != fscanf(fptr1, "%d %s %s %d %d %d",®->ID,reg->NAME,reg->LASTNAME,®->HWORK,®->MIDTERM,®->FINAL)){
NUMGRADE=reg->HWORK*0.15+reg->MIDTERM*0.35+reg->FINAL*0.5;
if (NUMGRADE>=0 && NUMGRADE<=40) LETGRADE="FF";
else if (NUMGRADE>=41 && NUMGRADE<=45) LETGRADE="DD";
else if (NUMGRADE>=46 && NUMGRADE<=52) LETGRADE="DC";
else if (NUMGRADE>=53 && NUMGRADE<=60) LETGRADE="CC";
else if (NUMGRADE>=61 && NUMGRADE<=69) LETGRADE="CB";
else if (NUMGRADE>=70 && NUMGRADE<=79) LETGRADE="BB";
else if (NUMGRADE>=80 && NUMGRADE<=89) LETGRADE="BA";
else if (NUMGRADE>=90) LETGRADE="AA";
fprintf (fptr2, "%d %s %s %d %s\n",reg->ID,reg->NAME,reg->LASTNAME,NUMGRADE,LETGRADE);
}
fclose(fptr1);
fclose(fptr2);
return 0;
}