Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2014, 21:05   #1
zevs 12
Пользователь
 
Регистрация: 10.10.2014
Сообщений: 25
Печаль Дан одномерный массив. Найти последние чётное, удалить отрицательные, найти среднеарифметическое. с++

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <windows.h>
#include <iostream.h>
#include <math.h>
#pragma hdrstop


/*
3.1 Дан одномерный массив Хк.
 Найти последний среди элементов с четными значениями.
  Все отри-цательные элементы массива удалить.
   В конец массива дописать среднее арифметическое положи-тельных элементов.
*/

//---------------------------------------------------------------------------

#pragma argsused
int main()
{
   SetConsoleCP(1251);   //
   SetConsoleOutputCP(1251);      //
        float *X=new float;   //
        int  n,i,k=0, j, preobr;
        float  s=0;
        cout<<"размер массива n =";
        cin>>n;
        X= new float [n];   //
        for (i=0; i<n; i++)
        {
                cout<<"X["<<i<<"]=";
                cin>>X[i];         //???? ???????
        }
        cout<<"Исходный масив"<<endl;
        cout<<endl;
        for (i=0; i<n; i++) cout<<" "<<X[i]; //???? ???????
        for (i=n-1; i>0; i--)
        {
                preobr=X[i];
                if (preobr%2==0)
                {
                        cout<<endl;
                        cout<<"Последний четный элемент = "<<X[i]<<endl;
                        break;
                }
        }
        for (i=0; n>i; i++)
        {
                if  (X[i]<0)
                {
                for  (j=i; j<n; j++)  X[j]=X[j+1];
                i--;
                n=n-1;
                }
        }
        cout<<"после удаления отрицательных элеменов"<<endl;
        for (i=0; i<n; i++) cout<<" "<<X[i];
        for (i=0; i<n; i++){
                if (X[i]>0)  s=s+X[i];
        }
        if (s>0) {
                s=s/n;
                n++;
                X[n-1]=s;
                cout<<endl;
                cout<<"Среднее арифметическое элементов массива = "<<s<<endl;
                cout<<"После включения ср. ариф. в конец массива"<<endl;
                for (i=0; i<n; i++) cout<<" "<<X[i];
       }else cout<<"ср. ариф. элементов массива = 0"<<endl;
       cin>>i;
        return 0;
        system ("pause");
}
//---------------------------------------------------------------------------
помогите среднее арифметическое положительных элементов не считает
zevs 12 вне форума Ответить с цитированием
Старый 07.11.2014, 22:03   #2
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Код:
        for (i=0; n>i; i++)
        {
                if  (X[i]<0)
                {
                for  (j=i; j<n; j++)  X[j]=X[j+1];
                i--;
                n=n-1;
                }
        }
Очень сложно для понимания. Создайте лучше ещё два массива. В цикле, в один скопируйте чётные, а в другой - нечётные. Назовите их: oddArr, evenArray. А дальше будет легче
8Observer8 вне форума Ответить с цитированием
Старый 07.11.2014, 22:46   #3
zevs 12
Пользователь
 
Регистрация: 10.10.2014
Сообщений: 25
По умолчанию

а по конкретней а то я вобще не шарю заранее спасибо
zevs 12 вне форума Ответить с цитированием
Старый 08.11.2014, 00:10   #4
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Ой, я перепутал! Там же вы отрицательные отсеиваете. Но всё равно можно создать дополнительный массив и скопировать в него положительные элементы, чтобы потом посчитать их среднее значение. Читайте комментарии в моём коде. Если есть вопросы, то с радостью отвечу (если и не я то кто-нибудь другой)

Такой вывод у моей пограммы:
Цитата:
Array: -5 -4 -3 -2 -1 0 1 2 3 4

Positive array: 1 2 3 4

Arithmetic average: 2.5

Press <RETURN> to close this window...
main.cpp
Код:
#include <iostream>     // std::cout

int main()
{
    // Создаём массив
    unsigned int size = 10;
    float *arr = new float[size];

    // Заполняем
    unsigned int j = 0;
    for ( int i = -5, j = 0; i <= 4; ++i ) {
        arr[j] = ( float ) i;
        j++;
    }

    // Покажем на экране входной массив
    std::cout << "Array:";
    for( unsigned int i = 0; i < size; ++i ) {
        std::cout << " " << arr[i];
    }
    std::cout << "\n\n";

    // Копируем положительные элементы в другой массив
    float *positiveArray = new float[size];
    j = 0;
    for( unsigned int i = 0; i < size; ++i ) {
        if ( arr[i] > 0 ) {
            positiveArray[j] = arr[i];
            ++j;
        }
    }
    unsigned int sizeOfPositiveArray = j;

    // Покажем на экране положительные элементы
    std::cout << "Positive array:";
    for( unsigned int i = 0; i < sizeOfPositiveArray; ++i ) {
        std::cout << " " << positiveArray[i];
    }
    std::cout << "\n\n";

    // Посчитаем сумму для расчёта среднего арифметичекого
    // положительных элементов
    int sum = 0;
    for( unsigned int i = 0; i < sizeOfPositiveArray; ++i ) {
        sum += positiveArray[i];
    }

    // Расчитаем среднее арифметичекое и покажем на экране
    float average = ( float ) sum / ( float ) sizeOfPositiveArray;
    std::cout << "Arithmetic average: " << average << "\n\n";

    return 0;
}

Последний раз редактировалось 8Observer8; 08.11.2014 в 00:12.
8Observer8 вне форума Ответить с цитированием
Старый 08.11.2014, 00:16   #5
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Создайте лучше ещё два массива
Я может чего-то не допонимаю, но в условии написано "Дан одномерный массив X". По всей видимости только одним массивом нужно обойтись.

zevs 12, почему бы Вам не воспользоваться вектором (<vector>)? Он намного проще и безопаснее будет.

Код:
#include <iostream>

using namespace std;

int main()
{
    setlocale(LC_ALL, "Russian");

    int *array; // указатель на массив
    int length; // длина массива
    int total; // сумма всех положительных элементов

    total = 0;

    cout << "Введите размер массива: ";
    cin >> length;

    array = new int[length];

    // заполнение массива
    for (int i = 0; i < length; i++) {
        cout << "Введите " << i + 1 << "/" << length << " элемент массива: ";
        cin >> array[i];
    }

    // последний четный элемент массива
    for (int i = length - 1; i >= 0; i--) {
        if (array[i] % 2 == 0) {
            cout << "Последний четный элемент массива: " << i + 1 << " = " << array[i] << endl;
            break;
        }
    }

    // удаление отрицательных элементов из массива
    for (int i = 0; i < length; i++) {
        if (array[i] <= 0) {
            for (int j = i; j < length; j++) {
                array[j] = array[j + 1];
            }

            length--;
            i--;
        }
    }

    // среднее арифметическое положительных элементов
    for (int i = 0; i < length; i++) {
        total += array[i];
    }

    // запись в конец массива среднего арифметического
    array[length] = total / length;

    cout << "\nОтображение массива\n" << endl;
    // отображение массива
    for (int i = 0; i < length + 1; i++) {
        cout << i + 1 << " элемент массива: " << array[i] << endl;
    }

    delete[] array;

    system("pause");

    return 0;
}

Последний раз редактировалось Lardes; 08.11.2014 в 00:20.
Lardes вне форума Ответить с цитированием
Старый 08.11.2014, 00:20   #6
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Цитата:
zevs 12, почему бы Вам не воспользоваться вектором (<vector>)? Он намного проще и безопаснее будет.
Я думаю, это тоже мимо, так как в условии задачи сказано "одномерный массив", а не контейнер. Я бы тоже использовал вектор
8Observer8 вне форума Ответить с цитированием
Старый 08.11.2014, 10:48   #7
zevs 12
Пользователь
 
Регистрация: 10.10.2014
Сообщений: 25
По умолчанию

программа до отсейвания отрицательных элементов работает , а во среднее арифметическое не работает

допутим вводим 6

x=1
x=0
x=1
x=-1
x=0
x=1

а среднее ариф после удаления выдает 0.6 ну не целое число ,а среднее ариф в этом случае должно быть равно 1, вот именно не могу только вот эту часть понять как прописать ((((((
zevs 12 вне форума Ответить с цитированием
Старый 08.11.2014, 11:24   #8
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

zevs 12, мой вариант пробовали? http://programmersforum.ru/showpost....46&postcount=5
Lardes вне форума Ответить с цитированием
Старый 08.11.2014, 12:44   #9
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
// удаление отрицательных элементов из массива
    for (int i = 0; i < length; i++) {
        if (array[i] <= 0) {
ноль - это отрицательный элемент?
rrrFer вне форума Ответить с цитированием
Старый 08.11.2014, 12:50   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Ну а кроме того, массив у тебя целочисленный, а среднее арифметическое - дробное, наверное обычно:
Код:
array[length] = total / length;
Фрагмент приведенный выше вообще работать не должен - это же UB.
Если в массиве все элементы были положительные, то ты не удалишь ничего и значит записывая среднее арифметическое залезешь в чужую память.
Код:
array = new int[length];
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан массив X(N,M).Найти номера столбцов массива,все элементы которых четны. Из полученных значений сформировать одномерный массив. darwin1 Паскаль, Turbo Pascal, PascalABC.NET 3 16.03.2014 13:31
Одномерный массив 12 элементов,случайные положительные и отрицательные. Найти элемент наиболее близкий к среднему значению(Паскаль 1998y8m1d Помощь студентам 6 16.12.2013 17:06
Найти одномерный массив элементы которого равны минимальным значениям в строках исходной матрицы и одномерный массив элементы... Richik123 Microsoft Office Excel 1 16.10.2013 15:45
Дан одномерный массив. Удалить все элементы последовательности значения,которые кратны k Кристюша5 Паскаль, Turbo Pascal, PascalABC.NET 4 27.05.2012 21:46
Дан файл целых чисел. Удалить из него все отрицательные числа vaako Паскаль, Turbo Pascal, PascalABC.NET 5 12.04.2012 22:45