Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

цикл в цикле


Страницы:   1 2

123456789igor ©   (2012-09-19 20:56:00) 

Не могу понять как работает цикл в цикле
на пример
repeat
begin
lalalala
if что-то1<>100 then
begin
lalalala2
что-то1:=что-то1+1;
end
end
until что-то2<чего-то

Выполняется это так?
Заходим в цикл repeat делаем lalalala затем входим в условие if делаем lalalala2 затем будет выполняться if пока что-то1 не станет равным 100 и только потом перейдет на until так?

Вот наглядный пример с которым мучаюсь, у меня есть таблица в ней в ячейке(8,1) есть текст далее в каком-то, неизвестном, кол-ве ячеек вниз пусто и потом опять в одной ячейке что-то есть надо объединить ячейку 8,1 со всеми пустыми ячейками,вниз, до след заполненной. И то же самое проделать с следующей.
[CODE]
z:=Excel.WorkBooks[1].WorkSheets[1].UsedRange.Rows.Count-1;
    a_:=8;
    NRow:= a_;
    NCol:= 1;
    dir:= Excel.WorkBooks[1].WorkSheets[1].Cells[NRow,NCol];
    repeat
    begin
    NCol:= 1;
    If dir<>'' then
     begin
     Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[NR ow,NCol],Excel.WorkBooks[1].WorkSheets[1].cells[NRow+1,NCol]].merge;
     //NRow:=NRow+1;
     dir:= Excel.WorkBooks[1].WorkSheets[1].Cells[NRow+1,NCol];
     end
     //else
     //NRow:=NRow+2;
     end;
    until NRow<z;
[/CODE]


Sha   (2012-09-25 01:39:00) [1]

Из твоих объяснений мне было трудно понять, какую задачу из двух требуется решить:
1) склеить между собой последовательно идущие пустые элементы,
принадлежащие некоторой области,
или
2) склеить пустые элементы с предыдущим непустым.

Я выбрал первую. Если надо было вторую, то я не виноват.

На самом деле задача имеет не слишком большое отношение к экселю,
надо просто написать цикл, который находит все цепочки пустых элементов,
что и записано в [20] в более-менее общем виде.

Функция DataCell(i) возвращает true, если элемент содержит данные.
Процедура Merge(i,j) склеивает элементы [i..j].
Замени их на свои.

Все переменные типа integer:
first и last - номера первого и последнего элемента исследуемой области массива,
i2 - переменная цикла - номер текущего элемента массива,
i1 - номер первого элемента в цепочке пустых элементов,
когда i1=last, начало считаем, что начало цепочки не найдено,
остальное тебе должно быть понятно.


123456789igor   (2012-09-24 23:36:00) [2]

а какого типа все эти переменные и что они означают?


Sha   (2012-09-21 20:45:00) [3]

в [19] забыл выход из цикла, надо исправить
i1:=last;
i2:=first-1;
while true do begin;
 inc(i2);
 if (i2>last) or DataCell(i2) then begin;
   if i1<i2-1 then Merge(i1,i2-1);
   if i2>last then break;
   i1:=last;
   end
 else if i1=last then i1:=i2;
 end;


Sha   (2012-09-21 20:40:00) [4]

i1:=last;
i2:=first-1;
while true do begin;
 inc(i2);
 if (i2>last) or DataCell(i2) then begin;
   if i1<i2-1 then Merge(i1,i2-1);
   i1:=last;
   end
 else if i1=last then i1:=i2;
 end;


123456789igor   (2012-09-21 20:05:00) [5]

a_:=9;
     z:=Excel.WorkBooks[1].WorkSheets[1].UsedRange.Rows.Count-2;
     while a_ < z do
     begin
     repeat
     Excel.Range[Excel.cells[a_-1,1],Excel.cells[a_,1]].merge;
     inc(a_);
     until VarToStr(Excel.cells[a_,1]) <> '';
     break;
     end;

Сделал так, но объединяет только с 9 по 23 строку, 24 не пустая, а дальше опять идут пустые. Как изменить код, что бы объединяло дальше с 24?


icWasya   (2012-09-20 09:43:00) [6]

И пользуйтесь тегом код, и правильно сделайте отступы, что бы самому было понятно.

По поводу whileи until- если условие истино, то выполняется следующий оператор( для while- тело цикла, для until- выход из цикла).


Jeer   (2012-09-19 21:56:00) [7]

В итоге, бездумно смешаны в вопросе: циклы, условия и Excel :)


Sha   (2012-09-19 21:48:00) [8]

не советую писать NRow=z, куда лучше >=


Sha   (2012-09-19 21:47:00) [9]

это другой вопрос, который запускается в другом месте, а перезагрузка убивает эксель наповал


123456789igor   (2012-09-19 21:44:00) [10]

Точно!
Вот изменил но так вообще не работает, то есть компилиться но excel не запускается
z:=Excel.WorkBooks[1].WorkSheets[1].UsedRange.Rows.Count-1;
    a_:=8;
    NRow:= a_;
    NCol:= 1;
    dir:= Excel.WorkBooks[1].WorkSheets[1].Cells[NRow,NCol];
    repeat
    begin
    NCol:= 1;
    If dir<>'' then
     begin
     Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[NR ow,NCol],Excel.WorkBooks[1].WorkSheets[1].cells[NRow+1,NCol]].merge;
     NRow:=NRow+1;
     dir:= Excel.WorkBooks[1].WorkSheets[1].Cells[NRow+1,NCol];
     end
     else
     NRow:=NRow+2;
     end;
    until NRow=z;


Dimka Maslov   (2012-09-19 21:42:00) [11]

Цикл это всего-лишь команда условного перехода назад. И со вложенностью, хоть стопиццоткратной, нет никаких проблем, ибо логика остаётся жёсткой и последовательной.
А что сейчас при обучении программированию не заставляют рисовать блок-схемы? Нарисовав блок-схему вложенных циклов любой сразу поймёт, как это работает.


bems   (2012-09-19 21:38:00) [12]

Если взять например два фора один в другом, каждый от 0 до 9, то тело внутреннего цикла выполнится столько раз и с такими значениями, что хватит как раз на таблицу умножения от 0х0 до 9х9


Sha   (2012-09-19 21:37:00) [13]


> 123456789igor ©   (19.09.12 21:34) [8]
>
> Ну так правильно задает усл выхода из цикла
> ..............
> 10<чем число строк то проходим по циклу ещё раз


найди противоречие


123456789igor   (2012-09-19 21:35:00) [14]

ну да про цикл в цикле это я погорячится но все равно мне не понятно как бы выполнялось следующее:
если в while вложен for как работать все будетработать? выполнит while затем все варианты for а потом вернется к while? что то я запутался


123456789igor   (2012-09-19 21:34:00) [15]

Ну так правильно задает усл выхода из цикла
z это кол-во всех строк-1
dir это переменная типа string в неё записывается значение ячейки
далее захожу в цикл repeat если ячейка не пустая то объединяем ячейки 8,1 и 9,1
далее dir присваиваем значение ячейки 9,1
и значение nrow становиться 10 а так как 10<чем число строк то проходим по циклу ещё раз но только dir уже это ячейка 9,1 и она объединена с 8,1 соответственно она не пустая  и тогда так как nrow уже 10 должны объединиться 10,1 и 11,1 но этого не происходит


bems   (2012-09-19 21:34:00) [16]

В твоих примерах нет цикла в цикле. Есть ветвление, вложенное в цикл


Плохиш   (2012-09-19 21:30:00) [17]


>  цикл в цикле
>
> 123456789igor ©   (19.09.12 20:56) 
>

И где в вашем коде этот "цикл в цикле"?


Sha   (2012-09-19 21:29:00) [18]

а if это ваще не цикл, вот while - это цикл


Sha   (2012-09-19 21:26:00) [19]

потому что until задает условие выхода из цикла


123456789igor   (2012-09-19 21:19:00) [20]

не понял. А конкретнее по моему вопросу?
Почему при выполнении этого кода объединяется только 2 ячейки


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо