Помощь - Поиск - Пользователи - Календарь
Полная версия: Обработка Строк
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-Alex-
Задача такова.... Дана строка символов, представляющая предложение и строки, представляющие имя и отчество. Поместить в строку - предложение после имени отчество. Имя может быть указано несколько раз. Порядок ввода исходных данных:последовательность строк, представляющих - предложение; - имя; -отчество.
Порядок вывода результатов: - преобразованное предложение!

В двух словах - это так:
к примеру, вводиться строка: Иван работает,
потом вводится его отчество: Васильевич,

И прога должна вставить его отчество после имени: Иван Васильевич работает!!!
arhimag
Можешь полностью привести 2-3 примера входных данных
klem4
Вставить строку B в середину строки A, имеющей вид <Слово1> <проблел> <Слово2>

var
 A, B: String;

begin
  A := 'Иван работает';
  B := 'Васильевич';
  Insert(B + ' ', A, pos(' ', A) + 1);
  writeln(A);
end.


Это в случае если мы точно знаем, что имя - первое слово в строке A, а после него стоит пробел. Если мы ничего не знаем о том где стоит имя и что стоит после него (запятая, точка ...), то задача стновится намного интереснее ;)

Цитата(arhimag)
Можешь полностью привести 2-3 примера входных данных


yes2.gif
Malice
Цитата(-Alex- @ 6.11.2006 22:48) *

Задача такова.... Дана строка символов, представляющая предложение и строки, представляющие имя и отчество.

Задача на 3 переменных и 10 строк smile.gif Что не получается?
Гость
На самом деле, всё что дано, я написал.... Вот именно так нужно понимать эту задачу! И именно в этом у меня проблемы, т.к. я не опнимаю до конца условие! В этом весь трабл!!!
Всё что я понял от учителя, это то что, есть строка символов содержащая имя и какой-то текст, и нужно вставить отчество после имени..... dry.gif
Гость
И неизвестно на какой позиции стоит имя.....((( может в конце, а может в середине...
volvo
Цитата
И неизвестно на какой позиции стоит имя.....((( может в конце, а может в середине...
Тогда тебе придется создавать словарь допустимых имен, и искать слова, в него входящие, в заданной строке... unsure.gif
Malice
Судя по условию нужно ввести _3_ строки: предложение, имя и отчество. Потом ищещь в предложинии имя и ставищь после него отчество. Т.к. имя может повторятся, поиск нужно производить повторно в той части строки, в которой еще не искали, т.е. после предыдущего вхождения имени в предложение.
arhimag
А... понял smile.gif
Задача проста как мир.
Смотри пробегаешь по тексту, далее ищещь слова с заглавными буквами, если нашел, то проверяещь первое слово совадает с эти Именем, если да то после первого вставляешь отчество. и вставляешь после этого имени отчество и ищешь дальше.
Гость
Цитата(arhimag @ 7.11.2006 14:49) *

А... понял smile.gif
Задача проста как мир.
Смотри пробегаешь по тексту, далее ищещь слова с заглавными буквами, если нашел, то проверяещь первое слово совадает с эти Именем, если да то после первого вставляешь отчество. и вставляешь после этого имени отчество и ищешь дальше.


Если не трудно, можешь написать кусок этой процедуры! я просто уже половину написал : создание файла, чтение и вывод на экран(это тоже нужно было), осталось эта процедурка! ПЛИЗ)))
arhimag
а ты сам пробывал написать? то что я тебе сказал? если да, то покажи что получилось
Гость
program pataya_laboratornaya;
var s,name,name1:string;
    k:integer;
procedure stroki(var st:string);
 var i,n,j:integer;
 begin
  i:=pos('  ',st);
   while (i<>0) do
   begin
   delete(st,i,1);
   i:=pos('  ',st);
   end;
   end;
procedure create(name:string);
 var i,n:integer;f:text;
     x:string;
  begin
   assign(f,name);
   {$I-}
   rewrite(f);
   {$I+}
   if ioresult <> 0 then writeln ('error')
   else
    begin
    readln(n);
    for i:=1 to n do
     begin
     readln(x);
     writeln(f,x);
     end;
    close(f);
    end;
  end;
procedure print_file(name:string);
 var x:string;f:text;
 begin
   assign(f,name);
   {$I-}
   reset(f);
   {$I+}
    if ioresult <> 0 then writeln ('error')
   else
    begin
      while not(eof(f)) do
      begin
       readln(f,x);
       writeln(x);
      end;
       close(f);
    end;
 end;
procedure obrabotka(name,name1:string);
  var x,s:string;
      f1:text;
      f2:text;
   begin
     assign(f1,name);
   {$I-}
   reset(f1);
   {$I+}
   if ioresult <> 0 then writeln ('error')
   else
    begin
       assign(f2,name1);
       {$I-}
       rewrite(f2);
       {$I+}


    if ioresult <> 0 then writeln ('error')
   else
    begin

      while not(eof(f1)) do
      begin
       readln(f1,x);
       stroki(x);
       writeln(f2,x);
      end;
       close(f2);
    end;
    close(f1);
 end;
     end;

    begin
{      writeln('ўўҐ¤ЁвҐ бва(r)Єг');
      readln(s);
      stroki(s);
      writeln('१г«мв в');
      writeln(s);}
      writeln('name=');
      readln(name);
      create(name);
      writeln('name1=');
      readln(name1);
      obrabotka(name,name1);
      print_file(name);
      print_file(name1);
end.


М
Теги !

arhimag
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const

   delitel = [#0..#32, '.', ',', ':', ';', '!', '?', '"'];
type
   TWords = array[1..100] of string;
type
   tdel = array[1..100] of string;
var
   S : string;
   W : twords;
   D : tdel;

function words_from_string (s : string; var w : twords; var d : tdel) : integer;
var
   i,j,k,count : integer;
begin
   i := 1;
   count := 0;
   while ( i <= length(s) ) do begin
      k:=i;
      while( i <= length(s) ) and ( s[i] in delitel ) do
       inc(i);
      d[count+1] := copy  (s , k, i-k );
      if i <= length( s ) then begin
         j := i;
         while(i <= length( s )) and not( s[i] in delitel) do
          inc(i);
         inc(count);
         w[count] := copy(s, j, i-j);
      end;
   end;

   result := count;
end;
var count : integer;
var
  name : array [ 1..100 ] of boolean;

procedure get_name (w : twords);
var i : integer;
flag : boolean;
begin
  name[1]:=false;
  for i:= 2 to count do
    if (w[i,1] in ['A'..'Z']) or (w[i,1] in ['А'..'Я']) then begin
      name[i]:=true;
      if w[1]=w[i] then name[1] := true;
    end else       name[i]:=false;
    flag:= false;
    for i:=2 to count do
      if name[i] then flag:=true;
    if not flag then name[1]:=true;

end;

function make_s(w : twords; d : tdel; otch : string):string;
var s : string;
i : integer;
begin
  s:='';
  for i:= 1 to count do begin
    s:= s + d[i];
    s:= s + w[i];
    if name[i] then s:= s +' '+ otch;
  end;
  result:=s;
end;




var b : string;
begin
  s:='Vasa bili tut.';
  b:='Ivanovich';
  count := words_from_string(s,w,d);
  get_name(w);
  write(make_s(w,d,b));
  readln;
  s:='Ja i Vasa bili tut.';
  b:='Ivanovich';
  count := words_from_string(s,w,d);
  get_name(w);
  write(make_s(w,d,b));
  readln;

  { TODO -oUser -cConsole Main : Insert code here }
end.

Лень искать лажу вот код, сам разбирайся ( работает под Delphi )
чтобы перевестим на паскалевский замени result на название функции

Кстати код не работает в строке "Vasa." но как исправить ты я думаю догадаешься smile.gif
Гость
Он выдает переполнение стека!!!! чё подскажешь?
arhimag
уменьшь размеры типов


type
   TWords = array[1..100] of string[15];
type
   tdel = array[1..100] of string[5];
Malice
Думаю тебе нужна функция типа такой:

function f(s,n,o:string):string;
begin
if pos(n,s)=0 then f:=s else
f:=copy(s,1,pos(n,s)-1)+n+' '+o+f(copy(s,pos(n,s)+length(n),255),n,o);
end;

Которая в предложении s после n ставит o.
Гость
Спасибо за советы..... Помогли))
Гость
блин, требуется, чтобы выводил строки друг под другом, помогите плз!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.