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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Обработчик текстовых файлов http://www.cyberforum.ru/cpp-beginners/thread226327.html
Написать программу-обработчик текстовых файлов,что б создавала текстовый файл в котором текст выравнивается за левым краем(без переносов) с сохранением абзацев. Файл-источник и файл-приемник указать...
C++ Матрица 7х7 Среди столбцов заданной целочисленной матрицы с размера 7х7, компоненты которой не привышают 10 найти столбец с минимальным произведением элементов http://www.cyberforum.ru/cpp-beginners/thread226322.html
дополнить 1 строку в программе C++
# include <stdio.h> # include <Windows.h> int strlen(char *word) { int i; for (i=0; word!='\0'; i++); return i; } int kk(char *str)
При отладке выдается ошибка сегментации C++
Всем привет! :) У меня такая проблема: программа по численным методам (кусок кода - дифференциальная прогонка), pu - массив 101 на 101, заполнен целиком (от нуля до ста), компилятор (Dev С++) при...
C++ Квадрат AA http://www.cyberforum.ru/cpp-beginners/thread226304.html
Всё я разобрался!
C++ Найти ошибку Что не дописал в коде? при выборе, например, 10 или 11 выдает "гриб", а не "грибов" А если вбить 99, то выдает "грибов" ,т.е. правильно #include "stdafx.h" #include <stdio.h> #include <conio.h>... подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
11.01.2011, 21:19
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru