Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Ввод и вывод матрицы

Автор: Relrin 30.04.2011 1:10

У меня написаны следующие кусочки кода, которые производят ввод и вывод информации, однако возникли вопросы:
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. По тому сочетанию слов, которое дал выше - не нашел, нашел здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=13890&view=findpost&p=80759

Добавлением нескольких строк (и изъятием всего лишнего) мне удалось превратить ту функцию get_input в исполняющую все условия твоего поста. Но для начала попробуй сделать это сам.

Автор: Relrin 13.05.2011 4:11

Посимвольно получил вот так:
Правда, когда я нажимаю ЛЮБУЮ клавишу, получается, сразу выход из программы blink.gif


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

Специально написал сразу после того, как ответил выше:

Разбирайся, вопросы приветствуются (Показать/Скрыть)
smile.gif

Автор: Relrin 13.05.2011 5:07

А, если я, допустим, хочу жестко контролировать пользователя, каждый символ, что он вводит, (т.е. например, идет минус, потом еще раз его вводит, а я его убираю и возвращаюсь на позицию назад, с точкой также), то что необходимо будет для этого? Вести слежку за кол-вом каждого символа знака в виде некоторого массива?

Автор: IUnknown 13.05.2011 5:21

Тогда тебе нужно строить конечный автомат.

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

Начать можешь отсюда: http://www.rsdn.ru/article/alg/checkStr.xml

Автор: Lapp 13.05.2011 6:00

Цитата(Relrin @ 13.05.2011 2:07) *
например, идет минус, потом еще раз его вводит, а я его убираю и возвращаюсь на позицию назад, с точкой также

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

Есть вполне определенные, выработанные долгой практикой, правила ввода. Любое отступление от них вносит бардак.
Лучше, по-моему, диагностировать ошибку ввода по нажатии на Enter (или при переходе в другому полю).

Автор: Relrin 15.05.2011 22:21

Поскольку первый вопрос в принципе решен (с 1ого поста), то остался тот 2ой вопрос:
А можно ли выводить цифры также, как и были введены. То есть например, один коэффициент, целое, число, а другое дробное, и, выводим на экран в том виде, как он выглядел при вводе? Или же нечто подобное в Pascale сделать нельзя? blink.gif

Автор: Lapp 16.05.2011 7:07

Цитата(Relrin @ 15.05.2011 19:21) *
Поскольку первый вопрос в принципе решен (с 1ого поста), то остался тот 2ой вопрос:
А можно ли выводить цифры также, как и были введены. То есть например, один коэффициент, целое, число, а другое дробное, и, выводим на экран в том виде, как он выглядел при вводе? Или же нечто подобное в Pascale сделать нельзя? blink.gif

В Паскале можно сделать ВСЕ. Ты только уясни для себя, чего ты добиваешься (точно).

Если ты вводишь число строкой, а потом обрабатываешь, ты можешь распознавать, в каком виде введено число - целое или дробное - и в соответствии с этим действовать. Можешь завести специальную переменную, тип числа (не паскалевский тип, а твой собственный признак). Можешь также хранить строку с точным видом при вводе.

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

В Паскале можно сделать абсолютно ВСЕ.