Помощь - Поиск - Пользователи - Календарь
Полная версия: Ввод и вывод матрицы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Relrin
У меня написаны следующие кусочки кода, которые производят ввод и вывод информации, однако возникли вопросы:
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
Цитата
чтобы при вводе было ограничение по количеству знаков числа (т.е. ограничить пользователя на ввод данных до 7 знаков(включая точку)
Проще всего будет написать свою функцию ввода, а не пользоваться Read-ом. А уж в своей функции, когда у тебя полный контроль над вводимыми символами, можно делать любые проверки. Да, вводить нужно посимвольно (через ReadKey). Я где-то выкладывал примеры (правда тогда я был под другим ником), поищи "защита от дурака", или что-то в этом духе.
IUnknown
P.S. По тому сочетанию слов, которое дал выше - не нашел, нашел здесь: Графика

Добавлением нескольких строк (и изъятием всего лишнего) мне удалось превратить ту функцию get_input в исполняющую все условия твоего поста. Но для начала попробуй сделать это сам.
Relrin
Посимвольно получил вот так:
Правда, когда я нажимаю ЛЮБУЮ клавишу, получается, сразу выход из программы 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
Специально написал сразу после того, как ответил выше:

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

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

Начать можешь отсюда: http://www.rsdn.ru/article/alg/checkStr.xml
Lapp
Цитата(Relrin @ 13.05.2011 2:07) *
например, идет минус, потом еще раз его вводит, а я его убираю и возвращаюсь на позицию назад, с точкой также

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

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

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

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

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

В Паскале можно сделать абсолютно ВСЕ.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.