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

