Gabarito da 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) /* 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");
}
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!
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çãoSoluçã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