Você está na página 1de 2

CEFET-CE - Engenharia da Computação

Grupo de Estudo - Linguagem C

Lista de Exercı́cios - Funções

25 de junho de 2008

1. Escreva um função que retorne o menor número entre números de ponto flutuante.
2. Escreva uma função que utilize um valor inteiro e retorna o número com seus digitos invertidos. Por
exemplo, dado o número 7631, a função deve retornar 1367.
3. Escreva um programa que simule o lançamento de uma moeda. Para cada lançamento da moeda, o
programa deve imprimir Cara ou Coroa. Deixe o programa lançar a moeda 100 vezes e conte o número
de vezes que cada lado da moeda aparece. Imprima os resultados. O programa deve chamar uma função
separada jogada que não utiliza argumentos e retorna 0 para coroa e 1 para cara. Nota: Se o programa
simular realisticamente o lançamento da moeda, cada da moeda deve aparecer aproximadamente metade
do tempo, totalizando 50 caras e 50 coroas.

4. Escreva um programa que faça o jogo de ’advinhar um número’ da forma que se segue: Seu programa
escolhe um número para ser advinhado selecionando um inteiro aleatoriamente no intervalo de 1 a 1000.
O programa então escreve:
Tenho um numero de 1 a 1000
Voce pode advinhar meu numero?
Por favor, digite seu primeiro palpite.
O jogador digita então o primeiro palpite. O programa uma das resposta seguintes:
1. Execelente! Voce adivinhou o numero!
2. Muito baixo. Tente novamente.
3. Muito alto. Tente novamente.
Se o palpite do jogador estiver incorreto, seu programa deve fazer um loop até que o jogador acerte o
número. Seu programa deve continuar dizendo Muito baixo ou Muito alto para ajudar o jogador
a ’chegar’ na resposta correta. Nota: A técnica de busca utilizada nesse programa é chamada pesquisa
binária.
5. A série de Fibonacci

0, 1, 1, 2, 3, 5, 8, 13, 21, ...

começa com ostermos 0 e 1 e tem a propriedade de que cada termo subseqüente é a soma dos dois termos
precedentes.
(a) Escreva uma função não-recursiva fibonacci(n) que calcula n-ésimo número de Fibonacci.
(b) Determinie o maior número de Fibonacci que pode ser impresso em seu sistema. Modifique o pro-
grama do item anterior para usar double em vez de int para calcular e retornar os números de
Fibonacci. Deixe o programa rodar até que seja encerrado por atingir um número excessivamente
alto.
6. O maior divisor comum dos inteiros x e y é o maior inteiro que divide precisamente x e y. Escreva
uma função recursiva mdc que retorne o maior divisor comum de x e y. O maior divisor comum de x
e y é definido recursivamente como se segue: Se y for igual a 0, então o mdc (x, y) é x; de outra
forma mdc (x, y) é mdc (y, x % y) onde % é o operador resto (modulus).
7. Escreva uma função distancia) que calcule a distância entre dois pontos (x1 , y1 ) e (x2 , y2 ). Todos os
números e valores de retorno devem ser do tipo float.

1
8. O que faz o seguinte programa?

int misterio (int, int);

main()
{
int x, y;
printf ("Entre com dois inteiros:");
scanf ("%d%d", &x, &y);
printf ("O resultado e %d \n", misterio (x, y));
return 0;
}
/*O parametro b deve ser um inteiro positivo para evitar recursao
infinita */
int misterio (int a, int b)
{
if (b == 1) return a;
else return a + misterio (a, b - 1);
}
9. Escreva uma função recursiva potencia(base, expoente) que, quando chamada, retorna baseexpoente
Por exemplo, potencia(3, 4) = 3 * 3 * 3 * 3). Assuma que expoente é um inteiro maior
igual a 1. Sugestão: A etapa de recursão usaria o relacionamento baseexpoente = base.baseexpoente−1 e a
condição de encerramento ocorre quando expoente for igual a 1 porque: base1 = base
10. Todo estudante de computação deve lidar com determinados problemas clássicos, e o problema das Torres
Hanói é um dos mais famosos. Diz a lenda que em um templo no Extremo Oriente os sacredotes estão
tentando mover um pilha de discos de um pino para outro. A pilha inicial tinha 64 discos colocados em
um pino e organizados na ordem decrescente, da base para o topo. Os sacerdotes estão tentando mover
a pilha desse pino para um segundo pino com a restrição de que exatamente um discodeve ser movido de
cada vez e em nenhum momento um disco maior pode ser colocado sobre um menor. Há um terceiro pino
disponı́vel para colocação temporária dos discos. Teoricamente o mundo terminará qundo os sacerdotes
terminarem a sua tarefa, portanto há pouco estı́mulo para facilitarmos os seus esforços.
Vamos assumir que os sacerdotes estão tentando mover os discos do pino 1 para o pino 3. Desejamos
desenvolver um algoritmo que imprimirá a seqüência exata de transferências de discos de um pino para
outro.
Se fôssemos solucionar este problema com os métodos convencionais, rapidamente nos encontrariamos
perdidos lidando com os discos. Em vez disso, se solucionarmos o problema com a recursão em mente, ele
se torna imediatamente viável. Mover n discos pode ser considerado em termos de mover apenas n − 1
discos (daı́ a recursão) como se segue:
• Mova n − 1 discos no pino 1 para o pino 2, usando o pino 3 como área de armazenamento temporário.
• Mova o último disco (o maior) do pino 1 para o pino 3.
• Mova os n − 1 discos do pino 2 para o pino 3, usando o pino 1 como área de armazenamento
temporário.
O processo termina quandoa última tarefa envolver mover n = 1 disco, i.e., o caso básico. Isso é realizado
movendo simplesmente o disco para o destino final, sem a necessidade de um área de armazenamento
temporário.
Escreva um programa recursivo para resolver o problema que receba os seguintes parâmetros?
• O número de discos a serem movidos
• O pino no qual esses discos estão colocados inicialmente
• O pino para o qual essa pilha deve ser movida
• E o pino usado como área de armazenamento temporário
Seu programa deve imprimir instruções precisas e necessárias para mover os discos do pino inicial para o
pino de destino.
Por exemplo, para mover um pilha de três discos do pino 1 para o pino 3, se programa deve imprimir a
seguinte seqüência de comandos:
13/12/32/13/21/23/13