Gabarito de Lista de Exercícios
Solução:
int EDivisivel(int a, int b)
{
if (a%b)
return 0;
else
return 1;
}
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);
}
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.
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]);
}
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:
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);
}