Форум программистов, компьютерный форум CyberForum.ru

ООП Одномерный массив - вектор - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
n_zheka
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 19
09.01.2011, 21:15     ООП Одномерный массив - вектор #1
Добрый день, помогите пожалуйста с написанием программы
Задача следующая
Одномерный массив - вектор
Вещественный массив X=(x1,x2,...,xn) содержит несколько отрицательных элементов, разделяющих его на отдельные подмассивы. Сгруппировать элементы каждого подмассива в порядке возрастания. Учесть частные случаи ( в массиве нет отрицательных элементов; подмассив пустой или содержит только один элемент).
Сформировать два отдельных массива для положительных и отрицательных элементов.
Подсчитать наименьшее общее кратного для каждого из них.
Буду очень признателен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2011, 21:15     ООП Одномерный массив - вектор
Посмотрите здесь:

C++ одномерный массив, вектор, конструкторы, диструкторы
C++ Задан вектор X[20]. Положительные числа переписать в массив Y, а отрицательные в массив W
Вектор и Массив C++
Описать класс одномерный массив (вектор) целых чисел. Перегрузить следующую операцию: > уменьшить элементы вектора на заданное значение C++
Массив указателей средствами ООП C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
n_zheka
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 19
11.01.2011, 10:48  [ТС]     ООП Одномерный массив - вектор #2
Ребята, подскажите хотябы одну часть.
Ума не приложу, как разделить массив на подмассивы, хотябы примерный код пожалуйста, дальше обработку сам попытаюсь сделать.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.01.2011, 11:34     ООП Одномерный массив - вектор #3
Вам ничего делить не надо, массив поделён на подмассивы отрицательными элементами. Вам надо завести двё счётчика - один будет указывать на левый конец подмассива, другой - на правый. Изначально левый счётчик указывает на первый элемент массива, а позицию правого вы ищете, перебирая элементы массива последовательно, пока не встретите отрицательный. Затем врубаете сортировку элементов, заключённых между этими счётчиками. После этого левый счётчик занимает позицию правого, а правый снова передвигается, пока не найдётся очередной отрицательный элемент. Так делается до тех пор, пока правый счётчик не станет указывать на последний элемент начального массива. Пример:

Код
1.
6 1 8 4 -1 2 5 9 -7 5 4 -1 2 5 2 1
^        ^
i        j

2.
1 4 6 8 -1 2 5 9 -7 5 4 -1 2 5 2 1
         ^        ^
         i        j

3.
1 4 6 8 -1 2 5 9 -7 5 4 -1 2 5 2 1
                  ^      ^
                  i      j

4.
1 4 6 8 -1 2 5 9 -7 4 5 -1 2 5 2 1
                         ^       ^
                         i       j

5.
1 4 6 8 -1 2 5 9 -7 4 5 -1 1 2 2 5
n_zheka
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 19
11.01.2011, 11:39  [ТС]     ООП Одномерный массив - вектор #4
silent_1991,
Спасибо, можно хотябы примерный код
допустим
X[6 1 8 4 -1 2 5 9 -7 5 4 -1 2 5 2 1]
и еще вопрос, смогу ли я с этими подмассивами потом работать, по заданию эллементы еще нужно будет сортировать и еще пунк задания есть
Сформировать два отдельных массива для положительных и отрицательных элементов.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
11.01.2011, 14:57     ООП Одномерный массив - вектор #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <conio.h>
 
using namespace std;
 
int main()
{
    vector<int> v, v_min, v_plus;
    copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(v));
    vector<int>::iterator i = v.begin(), j = i, Tmp;
    while(i != v.end())
    {
        while(i != v.end() && *i >= 0)
            ++i;
        sort(j, i);
        if (i != v.end())
            j = i++;
    }
    cout << "\nAfter sort\n";
    copy(v.begin(), v.end(), ostream_iterator<int>(cout, "  "));
    for (vector<int>::iterator i = v.begin(), end = v.end(); i != end; ++i)
        if (*i > 0)
            v_plus.push_back(*i);
        else
            if (*i < 0)
                v_min.push_back(*i);
    cout << "\n+\n";
    copy(v_plus.begin(), v_plus.end(), ostream_iterator<int>(cout, "  "));
    cout << "\n-\n";
    copy(v_min.begin(), v_min.end(), ostream_iterator<int>(cout, "  "));
    _getch();
    return EXIT_SUCCESS;
}
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
11.01.2011, 21:19     ООП Одномерный массив - вектор #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//////////////////////////////////////////////////////////////////////////////////////
//Одномерный массив - вектор
//Массив X=(x1,x2,...,xn) содержит несколько отрицательных элементов, 
//разделяющих его на отдельные подмассивы. Сгруппировать элементы каждого подмассива 
//в порядке возрастания. Учесть частные случаи ( в массиве нет отрицательных элементов; 
//подмассив пустой или содержит только один элемент).
//Сформировать два отдельных массива для положительных и отрицательных элементов.
//Подсчитать наименьшее общее кратное для каждого из них.
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <string>
#include <vector>
//////////////////////////////////////////////////////////////////////////////////////
typedef std::string         T_str;
typedef int                 T_num;
typedef std::vector<T_num>  T_nums;
//////////////////////////////////////////////////////////////////////////////////////
void  sort_between_neg(T_nums&  nums)
{
    if(nums.size() <= 1) return;
    
    T_nums::iterator  sort_beg_it = nums.begin(); 
    T_nums::iterator  sort_end_it = nums.begin(); 
 
    for(;;)
    {
        //Ищем первый неотрицательный элемент, начиная с sort_end_it.
        sort_beg_it 
            = std::find_if(sort_end_it, nums.end(), 
                           std::bind2nd(std::greater_equal<T_num>(), 0.0));
 
        //Если такого нет, то выходим из цикла.
        if(sort_beg_it == nums.end())  break;
        //Ищем первый отрицательный элемент, начиная с sort_beg_it;
        sort_end_it 
            = std::find_if(sort_beg_it, nums.end(), std::bind2nd(std::less<T_num>(), 0.0));
        //Сортируем.
        std::sort(sort_beg_it, sort_end_it);
    }
}
//////////////////////////////////////////////////////////////////////////////////////
int  GCD(int A, int B)
{
    return B ? GCD(abs(B), abs(A) % abs(B)) : abs(A);
}
//////////////////////////////////////////////////////////////////////////////////////
int  LCM(T_nums  nums)
{
    if(nums.empty()) return -1;
    if(nums.size() <= 2)
    {
        int  gcd = GCD(nums.front(), nums.back());
        return abs(nums.front() * nums.back()) / (gcd ? gcd : 1);
    }
    else
    {
        *(nums.end() - 2) = LCM(T_nums(nums.end() - 2, nums.end()));
        return  LCM(T_nums(nums.begin(), nums.end() - 1));
    }
}
//////////////////////////////////////////////////////////////////////////////////////
void  print_vect(const T_nums&  nums, const T_str&  prompt)
{
    std::cout << prompt
              << std::endl;
    if(nums.empty())
    {
        std::cout << "вектор пуст.";
    }
    else
    {
        std::copy(nums.begin(), nums.end(), std::ostream_iterator<T_num>(std::cout, "\t"));
    }    
    std::cout << std::endl
              << std::endl;
}
//////////////////////////////////////////////////////////////////////////////////////
void  print_LCM(const T_nums&  nums, const T_str&  prompt)
{
    std::cout << prompt;
    int lcm = LCM(nums);
    if(lcm >= 0)
    {
        std::cout << lcm;
    }
    else
    {
        std::cout << "не существует.";
    }
    std::cout << std::endl
              << std::endl;
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));   
    srand(static_cast<unsigned>(time(0)));    
 
    struct  T_generate_pos_and_neg
    {
        T_num  operator() ()
        {
            T_num  nominator  = rand() % 10000;
            int    sign       = rand() % 5 ? 1 : -1;
            return nominator / 100 * sign;
        }
    };
 
    const int VECT_SIZE_MOD  = 30;
    int       vect_size      = rand() % VECT_SIZE_MOD; 
    T_nums    nums;
    std::generate_n(std::back_inserter(nums), vect_size, T_generate_pos_and_neg());
    print_vect(nums, "Вектор до сортировки:");
    sort_between_neg(nums);
    print_vect(nums, "Вектор после сортировки:");
 
    T_nums  nums_neg;
    std::remove_copy_if(nums.begin(), nums.end(), std::back_inserter(nums_neg),
                        std::bind2nd(std::greater_equal<T_num>(), 0.0));
    print_vect(nums_neg, "Вектор отрицательных элементов:");
    print_LCM(nums_neg, "НОК вектора отрицательных элементов: ");
 
    T_nums  nums_pos;
    std::remove_copy_if(nums.begin(), nums.end(), std::back_inserter(nums_pos),
                        std::bind2nd(std::less_equal<T_num>(), 0.0));
    print_vect(nums_pos, "Вектор положительных элементов:");
    print_LCM(nums_pos, "НОК вектора положительных элементов: ");
}
Yandex
Объявления
11.01.2011, 21:19     ООП Одномерный массив - вектор
Ответ Создать тему
Опции темы

Текущее время: 18:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru