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

C程序鞋码占比统计异常:35、36码百分比随机问题求助

问题定位:C程序中35、36码百分比随机异常的原因及修复

我编写了一个统计35-44号鞋码选择占比的C程序,要求输出各鞋码及对应选择百分比。但35、36码每次输出的都是随机百分比,37-44码结果正常,常规排查未找到问题。以下是预期输出及程序代码,请求定位问题:

预期输出

tamanho 36 – percentual: 20
tamanho 37 – percentual: 10
tamanho 38 – percentual: 0
tamanho 39 – percentual: 0
tamanho 40 – percentual: 0
tamanho 41 – percentual: 0
tamanho 42 – percentual: 10
tamanho 43 – percentual: 0
tamanho 44 – percentual: 30

程序代码

#include <stdio.h>
int tamanVeri(int taman,int vTam[]){
  int porc,i;
  for(i=0;i<10;i++){
    if(taman==vTam[i]){
      return i;
    }
  }
  return 0;
}
void showTamanPorc(int vTam[],int vAp[],int vezRepetCSucesso){
  int i;
  float porc;
  for(i=0;i<10;i++){
    porc=((float)vAp[i]/(float)vezRepetCSucesso)*100.0;
    printf("Tamanho:  %i - Porcentagem: %.2f\n",vTam[i],porc);
  }
  
}
int main(void) {
  int vAp[10];
  int vTam[10]={35,36,37,38,39,40,41,42,43,44};
  int tamanho,i=0,j=0,k,adicEm;
  printf("Ponha o tamanho do tênis\nEntre 35 e 44\n");
  scanf("%i",&tamanho);
  while(tamanho!=0&&tamanho>0){
    adicEm=tamanVeri(tamanho,vTam);
    if(adicEm!=0){
      vAp[adicEm]++;
    }
    j++;
    printf("Ponha o tamanho do tênis\nEntre 35 e 44\n");
    scanf("%i",&tamanho);
  }
  showTamanPorc(vTam,vAp,j);
  return 0;
}

问题根源

  1. 统计数组未初始化:vAp数组用于记录各鞋码的选择次数,但作为局部数组,C语言不会自动将其初始化为0,数组元素初始值为内存中的随机垃圾值。
  2. 统计逻辑判断错误:
    • 35码对应vTam数组的索引0,tamanVeri返回0时,if(adicEm!=0)的判断不成立,导致35码的输入永远不会被统计,vAp[0]始终是随机值,百分比自然随机。
    • 36码对应索引1,虽然能通过判断进入统计,但vAp[1]初始是随机值,每次输入36会在随机值基础上累加,最终统计数包含随机偏移量,百分比异常。
    • 37-44码对应索引2-9,满足adicEm!=0的判断,若用户输入过这些码,累加操作会覆盖初始随机值(或用户输入次数足够大时随机值影响可忽略),因此表现正常。

修复方案

1. 初始化统计数组

声明vAp时直接初始化为0,避免随机值干扰:

int vAp[10] = {0};

2. 修正统计判断逻辑

去掉if(adicEm!=0)的限制,同时增加输入有效性判断,确保只有35-44的鞋码才被统计并计入总次数:

修复后的main函数:

int main(void) {
  int vAp[10] = {0}; // 初始化统计数组为0
  int vTam[10]={35,36,37,38,39,40,41,42,43,44};
  int tamanho,j=0,adicEm;
  printf("Ponha o tamanho do tênis\nEntre 35 e 44\n");
  scanf("%i",&tamanho);
  while(tamanho!=0){
    if(tamanho >=35 && tamanho <=44){ // 仅处理有效鞋码
      adicEm=tamanVeri(tamanho,vTam);
      vAp[adicEm]++;
      j++; // 有效输入才计入总次数
    }
    printf("Ponha o tamanho do tênis\nEntre 35 e 44\n");
    scanf("%i",&tamanho);
  }
  showTamanPorc(vTam,vAp,j);
  return 0;
}

内容的提问来源于stack exchange,提问作者El-Amag

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:03:09