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

Вниз

Обработка строки. Паскаль   Найти похожие ветки 

 
Troy ©   (2004-04-13 01:49) [0]

ужасно глючит комиплятор, не могу доделать прогу.
надо из строки "123 456    789" сделать строку "789 456 123" и на экран вывести. помогите пожалста.
добился только : из "123 456    789" в "987 654 321"
:-( ну не врумаю я как ....

program stroka;
var a,b,st,st1,st2:string;
   var1,i,n,d,n1:integer;
begin
writeln("введите строку");
readln(st);
a:=" ";
b:="  ";
n:=pos (a,st);
if n<>0 then
while n=1 do
       begin
       delete(st,1,1);
       n:=pos(a,st);
       end;
n:=pos(b,st);
while n<>0 do
   begin
   delete(st,n,1);
   n:=pos(b,st);
   end;
n:=length(st);
n1:=n;
st2:=st[n];
while d<n do
 begin
  st1[d]:=st[n1];
  n1:=n1-1;
  d:=d+1;
  end;
st1:=concat(st2,st1);
n:=pos (a,st1);if n<>0 then
while n=1 do
       begin
       delete(st1,1,1);
       n:=pos(a,st);
       end;
writeln (st1);
end.


 
TUser ©   (2004-04-13 07:30) [1]

setLength(ar,0);
i:=pos(" ",s); j:=1;
if i<>0 then
repeat
if i<>j+1 then begin
  setLength(ar,length(ar)+1);
  ar[length(ar)-1]:=copy(s,j,i-j);
  j:=i+1;
  i:=posex(" ",s,j);
  if i=0 then i:=length(s)+1;    
  end;
until (i=0) or (j=length(s)+2);
s:="";
for i:=length(ar)-1 downto 0 do
  s:=s+ar[i]+" ";
writeln(copy(s,1,length(s)-1));


 
PKT   (2004-04-13 07:34) [2]


 St1 := "";
 repeat
   I := Pos(#32, St);
   if I > 0 then begin
     St1 := Copy(St, 1, I - 1) + #32 + St1;
     Delete(St, 1, I);
     while St[1] = #32 do Delete(St, 1, 1);
   end;
 until I = 0;
 St1 := St + #32 + St1;


 
TUser ©   (2004-04-13 08:03) [3]

var i:integer; s,news:string; buf:string;
procedure writebuf;
var j:integer;
begin
if buf<>"" then begin
  j:=1;
  while j<(length(s) div 2) do begin
     c:=s[j];
     s[j]:=s[length(s)-j+1];
     s[length(s)-j+1]:=c;
     inc(j);
     end;
  news:=news+buf+" ";
  buf:="";
  end;
end;

begin
buf:=""; news:="";
for i:=length(s) downto 1 do
  if s[i]<>" " then buf:=buf+s[i]
  else writebuf;
writebuf;
writeln(copy(news,1,length(news)-1);
end;


 
Troy ©   (2004-04-13 08:55) [4]

TUser, c : string?


 
TButton ©   (2004-04-13 09:07) [5]

>ужасно глючит комиплятор
"ничто так не ограничивает полет мысли програмиста, как компилятор" (с)


 
Troy ©   (2004-04-13 09:10) [6]

TUser
procedure writebuf;
var j:integer;
begin
if buf<>"" then begin
 j:=1;
 while j<(length(s) div 2) do begin
    c:=s[j];
    s[j]:=s[length(s)-j+1];
    s[length(s)-j+1]:=c;
 {Type mismatch :( }
    inc(j);
    end;
 news:=news+buf+" ";
 buf:="";
 end;
end;


 
Troy ©   (2004-04-13 09:12) [7]

причем var c:string;


 
TButton ©   (2004-04-13 09:43) [8]

тебе только
"надо из строки "123 456    789" сделать строку "789 456 123" и на экран вывести"
вот вам код

function GetValueS(s: string; num: integer): string;
var
 sl: TStringList;
begin
 result:="";
 sl:=TStringList.Create;
 sl.AddStrings(ParseToWords(s));
 if num>sl.Count-1 then Exit;
 result:=sl[num];
end;

и то без чего он не будет работать

function ParseToWords(s: string): TStringList;
var
 i: integer;
 ss: string;
begin
 result:=TStringList.Create;
 if s="" then Exit;
 ss:="";
 for i:=1 to length(s) do
 begin
   if s[i]=" " then
   begin
     result.Add(ss);
     ss:="";
   end
   else
     ss:=ss+s[i];
 end;
 if ss<>"" then result.Add(ss);
end;

это правда для дельфи, для паскаля попробуй написать свой вариант TStringList или из той же дельфы рипни.


 
Troy ©   (2004-04-13 09:48) [9]

а "num" это что ?


 
Ega23 ©   (2004-04-13 09:55) [10]

TButton ©   (13.04.04 09:43) [8]

А где  result:=TStringList.Create данный стринглист убиваться будет, что-то понять не могу?


 
Troy ©   (2004-04-13 09:59) [11]

хм...
ну вот переделал под паскаль...

program stroka;
var out,result,inpstr : string;

function ParseToWords(s: string): String;
var
i: integer;
ss: string;
begin
result:="";
if s="" then Exit;
ss:="";
for i:=1 to length(s) do
begin
  if s[i]=" " then
  begin
    insert(ss,result,length(ss)+1);
    ss:="";
  end
  else
    ss:=ss+s[i];
end;
if ss<>"" then insert(ss,result,length(ss)+1);
end;
function GetValueS(s: string; num: integer): string;
var
sl: String;
begin
result:="";
sl:="";
sl:=ParseToWords(s);
if num > length(sl)-1 then Exit;
result:=sl[num];
end;
begin
writeln ("vvedite stroku");
readln (inpstr);
out:=ParseToWords(inpstr);
writeln(out);
end.

но похоже непрально...


 
TButton ©   (2004-04-13 09:59) [12]

re 9
первая функция выдергивает слово номер num из строки s

re 10
пральна. это сказывается недостаток опыта на момент написания кода, а сейчас просто времени нет переписать. а вообще - имхо он убьется сам вместе с прогой.


 
Anonimous   (2004-04-13 10:03) [13]

Может это поможет:


function ReOrder(str: string): string;
var
 buf, res: string;
 i, j: Integer;
begin
 for i := Length(str) downto 1 do
 begin
   if str[i] <> " " then
     buf := buf + str[i]
   else if (buf <> "") then
   begin
     for j := Length(buf) downto 1 do
       res := res + buf[j];
     buf := "";
     res := res + " ";
   end;
 end;
 result := res + buf;
end;

var
 s: string = " 123   456   789   2354234 ";
begin
 Writeln(ReOrder(s));
 Readln
end.


 
Ega23 ©   (2004-04-13 10:06) [14]

re 10
пральна. это сказывается недостаток опыта на момент написания кода, а сейчас просто времени нет переписать. а вообще - имхо он убьется сам вместе с прогой.

Тогда уж лучше
function ParseToWords(s: string; List:TStringList): Boolean;


 
Troy ©   (2004-04-13 10:11) [15]

Re 13
хм. ничто не выводится на экран :(


 
TButton ©   (2004-04-13 10:12) [16]

но похоже непрально...
да. вы как нельзя правы =) ибо преждний вариант возвращал TStringList. в Паскале, я его заменил на array of string, а местами (не без подсказки мастеров) - на TStringArray
type
 TStringArray = array of string;

т.е. переписать надо было примерно так

procedure ParseToWords(s: string; var res: TStringArray);
var
i: integer;
ss: string;
begin
SetLength(res,0);          // чистим
if s="" then Exit;         // если строка пустая - уходим
ss:="";                    // чистим буфер
for i:=1 to length(s) do    
begin
  if s[i]=" " then         // нашли пробел
  begin
    SetLength(res, high(res)+2);  // добавляем к массиву еще одну строку
    res[high(res)]:=ss;           // нишем в нее буфер
    ss:="";                       // чистим буыер
  end
  else
    ss:=ss+s[i];           // не пробел - добавляем к буферу  
end;
// если по концове в буфере что-то есть
if ss<>"" then
begin
  SetLength(res, high(res)+2);  // добавляем к массиву еще одну строку
    res[high(res)]:=ss;           // нишем в нее буфер
end;
end;


 
panov ©   (2004-04-13 10:13) [17]

function ParseStr(aSrc: String):String;
var
 tmpStr: String;
 i: Integer;
begin
 if aSrc="" then Exit;
 Result := "";
 tmpStr :="";
 for i := 1 to Length(aSrc) do
 begin
   if aSrc[i]=" " then
   begin
     Result := tmpStr+" "+Result;
     tmpStr := "";
   end
   else tmpStr := tmpStr + aSrc[i];
 end;
 Result := tmpStr+" "+Result;
end;


 
Ega23 ©   (2004-04-13 10:13) [18]

Troy ©   (13.04.04 10:11) [15]

Хочешь совет дельный?
Возьми бумажку, карандаш, отодвинь клавиатуру нафиг и нарисуй себе алгоритм. Если ты будешь представлять что делать, то и вопросы такие задавать не будешь.


 
Troy ©   (2004-04-13 10:14) [19]

рисовал. сделал. не получается функциями замутить это в паскале мля.
на бэйские то проще...


 
TButton ©   (2004-04-13 10:16) [20]

а теперь тебе положим нужно переставить слова

var
 ar1, ar2; TStringArray;
 i: integer;
 source: string;
begin
 Writeln("input a string");
 Readln(source);
 ParseToWords(source, ar1);
 ParseToWords(source, ar2);
 if high(ar1)>=0 then
 for i:=0 to high(ar1) do
   ar2[i]:=ar1[high(ar1)-i];
 source:="";
 if high(ar1)>=0 then
 for i:=0 to high(ar1) do
   source:=source+ar2[i]+" ";
 Writeln(source);
 Write("Press Enter");
 Readln;
end.


 
Ega23 ©   (2004-04-13 10:17) [21]

Всё, что тебе нужно, это
Length, и Str[i].
Подумай!


 
TButton ©   (2004-04-13 10:19) [22]

комментарий:
 парсим два раза чтоб получить два одинаковых массива.
 вместо собирания последней строки можно просто последовательно вывести все элементы ar1
 более того, можно обойтись без ar2 вообще. в таком случае нужно собрать в строку все эл-ты ar1 в обратном порядке. что-то я об этом сразу не подумал =)


 
TButton ©   (2004-04-13 10:20) [23]

работа над ошибками:
 вместо собирания последней строки можно просто последовательно вывести все элементы ar2


 
Troy ©   (2004-04-13 10:20) [24]

re 16. TButton
SetLength - unknown identifier


 
TButton ©   (2004-04-13 10:23) [25]

че правда?
я думаю, если в паскале есть динамические массивы, то и SetLength должен быть.


 
Troy ©   (2004-04-13 10:25) [26]

ну вот нету...
паскаль 7.0


 
Anonimous   (2004-04-13 10:27) [27]

program a1;
function ReOrder(str: string): string;
var
buf, res: string;
i, j: Integer;
begin
buf:="";
res:="";
for i := Length(str) downto 1 do
begin
  if str[i] <> " " then
    buf := buf + str[i]
  else if (buf <> "") then
  begin
    for j := Length(buf) downto 1 do
      res := res + buf[j];
    buf := "";
    res := res + " ";
  end;
end;
for j := Length(buf) downto 1 do
res := res + buf[j];
reOrder := res;
end;

var
s: string;
begin
Write("Insert str:");
Readln(s);
Writeln(ReOrder(s));
Readln
end.


 
Anonimous   (2004-04-13 10:27) [28]


program a1;
function ReOrder(str: string): string;
var
buf, res: string;
i, j: Integer;
begin
buf:="";
res:="";
for i := Length(str) downto 1 do
begin
  if str[i] <> " " then
    buf := buf + str[i]
  else if (buf <> "") then
  begin
    for j := Length(buf) downto 1 do
      res := res + buf[j];
    buf := "";
    res := res + " ";
  end;
end;
for j := Length(buf) downto 1 do
res := res + buf[j];
reOrder := res;
end;

var
s: string;
begin
Write("Insert str:");
Readln(s);
Writeln(ReOrder(s));
Readln
end.


 
TButton ©   (2004-04-13 10:28) [29]

вот. Anonimous правильный код кажет, а я полезный =)


 
Troy ©   (2004-04-13 10:33) [30]

re 28
во !!! %))
четное колиество пробелов приводит к ненаписанию вывода :)
но спасибо. преподу буду с 1м и 3мя пробелами показывать ) если не "успеем" :) доработать. а то через 30 мин уходить ужо :(


 
Troy ©   (2004-04-13 10:41) [31]

эхх было б время и нормальный компилятор я б сделал правильный и полезный код! :)))


 
TButton ©   (2004-04-13 10:45) [32]

имхо, Дельфи(ConsoleApp) функционально мощнее, чем Pascal 7.0


 
Troy ©   (2004-04-13 10:49) [33]

я уже говорил преподу и про C и про дельфи "консольным видом". он меня посылал к зафкафу. на что тот сказал: минвуз сказал - мы сделали иди отсюда мальчик не мешай :)


 
Anonimous   (2004-04-13 11:04) [34]

Что значит ненаписание вывода Alt_F5 нажми и посмотри что получилось.


 
VEG ©   (2004-04-13 20:45) [35]

Видимо, вопрос мало кто понял - требуется из строки "123 456    789" сделать строку "789 456 123". Делаем так:

function GyperReOrder(s: string): string;
begin
GyperReOrder:="789 456 123";
end;
{--==USING==--}
GyperReOrder("123 456 789");


:)


 
VEG ©   (2004-04-13 20:49) [36]

>TButton ©   (13.04.04 10:45) [32]
 ИМХО, FreePascal много удобнее подходит для этой цели.


 
SergP ©   (2004-04-13 21:14) [37]

>ужасно глючит комиплятор

Нечего на компилятор пенять, коли ... (Русская пословица)


 
VEG ©   (2004-04-13 21:45) [38]

Я имел ввиду FreePascal намного лучше использовать при решении задач. Правда, он немного глюковат, но это не всегда мешает. Всегда есть обходные пути. Да и разработчики его постоянно дебаггят.



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

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.037 c
4-1078224931
Лекс
2004-03-02 13:55
2004.05.02
GetWindow в NT


14-1081560795
Думкин
2004-04-10 05:33
2004.05.02
С днем рождения! 10 апреля.


7-1078809077
lucky4me
2004-03-09 08:11
2004.05.02
phone via voice modem


4-1078680770
Kor@l
2004-03-07 20:32
2004.05.02
Mouse


1-1082126699
Kreon
2004-04-16 18:44
2004.05.02
Как синхронизировать скрол фрейма о скролом формы ?