Доброе время суток. Попалась интересная задачка. Допустим на экране выведено какое - то число (число может быть как целое так и дробное). Задание такое : передвигать под ним курсор, при этом имея возможность исправить любую из цифр, и что самое главное новое число потом будет обрабатываться, то есть программа должна его прочитать и записать под соответствующий тип. Какие идеи ?
volvo
27.03.2007 0:28
Цитата
Какие идеи ?
Какие еще могут быть идеи, кроме
1) прямого доступа к видеопамяти для чтения любого символа с экрана 2) есть такая функция 08H прерывания 10H, которая читает символ из позиции, в которой находится курсор, без необходимости работы напрямую с видеопамятью...
Выбирай...
Tan
27.03.2007 0:54
вы не могли бы описать как я могу получить это значение ? Какие - то мысли есть в голове, но вряд ли верные.
procedure getnumber; var regs : registers; begin regs.ax := $0800; intr($10, regs); n:= ??? end;
volvo
27.03.2007 1:41
Я бы все-таки пользовался первым способом:
uses crt, dos;
type { описываем структуру, которую имеет видеопамять (символ и затем - его атрибут: цвет фона, цвет текста, мигание) } R = record ch: char; attr: byte; end;
{ Это - массив наложенный на видеопямять, поэтому ее содержимое можно читать из этого самого массива...
Для упрощения я сделал работу с экраном 25 строк * 80 столбцов и принял за основу цветной режим, но можно сделать и универсальную функцию... } var VMem: array[1 .. 25, 1 .. 80] of R absolute $b800:$0000; var currx, curry: integer; s: string;
begin clrscr; { сначала пишем на чистый экран какое-то число } writeln; writeln(' 12345 ');
{ потом установим курсор под одну из цифр этого числа и переместимся по нему вправо, пока не встретим пробел или нулевую позицию экрана. в этом случае мы достигли начала числа ... } gotoxy(4, 2); currx := wherex; curry := wherey; while (currx >= 1) and (VMem[curry, currx].ch <> ' ') do dec(currx); inc(currx, 1);
{ а теперь идем обратно и читаем его в строковую переменную: } s := ''; while VMem[wherey, currx].ch <> ' ' do begin s := s + VMem[wherey, currx].Ch; inc(currx); end;
{ Вот то число, которое было прочитано! } gotoxy(10, 10); writeln('s = ', s); end.
Я надеюсь перевести строку в число через Val проблем не будет?
Точно так же не должно быть проблем и с перемещением курсора: пользуйся функциями wherex, wherey и gotoxy...
Работает только в Турбо Паскале, FPC даже не мучай - Absolute там не совмещает с адресом, только с другой переменной...
Tan
27.03.2007 1:48
огромное спасибо!!! пойду разбираться, если будут вопросы отпишусь!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.