我需要创建一个应该是这样的程序:
“每个人留出一定数量的钱来给予并在所有他/她正在馈赠的人中平均分配这笔钱。不存在分数货币。如果礼品人决定在2个朋友之间划分5,他们将获得2在礼品夹的“帐户”中留下1个。
鉴于一群n个朋友,团体中每个人花在礼物上的钱,以及每个人送给他们的朋友名单,你的目标是确定每个人给予的钱多于他们收到的钱。“
它应该从名为gift.txt的文件中读取其输入。
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
char name[11];
int received;
int given;
} ppl;
int main()
{
FILE *file = fopen("D:\\Leo\\C Programs\\gift-giving\\gift.txt", "r");
int n, i, j, k, amt, ng, gift, amtgvn, diff;
char temp[11];
char temp2[11];
ppl friends[10];
fscanf(file, "%d", &n);
for(i=0; i<n; i++)
{
fscanf(file, "%s", temp);
strcpy(friends[i].name, temp);
}
for(i=0; i<n; i++)
{
fscanf(file, "%s", temp);
fscanf(file, "%d %d", &amt, &ng);
gift = amt/ng;
for(j=0; j<ng; j++)
{
fscanf(file, "%s", temp2);
for(k=0; k<n; k++)
{
if(strcmp(friends[k].name, temp2)==0)
{
friends[k].received = gift;
if(friends[k].received != 0)
{
friends[k].received += gift;
}
}
}
}
for(j=0; j<n; j++)
{
amtgvn = gift*ng;
if(strcmp(friends[j].name, temp)==0)
{
friends[j].given = amtgvn;
}
}
}
for(i=0; i<n; i++)
{
diff = friends[i].received - friends[i].given;
printf("%s %d", friends[i].name, diff);
}
fclose(file);
return 0;
}
我尝试使用包含以下内容的gift.txt文件
5
ryan
becky
owen
joel
mimi
ryan
200 3
becky
owen
joel
owen
500 1
ryan
mimi
150 2
joel
owen
becky
0 2
mimi
joel
joel
0 0
输出看起来像:
ryan 302
becky 66
owen -359
joel 141
mimi -150
但是每当我尝试运行它时都会出错。将显示一条消息,指出程序已停止工作(我在Windows上使用代码块)。
代码中的问题似乎是什么?
答案 0 :(得分:0)
错误是由0
除法引起的。输入文件的最后一行显示为:
0 0
读取这些数字后,amt = 0
和ng = 0
。然后继续计算amt/ng
,这会导致异常。
如果ng = 0
。
您可以添加
if ( ng == 0 )
{
continue;
}
在行
之前 gift = amt/ng;
您还使用未初始化的变量,这会导致未定义的行为。
这是一个更新的main
。
int main()
{
char inputFile[] = "D:\\Leo\\C Programs\\gift-giving\\gift.txt";
FILE *file = fopen(inputFile, "r");
int n, i, j, k, amt, ng, gift, amtgvn, diff;
char temp[11];
char temp2[11];
ppl friends[10];
fscanf(file, "%d", &n);
for(i=0; i<n; i++)
{
fscanf(file, "%s", temp);
strcpy(friends[i].name, temp);
friends[i].received = 0;
friends[i].given = 0;
}
for(i=0; i<n; i++)
{
fscanf(file, "%s", temp);
fscanf(file, "%d %d", &amt, &ng);
printf("name: %s\n", temp);
printf("amount: %d, ng: %d\n", amt, ng);
if ( ng == 0 )
{
continue;
}
gift = amt/ng;
for(j=0; j<ng; j++)
{
fscanf(file, "%s", temp2);
for(k=0; k<n; k++)
{
if(strcmp(friends[k].name, temp2)==0)
{
friends[k].received += gift;
}
}
}
for(j=0; j<n; j++)
{
amtgvn = gift*ng;
if(strcmp(friends[j].name, temp)==0)
{
friends[j].given = amtgvn;
}
}
}
for(i=0; i<n; i++)
{
diff = friends[i].received - friends[i].given;
printf("name: %s, received: %d, given: %d, diff: %d\n",
friends[i].name,
friends[i].received,
friends[i].given,
diff);
}
fclose(file);
return 0;
}