Помощь - Поиск - Пользователи - Календарь
Полная версия: Обработка Строк
Форум «Всё о Паскале» > 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('ўўҐ¤ЁвҐ бва®Єг');
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.
Гость
Спасибо за советы..... Помогли))
Гость
блин, требуется, чтобы выводил строки друг под другом, помогите плз!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.