Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2013, 12:03   #1
kalachal
 
Регистрация: 09.01.2013
Сообщений: 4
По умолчанию объясните программу в Delphi, программа готовая, но многое в ней не понимаю

Объясните программу в Delphi, программа готовая, но многое в ней не понимаю, вот код программы:

program HappyNum;
{$APPTYPE CONSOLE}

uses
SysUtils, Windows, Classes, SyncObjs;


type
TMyThread = class(TThread) //этот объект позволяет создавать как бы несколько программ в одной (несколько процессов, или, потоков)
public
leftBorder, rightBorder : Integer; // переменные
Constructor Create(CreateSuspended : Boolean; leftBorder : Integer; rightBorder : Integer); //Create(CreateSuspended: Boolean) - создает экземпляр класса. Параметр CreateSuspended указывает на то, нужно ли создавать приостановленную задачу (True), или запускать ее сразу (False);
procedure Execute; override; // Позволяет вызвать процедуру которая не возращает параметры или возращает их единожды
end;

const
OUT_FILE_NAME = 'listhappy.txt';


var
fileId : TextFile;
msg: String;
count : Integer;
Thread1, Thread2 : TMyThread;
crit : TCriticalSection;


function WinToRusCon(msg: String): String;
var
ruMsg : array[0..255] of Char;
begin
CharToOemBuff(PChar(msg), ruMsg, Length(msg) + 1);
WinToRusCon := ruMsg;
end;


procedure WriteToFileAndUI(msg: String);
begin
Writeln(WinToRusCon(msg));
Writeln(fileId, msg);
end;


procedure PrepareFile();
begin
AssignFile(fileId, OUT_FILE_NAME);
if FileExists(OUT_FILE_NAME) then DeleteFile(PChar(OUT_FILE_NAME));
ReWrite(fileId);
end;


procedure CalculateHappyNumbers(leftBorder : Integer; rightBorder : Integer);
var
i, k1, k2, s1, s2 : Integer;
begin
for i := leftBorder to rightBorder do
begin
k1 := i div 1000;
k2 := i mod 1000;
s1 := (k1 div 100) + ((k1-(k1 div 100)*100) div 10 ) + k1 mod 10;
s2 := (k2 div 100) + ((k2-(k2 div 100)*100) div 10 ) + k2 mod 10;


if s1 = s2 then
begin
crit.Enter;
count := count +1;
FmtStr(msg, '%5u %6.6u %2u (Thread: %u)', [count, i, s1, Windows.GetCurrentThreadId]);
WriteToFileAndUI(msg);
crit.Leave;
end;
end;
end;


constructor TMyThread.Create(CreateSuspended : Boolean;
leftBorder : Integer;
rightBorder : Integer);
begin
inherited Create(CreateSuspended);
self.leftBorder := leftBorder;
self.rightBorder := rightBorder;
end;


procedure TMyThread.Execute;
begin
CalculateHappyNumbers(self.leftBord er, self.rightBorder);
self.Terminate;
self.Free;
end;


begin
try
PrepareFile();
crit := TCriticalSection.Create();
count := 0;
Thread1 := TMyThread.Create(false, 0, 500000);
Thread2 := TMyThread.Create(false, 500000, 999999);


while not (Thread1.Terminated and Thread2.Terminated) do
begin
sleep(100);
end;


WriteToFileAndUI('Итого ' + IntToStr(count) + ' счастливых билетов');
finally
CloseFile(FileID);
readln;
end;
end.

Заранее огромное спасибо!!
kalachal вне форума Ответить с цитированием
Старый 09.01.2013, 14:35   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
program HappyNum;
{$APPTYPE CONSOLE}

uses
SysUtils, Windows, Classes, SyncObjs;


type
TMyThread = class(TThread) //этот объект позволяет создавать как бы несколько программ в одной (несколько процессов, или, потоков)
public
leftBorder, rightBorder : Integer; // переменные
Constructor Create(CreateSuspended : Boolean; leftBorder : Integer; rightBorder : Integer); //Create(CreateSuspended: Boolean) - создает экземпляр класса. Параметр CreateSuspended указывает на то, нужно ли создавать приостановленную задачу (True), или запускать ее сразу (False);
procedure Execute; override; // описывает основную процедуру выполняющую при запуске потока 
end;

const
OUT_FILE_NAME = 'listhappy.txt';


var
//общие данные для потоков (требуют синхронизации)
fileId : TextFile; 
msg: String;
count : Integer;
//
Thread1, Thread2 : TMyThread; // два объекта(потока) для вычислений 
crit : TCriticalSection; //критическая секция для синхронизации действий потоков при операциях с общими данными(объектами)


function WinToRusCon(msg: String): String; //перевод строки из одной кодировки (win1251) в другую (cp866)

procedure WriteToFileAndUI(msg: String); // вывод строки на консоль и запись строки в файл fileid

procedure PrepareFile(); // подготтовка файла вывода

procedure CalculateHappyNumbers(leftBorder : Integer; rightBorder : Integer); // функция Calculate(вычислений) Happy(счастливых) Numners(чисел) в диапазоне от leftBorder до rightBorder
var
i, k1, k2, s1, s2 : Integer;
begin
for i := leftBorder to rightBorder do //в диапазоне от leftBorder до rightBorder
begin
k1 := i div 1000;
k2 := i mod 1000;
s1 := (k1 div 100) + ((k1-(k1 div 100)*100) div 10 ) + k1 mod 10;
s2 := (k2 div 100) + ((k2-(k2 div 100)*100) div 10 ) + k2 mod 10;


if s1 = s2 then // число счастливое ?
begin
crit.Enter; //блокируем работу с общими данными (теперь все потоки кроме одного будут ждать )
count := count +1; 
FmtStr(msg, '%5u %6.6u %2u (Thread: %u)', [count, i, s1, Windows.GetCurrentThreadId]);//формируем строку вывода 
WriteToFileAndUI(msg); 
crit.Leave; //общие данные нам больше не нужны (до следующего изменения) снимаем СВОЮ блокировку 
end;
end;
end;


constructor TMyThread.Create(CreateSuspended : Boolean; leftBorder : Integer; rightBorder : Integer); 


procedure TMyThread.Execute;
begin
CalculateHappyNumbers(self.leftBord er, self.rightBorder);
self.Terminate; // якобы останавливаем поток (на самом деле здесь она не нужна поток и так уже закончил свою работу) 
self.Free; // разрушаем сами себя (очень нехорошо! лучше при создании FreeOnTerminate:=true;
end;


begin
try 
PrepareFile();
crit := TCriticalSection.Create();
count := 0;
// создание объектов управления потоками и задание параметров расчета для каждого потока
Thread1 := TMyThread.Create(false, 0, 500000);
Thread2 := TMyThread.Create(false, 500000, 999999);


while not (Thread1.Terminated and Thread2.Terminated) do // ждем завершения потоков (с учетом этой строки self.Terminate имеет право на жизнь)
а вот (self.Free точно приведет к AV)  в результате есть шанс что другой поток не успеет досчитать свой диапазон и ...
begin
sleep(100); // основной поток засыпает на указанное время(мс)
end;



WriteToFileAndUI('Итого ' + IntToStr(count) + ' счастливых билетов');
finally
CloseFile(FileID);
readln;
end;
end.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.01.2013, 17:56   #3
kalachal
 
Регистрация: 09.01.2013
Сообщений: 4
По умолчанию

спасибо огромное!!!
kalachal вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не запускается готовая программа Алекссс Общие вопросы Delphi 7 05.06.2013 12:10
Это программа в Delphi по переводу из одной системы исчисления в другую(от2до10)Нужно объяснить КАЖДУЮ строчку что в ней делаеться YekaterinaMel Помощь студентам 1 15.06.2012 17:14
Объясните задачу Delphi. Задача сделана только код я не понимаю!! LudaBojar Помощь студентам 0 21.03.2011 20:30
Паскаль.Задание на строки,не понимаю как его сделать,если кто может,объясните... Меффистоф Помощь студентам 4 25.08.2010 10:05
Объясните. Ну не понимаю я как сайты на си делаются? newprog12 Общие вопросы C/C++ 16 25.01.2010 10:46