Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Вниззапись в файл Найти похожие ветки
← →
гость (2004-12-26 12:25) [0]Задача такая. есть строка в которой записана формула вида (5*sin(t)+7*sin(3t)+55*sin(7t)+..и т.д.). необходимо записать в файл 1.txt все числа перед знаком * в строку через пробел.
← →
Gero © (2004-12-26 12:32) [1]Pos, Delete
AssignFile, Reset, Write, CloseFile
← →
гость (2004-12-26 12:35) [2]Это понятно а пример 100% работающий можно.
← →
Gero © (2004-12-26 12:36) [3]Ну раз понятно, почему бы не написать самому?
← →
гость (2004-12-26 12:41) [4]Да пробовал но не работает.
← →
Gero © (2004-12-26 12:42) [5]
> гость (26.12.04 12:41)
Показывай, что не работает.
← →
гость (2004-12-26 12:50) [6]
S:=Text;
a:=pos("*",s);
while a<>0 do
begin
b:=a-1;
w:="";
while ((s[b]>="0")and (s[b]<="9")) do
begin
w:=s[b]+w;
dec(b);
if b<0 then break;
c:=pos(")",s);
s:=copy(s,c+1,length(s)-c);
a:=pos("*",s);
assignfile(F1,"C:\programming.txt");
{$I+}
ReWrite(F1);
{$I-}
Writeln(F1,w);
CloseFile(F1);
end;
end;
← →
aus (2004-12-26 12:54) [7]Зачем каждый раз переоткрывать файл? Один раз открыл, записаол все, что нужно, и закрыл.
← →
гость (2004-12-26 12:57) [8]А поподробней
← →
aus (2004-12-26 13:04) [9]Подробнее:
отрывай файл перед началом цикла, в цикле пиши в него данные, по завершении цикла закрывай файл.
Rewrite(F1) создает новый файл, все что ты в него написал, естественно, пропадает.
← →
begin...end © (2004-12-26 13:56) [10]> гость (26.12.04 12:25)
Например, так:var
sOld, sNew: String;
I, P: Integer;
F: TextFile;
begin
sOld := "(5*sin(t)+7*sin(3t)+55*sin(7t)+";
P := 0;
for I := 1 to Length(sOld) do
case sOld[I] of
"0".."9":
if P = 0 then P := I;
"*":
if P <> 0 then
begin
sNew := sNew + Copy(sOld, P, I - P) + " ";
P := 0
end
else
P := 0
end;
if Length(sNew) > 0 then
begin
Delete(sNew, Length(sNew), 1);
AssignFile(F, "c:\test.txt");
Rewrite(F);
Write(F, sNew);
CloseFile(F)
end
end.
← →
begin...end © (2004-12-26 13:57) [11]> гость (26.12.04 12:25)
Кстати, Вы уже задавали этот вопрос, привожу текст той ветки:
гость (07.12.04 17:16)
Имеется строка вида 2*3+444*8+37*77+.......
вопрос.
Как найти в строке все * и числа стоящие перед * (2 444 37 и т.д.)записать в файл
1.txt через пробел.
--------------------------------------------------------------------------------
[1] Александр Иванов © (07.12.04 17:33)
Примерно так:
try
String:=TStringList.Create;
index:=pos("*", Str);
while index<>0 do
begin
if index<>byte(Str[0]) then
Str:=Copy(Str,index+1,byte(Str[0])-index);
else Str:="";
i:=index-1;
buffer:="";
Sub := Copy(Str,1,index-1);
while (i <> 0) or (not Sub[i] in ["0".."9","."]) do
begin
buffer:=buffer+Sub[i];
dec(i);
end;
Strings.Add(buffer);
index:=pos("*", Str);
end;
Strings.SaveToFile(FileName);
finally
Strings.Free;
end;
--------------------------------------------------------------------------------
[2] begin...end © (07.12.04 19:31)
> гость (07.12.04 17:16)
uses StrUtils;
var
S: String;
I, J: Integer;
begin
S := "2*3+444*8+37*77+";
with TStringList.Create do
try
Delimiter := "*";
DelimitedText := S;
if Count > 0 then
Delete(Count - 1);
for I := 0 to Count - 1 do
for J := Length(Strings[I]) downto 1 do
if not (Strings[I][J] in ["0".."9"]) then
begin
Strings[I] := RightStr(Strings[I], Length(Strings[I]) - J);
Break
end;
SaveToFile("c:\1.txt")
finally
Free
end
end.
← →
begin...end © (2004-12-26 14:39) [12]В [10] есть ошибка, нужно так:
var
sOld, sNew: String;
I, P: Integer;
F: TextFile;
begin
sOld := "(5*sin(t)+7*sin(3t)+55*sin(7t)+";
P := 0;
for I := 1 to Length(sOld) do
begin
case sOld[I] of
"0".."9":
if P = 0 then P := I;
"*":
if P <> 0 then
begin
sNew := sNew + Copy(sOld, P, I - P) + " ";
P := 0
end;
else
P := 0
end;
end;
if Length(sNew) > 0 then
begin
Delete(sNew, Length(sNew), 1);
AssignFile(F, "c:\test.txt");
Rewrite(F);
Write(F, sNew);
CloseFile(F)
end
end.
Кому интересно - можете поискать отличие этого кода от кода [10]. Здесь, по сути дела, всего одно отличие. Но как много оно решает!
← →
Mystic © (2004-12-26 15:27) [13]Еще один вариант решения, с использование LEX:
1) Скачать http://www.torry.net/tools/developers/compilers/tplyh.zip
2) Создать файл test.l
%{
program Test;
{$APPTYPE CONSOLE}
uses Classes, LexLib;
%}
%%
%{
var I: Integer;
%}
[0-9]+\* begin
I := 1;
while yytext[I] in ["0".."9"] do
begin
put_char(yytext[I]);
I := I + 1;
end;
put_char(" ");
end;
\n ;
. ;
%%
var
St: string;
begin
Write("St=");
ReadLn(St);
try
yyinput := TStringStream.Create(St);
yyoutput := TFileStream.Create("1.txt", fmCreate);
yylex;
finally
yyinput.Free;
yyoutput.Free;
end;
ReadLn;
end.
3) Выполнить следующие команды:
lex test.l test.dpr
dcc32 test.dpr -U<PATH to TPLYH>
Преимущества в более легкой модификации. Например, если будет вдруг сказано, что перед числом и знаком `*" могут быть необязательные пробелы, то нам надо только заменить выражение [0-9]+\* на [0-9]+" "*\*.
Также нетрудно при необходимости читать вещественные числа, учитывать знак, стоящий перед числом (возможноотделенный пробелом) и т. д.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.041 c