Дана непустая последовательность слов, составленных из цифр и латинских букв, разделенных произвольным числом пробелов. Написать процедуру, которая считывает слово из заданной последовательности и определяет, является ли оно синтаксически корретным идентификатором Паскаля.
volvo
11.12.2005 18:58
garry_m, выделить из строки очередное слово сможешь? В FAQ-е есть несколько примеров разбиения стронки на слова, в "Задачах" есть прикрепленная тема...
Теперь дальше: что является правильным идентификатором Паскаля? Слово должно начинаться на букву или символ подчеркивания, содержать ТОЛЬКО буквы, символы подчеркивания и цифры, и его длина не может превышать 63 символа (в принципе, может, но 2 идентификатора с одинаковыми 64 символами распознаются системой как одинаковые...)
Что именно из этого вызывает затруднения?
garry_m
13.12.2005 0:02
Ну я пересмотрел все... Мне не совсем ясно что такое символы подчеркивания. И надо ли мне в этой задаче использовать массив? Тогда для картина хоть как-то прояснится.
volvo
13.12.2005 0:14
Символы подчеркивания - это "_" (под минусом)...
Для решения этой задачи Нужно в самом крайнем случае 4 переменных типа Integer... И все, никаких массивов...
Хотя, ты можешь делать так, как тебе удобно... С массивами тоже можно...
garry_m
13.12.2005 17:29
Поставленная задача: Дана последовательность, содержащая от 2 до 30 слов, в каждом из которых от 2 до 10 символов; между соседними словами - произвольное число пробелов, за последним словом точка. Напечатать эту же последовательность, удалив из всех слов цифры и символы подчеркивания.
Вот мое решение:
uses crt; var txt:string; mat:array [1..31] of string; isc:string; sch,i,n:integer; begin clrscr; {Naznachenije nachalnih parametrov} for i:=1 to 31 do mat[i]:=''; i:=1;n:=0;mat[31]:='0'; repeat writeln ('Naberite posledovatelnost iz slov,'); writeln('ne previschajuschih 8-m simvolov, i ne bolee 50 slov.'); writeln ('Ili nazhmite Enter dlja vvoda posledovatelnosti po umolchaniju'); writeln ('(Sjesch eche etih mjagkih francuzkih bulok, da vipej chaju.)'); readln(txt); {Proverka na pustotu vvodimogo texta u okonchanije na tochku} if txt='' then txt:='Sjesch eche etih mjagkih francuzkih bulok, da vipej chaju.'; if pos('.',txt)=0 then writeln('Vi zabili postavit tochku.'); until pos('.',txt)<>0; sch:=1; {Udalenije lishnih probelov} repeat if (txt[sch]=' ') and (txt[sch+1]=' ') then begin delete(txt,sch,1);{Udalenije lishnego probela} end else sch:=sch+1; until txt[sch]='.'; sch:=1; {Rasstanovka slov v massiv} repeat {Poisk okonchanija slova} repeat if txt[sch]<>' ' then sch:=sch+1; until (txt[sch]=' ') or (txt[sch]='.'); {Zanesenije najdennogo slova v massiv} mat[i]:=copy(txt,n+1,sch-n-1); i:=i+1;{Nomer slova} n:=sch;{Nachalnoje polozhenije} sch:=sch+1; until (txt[sch]='.') or (i=30); {Vivod posledovatelnosti} writeln('Nabrannaja vami posledovatelnost:'); writeln (txt); {Vivod posledovatelnosti s odinochnimi probelami mezhdu slovami} writeln(''); n:=31; for sch:=2 to i-1 do if length(mat[sch])>10 then isc:=isc+mat[sch]+' '{Iskluchenije slov dlina kotorih bolee 8-mi simvolov} else {Poisk samogo dlinnogo slova} if length(mat[n])<length(mat[sch]) then n:=sch; if mat[n]<>'0' then writeln('Samoe dlinnoje slovo: ', mat[n]) else writeln('Slovo ne previschajuchee 8-mi simvolov ne najdeno.'); if isc<>'' then writeln('Slova previschajuschije 8-m simvolov: ',isc); writeln(''); write('Dlja prodolzhenija nazhmite ENTER...'); readln; end.
volvo, посмотри pls, правильно ли я ее решил? А то мне кажется, что опять накосячил...
volvo
13.12.2005 17:37
garry_m, программа совершенно не по заданию... При чем тут самое длинное слово?
garry_m
13.12.2005 17:54
До меня доперло!
garry_m
13.12.2005 18:32
Блин! Я стормозил! Я просто делал по аналогии, а то что требуют в конце - посмотрел не туда...
garry_m
13.12.2005 20:58
ОК! Значит для этой задачи (из всех слов удалить цифры и символы подчеркивания) начало будет таким...
Код:
Код
uses crt; var txt:string; mat:array [1..31] of string; isc:string; sch,i,n:integer; begin clrscr; {Naznachenije nachalnih parametrov} for i:=1 to 31 do mat[i]:=''; i:=1;n:=0;mat[31]:='0'; repeat writeln ('Naberite posledovatelnost iz slov,'); writeln('ne previschajuschih 8-m simvolov, i ne bolee 50 slov.'); writeln ('Ili nazhmite Enter dlja vvoda posledovatelnosti po umolchaniju'); writeln ('(Sjesch eche etih mjagkih francuzkih bulok, da vipej chaju.)'); readln(txt); {Proverka na pustotu vvodimogo texta u okonchanije na tochku} if txt='' then txt:='Sjesch eche etih mjagkih francuzkih bulok, da vipej chaju.'; if pos('.',txt)=0 then writeln('Vi zabili postavit tochku.'); until pos('.',txt)<>0; sch:=1; {Udalenije lishnih probelov} repeat if (txt[sch]=' ') and (txt[sch+1]=' ') then begin delete(txt,sch,1);{Udalenije lishnego probela} end else sch:=sch+1; until txt[sch]='.'; sch:=1; {Rasstanovka slov v massiv} repeat {Poisk okonchanija slova} repeat if txt[sch]<>' ' then sch:=sch+1; until (txt[sch]=' ') or (txt[sch]='.'); {Zanesenije najdennogo slova v massiv} mat[i]:=copy(txt,n+1,sch-n-1); i:=i+1;{Nomer slova} n:=sch;{Nachalnoje polozhenije} sch:=sch+1; until (txt[sch]='.') or (i=30); {Vivod posledovatelnosti} writeln('Nabrannaja vami posledovatelnost:'); writeln (txt); {Vivod posledovatelnosti s odinochnimi probelami mezhdu slovami} writeln(''); n:=31; for sch:=2 to i-1 do if length(mat[sch])>10 then isc:=isc+mat[sch]+' '{Iskluchenije slov dlina kotorih bolee 8-mi simvolov} else
Как должна выглядеть процедура, которая удаляет цифры и символы подчеркивания?
volvo
13.12.2005 21:04
garry_m, я вот только одного не понял, если ты сразу после ввода строки пройдешь по ней с таким циклом:
i := 1; while i <= length(txt) do if txt[i] in ['0' .. '9', '_'] then delete(s, i, 1) else inc(i);
твое задание не будет считаться выполненным? Что, обязательно все усложнять и разбивать строку на слова? Я вижу, что в задании написано:
Цитата
Дана последовательность, содержащая от 2 до 30 слов, в каждом из которых от 2 до 10 символов; между соседними словами - произвольное число пробелов, за последним словом точка. Напечатать эту же последовательность, удалив из всех слов цифры и символы подчеркивания.
, а ты зачем-то пробелы удаляешь...
garry_m
13.12.2005 21:14
А когда я удалю пробелы он ведь мне напечатает эту же последовательность?
volvo
13.12.2005 21:18
А у тебя в задании где-нибудь сказано, что надо удалять пробелы? Нет... Зачем удаляешь...
А даже если и нужно, это можно сделать в том же цикле, который я тебе написал... Зачем же весь тот код, который ты привел раньше?
garry_m
13.12.2005 21:27
Ну раз пробелы не затрагиваем, то задача упрощается...
Код
uses crt; var txt:string; mat:array [1..31] of string; isc:string; sch,i,n:integer; begin clrscr; {Naznachenije nachalnih parametrov} for i:=1 to 31 do mat[i]:=''; i:=1;n:=0;mat[31]:='0'; repeat writeln ('Naberite posledovatelnost iz slov,'); writeln('ne previschajuschih 8-m simvolov, i ne bolee 50 slov.'); writeln ('Ili nazhmite Enter dlja vvoda posledovatelnosti po umolchaniju'); writeln ('(Sjesch eche etih mjagkih francuzkih bulok, da vipej chaju.)'); readln(txt); {Proverka na pustotu vvodimogo texta u okonchanije na tochku} if txt='' then txt:='Sjesch eche etih mjagkih francuzkih bulok, da vipej chaju.'; if pos('.',txt)=0 then writeln('Vi zabili postavit tochku.'); until pos('.',txt)<>0;
Значит сначала мы вводим текст... так?
garry_m
14.12.2005 10:19
Код корректно написан?
volvo
14.12.2005 10:56
Корректно? Что ты подразумеваешь под этим словом? Будет ли работать? Возможно. Оптимален ли он? Нет.
garry_m
14.12.2005 15:03
Ну это первая часть программы... А что должно идти дальше?
Код
uses crt; var txt:string; mat:array [1..31] of string; isc:string; sch,i,n:integer; begin clrscr; {Naznachenije nachalnih parametrov} for i:=1 to 31 do mat[i]:=''; i:=1;n:=0;mat[31]:='0'; repeat writeln ('Naberite posledovatelnost iz slov,'); writeln('ne previschajuschih 8-m simvolov, i ne bolee 50 slov.'); writeln ('Ili nazhmite Enter dlja vvoda posledovatelnosti po umolchaniju'); writeln ('(Sjesch eche etih mjagkih francuzkih bulok, da vipej chaju.)'); readln(txt); {Proverka na pustotu vvodimogo texta u okonchanije na tochku} if txt='' then txt:='Sjesch eche etih mjagkih francuzkih bulok, da vipej chaju.'; if pos('.',txt)=0 then writeln('Vi zabili postavit tochku.'); until pos('.',txt)<>0;
Или некорретно? Я просто не понимаю. Я же не спец в программировании.
volvo
14.12.2005 15:23
Цитата
Я же не спец в программировании.
В чтении по-русски тоже? Я же тебе в 10-м посте привел практически готовую программу !!!
garry_m
14.12.2005 17:17
volvo, я вставил ту процедуру, которую ты привел в 10-м посте, но похоже я ее не туда вставил. Да и кстати я упростил программу, причем все стало проще во много раз.
Код:
uses crt; var txt:string; mat:array [1..31] of string; i:integer; n:integer; ans:char; begin clrscr; {Naznachenije nachalnih parametrov} for i:=1 to 31 do mat[i]:=''; i:=1;n:=0;mat[31]:='0';
repeat clrscr;
repeat
writeln ('NABERITE POSLEDOVATELNOST IS SLOV,'); writeln('NE PREVISHAUSCHIH 10 SIMVOLOV, I NE BOLEE 30 SLOV.'); readln(txt);
{Proverka na pustotu vvodimogo texta u okonchanije na tochku}
if txt='' then txt:='toy21 78dog_v desk10gf.'; if pos('.',txt)=0 then writeln('VI ZABILI POSTAVIT TOCHKU!'); until pos('.',txt)<>0;
{ПРОЦЕДУРА ИЗ 10-ГО ПОСТА} i := 1; while i <= length(txt) do if txt[i] in ['0' .. '9', '_'] then delete(s, i, 1) else inc(i);
write('HOTITE LI VI POVTORIT? (Y/N)'); ans:=readkey; until UpCase(ans) = 'N'; end.
volvo
14.12.2005 17:39
А если так:
uses crt; var txt:string; i: integer; ans: char; begin repeat clrscr; repeat writeln ('NABERITE POSLEDOVATELNOST IS SLOV,'); writeln('NE PREVISHAUSCHIH 10 SIMVOLOV, I NE BOLEE 30 SLOV.'); readln(txt);
if txt = '' then txt := 'toy21 78dog_v desk10gf.' else if txt[length(txt)] <> '.' then writeln('VI ZABILI POSTAVIT TOCHKU!'); until txt[length(txt)] = '.';
i := 1; while i <= length(txt) do if txt[i] in ['0' .. '9', '_'] then delete(txt, i, 1) else inc(i);
writeln('result = ', txt);
write('HOTITE LI VI POVTORIT? (Y/N)'); ans:=readkey; until UpCase(ans) = 'N'; end.
?
garry_m
14.12.2005 17:45
volvo, не знаю даже как тебя благодарить! Пасиб! Все работает! Сейчас попробую решить самую первую задачу в этом топике!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.