Вопрос: Как сделать так, чтобы программа осмысленно отвечала на фразы собеседника?

Занятие № 9 «Функции pos и concat»

Ключевые слова:  pos, первое вхождение,  concat;

Вопросы для повторения
Каково будет значение параметра цикла (переменной u) после его окончания: u:=-25; while u<=0 do r:=u; u:=u+5; end;
Сколько раз исполнится данная серия команд:   t:=-10; while t<0 do begin y:=x*x; t:=t+1; end;  

 

Давайте вспомним, умеет ли наша программа осмысленно отвечать и реагировать на фразы собеседника? Правильно, пока нет. Отвечает она пока, что необдуманно, просто случайными фразами.

А теперь давайте попробуем сделать так, чтобы программа отвечала осмысленно, на заданную фразу.

Если мы ей привет, она нам привет, мы задаем вопрос, она отвечает на вопросительные предложения, спросим про погоду, она ответит.

Вопрос: Как сделать так, чтобы программа осмысленно отвечала на фразы собеседника?

 

Цель:

· Научить программу осмысленно реагировать на фразы собеседника;

 

Для того чтобы программа осмысленно отвечала на фразы собеседника, будем искать вхождение одной строки в другую. Например, если во введенной собеседником строке имеется подстрока «дела?», то задавался вопрос «Как дела?» и ответить можно «хорошо» или «нормально».

В языке Pascal существует функция pos, которая работает со строковыми величинами.

Функция рos отыскивает в строке первое вхождение подстроки и возвращает в качестве значения номер элемента, с которого начинается вхождение.

Функция – это вспомогательный алгоритм. Со вспомогательным алгоритмом мы уже знакомы – это процедуры. Что общего и различного у процедур и функций?

Общее - то, что это тоже вспомогательный алгоритм, который упрощает работу программиста. Отличие - в том, что вызов функции рассматривается как часть выражения (в отличие от процедуры, вызов которой выглядит как команда).

 

У каждой функции есть имя,  и есть результат.
Если результат функции - целое число (например, функция length, которая определяет количество символов в строке), то запись length(S) можно использовать в тех же ситуациях, что и любое другое выражение, результат которого - целое число.


Например, n:=length(S);

У функции может быть и несколько аргументов; все они пишутся в круглых скобках через запятую, в строго определенном порядке.

Функция pos – ищет в строке подстроку и возвращает номер символа, с которого начинается вхождение подстроки в строке. Если вхождение не найдено функция возвращает 0. Функция имеет два входных параметра - текстовую строку, в которой ищем и что ищем.

Синтаксис функции:

pos(s1:string;s2:string):integer;
где: s1 – искомая подстрока, символ или набор символов;
     s2 – строка в которой ищем s1.

Важно! Нумерация строки начинается  с единицы.

Пример.

begin

s:='Солнце';

s1:='лн';

p:=pos(s1,s);

write(p);

end.

 

 

Чему будет равно значение переменной p?

 

 

Правильно, значение переменной p будет равно 3, т.к. подстрока «лн» в строку «Солнце» входит, начиная с 3 места.

 

Посмотрите еще несколько примеров.

 

 

 

В последнем примере результат функции pos был равен 0, значит такой подстроки не было обнаружено.

А если результат функции - строка, то вызов функции можно писать везде, где может стоять строковое выражение.

 Не всегда нужно искать вхождение подстроки в подстроку. Существует еще одна полезная функция для склеивания строк.

Над строками выполняется операция сцепления, которая позволяет соединить две или более строк в одну без разделителей с помощью знака «+».

Пример:

st1:=′Прог′;

st2:=′ма′;

st3:=st1+′рам′+st2;

Результат: st3=′Программа′;

 

Согласитесь, что программа достаточно большая, а если надо склеить не 3 части слова, а гораздо больше, то код получится очень большим.

В языке Pascal для сцепления или склеивания строк существует функция concat. Сцепление – concat (строка1, строка2, …), Аналогичная операция сцепления.

Функция возвращает склеенную строку, входных параметров может быть несколько.

Синтаксис функции:

сoncat(s1:string;s2:string; …):string;
Пример:

 а=′рам′;

b=′ма′;

s:=concat (‘прог’,а,b).

s=′программа′;

Ниже представлен еще пример выполнения функции concat.

 

 

Давайте теперь попробуем написать программу, с использованием функции pos.

Основная программа останется прежней, программа так и будет работать до тех пор, пока собеседник не введет фразу «До свидания».

Появится процедура dialog(replica, otwet). В данной процедуре будет вводиться строка и анализироваться, если в данную строку входит подстрока «дела?», то ответ будет «хорошо». Если в строке встречается «Кто ты», ответ – «Программа».

Можно прописать таких фраз 5-7 и с помощью команды ветвления перебрать возможные варианты, если таких совпадений нет, то вызвать процедуру random_otwet (ее мы писали на прошлом занятии).

Например, можно переменными s1-s4 обозначить ответы программы, а p1-p2 возможные строки, которые необходимо искать во введенной реплике.

s1:='Хорошо';

s2:='Программа';

s3:='Мои возможности ограничены';

s4:='До скорых встреч!';

p1:='дела';

p2:='Кто ты';

p3:='можешь';

p4:='До свидания';

 

if pos(p1,replika) <>0

 then otwet:=s1

 else {продолжается ветвление в зависимости от того сколько прописано условий и фраз}

 

Ответы на вопросы
Каково будет значение параметра цикла (переменной u) после его окончания: u:=-25; while u<=0 do r:=u; u:=u+5; end; Ответ:u=5
Сколько раз исполнится данная серия команд:   t:=-10; while t<0 do begin y:=x*x; t:=t+1; end; Ответ: 9 раз

Спасибо за внимание!







Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: