Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Динамические массивы С ++

Автор: ЛоРД¤ОЛЕДЖАН 21.07.2009 20:08

Нужно решить простинькую задачку о массивах
вычислить массив Z=sgrt(1+X) где X - положительные корни уравнения Ах+Вcos£, при А=0.75,
£=-1.5+i*h£,
i=0,n,
h£=0.5,
n=10

Автор: Account 22.07.2009 0:42

А где твое решение?)
И если проблема какая, то где вопрос?

Я не думаю что здесь кто то будет решать твою задачу за тебя)

Автор: ЛоРД¤ОЛЕДЖАН 22.07.2009 1:15

Как я могу написать мой свой вариант решения если С++ я начну учить только в сентебре а летнюю практику нужно написать на этом языке. :-(

Автор: volvo 22.07.2009 1:20

blink.gif Как же ты будешь сдавать решение на языке, который еще не начинал учить?

Автор: ЛоРД¤ОЛЕДЖАН 22.07.2009 1:40

Цитата(volvo @ 21.07.2009 21:20) *

blink.gif Как же ты будешь сдавать решение на языке, который еще не начинал учить?

мне сказали что прога должна быть на С++ а на первом курсе мы учили только Паскаль, вот я и прошу вас о помощи

Автор: Account 22.07.2009 3:17

а B чему равно перед косинусом ?

Вот что накидал


#include <vector>
#include <iostream>
#include <math.h>

using namespace std;

int main()
{ vector <double> z;
double x,a=0.75,b=0.5/*Здесь значение B*/; int n=10;
system("cls");
for(int i=0;i<=n;i++)
{
x=-(b*cos(-1.5+(i*0.5)))/a; //нахождение корня
if (x>0) z.push_back(sqrt(1+x));//проверка корня и если что
} // вычисление очередного э-та вектора Z
for(int i=0;i<z.size();i++)
cout<<"Z["<<i+1<<"]= "<<z[i]<<endl; //вывод содержимого вектора Z
getchar();
cout<<"Bay! Bay! \n";
return 0;
}


Но здесь вектор так сказать не опустошается, что наверное не есть гуд...

Автор: volvo 22.07.2009 4:53

Account
Во-первых, будет Warning, потому что размер vector-а - это unsigned int, а не просто int... Не надо смешивать знаковые и беззнаковые типы.

А во-вторых - не надо "освобождать" вектор. Сам удалится, как только выйдет из области видимости.

А вообще, скорее всего, речь шла не об STL. А о "ручном" выделении памяти через new. Они ж даже не начали изучать язык пока...

Автор: Account 22.07.2009 5:00

Цитата(volvo @ 22.07.2009 1:53) *

Account
Во-первых, будет Warning, потому что размер vector-а - это unsigned int, а не просто int... Не надо смешивать знаковые и беззнаковые типы.



А поконкретней можно пожалуйста, чтоб взять на заметку в будущем.

У меня вроде не показывает предупреждений, вот скрин


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: volvo 22.07.2009 5:40

Включи ВСЕ Warning-и: Project -> Build options -> скрин...

Прикрепленное изображение
Результат компиляции видно там же.

Автор: Account 22.07.2009 6:00

Включил, только в настройках, чтоб во всех проектах показывались все варнинги))

Тогда можно решить эту проблему во так

for(unsigned int i=0;i<z.size();i++)




Автор: ЛоРД¤ОЛЕДЖАН 22.07.2009 12:16

Вы спрашивали чему ровно В в условии ничего нету значит вводится с клавиатуры. И писать наверно нужно через nеw (хотя я не знаю что это) так как по ходу прога не должна быть сложной, на подготовления был только месяц за это время врятли много выучиш

Автор: Account 22.07.2009 17:05

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

#include <vector>
#include <iostream>
#include <math.h>

using namespace std;

int main()
{ double* z;
double x,a=0.75,b; int n=10,j=0;
system("cls");
cout<<"Vvedite B: ";
(cin>>b).get();
z = new double [n+1];
for(int i=0;i<=n;i++)
{
x=-(b*cos(-1.5+(i*0.5)))/a; //нахождение корня
if (x>0) {z[j]=sqrt(1+x);j++;}//проверка корня и если что
} // вычисление очередного э-та массива Z
for(int i=0;i<j;i++)
cout<<"Z["<<i<<"]= "<<z[i]<<endl; //вывод содержимого массива Z
getchar();
delete [] z ;

cout<<"Bay! Bay! \n";

return 0;
}


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

Автор: volvo 22.07.2009 17:17

Цитата
более оптимальный вариант
Написать в С-шном стиле, через realloc. Пример - здесь: http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

Я, если честно, до сих пор не совсем понимаю смысла задания. Написать летом на С++, но учить мы его будем только осенью. Это такая завуалированная форма стёба? Учим за лето язык сами? Смысл-то какой в написании программы? Человек же объяснить не сможет ни одной строки. Тем более, если сделать вот так:
    for(int i=0;i<=n;i++) {
if ((x=-(b*cos(-1.5+(i*0.5)))/a)>0) z[j++]=sqrt(1+x); // вычисление и проверка корня и если что
} // вычисление очередного э-а вектора Z

P.S. <vector> убери из программы, не нужен он...

Автор: Account 22.07.2009 17:25

ок убрал <vector> и подправил вычисления условия


#include <iostream>
#include <math.h>

using namespace std;

int main()
{ double* z;
double x,a=0.75,b; int n=10,j=0;
system("cls");
cout<<"Vvedite B: ";
(cin>>b).get();
z = new double [n+1];
for(int i=0;i<=n;i++)
if ((x=-(b*cos(-1.5+(i*0.5)))/a)>0) {z[j]=sqrt(1+x);j++;}//вычисление и проверка корня и если что
// вычисление очередного э-та массива Z

for(int i=0;i<j;i++)
cout<<"Z["<<i<<"]= "<<z[i]<<endl; //вывод содержимого массива Z
getchar();
delete [] z ;

cout<<"Bay! Bay! \n";

return 0;
}