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

Использование динамических массивов - C++

Восстановить пароль Регистрация
 
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
05.10.2010, 00:10     Использование динамических массивов #1
Прошу вашей помощи в решении след задачи (не нужно мне, чтоб вы решали, а хотя б подсказали как все это организовать).

Мне надо решить систему Дифф уравнений. Предмет - баллистика. Суть примерно в том, что летит летательный аппарат, на каждом шаге надо вычислять кучу параметров. В один момент (который естественно заранее мы вычислить не решая систему не можем), ЛА падает. Это и есть сигнал к выходу из решения. Я подумал и решил, что реализовать это надо с помощью динамических массивов. Но в моем учебнике доходчиво их использование не объяснено, мсдн тож не особо помог.

Вопрос: как организовать цикл, чтобы прям в нем сначала проверялось логическое условие, что высота h все еще больше нуля, и если так, то считаем ДУ на один шаг, т.е. все наши динамические массивы увеличиваются еще на один элемент?

Если я невнятно объяснил, то можно хотя б примеры простенькие использования дин массивов таким образом?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2010, 00:10     Использование динамических массивов
Посмотрите здесь:

Использование динамических массивов C++
C++ Обработка динамических массивов
Из динамических массивов в обычные C++
C++ Обработка динамических массивов
C++ Динамических массивов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.10.2010, 00:17     Использование динамических массивов #2
cam_rus, Если С++ - вектор.
Вектор
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
05.10.2010, 00:23     Использование динамических массивов #3
cam_rus, самое верное решение - не использовать дин. массивы вообще.
Lavroff посоветовал vector, но, на мой взгляд, лучше list, т.к. он как раз сделан для расширяющихся размеров, и память не будет перераспределяться.
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
05.10.2010, 00:24  [ТС]     Использование динамических массивов #4
а нет, важно тогда уточнение, что именно на С. потому что до объектов я пока не дорос, а темпы работы навалились так, что с нуля вникнуть в объекто-ориентированное программирование не успею.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
05.10.2010, 00:28     Использование динамических массивов #5
cam_rus, если си, тогда читайте про malloc и free. Можно выделить память под больший размер, чем есть, и перераспределять память по необходимости, умножая размер на 2 или 1,5.
Это как вариант, можно много что придумать, в зависимости от конкретной задачи.
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
05.10.2010, 00:32  [ТС]     Использование динамических массивов #6
да что-то вычитал про _MAX_PATH .
я в начале сам задаю значения нулевых элементов, а вот как потом в цикле организовать присваивание массиву далее - не понимаю...
попробую что ли часть кода вклеить, поможете с ошибками?
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
void vivod_arr (float arr[], int size)
{
    int i; 
    for(i = 0; i < size; ++i)
      printf("%f, ", arr[i]);
   printf("\n");
 
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    
    int i = 0;
    int size = 0;
    float *arr;
 
   printf("enter size of array: ");
   scanf("%d", &size);
 
 arr = (float*)malloc( _MAX_PATH  * sizeof(float));
 
 
 for (i=size; ; i++)
 {
 
     scanf_s("%f\n",arr[i]);
     size++;
 }
 
 vivod_arr(arr,size);
   free(arr);
 
   system("pause");
   return 0;
вот в цикле фор не понимаю, как сделать...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.10.2010, 00:35     Использование динамических массивов #7
C
1
for (i=size; ; i++)
Условие окончания неплохо бы...
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
05.10.2010, 00:38  [ТС]     Использование динамических массивов #8
ух, просто это маленький эпиход большой программы в будующем. мне внутри цикла надо будет сделать функцию, которая будет вычислять методом Рунге-Кутта значение массива в каждой точке, а не как у меня с клавиатуры вводить...
Но писать функцию нет смысла, пока не понял, как изменять массив в принципе.
Поэтому можно взять для примера любое условие, например, пока не будет введен положительный элемент или что угодно
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
05.10.2010, 00:39     Использование динамических массивов #9
cam_rus, на сколько я помню, _MAX_PATH - это просто максимальный размер пути файла в ОС. Причем тут он.
Попробуйте так переделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int _tmain(int argc, _TCHAR* argv[])
{
        int i = 0;
        int size = 0;
        float *arr;
 
   printf("enter size of array: ");
   scanf("%d", &size);
 
 arr = (float*)malloc( size* sizeof(float));
 
 
 for (i=0; i<size; i++)
 {
         scanf("%f",&arr[i]);
 }
 
 vivod_arr(arr,size);
   free(arr);
 
   system("pause");
   return 0;
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
05.10.2010, 00:55  [ТС]     Использование динамических массивов #10
во, да так заработало. но так по сути, я знаю заранее размер массива и заполняю с учетом этого размера.
а мне нужно что-то вроде вот такого условия:
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
int _tmain(int argc, _TCHAR* argv[])
{
    
    int i = 0;
    int size = 0;
    float *arr;
    int h=1;
 
   //printf("enter size of array: ");
   //scanf("%d", &size);
 
 arr = (float*)malloc( size  * sizeof(float));
 
 arr[0]=100; i=0;
 while (arr[i]>0) 
 {
    arr[i+1]=arr[i]-h;
    i++;
    size=i;
 
 }
 
 vivod_arr(arr,size);
   free(arr);
 
   system("pause");
   return 0;
 
}
то есть условие выходы из цикла связано с вычислениями внутри него.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
05.10.2010, 01:01     Использование динамических массивов #11
Чтобы прервать цикл по условию можно внутри цикла написать:
C++
1
if(условие) break;
На счет увеличивающего размера - завтра напишу, если никто к этому времени не поможет. Сегодня уже поздно.
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
05.10.2010, 01:42  [ТС]     Использование динамических массивов #12
Цитата Сообщение от gooseim Посмотреть сообщение
Чтобы прервать цикл по условию можно внутри цикла написать:
C++
1
if(условие) break;
На счет увеличивающего размера - завтра напишу, если никто к этому времени не поможет. Сегодня уже поздно.
ну да, можно и так, но тогда мне цикл запускать так:
C
1
2
3
4
5
6
7
for (i=0; i=10000; i++)
{
 
...вычисления с arr[i], от которой H зависит напрямую...
 
if (h<0) break;
}
но тогда теряется смысл в использовании динамических массивов же... я тупо беру с запасом верхний предел.
а хотелось бы как-то так:
C
1
2
3
4
5
6
7
8
arr[0]=100; i=0;
 while (arr[i]>0) 
 {
        arr[i+1]=arr[i]-h;
        i++;
        size=i;
 
 }
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
05.10.2010, 15:17     Использование динамических массивов #13
Вот, пример работы с динамическим массивом в си. Пока не введен ноль, размер массива увеличивается.
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
int main()
{
        int i = 0;
        int size = 1;
        float *arr;
 
 arr = (float*)malloc( size* sizeof(float));
 
 
 for (i=0; ;i++)
 {
    scanf("%f",&arr[i]);
    if(arr[i]==0)
    {
        size--;
        break;
    }
    else
    {
        size++;
        arr=(float*)realloc(arr, size*sizeof(float));
    }
 
 }
 
 vivod_arr(arr,size);
   free(arr);
 
   system("pause");
   return 0;
}
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
11.10.2010, 21:47  [ТС]     Использование динамических массивов #14
О, спасибо большое действительно так работает.

А вот теперь у меня опять проблема возникла:
изменил цикл вот на такой:

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
int _tmain(int argc, _TCHAR* argv[])
{
    
    int i = 0;
    int size=1;
             int n=6;
    
    float *Vk, *teta, *x,*y,c;
        
 
Vk = (float*)malloc( size  * sizeof(float));
teta = (float*)malloc( size  * sizeof(float));
 Vk[0]=100; i=0;
 
 //Active
 
 for (i=0; i=n-1;i++)
 {
    scanf("%f",&Vk[i]);
    size++; 
     Vk=(float*)realloc(Vk, size*sizeof(float));
 }
 
   printf("razmer=%d\n", size);
   vivod_arr(Vk,size);
   free(Vk);
 
   system("pause");
   return 0;
 
}
и я получаю ошибку в цикле - несколько раз он считывает правильно, а затем выкидывает. В чем проблема?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
11.10.2010, 22:08     Использование динамических массивов #15
Всю тему не читал - лениво. Может уже предлагали.
Я бы в данном случае использовал связный список. Потому как просто динамический массив использовать не очень экономно - перевыделять память надо не под один очередной элемент, а сразу под группу, обычно перевыделенная память равняется полутора-двум объёмам выделенной ранее. Но что, если у нас есть уже 500 элементов, мы перевыделили память под 1000, посчитали 501 элемент и поняли, что пора завершать расчёт. Связный список - решение, потому как память каждый раз выделяется под очередной элемент списка, а фрагментации памяти наблюдаться не будет, ибо для списков нету такого ограничения, что все элементы должны храниться друг за дружкой в памяти, как у массивов.
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
11.10.2010, 22:19  [ТС]     Использование динамических массивов #16
Я просто не умею использовать связные списки. А как использовать динамический массив - вот тут как раз объяснили, но похоже я что-то не так понимаю, если даже такой элементарный цикл не могу заставить работать.

А делать как-то надо...
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
13.10.2010, 13:55  [ТС]     Использование динамических массивов #17
Блин, если никто помочь не может, хотя бы книгу посоветуйте, чтоб в дин массивы воткнуть...
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
13.10.2010, 14:05     Использование динамических массивов #18
Может условие не правильное? Такое пойдёт:
C++
1
for (i=0; i<n;i++)
или я не о том подумал?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2010, 14:15     Использование динамических массивов
Еще ссылки по теме:

Обработка одномерных динамических массивов C++
C++ Использование динамических массивов в решение задач
Обработка динамических массивов C++

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

Или воспользуйтесь поиском по форуму:
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
13.10.2010, 14:15  [ТС]     Использование динамических массивов #19
Ахаха!
Блин, точно! Вот это косяк))
Спасибо!
Yandex
Объявления
13.10.2010, 14:15     Использование динамических массивов
Ответ Создать тему
Опции темы

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