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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2013, 12:42   #1
Валентинн
 
Регистрация: 16.01.2013
Сообщений: 3
По умолчанию Номера счастливых билетов: Проблема с исправлением кода (готовый) Delphi 7

Мне нужно что бы Номера счастливых билетов или 3 столбик в результатах выводились по порядку а не в разнобой как сейчас =)

Код:
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);
       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.leftBorder, 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
    sleep(100);


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

Последний раз редактировалось Stilet; 16.01.2013 в 13:43.
Валентинн вне форума Ответить с цитированием
Старый 17.01.2013, 11:39   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я вчера открыл ваш код, увидел TMyThread.Create, вздрогнул и сразу же закрыл...
Поясните, зачем Вы используете параллельные потоки (нити) для вычислений? Это ваша задумка или обязательное требование к работе?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.01.2013, 12:01   #3
Валентинн
 
Регистрация: 16.01.2013
Сообщений: 3
По умолчанию

Да! все дело в том, что нам дан исходный код организованный след. образом:

Изначальный код :
Код:
program happy;
{$APPTYPE CONSOLE}
uses
  SysUtils, Windows;

var
  FileID: TextFile;
  NameProt, S: String;
  i, k1, k2, s1, s2, count: Integer;
  TempsS: array [0..255] of Char;

function WinToRusCon(S: String): String;
begin
  CharToOemBuff(PChar(S), TempsS, Length(S)+1);
  WinToRusCon:=TempsS;
end;

procedure WriteLnToRusCon(S: String);
begin
  CharToOemBuff(PChar(S), TempsS, Length(S)+1);
  WriteLn(TempsS);
end;

procedure MyWrite(StrOut: String);
begin
  Writeln(WinToRusCon(StrOut));
  Writeln(FileID, StrOut);
end;

begin
  NameProt:='listhappy.txt';
  try
      AssignFile(FileID, NameProt);
      if FileExists(NameProt) then DeleteFile(PChar(NameProt));
      ReWrite(FileID);
      count:=0;
      for i:=0 to 999999 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
              count:=count+1;
              FmtStr(S, '%5u %6.6u %2u', [count, i, s1]);
              MyWrite(S);
            end;
        end;
      MyWrite('итого '+IntToStr(count)+' счастливых билетов');
    finally
      CloseFile(FileID);  end;
end.
И как раз нужно реализовать многопоточность используя класс TTread.

Последний раз редактировалось Stilet; 18.01.2013 в 17:47.
Валентинн вне форума Ответить с цитированием
Старый 29.01.2013, 14:16   #4
Валентинн
 
Регистрация: 16.01.2013
Сообщений: 3
По умолчанию

Вверх вверх вверх
Валентинн вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рассчитать количество "счастливых" билетов с указанной сумой цифр (паскаль) gylayko Помощь студентам 2 22.09.2011 19:48
справки о наличии билетов Delphi dm.bodya Помощь студентам 0 23.05.2011 19:04
Delphi. Программа поиска счастливых, дружественных и совершенных чисел. fan_of_lp Фриланс 13 06.07.2010 19:47
Delphi. Программа поиска счастливых, дружественных и совершенных чисел. bayda06 Помощь студентам 1 05.07.2010 18:55
Задача: Найти количество всех 2K-значных счастливых билетов с суммой цифр, равной N. Lodyr Помощь студентам 7 04.01.2010 16:19