Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

цикл в цикле   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.053 c
15-1339653614
KSergey
2012-06-14 10:00
2013.03.22
Ассемблерные вставки и переносимость кода


3-1281355338
defen
2010-08-09 16:02
2013.03.22
Добавление файла в базу


2-1328525317
whoim
2012-02-06 14:48
2013.03.22
TServerSocket, TStringList и непонятки.. RemoteAddress


15-1334142183
Сергей М.
2012-04-11 15:03
2013.03.22
Занимательная криптография


15-1329381756
Pit
2012-02-16 12:42
2013.03.22
borland.ru