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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2011, 11:47   #1
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
Печаль Вот не работает программа для вычисления чисел-близнецов

Введение. Числа-близнецы - это простые числа, находящиеся через одно число. Например 3 и 5, 5 и 7, и т.д.

Вот программа:

Код:
unit Chisla_bliznetsi;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    v_fajl: TLabeledEdit;
    ObzorWrite: TButton;
    SaveDialog1: TSaveDialog;
    ProgressBar1: TProgressBar;
    iz_fajla: TLabeledEdit;
    ObzorRead: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure ObzorWriteClick(Sender: TObject);
    procedure ObzorReadClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
iz,v:textfile;
String1,String2:String;
IntString1,IntString2,err:integer;
//StringN - строка файла, IntStringN - Цифровая строка
label ext;
begin
     if (v_fajl.Text='') OR (iz_fajla.Text='') then
        begin
        MessageDlg('Не записан путь к файлу!',mtError,[mbOK],0);
        Exit;
        end;
     String1:='0';
     IntString1:=0;
     ProgressBar1.Max:=0; //Обнуляем все

     Assignfile(iz,iz_fajla.Text);
     Reset(iz);
     while NOT EOF(iz) do //подсчет кол-ва строк
           begin
           Readln(iz);
           ProgressBar1.Max:=ProgressBar1.Max+1;
           end;
     Reset(iz);

     Assignfile(v,v_fajl.Text);
     Rewrite(v); //в ext есть Closefile(v)
     if ProgressBar1.Max<2 then goto ext; //мало строк
     while NOT EOF(iz) do
         begin
         Readln(iz,String2);
         Val(String1,IntString2,err);
         Val(String2,IntString2,err);
         if err<>0 then //если ошибка 2-го пребр.
            begin
            MessageDlg('Файл '+iz_fajla.Text+' не является файлом с простыми числами',mtError,[mbOK],0);
            goto ext;
            end;
         if IntString1=IntString2+2 then Writeln(v,String2);
         String1:=String2; //меняем строки
         ProgressBar1.Position:=ProgressBar1.Position+1;
         end;
ext: Closefile(iz); //ext - завершение операции
     Closefile(v);
     MessageDlg('Вычисление простых чисел выполнено.'+#10+
                'Результаты записаны в файл '+v_fajl.Text,mtInformation,[mbOK],0);
end;

procedure TForm1.ObzorReadClick(Sender: TObject);
var OD:TOpenDialog;
begin
     OD:=TOpenDialog.Create(nil);
     OD.Filter:='Текстовые файлы|*.txt|Все файлы|*.*';
     OD.Options:=OD.Options+[ofOverwritePrompt];
     if OD.Execute=true then iz_fajla.Text:=OD.FileName;
     OD.Free;
end;

procedure TForm1.ObzorWriteClick(Sender: TObject);
var SD:TSaveDialog;
begin
     SD:=TSaveDialog.Create(nil);
     SD.Filter:='Текстовые файлы|*.txt|Все файлы|*.*';
     SD.Options:=SD.Options+[ofOverwritePrompt];
     if SD.Execute=true then v_fajl.Text:=SD.FileName;
     SD.Free;
end;

end.
Размер выходного файла в конце работы - 0 байт (программа неправильно сравнивает?). Почему?

Внизу файл с простыми числами до 100 000.
Вложения
Тип файла: txt prostye3.txt (64.2 Кб, 145 просмотров)
hon вне форума Ответить с цитированием
Старый 22.09.2011, 17:40   #2
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
Восклицание

Что вы просматриваете, просамтриваете, а не отвечаете? Ответьте пожалуйста.
hon вне форума Ответить с цитированием
Старый 22.09.2011, 19:38   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
         Val(String1,IntString2,err);
         Val(String2,IntString2,err);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.09.2011, 20:46   #4
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
По умолчанию

evg_m, спасибо, но это не изменило ничего. Программа все равно не работает Ошибка таже.

Решил вообще убрать глупость про Stringи. Вот теперь такой код:

Код:
unit Chisla_bliznetsi;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    v_fajl: TLabeledEdit;
    ObzorWrite: TButton;
    SaveDialog1: TSaveDialog;
    ProgressBar1: TProgressBar;
    iz_fajla: TLabeledEdit;
    ObzorRead: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure ObzorWriteClick(Sender: TObject);
    procedure ObzorReadClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
iz,v:textfile;
IntString1,IntString2:integer;
//IntStringN - Цифровая строка
label ext;
begin
     if (v_fajl.Text='') OR (iz_fajla.Text='') then
        begin
        MessageDlg('Не записан путь к файлу!',mtError,[mbOK],0);
        Exit;
        end;
     IntString1:=0;
     ProgressBar1.Max:=0; //Обнуляем все

     Assignfile(iz,iz_fajla.Text);
     Reset(iz);
     while NOT EOF(iz) do //подсчет кол-ва строк
           begin
           Readln(iz);
           ProgressBar1.Max:=ProgressBar1.Max+1;
           end;
     Reset(iz);

     Assignfile(v,v_fajl.Text);
     Rewrite(v); //в ext есть Closefile(v)
     if ProgressBar1.Max<2 then goto ext; //мало строк
     while NOT EOF(iz) do
         begin
         Readln(iz,IntString2);
         if IntString1=IntString2+2 then Writeln(v,IntString2);
         IntString1:=IntString2;
         ProgressBar1.Position:=ProgressBar1.Position+1;
         end;
ext: Closefile(iz);
     Closefile(v);
     MessageDlg('Вычисление простых чисел выполнено.'+#10+
                'Результаты записаны в файл '+v_fajl.Text,mtInformation,[mbOK],0);
end;

procedure TForm1.ObzorReadClick(Sender: TObject);
var OD:TOpenDialog;
begin
     OD:=TOpenDialog.Create(nil);
     OD.Filter:='Текстовые файлы|*.txt|Все файлы|*.*';
     OD.Options:=OD.Options+[ofOverwritePrompt];
     if OD.Execute=true then iz_fajla.Text:=OD.FileName;
     OD.Free;
end;

procedure TForm1.ObzorWriteClick(Sender: TObject);
var SD:TSaveDialog;
begin
     SD:=TSaveDialog.Create(nil);
     SD.Filter:='Текстовые файлы|*.txt|Все файлы|*.*';
     SD.Options:=SD.Options+[ofOverwritePrompt];
     if SD.Execute=true then v_fajl.Text:=SD.FileName;
     SD.Free;
end;

end.
hon вне форума Ответить с цитированием
Старый 23.09.2011, 01:45   #5
wowsel
Begin'нер
Пользователь
 
Аватар для wowsel
 
Регистрация: 30.04.2010
Сообщений: 48
По умолчанию

Насколько я понял из википедии простые числа-близнецы это 6n-+1, набросал такой код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var n:integer;
begin
n:=1;
while n<>100 do begin
memo1.Lines.add(IntToStr(6*n-1)+'-'+IntToStr(6*n+1)+' ');
n:=n+1;
end;
end;
p.s. ещё входит 3-5, но это как исключение дописать.
wowsel вне форума Ответить с цитированием
Старый 23.09.2011, 01:45   #6
wowsel
Begin'нер
Пользователь
 
Аватар для wowsel
 
Регистрация: 30.04.2010
Сообщений: 48
По умолчанию

Насколько я понял из википедии простые числа-близнецы это 6n-+1, набросал такой код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var n:integer;
begin
n:=1;
while n<>100 do begin
memo1.Lines.add(IntToStr(6*n-1)+'-'+IntToStr(6*n+1)+' ');
n:=n+1;
end;
end;
p.s. ещё входит 3-5, но это как исключение дописать.
wowsel вне форума Ответить с цитированием
Старый 23.09.2011, 16:03   #7
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

hon, у Вас очень своеобразный стиль программирования, с метками DOS функциями типо AssignFile и.т.п и другими пережитками 80-х годов прошлого столетия.
Настоятельно рекомендую заменить функцию Button1Click вот этой:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var SL   : TStringList;
    i,N  : integer;
begin
  if not FileExists(iz_fajla.Text) then
  begin
   MessageDlg('Не указан путь к исходному файлу!',mtError,[mbOK],0);
   Exit;
  end;
  if v_fajl.Text='' then
  begin
   MessageDlg('Не указан путь к результирующему файлу!',mtError,[mbOK],0);
   Exit;
  end;

  SL := TStringList.Create;
  SL.LoadFromFile(iz_fajla.Text);
  for i:=0 to SL.Count-1 do
  begin
   ProgressBar1.Max:=Round(100*i/SL.Count);
   N:=StrToIntDef(SL.Strings[i], -1);
   if N=-1 then continue;
   SL.Strings[i] := IntToStr(N+2);
  end;
  SL.SaveToFile(v_fajl.Text);
  SL.Free;
end;
и будет Вам счастье !
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 23.09.2011, 19:26   #8
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
Плохо

Цитата:
Сообщение от JUDAS Посмотреть сообщение
hon, у Вас очень своеобразный стиль программирования, с метками DOS функциями типо AssignFile и.т.п и другими пережитками 80-х годов прошлого столетия.
Настоятельно рекомендую заменить функцию Button1Click вот этой:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var SL   : TStringList;
    i,N  : integer;
begin
  if not FileExists(iz_fajla.Text) then
  begin
   MessageDlg('Не указан путь к исходному файлу!',mtError,[mbOK],0);
   Exit;
  end;
  if v_fajl.Text='' then
  begin
   MessageDlg('Не указан путь к результирующему файлу!',mtError,[mbOK],0);
   Exit;
  end;

  SL := TStringList.Create;
  SL.LoadFromFile(iz_fajla.Text);
  for i:=0 to SL.Count-1 do
  begin
   ProgressBar1.Max:=Round(100*i/SL.Count);
   N:=StrToIntDef(SL.Strings[i], -1);
   if N=-1 then continue;
   SL.Strings[i] := IntToStr(N+2);
  end;
  SL.SaveToFile(v_fajl.Text);
  SL.Free;
end;
и будет Вам счастье !
А вот не работает этот метод. Результат=исходный файл.
hon вне форума Ответить с цитированием
Старый 23.09.2011, 20:22   #9
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  slIn, slOut: TStringList;
  i, j, k: integer;
begin
  slIn := TStringList.Create;
  slOut := TStringList.Create;
  try
    slIn.LoadFromFile(iz_fajla.Text);
    if slIn.Count < 2 then
      exit;
    j := StrToInt(slIn.Strings[0]);

    for i := 1 to slIn.Count - 1 do
    begin
      k := StrToInt(slIn.Strings[i]);
      if j = (k - 2)  then
        slOut.Add(IntToStr(j) + ' ' + IntToStr(k));
      j := k;
    end;
    slOut.SaveToFile(v_fajl.Text);
  finally
    FreeAndNil(slIn);
    FreeAndNil(slOut);
  end;
end;
и будет Вам счастье !

Последний раз редактировалось Silver_S; 23.09.2011 в 20:46.
Silver_S вне форума Ответить с цитированием
Старый 23.09.2011, 21:17   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Результат=исходный файл.
в моём коде :
Код:
...
 SL.LoadFromFile(iz_fajla.Text);
...
SL.SaveToFile(v_fajl.Text);
...
Если у ваш входной файл = выходном, значит вы так выбрали )))
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программа для вычисления Narim Общие вопросы C/C++ 0 17.05.2011 13:14
Формула Бине для вычисления чисел фибоначчи АлексаШка Помощь студентам 3 10.03.2011 15:11
программа для вычисления квадратного корня, почему-то не работает. pavlan Помощь студентам 4 14.02.2011 22:46
Программа для вычисления квадратного корня DZIMKA96 Паскаль, Turbo Pascal, PascalABC.NET 6 01.10.2010 19:17
. Составить программу для вычисления степеней чисел Figushkin Помощь студентам 0 05.06.2010 17:40