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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
19.12.2013, 15:59     Удалить из отсортированного вектора, числа которые являются "квадратными" #1
Добрый день!
Есть вопросы по некоторым функциям, помогите плиз.

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

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

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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2013, 15:59     Удалить из отсортированного вектора, числа которые являются "квадратными"
Посмотрите здесь:

C++ Проверить утверждение "результатами вычислений по формуле x*x+x+17 при 0 ≤ х ≤ 15 являются простые числа"
C++ Определить количество слов, которые содержат ровно четыре буквы "о", "О"
C++ Определить длину каждого слова. Удалить все буквы "а" и "о" с фамилии
C++ Проверить утверждение "результатами вычислений по формуле х^2+х+17, при 0 <=х <= 15, являются простые числа"
Если возможно, упорядочить булевы вектора, или вывести сообщение "Вектора несравнимы" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
21.12.2013, 23:31  [ТС]     Удалить из отсортированного вектора, числа которые являются "квадратными" #21
Цитата Сообщение от 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;
}
спасибо большое! посижу разберусь, будут вопросы отпишусь!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.12.2013, 23:36     Удалить из отсортированного вектора, числа которые являются "квадратными" #22
о_О_Кто_здесь, ну это я просто свою функцию определения квадратного числа написал! В принципе, можешь её удалить и написать другую, свою, как тебе проще. сам main там 5 строчек занимает!
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
22.12.2013, 01:38     Удалить из отсортированного вектора, числа которые являются "квадратными" #23
Цитата Сообщение от 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 конечно будет работать медленнее чем приведенный выше код, зато функция получилось компактной)))))
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
22.12.2013, 01:56  [ТС]     Удалить из отсортированного вектора, числа которые являются "квадратными" #24
Цитата Сообщение от 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 конечно будет работать медленнее чем приведенный выше код, зато функция получилось компактной)))))
Спасибо вам за помощь!
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
22.12.2013, 20:26  [ТС]     Удалить из отсортированного вектора, числа которые являются "квадратными" #25
Добрый день! почти все выполнил. спасибо за помощь.
ПОка было время раскинул мозгами, по поводу поиска квадратного числа
получилось так:

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;
}
Вроде все правильно находит. Правильно ли я сделал? и можно ли так делать.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
22.12.2013, 21:22  [ТС]     Удалить из отсортированного вектора, числа которые являются "квадратными" #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;
}
Не могу пока что додуматься до этого. Буду признателен за советы.
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
23.12.2013, 01:26     Удалить из отсортированного вектора, числа которые являются "квадратными" #27
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Теперь извращаюсь со вставкой в вектор. хм. не получается... ((

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;
    // Далее идет код для нахождения максимума.
}
Пример высосан из пальца, но надеюсь понятно что я хотел этим сказать.
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
23.12.2013, 20:15  [ТС]     Удалить из отсортированного вектора, числа которые являются "квадратными" #28
Цитата Сообщение от 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]
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
23.12.2013, 20:21     Удалить из отсортированного вектора, числа которые являются "квадратными" #29
не совсем это я описался))
C++
1
2
3
if(zifra2(*it) && *it<maxV1) {
* * * * *v3.insert(it+1,maxV1);
* * * * * * *it++;
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
23.12.2013, 20:33  [ТС]     Удалить из отсортированного вектора, числа которые являются "квадратными" #30
Цитата Сообщение от ShadowFirst Посмотреть сообщение
не совсем это я описался))
C++
1
2
3
if(zifra2(*it) && *it<maxV1) {
* * * * *v3.insert(it+1,maxV1);
* * * * * * *it++;
Понял, спасибо, Странно именно так и предполагал я. Осталось написать функцию нахождения максимального числа в векторе 1.
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
23.12.2013, 21:04     Удалить из отсортированного вектора, числа которые являются "квадратными" #31
Не самая сложная штука всего 4 строчки кода

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

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

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.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.01.2014, 00:46     Удалить из отсортированного вектора, числа которые являются "квадратными" #33
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
1) У меня вопрос по поводу копирования квадратных чисел в вектор 2
Для этого можно использовать std::copy_if
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
вставить максимальное число вектора 1. Найти я его смог
, а для этого - std::max_element
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
19.01.2014, 21:48  [ТС]     Удалить из отсортированного вектора, числа которые являются "квадратными" #34
Цитата Сообщение от 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);
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2014, 23:10     Удалить из отсортированного вектора, числа которые являются "квадратными"
Еще ссылки по теме:

Удалить из двусвязного списка все элементы до первого "*" и после последнего "*" C++
Удалить из массива числа, которые являются полным квадратом и имеют нечетную сумму цифр C++
C++ Удалять в словах, которые заканчиваются на букву "А" все другие буквы "А"

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

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.01.2014, 23:10     Удалить из отсортированного вектора, числа которые являются "квадратными" #35
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;
}
Yandex
Объявления
19.01.2014, 23:10     Удалить из отсортированного вектора, числа которые являются "квадратными"
Закрытая тема Создать тему
Опции темы

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