Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157

Удалить из отсортированного вектора, числа которые являются "квадратными"

19.12.2013, 15:59. Показов 3274. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Есть вопросы по некоторым функциям, помогите плиз.

Вот допустим у меня идет сортировка вектора по убыванию, но не пойму как сделать сортировку только нечетных цифр?

Я не пойму как мне удалить из отсортированного вектора, числа которые являются "квадратными".

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
#include <iostream>
#include <ostream>
#include <iomanip>
#include <math.h>
 #include <vector>
#include <iterator>
 
int f1 (int n, int a, int b) //генерация чисел
    {   int total;
        for(int i=0; i<n; i++) 
             {
                 total = a + rand() % ( b - a + 1 ); //генерация случайных чисел в диапазоне а б
                 
             }
        return total;
    }
void show_vector( vector<int>&v1) 
    {
        vector<int>::iterator it; //Объявляем итератор
        for (it=v1.begin();it!=v1.end();it++)
        cout<<" "<<*it; //с помощью итератора выводим элементы вектора на экран
        cout<<endl;
        return;
    }
 
void BubbleSort(vector<int>&v1,int &n)// Отсортировать по убыванию те элементы вектора, которые содержат только нечёт-ные цифры
    {  
        for(int i=0; i<n; i++)
        for(int j=i+1; j<n; j++)    
        if(v1[i]<v1[j])swap(v1[j],v1[i]);
        return; 
    }
int delet (vector<int>v1, int &n) //Удалить из вектора все элементы, которые являют-ся полными квадратами.
    {   
        
    }
int main()
{ 
setlocale(LC_ALL, "Russian"); // функция локализации вызывается только один раз
int n, a, b;
cout<<" Введите Данные:"<< endl;
cout<<" "<< endl;
cout<<" Количество элементов вектора: "<< endl; cin>>n;
cout<<" "<< endl;
cout<<" Диапазон значений: "<< endl; cin>>a>>b;
cout<<" "<< endl;
system ("cls");
std::vector <int> v1; //Объявили вектор в n элементов. ВОЗМОЖНО нужно сразу резервировать и задавать кол-во элементов????
cout<<" Вектор заполнен: "<<endl; show_vector(v1);
cout<<" "<< endl;
for (int i=0;i<n;i++) v1.push_back(f1(n,a,b)); //заполняем вектор n случайными числами
cout<<" "<< endl;
//заполнили вектор и вывели
//задание 1 
BubbleSort(v1,n);
cout<<" Задание.1 Вектор отсортирован: "<<endl; show_vector(v1);
cout<<" "<< endl;
system("PAUSE"); 
return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.12.2013, 15:59
Ответы с готовыми решениями:

С клавиатуры вводятся длина (<=100) вектора и его (целые) элементы. Удалить из вектора все элементы, которые не являются составными числами. Результат
Напишите программу кто-нибудь.

Удалить из вектора все элементы, которые не являются совершенными числами
Помогите пожалуйста с задачей. Буду очень благодарна! С клавиатуры вводятся длина (&lt;=100) вектора и его (целые) элементы. Удалить...

Удалить из вектора все элементы, которые не являются простыми числами
Люди добрые! Помогите решить контрольную в Pascal 1. С клавиатуры вводятся длина (&lt;=100) вектора и его (целые) элементы. Удалить из...

34
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
21.12.2013, 23:31  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
о_О_Кто_здесь,
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
#include <vector>
#include <iostream>     
#include <algorithm>    
#include <iterator>
using namespace std;
bool isSquare(int arg){
  static const unsigned int squares[] = {
    0, 1, 4, 9,
    16, 25, 36, 49,
    64, 81, 100, 121,
    144, 169, 196, 225,
    256, 289, 324, 361,
    400, 441, 484, 529,
    576, 625, 676, 729,
    784, 841, 900, 961,
    1024, 1089, 1156, 1225,
    1296, 1369, 1444, 1521,
    1600, 1681, 1764, 1849,
    1936, 2025, 2116, 2209,
    2304, 2401, 2500, 2601,
    2704, 2809, 2916, 3025,
    3136, 3249, 3364, 3481,
    3600, 3721, 3844, 3969,
    4096, 4225, 4356, 4489,
    4624, 4761, 4900, 5041,
    5184, 5329, 5476, 5625,
    5776, 5929, 6084, 6241,
    6400, 6561, 6724, 6889,
    7056, 7225, 7396, 7569,
    7744, 7921, 8100, 8281,
    8464, 8649, 8836, 9025,
    9216, 9409, 9604, 9801,
    10000, 10201, 10404, 10609,
    10816, 11025, 11236, 11449,
    11664, 11881, 12100, 12321,
    12544, 12769, 12996, 13225,
    13456, 13689, 13924, 14161,
    14400, 14641, 14884, 15129,
    15376, 15625, 15876, 16129,
    16384, 16641, 16900, 17161,
    17424, 17689, 17956, 18225,
    18496, 18769, 19044, 19321,
    19600, 19881, 20164, 20449,
    20736, 21025, 21316, 21609,
    21904, 22201, 22500, 22801,
    23104, 23409, 23716, 24025,
    24336, 24649, 24964, 25281,
    25600, 25921, 26244, 26569,
    26896, 27225, 27556, 27889,
    28224, 28561, 28900, 29241,
    29584, 29929, 30276, 30625,
    30976, 31329, 31684, 32041,
    32400, 32761, 33124, 33489,
    33856, 34225, 34596, 34969,
    35344, 35721, 36100, 36481,
    36864, 37249, 37636, 38025,
    38416, 38809, 39204, 39601,
    40000, 40401, 40804, 41209,
    41616, 42025, 42436, 42849,
    43264, 43681, 44100, 44521,
    44944, 45369, 45796, 46225,
    46656, 47089, 47524, 47961,
    48400, 48841, 49284, 49729,
    50176, 50625, 51076, 51529,
    51984, 52441, 52900, 53361,
    53824, 54289, 54756, 55225,
    55696, 56169, 56644, 57121,
    57600, 58081, 58564, 59049,
    59536, 60025, 60516, 61009,
    61504, 62001, 62500, 63001,
    63504, 64009, 64516, 65025
  };
      const unsigned int *p = squares;
 
    if (p[128] <= arg) p += 128;
    if (p[ 64] <= arg) p +=  64;
    if (p[ 32] <= arg) p +=  32;
    if (p[ 16] <= arg) p +=  16;
    if (p[  8] <= arg) p +=   8;
    if (p[  4] <= arg) p +=   4;
    if (p[  2] <= arg) p +=   2;
    if (p[  1] <= arg) p +=   1;
    return *p==arg;
}
 
 
int main() {
    vector<int> v1;
    //for (int i=0;i<n;i++) v1.push_back(f1(n,a,b)); //заполняем вектор n случайными числами
    for (int i=0;i<5;i++){
        int dig;
        cin>>dig;
        v1.push_back(dig); 
    }
    cout<<endl;
    v1.erase(remove_if(v1.begin(), v1.end(), isSquare), v1.end());
    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, ", ") );
    cin.get();
    return 0;
}
спасибо большое! посижу разберусь, будут вопросы отпишусь!
0
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
21.12.2013, 23:36
о_О_Кто_здесь, ну это я просто свою функцию определения квадратного числа написал! В принципе, можешь её удалить и написать другую, свою, как тебе проще. сам main там 5 строчек занимает!
1
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 166
22.12.2013, 01:38
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
о_О_Кто_здесь,
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
#include <vector>
#include <iostream>     
#include <algorithm>    
#include <iterator>
using namespace std;
bool isSquare(int arg){
  static const unsigned int squares[] = {
    0, 1, 4, 9,
    16, 25, 36, 49,
    64, 81, 100, 121,
    144, 169, 196, 225,
    256, 289, 324, 361,
    400, 441, 484, 529,
    576, 625, 676, 729,
    784, 841, 900, 961,
    1024, 1089, 1156, 1225,
    1296, 1369, 1444, 1521,
    1600, 1681, 1764, 1849,
    1936, 2025, 2116, 2209,
    2304, 2401, 2500, 2601,
    2704, 2809, 2916, 3025,
    3136, 3249, 3364, 3481,
    3600, 3721, 3844, 3969,
    4096, 4225, 4356, 4489,
    4624, 4761, 4900, 5041,
    5184, 5329, 5476, 5625,
    5776, 5929, 6084, 6241,
    6400, 6561, 6724, 6889,
    7056, 7225, 7396, 7569,
    7744, 7921, 8100, 8281,
    8464, 8649, 8836, 9025,
    9216, 9409, 9604, 9801,
    10000, 10201, 10404, 10609,
    10816, 11025, 11236, 11449,
    11664, 11881, 12100, 12321,
    12544, 12769, 12996, 13225,
    13456, 13689, 13924, 14161,
    14400, 14641, 14884, 15129,
    15376, 15625, 15876, 16129,
    16384, 16641, 16900, 17161,
    17424, 17689, 17956, 18225,
    18496, 18769, 19044, 19321,
    19600, 19881, 20164, 20449,
    20736, 21025, 21316, 21609,
    21904, 22201, 22500, 22801,
    23104, 23409, 23716, 24025,
    24336, 24649, 24964, 25281,
    25600, 25921, 26244, 26569,
    26896, 27225, 27556, 27889,
    28224, 28561, 28900, 29241,
    29584, 29929, 30276, 30625,
    30976, 31329, 31684, 32041,
    32400, 32761, 33124, 33489,
    33856, 34225, 34596, 34969,
    35344, 35721, 36100, 36481,
    36864, 37249, 37636, 38025,
    38416, 38809, 39204, 39601,
    40000, 40401, 40804, 41209,
    41616, 42025, 42436, 42849,
    43264, 43681, 44100, 44521,
    44944, 45369, 45796, 46225,
    46656, 47089, 47524, 47961,
    48400, 48841, 49284, 49729,
    50176, 50625, 51076, 51529,
    51984, 52441, 52900, 53361,
    53824, 54289, 54756, 55225,
    55696, 56169, 56644, 57121,
    57600, 58081, 58564, 59049,
    59536, 60025, 60516, 61009,
    61504, 62001, 62500, 63001,
    63504, 64009, 64516, 65025
  };
      const unsigned int *p = squares;
 
    if (p[128] <= arg) p += 128;
    if (p[ 64] <= arg) p +=  64;
    if (p[ 32] <= arg) p +=  32;
    if (p[ 16] <= arg) p +=  16;
    if (p[  8] <= arg) p +=   8;
    if (p[  4] <= arg) p +=   4;
    if (p[  2] <= arg) p +=   2;
    if (p[  1] <= arg) p +=   1;
    return *p==arg;
}
 
 
int main() {
    vector<int> v1;
    //for (int i=0;i<n;i++) v1.push_back(f1(n,a,b)); //заполняем вектор n случайными числами
    for (int i=0;i<5;i++){
        int dig;
        cin>>dig;
        v1.push_back(dig); 
    }
    cout<<endl;
    v1.erase(remove_if(v1.begin(), v1.end(), isSquare), v1.end());
    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, ", ") );
    cin.get();
    return 0;
}
Хранить таблицу всех корней с одной стороны это правильно, но с другой мне кажется не оправдано, тем более это будет не плохо работать для двухбайтового числа, а если попробовать тот алгоритм о котором я говорил в начале, вот код:

C++
1
2
3
4
5
6
7
8
9
10
void deleteSquare(vector<int> *v1) 
{
    for (int i = 0; i < v1->size(); ) {
       int square = sqrt(v1->at(i));
       if (square * square == v1->at(i)) 
           v1->erase(i);
       else
           i++;
   }
}
Ну вот в принципе и вся функция, единственное не забудьте подключить хидорник math.h конечно будет работать медленнее чем приведенный выше код, зато функция получилось компактной)))))
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
22.12.2013, 01:56  [ТС]
Цитата Сообщение от ShadowFirst Посмотреть сообщение
Хранить таблицу всех корней с одной стороны это правильно, но с другой мне кажется не оправдано, тем более это будет не плохо работать для двухбайтового числа, а если попробовать тот алгоритм о котором я говорил в начале, вот код:

C++
1
2
3
4
5
6
7
8
9
10
void deleteSquare(vector<int> *v1) 
{
    for (int i = 0; i < v1->size(); ) {
       int square = sqrt(v1->at(i));
       if (square * square == v1->at(i)) 
           v1->erase(i);
       else
           i++;
   }
}
Ну вот в принципе и вся функция, единственное не забудьте подключить хидорник math.h конечно будет работать медленнее чем приведенный выше код, зато функция получилось компактной)))))
Спасибо вам за помощь!
0
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
22.12.2013, 20:26  [ТС]
Добрый день! почти все выполнил. спасибо за помощь.
ПОка было время раскинул мозгами, по поводу поиска квадратного числа
получилось так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool kvadrat(double a)//поиск квадратного числа
{
    
if(a<0) a=-a;
double b=sqrt(a);
if(b==(int(b))) return true;
else return false;
}
 
void delet (vector <int> &v1) //функция удаления квадрата из вектора
{
    v1.erase(remove_if(v1.begin(), v1.end(), kvadrat), v1.end());
    return;
}
Вроде все правильно находит. Правильно ли я сделал? и можно ли так делать.

Добавлено через 24 минуты
Добрый день! почти все выполнил. спасибо за помощь.
ПОка было время раскинул мозгами, по поводу поиска квадратного числа
получилось так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool kvadrat(double a)//поиск квадратного числа
{
    
if(a<0) a=-a;
double b=sqrt(a);
if(b==(int(b))) return true;
else return false;
}
 
void delet (vector <int> &v1) //функция удаления квадрата из вектора
{
    v1.erase(remove_if(v1.begin(), v1.end(), kvadrat), v1.end());
    return;
}
Вроде все правильно находит. Правильно ли я сделал? и можно ли так делать.
0
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
22.12.2013, 21:22  [ТС]
Теперь извращаюсь со вставкой в вектор. хм. не получается... ((

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool zifra2(int a) //поиск двухзначного числа
{
    
if(a<0) a=-a; //если число отрицательно перевернем
if(a>9 && a<100) return true; 
else return false;
}
 
void vstavka(vector <int> &v1, vector <int> &v3, int n) // вставка Перед элементами второго вектора, являющимися двузначными числами, вставить наибольшее по модулю число из первого вектора 
{
    for(int i=0; i<n;i++)
    {
        if(zifra2(v3[i])&& v3[i]<abs(v1[i]) ) // что-то типо если число вектора v3 двухзначное и это число меньше по модулю числа из ранее введенных в вектор v1
        {
    v3.insert(v3.begin()+zifra2(v3[i]),v1[i]); //тогда мы перед этим двухзначным числом вставляем то число, которое является больше него по модулю из вектора v1
    
    } 
        
    return;
}
Не могу пока что додуматься до этого. Буду признателен за советы.
0
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 166
23.12.2013, 01:26
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Теперь извращаюсь со вставкой в вектор. хм. не получается... ((

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool zifra2(int a) //поиск двухзначного числа
{
    
if(a<0) a=-a; //если число отрицательно перевернем
if(a>9 && a<100) return true; 
else return false;
}
 
void vstavka(vector <int> &v1, vector <int> &v3, int n) // вставка Перед элементами второго вектора, являющимися двузначными числами, вставить наибольшее по модулю число из первого вектора 
{
    for(int i=0; i<n;i++)
    {
        if(zifra2(v3[i])&& v3[i]<abs(v1[i]) ) // что-то типо если число вектора v3 двухзначное и это число меньше по модулю числа из ранее введенных в вектор v1
        {
    v3.insert(v3.begin()+zifra2(v3[i]),v1[i]); //тогда мы перед этим двухзначным числом вставляем то число, которое является больше него по модулю из вектора v1
    
    } 
        
    return;
}
Не могу пока что додуматься до этого. Буду признателен за советы.
У вас функция zifra2 возвращает булево значение, вы не можете его прибавить к итератору, так как тип данных не является число.
И это не все, вам нужно немного пересмотреть свою функцию, предлагаю следующий вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
void vstavka(int maxV1, vector <int> &v3)
{
    std::vector<int>::iterator it;
    maxV1 = abs(maxV1);
    for(it=myvector.begin(); it<myvector.end(); it++)
    {
         if(zifra2(v3[i])&& v3[i]<maxV1) {
         v3.insert(it+1,maxV1);
             it++;
     } 
}
Да и функцию zifra2 немного перепишем:
C++
1
2
3
4
5
bool zifra2(int a) 
{
    a = abs(a);
    return (a>9 && a<100);
}
Объясню что я сделал:
В функции vstavka, я изменил входные параметры, потому, что вы сами написали:
вставить наибольшее по модулю число из первого вектора
по этому на вход достаточно подать уже найденное максимальное число из v1.
и я не совсем понимаю для чего вам нужна n, если это длина вектора v3, то она все равно изменится если мы будем вставлять максимальное число с v1 после числа с v3, которое двухзначное, то есть длина массива v3 будет увеличиваться.

Добавлено через 10 минут
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Добрый день! почти все выполнил. спасибо за помощь.
ПОка было время раскинул мозгами, по поводу поиска квадратного числа
получилось так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool kvadrat(double a)//поиск квадратного числа
{
    
if(a<0) a=-a;
double b=sqrt(a);
if(b==(int(b))) return true;
else return false;
}
 
void delet (vector <int> &v1) //функция удаления квадрата из вектора
{
    v1.erase(remove_if(v1.begin(), v1.end(), kvadrat), v1.end());
    return;
}
Вроде все правильно находит. Правильно ли я сделал? и можно ли так делать.

Добавлено через 24 минуты
Добрый день! почти все выполнил. спасибо за помощь.
ПОка было время раскинул мозгами, по поводу поиска квадратного числа
получилось так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool kvadrat(double a)//поиск квадратного числа
{
    
if(a<0) a=-a;
double b=sqrt(a);
if(b==(int(b))) return true;
else return false;
}
 
void delet (vector <int> &v1) //функция удаления квадрата из вектора
{
    v1.erase(remove_if(v1.begin(), v1.end(), kvadrat), v1.end());
    return;
}
Вроде все правильно находит. Правильно ли я сделал? и можно ли так делать.
в принципе все хорошо но можно сократить ваш код на пару строчек)))
C++
1
2
3
4
5
bool kvadrat(double a)//поиск квадратного числа
{
double b=sqrt(abs(a));
return (b==(int(b)));
}
И кстати если функция не возвращает значения, то есть стоит возврат типа void не обязательно писать в конце функции return, это делается если нужно выйти из функции по среди ее выполнения, к примеру:
C++
1
2
3
4
5
void findMaxNumber (char *buff, int size) 
{
    if (size < 1) return;
    // Далее идет код для нахождения максимума.
}
Пример высосан из пальца, но надеюсь понятно что я хотел этим сказать.
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
23.12.2013, 20:15  [ТС]
Цитата Сообщение от ShadowFirst Посмотреть сообщение
У вас функция zifra2 возвращает булево значение, вы не можете его прибавить к итератору, так как тип данных не является число.
И это не все, вам нужно немного пересмотреть свою функцию, предлагаю следующий вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
void vstavka(int maxV1, vector <int> &v3)
{
    std::vector<int>::iterator it;
    maxV1 = abs(maxV1);
    for(it=myvector.begin(); it<myvector.end(); it++)
    {
         if(zifra2(v3[i])&& v3[i]<maxV1) {
         v3.insert(it+1,maxV1);
             it++;
     } 
}
Да и функцию zifra2 немного перепишем:
C++
1
2
3
4
5
bool zifra2(int a) 
{
    a = abs(a);
    return (a>9 && a<100);
}
Объясню что я сделал:
В функции vstavka, я изменил входные параметры, потому, что вы сами написали:

по этому на вход достаточно подать уже найденное максимальное число из v1.
и я не совсем понимаю для чего вам нужна n, если это длина вектора v3, то она все равно изменится если мы будем вставлять максимальное число с v1 после числа с v3, которое двухзначное, то есть длина массива v3 будет увеличиваться.

Добавлено через 10 минут


в принципе все хорошо но можно сократить ваш код на пару строчек)))
C++
1
2
3
4
5
bool kvadrat(double a)//поиск квадратного числа
{
double b=sqrt(abs(a));
return (b==(int(b)));
}
И кстати если функция не возвращает значения, то есть стоит возврат типа void не обязательно писать в конце функции return, это делается если нужно выйти из функции по среди ее выполнения, к примеру:
C++
1
2
3
4
5
void findMaxNumber (char *buff, int size) 
{
    if (size < 1) return;
    // Далее идет код для нахождения максимума.
}
Пример высосан из пальца, но надеюсь понятно что я хотел этим сказать.
Спасибо огромное за советы, я внимательно их разберу вечером после работы, если возникнут вопросы, напишу. Я очень вам всем признателен, за помощь и объяснения.

Добавлено через 6 часов 55 минут
Цитата Сообщение от ShadowFirst Посмотреть сообщение
У вас функция zifra2 возвращает булево значение, вы не можете его прибавить к итератору, так как тип данных не является число.
И это не все, вам нужно немного пересмотреть свою функцию, предлагаю следующий вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
void vstavka(int maxV1, vector <int> &v3)
{
* * std::vector<int>::iterator it;
* * maxV1 = abs(maxV1);
* * for(it=myvector.begin(); it<myvector.end(); it++)
* * {
* * * * *if(zifra2(v3[i])&& v3[i]<maxV1) {
* * * * *v3.insert(it+1,maxV1);
* * * * * * *it++;
* * *} 
}
C++
1
2
3
4
5
6
7
8
Да и функцию zifra2 немного перепишем:
 
 
bool zifra2(int a) 
{
* * a = abs(a);
* * return (a>9 && a<100);
}
Объясню что я сделал:
В функции vstavka, я изменил входные параметры, потому, что вы сами написали:
вставить наибольшее по модулю число из первого вектора
по этому на вход достаточно подать уже найденное максимальное число из v1.
и я не совсем понимаю для чего вам нужна n, если это длина вектора v3, то она все равно изменится если мы будем вставлять максимальное число с v1 после числа с v3, которое двухзначное, то есть длина массива v3 будет увеличиваться.
Да, с помощью n я перебирал вектор. вы написали
C++
1
2
3
if(zifra2(v3[i])&& v3[i]<maxV1) {
* * * * *v3.insert(it+1,maxV1);
* * * * * * *it++;
тут так и так понадобиться i, тогда как ее набавлять? не совсем улавливаю. Точнее как я еще могу сравнить элементы находящиеся в векторе. кроме как
C++
1
v3[i]
0
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 166
23.12.2013, 20:21
не совсем это я описался))
C++
1
2
3
if(zifra2(*it) && *it<maxV1) {
* * * * *v3.insert(it+1,maxV1);
* * * * * * *it++;
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
23.12.2013, 20:33  [ТС]
Цитата Сообщение от ShadowFirst Посмотреть сообщение
не совсем это я описался))
C++
1
2
3
if(zifra2(*it) && *it<maxV1) {
* * * * *v3.insert(it+1,maxV1);
* * * * * * *it++;
Понял, спасибо, Странно именно так и предполагал я. Осталось написать функцию нахождения максимального числа в векторе 1.
0
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 166
23.12.2013, 21:04
Не самая сложная штука всего 4 строчки кода

Добавлено через 1 минуту
Раз сказал а, скажу б)))
C++
1
2
3
4
int max = 0;
for (int i = 0; i < size; i++) 
    if (max < v1[i]) 
        max = v1[i];
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
12.01.2014, 15:29  [ТС]
Добрый день!
Вот, вернулся к данным заданиям.
Опять нуждаюсь в ваших советах.

Я немного переделал код

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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <iostream>
#include <ostream>
#include <iomanip>
#include <math.h>
#include <ctime>            // для генерации случайных чисел начиная с произвольного числа
 #include <vector>
#include <iterator>
#include <algorithm>
 
#include <cstdlib> 
using namespace std;
 
int f1 (int n, int a, int b) //генерация чисел
    {   int total;
        for(int i=0; i<n; i++) 
             {
                 total = a + rand() % ( b - a + 1 ); //генерация случайных чисел в диапазоне а б
                 
             }
        return total;
    }
 
void show_vector( vector<int>&v1) //    Написать функцию, выводящую на экран элементы вектора – в столбик с указанием индекса или в стро-ку через пробел без указания индекса
    {
        vector<int>::iterator it; //Объявляем итератор
        for (it=v1.begin();it!=v1.end();it++)
        cout<<" "<<*it; //с помощью итератора выводим элементы вектора на экран
        cout<<endl;
        return;
    }
 
bool zifra(int a)
{
    bool res=true;
    if(a<0) a=-a;
    int z=a%10;
    while(a>0 && z%2!=0) // пока есть в числе цифры и текущая цифра нечётная
    {
        a/=10; //отбросить последнюю цифру
        z=a%10; // взять новую текущую
    }
    if(a>0) res=false; // искать есть где -- попалась чётная цифра
    return res;
}
 
void BubbleSort(vector<int>&v1,int &n)// Отсортировать по убыванию те элементы вектора, которые содержат только нечётные цифры
{  
int tmp;
int n1=n-1;
for(int i = 0; i < n1; ++i) // i - номер прохода
    {            
        for(int j = i; j < n; ++j) // внутренний цикл прохода
            {    
                if(zifra(v1[i]) &&  zifra(v1[j]) && v1[i]<v1[j]) 
                    {
                        tmp = v1[j ]; 
                        v1[j ] = v1[i]; 
                        v1[i] = tmp;
                    }
            }
    }
}
 
bool kvadrat(double a)//поиск квадратного числа
{ 
bool res=true; //всегда правда
double b=sqrt(abs(a));//проверка условия
if (b==(int(b))); //если целое значит к=квадрат
else res=false; //если лож значит не квадратное число
return res; //возвращаем правду
}
bool kvadrat2(double a)//поиск квадратного числа для копирования их в вектор 2. т.е. своего рода обман, т.к. предикат должен быть истинным. По другому не знаю как реализовать. 
{ 
bool res=false; //всегда лож
double b=sqrt(abs(a));//проверка условия
if (b==(int(b))); //если целое значит к=квадрат
else res=true; //если правда значит не квадратное число
return res; //возвращаем правду
}
 
void delet (vector <int> &v1, vector<int> &v2) //Удалить из вектора все элементы, которые являют-ся полными квадратами.
{   
remove_copy_if( v1.begin(), v1.end(), std::back_inserter(v2), kvadrat2); //нужно скопировать квадратные числа в вектор два) я думаю, сделал это не совсем верно. Или не совсем верный способ. пришлось делать отдельный поиск квадрата с ложным значением и.к. предикат должен быть истинным.
v1.erase(remove_if(v1.begin(), v1.end(), kvadrat),v1.end()); //удаление квадратных чисел из вектора 1
 return;
}
 
 
/*
 
int maxV1(vector<int> &v1) //поиск максимального числа, впринцепи работает, но не смог применить, пробовал разные варианты, а так же поиска макс элемента сразу вовремя вставки.
{ 
int max=0;
for(int i=0;i<v1.size();i++)
{
   if(max<v1[i])
   max=v1[i];  
}
return max;
}
*/
bool zifra2(int a) 
{
    a = abs(a);
    return (a>9 && a<100);
}
 
void vstavka( vector <int> &v1, vector <int> &v3) //вставляем Максимальное число перед элементами 2 вектора(квадратные числа)
{
int max=0;
for(int i=0;i<v1.size();i++)
if(max<v1[i])
 max=v1[i]; 
 
 
 
std::vector<int>::iterator it;
    for(it=v3.begin(); it!=v3.end(); it++)
    {
    
    v3.insert(it,max);
     } 
}
 
 
int main()
{ 
setlocale(LC_ALL, "Russian"); // функция локализации вызывается только один раз
    int n, a, b;
    srand((unsigned)time(NULL));   // для генерации случайных чисел начиная с произвольного числа
    cout<<" Задание по варианту:"<< endl;
    cout<<" "<< endl;
    cout<<" 1) Отсортировать по убыванию те элементы вектора, кото-рые содержат только нечётные цифры"<< endl;
    cout<<" "<< endl;
    cout<<" 2) Удалить из вектора все элементы, которые являются полными квадратами."<< endl;
    cout<<" "<< endl;
    cout<<" 3) Перед элементами второго вектора, являющимися двузначными числами, вставить наибольшее по модулю число из первого вектора "<< endl;
    cout<<" "<< endl;
    cout<<" Введите Данные:"<< endl;
    cout<<" "<< endl;
    cout<<" Количество элементов вектора: "<< endl; cin>>n;
    cout<<" "<< endl;
    cout<<" Диапазон значений: "<< endl; cin>>a>>b;
    cout<<" "<< endl;
    system ("cls");
std::vector <int> v1, v2, v3; //Объявили вектор в n элементов. ВОЗМОЖНО нужно сразу резервировать и задавать кол-во элементов????
for (int i=0;i<n;i++) v1.push_back(f1(n,a,b)); //заполняем вектор n случайными числами
cout<<" "<< endl;
//заполнили вектор и вывели
cout<<" Вектор 1 заполнен: "<<endl; 
cout<<" "<< endl;
show_vector(v1);//вывод на экран
cout<<"  "<< endl;
//задание 1 
BubbleSort(v1,n);//сортировка
cout<<" Вектор 1 отсортированы только нечетные числа: "<<endl; 
cout<<" "<< endl;
show_vector(v1);//вывод на экран
cout<<" "<< endl;
cout<<" -------------------------------------------- "<< endl;
//задание 2
delet(v1,v2);//удаляем квадратные числа из вектора 1 
cout<<" Удалены квадратные числа: "; 
show_vector(v1);cout<<endl; //вывод на экран
cout<<" --------------------------------------------- "<< endl;
cout<<" Скопированы квадратные числа: ";
show_vector(v2);cout<<endl;//вывод на экран
cout<<" --------------------------------------------- "<< endl;
//задание 3
//cout<<maxV1(v1)<<endl;//максимальное число
cout<<" --------------------------------------------- "<< endl;
v3.assign(v2.begin(),v2.end());//скопировали в вектор 3 вектор 2, чтобы его больше не трогать.
cout<<" Скопирован вектор 2 в вектор 3: ";show_vector(v3);cout<<endl;//вывод на экран
cout<<" --------------------------------------------- "<< endl;
vstavka(v1,v3);//вставка
cout<<" Перед элементами 2 вектора было вставлено max число вектора 1: ";
show_vector(v3);cout<<endl;//вывод на экран
system("PAUSE"); 
return 0;
}
1) У меня вопрос по поводу копирования квадратных чисел в вектор 2. Я реализовал, но через заднее место имхо.
2) Мне нужно перед элементами 2 вектора (т.е. скопированные квадратные числа) вставить максимальное число вектора 1. Найти я его смог, а применить нет.
как это сделать?
Мне говорили делать не через интератор, а через find.
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.01.2014, 00:46
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
1) У меня вопрос по поводу копирования квадратных чисел в вектор 2
Для этого можно использовать std::copy_if
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
вставить максимальное число вектора 1. Найти я его смог
, а для этого - std::max_element
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
19.01.2014, 21:48  [ТС]
Цитата Сообщение от DiffEreD Посмотреть сообщение
Для этого можно использовать std::copy_if

, а для этого - std::max_element
Я пытался вставить, но не выходит.
что-то типо:

C++
1
2
3
4
5
6
7
8
9
std::vector<int>::iterator it, it2;
it2=std::max_element(v1.begin(), v1.end());
 
    for(it=v2.begin(); it!=v2.end(); it++)
    {
 
 
v3.insert(it+1,it2);
    }
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.01.2014, 23:10
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
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <limits>
#include <functional>
#include <random>
#include <ctime>
 
std::ostream& operator << (std::ostream& os, std::vector<int>& v)
{
   std::copy(v.begin(), v.end(), std::ostream_iterator<int>(os, " "));
   os << "\n";
   return os;
}
 
bool is_quadratic(int num)
{
   return (num > 1 &&  sqrt(num) - static_cast<int> (sqrt(num)) <= std::numeric_limits<double>::epsilon());
}
 
int main()
{
   std::default_random_engine gen(static_cast<unsigned>(time(nullptr)));
   std::uniform_int_distribution<> dist(0, 100);
 
   std::vector<int> v(80);
   std::generate(v.begin(), v.end(), std::bind(dist, gen));
   std::cout << v;
 
   std::vector<int> quadratics;
   std::copy_if(v.begin(), v.end(), std::back_inserter(quadratics), std::ref(is_quadratic));
   std::cout << "\n\nQuadratic number: " << quadratics;
 
   int max_elem = *std::max_element(v.begin(), v.end());
   std::cout << "Max element in v: " << max_elem << "\n";
   quadratics.insert(quadratics.begin(), max_elem);
   std::cout << quadratics;
 
   return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.01.2014, 23:10

Удалить из вектора все элементы, которые являются совершенными числами
Здравствуйте уважаемые модераторы! помогите, пожалуйста, написать 2 программы: 1. С клавиатуры вводятся длина (&lt;=100) вектора и его...

Сформировать массив К из тех элементов вектора Х, которые являются степенью числа 2
Мне необходимо разобраться с двумя задачами для делфи... Не могу перевести задачи из паскаляв делфи, к сожалению... 1 Задан целый...

Сформировать массив К из тех элементов вектора Х, которые являются степенью числа 2
уважаемые форумчане помогите пожалуйста разобраться с 2мя задачами на паскале 1 Задан целый вектор X(n), n&lt;=16. Сформировать...

Удалить из файла все числа, которые являются палиндромом
Дано файл, компоненти котрого – цілі шестизначні числа. Видалити з файлу всі числа, які є паліндромом (однаково читається в обох...

Удалить в массиве все положительные числа, которые являются палиндромами
Удалите в целочисленном массиве все положительные числа, которые являются палиндромами. Использовать подпрограмму.


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

Или воспользуйтесь поиском по форуму:
35
Закрытая тема Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru