Сумма отрицательных элементов массива

Отщеплен от топика Помогите написать программу.

Пожалуйста срочно надо
Написать программу использующую подпрограмму(функцию)/
Сумма отрицательных элементов массива Y.

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

in c++

#include<iostream>
using namespace std;
int main()
{
   int a[10005],n,i,ans=0;
   cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
for(i=1;i<=n;i++)
{
if(a[i]<0)
{
ans+=a[i];
}
}
cout<<ans<<endl;
return 0;
}

Бегло читать обычно люди начинают годам к 10. А вот понимать прочитанное... Некоторые вообще обходятся без этого до самой смерти.

Azizullo Qudratullo, если уж пытаешься помочь людям, что само по себе похвально, то помогай правильно. Ещё раз прочитай задание и попытайся понять, что в нём сказано.

Я думаю, программа должна выглядеть так:

// программа для подсчета отрицательных чисел в массиве
#include <iostream>

// прототип фуннкции для подсчета отрицательных чисел в массиве
signed long sum_negtv_numbrs(void);

int main(void)
{
    using namespace std;
    signed long sum;
    sum = sum_negtv_numbrs();
    cout << "\nThe sum of array's negative numbers: " << sum << endl;

    return (0);
}
signed long sum_negtv_numbrs()
{
    const int SIZE = 1000;  // размер массива
    int Y[SIZE];
    int arrsize;
    // ввод размера массива
    std::cout << "Enter array's size: ";
    std::cin >> arrsize;
    // ввод чисел из которых будет состоять массив
    std::cout << "\nEnter into array Y both positive and negative numbers: \n" << std::endl;
    for (int i = 1; i <= arrsize; i++)
    {
        std::cout << "Number " << i << ": ";
        std::cin >> Y[i];
    }
    signed long summ = 0;
    // подсчет отрицательных чисел
    for (int i = 1; i <= arrsize; i++)
    {
        if (Y[i] < 0)
            summ += Y[i];
    }
    return summ;
}

Юрий, как вариант, на «троечку» потянет.

Недостатки кода:

  1. Создание в стеке массива достаточно большого размера. Место для размещения переменной Y будет выделяться в стеке. На таком приёме можно легко получить переполнение стека, и, как следствие, аварийное завершение программы.
  2. По логике твоей программы, под массив Y должно (!) выделяться больше места, чем реально необходимо. Однако проверки значения, введённого пользователем в arrsize, нет. Если пользователь в порыве фанатизма решит ввести с клавиатуры массив в 1001 элемент — получим выход за границы массива. Что есть нехорошо.
  3. Под массив Y выделяется (допустим!) больше места, чем реально необходимо. Лишний расход памяти. Если на этапе кодирования размер массива неизвестен, то необходимо выделять память для массива динамически через оператор new, а потом не забыть освободить ее через delete.
  4. В С/С++ индексы в массиве начинаются с 0. Поэтому циклы должны должны выглядеть так for (int i = 0; i < arrsize; i++) { ... }. В противном случае можно опять-таки получить выход за границу массива при обработке последнего элемента.
  5. using namespace std; лучше использовать в глобальной области видимости.

Формальности:

  1. Исходное задание сформулировано несколько некорректно. Возможно опечатка. Возможно предложение «В подпрограмме должен осуществляться ввод исходных данных, однократный вызов подпрограммы обработки данных и вывод результата на экран» должно выглядеть так: программе должен осуществляться ввод исходных данных, однократный вызов подпрограммы обработки данных и вывод результата на экран". Это было бы более логично.
  2. В приведённом тобой коде не используются формальные параметры, о которых говорится в задании.
  3. Если чётко следовать заданию, то вывод результата тоже должна осуществлять функция.

Исходя из вышеизложенного, твой код может выглядеть так:

// программа для подсчета отрицательных чисел в массиве
#include <iostream>

using namespace std;

const int MAXARRSIZE = 10000;

// прототип фуннкции для подсчета отрицательных чисел в массиве
void sum_negtv_numbrs(int *, int);

int main(void)
{
    int *Y;

    int arrsize;
    bool ok = true;
    // ввод размера массива
    do {
        ok = true;
        cout << "Enter array's size (1.." << MAXARRSIZE << "): ";
        cin >> arrsize;
        if (arrsize < 1 || arrsize > MAXARRSIZE) {
            ok = false;
            cout << "\tDummy! Array size must be ftom 1 to " << MAXARRSIZE << "! Try again..." << endl;
        }
    } while (!ok);

    Y = new int[arrsize];

    sum_negtv_numbrs(Y, arrsize);

    delete [] Y;

    return (0);
}


void sum_negtv_numbrs(int *a_Y, int a_arrsize)
{
    // ввод чисел из которых будет состоять массив
    cout << "\nEnter into array Y both positive and negative numbers: \n" << endl;
    for (int i = 0; i < a_arrsize; i++)
    {
        cout << "Number " << i << ": ";
        cin >> a_Y[i];
    }
    signed long summ = 0;
    // подсчет отрицательных чисел
    for (int i = 0; i < a_arrsize; i++)
    {
        if (a_Y[i] < 0)
            summ += a_Y[i];
    }
    cout << "\nThe sum of array's negative numbers: " << summ << endl;
}

Или, если верно моё предположение об опечатке в тексте задания, так:

// программа для подсчета отрицательных чисел в массиве
#include <iostream>

using namespace std;

const int MAXARRSIZE = 10000;

// прототип фуннкции для подсчета отрицательных чисел в массиве
signed long sum_negtv_numbrs(int *, int);

int main(void)
{
    int *Y;

    int arrsize;
    bool ok = true;
    // ввод размера массива
    do {
        ok = true;
        cout << "Enter array's size (1.." << MAXARRSIZE << "): ";
        cin >> arrsize;
        if (arrsize < 1 || arrsize > MAXARRSIZE) {
            ok = false;
            cout << "\tDummy! Array size must be ftom 1 to " << MAXARRSIZE << "! Try again..." << endl;
        }
    } while (!ok);

    Y = new int[arrsize];

    // ввод чисел из которых будет состоять массив
    cout << "\nEnter into array Y both positive and negative numbers: \n" << endl;
    for (int i = 0; i < arrsize; i++)
    {
        cout << "Number " << i << ": ";
        cin >> Y[i];
    }

    cout << "\nThe sum of array's negative numbers: " << sum_negtv_numbrs(Y, arrsize) << endl;

    delete [] Y;

    return (0);
}


signed long sum_negtv_numbrs(int *a_Y, int a_arrsize)
{
    signed long summ = 0;
    // подсчет отрицательных чисел
    for (int i = 0; i < a_arrsize; i++)
    {
        if (a_Y[i] < 0)
            summ += a_Y[i];
    }
    return summ;
}

Спасибо, Алан.

Создание в стеке массива достаточно большого размера. Место для размещения переменной Y будет выделяться в стеке. На таком приёме можно легко получить переполнение стека, и, как следствие, аварийное завершение программы.

На данном этапе не совсем разбираюсь в этом вопросе. То есть, созданная символическая константа за пределами функции является статической, а созданная в функции автоматической ? ? Тогда, какую роль играет квалификатор const?

Однако проверки значения, введённого пользователем в arrsize, нет. Если пользователь в порыве фанатизма решит ввести с клавиатуры массив в 1001 элемент — получим выход за границы массива. Что есть нехорошо.

Во время написания кода, я думал об этом, а именно, не уже ли пользователь введя размер массива 1001, захочет инициализировать его с клавиатурного ввода :)
Здесь впору инициализировать массив случайными числами.

В С/С++ индексы в массиве начинаются с 0. Поэтому циклы должны должны выглядеть так for (int i = 0; i < arrsize; i++) { ... }. В противном случае можно опять-таки получить выход за границу массива при обработке последнего элемента.

В этом случае, я руководствовался удобством отображения номера вводимого числа, который совпадает с номером элемента массива. И честно, не совсем понимаю :( в каком случае можно выйти за пределы массива в данном случае. В проверочном условии цикла for (...; i <= arrsize; ...) ???
Буду благодарен за объяснения :)

Пожалуйста, Юрий ))

(1) «Символическая константа» — это скорее #define. Здесь я бы употребил термин «константная переменная». Да, такая переменная, определённая внутри функции, является автоматической. А квалификатор const говорит о том, что эта переменная не может быть изменена. И «говорит» он прежде всего оптимизирующему компилятору, который будет выбирать соответствующие алгоритмы оптимизации.

Но в цитате говорится не про константу, определяющую размер массива, а про выделение памяти под массив Y в стеке. При размере массива int[1000] и размере int 4 байта, в стеке должно быть выделено почти 4 килобайта памяти под этот массив. А если потребуется сделать размер массива в 100000 элементов? Надо себя приучать писать аккуратный код.

(2) Программы должны быть надёжными. Примеров обратному — уйма, к сожалению. И если в программе имеется дырка, то обязательно найдётся идиот, который сунет туда палец. Изучайте Законы Мэрфи. Надо себя приучать писать аккуратный код.

(3) «Удобство отображения номера» решается элементарно: cout << "Number " << i+1 << ": ";.

Выход за границу массива можно получить тоже элементарно. Допустим, в твоей программе имеется массив длиной 1000 элементов, и пользователь указал используемый размер массива 1000 (т.е. будут использоваться все имеющиеся элементы). При этом, по правилам С/С++, элементы массива нумеруются от 0 до 999. А переменная цикла в for (int i = 1; i <= arrsize; i++) будет принимать значения от 1 до 1000. Т.е. на последней итерации будет обращение к несуществующему элементу Y[1000].

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.