13.1
EXERCÍCIOS PROPOSTOS – SOLUÇÃO
13.1.1 Apresentam-se duas possíveis soluções para a macro:
6: #define Val_Iva(preco) (((preco)<100) ? \ 7: ((preco)*TAXA_IVA1/100.0) : \ 8: ((preco)*TAXA_IVA2/100.0))
10: #define Val_Iva_Alt(preco) \ 11: ((preco)*(((preco)<100) ? TAXA_IVA1 : TAXA_IVA2)/100.0)
1: #include <stdio.h>
2:
3: #define TAXA_IVA1 5
4: #define TAXA_IVA2 23
5:
6: #define Val_Iva(preco) (((preco)<100) ? \ 7: ((preco)*TAXA_IVA1/100.0) : \ 8: ((preco)*TAXA_IVA2/100.0))
9:
10: #define Val_Iva_Alt(preco) \ 11: ((preco)*(((preco)<100) ? TAXA_IVA1 : TAXA_IVA2)/100.0)
12:
13: int main(void)
14: { 15: int preco = 90; 16: double preco2 = 1000; 17:
18: printf("Preco=%d Iva=%.2lf\n", preco, Val_Iva(preco)); 19: printf("Preco=%d Iva=%.2lf\n", preco, Val_Iva_Alt(preco)); 20:
21: printf("Preco=%d Iva=%.2f\n", preco, Val_Iva(preco2)); 22: printf("Preco=%d Iva=%.2f\n", preco, Val_Iva_Alt(preco2)); 23:
24: return 0; 25: }
$ prog1320
Preco=90 Iva=4.50
Preco=90 Iva=4.50
Preco=90 Iva=230.00
Preco=90 Iva=230.00
13.1.2 Note que o valor de x nem sequer está ainda definido. Mas isto não nos importa, pois apenas queremos ver a expansão realizada para a macro (consideremos a primeira versão apresentada em 13.1.1):
int main(void) { int x, y=2;
13.2
printf("\nPreço=%f", (((x+y)<100) ? ((x+y)*5/100.0) : ((x+y)*23/100.0))); return 0; }
1. Edição do código.
2. Pré-processamento.
3. Compilação.
4. “Linkagem”.
5. Execução da aplicação.
13.3
13.4
13.3.1
13.3.2
#define ZAP(x,v1,v2) (((x)<=0) ? ((x)*(v1)) : ((x)*(-(v2))))
main() { int i, j = (int) 'a'; i = (((i+j)<=0) ? ((i+j)*(43 -1)) : ((i+j)*(-(-1 -1)))); }
13.4.1 Porque o papel do pré-processador consiste em fazer a substituição das macros pelas expressões que lhe seguem. Além disso, o pré-processador não sabe C, logo, não consegue perceber o que é um inteiro ou um double ; limita-se a substituir “cegamente” os argumentos colocados na macro pela expressão nela definida. O pré-processador pode ser utilizado por outras linguagens para realizar substituições de expressões.
13.4.2
13.4.3
13.4.4
#define toupper(ch) ((ch)>='a' && (ch)<='z' ? (ch) + 'A' - 'a' : (ch))
int main(void) { int ch=65; printf("%c %c", (('A'+2)>='a' && ('A'+2)<='z' ? ('A'+2) + 'A' - 'a' : ('A'+2)),(('Z'+'a'-ch)>='a' && ('Z'+'a'-ch)<='z' ? ('Z'+'a'-ch) + 'A' - 'a' : ('Z'+'a'-ch))); return 0; }
#include <stdio.h>
#define toupper(ch) ((ch)>='a' && (ch)<='z' ? (ch) + 'A' - 'a' : (ch))
#define FIRST 'A'
#define LAST 'Z'
int main(void)
13.5
{ int ch=65; /* ASCII do 'A' */ printf("%c %c", toupper(FIRST+2), toupper(LAST+'a'-ch)); return 0; }
PROG1323.C
$ prog1323 C Z
a) Falso.
b) Falso.
c) Verdadeiro.
d) Verdadeiro.
13.6
#define INVERSO(x) ((x)==0 ? (x) : (1/(x)))
13.7 O output será: 0 0 . De notar que a divisão envolvida é a divisão inteira.
13.8
13.8.1
13.9
13.8.2
#include <stdio.h>
#define TAXA_IVA1 5
#define TAXA_IVA2 23
#define VALOR_IVA(valor) \ ((valor) * \ (((valor)<1000)? TAXA_IVA1 : TAXA_IVA2) \ / 100.0 \ )
int main(void)
{ int x, y=3; printf("Valor=%f\n", ((x+y) * (((x+y)<1000)? 5 : 23) / 100.0 )); return 0; }
// Nota: Use cc -E nomefich.c para obter o resultado gerado pelo pré-processador
#define ABS(x) ((x)>=0 ? (x) : -(x))
#define VIZINHANCA(x, y, delta) (ABS((x)-(y))<(delta))