1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Из заданного словаря выбрать все слова, имеющие рифмы (рифма определяется по принципу, придуманному Незнайкой: два слова рифмуются, если последние слоги у них совпадают, например, “палка – селедка”). Вот так я сделал. ток мне ее зарубили. сказали чтоб она слоги проверяла, по правилам великого и могучего.
Код
Program Rifma; uses crt; Var y,i,j,k,u,n,s:Byte; ch:char; m: array [1..50] of string; Begin clrscr; writeln('Вывод на экран рифмующихся слов'); writeln('Для продолжения ввода слов нажмите Enter'); writeln('Для окончания ввода слов нажмите Esc'); j:=0; y:=0; repeat j:=j+1; write(j,'-ое слово '); readln(m[j]); ch:=readkey; until ch=#27; For i:=1 to j-1 do begin For u:=i+1 to j do begin k:=length(m[i]); n:=length(m[u]); s:=0; while m[i][k]=m[u][n] do begin k:=k-1; s:=s+1; n:=n-1; end; If s>=2 then begin writeln(m[i],' - ',m[u]); y:=y+1; end; end; end; If y=0 then writeln('Слова не рифмуются'); readln; END.
Так что надо как то модифицировать программку чтоб проверяла последнии одинаковые символы на согласность
я делал так.
Код
Program Rifma; uses crt; Var y,i,j,k,u,n,s:Byte; ch:char; m: array [1..50] of string; Begin clrscr; writeln('Вывод на экран рифмующихся слов'); writeln('Для продолжения ввода слов нажмите Enter'); writeln('Для окончания ввода слов нажмите Esc'); j:=0; y:=0; repeat j:=j+1; write(j,'-ое слово '); readln(m[j]); ch:=readkey; until ch=#27; For i:=1 to j-1 do begin For u:=i+1 to j do begin k:=length(m[i]); n:=length(m[u]); s:=0; while m[i][k]=m[u][n] do begin k:=k-1; s:=s+1; n:=n-1; end; if m[i][k] in [<тут множество согласных>] then If s>=2 then begin writeln(m[i],' - ',m[u]); y:=y+1; end; end; end; If y=0 then writeln('Слова не рифмуются'); readln; END.
но она работала только с одной парой слов например ответ-нет она отсеила, а совет-нет уже не захотела. я уже забодался может кто видит ошибку незашореным взглядом?
чтоб проверяла последнии одинаковые символы на согласность
Ты на самом деле проверяешь на согласность не последний одинаковый, а следующий за ним (слева). Ведь ты увеличиваешь k, если k-тые и n-ный символы равны. Вот исправленный вариант. Помимо прочего, я убрал использование лишних переменных k и n, которые вносили путаницу. Если тебя пугает длина строк проверок, то лучше сохрани строки в временных переменных (типа a:=m[i]; b:=m[u] ), чтоб не тянуть за собой индексы
uses crt; const ConsDOS:set of char=['Б','б','В','в','Г','г','Д','д', 'Ж','ж','З','з','К','к','Л','л','М','м','Н','н','П','п', 'Р','р','С','с','Т','т','Ф','ф','Х','х','Ц','ц','Ч','ч']; Var y,i,j,u,s:Byte; ch:char; m: array [1..50] of string; Begin clrscr; writeln('Вывод на экран рифмующихся слов'); writeln('Для продолжения ввода слов нажмите Enter'); writeln('Для окончания ввода слов нажмите Esc'); j:=0; y:=0; repeat j:=j+1; write(j,'-ое слово '); readln(m[j]); ch:=readkey; until ch=#27; For i:=1 to j-1 do For u:=i+1 to j do begin s:=0; while (s<Length(m[i]))and(s<Length(m[i]))and(m[i,Length(m[i])-s]=m[u,Length(m[u])-s]) do s:=s+1; if (s>=2)and(m[i,Length(m[i])-s+1] in ConsDOS) then begin writeln(m[i],' - ',m[u]); y:=y+1; end; end; If y=0 then writeln('Слова не рифмуются'); readln; END.
Но этот принцип все равно неверен. Например, ворона-корона - явная рифма, но одинаковые части кончаются слева на гласную, и твой метод уже не работает. Может, если совпадающий кусок больше трех или четырех букв, то не проверять на согласность?..
PS раздражает необходимость нажимать Enter два раза при вводе..
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой