【问题标题】:Pointers, counter gets confused指针,计数器变得混乱
【发布时间】:2015-12-05 17:27:03
【问题描述】:

我正在尝试编写一个程序来计算需要多少张钞票来支付工人的工资。在每个工人之后,它应该显示该工人获得了多少张钞票,以及哪些钞票。而当没有工人离开时,它应该显示所有工人得到了多少张钞票。到目前为止一切顺利。

但事情是这样的:每当一名工人获得 20 土耳其里拉(土耳其里拉)时,该账单就被视为 50 土耳其里拉。但是在程序中,当写多少张钞票时,程序会将 20 张钞票算作 20 张钞票,而不是 50 张。你会明白我在图片中的意思。这 7 个数字分别代表 200、100、50、20、10、5 和 1 里拉的钞票。其他点钞机工作正常。但是程序认为 20 个 TL 是 50 个 TL。即使程序最后显示正确的数字。

如您所见,第 4 名工人得到 20 里拉,但在下一行中说“给他一张 50 里拉的钞票”,就像第 9 名工人一样。其他工人的钞票和总钞票数是正确的,尽管它显示 20TL 钞票为 50TL

#include <stdio.h>
#include <stdlib.h>

void banknot(int, int *, int *, int *, int *, int *, int *, int *);

int ikiyuztl_top=0,yuztl_top=0,ellitl_top=0,yirmitl_top=0,ontl_top=0,bestl_top=0;
int birtl_top=0;

int main()
{
int i, personel, tam;
double maas;
int ikiyuztl=0,yuztl=0,ellitl=0,yirmitl=0,ontl=0,bestl=0;
int birtl=0;

int *ikiyuztl_ptr, *yuztl_ptr, *ellitl_ptr, *yirmitl_ptr, *ontl_ptr, *bestl_ptr;
int *birtl_ptr;

ikiyuztl_ptr=&ikiyuztl;
yuztl_ptr=&yuztl;
ellitl_ptr=&ellitl;
yirmitl_ptr=&ellitl;
ontl_ptr=&ontl;
bestl_ptr=&bestl;
birtl_ptr=&birtl;

printf("Personel sayisini giriniz:\n"); /* It means "How many workers are there?" */
scanf("%d",&personel);

for (i=1; i<=personel; i++) {
    printf("%d. personelin maasini TL cinsinden giriniz\n",i); /*Write salary*/
    scanf("%lf",&maas);

    tam=maas;

    banknot(tam,ikiyuztl_ptr,yuztl_ptr,ellitl_ptr,yirmitl_ptr,ontl_ptr,bestl_ptr,birtl_ptr);

    printf("%d %d %d %d %d %d %d\n",ikiyuztl,yuztl,ellitl,yirmitl,ontl,bestl,birtl);

}

printf("%d %d %d %d %d %d %d\n",ikiyuztl_top,yuztl_top,ellitl_top,yirmitl_top,ontl_top,bestl_top,birtl_top);

return 0;

}

void banknot(int tam, int *ikiyuztl, int *yuztl, int *ellitl, int *yirmitl, int *ontl, int *bestl, int *birtl)
{
*ikiyuztl=0;
*yuztl=0;
*ellitl=0;
*yirmitl=0;
*ontl=0;
*bestl=0;
*birtl=0;

while (tam>=200) {
    *ikiyuztl = *ikiyuztl + 1;
    ikiyuztl_top++;
    tam=tam-200;
}

while (tam>=100) {
    *yuztl = *yuztl + 1;
    yuztl_top++;
    tam=tam-100;
}

while (tam>=50) {
    *ellitl = *ellitl + 1;
    ellitl_top++;
    tam=tam-50;
}

while (tam>=20) {
    *yirmitl = *yirmitl + 1;
    yirmitl_top++;
    tam=tam-20;
}

while (tam>=10) {
    *ontl = *ontl + 1;
    ontl_top++;
    tam=tam-10;
}

while (tam>=5) {
    *bestl = *bestl + 1;
    bestl_top++;
    tam=tam-5;
}

*birtl = tam;
birtl_top = birtl_top+tam;
}

【问题讨论】:

  • 它在哪里打印工人得到多少报酬?唯一的打印语句(在输入提示之外)只打印数字。
  • @ScottHunter 我猜每个工人的工资是用户输入(scanf("%lf", ...)),打印输出列出了每种纸币的纸币数量(200、100、50、20?,. ..).
  • @ScottHunter 是的,我正在给出一个工人得到多少的程序(例如 2364 TL),它应该告诉我工人应该得到多少钞票(11 1 1 0 1 0 4对于 2364 TL)

标签: c pointers counter


【解决方案1】:

错误在第20行:

...
yirmitl_ptr=&ellitl;  // Should be yirmitl_ptr=&yirmitl;
...

请注意,如果您简单地省略这些 _ptr 变量并像这样调用您的 banknot 函数,您可以节省大量输入:

banknot(tam, &ikiyuztl, &yuztl, ...)

【讨论】:

    【解决方案2】:

    您在这一行犯了复制和粘贴错误:

    yirmitl_ptr=&ellitl;
    

    因此,banknot 函数更新了错误的计数器变量(ellitl 而不是 yirmitl)。

    应该是:

    yirmitl_ptr=&yirmitl;
    

    补充说明:

    您不需要所有这些*_ptr 变量。只需在 banknot 调用中通过引用传递计数器:

    banknot(tam,&ikiyuztl,&yuztl,&ellitl,&yirmitl,&ontl,&bestl,&birtl);
    

    【讨论】:

    • 我知道,但我应该在其中使用指针。这是我的作业。再次感谢。 @matz
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多