【问题标题】:Pascal programming help帕斯卡编程帮助
【发布时间】:2010-03-01 05:30:25
【问题描述】:

我之前发布了这个,但它被关闭了,因为我没有展示我的编码尝试,所以这里是一个问题:

SECTIONS
$160 = section 1
$220 = section 2
$280 = section 3
$350 = section 4
$425 = section 5

开发伪代码,接受作为输入的未指定数量的伪装者的名字,这些伪装者每个人都支付了他们的服装的全部费用和每个人已经支付的金额。

化装舞者可能已经支付了乐队五个部分中任何一个部分的服装费用。算法应该根据他/她为服装支付的金额来确定伪装者在哪个部分玩耍。该算法还应确定每个部分中支付服装费用的伪装者数量。

应打印人员姓名和他们支付的部分。还应打印各个部分的列表和注册参加每个部分的总人数,以及每个部分支付的总金额。

这是我的尝试: *注意这是用 Pascal 编程的,我需要帮助来修复它并完成它。请帮助并再次感谢。

program Masqueraders;

uses
  WinCrt;  { Allows Writeln, Readln, cursor movement, etc. }

const
   MAX = 5; {this determine the amount of masquarader entered}
Type
  listname = Array[1..MAX] of string;
  listsect = Array[1..MAX] of string;
var
 names : listname;
 sections : listsect;
 i, amount, TotalMas, TotalAmt, c1, c2, c3, c4, c5, amt1, amt2, amt3, amt4, amt5 :     integer;

begin

 amount := 1;
 while amount <> 0 do
 begin

      i := i + 1;
      readln(names[i]);
      readln(amount);

      if(amount = 160) then
      begin

                c1 := c1 + 1;  {Count the number of persons for section 1}
                amt1 := amt1 + amount; {accumulate the amount for section 1}
                sections[i] := 'Section 1';
      end;

      if(amount = 220) then
      begin

                c2 := c2 + 1;  {Count the number of persons for section 1}
                amt2 := amt2 + amount; {accumulate the amount for section 1}
                sections[i] := 'Section 2';
      end; {end the IF for section 2}

      if(amount = 280) then
      begin

                c3 := c3 + 1;  {Count the number of persons for section 1}
                amt3 := amt3 + amount; {accumulate the amount for section 1}
                sections[i] := 'Section 3';
      end; {end the IF for section 3}

      if(amount = 350) then
      begin

               c4 := c4 + 1;
               amt4 := amt4 + amount;
               sections[i] := 'Section4';
      end; {end If for section 4}

      if (amount = 425) then
      begin

               c5 := c5 + 1;
               amt5 := amt5 + amount;
               sections[i] := 'Section5';


  end;{end the while loop}

  TotalMas := c1 + c2 + c3;
  TotalAmt := amt1 + amt2 + amt3;


  writeln('Name                    Section');  {Heading for the output}
  for i := 1 to MAX do
  begin

       write(names[i]);
       writeln('                    ',sections[i]);

  end;


  writeln('Section 1: ');
  write('Masquader: ', c1);
  write('Amount: ', amt1);



  writeln('Total Number of Masquarader: ', TotalMas);
  writeln('Total Amount Paid by masquarader: ', TotalAmt);

结束; 结束。

简而言之,它应该接受一个未定义的人数,并根据他们输入的金额将他们分配到各自的部分,然后计算每个部分的人数。这是我当前的输出:

姓名 John Money=160 Section 1

姓名 Keith Money=220 Section John

这就是我想要的:

姓名 John Money=160 Section1

姓名 Keith Money=220 Section2

【问题讨论】:

  • 有效吗?如果没有,您会收到什么错误消息或不正确的输出?如果是这样,你认为它有什么问题?
  • 如果您的代码是 Pascal,那么它是 code,而不是伪代码。我认为您可以编辑问题标题以反映这一点。
  • 是的,你在写 idk 如何更改标题对不起
  • 第一个错误:代码中的拼写错误。

标签: algorithm pascal


【解决方案1】:

我对 Pascal 不是很熟悉,所以我无法告诉您如何 解决此问题,但我注意到的一个问题是您的代码似乎违反了“DRY”规则:不要重复自己。每个if amt = xxx 块中的代码看起来几乎完全相同,那么有没有一种方法可以编写一次该代码,然后每次使用不同的参数调用您的代码?这样你就不会重写相同的代码五次了。

【讨论】:

  • 它可以工作,但不是我想要的。它应该像这样工作...请输入您的姓名,然后当您输入您的姓名时,它应该询问您支付的金额,然后告诉您您在哪个部分在。在我运行它之后,它会这样做,但是当第二个人输入姓名和金钱时,它不会将它们分配给一个部分,而是将这个人分配给前一个人。例如 Josh=160 因此部分 1...Kelly=220 因此部分Josh idk 为什么这样做
  • @Echo 1 编辑问题本身,包括所有有助于帮助您的人的详细信息。准确记下您使用的输入、期望的输出以及获得的输出。
  • 你能为此使用数据库吗?为什么pascal为什么不用delphi
  • 是的,我们参与了电子表格、数据库和 Word 中的另一部分,所以它们都是链接的 idk 为什么我们使用 pascal..teacher 的命令:P
  • @drorhan,我不相信免费的 Turbo Delphi 已经存在了。 Free Pascal 是免费的,而且似乎正在积极开发中。
【解决方案2】:

以下是一些改进代码的提示:

  • 您是否认为有一种方法可以在最终循环中打印“Section {i}”而不使用section[i] 查找它,从而完全不需要数组?

  • 您如何构建它以使添加第 6 节不需要修改您的代码?

  • listname 和 listect 非常相似,您可以对您的代码进行哪些修改来消除两个相同定义的需要?

  • 如果用户在第三次提示时输入 0 会发生什么情况?

注意:这些提示之一应直接指出问题的根源。

【讨论】:

    【解决方案3】:

    以下是我看到的问题:

    1. 要求说“未指定数量的伪装者”,但您已将最大值设置为 5。如果伪装者可能超过 5 个,则不能将名称列表存储在固定大小的数组中.照原样,当用户进入第 6 个伪装者时,应用程序可能会崩溃或损坏内存(取决于您使用的 Pascal 版本)。 如果允许您在输入伪装者的姓名和部门后立即打印,那么您应该在用户输入姓名和金额后立即打印(而不是在输入 while 循环之后)。 但是,如果需要在所有输入后打印 Names 和 Sections 列表,则需要将 Name+Section 存储在可变长度数据结构中,如链表,甚至更简单的字符串。 p>

    2. 变量 c1 到 c5 和 amt1 到 amt5 最好声明为 1..MAX 的两个数组(c 和 amt),而不是 10 个变量。当用户输入金额时,使用它确定节号,然后可以将其用作 c 和 amt 数组的索引。

    3. 不确定您使用的是什么 Pascal 实现,但在使用之前初始化所有变量会更安全,否则它们可能包含不可预测的值。

    4. sections 数组是不必要的。它最终包含的只是不需要计算或存储的部分的标题。

    5. 如果您使用 repeat/until 循环而不是 while 循环,则可以避免顶部稍微笨拙的“amount := 1”初始化进入 while 循环。重复/直到将是直到 Amount = 0。

    6. TotalMas 只是将 c1 添加到 c3(c4 和 c5 呢)?

    7. TotalAmt 只是将 amt1 添加到 amt3(amt4 和 amt5 呢)?

    8. 用于打印名称和部分的 for 循环完全错误,请参见第 1 点和第 4 点。

    希望这会有所帮助,如果您需要澄清任何问题,请告诉我。

    【讨论】:

      【解决方案4】:

      我对这段代码的不满:

      1) 变量名很臭。几乎所有这些都太短了,他们不交流他们所做的事情。

      2) 这里使用了错误的循环控制结构。

      3) 我看到几乎相同的代码重复了 5 次。这简直是​​在呼唤数组。

      4) cmets 解释你在做什么,而不是你为什么这样做。其中一半几乎完全没用,如果你要评论一个结束,你应该简单地用它结束的身份来评论它。结尾; //如果我只看到一条甚至试图解释原因的评论,而你把人与部分混为一谈,你就搞错了。

      5) 您的sections 数组没有任何用处。对值的分配始终是固定的,因此根本没有理由存储它们 - 如果您需要标签,您可以在打印时创建它们。

      6) 你假设只有 5 个人。问题中没有给出 - 有 5 个部分

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        相关资源
        最近更新 更多