Curso de C

Gabarito de Lista de Exercícios

 Aula 6: Funções

Clique aqui para acessar a Lista 6

 

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)
   return 0;
else
   return 1;
}
 

Exercício 2: 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;
}
main()
{
int first = 0, sec = 50;
num = 10;
/* first = 0
   sec =  50
   num = 10        */
num += func(first, sec); /* num = -15 + 25 ok? */
/* first = 0
   sec =  50
   num =  10       */
printf("\n\nConfira!! num = %d\tfirst = %d\t sec = %d\n",num, first, sec);
}
 

Exercício 3: Página c770.html

Enunciado:
Escreva um programa que leia uma matriz pelo teclado e a apresente na tela. Use uma função (lematriz(int *mat)) para fazer a leitura da matriz.

Solução:
#include <stdio.h>
#define MAX 3
void lematriz(int *p)
{
int i, j;
printf("\n\nEntre com a matriz (%dX%d): \n", MAX, MAX);
for(i=0; i<MAX; i++)
  for(j=0; j<MAX; j++)
    scanf("%d", p+(i*MAX+j));
}
void mostramatriz(int mat[MAX][MAX])
{
int i, j;
printf("\n\nMatriz digitada:\n");
for(i=0; i<MAX; i++)
  {
  for(j=0; j<MAX; j++)
    printf("%d   ", mat[i][j]);
  printf("\n");
  }
}

main()
{
int mat[MAX][MAX];
lematriz(&mat[0][0]);
printf("\n");
mostramatriz(mat);
}

Comentários:
Ao chamar a função lematriz(), eu passo somente o endereço da primeira posição da matriz. Isto acontece porque pela aritmética de ponteiros (somando números
a ponteiros) eu posso acessar todas as posições da matriz, se eu conhecer as suas dimensões.
 

Exercício 4: Página c790.html

Enunciado:
Escreva um programa que faça usodos parâmetros argc e argv. O programa deverá receber a partir da linha de comando o dia, mes e ano correntes, e imprimir a data em formato apropriado.

Solução:
#include <stdio.h>
#include <stdlib.h>

void main(int argc, char *argv[]) {
int mes;
char nomemes[12][15] = {"Janeiro", "Fevereiro", "Março", "Abril", "Maio",
                        "Junho", "Julho", "Agosto", "Setembro", "Outubro",
                        "Novembro", "Dezembro"};
/* argv[0] é o nome do programa executavel
   argv[1] é o primeiro parâmetro
   (etc.)                                    */

mes = atoi(argv[2]);
if (mes<1 || mes>12)
    printf("Erro!");
else
  printf("\n%s de %s de 19%s", argv[1], nomemes[mes-1], argv[3]);
}
 

Exercícios de Fixação:

Exercício 1:
Verifique o erro que ocorre na seguinte função. Apresente uma solução para que ela trabalhe corretamente.

void swap(int a, int b)
{
int aux;
aux = a;
a = b;
b = aux;
}

Solução:
O erro na função acima é uma sutileza. A função funciona, mas como passa os parâmetros normalmente, e o C faz uma cópia dos parâmetros, as alterações
realizadas dentro da função não são repassadas para o programa que chama a função. O problema pode ser facilmente resolvido usando-se apontadores.

void swap(int *a, int *b)
{
int aux;
aux = *a;
*a = *b;
*b = aux;
}

Desta forma, estaremos mudando o valor armazenado no endereço de a e b, e assim, quando o programa sair da função, vai continuar com os valores de a e b alterados.
 

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 do Arranjo. 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);
}
 

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 ( ((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 de recursividade é o de encontrar o enésimo termo da sequência de Fibonacci. As séries de Fibonacci são de grande importância matemática. A lei básica é que, a partir do terceiro termo, todos os termos são a soma dos dois últimos. A seguir são apresentados os primeiros termos da sequência.
F = {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 próximo é 5 (3+2). E assim sucessivamente.
Faça um programa que encontre o enésimo termo da sequê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);
}
 

  Sumário

Dúvidas? Dê uma olhadinha em nosso FAQ

Perguntas para a lista do Curso de C
Curso de C do CPDEE/UFMG - 1996-1998