Ir ao conteúdo
  • Cadastre-se

Macro


E.M.I.C.I.D.A

Posts recomendados

ScreenBlack, obrigado pela resposta , ajudou muito !

Bom, meu professor quer que eu faça uma macro que representa os dígitos (0 a 9) num vetor de char com o nome x (representados na tabela ASCII)

Para isso, preciso entender bem como funciona a macro para resolver tal problema.

Então vou continuar com o exemplo das vogais.

Tentei fazer uma macro, representado em um programa no qual ele mostra se a letra digitada é uma vogal ou não.

Mas, infelizmente não está dando certo, pois na hora que eu vou compilar,acusa que a variáel "letra" (definida como CHAR) não foi declarada.

O que pode estar acontecendo com meu programa ?



#include <stdio.h>
#include <conio.h>
void main (){

char letra;

#define VOGAL 'a' || 'e' || 'i' || 'o' || 'u' ;

printf ("Digite uma letra ");
scanf ("%c",&letra);

if letra == VOGAL {

printf ("E VOGAL");
}
else
{
printf ("NAO E VOGAL");
}
}

Obrigado.

Att,

Roger Mayer

Link para o comentário
Compartilhar em outros sites

Segue duas maneiras de se fazer.

Primeira, declarando uma macro com conteúdo estático para a função:


#include <stdio.h>
#include <conio.h>

#define VOGAL letra == 'a' || letra == 'e' || letra == 'i' || letra == 'o' || letra == 'u'

int main(void)
{

char letra;

printf("Digite uma letra: ");
scanf("%c", &letra);

if ( VOGAL )
printf("E VOGAL\n");
else
printf("NAO E VOGAL\n");

return 0;
}

Segunda, usando uma função macro:


#include <stdio.h>
#include <conio.h>

#define VOGAL(x) x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u'

int main()
{

char letra;

printf ("Digite uma letra ");
scanf ("%c",&letra);

if ( VOGAL(letra) )
printf("E VOGAL\n");
else
printf ("NAO E VOGAL\n");

return 0;
}

Link para o comentário
Compartilhar em outros sites

Bom, pelo que eu particularmente entendi do programa, uma macro tem que estar dentro de uma função para devolver um valor, correto ? ou não necessariamente ?

Porque você colocou um int main (void)

O "int" antes do main, siginifica que é uma função. Portanto, porque você colocou o "void" dentro do parâmetro do main, sendo que é uma função de inteiros ?

E outra, o "return" você deu como "0" , porque desse zero ?

Eu pergunto, é porque eu não consigo ficar com uma dúvida. Isso irá me prejudicar se ficar comigo... Pois pretendo seguir esta profissão, de programador.

Obrigado.

Att,

Roger Mayer

Link para o comentário
Compartilhar em outros sites

1) Macro: É uma maneira de declarar um conteúdo de forma estática. Ela será interpretada no momento da compilação, fazendo com que o compilador troque qualquer macro encontrada pelo conteúdo dela, tornado esse conteúdo estático no código binário.

2) "int main(void)": Sempre que iniciamos um programa, é feita uma chamada ao sistema operacional para alocar memória heap para hospedar o código binário, e aguarda um retorno para a finalicação, que será o 'int'. Esse retorno dirá para o sistema operacional se o programa finalizou corretamente (valor zero), ou não (valor um ou maior).

3) "int main(void)": O parâmetro 'void' na chamada do 'main()', significa dizer ao programa que, estou afirmando não haver parâmetros de entrada. Não mais é do que aplicar uma boa prática de programação.

Link para o comentário
Compartilhar em outros sites

No segundo exeplo que você me deu,

Você colocou um x ao lado da VOGAL:


#define VOGAL(x) x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u'

Para que serve no caso esse X entre parênteses ?

Porque , assim , o meu objetivo é fazer o que está no enunciado a seguir :

" Na tabela ASCII as constantes decimais dos dígitos de 0

a 9 são 48 a 57, respectivamente. Como definimos uma

macro que representa os dígitos (0 a 9) num vetor de char

com nome x? "

Não quero o programa pronto, pois tem gente que pega o programa pronto e não aprende nada.

O meu professor disse que só quer a MACRO, não quer o programa.

Eu queria saber também se dentro da macro eu posso ter operações lógicas, como " < , > , >= , <= " ?

Link para o comentário
Compartilhar em outros sites

A macro que você comentou, ela é uma função macro, onde o 'x' é o parâmetro passado e poder fazer as comparações.

Sobre a conversão de caracter pra inteiro (tabela ASCII), na verdade, não é conversão alguma, apenas diferentes maneiras de interpretação no sistema.

Exemplo:


#define VOGAL letra == 'a' || letra == 'e' || letra == 'i' || letra == 'o' || letra == 'u'

Usando comparação com decimal, seria o mesmo que:


#define VOGAL letra == 97 || letra == 101 || letra == 105 || letra == 111 || letra == 117

Em Hexa:


#define VOGAL letra == 0x61 || letra == 0x65 || letra == 0x69 || letra == 0x6F || letra == 0x75

Ou em Binário:


#define VOGAL letra == 0b1100001 || letra == 0b1100101 || letra == 0b1101001 || letra == 0b1101111 || letra == 0b1110101

No fundo, tudo isso será interpretado de maneira binária dentro do sistema, então, o que muda é o programador poder decidir de que maneira (binario, decimal, octal, hexa, ...) vai passar esse valor para o sistema.

Link para o comentário
Compartilhar em outros sites

Então, se eu fizesse no enunciado que ele passou da maneira que está a baixo:

#define ASCII (n) n == 48 || n == 49 || n == 50 || n == 51 || n == 52 || n == 53 || n == 54 || n == 55 || n == 56 || n == 57

Estaria certo ?

O que eu tambem não entendi no enunciado foi, "num vetor de char com nome x".

Poderia me explicar por gentileza ?

Obrigado.

Att,

Roger Mayer

Link para o comentário
Compartilhar em outros sites

Muito Obrigado ScreenBlack.

É dessa forma que eu queria entender o exercício, sendo explicado e não dado de bandeja.

E como resultado, adquiri mais conhecimento , por ter pensado mais e pesquisado.

Agradeço pela sua atenção e ter compartilhado sua sabedoria em C.

Att,

Roger Mayer

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!