这段代码有错误吗void buy()//浏览全部菜单并点餐 { FILE *fp; int num,i=0; float s=0.0; if((fp=fopen("C:\\Users\\86159\\Desktop\\菜单.txt","a+"))==NULL) { printf("文件打开失败"); exit(0); }//打开文件 while(!feof(fp)) { fscanf(fp,"\t%s\t%f\n",p->name,&p->Price); printf("名称:%s",p->name); printf("\n价格为:%f\n",p->Price); } printf("您要点几道菜:"); scanf("%d",&num); for(i=0;i<num;i++) { printf("请输入第%d道菜名:",i+1); scanf("%s",na[i].name); } i=0; while(!feof(fp)) { fscanf(fp,"\t%s\t%f\n",p->name,&p->Price); if(strcmp(p->name,na[i].name)==0&&i<num) { s+=p->Price;i++; } } printf("您需付款%f元\n",s); fclose(fp); }
时间: 2024-03-23 20:41:08 浏览: 124
pta题库答案c语言.docx
有一些错误。
首先,在 `void buy()` 函数中,没有定义结构体 `p` 和 `na`。应该先定义它们,例如:
```
struct dish {
char name[20];
float Price;
};
struct dish menu[100]; // 定义一个菜单数组
struct order {
char name[20];
};
struct order na[100]; // 定义一个点餐数组
```
然后,在 `while(!feof(fp))` 循环中,没有给 `p` 赋值。应该使用循环变量 `i` 来遍历菜单数组 `menu`,例如:
```
while(!feof(fp))
{
fscanf(fp, "\t%s\t%f\n", menu[i].name, &menu[i].Price);
printf("名称:%s", menu[i].name);
printf("\n价格为:%f\n", menu[i].Price);
i++; // 遍历菜单数组
}
```
接着,在 `while(!feof(fp))` 循环后面,应该把文件指针重新定位到文件开头,以便后面再次遍历菜单数组。可以使用 `rewind(fp)` 函数来实现,例如:
```
rewind(fp); // 把文件指针重新定位到文件开头
```
最后,在第二个 `while(!feof(fp))` 循环中,如果已经读取到文件末尾,就不能再次读取文件了。应该用 `i < num && !feof(fp)` 来判断循环的结束条件,例如:
```
while(i < num && !feof(fp))
{
fscanf(fp, "\t%s\t%f\n", menu[i].name, &menu[i].Price);
if(strcmp(menu[i].name, na[i].name) == 0)
{
s += menu[i].Price;
i++;
}
}
```
此外,还有一些细节问题,例如:
- 在 `fopen` 函数中,应该使用双反斜杠(`\\`)来表示路径分隔符;
- 在 `scanf` 函数中,应该使用 `%f` 来读取浮点数;
- 在 `printf` 函数中,应该在字符串后面加上 `\n`,以便换行。
下面是修改后的代码:
```
void buy() // 浏览全部菜单并点餐
{
FILE *fp;
int num, i = 0;
float s = 0.0;
if((fp = fopen("C:\\Users\\86159\\Desktop\\菜单.txt", "a+")) == NULL)
{
printf("文件打开失败");
exit(0);
}
// 遍历菜单数组并输出
while(!feof(fp))
{
fscanf(fp, "\t%s\t%f\n", menu[i].name, &menu[i].Price);
printf("名称:%s\n", menu[i].name);
printf("价格为:%f\n\n", menu[i].Price);
i++;
}
rewind(fp); // 把文件指针重新定位到文件开头
printf("您要点几道菜:");
scanf("%d", &num);
for(i = 0; i < num; i++)
{
printf("请输入第%d道菜名:", i + 1);
scanf("%s", na[i].name);
}
i = 0;
// 遍历菜单数组并计算总价
while(i < num && !feof(fp))
{
fscanf(fp, "\t%s\t%f\n", menu[i].name, &menu[i].Price);
if(strcmp(menu[i].name, na[i].name) == 0)
{
s += menu[i].Price;
i++;
}
}
printf("您需付款%f元\n", s);
fclose(fp);
}
```
阅读全文