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

Что за ошибка??? - C++

Восстановить пароль Регистрация
 
I_like_C++
14 / 14 / 1
Регистрация: 15.03.2010
Сообщений: 126
23.03.2010, 20:46     Что за ошибка??? #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
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
#include <iostream>
#include <vector>
#include <cmath>
#include <ctime>
#include <algorithm>
using namespace std;
void out(int n, vector<int> &f1)
{
    int q;
    cout<<"\nВведите параметр вывода\n1-в столбик\n2-в строку\nВвод:";cin>>q;
    switch(q)
    {
        case 1: 
            {
                for(int i=0; i<n;i++) 
                    cout<<i<<":"<<f1[i]<<endl;
                break;
            }
        case 2: 
            {
                for(int i=0; i<n;i++) 
                {
                    cout<<i<<":"<<f1[i]<<" ";
                }
                break;
            }
        default: break;
    }
    cout<<endl;
}
void sort_f1(int n, vector<int> &f1,vector<int> &f2)
{
    int x, t, m, Z, k=0;
    vector<int>::iterator iter;
    cout<<"\nЗадание №1:\nОтсортировать по возрастанию только элементы вектора, начинающиеся цифрой Z\n";
    cout<<"Введите число Z:";cin>>Z;
    for (iter=f1.begin(); iter!=f1.end(); iter++) 
    { 
        x=abs(*iter);
        t=abs(x);
        for (m=0; x/10!=0; m++)
            x/=10;
        for (int g=0 ; g<m; g++)
        {
            t/=10;
        }
        if (t==Z)
        {
            f2.push_back(*iter);
            k++;
        }
    }
    cout<<"\nЭлементы,начинающиеся на Z: "; 
    for(int i=0; i<k;i++)
    {
        cout<<f2[i]<<" ";
    }
    sort(f2.begin(),f2.end());
    m=f1.size();
    for( int i=0; i<k; i++)
    {
        for( int j=0; j<m; j++)
        {
            if(f2[i]==f1[j])
            {
                x=f1[j];
                f1[j]=f1[m-1];
                f1[m-1]=x;
                f1.pop_back();
                --j;
                m=f1.size();
            }
        }
    }
    f1.insert( f1.end(),f2.begin(),f2.end());
    cout<<"\nУпорядоченныe элементы Z в векторе: ";
    for(int i=0; i<n;i++)
    {
        cout<<f1[i]<<" ";
    }
    f2.clear();
}
void varik(vector<int>&f1,vector<int>&f2)
{
    int a,b;
    cout<<"\n\nЗадание №2:\nУдалить из вектора все эле-менты, принадлежащие не-которому диапазону";
    cout<<"\nЗадайте диапазон [a;b](через пробел)! Элементы вектора, принадлежащие этому\nдиапазону, будут удалены: ";cin>>a>>b;
    vector<int>::iterator iter;
    int m=f1.size(), x;
    for( int i=0; i<m; i++)
    {
        if(f1[i]>=a && f1[i]<=b)
        {
            x=f1[i];
            f2.push_back(x);
            f1[i]=f1[m-1];
            f1[m-1]=x;
            f1.pop_back();
            --i;
            m=f1.size();
        }
    }
    sort(f2.begin(),f2.end());
 
    cout<<"Получившийся вектор: ";
    for(iter=f1.begin(); iter!=f1.end();++iter)
    {
        cout<<*iter<<" ";
    }
}
void eee(vector<int>&f1,vector<int>&f2)
{
    cout<<"\n\nЗадание №3:\nПеред каждым числом, являющимся полным квадратом, вставить в первый вектор разность между минимумом и максиму-мом во втором векторе";
    vector<int>::iterator iter;
    int r1=f2.front();
    int r2=f2.back();
    int r=r2-r1;
    cout<<"\n\n";
    for(iter=f1.begin(); iter!=f1.end();++iter)
    {
        double x=*iter;
        double x1=floor(sqrt(x));
        double x2=ceil(sqrt(x));
        if ((x2-x1)==0)
        {
            f1.insert(iter,r);
        }
    }
}
int main()
{
    setlocale(0, "russian");
    srand((unsigned)time(NULL));
    vector<int> f1;
    vector<int> f2;
    int a,b,n;
    cout<<"Задайте количество элементов в векторе:";cin>>n;
    cout<<"Задайте диапазон значений[a;b](через пробел):";cin>>a>>b;
    for(int i=0; i<n;i++)
    f1.push_back(rand()%(b-a+1)+a);
    out(n,f1);
    sort_f1 (n,f1,f2);
    varik(f1,f2);
    eee(f1,f2);
 
system("pause");
return 0;
}
проблема с 3им заданием, а именно вот с этим
C++
1
2
3
4
5
6
7
8
9
10
for(iter=f1.begin(); iter!=f1.end();++iter)
    {
        double x=*iter;
        double x1=floor(sqrt(x));
        double x2=ceil(sqrt(x));
        if ((x2-x1)==0)
        {
            f1.insert(iter,r);
        }
    }
в цикле никак не хочет работать...скажите почему?? и что означает эта ошибка??
второй диапазон лучше задавать без включения туда полных квадратов 4, 9, 16, 25....если такие имеются=)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2010, 20:46     Что за ошибка???
Посмотрите здесь:

что за ошибка? C++
C++ что за ошибка?
C++ что за ошибка???
что за ошибка? C++
Что за ошибка? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Зоти Сергей
 Аватар для Зоти Сергей
228 / 226 / 13
Регистрация: 18.12.2009
Сообщений: 316
23.03.2010, 21:06     Что за ошибка??? #2
так а в чем ошибка? Программа выдает не те значения? Если в этом, то скорей всего потому, что у вас в задании написано
"вставить в первый вектор разность между минимумом и максиму-мом во втором векторе"
а вы в первый вектор вставляете разницу из первого вектора.

C++
1
2
3
4
5
6
for(iter=f1.begin(); iter!=f1.end();++iter)     // вот здесь, по идее должно быть for(iter=f2.begin(); iter!=f2.end();++iter) 
{
        double x=*iter;
        ...
        f1.insert(iter,r);
}
I_like_C++
14 / 14 / 1
Регистрация: 15.03.2010
Сообщений: 126
23.03.2010, 21:14  [ТС]     Что за ошибка??? #3
вот что я вставляю в первый вектор
C++
1
2
3
int r1=f2.front();
        int r2=f2.back();
        int r=r2-r1;
Зоти Сергей
 Аватар для Зоти Сергей
228 / 226 / 13
Регистрация: 18.12.2009
Сообщений: 316
23.03.2010, 21:20     Что за ошибка??? #4
так вы же пишете
C++
1
for(iter=f1.begin(); iter!=f1.end();++iter)
то есть
iter берете из f1
и потом вставляете его же в f1
а надо из f2
в f1
При этом вы увиличиваете размер вектора f1, и цикл будет длиться вечно если хоть раз сработает условие, когда x1-x2==0
I_like_C++
14 / 14 / 1
Регистрация: 15.03.2010
Сообщений: 126
23.03.2010, 22:02  [ТС]     Что за ошибка??? #5
ну так написано же ведь "...вставить в первый вектор..."
"Перед каждым числом(в первом векторе), являющимся полным квадратом, вставить в первый вектор разность между минимумом и максимумом во втором векторе"

напишите как должно быть плз

Добавлено через 32 минуты
все спс разобрался=))
прост выкинул этот итератор вонючий...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    int r1=f2.front();
    int r2=f2.back();
    int r=r2-r1;
    cout<<"\nРазность: "<<r<<endl;
    int m=f1.size();
    for(int i=0; i<m; i++)
    {
        double x=f1[i];
        double x1=floor(sqrt(x));
        double x2=ceil(sqrt(x));
        if ((x2-x1)==0)
        {
            f1.insert(f1.begin()+i , r );
            i++;
            m++;
        }
    }
Добавлено через 11 секунд
все спс разобрался=))
прост выкинул этот итератор вонючий...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    int r1=f2.front();
    int r2=f2.back();
    int r=r2-r1;
    cout<<"\nРазность: "<<r<<endl;
    int m=f1.size();
    for(int i=0; i<m; i++)
    {
        double x=f1[i];
        double x1=floor(sqrt(x));
        double x2=ceil(sqrt(x));
        if ((x2-x1)==0)
        {
            f1.insert(f1.begin()+i , r );
            i++;
            m++;
        }
    }
Зоти Сергей
 Аватар для Зоти Сергей
228 / 226 / 13
Регистрация: 18.12.2009
Сообщений: 316
23.03.2010, 22:10     Что за ошибка??? #6
вставьте просто после f1.insert(iter,r);
iter++;
Да не обязательно его выкидывать. Просто у вас, скажем было 10 елементов. А вы вставили 11-ый. А итератор на прежнем месте остался. По этому iter++ перенесет его на один эллемент вперед, чтобы не зацикливать программу.
Yandex
Объявления
23.03.2010, 22:10     Что за ошибка???
Ответ Создать тему
Опции темы

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