使用C的礼品计划

时间:2015-06-12 05:18:33

标签: c

我需要创建一个应该是这样的程序:

“每个人留出一定数量的钱来给予并在所有他/她正在馈赠的人中平均分配这笔钱。不存在分数货币。如果礼品人决定在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上使用代码块)。

代码中的问题似乎是什么?

1 个答案:

答案 0 :(得分:0)

错误是由0除法引起的。输入文件的最后一行显示为:

0 0

读取这些数字后,amt = 0ng = 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;
}