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

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

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

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2013, 15:59
Ответы с готовыми решениями:

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

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

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

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

34
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
21.12.2013, 23:31  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
21.12.2013, 23:36 22
о_О_Кто_здесь, ну это я просто свою функцию определения квадратного числа написал! В принципе, можешь её удалить и написать другую, свою, как тебе проще. сам main там 5 строчек занимает!
1
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 166
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 конечно будет работать медленнее чем приведенный выше код, зато функция получилось компактной)))))
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
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 конечно будет работать медленнее чем приведенный выше код, зато функция получилось компактной)))))
Спасибо вам за помощь!
0
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
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;
}
Вроде все правильно находит. Правильно ли я сделал? и можно ли так делать.
0
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
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;
}
Не могу пока что додуматься до этого. Буду признателен за советы.
0
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 166
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;
    // Далее идет код для нахождения максимума.
}
Пример высосан из пальца, но надеюсь понятно что я хотел этим сказать.
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
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]
0
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 166
23.12.2013, 20:21 29
не совсем это я описался))
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  [ТС] 30
Цитата Сообщение от 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 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];
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
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.
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.01.2014, 00:46 33
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
1) У меня вопрос по поводу копирования квадратных чисел в вектор 2
Для этого можно использовать std::copy_if
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
вставить максимальное число вектора 1. Найти я его смог
, а для этого - std::max_element
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
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);
    }
0
1458 / 795 / 257
Регистрация: 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;
}
1
19.01.2014, 23:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2014, 23:10
Помогаю со студенческими работами здесь

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

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

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

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

Удалить из массива числа, которые являются полным квадратом и имеют нечетную сумму цифр
Дан массив из N целых чисел, где N&lt;=16, каждое число в диапазоне от –32000 до 32000. Удалить из...

Удалить из массива числа, которые являются полным квадратом и имеют нечетную сумму цифр
Помогите пожалуйста разработать программу на языке программирования С++. Дан массив из N целых...


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

Или воспользуйтесь поиском по форуму:
35
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru