IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Отслеживание вводимых данных, Отслеживание соответсвию типа
Account
сообщение 12.11.2008 9:13
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Есть переменная типа byte. Ее вводит пользователь вручную. Вопрос следующий, есть ли возможность отследить введеное значение пользователем (проверить на cоответствие типу), не прибегая к дополнительным переменным и подпрограммам). (вопрос относиться к Pascal и C)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 12.11.2008 9:31
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Account @ 12.11.2008 9:13) *
есть ли возможность отследить введеное значение пользователем (проверить на cоответствие типу)
Возможность, безусловно, есть. Но вот это:
Цитата(Account @ 12.11.2008 9:13) *
не прибегая к дополнительным переменным и подпрограммам
- повергает меня в некоторое недоумение.. А что оно значит? blink.gif Что считать "дополнительным"?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Account
сообщение 12.11.2008 9:40
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


НУ тогда опустите данное высказывание
Цитата
не прибегая к дополнительным переменным и подпрограммам

И какие варианты можете предложить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.11.2008 11:41
Сообщение #4


Гость






"Защиту от дурака" делаешь? Обычно вводят строку, ее конвертируют в число, и проверяют все возможные ошибки, которые при этом могли произойти:
function get_byte(var b: byte): boolean;
var
s: string;
n, err: integer;
ok: boolean;
begin
b := 0;
{$I-} readln(s); {$I+}
{
Проверяем, была ли при вводе строки ошибка.
Если была, то Ok будет False
}
ok := (ioresult = 0);

{
Преобразуем введенную строку S в число N,
если была ошибка, то номер ошибочного символа вернется в переменную err,
если ошибки при преобразовании не было, то err = 0
}
val(s, n, err);

{
А вот тут - связываем воедино все возможные проверки:
}
ok :=
ok and { Если не было ошибки при вводе строки ... }
(err = 0) and { ... и не было ошибки при преобразовании в число ... }
(length(s) < 4) and { ... и длина введенной строки не больше 3 ... }
((n >= 0) and (n <= 255)); { ... и полученное число в интервале 0 .. 255 }

if ok then b := n; { Если ошибки не было, возвращаем число }
get_byte := ok; { Результат функции }
end;

var
b: byte;
begin
if get_byte(b) then writeln('b = ', b)
else writeln('error');
end.
Попробуй обойти smile.gif

Сообщение отредактировано: volvo - 12.11.2008 12:28
 К началу страницы 
+ Ответить 
Account
сообщение 12.11.2008 12:14
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


volvo , результат принимаю, НО теперь обратимся к моему первому посту
Цитата
не прибегая к дополнительным переменным и подпрограммам


function get_byte(var b: byte): boolean; попадает под него.
Какие еще есть варианты.

Также хотелосьбы пояснение к следующему

ok := (ioresult = 0); не понял это типа сравнивание с нулем и присвоение ok?
ok := ok and
(err = 0) and (length(s) < 4) and ((n > 0) and (n <= 255)); что за перечесления без оператора условия как такового?



Сообщение отредактировано: Account - 12.11.2008 12:15
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.11.2008 12:27
Сообщение #6


Гость






Цитата
Какие еще есть варианты.
Есть еще варианты пользоваться более современными средствами разработки: FPC, скажем, позволяет:

var b: byte;
begin
try
readln(b);
except
writeln('error');
end;
end.


P.S. Комментарии выше добавлены...
 К началу страницы 
+ Ответить 
Account
сообщение 12.11.2008 12:42
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


По поводу более ссовременных средств понятно)
Цитата
{
Проверяем, была ли при вводе строки ошибка.
Если была, то Ok будет False
}
ok := (ioresult = 0);

а сравнивание результата функции ioresult с нулем производиться автоматом чтоли без оператора условия, это заложено в компиляторе или интерпритаторе посредством директивы {$I-} ........ {$I+} или просто заложено?
и вот
Цитата


ok and
(err = 0) and (length(s) < 4) and ((n > 0) and (n <= 255));

таже история что и спредыдущим выражением?

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


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 12.11.2008 13:06
Сообщение #8


Гость






Цитата
а сравнивание результата функции ioresult с нулем производиться автоматом чтоли без оператора условия, это заложено в компиляторе
blink.gif

ok := (ioresult = 0) cовершенно аналогично:
if (ioresult = 0) then ok := true
else ok := false;
: происходит сравнение ioresult с нулем, и результат сравнения (истина или ложь) заносится в переменную Ok.

Цитата
если без выше упомянутых вариантов, возможно только если менять срутктуру самой процедуры readln языка.
Каким образом ты собрался ее менять? Если б ты уточнил задачу, зачем тебе это понадобилось, возможно получил бы еще варианты, а то ничего не сказав хочешь получить ответ, а мне лень придумывать все возможные способы реализации и применения этой мути, да еще с такими ограничениями, как "не прибегая к дополнительным переменным и подпрограммам".
 К началу страницы 
+ Ответить 
Account
сообщение 12.11.2008 13:23
Сообщение #9


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


volvo
Цитата
Каким образом ты собрался ее менять?


Я не собрался, а предположил.

Не сердись и спасибо за ответы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 12.11.2008 13:36
Сообщение #10


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Account @ 12.11.2008 13:23) *
Я не собрался, а предположил.

Но все равно странное предположение - менять компилятор под свою задачу.. blink.gif Бывает, люди делают свои предпроцессоры, если у них обширный круг специфических задач. Но сам компилятор - извини, непонятно..
Заинтриговал smile.gif. Может, все же скажешь - зачем?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Account
сообщение 12.11.2008 14:26
Сообщение #11


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Lapp
Цитата
Бывает, люди делают свои предпроцессоры

У меня не такие знания в этом, не потяну blink.gif
Цитата
Заинтриговал . Может, все же скажешь - зачем?

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

P.S. Случайно дублировл пост, не нашел как убрать дубликат, поэтому просто убрал текст(

Сообщение отредактировано: Account - 12.11.2008 14:30
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 12.11.2008 15:02
Сообщение #12


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Account @ 12.11.2008 14:26) *
как бы было не плохо, чтоб таже самая процедура readln проверяла поступающие в нее данные, соответсвие вводимого типу указанной переменной, помоему былобы просто великолепно.

Это палка о двух концах. Языки более высокого уровня могут предоставлять подобные средства - но при этом неизбежно уменьшаются свободы программиста. Паскаль уровнем выше ассемблера, но ниже, скажем, PHP или MatLab. Соответвенно, возможности его несколько уже, чем у ассемблера, но значительно шире, чем на PHP - хотя последний предоставляет очень удобный во многих случаях интерфейс. Иными словами - все за счет чего-то.

Цитата(Account @ 12.11.2008 14:26) *
P.S. Случайно дублировл пост, не нашел как убрать дубликат, поэтому просто убрал текст(

Ничего страшного, бывает. Я удалил.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Account
сообщение 12.11.2008 16:13
Сообщение #13


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Цитата(Lapp @ 12.11.2008 15:02) *

Это палка о двух концах.

Согласен. Вообще былоб не плохо иметь возможность править внутренние процедуры и функции языкаblink.gif

На этом думаю тема исчерпана и можно ее удалить, чтоб не засоряла форум (Но это конечно на Ваше усмотрениеsmile.gif )

P.S. Спасибо за ответы и дискуссию)

Сообщение отредактировано: Account - 12.11.2008 16:19
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 13.11.2008 1:16
Сообщение #14


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Account @ 12.11.2008 16:13) *
Согласен. Вообще былоб не плохо иметь возможность править внутренние процедуры и функции языка
Хоть ты и пишешь, что соглосен, но видно, что ты не понял.. Эта возможность, если бы и была, была бы не на пустом месте - скорее всего, за счет эффективности (и цены). Я не говорю про переносимость - и так ясно..

Цитата(Account @ 12.11.2008 16:13) *
На этом думаю тема исчерпана и можно ее удалить, чтоб не засоряла форум
Все темы являются собственностью Форума (а не авторов) и удалению не подлежат (за исключением вредоносных). Это не "мусор", а богатство Форума. Прошу учитывать это в дальнейшем. Просьбы об удалении (и только отдельных сообщений!) рассматриваются исключительно в самых крайних случаях.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Account
сообщение 13.11.2008 11:20
Сообщение #15


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Lapp
Цитата
Все темы являются собственностью Форума (а не авторов) и удалению не подлежат (за исключением вредоносных). Это не "мусор", а богатство Форума. Прошу учитывать это в дальнейшем. Просьбы об удалении (и только отдельных сообщений!) рассматриваются исключительно в самых крайних случаях.

Я и не настаивал, а просто предложил. Так что если, не так выразился, звиняй)

А вообще раньше когда выполнял задания, и надо было вводить какието данные, например опятьже
размерность массива например, я не особо парился над темой проверки, а вот тут в последние вермя меня это прсто что то зацепило, ведь обязательно найдеться тот кто захочет попробовать ввести не то что от него требуеться, и стало это тут вот у меня занозой)))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 13.11.2008 12:21
Сообщение #16


Гость






Цитата
в последние вермя меня это прсто что то зацепило, ведь обязательно найдеться тот кто захочет попробовать ввести не то что от него требуеться, и стало это тут вот у меня занозой)))
Из этого совершенно не следует, что должна быть необходимость менять библиотечные подпрограммы языка. Как делать защиту "от дурака" тебе было показано. НЕиспользование дополнительных процедур/функций/переменных это никому не нужные усложнения. Ты что, в программе тоже не используешь никакие процедуры/функции/переменные? Используешь наверняка. Тогда почему надо обязательно ставить для проверки эти ограничения? Ну, мозолит тебе глаза эта дополнительная функция - вынеси ее в отдельный модуль, в конце концов, и используй когда тебе надо с той же легкостью, с которой ты используешь какой-нибудь ClrScr из библиотеки CRT. Можешь даже назвать свою новую функцию ReadLn (Да, да... Этого никто и никогда не запрещал, это просто обычный идентификатор, с ним можешь делать все, что угодно), и ты вообще не увидишь разницы в использовании. Не надо искусственно ограничивать возможности языка. Это уже получается не программирование, а извращение.
 К началу страницы 
+ Ответить 
Account
сообщение 13.11.2008 12:59
Сообщение #17


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


volvo , спасибо. Учту все твои советы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 28.04.2024 4:34
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"