Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

запись в файл   Найти похожие ветки 

 
гость   (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
14-1104005982
Piter
2004-12-25 23:19
2005.01.16
Что такое engine.awaps.net ?


14-1103810851
inic
2004-12-23 17:07
2005.01.16
Брутальный картридж :))


14-1104406243
_1008_
2004-12-30 14:30
2005.01.16
Иногда полезно читать афоризмы на этом сайте


1-1103979366
Russko
2004-12-25 15:56
2005.01.16
Выявление ошибки


14-1103971807
YurikGL
2004-12-25 13:50
2005.01.16
Caller ID и две линии