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

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

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

 
 Ответить  Открыть новую тему 
> Ввод и вывод матрицы, Вопросы по кодингу
Relrin
сообщение 29.04.2011 21:10
Сообщение #1


Пионер
**

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

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


У меня написаны следующие кусочки кода, которые производят ввод и вывод информации, однако возникли вопросы:
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;


Сообщение отредактировано: Relrin - 29.04.2011 21:11
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 29.04.2011 21:17
Сообщение #2


a.k.a. volvo877
*****

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

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


Цитата
чтобы при вводе было ограничение по количеству знаков числа (т.е. ограничить пользователя на ввод данных до 7 знаков(включая точку)
Проще всего будет написать свою функцию ввода, а не пользоваться Read-ом. А уж в своей функции, когда у тебя полный контроль над вводимыми символами, можно делать любые проверки. Да, вводить нужно посимвольно (через ReadKey). Я где-то выкладывал примеры (правда тогда я был под другим ником), поищи "защита от дурака", или что-то в этом духе.

Сообщение отредактировано: IUnknown - 29.04.2011 21:23
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 29.04.2011 21:56
Сообщение #3


a.k.a. volvo877
*****

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

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


P.S. По тому сочетанию слов, которое дал выше - не нашел, нашел здесь: Графика

Добавлением нескольких строк (и изъятием всего лишнего) мне удалось превратить ту функцию get_input в исполняющую все условия твоего поста. Но для начала попробуй сделать это сам.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Relrin
сообщение 13.05.2011 0:11
Сообщение #4


Пионер
**

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

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


Посимвольно получил вот так:
Правда, когда я нажимаю ЛЮБУЮ клавишу, получается, сразу выход из программы 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;



Просьба использовать правильные теги! Прочти Правила

Сообщение отредактировано: Lapp - 13.05.2011 0:28
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 13.05.2011 0:48
Сообщение #5


a.k.a. volvo877
*****

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

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


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

Разбирайся, вопросы приветствуются (Показать/Скрыть)
smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Relrin
сообщение 13.05.2011 1:07
Сообщение #6


Пионер
**

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

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


А, если я, допустим, хочу жестко контролировать пользователя, каждый символ, что он вводит, (т.е. например, идет минус, потом еще раз его вводит, а я его убираю и возвращаюсь на позицию назад, с точкой также), то что необходимо будет для этого? Вести слежку за кол-вом каждого символа знака в виде некоторого массива?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 13.05.2011 1:21
Сообщение #7


a.k.a. volvo877
*****

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

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


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

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

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

Сообщение отредактировано: IUnknown - 13.05.2011 1:27
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 13.05.2011 2:00
Сообщение #8


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

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

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


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

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

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


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


Пионер
**

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

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


Поскольку первый вопрос в принципе решен (с 1ого поста), то остался тот 2ой вопрос:
А можно ли выводить цифры также, как и были введены. То есть например, один коэффициент, целое, число, а другое дробное, и, выводим на экран в том виде, как он выглядел при вводе? Или же нечто подобное в Pascale сделать нельзя? blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 16.05.2011 3:07
Сообщение #10


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

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

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


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

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

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

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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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