reyesphile Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 (изменено) Не знаю, есть ли тут программисты. Но вдруг...Сама преподаю информатику, но Бейсиком уже давно не занимаюсь. Работаем на Паскале. А тут на олимпиаде один "товариСч" решил отличиться и написал программу на Бейсике. Проверяю - не работает. Не могу понять, где ошибка. Помогите...Задача:Составьте программу, которая к числительному от 1 до 100 подставит слово «ворона» в нужном падеже. При неверно введенном исходном числе ворон, программа должна выдавать сообщение «Неверно ввели число!»Формат входных данных Водится натуральное число от 1 до 100. Формат выходных данныхВ результате работы программы на экране выводится число и слово «ворона» в нужном падеже. Например:1 ворона11 ворон99 воронКод программы:DEFINT A-ZCLSINPUT "skolko: ", APRINT STR$(A);IF A \ 10 <> 1 THENB = A MOD 10IF B = 1 THEN PRINT " vorona"IF B > 1 AND B < 5 THEN PRINT "voroni"IF B > 4 AND B < 10 OR B = 0 THEN PRINT " voron"ELSEPRINT " voron"END IFПропущено сообщение о неправильно введенном числе. Как и куда его вставить - не могу вспомнить. Заклинило.IF B > 100 then print “Neverno vvedeno chislo!” Изменено 6 октября, 2014 пользователем reyesphile
Наташа и Стив Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 (изменено) IF B > 1 AND B < 5 THEN PRINT "voroni"IF B > 4 AND B < 10 OR B = 0 THEN PRINT " voron"Мне вот этот кусок не понравился. Там может циклиться. Это не про пропущенный кусок про неправильное число, но разве система сама не даст worning? Обязательно ли програмировать его?Но это я по наитию, я давно очень этим не занималась, с института. Изменено 6 октября, 2014 пользователем Наташа и Стив
reyesphile Опубликовано 6 октября, 2014 Автор Опубликовано 6 октября, 2014 (изменено) Код почти рабочий (хоть и примитивный). Проверила на Бейсике. Сообщение об ошибке (при числе больше 100) не выдается. Идет по кругу, требуя новое число. Изменено 6 октября, 2014 пользователем reyesphile
Ergo Proxy Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Вместо многих условных конструкций IF проще было Select CASE использовать.Ну и фильтр не правилен в паре мест.Если надо листинг подправленой то тока после 21 смогу. На работе тока VS 2013.Дома есть и QBX.
Наташа и Стив Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 (изменено) А, передумала :) Давно это было. Изменено 6 октября, 2014 пользователем Наташа и Стив
reyesphile Опубликовано 6 октября, 2014 Автор Опубликовано 6 октября, 2014 Ergo Proxy, буду очень благодарна. Мне на завтра нужно.
Даша Шулеко Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Валидация бессмысленна IF B > 100 then print “Neverno vvedeno chislo!” B вообще никак не будет >=10, т.к это остаток от деления на 10.
Наташа и Стив Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Валидация бессмысленна IF B > 100 then print “Neverno vvedeno chislo!” B вообще никак не будет >=10, т.к это остаток от деления на 10.То есть, надо:IF А > 100 then print “Neverno vvedeno chislo!” Да, Даш?
Даша Шулеко Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 (изменено) DEFINT A-ZCLSINPUT "skolko: ", AIF A <1 OR A > 100 THEN print "Neverno vvedeno chislo!" ELSE PRINT STR$(A); IF A>=11 AND A<=19 THEN PRINT " voron" ELSE B = A MOD 10 IF B = 1 THEN PRINT " vorona" ELSEIF B > 1 AND B < 5 THEN PRINT " voroni" ELSEIF B > 4 AND B < 10 OR B = 0 THEN PRINT " voron" END IF END IFEND IFКак-то так. С точностью до синтаксиса, т.к. мой из ASP VB, который хоть как-то помню еще. :)Но алгоритм должен вроде... Изменено 6 октября, 2014 пользователем Даша Шулеко
DaneSoul Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Не помешало бы еще проверку на то, что введенное число целое добавить, кстати.
Даша Шулеко Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Не помешало бы еще проверку на то, что введенное число целое добавить, кстати.По условиям задачи:Формат входных данныхВодится натуральное число от 1 до 100.Так что будем считать что там поле с маской(?) в которую ничего кроме цифр не ввести. Или клава из одних цифр. Для подсчета ворон, специальная. :gleam:
Ergo Proxy Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Не помешало бы еще проверку на то, что введенное число целое добавить, кстати.Тогда и проверку ввода, что введены именно цифры, а не буквы.)Иначе краш.)Так что будем считать что там поле с маской(?) в которую ничего кроме цифр не ввести. Или клава из одних цифр. Для подсчета ворон, специальная. :gleam:Судя по листингу это досовский Бэйсик и все операции в полно экранном окне .)Но конечно это уже придирки из ТРПП.)
Даша Шулеко Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 ТЗ есть ТЗ. :gleam: PS Я бы скорее на пустое значение проверила, для начала ;) Если уж.
Ergo Proxy Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 (изменено) ТЗ есть ТЗ. :gleam:О да к ТЗ тоже вопросов много.Как вообще решили - ворона или ворон?Под хвост смотрели?По чет-нечет?)) Изменено 6 октября, 2014 пользователем Ergo Proxy
Даша Шулеко Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Как вообще решили - ворона или ворон?Под хвост смотрели?Это разные виды! :doh: ворона и ворон
Ergo Proxy Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Это разные виды! :doh: ворона и воронЯ знаю что разные.Не к тому шутка была.Кстати листинг 21 проходит адекватно?
DaneSoul Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 (изменено) По условиям задачи:Так что будем считать что там поле с маской(?) в которую ничего кроме цифр не ввести. Или клава из одних цифр. Для подсчета ворон, специальная. :gleam:Ну если исходить из того, что ввод всегда строго соответствует условиям задачи, то и эти строки можно выкинуть:IF A <1 OR A > 100 THEN print "Neverno vvedeno chislo!" ;) Изменено 6 октября, 2014 пользователем DaneSoul
_Sakura_ Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Тогда и проверку ввода, что введены именно цифры, а не буквы.)Иначе краш.)Меня когда учили программированию - учили даже в самых простых задачах делать все-все проверки и "защиты от дурака")
Ergo Proxy Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Меня когда учили программированию - учили даже в самых простых задачах делать все-все проверки и "защиты от дурака")По ТРПП сим доставали жутко. Например "Сделать проверку ввода чтоб человек не мог ввести в поле ничего кроме цифр\букв".Ну типа кому придет в голову на вопрос числа покупаемых дисков написать хз?))Но.. надо.) В итоге прога разрасталась модулем фильтрации или просто блочилась вся клава кроме нужных кнопок и пусть юзер хоть удавится.))Это в визуальном все просто, назначил условия местам ввода и все. Система сама отфильтрует, а в ДОСовских вечно самим доделывать. В BC++ это вымораживало.)По теме лично я не люблю куча вложений IF оператора условий.Куда как проще выглядит кусок :SELECT CASE B CASE 1 PRINT " vorona" CASE 2 TO 4 PRINT " voroni" CASE 5 TO 9, IS = 0 PRINT " voron"END SELECT
_Sakura_ Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 (изменено) По ТРПП сим доставали жутко. Например "Сделать проверку ввода чтоб человек не мог ввести в поле ничего кроме цифр\букв".Ну типа кому придет в голову на вопрос числа покупаемых дисков написать хз?))Но.. надо.) В итоге прога разрасталась модулем фильтрации или просто блочилась вся клава кроме нужных кнопок и пусть юзер хоть удавится.))Это в визуальном все просто, назначил условия местам ввода и все. Система сама отфильтрует, а в ДОСовских вечно самим доделывать. В BC++ это вымораживало.)По теме лично я не люблю куча вложений IF оператора условий.Куда как проще выглядит кусок :SELECT CASE B CASE 1 PRINT " vorona" CASE 2 TO 4 PRINT " voroni" CASE 5 TO 9, IS = 0 PRINT " voron"END SELECTВ визуальных тоже проверок приходилось делать чуть больше, чем дофига)+1 за конструкцию с кейсами. Она стилистически более грамотна и легче отлаживается, помимо прочего, чем десяток if'ов. Изменено 6 октября, 2014 пользователем Sakura-13
Ergo Proxy Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 В визуальных тоже проверок приходилось делать чуть больше, чем дофига)В визуалках базовые поля хоть сами имеют начальные фильтры.Выставил настройки например ввод только чисел целых и уверен, что тупой юзер не введет там буквенную хрень или спец символы.Прога просто не пример в поле это.А в старых добрых ДОСовских, как и сейчас в Яве для Андройда я парюсь, приходится все фильтровать.Еще и тыканье пальцем в менюшки лишнее блочить.)Хуже было только когда я игру под DXSDK чисто писал, вот уж где все досовские фени пригодились. Создаешь окно ввода имени перса, а некоторые умудряются туда спец символы пихать и ругаются "А пачему незя?:)" - "Ибо нефиг!".)Лучшее решение "от идиотов" блок ввода и считывание непосредственно клавиш.Ни разу не смогли обойти.Но критиковали что "ограничиваешь свободу юзера". Угу, свободу на тупление.))
DaneSoul Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Лучшее решение "от идиотов" блок ввода и считывание непосредственно клавиш.Ни разу не смогли обойти.Но критиковали что "ограничиваешь свободу юзера".А с копи-пастой тогда как быть? За блокирование копи-пасты в поле я бы лапки разработчикам откручивал с особой жестокостью!
_Sakura_ Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 А с копи-пастой тогда как быть? За блокирование копи-пасты в поле я бы лапки разработчикам откручивал с особой жестокостью!Зависит от того, для каких задач поле. Хотя я бы в любом случае разбирала посимвольно и проверяла на предмет недопустимых символов (у меня в нескольких математических прогах проверка введенных значений была подобным образом реализована, если попадался недопустимый символ - выдавалось предупреждение и фокус снова возвращался в тоже поле ввода).
Даша Шулеко Опубликовано 6 октября, 2014 Опубликовано 6 октября, 2014 Ну если исходить из того, что ввод всегда строго соответствует условиям задачи, то и эти строки можно выкинуть: ;)Вообще-то да. Фиговая постановка задачи. :)я бы в любом случае разбирала посимвольно и проверяла на предмет недопустимых символовВ мало-мальски развитых языках есть операции приведения типов. Dim s As String = "1234"Dim n As IntegerTry n = Integer.Parse(s) Console.WriteLine(n) Catch ex As FormatExceptionEnd Try
_Sakura_ Опубликовано 7 октября, 2014 Опубликовано 7 октября, 2014 В мало-мальски развитых языках есть операции приведения типов.Ну так-то да)Я иногда ей и пользовалась, если надо было проверить, что в поле для числа не попали никакие буквенные символы (try IntToString (a) catch...) Тьфу, забыла уже синтаксис весь.Но если надо проверить на один конкретный символ - как делать?
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти