Exercícios sobre funções em C

Resolva as seguintes questões usando conceitos funções, de return, de números aleatórios e paramêtros/argumentos:

0. Crie uma função que receba um valor e informe se ele é positivo ou não.

1. Crie uma função que receba um valor e diga se é nulo ou não.

2. Crie uma função que receba três valores, 'a', 'b' e 'c', que são os coeficientes de uma equação do segundo grau e retorne o valor do delta, que é dado por 'b² - 4ac'

3. Usando as 3 funções acima, crie um aplicativo que calcula as raízes de uma equação do 2o grau:
ax² + bx + c=0
Para ela existir, o coeficiente 'a' deve ser diferente de zero.
Caso o delta seja maior ou igual a zero, as raízes serão reais. Caso o delta seja negativo, as reais serão complexas e da forma: x + iy

4. Crie uma função em linguagem C que receba 2 números e retorne o maior valor.

5. Crie uma função em linguagem C que receba 2 números e retorne o menor valor.

6. Crie uma função em linguagem C que receba 3 números e retorne o maior valor, use a função da questão 4.

7. Crie uma função em linguagem C que receba 3 números e retorne o menor valor, use a função da questão 5.

8. Crie uma função em linguagem C chamado Dado() que retorna, através de sorteio, um número de 1 até 6.

9. Use a função da questão passado e lance o dado 1 milhão de vezes. Conte quantas vezes cada número saiu.
A probabilidade deu certo? Ou seja, a porcentagem dos números foi parecida?

10. Crie um aplicativo de conversão entre as temperaturas Celsius e Farenheit.
Primeiro o usuário deve escolher se vai entrar com a temperatura em Célsius ou Farenheit, depois a conversão escolhida é realizada através de um comando SWITCH.
Se C é a temperatura em Célsius e F em farenheit, as fórmulas de conversão são:
C= 5.(F-32)/9
F= (9.C/5) + 32

11. Um professor, muito legal, fez 3 provas durante um semestre mas só vai levar em conta as duas notas mais altas para calcular a média.
Faça uma aplicação em C que peça o valor das 3 notas, mostre como seria a média com essas 3 provas, a média com as 2 notas mais altas, bem como sua nota mais alta e sua nota mais baixa.

Desafio 1: Programe um aplicativo em C que acha todos os números primos até 1000
Número primo é aquele que é divisível somente por 1 e por ele mesmo.

Desafio 2: Programe um aplicativo em C que recebe dois inteiros e retorna o MDC, máximo divisor comum.

Desafio 3: Programe um aplicativo em C que ache todos os números perfeitos até 1000.
Número perfeito é aquele que é a soma de seus fatores. Por exemplo, 6 é divisível por 1, 2 e 3 ao passo que 6 = 1 + 2 + 3.

Desafio 4: Crie um programa em C que receba um número e imprima ele na ordem inversa.
Ou seja, se recebeu o inteiro 123, deve imprimir o inteiro 321.


Soluções com código comentado



21 comentários:

Joao Carlos Agostini disse...

Olá
Onde estão as respostas dos desafios?
Passei dois dias tentando fazer o desafio dos números primos, sem êxito, e gostaria da saber a resposta.
Obrigado.

Samuel Silva disse...

Não entendi o final da questão 9
A probabilidade deu certo? Ou seja, a porcentagem dos números foi parecida?

Anônimo disse...

Número com três algarismos inversos:

#include
#include
#include
/* Desafio respondido por Jeffersson.
JefferssonSa@outlook.com, para trocar ideias :) */
int invertido(int x);
int main()
{
int num,result;
setlocale(LC_ALL, "portuguese");
system("color F0");
printf("Digite um número com três algarismos, ex.: 256\n");
scanf("%d",&num);
system("cls");
invertido(num);
result=invertido(num);
printf("Invertido:\n");
printf("%d\n",result);

}
int invertido(int x){
int unidade,dezena,centena,aux,invertido;
centena = x/100;
aux = x%100;
dezena= aux/10;
unidade = aux%10;
invertido= unidade*100+dezena*10+centena;
return invertido;
}

André de Souza disse...

A probabilidade do meu não está dando certo. sempre uma variavel sai com valor 0. alguem poderia me ajudar? pode ser a minha maquina? o meu codigo? ou os dois?

#include
#include
#include

int dado(){
srand( (unsigned)time(NULL) );
return 1+(rand()%6);
}

int main(void){


double count,count1=0,count2=0,count3=0,count4=0,count5=0,count6=0;

printf("intervalo da rand: [0,%d]\n", RAND_MAX);
//printf("Número sorteado: %d\n",dado());

for(count=1;count<=1000000;count++){

switch (dado())
{
case 1:count1++;
break;
case 2:count2++;
break;
case 3:count3++;
break;
case 4:count4++;
break;
case 5:count5++;
break;
case 6:count6++;
break;

}

}
printf("\t\t TABELA DE RESULTADOS \t\t\n\n");
printf("\tNúmero 1\tNúmero 2\tNúmero 3\n");
printf("\t%.2f \t%.2f \t%.2f \n\n",count1,count2,count3);
printf("\tNúmero 4\tNúmero 5\tNúmero 6\n");
printf("\t%.2f \t%.2f \t%.2f \n",count4,count5,count6);
}

André de Souza disse...

olhando a resposta, eu percebi o porquê da probabilidade não bater.

eu estava gerando uma semente diferente toda vez que rodava o dado, ou seja, eu não estava jogando o dado sob a mesma condição.

André de Souza disse...

realmente ,faltaram as respostas dos desafios...

Anônimo disse...

Aqui o meu codigo pros numeros primos. Eu primeiramente fiz de 1 a 1000 mas depois eu variei ele pra listar todos os numeros primos entre 'a' e 'b' inseridos pelo o usuario. A funçao ficou assim:

void primo(int cont1,int cont2, int verificador,int a, int b, int contlinha)
{
contlinha = 0;
printf("\t");

for(cont1 = a; cont1 < b; cont1++)
{
verificador = 1;
cont2 = 2;
while(verificador == 1 && cont2<cont1)
{
if(cont1%cont2 == 0)
verificador = 0;
else
cont2++;
}
if(verificador == 1)
{
printf("%d ",cont1);
contlinha++;
}
if(contlinha == 10)
{
printf("\n\t");
contlinha = 0;
}
}
}

Me desculpem pela falta de comentario nos codigos por que as linhas tão quebrando quando eu tento comentar aqui e fica estranho, então eu removi. Então tentem entender esse codigo, e se alguem tiver uma solução melhor posta aqui... eu achei que essa ficou um pouco confusa.
O cont1 é o contador que varre todos os numeros entre A e B e o cont2 varre todos os numeros maiores que 1 e menores que cont1, sendo feito o teste de cont1%cont2. Caso cont2 divida cont1 o verificador passa a ser zero e o cont1 não é printado na tela. Caso o cont2 não divida o cont1 atual nenhuma vez, o verificador permanece 1 e o numero primo (atual cont 1) é impresso na tela.

Anônimo disse...

minha resposta do desafio 2 se alguem estiver travado (nao se esqueçam do include):


int menor(int a, int b);
int maior(int a, int b);
int MDC(int a,int b,int cont,int temp);

int main(void)
{

int num1, num2, cont, mdc, temp;

printf("\tPrograma em C que determina o M.D.C entre dois numeros.\n\n");
printf("Insira dois numeros inteiros: ");
scanf("%d",&num1);
scanf(" %d",&num2);

mdc = MDC(num1,num2,cont,temp);

printf("\n");

printf("O maximo divisor comum entre %d e %d e igual a %d\n\n",num1,num2,mdc);
}

int menor(int a, int b)
{
if(a<=b)
return a;
else
return b;
}

int maior(int a, int b)
{
if(a>=b)
return a;
else
return b;
}

int MDC(int a,int b,int cont,int temp)
{
temp = a;
a = menor(a,b);
b = maior(temp,b);

cont = a;

while(b%cont != 0 || a%cont != 0)
{
cont--;
}
return cont;
}

monia tavares disse...

essa é a minha, do desafio 1:
Programe um aplicativo em C que acha todos os números primos até 1000

#include

int primo(int num)
{

int i,quantprim=0;;
for(i=2;i<num;i++)
{

if(num%i==0)
{

quantprim++;
}


}

return quantprim;
}


int contagem()

{
int i;

printf("1-2-"); /* AQUI EU IMPRIMO AUTOMATICAMENTE O 1 E O 2, PORQUE JA SEI QUE ELES SAO PRIMOS */

for(i=3;i<=1000;i++)
{

if (primo(i)==0) /* caso esse retorno seja 0, significa que o i nao tem divisores alem de 1 e ele mesmo. logo
o numero i sera printado*/
{
printf("%d-",i);

}



}



}


int main()
{


contagem();

}


Anônimo disse...

Salve galera aqui esta resposta da questão 10 nao consegui fazer usando o SWITCH.
Se alguém tiver posta ai

#include
#include
int main ()
{
int m,f,c;
printf("PROGRAMA QUE TRANSFORMA TEMPERATURAS\n\nDigite o tipo de transformacao:\n\n");
printf("1- Celsius para Fahrenheit\n");
printf("2- Fahrenheit para Celsius\nOpcao: ");
scanf("%d",&m);
if(m==1)
{
printf("Digite o valor em graus Celsius: ");
scanf("%d",&c);
f=c*2+32;
printf("%d graus celsius sao aproximadamente %d graus Fahrenheit\n\n",c,f);
}
if(m==2)
{
printf("Digite o valor em graus Fahrenheit: ");
scanf("%d",&f);
c=f-32/2;
printf("%d graus Fahrenheit sao aproximadamente %d graus Celsius\n\n",f,c);
}
if((m!=1)&&(m!=2))
{
printf("Esta opcao nao existe, digite outra.\n\n");
}

system ("PAUSE");
return 0;
}

Andreza disse...

Boa tarde, por que no meu 9º o número 6 não sai nenhuma vez?

Não posto o código porque fiz em c# :D

Filip3 disse...

Segue minha resposta da 11.

#include

float Media2Maiores(float num1,float num2,float num3);
float MaiorNota(float num1,float num2,float num3);
float MenorNota(float num1,float num2,float num3);


int main (){

float nota1,nota2,nota3,media,maior,menor;

printf("Digite a nota 1:");
scanf("%f", &nota1);
printf("Digite a nota 2:");
scanf("%f", &nota2);
printf("Digite a nota 3:");
scanf("%f", &nota3);

media = Media2Maiores(nota1,nota2,nota3);
maior = MaiorNota(nota1,nota2,nota3);
menor = MenorNota(nota1,nota2,nota3);


printf("A media das 2 maiores notas eh: %.2f \n", media);
printf("A maior nota eh: %.2f \n", maior);
printf("A menor nota eh: %.2f \n", menor);

return 0;

}



float Media2Maiores (float nota1,float nota2,float nota3){
float result=0;

if (nota1 >= nota2){
if (nota2 >= nota3){
result = (nota1 + nota2)/2;
return result;
}else {
result = (nota1 + nota3)/2;
return result;
}
}else {

if (nota3 >= nota1){
result = (nota2 + nota3) /2;
return result;
}

}

}

float MaiorNota (float num1,float num2,float num3){

float maior;

if(num1 >= num2 && num3){
maior = num1;
return maior;

}else{

if(num2 >= num3){
maior = num2;
return maior;

}else{
maior = num3;
return maior;

}}

}

float MenorNota (float num1,float num2,float num3){

float menor;

if(num1 <= num2 && num3){
menor = num1;
return menor;

}else{

if(num2 >= num3){
menor = num2;
return menor;

}else{
menor = num3;
return menor;

}}

}

Anônimo disse...

/* Tentativa p/ ex 11 */

#include
#include


int n1,n2,n3;
int maior1,maior2,newMedia;
newMedia = 0;
int mediaInicial();
int mediaAltas();
int maiorValor();
int menorValor();


int main() {


printf("Digite a nota 1: \n");
scanf("%d",&n1);
printf("Digite a nota 2: \n");
scanf("%d",&n2);
printf("Digite a nota 3: \n");
scanf("%d",&n3);
printf("A media geral e de: %d\n",mediaInicial());
printf("A media das maiores notas e de: %d\n",mediaAltas(n1,n2,n3));
printf("O maior valor e de : %d\n",maiorValor());
printf("O menor valor e de : %d\n",menorValor());

system("pause");
return 0;
}
int mediaInicial() {
int media;
media = (n1+n2+n3)/3;
return media;
}
int mediaAltas(nota1,nota2,nota3) {

maior1 = 0;
maior2 = 0;

if (nota1 > nota2 && nota1 > nota3) {
maior1 = nota1;
} else if ( nota2 > nota1 && nota2 > nota3) {
maior1 = nota2;
} else if ( nota3 > nota1 && nota3 > nota2) {
maior1 = nota3;
}

if (nota1 != maior1) {
if (nota1 > nota2 || nota1 > nota3) {
maior2 = nota1;
}
} else if (nota2 != maior1) {
if ( nota2 > nota3 || nota2 > nota1) {
maior2 = nota2;
}
} else if (nota3 != maior1) {
if ( nota3 > nota2 || nota3 > nota1) {
maior2 = nota3;
}
}
newMedia = (maior1+maior2)/2;
return newMedia;
}

int maiorValor() {
return maior1;
}

int menorValor() {
if (n1 < n2 && n1 < n3) {
return n1;
} else if ( n2 < n1 && n2 < n3) {
return n2;
} else if ( n3 < n1 && n3 < n2) {
return n3;
}
}


Renan Martins disse...

Resposta desafio 3:

#include
#include

int main()
{
int i,j,k;
printf("Numero: \n");
i=0;
for(i=0;i<1000;i++)
{
k=0;
for (j = 1; j<i; j++)
{
if((i % j) == 0 )
{
k=j+k;
if(k == i)
{
printf("%d\n",i);
}
}
}

}
return 0;
}

Renan Martins disse...

Segue a resposta do desafio 1:
#include
#include
int primos(){
int i,j,k;
for(i=0;i<1000;i++)
{

k=0;
for (j = 1; j<=i; j++)
{
if((i % j) == 0 )
{
k=j+k;
if(k == i+1)
{
printf("%d\n",i);
}
}
}
}
}
int main()
{
int i,j,k;
i=0;

primos();

return 0;
}

Renan Martins disse...


Segue o código do desafio 2:

#include
#include
int primos(int n1, int n2){
int k,j;
k=0;
for (j = 1; j<=n1; j++)
{
if((n1 % j) == 0 &((n2 % j) == 0) )
{
k=j;
}

}
printf("%d",k);
}


int main()
{
int a1,a2;
printf("digite o primeiro numero\n");
scanf("%d",&a1);
printf("digite o segundo numero\n");
scanf("%d",&a2);
printf("O 'MDC' dos dois numeros:\n");
primos(a1,a2);
return 0;
}

João disse...

A minha resolução ao desafio 4. Não está optimizado mas funciona!
#include


void main(){

int i,numero,resto=0,soma=0,aux,dez=1;

printf("Introduza um valor\n");
scanf("%d",&numero);

aux=numero;

for(i=0;aux>0;i++){
aux/=10;
dez*=10;
}
dez/=10;
do{ numero=123 dez=100

resto=numero%10; resto=3----2--- 1
soma+=resto*dez; 321+=1*1-
numero/=10; numero=12--
dez/=10; dez=10-----

}while(numero>0);

printf("%d",soma);

}

Anônimo disse...

#include
#include
#include
#include
//Questão 9
void Dado();
int main()
{
setlocale(LC_ALL,"portuguese");
Dado();
return 0;
}
void Dado()
{
int iCont,iNum,i1=0,i2=0,i3=0,i4=0,i5=0,i6=0;
// time_t t;
srand(time(NULL));

for(iCont=1;iCont<=1000;iCont++)
{
iNum=1+(rand()%6);
printf("%d\n",iNum);
if(iNum==1)
{
i1++;
}
if(iNum==2)
{
i2++;
}
if(iNum==3)
{
i3++;
}
if(iNum==4)
{
i4++;
}
if(iNum==5)
{
i5++;
}
if(iNum==6)
{
i6++;
}
}
getch();
system("cls||clear");
printf("Quantidade de vezes do número 1: %d\n",i1);
printf("Quantidade de vezes do número 2: %d\n",i2);
printf("Quantidade de vezes do número 3: %d\n",i3);
printf("Quantidade de vezes do número 4: %d\n",i4);
printf("Quantidade de vezes do número 5: %d\n",i5);
printf("Quantidade de vezes do número 6: %d\n",i6);
}

Let's Learn disse...

//2. Crie uma função que receba três valores, 'a', 'b' e 'c', que são os coeficientes de uma equação
// do segundo grau e retorne o valor do delta, que é dado por 'b² - 4ac'

#include
#include

int delta (int aIn, int bIn, int cIn);

int main()
{
int a, b, c, deltaOutput;
setlocale(LC_ALL,"portuguese");
printf("\t Entre com os coeficientes da equação do segundo grau ");
scanf("%d %d %d", &a, &b, &c);
deltaOutput = delta(a, b, c);
printf("\t O valor de delta é: %d ", deltaOutput );
}

int delta (int aIn, int bIn, int cIn)
{
return (( bIn * bIn ) - 4 * aIn * cIn);
}

Let's Learn disse...

//3. Usando as 3 funções acima, crie um aplicativo que calcula as raízes de uma equação do 2o grau:
//ax² + bx + c=0
//Para ela existir, o coeficiente 'a' deve ser diferente de zero.
//Caso o delta seja maior ou igual a zero, as raízes serão reais.
//Caso o delta seja negativo, as reais serão complexas e da forma: x + iy


#include
#include
#include

int nulo (int nuloInput);
int delta (int aIn, int bIn, int cIn);
int positivo (int positivoInput);


int main()
{
int calcular;
float a, b, c, deltaOutput;
setlocale(LC_ALL,"portuguese");

do
{
printf("Programa que acha as raizes de uma equacao do 2o grau: ax^2 + bx + c = 0\n\n");
printf("\t Entre com os coeficientes da equação do segundo grau ");
scanf("%f %f %f", &a, &b, &c);
if ( nulo(a) == 0){}
else
{
deltaOutput = delta(a, b, c);
printf("\t O valor de delta é: %.2f \n", deltaOutput );
if ( deltaOutput >= 0 )
{
printf("\t Raiz 1: %.2f \n", ((-b + sqrt(deltaOutput)) / (2 * a) ) );
printf("\t Raiz 2: %.2f \n", ((-b - sqrt(deltaOutput)) / (2 * a) ) );
}
else
{
printf("\t Raiz 1: %.2f + %.2f i \n", (-b / (2 * a) ), ((sqrt(-deltaOutput)) / (2 * a) ) );
printf("\t Raiz 2: %.2f - %.2f i \n", (-b / (2 * a) ), ((sqrt(-deltaOutput)) / (2 * a) ) );
}
}
printf("\n\n Calcular mais raizes?\n 1. Continuar\n 0. Sair \n");
scanf("%d", &calcular);
if ( calcular == 1 )
system("cls || clear all");
} while ( calcular == 1 );
}


int nulo (int nuloInput)
{
if ( nuloInput == 0 )
{
printf("\t o Valor informado do coeficiente a é nulo \n");
return 0;
}
}

int delta (int aIn, int bIn, int cIn)
{
return (( bIn * bIn ) - 4 * aIn * cIn);
}

int positivo (int positivoInput)
{
if ( positivoInput > 0 )
printf("\t o Valor informado é positivo \n");
else
printf("\t o Valor informado não é positivo \n");
}

Let's Learn disse...

//10. Crie um aplicativo de conversão entre as temperaturas Celsius e Farenheit.
//Primeiro o usuário deve escolher se vai entrar com a temperatura em Célsius ou Farenheit,
//depois a conversão escolhida é realizada através de um comando SWITCH.
//Se C é a temperatura em Célsius e F em farenheit, as fórmulas de conversão são:
//C= 5.(F-32)/9
//F= (9.C/5) + 32


#include
#include

int main (void)
{
int converter;
float Celsius, Farenheit;
setlocale(LC_ALL,"portuguese");

do
{
printf("\t Conversão entre as temperaturas Celsius e Farenheit \n\n");
printf("\t Tecle 'F' para converter Celsius em Farenheit ");
printf("\n\t ou tecle 'C' para converter Farenheit em Celsius ");
printf("\n\n \t Tecle 'q' para sair ");
scanf(" %c", &converter);
switch ( converter )
{
case 'F' :
printf("\t Entre com a temperatura em Celsius: ");
scanf("%f", &Celsius);
printf("\t A temperatura correspondente em Farenheit são: %.2f \n\n", ((1.8*Celsius)+32) );
system("pause");
system("cls || clear");
break;

case 'C' :
printf("\t Entre com a temperatura em Farenheit: ");
scanf("%f", &Farenheit);
printf("\t A temperatura correspondente em Celsius são: %.2f \n\n", ((Farenheit - 32)/1.8));
system("pause");
system("cls || clear");
break;

case 'q' :
printf("\t Encerrando !!! \n");
break;

default :
//system("cls || clear");
printf("\n\t\t Tecle o caracter 'F' ou 'C' \n\n" );
system("pause");
system("cls || clear");
break;
}
} while ( converter != 'q' );

}

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.