Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
n_zheka
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 19
#1

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

09.01.2011, 21:15. Просмотров 1371. Ответов 5
Метки нет (Все метки)

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

одномерный массив, вектор, конструкторы, диструкторы - C++
Помогите написать программу, определяющую максимальное, минимальное и среднее значение в одномерном массиве целого типа. Используя понятие...

Как передать массив (двумерный/одномерный вектор) в функцию? - C++
#include <iostream> #include <ctime> using namespace std; int n,m;//סענמך ט סעמכבצנג void searchmin(int g,int mm,int i,int...

Реализовать класс Одномерный массив (вектор) вещественных чисел; перегрузить указанные операции - C++
одномерный массив (вектор) вещественных чисел. Дополнительно перегрузить следующие операции: - − вычесть из вектора число...

Описать класс одномерный массив (вектор) целых чисел. Перегрузить следующую операцию: > уменьшить элементы вектора на заданное значение - C++
Описать класс одномерный массив (вектор) целых чисел. Перегрузить следующую операцию: > уменьшить элементы вектора на заданное значение. ...

Матрица и одномерный массив (Составить одномерный массив, содержащий количество буквенных символов в каждом из ее столбцов, подсчет символов) - C++
Помогите решить задачку: Дана матрица 5х7, элементами которой являются значения символьного типа. Составить одномерный массив, содержащий...

Обработать очень длинный одномерный вектор - C++
Доброго времени суток. Необходимо обработать одномерный вектор. Вектор имеет очень большую длину и не влезает в одно направление блока: ...

5
n_zheka
0 / 0 / 0
Регистрация: 25.05.2010
Сообщений: 19
11.01.2011, 10:48  [ТС] #2
Ребята, подскажите хотябы одну часть.
Ума не приложу, как разделить массив на подмассивы, хотябы примерный код пожалуйста, дальше обработку сам попытаюсь сделать.
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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
1
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]
и еще вопрос, смогу ли я с этими подмассивами потом работать, по заданию эллементы еще нужно будет сортировать и еще пунк задания есть
Сформировать два отдельных массива для положительных и отрицательных элементов.
0
sandye51
программист С++
685 / 587 / 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;
}
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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, "НОК вектора положительных элементов: ");
}
0
11.01.2011, 21:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2011, 21:19
Привет! Вот еще темы с ответами:

Задан вектор X[20]. Положительные числа переписать в массив Y, а отрицательные в массив W - C++
Всем привет=) Помогите оформить правильно, фот наработка: for(int i = 0, j = 0, c = 0; i &lt; 20; i++) { if(x &lt; 0) { ...

Задан вектор X[20]. Положительные числа переписать в массив Y, а отрицательные в массив W - C++
Помогите с задачками 1.Задан вектор X. Положительные числа переписать в массив Y, а отрицательные в массив W. 2.Определить, сколько...

Массив: Все элементы массива, кратные трем, записать в одномерный массив. - C++
Дан двумерный массив размером n x n? заполненный целыми числами. Все его элементы кратные трем, записать в одномерный массив.

Массив: преобразорвать двумерный массив в одномерный и отсортировать его методом пузырька - C++
всем привет. народ помогите с прогой, конкретно с функцией sort (65 строка), она должна двухмерный массив перевести построчно в одномерный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru