Linguagem C_Exercicios Propostos Solucao_13

Page 1


13.1

Linguagem C

25.ª Edição Atualizada e Aumentada

FCA Editora (c) 2025

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;

PROG1320.C

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))

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.