2014-10-11 7 views
0

Я пытаюсь разбить эту проблему на функцию, но моя проблема в том, что я всегда получаю разные суммы, положительные и отрицательные значения, когда я распечатываю результат.Сумма положительных целых чисел, используя функции.

Может кто-нибудь дать мне подсказку?

Напишите программу, которая считывает десять целых чисел и выводит сумму всех положительных чисел среди них. Программа должна игнорировать все числа, которые меньше или равны 0. Программа также должна отображать количество положительных чисел и число отрицательных чисел или ноль.

#include <iostream> 

using namespace std; 
void input(int number, int positiveCount, int negativeCount, int sum); 
void output(int positiveCount, int negativeCount, int sum); 

int main() 
{ 
int number, positiveCount, negativeCount, sum; 
input(number, positiveCount, negativeCount, sum); 
output(positiveCount, negativeCount, sum); 


return 0; 
} 
void input(int number, int positiveCount, int negativeCount, int sum) 
{ 
cout << "Enter 10 integers: " << endl; 
for (int i = 0; i < 10; i++) 
{ 

    cin >> number; 
    if (number > 0) 
    { 
     positiveCount++; 
     sum = sum + number; 
    } 
    else 
    { 
     negativeCount++; 
    } 
} 


} 
void output(int positiveCount, int negativeCount, int sum) 
{ 
    cout << sum << endl; 
    cout << positiveCount << endl; 
    cout << negativeCount << endl; 

} 
+0

Вы можете уточнить, где лежит проблема –

ответ

2

Ваша input() функция должна принимать свои аргументы по ссылке, чтобы он мог изменить их. И вам нужно инициализировать все эти ints до 0 в начале или содержать мусор.

+0

Без инициализации это UB, а не просто мусор. – Deduplicator

+0

@ Дедупликатор: вид. Я думаю, что UB будет предотвращено первым изменением, чтобы использовать ссылки вместо pass-by-value для функции 'input()'. Это зависит от идеи, что получение ссылки эквивалентно принятию ее адреса, что исключает UB и дает только неопределенное значение. См. Здесь: http://stackoverflow.com/questions/11962457/why-is-using-an-uninitialized-variable-undefined-behavior-in-c - но имею ли я право просто передавать переменные по ссылке, сохраняя нас здесь я не уверен, и программа в любом случае неверна без инициализации. –

+1

Связанный Q & A для C, а не C++. В C++ использование неопределенных значений является прямым UB. Нужно не быть из без памяти переменных для этого. (И вы правы, это не меняет вопрос, правильна ли программа, только насколько это плохо.) – Deduplicator

1

Операции, выполненные внутри функции ввода(), теряются, потому что область действия переменных находится внутри функции.

Вам необходимо использовать указатели или ссылку при передаче параметров во входную() функцию, чтобы не использовать локальную копию.

При использовании указателей вам также необходимо выполнить разыменование. И инициализируйте переменную до 0 перед переходом к функции.

0

Потому что в вашей программе есть серьезная ошибка. Вы определяете четыре локальные переменные в функции main() и отправляете их по значению при вызове функции input(). Эта функция НЕ модифицирует переменные, определенные в функции main(). Он просто модифицирует свои копии. Эти копии удаляются при выходе из функции input().

Для того, чтобы изменить их, вы должны использовать ссылку:

void input(int &number, int &positiveCount, int &negativeCount, int &sum); 

Но это не имеет никакого смысла, чтобы создать четыре целых числа в функции main() и отправить их в функциях input() и output(). Вы можете создать четыре локальные переменные в input(), а затем распечатать их в этой функции. Тогда вы не должны определять функцию output(), и вы можете удалить ее в своем коде. То есть вы должны изменить свою программу.

0

В вашем назначении там написано:

Написать программу, которая считывает десять целых чисел и выводит сумму всех положительных чисел среди них

Таким образом, нет никакой необходимости писать отдельные функции для этой простой программы.Это может выглядеть как

#include <iostream> 

int main() 
{ 
    const size_t N = 10; 

    std::cout << "Enter " << N << " integers: "; 

    size_t i = 0, count = 0; 
    long long sum = 0; 

    int num; 

    for (; i < N && std::cin >> num; i++) 
    { 
     if (num > 0) 
     { 
      sum += num; 
      ++count; 
     } 
    } 

    std::cout << "You have entered " << count << " positive numbers\n" 
       << "and " << i - count << " negative numbers or seroes\n" 
       << "Sum of positive numbers is " << sum << std::endl; 

    return 0; 
} 

Если вы хотите, чтобы написать отдельные функции, то для ввода примера функция может быть объявлена ​​как

long long input(size_t &positive_count, size_t &negative_count); 

или

long long input(size_t &total_count, size_t &positive_count); 

или

long long input(size_t *positive_count, size_t *negative_count); 

или

long long input(size_t *total_count, size_t *positive_count); 
Смежные вопросы