2013-09-06 4 views
1

Так что я пытаюсь написать программу, которая вычисляет процент одного из чисел в группе чисел. Можно ввести числа, но проценты всегда равны 0, и я опробовал формулу на бумагу, и она работает каждый раз, когда есть что-то вроде проблемы.Использование массива для вычисления процента от числа

#include <stdio.h> 

int main() { 
    int x[10]; 
    int i,sum; 
    float perc; 
    sum=0; 

    for(i = 0; i < 10; ++i) { 
     scanf("%d",&x[i]); 
     sum=sum+x[i]; 
    } 

    printf("n   percentage of total\n"); 

    for(i = 0; i < 10; ++i) { 
     perc=(x[i]/sum)*100; 
     printf("%d   %.2f\n",x[i],perc); 
    } 
    return (0); 
} 
+0

Просто объявить сумму в качестве поплавка вместо целого числа. – Ale

+2

Извините, но это было задано (и ответило) тысячу раз: Деление двух целых чисел ** усекает ** результат на целое число. –

+1

Если 'sum' определяется как целое число, вы должны вычислить' x [i] * 100/sum'. Эффект заключается в том, что если 'x [i] * 100' is> =' sum', ваш результат тоже 0, что в противном случае не так. Однако в этом случае десятичные точки теряются. – bkausbk

ответ

5

Изменение декларации в части

int i; 
    float sum,perc; 
    sum=0; 

Это из-за типажей в с. Левая часть на рисунке, показывающая, что будет результатом, если ваша переменная результата является целой и правой стороной, показывая, что будет результатом, если ваша переменная результата плавает.

enter image description here

+0

Могу ли я спросить, почему вы использовали float? Сумма может быть целым, тоже не может быть –

+0

, если вы делите int с другим int, результатом будет также int. – speti43

+0

из-за Typecasting в c.Для деталей я обновлю свой ответ –

2

Это выражение

перхлорэтилена = (х [г]/сумма) * 100;

выполняет целочисленное деление. Целочисленное подразделение не возвращает дробную часть.

Если (x[i] >= 0) и (x[i] < sum), то (x[i]/sum) равно нулю. (100 * 0) также равна нулю.

Либо FIRST умножить на 100 и разделить (вы не получите дробную часть проценте таким образом, хотя):

perc=(x[i]*100/sum); 

Или преобразовать аргументы поплавка:

perc=((float)x[i]*100.0/(float)sum); 

или

perc = x[i] * 100.0f/sum; 
+1

Мне нравятся явные преобразования, но стоит написать версию с неявными преобразованиями: 'perc = x [i] * 100.0f/sum;' сохраняя объявления переменных так, как они есть. Вопрос вкуса. – Gauthier

0

Вы получаете нулевой результат, так как деление int будет всегда результатом является int. Если знаменатель становится больше числителя, тогда он даст 0.
Воспользуйтесь typecasting, изменить

perc=(x[i]/sum)*100; 

в

perc= ((float)x[i]/sum)*100; //Typecasting 

Вы также можете сделать это, изменив 100 к 100.0 в

perc= (x[i]*100.0/sum); 
Смежные вопросы