Модераторы: 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   Вверх
NDQuattro
Дата 15.4.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



перепоправлю, так пожалуй делайте:

Код

double * array = NULL;


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


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



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


Опытный
**


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

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



Цитата(mrbrooks @ 15.4.2009,  19:39)
смею предложить использовать std::vector или я не оригинален?

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

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


Шустрый
*


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

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



Оно??
Код

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

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

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

#pragma argsused
main()
{
int i,n,min,nul,S,per;
printf("Please, enter quantity elements of mas\n");
cin>>n;
int *a=new int[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);
 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);
delete[] a;
getch ();
}
//---------------------------------------------------------------------------


Добавлено через 7 минут и 39 секунд
Вот с этим "std::vector" ты не оригинален... Я не понимаю и не хочу понимать его. Нам его не задавали.
PM MAIL   Вверх
Remiznik
Дата 15.4.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



строка 24 !!
не обезательно что минимальный элемент будет первым ! так что для первого сравнения min надо задать заведомо меньше всех элементов в масиве !

ну если не хочешь знать только то что тебе задают ты далеко не пойдёш =))


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


depict1
****


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

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



Цитата(Remiznik @  15.4.2009,  19:45 Найти цитируемый пост)
и потому во многих книгах сначала описываться дин.масс а потом уже идёт рассказ об STL и Vector )

Во многих, но не во всех.
В книге С++ Primer сначала учат работать с STL и векторами, а уже потом, между делом, объясняют что есть такие штуки, как дин.массивы и указатели.


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


Шустрый
*


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

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



Remiznik, не понял, для чего? мы же далее перебираем по всему массиву. Главное что он принадлежит массиву.
PM MAIL   Вверх
Remiznik
Дата 15.4.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(NDQuattro @ 15.4.2009,  20:11)
Remiznik, не понял, для чего? мы же далее перебираем по всему массиву. Главное что он принадлежит массиву.

дурак согласен ) исправлюсь =))
PM MAIL   Вверх
mrbrooks
Дата 16.4.2009, 06:23 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(mgkit @  15.4.2009,  19:49 Найти цитируемый пост)
Я не понимаю и не хочу понимать его.

Вот он настоящий быдлокодерский подход. Не стоит продолжать в том же духе. Должна быть тяга к познанию неизвестного.
PM MAIL   Вверх
Rififi
Дата 16.4.2009, 08:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



mrbrooks, 
Вот он настоящий быдлокодерский подход. Не стоит продолжать в том же духе. Должна быть тяга к познанию неизвестного.
не обязательно. может он вообще ботан какой-нибудь(ака гуманитарий) (: тогда ему программирование только на уровне сдал зачёт - забыл, в сферу IT он не пойдет, значит в полку быдлокодеров не прибудет.

PM MAIL   Вверх
bsa
Дата 16.4.2009, 15:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(Rififi @ 16.4.2009,  08:34)
в сферу IT он не пойдет, значит в полку быдлокодеров не прибудет.

будем на это очень надеяться
PM   Вверх
mgkit
Дата 16.4.2009, 23:39 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ПОШЛИ ВЫ В Ж*ПУ, ВОТ КОГДА ВЫ БУДЕТЕ ВОЗВРАЩАТЬСЯ ДОМОЙ В 23.00, ШЕСТЬ ДНЕЙ В НЕДЕЛЮ, Я НА ВАШЕ СТРЕМЛЕНИЕ ПОСМОТРЮ...

Добавлено через 1 минуту и 35 секунд
 smile  smile  smile  smile  smile 
PM MAIL   Вверх
NDQuattro
Дата 17.4.2009, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Наверное *бухать меньше надо -))) и по клубам и по клубам))
не один ты такой, я например из дому выхожу пол шестого и домой опять же пол шестого, только вечера ужо(
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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