![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() У Фаронова есть простейший пример для иллюстрации работы с массивами. Вроде все просто, но я столкнулся с такой штукой: когда я начинаю цикл for ( он помечен у меня ЦИКЛ2), он считается у меня почему-то в обратном порядке (я пробовал пошагово его пройти и первое значение индекса равно 99, затем 98 и т.д.). Не могу понять, почему он не считает от 2 до N. Подскажите кто-нибудь.
Код:
unit unAverage1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) btnRun: TButton; memOutPut: TMemo; lblOutPut: TLabel; procedure btnRunClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnRunClick(Sender: TObject); const N = 100; Max_Value = 100+1; var m: array[1..N] of Integer; i,j: Integer; max, min: Integer; sum: Real; S: String; begin S := ''; for i := 1 to N do begin m[i] := Random(Max_Value); S := S + #9 + IntToStr(m[i]); if i mod 10=0 then begin memOutPut.Lines.Add(S); S := ''; end end; sum := m[1]; max := m[1]; min := m[1]; for j := 2 to N do { ЦИКЛ 2} begin sum := sum + m[j]; if m[j] < min then min := m[j] else if m[j] > max then max := m[j] end; lblOutPut.Caption := ' Минимум = ' + IntToStr(min) + ' Максимум = ' + InttoStr(max) + ' Среднее = ' + FloatToStr(sum/N); end; end. |
#2
|
||||
|
||||
![]() ![]() — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
![]() Я в таком формате плохо разбираюсь. Поэтому не понял в чем суть.
![]() |
#4
|
||||
|
||||
![]() Скорее всего оптимизирующий компилятор перевернул цикл, поскольку в машинном коде цикл от N-1 до 0 несколько проще.
jmp $ ; Happy End! The Cake Is A Lie. |
#5
|
|||
|
|||
![]() - Дельфийский компилятор не имеет права "переворачивать" цикл, а потому этого никогда и не делает.
- Значение константы N определено как число 100, следовательно начало цикла в обратном порядке не может начинаться с 99. - Проверка в Delphi именно приведенного кода показала, что значение управляющей переменной цикла (j) начинается с 2 и заканчивается на значении 100. По этим признакам косвенно можно предположить варианты: 1. Автор лукавит (ошибся) и привел не тот код, в котором у него цикл начинается со значения 99. 2. Компилятор не дельфийский. 3. Полтергейст (сиречь Барабашка) в компиляторе. |
#6
|
||||
|
||||
![]() Замени на while и не парься.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#7
|
||||
|
||||
![]() все правильно: цикл иногда "переворачивается". вот же пример:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); const n = 10; var i: Integer; begin for i:=1 to n do begin Sleep(0); // Memo1.Lines.Add(IntToStr(i)); end; end; end. ставим точку останова на for i:=1 to n do и смотрим Debug CPU при закомментареной строчке Memo1.Lines.Add(IntToStr(i)); и раскомментареной: "цикл будет крутиться в разные стороны ![]() Пишу программы за еду. __________________ |
#8
|
||||
|
||||
![]() Спасибо за пример. Однако четко сформулировать, когда цикл пойдет в каком направлении, у меня не получается.
![]() |
#9
|
||||
|
||||
![]() Aleks26, не забивай себе этим голову
![]() ЗЫ. хотя если и возникнет, то я буду очень рад такому примеру ![]() Пишу программы за еду. __________________ |
#10
|
||||
|
||||
![]() Цитата:
![]() Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 05.09.2011 в 21:27. |
#11
|
||||
|
||||
![]() Я один раз, правда давно очень, сейчас глянул дату модуля - 2006 год.
вот код который по разному работал с оптимизацией и без нее: Код:
for i:=1 to SummArrayPoint do begin Excel.Sheets.Add; HouseSheet:=Excel.WorkBooks[1].ActiveSheet; HouseSheet.Name:=MainData[SummData[i,21],3]+MainData[SummData[i,21],4]; ExcelHeader(HouseSheet,AccGroupName,MesN,1); HouseSheet.Range['A3:T3']:=TableHeader; if i=SummArrayPoint then lenHouseArr:=arrlen-SummData[i,21] else lenHouseArr:=SummData[i+1,21]-SummData[i,21]; HouseData:=0; HouseData:=VarArrayCreate([1,lenHouseArr,1,20],varVariant); for n:=1 to 20 do for m:=1 to lenHouseArr do HouseData[m,n]:=MainData[SummData[i,21]+m-1,n]; HouseSheet.Range['A4:T'+Trim(IntToStr(lenHouseArr+3))].Value:=HouseData; for n:=1 to 20 do SummHouse[1,n]:=SummData[i,n]; HouseSheet.Range['A'+Trim(IntToStr(lenHouseArr+4))+':T'+Trim(IntToStr(lenHouseArr+4))]:=SummHouse; HouseSheet.Range['A'+Trim(IntToStr(lenHouseArr+4))].Value:='ИТОГО'; HouseSheet.Range['A'+Trim(IntToStr(lenHouseArr+4))+':F'+Trim(IntToStr(lenHouseArr+4))].Merge; HouseSheet.Range['A'+Trim(IntToStr(lenHouseArr+4))+':F'+Trim(IntToStr(lenHouseArr+4))].HorizontalAlignment:=$FFFFEFC8; HouseSheet.Range['A'+Trim(IntToStr(lenHouseArr+4))+':F'+Trim(IntToStr(lenHouseArr+4))].VerticalAlignment:=$FFFFEFF4; HouseSheet.Range['A'+Trim(IntToStr(lenHouseArr+4))+':T'+Trim(IntToStr(lenHouseArr+4))].Font.Bold:=True; HouseSheet.Cells.Select; HouseSheet.Cells.EntireColumn.AutoFit; HouseSheet.Range['A4'].Select; Excel.ActiveWindow.FreezePanes:=True; // HouseSheet.PageSetup.PrintTitleRows:='$3:$3'; end; Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#12
|
||||
|
||||
![]() Спасибо за консультации. Для меня важно было лишь удостовериться, что это не я что-то не так написал.
![]() |