У меня написаны следующие кусочки кода, которые производят ввод и вывод информации, однако возникли вопросы: 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)>0 then 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 = #0 then readkey { Прочитанный символ - "расширенный"? } else begin { Нет, не расширенный. Enter - значит установить флажок "юзер ввел данные" } if ch = #13 then stop := true else if (ch = #8) then { Не Enter... Может, BackSpace (удаление последнего символа)? } begin { Ага, BackSpace... Если есть что удалять - удаляем (печать #8 перебросит курсор на 1 символ назад, но символ не сотрет. А комбинация #8#32#8 - это "перейти назад, стереть пробелом последний символ, и опять вернуться назад") } if length(in_str) > 0 then begin delete(in_str, length(in_str), 1); write(#8#32#8); end end else { Нет. Не Enter и не BackSpace. Пользователь может вводить только те символы, которые перечислены во множестве Alpha (ага, алфавит). Причем вводить он их может в любом порядке, об этом сейчас не беспокойся. Побеспокоимся позже. Единственное, что остается проверить - это не обращать на введенный символ внимания, если уже ввели достаточно символов. То есть, восьмой символ уже ввести не удастся } if (ch in alpha) and (length(in_str) < 7) then begin 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® < 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 сделать нельзя?
В Паскале можно сделать ВСЕ. Ты только уясни для себя, чего ты добиваешься (точно).
Если ты вводишь число строкой, а потом обрабатываешь, ты можешь распознавать, в каком виде введено число - целое или дробное - и в соответствии с этим действовать. Можешь завести специальную переменную, тип числа (не паскалевский тип, а твой собственный признак). Можешь также хранить строку с точным видом при вводе.
Стандартный числовой ввод/вывод - это очень удобная штука для быстрого написания программ. Но при всей своей универсальности он не может охватить всех возможных требований. Если задача требует - всегда можно написать свои средства.
В Паскале можно сделать абсолютно ВСЕ.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.