Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамические массивы 
V
    Опции темы
mgkit
Дата 15.4.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



Привет всем
Задание такого типа:
В одномерном массиве, состоящем из N целых элементов, вычислить: 
1) минимальный по модулю элемент массива;
2) сумму модулей элементов массива, расположенных после первого элемента, равного пулю.
Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в четных позициях, а во второй половине — элементы, стоявшие в нечетных позициях.
Вот решение:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
main()
{
int a[1000],i,n,min,nul,S,per;
printf("Please, enter quantity elements of mas\n");
cin>>n;
printf("\n---------------------------------\n\n");
 for(i=0; i<n; i++)
  {
    printf("Please, enter %i massive element\n",i);
    cin>>a[i];
  }
 min=abs(a[0]);
 S=0;

 for(i=1; i<n; i++)
  if (min>abs(a[i]))
   min=a[i];

 for(i=0; i<n; i++)
   if (a[i]==0)
    {
     nul=i;
     break;
    }

 for(i=nul; i<n; i++)
  S=S+abs(a[i]);

 for(i=0; i<n; i++)
   if (fmod(i,2)==0)
    {
     per=a[i/2];
     a[i/2]=a[i];
     a[i]=per;
    }

  for(i=0; i<n; i++)
    printf(" %i ",a[i]);
   printf("\nMin element for abs = %i\nSum elements for 0 elemnt = %i\n",min,S);
getch ();
}
//---------------------------------------------------------------------------

Нужно сделать тоже самое через указатели. Не могли бы вы мне помочь с этим?
(почему я не сделал сам? да потому что надоело искать в сети нормального объяснения дин. массивов, уж лучше на примере пойму)


Это сообщение отредактировал(а) mgkit - 15.4.2009, 18:23
PM MAIL   Вверх
NDQuattro
Дата 15.4.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 18.7.2008
Где: Украина

Репутация: нет
Всего: нет



Код

   cin >> n;
   double *Array = new double [n];


имеешь массив Array из n элементов.

или же с помощью функции calloc или malloc:

Код

Array=(float *)malloc(n*sizeof(float));


В этом случаее включи еще malloc.h

в чем неясность? 

Это сообщение отредактировал(а) NDQuattro - 15.4.2009, 18:34
PM MAIL   Вверх
mgkit
Дата 15.4.2009, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



мм... На сколько я понимаю(из прочитанного), указателю не нужно знать из скольких элементов состоит массив, просто вводишь и он записывает в определённую ячейку памяти... Так что я вообще не понимаю, причём тут n и что такое "double" тоже плохо представляю...
PM MAIL   Вверх
NDQuattro
Дата 15.4.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 18.7.2008
Где: Украина

Репутация: нет
Всего: нет



double это вещественный тип, как и флоат.

Имеется ввиду указатель на память размером n (данного типа).

Это сообщение отредактировал(а) NDQuattro - 15.4.2009, 18:43
PM MAIL   Вверх
mgkit
Дата 15.4.2009, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



Люди которые довольно хорошо знают "среду" говорят очивидные(для них) вещи, а вот тем кто задал вопрос, яснее не становится
Так, чувствую придется думать самому


PM MAIL   Вверх
Remiznik
Дата 15.4.2009, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



что бы  понять что такое динамический массив с начало надо разобраться что такое указатель ! 
и если чесно то в каждой книге для начинаюших С++ теме указателей отведено очень большое внимание .... а как разберёшся что такое указатель динамические масивы станут гараздо яснее )

Это сообщение отредактировал(а) Remiznik - 15.4.2009, 18:58
PM MAIL   Вверх
mgkit
Дата 15.4.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



Две книги на руках "Начальный курс С и С++" Б.И. Березин С.Б.Березин(забавно, братья скорее всего) и "С/С++ и Borland C++ Builder для студента" Борис Пахомов. С указателями вроде понял, а вот как выполнять операции с массивом с помощью них не воткнул, т.к. почти везде объясняется с помощью строк. Я понимаю что строки это массив char, но всё же...
PM MAIL   Вверх
NDQuattro
Дата 15.4.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 18.7.2008
Где: Украина

Репутация: нет
Всего: нет



Цитата(mgkit @  15.4.2009,  18:53 Найти цитируемый пост)
Люди которые довольно хорошо знают "среду" говорят очивидные(для них) вещи, а вот тем кто задал вопрос, яснее не становится

ЛМАО.
Я сам язык только начинаю изучать и думаю что написал весьма доступно.
PM MAIL   Вверх
Anikmar
Дата 15.4.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Вот строка из вашего кода:
Код

int a[1000],i,n,min,nul,S,per;


Вы там работаете с массивом целых чисел а.

Теперь делаем так:
Код

int *a = new int[1000];
int i,n,min,nul,S,per;


Теперь у вас динамический массив, причем ничего в коде менять не надо, только в конце необходимо освободить память, добавив команду
Код

delete[] a;


Так понятнее?

Это сообщение отредактировал(а) Anikmar - 15.4.2009, 19:11
PM MAIL ICQ   Вверх
Remiznik
Дата 15.4.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



так что строкит что численые массивысуть одна и таже ...... есть указатель на первую ячаюку массива и с помошью [] ты можешь пермешать указатель к нужному элементу в массиве !
если ты разобрался с простым массиво в чом трудность динамических ? 
просто память под динамический выделяеться вовремя выполнения програмы и ты выбираешь тип элементов чтоб системе знала размер каждой ячейки памяти и указываешь количество элементов ... тоесть сколько ячеек памяти тебе нужно чтоб выделила система !

только из-за того что ты берёшь память у системы сам ты должен следить за тем чтоб после эиспользования память вернулась системе иначи будут траблы !!! но это уже отдельная тема )


Anikmar, хороший совет , но не плохо бы чтоб он понимал суть )


Это сообщение отредактировал(а) Remiznik - 15.4.2009, 19:16
PM MAIL   Вверх
mgkit
Дата 15.4.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



мм... 
А обращаться с помощью указателя к каждому элементу как? 
А разве не должны вводиться элементы без ограничения n? 
new int - что делает?
PM MAIL   Вверх
Anikmar
Дата 15.4.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(mgkit @  15.4.2009,  19:18 Найти цитируемый пост)
А обращаться с помощью указателя к каждому элементу как? 
А разве не должны вводиться элементы без ограничения n? 

В С++ контроль за границами массива ложится на программиста. 

По указателю - легко, почитайте арифметические действия с указателями. В вашем случае, например так:
Код

*a = 5; // Присваиваем самому первому элементу (аналог a[0] = 5)
*(a+5) = 5; // Присваиваем шестому элементу (аналог a[5] = 5)


И так далее.
PM MAIL ICQ   Вверх
Remiznik
Дата 15.4.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



Код

 double * array; // указатель на элемент типа double
 array=new double[n]; // оператор new динамически выделяет память под n элементов double 
                                    // указатель array указывает на первую ячейку памяти массива
 array[0]; // обрашение к первому элементу массива можеш делать с ним что хочешь 
 array[1]; // обрашение ко второму элементу 
 .....  и так далее до n-1 


если я не прав думаю колеги поправят ))
PM MAIL   Вверх
Anikmar
Дата 15.4.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Remiznik @  15.4.2009,  19:27 Найти цитируемый пост)
если я не прав думаю колеги поправят )) 

Поправляю:
Указатель на double. Никакого элемента пока еще нет - он пока ни на что не указывает. Надо присвоить ему адрес какой-нибудь переменной double или, в данном случае, ему присваивается адрес массива таких элементов.
PM MAIL ICQ   Вверх
Remiznik
Дата 15.4.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

Репутация: 1
Всего: 1



Цитата(Anikmar @ 15.4.2009,  19:31)
Указатель на double. Никакого элемента пока еще нет - он пока ни на что не указывает. Надо присвоить ему адрес какой-нибудь переменной double или, в данном случае, ему присваивается адрес массива таких элементов.

согласен ! просто я видно не очень корректно наверно выразился )
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.