quinta-feira, 21 de abril de 2016

Macros: criando e utilizando

Um outro recurso que impressiona e que também faz parte do C, são as macros.
Para criar uma macro basta usar a diretiva #define e incluir na frente um nome
que será o identificador da macro.
O c possui diversas diretivas que foram definida pelo padrão C ANSI,
más neste e na maioria dos programas mais simples, usamos pelo menos duas que são: #include e #define.
Estas diretivas são definidas geralmente numa única linha e ponto-e-vírgula não são usados.
Espaços são aceitos entre o nome e a string desde que a macro não esteja recebendo parâmetros.
Vale lembrar que se a string for muito longa basta colocar uma barra invertida no final da
linha para que o compilador entenda que tem que continuar na linha seguinte.
Definir os nomes de uma macro em maiúscula pode ser uma boa prática
de programação, porém não são regras.
O programa que criei para exemplo gera 12 números num vetor, e em seguida embaralha
seus elementos, e são chamados um por vez, para que as operações sejam feitas
individualmente.
Criei algumas macros para este exemplo e mostro na prática seu
funcionamento, na verdade fui bem além, em chamar a função textcolor();
 da conio.h através de macro rodando perfeitamente.
Pretendo mostrar outro exemplo de uso de macros mais avançado,
e não quero incluir neste programa para não torna-lo mais complicado,
portanto será muito bom vê-lo no próximo post.

Veja abaixo uma imagem do programa em execução:


Veja abaixo o código do programa:


#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#define tam 12
#define QUADR(x) ( ( x ) * ( x ) )
#define CUBO(x) ( ( x ) * ( x ) * ( x ) )
#define par if( a % 2 == 0 )
#define impar if( a % 2 == 1 )
#define VERMELHO textcolor(LIGHTRED);
#define AZUL textcolor(LIGHTBLUE);
#define PRETO textcolor(BLACK);
#define ROXO textcolor(LIGHTMAGENTA);
#define CINZA textcolor(DARKGRAY);
void got_color(int tam_lin_ini, int tam_lin_fim, int tam_ini_col,
        int tam_fim_col, int a, int b) {
    int i, e;
    if (a >= 1 && a <= 16) {
        textcolor(a);
    }
    if (b >= 1 && b <= 16) {
        textbackground(b);
    }
    for (i = tam_lin_ini; i < tam_lin_fim; i++) {
        for (e = tam_ini_col; e < tam_fim_col; e++) {
            gotoxy(e, i);
            printf(" ");
        }
    }
}
int main(){
    system("title MACROS: CRIANDO E UTILIZANDO");
    int a = 0;
    int y = 0;
    int p = 0;
    int Vet [ tam ];
    int i;
    int x = 0;
    do{
        normvideo();
        system("cls");
        got_color(2, 25, 3, 79, 2, 15);
        for( i = 1; i <= 12; i++ ){
            Vet [ p  ] = i;
            p++;
        }
        if ( tam > 1 ){
            for ( i = 0; i < tam; i++ ){
                p = i + rand() % ( tam - i  );
                int t = Vet [ p ];
                Vet [ p ] = Vet [ i ];
                Vet [ i ] = t;
            }
        }
        VERMELHO
        gotoxy(28, 3);
        printf("MACROS: CRIANDO E UTILIZANDO");
        AZUL
        gotoxy(14, 5);
        printf("SORTEADO          QUADRADO         CUBO          SOBRE");
        for ( i = 0; i < tam; i++){
            for ( i = 0; i < tam; i++ ) {
                do{
                    if ( Vet [ i ] == 0 )
                        Vet [ i ] = tam;
                    a = Vet [ i ];
                    PRETO
                    gotoxy(17, i + 7);
                    printf("%d", a );
                    VERMELHO
                    printf(" %18d ", QUADR ( a ) );
                    ROXO
                    printf(" %14d ", CUBO ( a ) );
                    gotoxy(64, i + 7);
                    CINZA
                    par
                    printf("Par" );
                    impar
                    printf("Ímpar" );
                    i++;
                    x++;
                    Sleep(1800);
                    break;
                }while ( x < tam );
                i = i - 1;
            }
            i = i - 1;
        }
        y++;
        Sleep(1800);
        VERMELHO
        gotoxy(26, 20);
        printf("Por: ");
        AZUL
        printf("Samuel Lima");
        PRETO
        gotoxy(26, 21);
        printf("sa_sp10@hotmail.com");
        Sleep(1800);
        VERMELHO
        gotoxy(37, 23);
        printf("MUITO OBRIGADO");
        getche();
    }while ( y < 1 );
    return 0;
}



Nenhum comentário:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.