You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中使用指针的奖金计算函数返回值全为0的问题

问题根源与修复方案

嘿,我一眼就看出问题出在哪了——你误用了scanf的格式说明符,这直接导致所有计算结果全是0.000000。

核心错误:类型不匹配的输入读取

你定义的aposta1、aposta2、aposta3和premio都是float类型,但你在scanf里用了%d(这是给整数类型int用的格式符)。当你用%d去写入float变量的内存时,会破坏float的IEEE754二进制存储格式,导致这些变量被赋值成极小的数值(几乎趋近于0)。后续按比例计算时,结果自然全是0。

修复步骤

  1. 修正scanf格式符:把所有读取float变量的%d改成%f,这是float类型对应的标准输入格式符。
  2. 提前声明函数:把exercicio2的函数声明移到main函数外面,避免编译器抛出隐式声明的警告。
  3. 添加除以0防护:如果所有朋友的出资都是0,total会变成0,触发除以0的运行错误,所以加个判断处理这种异常情况。

修正后的完整代码

#include <stdio.h>

// 提前声明函数,避免隐式声明警告
void exercicio2(float *ap1, float *ap2, float *ap3, const float *premio);

int main(){
    int exerc;
    printf("Digite o numero do exercicio desejado: \n");
    scanf("%d", &exerc);
    switch (exerc){
        case 2:{
            float aposta1, aposta2, aposta3, premio;
            printf("Digite respectivamente o valor que cada um apostou: ");
            // 替换%d为%f,匹配float类型
            scanf("%f %f %f", &aposta1, &aposta2, &aposta3);
            printf("Digite o valor do premio: ");
            // 同样替换为%f
            scanf("%f", &premio);
            exercicio2(&aposta1, &aposta2, &aposta3, &premio);
            // 用%.2f格式化输出,结果更整洁
            printf("O valor que o primeiro apostante recebera e de: %.2f\n", aposta1);
            printf("O valor que o segundo apostante recebera e de: %.2f\n", aposta2);
            printf("O valor que o terceiro apostante recebera e de: %.2f\n", aposta3);
            break;
        }
        default:
            printf("Exercicio invalido!\n");
            break;
    }
    return 0;
}

void exercicio2(float *ap1, float *ap2, float *ap3, const float *premio){
    float total = *ap1 + *ap2 + *ap3;
    // 处理总出资为0的异常情况
    if (total == 0.0f) {
        printf("Erro: Nenhum valor foi apostado!\n");
        *ap1 = *ap2 = *ap3 = 0.0f;
        return;
    }
    *ap1 = (*ap1 / total) * (*premio);
    *ap2 = (*ap2 / total) * (*premio);
    *ap3 = (*ap3 / total) * (*premio);
}

测试验证

当你输入以下内容时:

2
50 25 25
1000

会得到预期的输出结果:

O valor que o primeiro apostante recebera e de: 500.00
O valor que o segundo apostante recebera e de: 250.00
O valor que o terceiro apostante recebera e de: 250.00

内容的提问来源于stack exchange,提问作者Joao Pedro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:15:09