Форум портала Metropolis

Высокие технологии и мобильный мир => Софт и интернет => Тема начата: tech от 06 Май 2010, 14:13



Название: вопрос по программированию
Отправлено: tech от 06 Май 2010, 14:13
как выводить ascii код символа нажатой клавиши?
на с и паскале интересует.


Название: Re: вопрос по программированию
Отправлено: K i r i L L от 06 Май 2010, 16:18
ну например так:

Код:
#include <conio.h>
#include <stdio.h>

int main(){
 
  int key = getch();  //считываем
  printf("%d",key);     //выводим

  getch();

return 0;
}


Название: Re: вопрос по программированию
Отправлено: tech от 06 Май 2010, 17:18
на с понятно. на паскале кто-нибудь подскажет?


Название: Re: вопрос по программированию
Отправлено: imperfect от 07 Май 2010, 01:08
ну например так:

Код:
#include <conio.h>
#include <stdio.h>

int main(){
 
  int key = getch();  //считываем
  printf("%d",key);     //выводим

  getch();

return 0;
}

Извиняюсь за занудство, но решение  не очень красивое, ибо не нужно плодить сущности без необходимости :)
Заголовок conio.h нестандартен, поэтому будет работать не во всех компиляторах С.
Вместо функции getch(), ради которой он и подключается, я бы использовал функцию стандартной библиотеки getchar(). Исполняемый файл будет меньше по объему, и программа будет более переносимая. :)

Код:
#include<stdio.h>

int main()
{
printf("%d", getchar());
getchar();
getchar();
return 0;
}

Различие между функциями есть: getchar() выводит осуществляет буферизованное считывание символа, т.е. выводит его на экран и требует нажатия Enter.

Паскаль:

Код:
program trololo;

var
c: char;

begin
    readln(c);
    writeln(ord(c));
    readln
end.


Название: Re: вопрос по программированию
Отправлено: tech от 07 Май 2010, 01:27
ord - это функция? чёто он просто символ выводит


Название: Re: вопрос по программированию
Отправлено: imperfect от 07 Май 2010, 02:45
Да, ord - функция, возвращающая ascii-код аргумента.

Усомнился, скачал FreePascal и проверил - все работает.


Название: Re: вопрос по программированию
Отправлено: ExclusivE от 07 Май 2010, 04:09
Код:
program trololo;
uses crt;

var
    c: char;

begin
    repeat
        repeat until keypressed; { жрать проц пока не нажата клавиша }
        c:=readkey;
        writeln(ord(c));
    until c<>^[; { пока не нажат esc }
end.
На паскале я не кодил уже лет 8. Скорее всего где-то ошибки.


Название: Re: вопрос по программированию
Отправлено: imperfect от 08 Май 2010, 03:41
2ExclusivE: Смотрю, проект развивается. Уже вторая версия вышла.


Название: Re: вопрос по программированию
Отправлено: CRP от 08 Май 2010, 08:19
да это мегапроект метрополиса!!! Давайте все вместе писать, на всех возможных языках программирования под все возможные платформы. И в гугле распиарим )


Название: Re: вопрос по программированию
Отправлено: tech от 18 Май 2010, 23:48
оказалось, что нужно использовать прерывания.
эта программа через одно нажатие выводит символ, нужно чтоб вместо символа выводился его ascii код. тоже через раз.

program 1;
uses Crt;
var cha:char;
    bPrint:boolean;
begin
     bPrint:=True;
     while True do
     begin
          while not keypressed do;
       asm
      mov ah,0h
      int 16h
      mov cha,ah
       end;
          if cha=' ' then break;
          if bPrint
      then Begin
           asm
         mov dl,cha
         mov ah,2h
         int 21h
           end;
      end;
          bPrint:= not bPrint;
     end;
end.


Название: Re: вопрос по программированию
Отправлено: imperfect от 19 Май 2010, 01:40
Возможно, у нас разные паскали, но в Турбе нужно заменить
mov cha,ah
на
Код:
mov cha,al

Вообще говоря, вывод ascii-кода через прерывание - нетривиальная задача, поскольку он может быть многосимвольным, например, '123'.
Поскольку прерывание 21h осуществляет вывод содержимого младшего байта регистра d (всего 1 символ), нужно реализовать продвинутую логику анализа ascii-кода, и несколько раз подряд делать int 21h.

Кстати, программа не может называться "1", в силу того, что идентификаторы не могут начинаться с цифры.


Название: Re: вопрос по программированию
Отправлено: tech от 19 Май 2010, 01:50
Возможно, у нас разные паскали, но в Турбе нужно заменить
mov cha,ah
на
Код:
mov cha,al

действительно, напутал)

а на счёт тривиальности задачи - просто предмет, по которому это надо сделать, называется Интерфейсы Периферийных Устройств


Название: Re: вопрос по программированию
Отправлено: imperfect от 19 Май 2010, 01:58
Может, надо через прерывания только считывание, а вывод просто так?


Название: Re: вопрос по программированию
Отправлено: tech от 19 Май 2010, 02:03
может и так прокатит) есть идеи?


Название: Re: вопрос по программированию
Отправлено: imperfect от 19 Май 2010, 02:19
Код:
program tralala;
uses Crt;
var cha:char;
    bPrint:boolean;
begin
     bPrint:=True;
     while True do
     begin
          while not keypressed do;
    asm
mov ah,0h
int 16h
mov cha,al
    end;
          if cha=' ' then break;
          if bPrint
   then write(ord(cha));
          bPrint:= not bPrint;
     end;
end.


Название: Re: вопрос по программированию
Отправлено: tech от 19 Май 2010, 02:54
следующий вопрос для тех, кто не спит  :)

Код:
program lab2;
var x,y:integer;
    c:byte;
begin

     asm
        mov ah,0
        mov al,12h
        int 10h
     end;
     for x:=0 to 639 do
        begin
             c:=x mod 16;
             for y:=0 to 479 do
                begin
                     asm
                         mov cx,x
                         mov dx,y
                         mov al,c
                         mov ah,0ch
                         int 10h
                     end;
                end;
          end;
          asm
             mov ah,0h
             int 16h
          end;
end.

программа закрашивает столбцы в графическом режиме. а нужно строки в текстовом. что нужно изменить кроме 12h на 02h и значений в циклах на 79 и 24?


Название: Re: вопрос по программированию
Отправлено: K i r i L L от 19 Май 2010, 07:04
а на си ничего больше не нужно?)


Название: Re: вопрос по программированию
Отправлено: tech от 19 Май 2010, 13:32
можно и на си ту же задачу. только обязательно должны быть прерывания


Название: Re: вопрос по программированию
Отправлено: 02™ от 16 Сентябрь 2010, 19:54
Вопрос в следующем: есть организация, там установлены программы 1C. Но на одном из компов кем-то криворуким 1С была удалена. Итак: нужно установить её заново и чтобы дата установки соответствовала дате установки всех остальных 1С на др. компьютерах, т.е. год-два назад.
Единственное что приходит на ум, это в биосе (винде) выставить нужное время и установить программу, а потом вернуть его на сегодняшнее. Так прокатит? И нет ли в пакете 1С какого-нибудь рода счётчика, который записывает кол-во вкл. или общее время наработки в пакете программ?

И не спрашивайте для чего, - сам не знаю :lol:, просто нужно сделать. )


Название: Re: вопрос по программированию
Отправлено: Geo от 16 Сентябрь 2010, 21:38
Счетчика в 1С (6-7-8) никакого нет.
Поскольку сама задача смысла не имеет - решение искать незачем...