Linguagem C_Exercicios Propostos Solucao_9

Page 1


9.1

Linguagem C

25.ª Edição Atualizada e Aumentada

FCA Editora (c) 2025

EXERCÍCIOS PROPOSTOS – SOLUÇÃO

Pergunta: Na função isZero, queremos alterar o parâmetro n?

Resposta: Não, queremos apenas verificar se o seu valor é zero ou não. Por isso, não há necessidade de passar o endereço da variável:

int isZero(int n) /* n - Parâmetro de input */ { return n==0; }

Pergunta: Na função add1, queremos alterar o parâmetro n?

Resposta: Sim, pois queremos adicionar 1 unidade ao valor que este já contém. Temos, pois, de passar o endereço da variável:

void add1(int *n) /* n - Parâmetro de input/Output */ { (*n)++; }

Pergunta: Na função setZero, queremos alterar o parâmetro n?

Resposta: Sim, pois queremos colocar o valor zero no parâmetro, independentemente do valor que este traga de fora. Temos, por isso, de passar o endereço da variável:

void setZero(int *n) /* n - Parâmetro de Output */ { *n = 0; }

Diz-se que um parâmetro é de input , se o valor que contém é essencial para o processamento da função. Nos exemplos anteriores, as funções isZero e add1 usam o valor existente no parâmetro para o processamento. Diz-se que um parâmetro é de output , se o valor deste é alterado dentro da função e enviado para fora desta. Nos exemplos anteriores, as funções add1 e setZero alteram o valor existente no parâmetro. Diz-se que um parâmetro é de input/ /output , se o valor trazido por este é essencial para o processamento da função e sai da função alterado. É o caso do parâmetro da função add1. De notar que, se a palavra output existir no tipo de parâmetro (isto é, o parâmetro vai sair alterado), então, devemos enviar um endereço para a função.

1: #include <stdio.h>

2:

3: int Ler_Inteiro(char *prompt)

4: { 5: int n;

6: do

7: { 8: printf("%s", prompt); 9: scanf("%d", &n); 10: } 11: while (n<0); 12: return n; 13: }

14:

15: int main(void)

16: { 17: int idade, total; 18: idade = Ler_Inteiro("Introd. a Idade: "); 19: total = Ler_Inteiro("Qual o Total a Depositar: "); 20:

21: printf("Idade: %d Total: %d\n", idade, total); 22:

23: return 0; 24: }

PROG0909.C 9.3

1: #include <stdio.h>

2:

3: void Ler_Inteiro(char *prompt, int *ptr)

4: { 5: do

6: { 7: printf("%s", prompt); 8: scanf("%d", ptr); // sem & pois já é um endereço 9: } 10: while (*ptr<0); 11: }

12:

13: int main(void)

14: { 15: int idade, total; 16: Ler_Inteiro("Introd. a Idade: ", &idade); 17: Ler_Inteiro("Qual o Total a Depositar: ", &total); 18:

19: printf("Idade: %d Total: %d\n", idade, total); 20: 21: return 0; 22: }

Note que se pretende alterar a variável que enviamos para a função. Temos, por isso, de enviar o seu endereço, o qual é recebido na função e colocado no apontador ptr. Repare bem na chamada à função scanf, que é realizada dentro da função Ler_Inteiro, e verifique que para ler o inteiro não se colocou o & antes da variável ptr, pois esta já contém o endereço que queremos enviar para a função scanf, local onde esta irá colocar o inteiro lido e validado.

PROG0910.C

9.4

1: #include <stdio.h>

2:

3: long int fib(int n)

4: {

5: int i;

6: long n1, n2, tmp;

7:

8: if (n<0)

9: return -1L; /* Parâmetro Inválido */ 10: if (n<=1)

11: return (long) n; 12:

13: for (i=2, n1=n2=1L ; i<n ; i++)

14: { 15: tmp = n1; 16: n1 = n2; 17: n2 = n1 + tmp; 18: }

19:

20: return n1+n2; 21: }

22:

23: int main(void)

24: { 25: int n;

26: while(1)

27: { 28: printf("Introd. um inteiro: ");

29: scanf("%d", &n);

30: if (n<0) break;

31: printf("Fibonacci(%d) --> %ld\n", n, fib(n));

32: }

33:

34: return 0;

35: }

PROG0911.C

A função devolve um valor do tipo long int , pois o resultado de uma invocação pode resultar num número muito grande, podendo não caber apenas num inteiro. A instrução return 1L ; é equivalente a return (long) 1; e consiste em devolver o valor 1 não como int , mas como long int

9.5 Neste exercício, temos de definir o cabeçalho da função, bem como os seus parâmetros. Como é indicado no enunciado, todos os parâmetros são do tipo inteiro. Se realizarmos apenas operações entre inteiros, iremos devolver sempre um valor inteiro como resultado. No entanto, pretende-se que seja devolvido um valor real (double ). Para tal, a divisão não poderá ser inteira. Teremos de fazer o cast de um dos valores para double e a divisão entre valores reais, e não entre inteiros. A função terá de receber como parâmetros a informação necessária ao cálculo do somatório, isto é, os valores de a e de n. Note que o valor de i não deve ser um parâmetro, pois varia sempre entre 1 e o parâmetro n, devendo ser apenas uma variável local:

1: double Exp(int n, int a)

2: {

3: double res=0;

4: for (int i=1 ; i<=n ; i++)

5: res += (a+((double)i)/n)*(a+((double)i)/n); 6: 7: return res; 8: }

9.6

1: #include <stdio.h>

2:

3: int main(int argc, char** argv, char **env)

4: {

5: while (*env)

6: puts(*env++);

7: return 0; 8: }

9.7

1: #include <stdio.h>

2: #include <string.h>

3:

4: int main(int argc, char** argv, char **env)

5: {

6: while (*env)

7: puts(strchr(*env++, '=')+1);

8: return 0; 9: }

PROG0912.C
PROG0913.C

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.