Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.066 c
15-1334126868
xss22
2012-04-11 10:47
2013.03.22
Как записать TMemIniFile в TMemoryStream и обратно?


15-1329149862
Alex555
2012-02-13 20:17
2013.03.22
Можно ли как-то посмотреть вот это видео


15-1347788277
Pavia
2012-09-16 13:37
2013.03.22
Посоветуйте СУБД


1-1300648529
Ridlypoot
2011-03-20 22:15
2013.03.22
Проблема с GetPropInfo


2-1334441877
novichek
2012-04-15 02:17
2013.03.22
TDateTimePicker





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский