Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Преобразование массива


Автор: kolashik 12.10.2009, 17:05
Эксперты прошу у вас помощи, в С++ плохо понимаю что да как, не изучал ни когда, а на учебе задоли сделать лабу((
ПОМОГИТЕ ПОЖАЛУЙСТА=)))


ЗАДАНИЕ:

В одномерном массиве, состоящем из n вещественных элементов, вычислить:

1. минимальный по модулю элемент массива;
2. сумму модулей элементов массива, расположенных после первого элемента,
   равного нулю.

 Преобразовать массив таким образом, чтобы в первой его половине
   располагались элементы, стоявшие в четных позициях, а во второй
   половине - элементы, стоявшие в нечетных позициях.

Автор: cutwater 12.10.2009, 17:40
Пары не надо прогуливать и учить предметы. А для домашних заданий существует центр помощи.

Автор: bsa 12.10.2009, 18:46
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: darkart 12.10.2009, 20:55
Цитата(kolashik @  12.10.2009,  17:05 Найти цитируемый пост)
1. минимальный по модулю элемент массива;
2. сумму модулей элементов массива, расположенных после первого элемента,
   равного нулю.

Код

#include <cmath>
#include <iostream>
#include <conio.h>

using namespace std;

const unsigned int N = 10;//константа - количество элементов в массиве
const float EPSILON = 1e-3;//константа - точность

//функция ввода массива array
void InputArray( float* array )
{
    for( unsigned int i = 0; i < N; i++ )
        cin >> array[ i ];
}

//функция печати массива array
void PrintArray( const float* array )
{
    for( unsigned int i = 0; i < N - 1; i++ )
        cout << array[ i ] << " ";
    cout << array[ N - 1 ] << endl;
}

//функция возвращает 1 или 2 минимальных по модулю элементов массива
void GetMinAbs( const float* array, float& min, float& min_add )
{
    //инициализация минимумов 0 элементом
    min = array[ 0 ];
    min_add = min;

    float min_abs = fabs( min );//вычисляем модуль минимального элемента

    for( unsigned int i = 1; i < N; i++ )//для последующих элементов
    {
        float elem_abs = fabs( array[ i ] );//вычисляем модуль текущего элемета

        if( elem_abs < min_abs )//если текущий модуль меньше минимального
        {
            min = array[ i ];//запоминаем новый минимум
            min_add = min;//заново инициализируем дополнительный минимум. равный первому
            min_abs = elem_abs;//запоминаем новый модуль минимума
        }
        else if( min != array[ i ] && fabs( elem_abs - min_abs ) < EPSILON )//если минимальный элемент не равен текущему и модуль текущего элемента примерно равен модулю минимального
            min_add = array[ i ];//запоминаем дополнительный элемент
    }
}

//функция возвращает сумму модулей элементов массива после первого нуля
float GetSum( const float* array )
{
    float sum = 0.0f;//инициализация результата - суммы
    unsigned long i = 0;//i - счетчик
    //ищем первый 0 элемент с точностью EPSILON
    while( i < N && fabs( array[ i ] ) >= EPSILON )
        i++;

    //суммируем модули последующих элементов массива
    while( ++i < N )
        sum += fabs( array[ i ] );


    return sum;//возвращаем результат

}

int main()
{
    float array[ N ];//массив из N элементов

    //печать сообщения - введите массив из N элементов
    cout << "Please enter array with " << N << " elements:" << endl;

    //ввод массива
    InputArray( array );

    //печать сообщения - исходный массив
    cout << "Source array:" << endl;

    //печать массива
    PrintArray( array );

    float min, min_add;

    //получаем минимумы
    GetMinAbs( array, min, min_add );

    //печать результата - минимум или минимумы по модулю
    cout << "Min abs element = " << min;
    ( min != min_add )? cout << " and " << min_add : cout << "";
    cout << endl;

    //печать суммы модулей элементов массиво после первого 0
    cout << "Sum of abs elements after 0 = " << GetSum( array ) << endl;

    getch();//ожидаем ввода

    return 0;//возвращаем код ошибки
}

Автор: ИванМ 12.10.2009, 21:43
Цитата(kolashik @  12.10.2009,  17:05 Найти цитируемый пост)
1. минимальный по модулю элемент массива;2. сумму модулей элементов массива, расположенных после первого элемента,   равного нулю.

Код

#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <cmath>
#include <ctime>

const size_t n=10;
double array[n];

bool less_abs(double v1, double v2)
{
    return std::abs(v1)<std::abs(v2);
}

double sum=0;

void add_abs(double v1)
{
    sum+=std::abs(v1);
}

int main(int argc, char* argv[])
{
    srand((unsigned)std::time( NULL ));
    for(int i=0;i<n;i++)
        array[i]=rand()%20-10;

    std::cout<<"Source array:"<<std::endl;
    std::copy(array, array+n, std::ostream_iterator<double>(std::cout, "\n"));
    std::cout<<"Min element by module:"<<std::endl;
    std::cout<<*std::min_element(array, array+n, less_abs)<<std::endl;
    double* it=std::find(array, array+n, 0);
    std::for_each(it, array+n, add_abs);
    std::cout<<"Sum by module of elements greater 0 by index:\n"<<sum<<std::endl;
    system("pause");
    return 0;
}





Автор: darkart 12.10.2009, 22:03
ИванМ,
не работает нахождение минимального по модулю элемента для массивов:
1 -1 2 -2 3 -3 4 -4 5 -5
1 1 1 1 1 -1 1 1 1 1

минимальных элементов может быть - 2, -число и +число

Автор: ИванМ 12.10.2009, 22:37
darkart, большое спасибо. Упустил этот момент
Код

#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <cmath>
#include <ctime>

const size_t n=10;
double array[n];

bool less_abs(double v1, double v2)
{
    return std::abs(v1)<std::abs(v2);
}

double sum=0;

void add_abs(double v1)
{
    sum+=std::abs(v1);
}

int main(int argc, char* argv[])
{
    srand((unsigned)std::time( NULL ));
    for(int i=0;i<n;i++)
        array[i]=rand()%20-10;

    std::cout<<"Source array:"<<std::endl;
    std::copy(array, array+n, std::ostream_iterator<double>(std::cout, "\n"));
    std::cout<<"Min element by module:"<<std::endl;
    double num=*std::min_element(array, array+n, less_abs);
    if(num==0) std::cout<<0;
    else
    {
        std::cout<<num;
        double *minus_num=std::find(array, array+n, -num);
        if(minus_num<array+n)
            std::cout<<", "<<-num;        
    }
    double* it=std::find(array, array+n, 0);
    std::for_each(it, array+n, add_abs);
    std::cout<<"\nSum by module of elements greater 0 by index:\n"<<sum<<std::endl;
    system("pause");
    return 0;
}



Автор: kolashik 12.10.2009, 23:08
Я не одной пары еще не прогулял, на лекциях операторы объясняют, и маленькие программки где они применяються=)))....А глобально ни кто не объясняет, а самому туговато, если не изучал С++ вобще=))
СПАСИБО ОГРОМНОЕ ВСЕМ КТО ПОМОГ!!!!!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)