Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.03.11;
Скачать: [xml.tar.bz2];

Вниз

Помогите с несложной программой пожалуйста)))   Найти похожие ветки 

 
vit196sh ©   (2011-11-30 03:13) [0]

program Project1;

{$APPTYPE CONSOLE}
type tst=array[1..100]of string[15];
procedure word(st:string;var k:Byte; b:tst);
var i:Byte;a:array[1..100]of string[15];
begin
 st:=st+" ";k:=1;
a[1]:="0";
a[2]:="1";
a[3]:="2";
a[4]:="3";
a[5]:="4";
a[6]:="5";
a[7]:="6";
a[8]:="7";
a[9]:="8";
a[10]:="9";
while Length(st)>0 do
  begin
     if Pos(" ",st)=1 then Delete(st,1,1);
   for  i:=1 to 10 do
    if st[1]=a[i] then begin
     b[k]:=Copy(st,1,Pos(" ",st)-1);k:=k+1;
    end;
     Delete(st,1,Pos(" ",st)-1);
  end;
end;
var a:tst;
   st:string;k,i:Byte;
BEGIN
k:=1;
Writeln("insert yous text");readln(st);Writeln(st);
word(st,k,a);
for i:=1 to k do
Writeln(a[i]);
Readln;
END.
прога должна переписать числа из текста в отдельный массив ,когда компилирую выдает ошибку runtime error 216 at 00404230 .Я никак не могу понять что не так .Помогите пожалуйста))))


 
KilkennyCat ©   (2011-11-30 04:23) [1]


> a[1]:="0";
> a[2]:="1";
> a[3]:="2";
> a[4]:="3";
> a[5]:="4";
> a[6]:="5";
> a[7]:="6";
> a[8]:="7";
> a[9]:="8";
> a[10]:="9";

жуть


procedure word(st:string;var k:Byte; b:tst);
var
 i : Byte;
 tempStr : String;
begin
 i := 1;
 tempStr := "";
 while Length(st) > 0 do begin
   if st[i] in ["0".."9"] then tempStr := tempStr + st[i] else begin
     b[k] := tempStr;
     tempStr := "";
     inc(k);
   end;
end;

и вообще логичнее использовать динамический массив, ибо тут неизвестно количество элементов.


 
KilkennyCat ©   (2011-11-30 04:25) [2]

ошибся.
procedure word(st:string;var k:Byte; b:tst);
var
i : Byte;
tempStr : String;
begin
i := 1;
tempStr := "";
while k >= Length(st) do begin
  if st[i] in ["0".."9"] then tempStr := tempStr + st[i] else begin
    b[k] := tempStr;
    tempStr := "";
  end;
  inc(k);
end;


 
KilkennyCat ©   (2011-11-30 04:33) [3]

:) че-то я туплю.
procedure word(st:string;var k:Byte; b:tst);
var
i : Byte;
tempStr : String;
begin
i := 1;
tempStr := "";
while i <= Length(st) do begin
 if st[i] in ["0".."9"] then tempStr := tempStr + st[i] else begin
   b[k] := tempStr;
   tempStr := "";
   inc(k);
 end;
 inc(i);
end;

наверное, все равнго накосячил, пофиг, спать пора.


 
Германн ©   (2011-11-30 06:25) [4]


> когда компилирую выдает ошибку runtime error 216 at 00404230

Не ври. При компиляции такой ошибки не бывает.
Ну а код просто "ужас, летящий на крыльях ночи"! :)


 
Ega23 ©   (2011-11-30 08:00) [5]


unit Unit12;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Generics.Collections, StdCtrls;

type

 TNumericalData = class (TObject)
 private
   FData: TList<Integer>;
   procedure AddToken(var Token: string); inline;
 public
   constructor Create;
   destructor Destroy; override;
   procedure Execute(const Value: string);
   property Data: TList<Integer> read FData;
 end;

 TForm12 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form12: TForm12;

implementation

{$R *.dfm}

{ TNumericalData }

//*****************************************************************************

procedure TNumericalData.AddToken(var Token: string);
var
 i: Integer;
begin
 if TryStrToInt(Token, i) then
   if FData.IndexOf(i) = -1 then
     FData.Add(i);
 Token := "";
end;

//*****************************************************************************

constructor TNumericalData.Create;
begin
 inherited;
 FData := TList<Integer>.Create;
end;

//*****************************************************************************

destructor TNumericalData.Destroy;
begin
 FData.Free;
 inherited;
end;

//*****************************************************************************

procedure TNumericalData.Execute(const Value: string);
var
 i: Integer;
 aToken: string;
begin
 FData.Clear;
 aToken := "";
 for i := 1 to Length(Value) do
   if Value[i] in ["0".."9"] then
    aToken := aToken + Value[i]
   else
     AddToken(aToken);
 AddToken(aToken);
end;

//*****************************************************************************

{TForm12}

//*****************************************************************************

procedure TForm12.Button1Click(Sender: TObject);
var
 i: Integer;
begin
 Memo1.Clear;
 with TNumericalData.Create do
   try
     Execute(Edit1.Text);
     for i := 0 to Data.Count - 1 do
       Memo1.Lines.Add(IntToStr(Data[i]));
   finally
     Free;
   end;
end;

//*****************************************************************************

end.


 
Jeer ©   (2011-11-30 09:30) [6]


> Ega23 ©   (30.11.11 08:00) [5]


Теперь аффтар сюда долго не зайдет :)


 
Dennis I. Komarov ©   (2011-11-30 09:32) [7]


> FData: TList<Integer>;

Я понимаю, что я из каменного, но это что за конструкция? В чем отличия от обычного TList?


 
Jeer ©   (2011-11-30 09:51) [8]

Дженерики ( обобщения ).
Обычный TList - список указателей.
Обобщения позволяют создавать список оговоренного типа данных.
В данном случае - список integer ( аля дин. массив ).


 
Ega23 ©   (2011-11-30 10:37) [9]


>  В чем отличия от обычного TList?


http://www.tdelphiblog.com/2009/07/generics-delphi-2009-win32-1.html


> В данном случае - список integer ( аля дин. массив ).


Собственно, это и есть дин.массив, просто он в привате сидит и реаллок несколько иначе реализован.


 
Jeer ©   (2011-11-30 11:58) [10]


> Собственно, это и есть дин.массив, просто он в привате сидит
> и реаллок несколько иначе реализован.
>


Да.
+ медленнее за счет более "жадного" алгоритма реаллока.


 
Ega23 ©   (2011-11-30 12:05) [11]


> + медленнее за счет более "жадного" алгоритма реаллока.


Наоборот, быстрее. Прирост размера 25% сразу. Но - по одному разу, а не на каждой итерации SetLength делать.


 
Dennis I. Komarov ©   (2011-11-30 12:06) [12]

Спасиб, сейчас накачу update в мозг... :)


 
Jeer ©   (2011-11-30 12:59) [13]


> Ega23 ©   (30.11.11 12:05) [11]


Я о дженерике, а не стандартном TList.
TList быстрее, чем TList<T>


 
Jeer ©   (2011-11-30 13:01) [14]

Кроме того, дженерик, поскольку использует дин. массив, вынужден устраивать "зачистку" после изменения длины, что - время.


 
Ega23 ©   (2011-11-30 13:15) [15]


> Кроме того, дженерик, поскольку использует дин. массив,
> вынужден устраивать "зачистку" после изменения длины, что
> - время.


А TList, блин, не использует дин.массив, да?


> TList быстрее, чем TList<T>

Смотря в чём. Смотря где. Смотря как.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.03.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
15-1321122840
Максим
2011-11-12 22:34
2012.03.11
Что делать в случае если Windows уже не помещается на винте?


1-1288777384
ArtemKolesnikov
2010-11-03 12:43
2012.03.11
OLE Word. Как вставить формулу со знаком корня?


2-1322507312
_qwerty_
2011-11-28 23:08
2012.03.11
работа с таблицей бд из класса


2-1322567877
Gu
2011-11-29 15:57
2012.03.11
длина пароля из политик


1-1286692304
Lex_!
2010-10-10 10:31
2012.03.11
Работа с элементами IE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский