![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
![]() |
|
#3
|
||||
|
||||
|
Я в таком формате плохо разбираюсь. Поэтому не понял в чем суть.
![]() |
|
#4
|
||||
|
||||
|
Скорее всего оптимизирующий компилятор перевернул цикл, поскольку в машинном коде цикл от N-1 до 0 несколько проще.
|
|
#5
|
|||
|
|||
|
- Дельфийский компилятор не имеет права "переворачивать" цикл, а потому этого никогда и не делает.
- Значение константы N определено как число 100, следовательно начало цикла в обратном порядке не может начинаться с 99. - Проверка в Delphi именно приведенного кода показала, что значение управляющей переменной цикла (j) начинается с 2 и заканчивается на значении 100. По этим признакам косвенно можно предположить варианты: 1. Автор лукавит (ошибся) и привел не тот код, в котором у него цикл начинается со значения 99. 2. Компилятор не дельфийский. 3. Полтергейст (сиречь Барабашка) в компиляторе. |
|
#6
|
||||
|
||||
|
Замени на while и не парься.
|
|
#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
|
||||
|
||||
|
Цитата:
![]() Цитата:
Последний раз редактировалось 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
|
||||
|
||||
|
Спасибо за консультации. Для меня важно было лишь удостовериться, что это не я что-то не так написал.
![]() |