sexta-feira, 3 de outubro de 2008

Código em C para ler código de tecla pressionada

As funções getch() e kbhit() da biblioteca CONIO proporcionam funcionalidades para monitoramento de teclas pressionadas, permitindo obter o código da tecla sem precisar aguardar que o usuário pressione ENTER, como ocorre com a getchar() padrão.

 

//---------------------------------------------------------------------------

#pragma hdrstop

#include <stdio.h>      // printf

#include <conio.h>      // kbhit, getch

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
    int keycode, normalkey;

    while ( keycode != 27 )         // ESCAPE
    {


        // aguardar uma tecla ser pressionada
        while ( ! kbhit() ) ;

        // ler o código da tecla pressionada
        keycode = getch();

        // keycode = 0 se for tecla especial
        normalkey = keycode;

        // se tecla especial,
        // pegar o próximo código para identificar a tecla pressionada
        if ( !normalkey )
            keycode = getch();

        if      ( normalkey && keycode >= 48 && keycode <= 57 )
            printf("\nteclou digito %c = %d = valor decimal %d",
                    keycode, keycode, (keycode - 48) );

        else if ( normalkey && keycode >= 65 && keycode <= 90 )
            printf("\nteclou letra maiuscula %c = %d",
                    keycode, keycode);

        else if ( normalkey && keycode >= 97 && keycode <= 122 )
            printf("\nteclou letra minuscula %c = %d",
                    keycode, keycode);

        else if ( !normalkey && keycode >= 59 && keycode <= 68 )
            printf("\nteclou F%1d = %d",
                    (keycode - 58), keycode);

        else if ( !normalkey && keycode >= 133 && keycode <= 134 )
            printf("\nteclou F%2d = %d",
                    (keycode - 122), keycode);

        else if ( normalkey && keycode == 27 )
            printf("\nteclou ESCAPE = %d", keycode);

        else if ( normalkey && keycode == 8 )
            printf("\nteclou BACKSPACE = %d", keycode);

        else if ( normalkey && keycode == 9 )
            printf("\nteclou TAB = %d", keycode);

        else if ( normalkey && keycode == 13 )
            printf("\nteclou CARRIAGE-RETURN (ENTER) = %d", keycode);

        else if ( normalkey && keycode == 10 )
            printf("\nteclou LINE-FEED (CTRL-ENTER) = %d", keycode);

        else if ( !normalkey && keycode == 75 )
            printf("\nteclou SETA A ESQUERDA = %d", keycode);

        else if ( !normalkey && keycode == 77 )
            printf("\nteclou SETA A DIREITA = %d", keycode);

        else if ( !normalkey && keycode == 72 )
            printf("\nteclou SETA PARA CIMA = %d", keycode);

        else if ( !normalkey && keycode == 80 )
            printf("\nteclou SETA PARA BAIXO = %d", keycode);

        else if ( !normalkey && keycode >= 82 && keycode <= 83 )
            printf("\nteclou %s = %d",
                    (keycode == 82 ? "INSERT\0" : "DELETE\0"), keycode);

        else if ( !normalkey && keycode == 71 )
            printf("\nteclou HOME = %d", keycode);

        else if ( !normalkey && keycode == 79 )
            printf("\nteclou END = %d", keycode);

        else if ( !normalkey && keycode == 73 )
            printf("\nteclou PAGE-UP = %d", keycode);

        else if ( !normalkey && keycode == 81 )
            printf("\nteclou PAGE-DOWN = %d", keycode);

        else
            printf("\nteclou %c = %d (%s)",
                    keycode, keycode, (normalkey ? "normal\0" : "especial\0") );
    }

    return 0;
}
//---------------------------------------------------------------------------

 

Com o código acima, espero ter apresentado dicas para os exercícios propostos em sala de aula.

 

Bom estudo e até a próxima.

quarta-feira, 1 de outubro de 2008

Trabalhando com cadeias de caracteres (strings)

O código apresentado a seguir foi escrito em C e se propõe a demonstrar o uso de cadeias de caracteres.
A aplicação é bastante simples, envolvendo uma lista de nomes de frutas previamente estabelecida e a interação com o usuário para que este faça uma consulta.
Dado um nome de fruta, o algoritmo fará uma busca seqüencial na lista a partir do primeiro elemento.
Se o nome for localizado, será indicado em qual posição da lista e o nome apresentado com efeito especial: letra por letra pausadamente e com barulho de máquina de datilografia.

O programa foi testado na plataforma MS Windows XP e Borland C Builder.

//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------

#include <stdio.h>      // printf, scanf, fflush
#include <windows.h>    // Sleep, Beep

#define MAX_FRUTAS 5
#define MAX_COMPR 12

#pragma argsused
int main(int argc, char* argv[])
{

        char frutas[MAX_FRUTAS][MAX_COMPR] =
                {
                        { 'a', 'b', 'a', 'c', 'a', 'x', 'i' },
                        { "mamao" },
                        { "laranja" },
                          "banana",
                          "kiwi"
                };


        char nome[MAX_COMPR];

        int i, j;

        printf("\nDigite um nome de fruta: ");

        scanf("%s", nome);

        printf("\nVoce digitou %s", nome);

        // Pesquisa do nome na lista

        for (i=0; i<MAX_FRUTAS && strcmp( frutas[i], nome ) ; i++) ;

        if ( i == MAX_FRUTAS )
        {
                printf("\nNome nao catalogado");
        }
        else
        {
                printf("\nLocalizada em %d", i);
                printf("\n\n");

//              for (j=0; j<MAX_COMPR && frutas[i][j] != '\0'; j++)
                for (j=0; j<MAX_COMPR && nome[j] != '\0'; j++)
                {

//                      putchar( frutas[i][j] );
                        putchar( nome[j] );

                        Beep(3700, 5);  // frequencia (Hz), duracao (s)
                        Beep(300,2);
                        Beep(80,8);

                        Sleep(500);     // hibernar (ms)

                }
        }

        fflush( stdin );        // limpar buffer da entrada padrão
        getchar();

        return 0;

}
//---------------------------------------------------------------------------

 

Bom estudo e até a próxima.