Задача такова.... Дана строка символов, представляющая предложение и строки, представляющие имя и отчество. Поместить в строку - предложение после имени отчество. Имя может быть указано несколько раз. Порядок ввода исходных данных:последовательность строк, представляющих - предложение; - имя; -отчество. Порядок вывода результатов: - преобразованное предложение!
В двух словах - это так: к примеру, вводиться строка: Иван работает, потом вводится его отчество: Васильевич,
И прога должна вставить его отчество после имени: Иван Васильевич работает!!!
arhimag
7.11.2006 3:08
Можешь полностью привести 2-3 примера входных данных
klem4
7.11.2006 12:49
Вставить строку B в середину строки A, имеющей вид <Слово1> <проблел> <Слово2>
var A, B: String;
begin A := 'Иван работает'; B := 'Васильевич'; Insert(B + ' ', A, pos(' ', A) + 1); writeln(A); end.
Это в случае если мы точно знаем, что имя - первое слово в строке A, а после него стоит пробел. Если мы ничего не знаем о том где стоит имя и что стоит после него (запятая, точка ...), то задача стновится намного интереснее ;)
Цитата(arhimag)
Можешь полностью привести 2-3 примера входных данных
Malice
7.11.2006 14:22
Цитата(-Alex- @ 6.11.2006 22:48)
Задача такова.... Дана строка символов, представляющая предложение и строки, представляющие имя и отчество.
Задача на 3 переменных и 10 строк Что не получается?
Гость
7.11.2006 18:06
На самом деле, всё что дано, я написал.... Вот именно так нужно понимать эту задачу! И именно в этом у меня проблемы, т.к. я не опнимаю до конца условие! В этом весь трабл!!! Всё что я понял от учителя, это то что, есть строка символов содержащая имя и какой-то текст, и нужно вставить отчество после имени.....
Гость
7.11.2006 18:09
И неизвестно на какой позиции стоит имя.....((( может в конце, а может в середине...
volvo
7.11.2006 18:47
Цитата
И неизвестно на какой позиции стоит имя.....((( может в конце, а может в середине...
Тогда тебе придется создавать словарь допустимых имен, и искать слова, в него входящие, в заданной строке...
Malice
7.11.2006 18:48
Судя по условию нужно ввести _3_ строки: предложение, имя и отчество. Потом ищещь в предложинии имя и ставищь после него отчество. Т.к. имя может повторятся, поиск нужно производить повторно в той части строки, в которой еще не искали, т.е. после предыдущего вхождения имени в предложение.
arhimag
7.11.2006 18:49
А... понял Задача проста как мир. Смотри пробегаешь по тексту, далее ищещь слова с заглавными буквами, если нашел, то проверяещь первое слово совадает с эти Именем, если да то после первого вставляешь отчество. и вставляешь после этого имени отчество и ищешь дальше.
Гость
7.11.2006 18:53
Цитата(arhimag @ 7.11.2006 14:49)
А... понял Задача проста как мир. Смотри пробегаешь по тексту, далее ищещь слова с заглавными буквами, если нашел, то проверяещь первое слово совадает с эти Именем, если да то после первого вставляешь отчество. и вставляешь после этого имени отчество и ищешь дальше.
Если не трудно, можешь написать кусок этой процедуры! я просто уже половину написал : создание файла, чтение и вывод на экран(это тоже нужно было), осталось эта процедурка! ПЛИЗ)))
arhimag
7.11.2006 19:58
а ты сам пробывал написать? то что я тебе сказал? если да, то покажи что получилось
Гость
7.11.2006 20:18
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;
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." но как исправить ты я думаю догадаешься
Гость
7.11.2006 21:11
Он выдает переполнение стека!!!! чё подскажешь?
arhimag
7.11.2006 22:05
уменьшь размеры типов
type TWords = array[1..100] of string[15]; type tdel = array[1..100] of string[5];
Malice
7.11.2006 22:05
Думаю тебе нужна функция типа такой:
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.
Гость
8.11.2006 1:33
Спасибо за советы..... Помогли))
Гость
13.11.2006 23:19
блин, требуется, чтобы выводил строки друг под другом, помогите плз!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.