Известно, что во вводимом тексте встречается заданная буква, причем не на последнем месте. Требуется вывести символ этого текста, который непосредственно следует за последним вхождением этой буквы. Ввод продолжать до нажатия ‘Ins’ на дополнительной клавиатуре.
помогите плиз
Покажи, что сделал, и напиши, что именно не получается.
я вообще смысл заания не понял дать хоть намек в какую сторону идти и что вообще делать надо
Var ch: Char;
k: integer;
Begin
Read(ch);
k:=0;
While ch<>#10 Do
Begin
Я, кстати, по твоему описанию тоже не понял. Не мог бы ты привести точный текст задания?
1. Символ, я так понимаю, вводится с клавиатуры. А откуда берется строка?
2. Вот представь, что строка написана на листе бумаге и тебе самому нужно выполнить задание вручную. Что бы ты стал делать?
1 набираешь символы в ряд и выходит строка)
2 сначала бы исключил все буквы которые встречаются перед пробелом , а потом по идеии должна остаться буква или несколько и написать букву которую стоит после нее наверно так, но я не уверен
это я был забыл зайти)
по идеии вывести букву м из слова раМу
Добавлено через 1 мин.
да текст вводится с клавиатуры, и че то я действительно сочинил про пробел
символ этого текста, который непосредственно следует за последним вхождением этой буквы, последняя а стоит перед м в слове раму
Добавлено через 1 мин.
мне что то стало более понятно а как сделать чтоб он считал а находил последню из них?
крочь я понял задание
выберается буква и надо вывести символ стояший за ней после ее последнего ввода
например выбрали буву z а строка выглядит вот так
adszcdewzpoytz823
то я должен вывести 8.
я вот что написал:
Program pr8;
Uses
Crt;
Var
k,c,c1 : char;
l : boolean;
Begin
writeln(' vvedite zadanyiy bykvy');
readln(k);
Writeln('Symbola');
Writeln('===========');
While true do
begin
C:=readkey;
write©;
if c<>#0 then
begin
if (k=c) then
begin
textcolor(lightblue);
c1:=c;
L:=True
end
else
begin
textcolor(white);
L:=False
end;
end
else
begin
c:=readkey;
if c=#82then
begin
textcolor(yellow);
writeln(с1);
break;
textcolor(yellow);
writeln(с1);
end
end;
end;
Readln;
End.
Давай еще раз перечитаем условие и сравним с тем, что содержится в приведенной программе.
Вопрос первый: в условии просили раскрашивать символы разным цветом? А зачем ты это делаешь?
Вопрос второй: тебе никто не говорил, что конструкция "while true do", обязательно требующая в теле цикла "break" или "goto" является дурным стилем, и ее нужно избегать?
И, кстати, сюда же: ты в курсе, что операторы, стоящие после "break" НИКОГДА не будут выполнены? Так зачем же их писать?
Вопрос третий: ты пытаешься произвести разбор вводимого текста одновременно с его вводом. Скажи, млжно ли, еще до того, как текст введен целиком, точно определить ПОСЛЕДНЕЕ вхождение какого-либо символа? Или ты всерьез намерен написать программу, обладающую телепатическими способностями?
Давай вернемся к началу.
Ты совершенно верно указал, какую букву надо выводить в "Мама мыла раму". Попытайся теперь восстановить и описать словами алгоритм, по которому ты лично действовал, когда решал эту задачу (т.е. искал нужную букву).
1 раскрасить препод седня на паре попросил для наглядности
2 говориkb , но препод сам сказал писать через break а про то что надо до него писать то это я когда копировал часиями строки местами перепутал
а как еще можно эту чушь сделать не используя строку это условие лабы, у меня есть со стпрокой решение я его давно написал но он не принимает требует такой вариант( через char)
3 алгоритм такой был нашел последнюю встречающуюся а и посмотрел на следующий символ и записал его вот такой алгоритм
опять забыл под логином войти
и про програмку ничего телепатического в ней не вижу буква же известна до ввода текста просто надо в ячейку памяти записать символ который встречается после последней встречающейся на данный момент и если этот символ вводится заново, то переписать туда новый другой символ который стоит за ним и после нажатия инсерта вывести то что хранится в той ячейки как-то так
так обидно из-за этой чужи вылететь из универа((((((((, но оно так и выходит(
Странный какой-то у вас препод. Первый раз слышу, чтобы просили с break.
Так еще раз: как без телепатии, не имея ПОЛЬНОСТЬЮ текста, можно определить последнее вхождение какого-либо символа?
Например, ты ужеполучил "Мама мыла р". Как ты узнаешь, пора уже выводить следующий за "а" символ или нужно ждать очередную "а"?
он вообще странноватый если честно, Мама мыла р и если нажали инсерт то надо вывести пробел
тут смысл фразы "заданный символ не на последнем месте" что за буквой есть хотя-бы 1 символ чтоб его считать
Правильно ли я понял, что Ins является признаком конца текста, вводимого с клавиатуры? (вместо обычного в таких случаях Enter)
Если "да", то задание можно сделать двумя способами:
1. Сначала ввести текст (в массив или строку), затем просмотреть его С КОНЦА и вывести символ, следующий за ПЕРВЫМ ВСТРЕЧЕННЫМ ключевым символом.
2. Построить конечный автомат, который будет анализировать входящие символы, запоминать состояния и нужные символы, следить за окончанием ввода, а по окончании - выводить нужную информацию.
Первый вариант проще, но требует памяти для хранения текста, второй - сложнее, но не имеет ограничений по объему вводимого текста.
Который выберем?
1 вариант есть вот он
uses crt;
var
a:string;
s,k:char;
i,nomer:integer;
begin
writeln('vvedite bukvu');
readln(k);
writeln('vvedite stroku do ins');
repeat
s:=readkey;
write(s);
a:=a+s;
until s=#82;
writeln;
for i:=1 to length(a) do
if a[i]=k then nomer:=i;
writeln('sleduyushaya bukva=',a[nomer+1]);
readln;
end.
1 вариант есть вот он
uses crt;
var
a:string;
s,k:char;
i,nomer:integer;
begin
writeln('vvedite bukvu');
readln(k);
writeln('vvedite stroku do ins');
repeat
s:=readkey;
write(s);
a:=a+s;
until s=#82;
writeln;
for i:=1 to length(a) do
if a[i]=k then nomer:=i;
writeln('sleduyushaya bukva=',a[nomer+1]);
readln;
end.
Вообще-то программа содержит ошибку. В частности, она будет заканчивать ввод не только по клавише "Ins", но и по символу "R", т.к. его код как раз 82. Думаю, как с этим бороться, тебе известно, т.к. обработка такой ситуации предусмотрена в исходнике, который ты приводил ранее.
Еще одно замечаниме: я бы стал перебирать полученную строку с конца, а не с начала. Но, думаю, это непринципиально.
Итак, остается второй вариант.
Надеюсь, что такое конечный автомат, тебе известно. Если нет, можно почитать в Википедии: http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82
Значит, нам надо отслеживать две ситуации:
- предыдущим был ключевой символ и нужно запомнить текущий,
- двухсимвольную комбинацию 0,82 - чтобы закончить ввод.
Какие бубут предложения по набору состояний автомата?
Здорово - через 15 минут ответ: "ничего не понял".
Подумай еще, почитай что-нибудь, например, http://forum.shelek.ru/index.php/topic,4745.0.html , воспользуйся поиском...
как я понимаю у меня будет три входных символа любой, инсерт, и заданный?
Вообще-то "инс" - это два символа подряд. А конечный автомат обрабатывает символы по одному, поэтому "инс" он должен обработать за два прохода.
Еще не следует путать входной алфавит конечного автомата с набором его состояний. Состояние определяется входным символом и предшествующим состоянием.
В принципе, в данном случае набор состояний также в значительной степени связан с предыдущим символом. Но в этот набор необходимо включить также начальное и конечное состояния.
Итак, состояния:
А - начальное,
Б - конечное,
В - после ключевого символа,
Г - после 0 символа - для распознавания "инс",
Д - после других символов.
И автомат должен предусматривать реакцию на следующие символы: 0, 82, ключевой, все остальные.
Постарайся сформулировать правила перехода из одного состояния в другие, исхордя из входного символа.
админы закрывайте тему я забил на эту задачу, пошел он нгахер тварь эта пусть ставит не зачет и пусть не допускают к сессии и пусть выгоняют ят....
А такой вариант не пойдёт? В одном цикле всё, с break... Условие выхода из цикла сделано лишь формально, до него исполнение не дойдёт.
uses crt;
var c,f:char;
s:string;
i,z:byte;
begin
writeln('Vvedite iskomiy simvol');
f:=readkey;
writeln('Teper popsimvolno vvodite stroku');
i:=1;
repeat
c:=readkey;
s[i]:=c;
inc(i);
if (c=f) then z:=i;
if (c=#0) then break;
until (c=#0);
writeln(s[z]);
readln;
end.
if (c=#0) then (c=#82) then break;
if (c=#0) then (c=#82) then break;
Ну, тогда чтоб переплюнуть все носители на Земле, наверное надо так:
uses crt;
var c,f:char;
d:string[2];
begin
writeln('Vvedite iskomiy simvol');
f:=readkey;
writeln('Teper popsimvolno vvodite stroku');
repeat
c:=readkey;
if (c=f) then
begin
d:='';
d:=d+c;
c:=readkey;
if (c=#0) then break;
d:=d+c;
end;
until (c=#0);
writeln(d[2]);
readln;
end.
Так проще.
uses crt;Но это по-прежнему не решает проблему неверного условия окончания цикла (верный вариант я здесь публиковать не буду).
var c1,с2,f:char;
begin
writeln('Vvedite iskomiy simvol');
f:=readkey;
writeln('Teper popsimvolno vvodite stroku'); // а как ее еще можно вводить?
repeat
c1:=readkey;
if (c1=f) then
c2:=readkey;
until (c1=#0);
writeln(с2);
readln;
end.
Насколько я понял, ты имел в виду цикл. Т.е. обработать за две итерации.
Естественно.
Правда, это было написано для реализации конечным автоматом. Т.к. предложенная тобой реализация таковой, строго говоря, не является, то логичнее делать проверку в один проход.
Да и вообще, конечный автомат в основном позволяет на этапе проектирования предусмотреть ВСЕ варианты поведения при различных входных данных, в том числе и недопустимых, и, таким образом, еще и диагностировать ошибки.
На практике же построенный (на бумаге) конечный автомат затем упрощают и оптимизируют. В частности, отходят от требования обрабатывать один символ за один проход цикла.
В той раскладке, кстати, которую я ранее приводил, целесообразно объединить начальное состояние с состоянием после "других" клавиш и таким образом таблица состояний будет иметь вид:
0 - после "других" клавиш, начальное,
1 - после ключевой клавиши,
2 - после 0 (т.е. ловим код управляющей клавиши),
3 - конечное.
По горизонтали - входные символы, по вертикали - состояния.
volvo ты мне скажи зачем геофизику програмирование???
и я над этой задачкой дня три сидел, а не сразу сдался
Если в курсе есть программирование, значит, это кому-нибудь нужно...
Ну решение в теме есть, тебе только надо сделать выход именно по Insert.
3. Я наблюдал за твоими сообщениями тоже дня 3. И заметил, что тебе было лень даже написать что-то длиннее одной строки. На мои вопросы ответить не пытался, разобраться с приведенными ссылками не удосужился...
это я не отвечал на твои воппросы?
это я написал не больше одной строки? а то что я выложил два варианта своей работы в которой явно больше 1 строки
и я посмотрел те сылки что ты мне дал, там все слишком запутано, если бы сейчас не был декабрь я бы обязательно разобрался, а сейчас у меня просо не хватает времени!!!! така по все предметам зачетные контрольные и к ним надо готовится
Unconnected, спасибо но ваш вариант не подходит так как вы используете строчный тип string
andriano, просто вы видели какие задание дал препод другим там чтоб написать минут 3 понадобится , а мне ерунду эту(
задание вот к примеру
1. Вводить символы с клавиатуры. Присвоить логической переменной L значение ‘true’, если выполняются указанные условия, и значение ‘false’ иначе:
• значением L является символ '*';
• значением L является символ 'а';
• значением L является цифра..
вот решение:
program LAB8moe;
uses crt;
var c: char;
L:boolean;
begin
clrscr;
textcolor(3);
writeln('simvol | L');
writeln('==============');
repeat
c:=readkey;
if (c='*') or (c='a') or ( (ord©>=48) and (ord©<=57) ) then
begin
L:=true;
writeln (c,' | ',L)
end
else begin
L:=false;
writeln (c,' | ',L)
end;
until c=#79;
writeln('==============');
readkey
end.
М | Тэги! |
Мне кажется, из программы нужно убрать все лишнее.
program LAB8moe;Ты что-то путаешь. В частности, строковый и символьный типы данных.
uses crt;
var
c : char;
L : boolean;
begin
writeln('simvol | L');
writeln('==============');
repeat
c:=readkey;
L := (c='*') or (c='a') or (c in ['0'..'9']);
writeln (c,' | ',L)
until c=#79;
writeln('==============');
readkey
end.
ничего я не путаю на название не обращай внимание я просто свою неправильную переделал под другой вариант а моя это та с выводом последующего символа... там в задании даже есть слово строка значит оно должно решаться черз строковый тип string, а не через символьный char как он это требует
Unconnected у вас не написано на аве что вы экстрасенс, но я считаю что судя из заголовка темы символьный тип даных понятно что задачу через символьный тип решать надо
Там и слово данных с одной Н, а я всё равно буду с двумя писать;)
Вариант andriano первой задачи, если ты не заметил, использует символы.
не спорю но надо же , чтоб он выводил эту строчку, а тогда по его алгоритму он пропускает этот символ и не пишет его в строке
Сложно сделать вывод символа?
repeat
c1:=readkey;
write(c1){ выводит се символы в строчку}
if (c1=f) then
c2:=readkey;{ считывает символ идущий за заданным, но не вносит в стоку}
until (c1=#0);
writeln(с2);
Или я туплю, или одно из двух.
ну вот пример что делает этот цикл вот я выбрал букву z аданой тогда потом набираю следующие
asdfzxcvbn инсерт
он вот что выведет строку asdfzcvbn
а затем запишет что за заданм символом стоит x
а на самом деле выходит с
Сделал вывод символов для кода andriano, всё работает. Больше ничего не добавлял.
uses crt;
var c1,c2,f:char;
begin
writeln('Vvedite iskomiy simvol');
f:=readkey;writeln(f);
writeln('Teper popsimvolno vvodite stroku');
repeat
c1:=readkey;
write(c1);
if (c1=f) then
begin
c2:=readkey;
write(c2);
end;
until (c1=#0);
writeln;
writeln(c2);
readln;
end.
точно, спасибо вам большое, теперь век жизни буду вам благодарен
именно так, им по +1
и тут небольшое добавление есть вот если считываемый символ равен задому, то повторять считывание с2)
program laba8;
uses crt;
var c1,c2,f:char;
begin
textcolor(yellow);
textbackground(red);
clrscr;
writeln('Vvedite iskomiy simvol');
f:=readkey;writeln(f);
writeln('Teper popsimvolno vvodite stroku');
repeat
c1:=readkey;
write(c1);
if (c1=f) then
begin
repeat
c2:=readkey;
write(c2);
until c2<>f;
end;
until (c1=#0);
writeln;
writeln(c2);
readln;
end.
Я так понял, ты хотел сказать, что при некоторых входных данных программа работает неправильно? При каких?
repeat
c2:=readkey;
write(c2);
until c2<>f;
Ага, вот теперь понятно)