【问题标题】:Function doesn't return correct value using pointers in C函数不使用 C 中的指针返回正确的值
【发布时间】:2019-08-30 13:50:13
【问题描述】:

这是一个为所有参与投注的朋友计算奖金的程序。奖励是基于每个人贡献了多少金钱。但是我创建的函数返回 0.0000。

一本小词典:

  • premio = 奖品
  • 撇号 = 每个朋友的贡献

 

int main(){
    int exerc;

    printf("Digite o numero do exercicio desejado: ");
    printf("\n");
    scanf("%d", &exerc);

    switch (exerc){
        case 2:{
            float aposta1, aposta2, aposta3, premio;

            printf("Digite respectivamente o valor que cada um apostou: ");
            scanf("%d %d %d", &aposta1, &aposta2, &aposta3);
            printf("Digite o valor do premio: ");
            scanf("%d", &premio);

            void exercicio2(float *, float*, float*, const float*);
            exercicio2(&aposta1, &aposta2, &aposta3, &premio);

            printf("O valor que o primeiro apostante recebera e de: %f", aposta1);
            printf("\nO valor que o segundo apostante recebera e de: %f", aposta2);
            printf("\nO valor que o terceiro apostante recebera e de: %f", aposta3);

        }
    }
    return 0;
}

void exercicio2(float *ap1, float *ap2, float *ap3, const float *premio){
    float total;

    total = *ap1 + *ap2 + *ap3;

    *ap1 = (*ap1/total) * (*premio);
    *ap2 = (*ap2/total) * (*premio);
    *ap3 = (*ap3/total) * (*premio);
}

输入(投注)posta1 = 50、aposta2 = 25、aposta3 = 25 和 premio(prize) = 1000 的预期值为:ap1 = 500、ap2 = 250、ap3 = 250。

但它正在发生:

"C:\Users\Marco Antonio\CLionProjects\untitled\cmake-build-debug\untitled.exe"
Digite o numero do exercicio desejado: 2
Digite respectivamente o valor que cada um apostou:50 25 25
Digite o valor do premio:1000
O valor que o primeiro apostante recebera e de: 0.000000
O valor que o segundo apostante recebera e de: 0.000000
O valor que o terceiro apostante recebera e de: 0.000000

【问题讨论】:

  • scanf("%d %d %d", &aposta1, &aposta2, &aposta3); 使用%f 代替floats。
  • 使用错误的格式说明符具有未定义的行为。一个体面的编译器应该会警告你。

标签: c


【解决方案1】:

更改格式说明符(%d%f)将解决问题:

scanf("%d %d %d", &aposta1, &aposta2, &aposta3);
scanf("%d", &premio);

scanf("%f %f %f", &aposta1, &aposta2, &aposta3);
scanf("%f", &premio);

问题是您输入的是浮点数,而您的程序正在读取整数。在这种情况下,行为是未定义的。请查看 SO question and it's answer 关于格式说明符和未定义行为的信息。

标准规定:

如果任何参数不是对应的正确类型 转换规范,行为未定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多