Консультация № 174356
19.11.2009, 02:59
0.00 руб.
0 9 2
Доброй ночи всем! Уважаемые эксперты, вынужден прибегнуть в Вашей помощи. Такая задача:
Вводится строка. Слова разделены запятыми. Нужно вывести все звонкие согласные, встречающиеся хотя бы в 2 словах!
Очень буду благодарен, в долгу не останусь.

Обсуждение

Неизвестный
19.11.2009, 07:38
общий
Доброго времени суток.
Хм, я вас огорчу. Но Pascal не поддерживает русский шрифт. Может можно сделать консольное приложение в Delphi?
Неизвестный
19.11.2009, 09:48
общий
это ответ
Доброго времени суток.
Оговорюсь сразу, русский шрифт Pascal не поддерживает, так что я использую звонкие согласные Английского алфавита. Если у вас поддерживает кириллицу тогда просто надо изменить константу Word;
По коду:
1) Вводим строку.
2) Начинаем цикл который позволит нам разбить каждое слово в свою ячейку массива (Massiv_String)
3) Перед тем как вносить символ слова в массив мы проверяем входит он в константу Word (звонких согласных), ибо другие символы нам по сути и не нужны.
4) Если цикл дошел до запятой, то увеличиваем индекс массива, ибо новое слово в отдельную ячейку.
5) Начинаем два цикла. Главный цикл (For i...) считает слова из массива (Massiv_String) , а вложенный цикл (For l...) считает символы в i-ом слове.
6) Вызываем процедуру поиска с параметрами (символ,текущее слово) и в процедуре находим повторяется ли этот символ, если да (переменная e увеличивается с каждым схожим символом) то выводим этот символ.Притом символ который похож на тот который мы сравниваем удаляется из массива строк, так как он уже не нужен.

Если что-то не понятно,то обращайтесь. Код проверял, но не исключаю что возможны "проскоки" неправильных ответов (в Pascal'e давно не кодил). Так что лучше протестировать программу со всеми возможностями ввода.

Приложение:
uses crt;
const Word=['b','v','g','d','z','l','m','n','r'];
var Str:String;
Massiv_String:array [1..100] of string;
i,j,l:integer;
procedure Search(Ch:Char;k:Integer);
Var e,q,p:integer;
begin
e:=0;
For q:=k+1 to j do
For p:=1 to length(Massiv_String[q=]) do
if Massiv_String[q=][p]=ch then
begin
inc(e);
Massiv_String[q=][p] := ' ';
end;
if e>0 then
WriteLn(ch);
end;

begin
clrscr;
Writeln('Read String');
ReadLn(Str);
j:=1;
For i:=1 to Length(Str) do
begin
If Str[i]=',' then
inc(j);
If Str[i] in Word then
Massiv_String[j]:=Massiv_String[j]+Str[i];
end;
For i:=1 to j-1 do
For l:=1 to length(Massiv_String[i]) do
Search(Massiv_String[i][l],i);
Readln;
end.
давно
Старший Модератор
31795
6196
19.11.2009, 11:11
общий
Warnes:
Цитата: 284254
Но Pascal не поддерживает русский шрифт


Можно и я Вас огорчу:

Вы неправы.

Rocky1502:
Это задание, на портале наверное только линивый не решал. Воспользуйтесь поиском.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
19.11.2009, 11:27
общий
В стандартном комплектации русского кажись нет. Это наши умельцы уже постарались=)
давно
Старший Модератор
31795
6196
19.11.2009, 11:41
общий
Warnes:
Все зависит, только от кодировки ср886, в ней есть русский шрифт, а переключить раскладку - это совсем просто.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
19.11.2009, 11:57
общий
А какие могут быть вариации переключение раскладки помимо Ctrl+Shift и Ctrl+Alt?
давно
Старший Модератор
31795
6196
19.11.2009, 15:32
общий
Warnes:
Честно сказать непомню(помоему одновременно правый Ctrl+Shift на русский, левый обратно), я уже давно пишу программы в редакторах с несколькими кодировками, а в компиляторах только проверяю. Было помоему еще одновременно два Ctrl или Shift.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
19.11.2009, 15:43
общий
Цитата: Зенченко Константин Николаевич
я уже давно пишу программы в редакторах

Как я вас понимаю=) Я лично щас в NotePad++ тыкаюсь. Но WinApi писать в нем пока не рискую=) А то замучаюсь ошибки править.
давно
Академик
320937
2216
19.11.2009, 17:58
общий
это ответ
Здравствуйте, Rocky1502. Используем 4 множества: эталонное, встретившиеся в предыдущих словах, встретившиеся в текущем слове, встретившиеся дважды. Текст программы в приложении. TurboPascal 7.

Приложение:
program bukovki;
const
letters = ['Б','В','Г','Д','Ж','З','Й','Л','М','Н','Р'];
delim = ',';
var
this, previous, doubles : set of char;
ch: char;
i: integer;
s: string;
in_word: boolean;

function RusUpCase(ch: char):char;
begin
ch:= UpCase(ch);
{проверяем на строчную русскую букву:}
if ch in ['а'..'п'] then {а - русская буква}
ch := chr(ord(ch)-ord('а')+ord('А') ) {А - русская буква}
else if ch in ['р'..'я'] then {р - русская буква}
ch := chr(ord(ch)-ord('р')+ord('Р')) ; {Р - русская буква}
RusUpCase := ch;
end; { RusUpCase }

begin
this:= [];
previous := [];
doubles := [];

write('s=');
readln(s);

s:= s+delim; { добавляем ограничитель для упрощения обработки }
in_word := false;
for i:= 1 to length(s) do
begin
ch := RusUpCase(s[i]);
if ch <> delim then
begin
in_word := true;
this := this+([ch]*letters);
end
else
begin
if in_word then
begin
doubles := doubles + this*previous;
previous := previous + this;
this := [];
end;
in_word := false;
end;
end;

if doubles=[] then
writeln('нет таких')
else
begin
for ch:= chr(0) to chr(255) do
if ch in doubles then
write(ch:3);
writeln;
end;
readln;
end.
Форма ответа