У меня написаны следующие кусочки кода, которые производят ввод и вывод информации, однако возникли вопросы: 1) Что нужно исправить, чтобы при вводе было ограничение по количеству знаков числа (т.е. ограничить пользователя на ввод данных до 7 знаков(включая точку? т.е. например дробное число, состоящее из одного знака в целой части+точка+5 знаков после запятой)) Пример: A 1 2 b 1 2 -35 0.00004 2 4.44 15 174 2) Что нужно исправить, чтобы вывод был схож с предыдущим пунктом
Исходный код:
Код
Procedure InputMatrix(n: integer; var a: matrix; var b: vector); Var i,j,r: Integer; Begin r:=whereY; gotoXY(2,r); write('A'); for i:=1 to n do begin gotoXY(i*6+2,r); write(i); gotoXY(1,r+i+1); write(i:2); end; gotoXY((n+1)*6+2,r); write('b'); for i:=1 to n do begin for j:=1 to n do begin gotoXY(j*6+2,r+i+1); read(a[i,j]); end; gotoXY((n+1)*6+2,r+i+1); read(b[i]); end; End;
Procedure PrintMatrix(n: integer; var a: matrix; var b: vector); Var i,j,r: integer; Begin clrscr; r:=WhereY; gotoXY(2,r); write('A'); for i:=1 to n do begin gotoXY(i*6+2,r); write(i); gotoXY(1,r+i+1); write(i:2); end; gotoXY((n+1)*6+2,r); write('b'); for i:=1 to n do begin for j:=1 to n do begin gotoXY(j*6+2,r+i+1); write(a[i,j]:2:2); end; gotoXY((n+1)*6+2,r+i+1); write(b[i]:2:2); end; End;
IUnknown
30.04.2011 1:17
Цитата
чтобы при вводе было ограничение по количеству знаков числа (т.е. ограничить пользователя на ввод данных до 7 знаков(включая точку)
Проще всего будет написать свою функцию ввода, а не пользоваться Read-ом. А уж в своей функции, когда у тебя полный контроль над вводимыми символами, можно делать любые проверки. Да, вводить нужно посимвольно (через ReadKey). Я где-то выкладывал примеры (правда тогда я был под другим ником), поищи "защита от дурака", или что-то в этом духе.
IUnknown
30.04.2011 1:56
P.S. По тому сочетанию слов, которое дал выше - не нашел, нашел здесь: Графика
Добавлением нескольких строк (и изъятием всего лишнего) мне удалось превратить ту функцию get_input в исполняющую все условия твоего поста. Но для начала попробуй сделать это сам.
Relrin
13.05.2011 4:11
Посимвольно получил вот так: Правда, когда я нажимаю ЛЮБУЮ клавишу, получается, сразу выход из программы
Procedure Acc;
Var res : string;
stop : boolean;
ch : char;
Begin
stop:=false;
repeat
ch:=readkey;
case ch of#0 : readkey;
#8 : stop:=true;
#13: if length(res)>0then delete(res,length(res),1);
else res:=res+ch;
end;
until (stop=true) or (length(res)>7);
End;
Просьба использовать правильные теги! Прочти Правила
IUnknown
13.05.2011 4:48
Специально написал сразу после того, как ответил выше:
Разбирайся, вопросы приветствуются(Показать/Скрыть)
function get_input: real;
const
alpha = ['0' .. '9', '.', '-'];
var
stop : boolean;
in_str : string;
ch : char;
r : double;
error : Integer;
begin{ Начинаем. будем собирать эту строку }
in_str := '';
{ Внешний цикл - пока введенная информация не окажется подходящим вещественным числом }repeat
stop := false;
{ Внутренний цикл - пока пользователь не нажмет Enter, сигнализирующий,
что он хочет завершить ввод (но одного его желания - мало, см. дальше) }repeat
ch := readkey;
if ch = #0then readkey { Прочитанный символ - "расширенный"? }elsebegin{ Нет, не расширенный. Enter - значит установить флажок "юзер ввел данные" }if ch = #13then stop := true
elseif (ch = #8) then{ Не Enter... Может, BackSpace (удаление последнего символа)? }begin{ Ага, BackSpace... Если есть что удалять - удаляем (печать #8
перебросит курсор на 1 символ назад, но символ не сотрет.
А комбинация #8#32#8 - это "перейти назад, стереть пробелом
последний символ, и опять вернуться назад") }if length(in_str) > 0thenbegin
delete(in_str, length(in_str), 1);
write(#8#32#8);
endendelse{ Нет. Не Enter и не BackSpace. Пользователь может вводить
только те символы, которые перечислены во множестве Alpha
(ага, алфавит). Причем вводить он их может в любом порядке,
об этом сейчас не беспокойся. Побеспокоимся позже.
Единственное, что остается проверить - это не обращать на
введенный символ внимания, если уже ввели достаточно символов.
То есть, восьмой символ уже ввести не удастся }if (ch in alpha) and (length(in_str) < 7) thenbegin
in_str := in_str + ch;
write(ch); { Естественно, отображаем то, что нажал пользователь }end;
end;
until stop;
{ О!!! Вот теперь начинается интересная штука. Пользователь ввод окончил,
нажал Enter, из внутреннего цикла мы вышли. Что остается? Вернуть то, что
введено? Ага, сейчас. А если это '2.4.-9', например? Все проще: пытаемся
перевести введенную информацию в строку. Если получилось (error = 0), то
дополнительно проверим еще, чтоб до запятой была всего одна цифра. И только
если оба эти условия выполнены - только тогда stop действительно остается
равным true, и выходим из внешнего цикла. Если введена белиберда, которую
Val не может корректно перевести в вещественное число - то возвращаемся
назад, и пусть пользователь стирает то, что наворотил, и вводит корректную
информацию. Можно ему при этом дать какую-то подсказку, только не забыть
потом вернуть курсор точно туда же, где он находился, иначе будет некрасиво.
Или принудительно стереть всю введенную строку, и пусть набирает заново }
val(in_str, r, error);
stop := (error = 0) and (abs(r) < 10);
until stop;
get_input := r; { А вот теперь - действительно возвращаем результат и выходим }end;
Relrin
13.05.2011 5:07
А, если я, допустим, хочу жестко контролировать пользователя, каждый символ, что он вводит, (т.е. например, идет минус, потом еще раз его вводит, а я его убираю и возвращаюсь на позицию назад, с точкой также), то что необходимо будет для этого? Вести слежку за кол-вом каждого символа знака в виде некоторого массива?
IUnknown
13.05.2011 5:21
Тогда тебе нужно строить конечный автомат.
Ввод символа перебрасывает автомат в определенное состояние, в котором он может принимать только определенные символы. Введен не тот символ, который допустим для текущего состояния - ошибка, принимай меры. Введен допустимый - ошибки нет и переходим в другое состояние (или остаемся в предыдущем). В общем, гугли, как строятся конечные автоматы...
например, идет минус, потом еще раз его вводит, а я его убираю и возвращаюсь на позицию назад, с точкой также
Извиняюсь за вторжение, но мне кажется, это не очень хорошая идея по своей сути (если это не чисто академический интерес). Я, например, часто случайно повторяю символ и сразу, на автомате, удаляю его (не глядя на экран) - и что тогда будет? Несчастный минус пропадет совсем..
Есть вполне определенные, выработанные долгой практикой, правила ввода. Любое отступление от них вносит бардак. Лучше, по-моему, диагностировать ошибку ввода по нажатии на Enter (или при переходе в другому полю).
Relrin
15.05.2011 22:21
Поскольку первый вопрос в принципе решен (с 1ого поста), то остался тот 2ой вопрос: А можно ли выводить цифры также, как и были введены. То есть например, один коэффициент, целое, число, а другое дробное, и, выводим на экран в том виде, как он выглядел при вводе? Или же нечто подобное в Pascale сделать нельзя?
Lapp
16.05.2011 7:07
Цитата(Relrin @ 15.05.2011 19:21)
Поскольку первый вопрос в принципе решен (с 1ого поста), то остался тот 2ой вопрос: А можно ли выводить цифры также, как и были введены. То есть например, один коэффициент, целое, число, а другое дробное, и, выводим на экран в том виде, как он выглядел при вводе? Или же нечто подобное в Pascale сделать нельзя?
В Паскале можно сделать ВСЕ. Ты только уясни для себя, чего ты добиваешься (точно).
Если ты вводишь число строкой, а потом обрабатываешь, ты можешь распознавать, в каком виде введено число - целое или дробное - и в соответствии с этим действовать. Можешь завести специальную переменную, тип числа (не паскалевский тип, а твой собственный признак). Можешь также хранить строку с точным видом при вводе.
Стандартный числовой ввод/вывод - это очень удобная штука для быстрого написания программ. Но при всей своей универсальности он не может охватить всех возможных требований. Если задача требует - всегда можно написать свои средства.
В Паскале можно сделать абсолютно ВСЕ.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.