Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2015, 07:55   #1
1ViV1
Пользователь
 
Регистрация: 16.09.2015
Сообщений: 13
По умолчанию Почему не заполняется массив vector?

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

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


Код:
#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();
 
 
}
Думал, что дело в отсутствии команды push_back () и подправил так

Код:
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]);
 
           //условие проверки для эпсилон
 
      // }
    }
И все равно не помогло...
В чем дело, помогите пожалуйста разобраться.
Как правильно сделать?

Заранее спасибо!
1ViV1 вне форума Ответить с цитированием
Старый 17.09.2015, 08:54   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А почему ты решил что он не заполняется?
И кстати, по-моему с вектором нельзя так вот произвольно добавлять (X[1]=2;X[2]=0.
Работай с динамическим массивом, или в векторе размер укажи.
Код:
		X.resize(...Тут размер);
X[1]=2;X[2]=0;
I'm learning to live...

Последний раз редактировалось Stilet; 17.09.2015 в 08:56.
Stilet вне форума Ответить с цитированием
Старый 17.09.2015, 09:05   #3
1ViV1
Пользователь
 
Регистрация: 16.09.2015
Сообщений: 13
По умолчанию

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

А массив не заполняется, я через отладчик смотрю, а там вообще какая-то ерунда в этом отладчике



Не могу понять. что не так..
Причем тут файл allacator.h??

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

А не подскажете, как должен выглядеть код, чтобы работало все?

Последний раз редактировалось 1ViV1; 17.09.2015 в 09:06. Причина: не добавился файл
1ViV1 вне форума Ответить с цитированием
Старый 17.09.2015, 09:31   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
я не знаю, какой он будет длины
Тогда push_back() используй.
Цитата:
я через отладчик смотрю, а там вообще какая-то ерунда в этом отладчике
vector это не массив, а класс. Конечно ты в отладчике будешь видеть не данные а свойства
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.09.2015, 09:36   #5
1ViV1
Пользователь
 
Регистрация: 16.09.2015
Сообщений: 13
По умолчанию

Чего то все равно не могу понять.... :-(((
1ViV1 вне форума Ответить с цитированием
Старый 17.09.2015, 10:05   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я имел ввиду такое:
Код:
void Body(){
 
X.push_back(2);
X.push_back(0);
    //   for(;;){//бесконечный цикл
 
           X.push_back(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.push_back((1.0/2)*(k1+4*k4+k5));
           Y.push_back(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]);
 
           //условие проверки для эпсилон
 
      // }
    }
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не заполняется форма в Access? Vrednaya Помощь студентам 5 16.04.2013 18:41
Массив картинок, плохо заполняется Shmulya Помощь студентам 0 16.12.2012 20:25
Дан динамический массив который в водится с клавиатуры и заполняется рандомом. Вывести на экран то , что на фото Richik123 Паскаль, Turbo Pascal, PascalABC.NET 5 23.04.2012 00:20
двумерный массив в vector Dimarik Общие вопросы C/C++ 1 10.03.2011 15:40
vector<T>::iterator begin - почему не компилируется? AndyBr Общие вопросы C/C++ 5 12.03.2009 19:56