2013-08-15 2 views
0

Может кто-нибудь взглянуть на мой код и дать мне несколько указателей, почему он не работает должным образом. Предполагается, что они задают числа, если они являются целыми положительными числами, а затем вычисляют сумму из них, делят ее на большие и умножают на наименьшее число.C - Сумма и поиск самых больших/мелких

#include <stdio.h> 
int main() { 

int n, largest=0, smallest=0; 
float sum=0; 
scanf("%d", &n); 
while (n > 0) { 
    scanf("%d", &n); 
    if (n > largest) { 
    largest = n; 
    } 
    if (n < smallest) { 
    smallest = n; 
    } 
    sum += n; 
} 
sum = sum/largest * smallest; 
printf("%f\n", sum); 

return 0; 
} 
+1

Elaborate на нем не работает правильно. – chris

+0

Я положил scanf на нижнюю часть цикла, но очевидная проблема была с наименьшим, я ввел временное исправление, заявив, что это исходное значение 100, но это не будет работать для чисел выше 100, верно? – user2627736

+0

@ user2627736: Для этого нужен 'INT_MAX' - см. Мой ответ. – RichieHindle

ответ

3

Поскольку smallest начинается с нуля, он никогда не изменится, потому что if (n < smallest) никогда не будет правдой. Вам необходимо:

int smallest = INT_MAX; 

или аналогичный. Для INT_MAX вам нужно:

#include <limits.h> 

в верхней части.

+0

Ty, это постоянное исправление – user2627736

+0

Этого недостаточно, чтобы заставить его код работать. –

+0

Это требуется, но не достаточно ... 'scanf' должен двигаться в конце цикла while, или -ve номера могут быть указаны как входные данные (после первого входа), и они будут добавлены к сумме, а также будут установлены как минимум ... что сделает код неправильным! – Ani

0

Переместить scanf до конца или когда ваш первый вход пропущен, а во-вторых, вы можете принять отрицательный ввод и выполнить всю обработку на нем. Кроме того, наименьший должен быть значение Макс иначе с smallest = 0, n < smallest не будет работать

#include <stdio.h> 
int main() { 

int n, largest=0, smallest=INT_MAX; 
float sum=0; 
scanf("%d", &n); 
while (n > 0) { 
    if (n > largest) { 
    largest = n; 
    } 
    if (n < smallest) { 
    smallest = n; 
    } 
    sum += n; 
    scanf("%d", &n); 
} 
sum = sum/largest * smallest; 
printf("%f\n", sum); 

return 0; 
} 
0

Изменение состояния while контура от while (n > 0) к while (scanf("%d", &n) && n > 0). В этом случае вы также можете удалить первый scanf("%d", &n) и тот, который находится в теле цикла while.

Вы проблема заключается в том, что, потому что ваш scanf("%d", &n) находится в тела вашего времени цикла, он не проверяется на больше чем 0 при выполнении if (n > largest) и if (n < smallest).

Также вы должны инициализировать свой smallest до максимального возможного значения. В этом случае INT_MAX.

0

Ваш код не работает в основном из-за int smallest=0. Это можно решить несколькими способами. Я рекомендую установить первое значение, считанное largest, и smallest. Также ваш второй scanf("%d", &n); s/b в конце цикла.

У вас есть дополнительные проблемы, хотя и тонкие.

  1. Суммируя int в float может привести к потере точности во многих средах при int значения> о 24000000. Предложите большой целочисленный тип, чтобы суммировать ваши значения, такие как uint64_t.

  2. Окончательный вариант «разделите его на наибольший и умножьте его на наименьшее число», это единственная математическая математика с плавающей запятой. Математика, которую вы сделали, была в порядке, но, скорее всего, подвержена ошибкам округления.

  3. Если ваш первый n < = 0, то выполнить деление на 0.

Образец исправления:

#include <stdio.h> 
int main() { 
    int n, largest = 1, smallest = 0; // set largest to 1 to deal with first n being < 0 and thus avoiding /0 
    uint64_t sum = 0; 
    scanf("%d", &n); 
    while (n > 0) { 
    if (sum > 0) { 
     if (n > largest) { 
     largest = n; 
     } 
     if (n < smallest) { 
     smallest = n; 
     } 
    } else { // This is the first time as sum is 0 
     largest = smallest = n; 
    } 
    sum += n; 
    scanf("%d", &n); 
    } 
    printf("%lf\n", ((double) sum)/smallest * largest); 
    return 0; 
} 
Смежные вопросы