Gabarito da Lista 6


Módulo 6:  Aula 7: Funções

Exercício 1: Página c720.html

Enunciado:
Escreva a função EDivisivel(int a, int b). A função deverá retornar 1 se o resto da divisão de a por b for zero. Caso contrário, a função deverá retornar zero.

Solução:

int EDivisivel(int a, int b)
{
if (a%b)       /* Se houver resto, nao e' divisivel */
   return 0;
else                     / * Nao havendo resto, e' divisivel */
   return 1;
}

Exercício 2: Página c750.html

Enunciado:
Escreva um programa que faça uso da função EDivisivel(int a, int b), criada na página c720.html.
Organize o seu programa em três arquivos: o arquivo prog.c , conterá o programa principal; o arquivo
func.c conterá a função; o arquivo func.h conterá o protótipo da função. Compile os arquivos e gere o
executável a partir deles.

Solução:
a) conteúdo do arquivo func.c

int EDivisivel(int a, int b)

{
  if (a%b)       /* Se houver resto, nao e' divisivel */
     return 0;
  else                     / * Nao havendo resto, e' divisivel */
     return 1;
}

b) conteúdo do arquivo func.h

int EDivisivel(int a, int b);

c) conteúdo do arquivo prog.c

#include <stdio.h>
#include "func.h"

void main()
{
    int a, b;
    printf (" Entre com dois números inteiros para testar se o primeiro e' divisivel pelo segundo:  ");
    scanf("%d %d", &a, &b);
    if(Edivisivel(a,b))
        printf("O primeiro numero e' divisivel pelo segundo");
    else
        printf("O primeiro numero nao e' divisivel pelo segundo");
}
 

Exercício 3: Página c760.html

Enunciado:
Estude o seguinte programa e aponte o valor de cada variável sempre que solicitado:

Solução:
#include <stdio.h>
int num;
int func(int a, int b)
{
    /* a = 0 */
    a = (a+b)/2;
    /* a = 25 e num = 10 */
    num -= a;
    /* a = 25 e num = -15 */
    return a;
}
int main()
{
    int first = 0, sec = 50;
    num = 10;
    /* first = 0
        sec =  50
        num = 10        */
    num += func(first, sec); /*  LINHA ###  num = -15 + 25 ok? */
    /* first = 0
       sec =  50
       num =  10       */
    printf("\n\nConfira!! num = %d\tfirst = %d\t sec = %d\n",num, first, sec);
    return 0;
}

 
Comentários: no início do programa first=0, sec=50, num=10. Ao se chegar na linha marcada com ###, a função func deve ser avaliada. Dentro de func, num  tem seu valor alterado para -15 e esta alteração se reflete no programa principal pelo fato de num ser uma variável global. O retorno de func é igual a 25 e, assim, ao retornar de func, teremos o operador += avaliado e o resultado, armazenado em num sera' 10. Este programa mostra claramente que o comportamento de variáveis globais é difícial de ser acompanhado, pois estas variáveis podem estar sendo modificadas dentro de funções. Para saber se a variável é  modificada ou não devemos seguir o código da função chamada linha a linha!
 

Exercício 4: Página c770.html

Enunciado:
Escreva uma função que receba duas variáveis inteiras e "zere" o valor das variáveis.  Use o que você aprendeu nesta página para fazer a implementação

Solução:

Para modificar o conteúdo de uma variável de uma função é necessário passar o endereço da variável para a função, conforme é feito abaixo:
 

#include <stdio.h>

void Zera(int *a, int *b)
{
 *a=*b=0;
}

void main()
{
   int a, b;
   printf("Digite dois numeros inteiros: ");
   scanf("%d %d", &a, &b);
   printf("\nNumeros digitados: %d, %d",a,b);
   Zera(&a,&b);    /* passando os endereços de a e b para a função */
   printf("\n\nOs numeros agora valem %d e %d",a,b);
}
 

Exercício 5: Página c780.html

Enunciado:
Escreva um programa que leia um vetor de inteiros pelo teclado e o apresente na tela. Crie uma função(void levetor(int *vet, int dimensao)) para fazer a leitura do vetor.

Solução:

#include <stdio.h>

#define MAX 10                         /* dimensão do vetor */

void levetor(int *vet, int dimensao);  /* protótipo de levetor */

void main()
{
 int i;
   int vet[MAX];
   levetor(vet, MAX);   /* Para passar um vetor como parametro e' necessario
                           apenas passar o endereco de seu primeiro elemento */

   printf("Os numeros lidos foram \n");
   for (i=0; i<MAX; i++) printf("%d ", vet[i]);
}
 

void levetor(int *vet,          /* Endereco de inicio do vetor */
             int dimensao )     /* tamanho do vetor */
{
   int i;
   printf("Digite os %d valores a serem armazenados no vetor ", dimensao);
   for (i=0 ; i < dimensao ; i++) scanf("%d",(vet+i));
}

Exercicios adicionais:

Exercício 1:
Escreva uma função que receba duas strings como argumentos e troque o conteúdo da primeira string com o conteúdo da segunda.

#include <stdio.h>
#include <string.h>

#define STRMAX 50

void troca_string (char *str_a, char *str_b)
{
  char strtemp[STRMAX];  /* string temporaria usada para a troca */

  strcpy (strtemp, str_a);
  strcpy (str_a, str_b);
  strcpy (str_b, strtemp);
}

void main (void)
{
  char string1[STRMAX], string2[STRMAX];

  printf ("Entre com a primeira string: ");
  gets (string1);
  printf ("\nEntre com a segunda string: ");
  gets (string2);
  troca_string (string1, string2);
  printf ("\nA primeira string agora e: %s\nA segunda string agora e: %s", string1, string2);
}

Exercício 2:
Das teorias da Análise Combinatória, temos que o Arranjo Simples de n, de p em p pode ser calculado pela expressão:  :       

                   n!
 
Arranjo(n,p) =  ---------
                  
                p!*(n-p)!

Faça um programa que leia os valores de n e p pelo teclado, e calcule o valor da combinação. Utilize a função fatorial fornecida nas páginas (ou se preferir, implemente a sua). Verifique a dificuldade deste programa sem a utilização de funções.

Solução:
#include <stdio.h>
int fat(int n)
{
    if (n>1)
      return n*fat(n-1);
    else return 1;
}

void main ()
{
    int n, p;
    float arranjo;
    printf("\n\nEntre com n e p: ");
    scanf("%d %d", &n, &p);
    arranjo = fat(n)/(fat(p)*fat(n-p));
    printf("\n O arranjo de %d de %d em %d eh %f\n", n, p, p,arranjo);
}
 
Este problema, bastante simples com o uso de funções se tornaria bastante complicado sem o uso delas, pois teriamos que escrever o código de fat "inline", o que seria complicado, pelo fato de fat ser recursiva (teríamos, na realidade, de modificar o algoritmo de cálculo de fat).

Exercício 3:
Faça um programa que utilize os argumentos argv e argc. O programa deverá receber dois números e apresentar a soma dos dois. Veja que para isto você deverá ter também uma função que transforme uma string em um inteiro, pois o tipo de argv é char; logo você irá receber strings e deverá transformá-las em inteiros antes de somá-las.

Solução:

#include <stdio.h>
#include <stdlib.h>
void main (int argc, char *argv[])
{
    int numa, numb;
    if (argc !=3)
        printf(" Para usar, voce tem que passar dois parametros \n");
    else
    {
        if ( ((numa = atoi(argv[1])) == 0) ||
             ((numb = atoi(argv[2])) == 0) )
           printf("\n\nArgumentos invalidos!! \n");
        else
           printf("\n\nA soma de %d e %d eh %d\n\n",numa, numb, numa+numb);
    }
}

Comentários:
Para a transformação dos números que estavam em argv[] para int, usou-se a função atoi() da biblioteca stdlib.h, que recebe um argumento do tipo char * e retorna o int correspondente, caso a string represente um número. Caso o valor retornado por atoi seja nulo, indica que o argumento passado foi inválido.
 

Exercício 4: As séries de Fibonacci
Um problema tradicional  é o de encontrar o enésimo termo da série de Fibonacci. As series de Fibonacci são de grande importância matemática, e a lei básica é que a partir do terceiro termo, todos os termos são a soma dos dois últimos. Os primeiros termos da seqüência são:  1, 1, 2, 3, 5, 8, 13, 21, 34...  O primeiro e o segundo termos são 1. O terceiro termo é 2 (1+1). O quarto termo é 3 (1+2). O quinto termo é 5 (2+3) ... Faça uma função que encontre o enésimo termo da seqüência de Fibonacci. Use recursividade.

Solução:

#include <stdio.h>
int fib(int n)
{
  if (n>2) return fib(n-1)+fib(n-2);
     else return 1;
}
void main()
{
  int n, fibon;
  printf("\n\nEntre com um numero: ");
  scanf("%d", &n);
  fibon = fib(n);
  printf("\nO termo %d da serie de Fibonacci e: %d\n", n, fibon);
}
 


Curso de C do CPDEE/UFMG - 1996-1999