Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сумма элементов массива, посчитать сумму элементов 
:(
    Опции темы
neweraser
Дата 15.3.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
neweraser
Дата 15.3.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



даже так пробовал
Код

var
  mas1: array [0..1, 0..99] of string;
  mas2: array of integer;
...
repeat
  begin
  setlength(mas2, i);
  mas2[i]:= StrToInt(mas1[0, i]);
  i:= i + 1;
end;
until SumInt(mas2) < 875000;

ошибки пишет

Это сообщение отредактировал(а) neweraser - 15.3.2008, 18:41


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
aktuba
Дата 15.3.2008, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

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



Ууууууууу.... Как все запущено... Я, честно говоря, не совсем понял задачу, но пример переделал так:
Код

var
  mas1: array [0..1, 0..99] of string;
  mas2: array of integer;
  i: integer;
  lSum: integer;
...
begin
  i := 0;
  lSum := 0;
  repeat
    setlength(mas2, i);
    mas2[i]:= StrToInt(mas1[0, i]);
    Inc(lSum, mas2[i]);
    Inc(i);
  until lSum < 875000;
end;



--------------------
user posted image
PM MAIL WWW Skype   Вверх
neweraser
Дата 15.3.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



пишет ошибку Access Violation из-за строчки
Код

mas2[i]:= StrToInt(mas1[0, i]);



--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 15.3.2008, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



setlength(mas2, i + 1);

Добавлено через 1 минуту и 30 секунд
И вообще если i будет больше 99 то выйдем за пределы второго массива.
Короче придумай другое решение.

Добавлено через 2 минуты и 21 секунду
И последнее, перераспределять постоянно пямять (SetLength) не есть гуд
PM MAIL   Вверх
Qu1nt
Дата 15.3.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

SetLength(mas2, i + 1);

Торможжу... (%

Это сообщение отредактировал(а) Qu1nt - 15.3.2008, 20:34
PM MAIL   Вверх
neweraser
Дата 15.3.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



получается так, что в массив вводится только один элемент... не знаю, что тут можно придумать...
VICTAR,
Цитата(VICTAR @  15.3.2008,  20:31 Найти цитируемый пост)
перераспределять постоянно пямять (SetLength) не есть гуд 

объясни пожалуйста, почему


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
THandle
Дата 15.3.2008, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



Цитата(neweraser @  15.3.2008,  21:05 Найти цитируемый пост)
объясни пожалуйста, почему

может получится Out of Memory.
PM   Вверх
neweraser
Дата 15.3.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



тогда не знаю, может здесь можно обойтись без массива, а добавлять куда-нибудь в строки типа stringlist или listbox? ну там, по идее, тоже нужно выделять память, как вы думаете тут можно что-нибудь еще сделать?


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 15.3.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(neweraser @  15.3.2008,  21:05 Найти цитируемый пост)
объясни пожалуйста, почему

Это долгая и не рациональная процедура.
Память нужно выделять по возможности с запасом, как например делается в TList (Capacity).

Цитата(neweraser @  15.3.2008,  21:37 Найти цитируемый пост)
тогда не знаю, может здесь можно обойтись без массива,

Объясни подробней задачу, что ты хочешь получить. 
PM MAIL   Вверх
neweraser
Дата 15.3.2008, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(VICTAR @  15.3.2008,  21:46 Найти цитируемый пост)
Объясни подробней задачу, что ты хочешь получить. 

у меня есть массив с данными о размерах файлов, предназначенных для записи на диск, но размер файлов может быть больше, чем размер диска (их может быть на 1, 2, 3 и т.д. дисков). тут я придумал, что можно сделать так, чтобы размеры файлов из первого массива записывались во второй массив до тех пор, пока их сумма будет меньше размера диска, потом файлы записываются на диск и их данные удаляются из обоих массивов, далее цикл продолжается до тех пор, пока в первом массиве ничего не останется.
надеюсь, вы меня поняли


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 15.3.2008, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вот что-нибудь в этом роде
Код

procedure TForm1.Button1Click(Sender: TObject);
const
  MaxSize = 875000;
var
  lSource, //исходный массив
  lDest: array of Integer;
  lSum,
    i,
    j,
    lMax: Integer;
begin
  Randomize;
  SetLength(lSource, Random(100) + 1); //от 1 до 100
  for i := 0 to High(lSource) do      //это твой
    lSource[i] := Random(100000);     //исходный массив
  i := 0;
  j := 0;
  lSum := 0;
  lMax := High(lSource);
  while i <= lMax do
  begin
    if ((lSum + lSource[i]) > MaxSize) or (i = lMax) then
    begin
      SetLength(lDest, i - j);
      Move(lSource[j], lDest[0], (i - j) * SizeOf(Integer));
      j := i;
      lSum := 0;
      //записываешь диск (размеры в массиве lDest)
    end;
    Inc(lSum, lSource[i]);
    Inc(i);
  end;
end;

PM MAIL   Вверх
neweraser
Дата 16.3.2008, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



VICTAR, трудно так сразу разобраться с кодом, тут много изменений надо внести, если у меня исходный массив двухместный и типа string (в нем размеры и пути к файлам)?


--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
VICTAR
Дата 16.3.2008, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Если массив из string, то не получится. 
Может стоит пересмотреть логику программы? (Если конечно это возможно)
ЗЫ не двухместный, а двухмерный =) 
PM MAIL   Вверх
neweraser
Дата 16.3.2008, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



думаю, можно программу чуть переделать, тогда пути к файлам буду прописывать где-нибудь в листбоксе, а потом сверять с массивом


Цитата(VICTAR @  16.3.2008,  00:14 Найти цитируемый пост)
ЗЫ не двухместный, а двухмерный =)  


постоянно путаюсь  smile 



--------------------
Кто ищет, тот всегда найдет.
PM MAIL ICQ Skype   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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