Как написать программу вопрос ответ

И ещё вопрос, а имеет разница, если пользователь будет заглавными буквами писать ответ, или строчными?

Отслеживать
задан 23 мар 2021 в 17:12
147 13 13 бронзовых знаков

Заглавные или строчные да разница есть но можно привести к одному виду. А в чем вопрос то? намного больше, как тут так готово же все.

23 мар 2021 в 17:19

Прикол в том, что оно не работает, и пишется: «Нажмите ENTER, чтобы закрыть программу» Просто игнорируется, в итоге я так и не понял, в чём проблема.

23 мар 2021 в 17:20

Вы сравниваете строку со списком. Условие if всегда ложное => вас перекидывает на else => цикл ломается на первой итерации. Измените == на in .

23 мар 2021 в 17:21
Спасибо.
23 мар 2021 в 17:23

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Не совсем понял вопрос, если я праввильно его обработал — ответ:

Создайте еще list_no с «нет ответами» и вот так

if returns_2 in list_yes: pass elif returns_2 in list_no: pass else: continue

== Сравнивает ответ со списком (Не верно)

ОТВЕТЫ НА ВАШИ ВОПРОСЫ

in Переводится как «В» (Есть ли ответ в списке) (Верно)

pass Не делать ничего (поставил для примера)

continue Делает итерацию цикла и задаёт вопрос сначала

Что бы принимать и строчные и заглавные: Сделайте в списке все слова маленькими буквами и исправьте:

input(‘Ещё раз? [да/нет]: ‘)
str(input(‘Ещё раз? [да/нет]: ‘)).lower()

Ответ пользователя будет записан маленькими буквами и будет сравниматься тоже с маленькими буквами

Источник: ru.stackoverflow.com

Тест с вопросами и ответами в HTML коде на JavaScript

В этом и в нескольких следующих уроках мы с вами займемся созданием тестов с вопросами и ответами. Начнем с самых простых вариантов и будем постепенно усложнять.

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

Проиллюстрирую написанное HTML кодом:

Как вы видите, у нас есть вопросы и инпуты для ответов. Осталось придумать, где мы будем хранить правильные ответы.

Самое простое, что можно придумать — это хранить ответы прямо в HTML коде инпутов, в каком-нибудь data- атрибуте:

Следующий нюанс, который следует продумать: в какой момент мы будем выполнять проверку ответов на правильность? Здесь можно предложить два варианта: либо пусть каждый инпут сразу же по вводу в него ответа проверяет правильный ли этот ответ, либо пусть будет кнопка, по нажатию на которую будут проверены ответы на все вопросы сразу.

Ч.14/15 Python для начинающих: создать вопросник/тест (Building a quiz)

Какой бы из вариантов мы не выбрали, давайте, если ответ правильный, то границу инпута будем красить в зеленый цвет, а если неправильный — в красный. Сделаем для этого соответствующие CSS классы:

.right < border: 1px solid green; >.wrong < border: 1px solid red; >

Сделайте так, чтобы ввод ответа в инпут завершался нажатием клавиши Enter . Пусть в этом случае инпут сразу проверяет ответ на правильность.

Модифицируйте ваш код так, чтобы проверка ответов выполнялась по нажатию на кнопку.

Источник: www.code.mu

Bash-скрипты, часть 11: expect и автоматизация интерактивных утилит

В прошлый раз мы говорили о методике разработки bash-скриптов. Если же суммировать всё, что мы разобрали в предыдущих десяти материалах, то вы, если начинали читать их, ничего не зная о bash, теперь можете сделать уже довольно много всего полезного.

Сегодняшняя тема, заключительная в этой серии материалов, посвящена автоматизации работы с интерактивными утилитами, например, со скриптами, которые, в процессе выполнения, взаимодействуют с пользователем. В этом деле нам поможет expect — инструмент, основанный на языке Tcl.

Читайте также:
Что такое программа мать и дитя

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

Основы expect

Если expect в вашей системе не установлен, исправить это, например, в Ubuntu, можно так:

$ apt-get install expect

В чём-то вроде CentOs установка выполняется такой командой:

$ yum install expect

Expect предоставляет набор команд, позволяющих взаимодействовать с утилитами командной строки. Вот его основные команды:

    spawn — запуск процесса или программы. Например, это может быть командная оболочка, FTP, Telnet, ssh, scp и так далее.

Автоматизация bash-скрипта

Напишем скрипт, который взаимодействует с пользователем и автоматизируем его с помощью expect. Вот код bash-скрипта questions :

#!/bin/bash echo «Hello, who are you?» read $REPLY echo «Can I ask you some questions?» read $REPLY echo «What is your favorite topic?» read $REPLY

Теперь напишем expect-скрипт, который запустит скрипт questions и будет отвечать на его вопросы:

#!/usr/bin/expect -f set timeout -1 spawn ./questions expect «Hello, who are you?r» send — «Im Adamr» expect «Can I ask you some questions?r» send — «Surer» expect «What is your favorite topic?r» send — «Technologyr» expect eof

Сохраним скрипт, дав ему имя answerbot .

В начале скрипта находится строка идентификации, которая, в данном случае, содержит путь к expect, так как интерпретировать скрипт будет именно expect.
Во второй строке мы отключаем тайм-аут, устанавливая переменную expect timeout в значение -1. Остальной код — это и есть автоматизация работы с bash-скриптом.

Сначала, с помощью команды spawn , мы запускаем bash-скрипт. Естественно, тут может быть вызвана любая другая утилита командной строки. Далее задана последовательность вопросов, поступающих от bash-скрипта, и ответов, которые даёт на них expect. Получив вопрос от подпроцесса, expect выдаёт ему заданный ответ и ожидает следующего вопроса.

В последней команде expect ожидает признака конца файла, скрипт, дойдя до этой команды, завершается.

Теперь пришло время всё это опробовать. Сделаем answerbot исполняемым файлом:

$ chmod +x ./answerbot
$./answerbot

Expect-скрипт отвечает на вопросы bash-скрипта

Как видно, expect-скрипт верно ответил на вопросы bash-скрипта. Если на данном этапе вы столкнулись с ошибкой, вызванной тем, что неправильно указано расположение expect, выяснить его адрес можно так:

$ which expect

Обратите внимание на то, что после запуска скрипта answerbot всё происходит в полностью автоматическом режиме. То же самое можно проделать для любой утилиты командной строки. Тут надо отметить, что наш bash-скрипт устроен очень просто, мы точно знаем, какие именно данные он выводит, поэтому написать expect-скрипт для взаимодействия с ним несложно.

Задача усложняется при работе с программами, которые написаны другими разработчиками. Однако, здесь на помощь приходит средство для автоматизированного создания expect-скриптов.

Autoexpect — автоматизированное создание expect-скриптов

Autoexpect позволяет запускать программы, которые надо автоматизировать, после чего записывает то, что они выводят, и то, что пользователь вводит, отвечая на их вопросы. Вызовем autoexpect, передав этой утилите имя нашего скрипта:

$ autoexpect ./questions

В этом режиме взаимодействие с bash-скриптом ничем не отличается от обычного: мы сами вводим ответы на его вопросы.

Запуск bash-скрипта с помощью autoexpect

После завершения работы с bash-скриптом, autoexpect сообщит о том, что собранные данные записаны в файл script.exp . Взглянем на этот файл.

Файл script.exp

В целом, за исключением некоторых деталей, перед нами такой же скрипт, который мы писали самостоятельно. Если запустить этот скрипт, результат будет тем же.

Запуск expect-скрипта, созданного автоматически

При записи сеансов взаимодействия с некоторыми программами, вроде FTP-клиентов, вы можете столкнуться с тем, что они используют в выводимых данных сведения о времени проведения операции, или выводят данные, отражающие процесс выполнения неких продолжительных действий. В целом, речь идёт о том, что вывод программы при каждом её запуске, правильно воспринимаемый человеком и вызывающий ввод одних и тех же ответов, будет, в тех же условиях, выглядеть по-новому для expect.

Читайте также:
Восстановите последовательность этапов математического моделирования модель алгоритм программа

Если в expect-скрипте строки, ожидаемые от такой программы, будут жёстко зафиксированы, такой скрипт не сможет нормально работать. Справиться с этим можно, либо удалив из expect-скрипта данные, которые выглядят по-новому при каждом запуске программы, либо использовав шаблоны, пользуясь которыми, expect сможет правильно понять то, что хочет от него программа.

Как видите, autoexpect — это весьма полезный инструмент, но и он не лишён недостатков, исправить которые можно только вручную. Поэтому продолжим осваивать язык expect-скриптов.

Работа с переменными и параметрами командной строки

Для объявления переменных в expect-скриптах используется команда set . Например, для того, чтобы присвоить значение 5 переменной VAR1 , используется следующая конструкция:

set VAR1 5

Для доступа к значению переменной перед её именем надо добавить знак доллара — $ . В нашем случае это будет выглядеть как $VAR1 .

Для того, чтобы получить доступ к аргументам командной строки, с которыми вызван expect-скрипт, можно поступить так:

set VAR [lindex $argv 0]

Тут мы объявляем переменную VAR и записываем в неё указатель на первый аргумент командной строки, $argv 0 .

Для целей обновлённого expect-скрипта мы собираемся записать значение первого аргумента, представляющее собой имя пользователя, которое будет использовано в программе, в переменную my_name . Второй аргумент, символизирующий то, что пользователю нравится, попадёт в переменную my_favorite . В результате объявление переменных будет выглядеть так:

set my_name [lindex $argv 0] set my_favorite [lindex $argv 1]

Отредактируем скрипт answerbot , приведя его к такому виду:

#!/usr/bin/expect -f set my_name [lindex $argv 0] set my_favorite [lindex $argv 1] set timeout -1 spawn ./questions expect «Hello, who are you?r» send — «Im $my_namer» expect «Can I ask you some questions?r» send — «Surer» expect «What is your favorite topic?r» send — «$my_favoriter» expect eof

Запустим его, передав в качестве первого параметра SomeName , в качестве второго — Programming :

$ ./answerbot SomeName Programming

Expect-скрипт, использующий переменные и параметры командной строки

Как видите, всё работает так, как ожидалось. Теперь expect-скрипт отвечает на вопросы bash-скрипта, пользуясь переданными ему параметрами командной строки.

Ответы на разные вопросы, которые могут появиться в одном и том же месте

Если автоматизируемая программа может, в одной ситуации, выдать одну строку, а в другой, в том же самом месте — другую, в expect можно использовать блоки, заключённые в фигурные скобки и содержащие варианты реакции скрипта на разные данные, полученные от программы. Выглядит это так:

expect < «something» < send — «send thisr» >»*another» < send — «send anotherr» >>

Здесь, если expect-скрипт увидит строку «something», он отправит ответ «send this». Если же это будет некая строка, оканчивающаяся на «another», он отправит ответ «send another».

Напишем новый скрипт, записав его в файл questions , случайным образом задающий в одном и том же месте разные вопросы:

#!/bin/bash let number=$RANDOM if [ $number -gt 25000 ] then echo «What is your favorite topic?» else echo «What is your favorite movie?» fi read $REPLY

Тут мы генерируем случайное число при каждом запуске скрипта, и, проанализировав его, выводим один из двух вопросов.

Для автоматизации такого скрипта нам и пригодится вышеописанная конструкция:

#!/usr/bin/expect -f set timeout -1 spawn ./questions expect < «*topic?» < send — «Programmingr» >»*movie?» < send — «Star warsr» >>

Ответы на разные вопросы, появляющиеся в одном и том же месте

Как видно, когда автоматизированный скрипт выводит строку, оканчивающуюся на «topic?», expect-скрипт передаёт ему строку «Programming». Получив в том же месте, при другом запуске программы, вопрос, оканчивающийся на «movie?», expect-скрипт отвечает: «Star wars». Это очень полезная техника.

Условный оператор

Expect поддерживает условный оператор if-else и другие управляющие конструкции. Вот пример использования условного оператора:

#!/usr/bin/expect -f set TOTAL 1 if < $TOTAL < 5 > < puts «nTOTAL is less than 5n» >elseif < $TOTAL >5 > < puts «nTOTAL greater than 5n» >else < puts «nTOTAL is equal to 5n» >expect eof

Читайте также:
Программа для проектирования кейсов

Условный оператор в expect

Тут мы присваиваем переменной TOTAL некое число, после чего проверяем его и выводим текст, зависящий от результата проверки.

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

Цикл while

Циклы while в expect очень похожи на те, что используются в обычных bash-скриптах, но, опять же, тут применяются фигурные скобки:

#!/usr/bin/expect -f set COUNT 0 while < $COUNT < puts «nCOUNT is currently at $COUNT» set COUNT [ expr $COUNT + 1 ] >puts «»

Цикл while в expect

Цикл for

Цикл for в expect устроен по-особому. В начале цикла, в самостоятельных парах фигурных скобок, надо указать переменную-счётчик, условие прекращения цикла и правило модификации счётчика. Затем, опять же в фигурных скобках, идёт тело цикла:

#!/usr/bin/expect -f for < puts «nCOUNT is at $COUNT» >puts «»

Цикл for в expect

Объявление и использование функций

Expect позволяет программисту объявлять функции, используя ключевое слово proc :

proc myfunc

Вот как выглядит expect-скрипт, в котором используется объявленная в нём же функция:

#!/usr/bin/expect -f proc myfunc < MY_COUNT > < set MY_COUNT [expr $MY_COUNT + 1] return «$MY_COUNT» >set COUNT 0 while < puts «nCOUNT is currently at $COUNT» set COUNT [myfunc $COUNT] >puts «»

Функции в expect

Команда interact

Случается так, что автоматизируемые с помощью expect программы требуют ввода конфиденциальных данных, вроде паролей, которые вам не хотелось бы хранить в виде обычного текста в коде скрипта. В подобной ситуации можно воспользоваться командой interact , которая позволит вам, автоматизировав некую часть взаимодействия с программой, самостоятельно ввести, скажем, пароль, а потом опять передать управление expect.

Когда выполняется эта команда, expect-скрипт переключается на чтение ответа на вопрос программы с клавиатуры, вместо того, чтобы передавать ей ранее записанные в нём данные.

Вот bash-скрипт, в общем-то, точно такой же, как мы рассматривали ранее, но теперь ожидающий ввод пароля в ответ на один из своих вопросов:

#!/bin/bash echo «Hello, who are you?» read $REPLY echo «What is you password?» read $REPLY echo «What is your favorite topic?» read $REPLY

Напишем expect-скрипт, который, когда ему предлагают предоставить пароль, передаёт управление нам:

#!/usr/bin/expect -f set timeout -1 spawn ./questions expect «Hello, who are you?r» send — «Hi Im Adamr» expect «*password?r» interact ++ return send «r» expect «*topic?r» send — «Technologyr» expect eof

Команда interact в expect-скрипте

Встретив команду interact , expect-скрипт остановится, предоставив нам возможность ввести пароль. После ввода пароля надо ввести «++» и expect-скрипт продолжит работу, снова получив управление.

Итоги

Возможностями expect можно пользоваться в программах, написанных на разных языках программирования благодаря соответствующим библиотекам. Среди этих языков — C#, Java, Perl, Python, Ruby, и другие. То, что expect доступен для разных сред разработки — далеко не случайность. Всё дело в том, что это действительно важный и полезный инструмент, который используют для решения множества задач. Здесь и проверка качества ПО, и выполнение различных работ по сетевому администрированию, автоматизация передачи файлов, автоматическая установка обновлений и многое другое.

Освоив этот материал, вы ознакомились с основными концепциями expect и научились пользоваться инструментом autoexpect для автоматического формирования скриптов. Теперь вы вполне можете продолжить изучение expect, воспользовавшись дополнительными источниками. Вот — сборник учебных и справочных материалов. Вот — достойная внимания серия из трёх статей (1, 2, 3). А вот — официальная страница expect, на которой можно найти ссылки на исходный код программы и список публикаций.

На этом мы завершаем серию материалов о bash-скриптах. Надеемся, её одиннадцать частей, а также бессчётное число комментариев к ним, помогли в достижении цели тем, кто хотел научиться писать сценарии командной строки.

Уважаемые читатели! Благодарим всех, кто был с нами. Желаем удачной автоматизации работы в Linux! И, если у вас есть опыт работы с expect — ждём ваших рассказов.

  • Блог компании RUVDS.com
  • Настройка Linux
  • Системное администрирование

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru