9.1
Linguagem C
25.ª Edição Atualizada e Aumentada
FCA Editora (c) 2025
9.1
FCA Editora (c) 2025
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.
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: }
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: }