![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
цикл в цикле
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 ячейки