Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Внизцикл в цикле Найти похожие ветки
← →
123456789igor © (2012-09-19 20:56) [0]Не могу понять как работает цикл в цикле
на пример
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]
← →
123456789igor © (2012-09-19 21:06) [1]Объединяется только ячейка 8,1 и 9,1
← →
Ega23 © (2012-09-19 21:12) [2]Всё отличие repeat от while в том, что внутрь цикла repeat будет как минимум один вход.
← →
123456789igor © (2012-09-19 21:19) [3]не понял. А конкретнее по моему вопросу?
Почему при выполнении этого кода объединяется только 2 ячейки
← →
Sha © (2012-09-19 21:26) [4]потому что until задает условие выхода из цикла
← →
Sha © (2012-09-19 21:29) [5]а if это ваще не цикл, вот while - это цикл
← →
Плохиш © (2012-09-19 21:30) [6]
> цикл в цикле
>
> 123456789igor © (19.09.12 20:56)
>
И где в вашем коде этот "цикл в цикле"?
← →
bems © (2012-09-19 21:34) [7]В твоих примерах нет цикла в цикле. Есть ветвление, вложенное в цикл
← →
123456789igor © (2012-09-19 21:34) [8]Ну так правильно задает усл выхода из цикла
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 но этого не происходит
← →
123456789igor © (2012-09-19 21:35) [9]ну да про цикл в цикле это я погорячится но все равно мне не понятно как бы выполнялось следующее:
если в while вложен for как работать все будетработать? выполнит while затем все варианты for а потом вернется к while? что то я запутался
← →
Sha © (2012-09-19 21:37) [10]
> 123456789igor © (19.09.12 21:34) [8]
>
> Ну так правильно задает усл выхода из цикла
> ..............
> 10<чем число строк то проходим по циклу ещё раз
найди противоречие
← →
bems © (2012-09-19 21:38) [11]Если взять например два фора один в другом, каждый от 0 до 9, то тело внутреннего цикла выполнится столько раз и с такими значениями, что хватит как раз на таблицу умножения от 0х0 до 9х9
← →
Dimka Maslov © (2012-09-19 21:42) [12]Цикл это всего-лишь команда условного перехода назад. И со вложенностью, хоть стопиццоткратной, нет никаких проблем, ибо логика остаётся жёсткой и последовательной.
А что сейчас при обучении программированию не заставляют рисовать блок-схемы? Нарисовав блок-схему вложенных циклов любой сразу поймёт, как это работает.
← →
123456789igor © (2012-09-19 21:44) [13]Точно!
Вот изменил но так вообще не работает, то есть компилиться но 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;
← →
Sha © (2012-09-19 21:47) [14]это другой вопрос, который запускается в другом месте, а перезагрузка убивает эксель наповал
← →
Sha © (2012-09-19 21:48) [15]не советую писать NRow=z, куда лучше >=
← →
Jeer © (2012-09-19 21:56) [16]В итоге, бездумно смешаны в вопросе: циклы, условия и Excel :)
← →
icWasya © (2012-09-20 09:43) [17]И пользуйтесь тегом код, и правильно сделайте отступы, что бы самому было понятно.
По поводу while и until - если условие истино, то выполняется следующий оператор( для while - тело цикла, для until - выход из цикла).
← →
123456789igor © (2012-09-21 20:05) [18]
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?
← →
Sha © (2012-09-21 20:40) [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);
i1:=last;
end
else if i1=last then i1:=i2;
end;
← →
Sha © (2012-09-21 20:45) [20]в [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;
← →
123456789igor © (2012-09-24 23:36) [21]а какого типа все эти переменные и что они означают?
← →
Sha © (2012-09-25 01:39) [22]Из твоих объяснений мне было трудно понять, какую задачу из двух требуется решить:
1) склеить между собой последовательно идущие пустые элементы,
принадлежащие некоторой области,
или
2) склеить пустые элементы с предыдущим непустым.
Я выбрал первую. Если надо было вторую, то я не виноват.
На самом деле задача имеет не слишком большое отношение к экселю,
надо просто написать цикл, который находит все цепочки пустых элементов,
что и записано в [20] в более-менее общем виде.
Функция DataCell(i) возвращает true, если элемент содержит данные.
Процедура Merge(i,j) склеивает элементы [i..j].
Замени их на свои.
Все переменные типа integer:
first и last - номера первого и последнего элемента исследуемой области массива,
i2 - переменная цикла - номер текущего элемента массива,
i1 - номер первого элемента в цепочке пустых элементов,
когда i1=last, начало считаем, что начало цепочки не найдено,
остальное тебе должно быть понятно.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.073 c