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

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

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

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 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
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Код:
        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
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

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

Такой вывод у моей пограммы:
Цитата:
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
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
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