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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
#1

Почему не заполняется массив vector? - C++

17.09.2015, 07:48. Просмотров 633. Ответов 25
Метки нет (Все метки)

Здравствуйте!

Не могу понять, почему не заполняется массив vector..
Он в классе объявлен типа public.

C++ (Qt)
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
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
 
class RunKutMer{
private:
    float a,y0,InEps,h;//x=a, f(x)=f(a)=y0, h - шаг
    float k1,k2,k3,k4,k5; //коэффициенты для рассчетов
    int i=0;
public:
vector <float> H; //создали массив для h
vector <float> Y; // создали массив значений для у
vector <float> X; // создали массив значений для x
 
vector <float> dY;
 
vector <float> Eps; //массив значений для точности эпсилон
 
 
    float f(float x, float y){
       return x*x+y*y-4;
      }
//нужно по-видимому запихивать получившиеся значения в массив
    //мы используем vector
 
    void EnterData(){
        cout<<"Enter a= ";cin>>a;
        X.push_back(a); //теперь в массиве X есть первый элемент
        cout<<"Enter the amount of function f(a)= ";cin>>y0;
        Y.push_back(y0);//теперь в массиве Y есть первый элемент
        cout<<"Enter Eps= ";cin>>InEps;//точность введенная пользователем, ОНА НЕ МЕНЯЕТСЯ
        //Eps.push_back(InEps);
        cout<<"Enter step h= ";cin>>h;
        H.push_back (h);  //записал в массив H первый элемент h
    }
    void OutPut(){
        cout<<"a= "<<a<<endl;
        cout<<"f(a)= "<<y0<<endl;
    }
    void Body(){
        i=0;
X[1]=2;X[2]=0;
    //   for(;;){//бесконечный цикл
//Почему не заполняется массивы X, Y, H и Eps???
           X[i+1]=X[i]+H[i];
 
           k1=(H[i]/3)*(f(X[i],Y[i]));
           k2=(H[i]/3)*(f(X[i]+H[i]/3,Y[i]+k1));
           //cout<<endl<<"k1= "<<k1<<endl<<"k2= "<<k2<<endl;
           k3=(H[i]/3)*(f(X[i]+H[i]/3,Y[i]+k1/2+k2/2));
           k4=(H[i]/3)*(f(X[i]+H[i]/2,Y[i]+(3.0/8)*k1+(9.0/8)*k3 ));
           k5=(H[i]/3)*(f(X[i]+H[i],Y[i]+(3.0/2)*k1-(9.0/2)*k3+6*k4 ));
 
           dY[i]=(1.0/2)*(k1+4*k4+k5);
           Y[i+1]=Y[i]+dY[i];
 
           i++;
           //сделали выше первую итерацию, теперь уточняем эпсилон и соответственно шаг h
           Eps[i]=(1.0/5)*(k1+4*k4-(9.0/2)*k3-(1.0/2)*k5);
 
           //условие проверки для эпсилон
           cout<<Eps[i];
      // }
    }
 
 
};
 
int main()
{
      RunKutMer W;
      W.EnterData();
      W.OutPut(); //так как переменные типа private, то обращаться к ним можно только через функции
      cout<<endl<<W.H[0]<<endl;cout<<W.X[0]<<endl;cout<<W.Y[0]<<endl;//проверил, что действительно занес все в vectora
      W.Body();
 
 
}
Может ли кто-то сказать, почему не заполняются массивы X, Y, H и Eps?

И как это исправить?

Добавлено через 25 минут
А всё понятно..

Дурак я, команды push_back( ) ведь нигде нету..

Добавлено через 22 минуты
А неет. Не в этом дело, вот подправил так:

C++ (Qt)
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
void Body(){
 
//X[1]=2;X[2]=0;
    //   for(;;){//бесконечный цикл
 
           X[i+1]=X[i]+H[i];
           X.push_back(X[i+1]);           // записали в массив Х
 
           k1=(H[i]/3)*(f(X[i],Y[i]));
           k2=(H[i]/3)*(f(X[i]+H[i]/3,Y[i]+k1));
 
           //cout<<endl<<"k1= "<<k1<<endl<<"k2= "<<k2<<endl;
 
           k3=(H[i]/3)*(f(X[i]+H[i]/3,Y[i]+k1/2+k2/2));
           k4=(H[i]/3)*(f(X[i]+H[i]/2,Y[i]+(3.0/8)*k1+(9.0/8)*k3 ));
           k5=(H[i]/3)*(f(X[i]+H[i],Y[i]+(3.0/2)*k1-(9.0/2)*k3+6*k4 ));
 
           dY[i]=(1.0/2)*(k1+4*k4+k5);
           dY.push_back(dY[i]);            // записали значение в массив dY
           Y[i+1]=Y[i]+dY[i];
                      Y.push_back(Y[i+1]); // записали значение в массив Y
 
           i++;
           //сделали выше первую итерацию, теперь уточняем эпсилон и соответственно шаг h
           Eps[i]=(1.0/5)*(k1+4*k4-(9.0/2)*k3-(1.0/2)*k5);
                      Eps.push_back(Eps[i]);
 
           //условие проверки для эпсилон
 
      // }
    }
И всё равно не работает... Почему?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2015, 07:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему не заполняется массив vector? (C++):

В общем, не пойму почему криво заполняется массив - C++
#include &quot;stdafx.h&quot; #include &quot;time.h&quot; #include &quot;stdlib.h&quot; int _tmain(int argc, _TCHAR* argv) { const int N = 10, MIN = -5,...

Записать числа из файла в двумерный массив или вектор вроде такого vector<vector<int>> - C++
Добрый день, подскажите пожалуйста как лучше и проще считывать файл. в файле записаны числа, разделенные пробелами и запятыми: 1, 2, 3,...

Почему не заполняется список? - C++
void HashTable::insert(int student_number, std::string f_name, std::string m_name, std::string l_name, std::string debts) { ...

Почему не заполняется дерево? - C++
Всё никак не могу заполнить дерево. Исходя из моих тестов, не создается даже корень. Вот мой код заполнения: if (root = 0) { Tree...

Почему некорректно заполняется структура? - C++
1-й вариант #include &lt;fstream&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; struct { uint16_t bfType; ...

Заполнить массив строк из файла. Массив заполняется, но выводится не корректно - C++
Здравствуйте! Такая проблема. В файле имена записаны в столбик и разделены точкой с запятой. Массив заполняется, но выводится не корректно....

25
Игорь1986
50 / 114 / 29
Регистрация: 08.09.2014
Сообщений: 1,016
Завершенные тесты: 1
17.09.2015, 08:39 #2
Что за массивы X, Y, H и Eps, я вижу что это вектора, а в векторах работают через итератор, а не как с простым массивом. В принципе увидел что 2 должна влезть в ваш вектор X, отладчиком посмотрите, что в векторах
0
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
17.09.2015, 08:46  [ТС] #3
С отладчиком тоже какая-то проблема. Не могу понять. что не так..
Причем тут файл allacator.h??

И справа, когда кликаю на окно переменных ничего не происходит..

А не подскажете, как должен выглядеть код, чтобы работало все?
0
Миниатюры
Почему не заполняется массив vector?  
Игорь1986
50 / 114 / 29
Регистрация: 08.09.2014
Сообщений: 1,016
Завершенные тесты: 1
17.09.2015, 09:27 #4
Ну что написал показать то тебе и показало
cout<<endl<<W.H[0]<<endl;cout<<W.X[0]<<endl;cout<<W.Y[0]<<endl;
оно и вывело тебе 1 2 0, пиши задачу как надо сделать, в коде один жирный вопрос
зачем тебе i если оно явно задано, и значения X[1]=2;X[2]=0; тоже интересно, вообще код удивляет

Добавлено через 2 минуты
И на картинке я вижу не твой код, где брекпойнты в твоей проге
0
S_el
2124 / 1651 / 311
Регистрация: 15.12.2013
Сообщений: 6,480
17.09.2015, 09:31 #5
Цитата Сообщение от Игорь1986 Посмотреть сообщение
а в векторах работают через итератор, а не как с простым массивом.
Можно и через интерфейс как у массива.
0
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
17.09.2015, 09:32  [ТС] #6
Цитата Сообщение от Игорь1986 Посмотреть сообщение
X[1]=2;X[2]=0
Это просто я сделал для проверки, это же закомментировано. Я спрашивал, почему я при запуске отладчика не могу посмотреть то, что у меня записано в переменных? (для этого картинка и прикреплена).

А сделать мне надо следующее:

Вот я вычисляю коэффициенты k1, k2,k3, k4, k5.
Потом с их помощью вычисляю X[i+1], Y[i+1], dY[i+1]

и задача в том, чтобы сформировать массивы (X, Y, dY ) из этих значений.

Вопрос: как это сделать, и просьба, пожалуйста, напишите пару строчек кода, чтобы он делал, то что я написал выше и помогите понять, что вы написали.

P.S.
брэкпоинт в конце метода Body()
0
Игорь1986
50 / 114 / 29
Регистрация: 08.09.2014
Сообщений: 1,016
Завершенные тесты: 1
17.09.2015, 09:39 #7
Для того чтобы просмотреть значения поставь брекпойнт в твоей функции main, и проходи пошагово через f10.
Непонятно зачем тебе итератор если у тебя по одному элементу в векторе, если было бы больше то пожалуйста
for(int i = 0; i < myVector.size(); i++)
И в третьих выводишь ты только 0 элемент вектора, а их там уже по 2 элемента, следовательно циклить надо с выводом,
S_el с тобой согласен выше привел так как ты сказал
1
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
17.09.2015, 09:45  [ТС] #8
Почему в массиве X, Y по одному элемету?

Он записывает в них один элемент в методе EnterData(),
а в методе Body() хоть и есть команды push_back() ничего не происходит.

В отладчике это видно, почему там только один элемент??
0
Миниатюры
Почему не заполняется массив vector?  
Игорь1986
50 / 114 / 29
Регистрация: 08.09.2014
Сообщений: 1,016
Завершенные тесты: 1
17.09.2015, 09:46 #9
Тоесть после вызова функции Body()
делай
for(int i = 0; i < W.H.size(); i++)
cout << W.H[i] << ' ';
Брекпойнт поставь в теле Body() на строке Eps[i]=(1.0/5)*(k1+4*k4-(9.0/2)*k3-(1.0/2)*k5);
тогда поймешь, выше вроде сказал что элементов в векторах по 2 , выводишь только 0
0
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
17.09.2015, 09:47  [ТС] #10
Цитата Сообщение от Игорь1986 Посмотреть сообщение
or(int i = 0; i < W.H.size(); i++)
cout << W.H[i] << ' ';
Там всего один элемент почему то.
Возвращает ошибку
0
Игорь1986
50 / 114 / 29
Регистрация: 08.09.2014
Сообщений: 1,016
Завершенные тесты: 1
17.09.2015, 09:52 #11
Правильно я недоглядел push_back только один раз вызван в функции EnterData() а в функции Body() никого ты никуда не записываешь, там же тоже так надо
0
S_el
2124 / 1651 / 311
Регистрация: 15.12.2013
Сообщений: 6,480
17.09.2015, 09:53 #12
Blitzor DDD, лучше сформулируйте поставленную перед вами задачу. Так будет проще вам помочь.
А вообще обратите внимание на функцию Body.
У вас используется не инициализированная i + вы забыли выделить память под элементы вектора.
0
Blitzor DDD
13 / 13 / 1
Регистрация: 17.08.2015
Сообщений: 460
17.09.2015, 09:58  [ТС] #13
Нет, Игорь, Вы доглядели

вот тут, я исправил в самом начале


C++ (Qt)
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
void Body(){
 
//X[1]=2;X[2]=0;
    //   for(;;){//бесконечный цикл
 
           X[i+1]=X[i]+H[i];
           X.push_back(X[i+1]);           // записали в массив Х
 
           k1=(H[i]/3)*(f(X[i],Y[i]));
           k2=(H[i]/3)*(f(X[i]+H[i]/3,Y[i]+k1));
 
           //cout<<endl<<"k1= "<<k1<<endl<<"k2= "<<k2<<endl;
 
           k3=(H[i]/3)*(f(X[i]+H[i]/3,Y[i]+k1/2+k2/2));
           k4=(H[i]/3)*(f(X[i]+H[i]/2,Y[i]+(3.0/8)*k1+(9.0/8)*k3 ));
           k5=(H[i]/3)*(f(X[i]+H[i],Y[i]+(3.0/2)*k1-(9.0/2)*k3+6*k4 ));
 
           dY[i]=(1.0/2)*(k1+4*k4+k5);
           dY.push_back(dY[i]);            // записали значение в массив dY
           Y[i+1]=Y[i]+dY[i];
                      Y.push_back(Y[i+1]); // записали значение в массив Y
 
           i++;
           //сделали выше первую итерацию, теперь уточняем эпсилон и соответственно шаг h
           Eps[i]=(1.0/5)*(k1+4*k4-(9.0/2)*k3-(1.0/2)*k5);
                      Eps.push_back(Eps[i]);
 
           //условие проверки для эпсилон
 
      // }
    }
Добавлено через 52 секунды
Мне кажется, что тут я довольно чётко сформулировал задачу

Цитата Сообщение от Blitzor DDD Посмотреть сообщение
А сделать мне надо следующее:
Вот я вычисляю коэффициенты k1, k2,k3, k4, k5.
Потом с их помощью вычисляю X[i+1], Y[i+1], dY[i+1]
и задача в том, чтобы сформировать массивы (X, Y, dY ) из этих значений.
Вопрос: как это сделать, и просьба, пожалуйста, напишите пару строчек кода, чтобы он делал, то что я написал выше и помогите понять, что вы написали.
Добавлено через 1 минуту
Цитата Сообщение от S_el Посмотреть сообщение
У вас используется не инициализированная i + вы забыли выделить память под элементы вектора.
Как, я ведь в самом начале это делаю

Цитата Сообщение от Blitzor DDD Посмотреть сообщение
int i=0;
Добавлено через 2 минуты
Цитата Сообщение от Blitzor DDD Посмотреть сообщение
и задача в том, чтобы сформировать массивы (X, Y, dY ) из этих значений.
А-а. Может быть, я нечетко сказал. Это будет крутиться в цикле некоторое количество итераций до тех пор, пока не будет соблюдена точность эпсилон. Поэтому массив заполнится элементами, а здесь я хочу чисто принципиально понять, почему я не могу записать в него новые элементы...
0
Игорь1986
50 / 114 / 29
Регистрация: 08.09.2014
Сообщений: 1,016
Завершенные тесты: 1
17.09.2015, 09:59 #14
Поставь брейки в Body() и посмотри чему равны значения векторов, есть ли они там, при первом проходе
0
Kerry_Jr
Модератор
Эксперт PHP
2209 / 2005 / 702
Регистрация: 14.05.2014
Сообщений: 5,870
Записей в блоге: 1
Завершенные тесты: 5
17.09.2015, 10:01 #15
Цитата Сообщение от S_el Посмотреть сообщение
вы забыли выделить память под элементы вектора.
Как это?
Не понял.
0
17.09.2015, 10:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2015, 10:01
Привет! Вот еще темы с ответами:

Vector обектов почему не работает? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;fstream&gt; #include...

Не заполняется массив - C++
Здравствуйте! Подскажите, пожалуйста, почему при создании нового массива, размерность создается, а сам массив не заполняется. Код: ...

Не заполняется массив - C++
Здравствуйте, не передается заполненный массив и не понимаю в чем проблема: N = 15 void Print(int *a, int n) { for (int...

Не заполняется массив - C++
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace std; int m, n, a, b, c; int mas; int masd; int _tmain(int argc,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru