Ir ao conteúdo
  • Cadastre-se

C Problema com funcao em C


JVGS1111
Ir à solução Resolvido por arfneto,

Posts recomendados

Boa Noite estou fazendo um código em C e não esta funcionando de forma correta, a função recursiva funciona e a comum não, antes estava funcionando quando apenas a comum estava implementada. A função deve pegar 2 valor e calcular quantos números entre os dois valores existem. segue có

#include <stdio.h>
#include <stdlib.h>

int contagem(int a1, int a2) //conta as variaveis //funcao comum
{
	
  int resultado = 0;
  
  for(a1; a1 < a2; a1++){
  	resultado++;	
  }
  return(resultado); //retornando o valor para main
}

int a3 = 0;
int resultadoRecursivo = 0;
int a11 = 0;
int a22 = 0;

int cont(int a11, int a22){ // recursiva
	if(a11 != a22)
	{
		a11--;
		a3++;
		return(cont(a11, a22));
	}
	else
	{
		return(a3);
	}
}

int main() {

	int numero1, numero2, resultado;
	
	printf("Insira o primeiro numero:        ");
	scanf("%d", &numero1);
	printf("Insira um numero menor que o anterior:        ");
	scanf("%d", &numero2);
	
	resultado = contagem(numero1,numero2);	
	resultadoRecursivo = cont(numero1, numero2);
	
	printf("Existem %d entre %d e %d\n", resultado, numero1, numero2);	
	printf("Existem %d entre %d e %d\n", resultadoRecursivo, numero1, numero2);
	
	system("pause");
	return 0;
}

digo:

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@JVGS1111    a função recursiva é que está com problema , se você inserir um número menor antes e um número maior depois a função normal vai funcionar e o contrário não , pois o for não faz a contagem , já que a1 é maior ou igual a a2 , assim ele não entra dentro desse for , e aí não calcula o resultado ,  e a recursiva é o contrário ,  se você colocar um número menor antes do maior não funciona , aí não sei bem porque , mas nesse caso essa função fica repetindo até chegar a3 com valor 65094 e creio que esse seja o limite da memória da bios e o programa encerra para proteger o pc e não mostra nenhum resultado .

Link para o comentário
Compartilhar em outros sites

@devair1010 acho que entendi, vou tentar fazer a modificação 

adicionado 18 minutos depois

@devair1010  tirei o for e usei mais 2 variáveis e deu certo, obrigado. 

#include <stdio.h>
#include <stdlib.h>

int cont(int a11, int a22);

int contagem(int a1, int a2) //funcao comum
{
	
  int resultado = 0;
  
  resultado = a2 - a1; // modificacao
  return(resultado); //retornando o valor para main
}


int main() {
	
int resultadoRecursivo = 0;

	int numero1, numero2, resultado;
	int a = 0,b = 0;
	
	printf("Insira o primeiro numero:        ");
	scanf("%d", &numero1);
	b = numero1; // nova variavel
	printf("Insira um numero menor que o anterior:        ");
	scanf("%d", &numero2);
	a = numero2;// nova variavel
	
	resultadoRecursivo = cont(numero1, numero2);
	resultado = contagem(a,b);	
	
	system("cls");
	printf("Comum - Existem %d entre %d e %d\n", resultado, a, b);	
	printf("Recursivo - Existem %d entre %d e %d\n", resultadoRecursivo, numero1, numero2);
	
	system("pause");
	return 0;
}

int a3 = 0;
int a11 = 0;
int a22 = 0;

int cont(int a11, int a22){ // funcao recursiva 
	
	if(a11 != a22)
	{
		a11--;
		a3++;
		return(cont(a11, a22));
	}
	else
	{
		return(a3);
	}
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução

Olá!

 

Talvez pudesse considerar no caso recursivo o raciocínio recursivo mesmo: se estou procurando a distância entre esses dois valores, então:

se eles são iguais eu sei a distância: zero. 

se eles não são iguais, então a distância é pelo menos 1 então eu somo 1, diminuo um dos pontos e continuo contando até eles serem iguais, certo? Essa é a recursão por definição. Só tem essa pegadinha do maior poder vir primeiro e por isso o código tem 3 linhas

 

Exemplo simples para o caso recursivo

// retorna distancia entre a e b usando recursao
int        dist_r(int a, int b)
{
    if (a == b) return 0;	// fim. Ja temos a distancia
    if (b > a) return 1 + dist_r(a, (b - 1));
  	// o primeiro e maior entao diminui do outro lado
    return            1 + dist_r((a - 1), b);
  	// sim, podia escrever usando dois pares '?' ':'
}	// end dist_r()

Exemplo simples para o caso iterativo

// retorna distancia entre a e b usando aritmetica
int        dist_i(int a, int b)
{
    if (a > b) return a - b;
    return b - a;
    // sim, podia ser escrito em uma linha so usando '?'e ':'
}    // end dist_i()

Um programa de teste

 

Porque não um programa curtinho que testa para um intervalo determinado, se possível em torno de zero pra testar os casos de sinais distintos, e já mostra e compara os resultados? Por exemplo para A = -2 e B entre -10 e 10?

 

 Algo assim

dist( -2,-10) = (  8,  8) [iterativa, recursiva]
dist( -2, -9) = (  7,  7) [iterativa, recursiva]
dist( -2, -8) = (  6,  6) [iterativa, recursiva]
dist( -2, -7) = (  5,  5) [iterativa, recursiva]
dist( -2, -6) = (  4,  4) [iterativa, recursiva]
dist( -2, -5) = (  3,  3) [iterativa, recursiva]
dist( -2, -4) = (  2,  2) [iterativa, recursiva]
dist( -2, -3) = (  1,  1) [iterativa, recursiva]
dist( -2, -2) = (  0,  0) [iterativa, recursiva]
dist( -2, -1) = (  1,  1) [iterativa, recursiva]
dist( -2,  0) = (  2,  2) [iterativa, recursiva]
dist( -2,  1) = (  3,  3) [iterativa, recursiva]
dist( -2,  2) = (  4,  4) [iterativa, recursiva]
dist( -2,  3) = (  5,  5) [iterativa, recursiva]
dist( -2,  4) = (  6,  6) [iterativa, recursiva]
dist( -2,  5) = (  7,  7) [iterativa, recursiva]
dist( -2,  6) = (  8,  8) [iterativa, recursiva]
dist( -2,  7) = (  9,  9) [iterativa, recursiva]
dist( -2,  8) = ( 10, 10) [iterativa, recursiva]
dist( -2,  9) = ( 11, 11) [iterativa, recursiva]
dist( -2, 10) = ( 12, 12) [iterativa, recursiva]

As rotinas retornaram valores identicos para o intervalo


A partir desse código

#include "stdio.h"

int            dist_r(int, int);        // calcula distancia entre dois int, recursiva
int            dist_i(int, int);        // calcula distancia entre dois int, iterativa


int            main()
{
    int        iterativo;
    int        recursivo;
    int        a = -2;

    for (int i = -10; i <= 10; i += 1)
    {
        iterativo = dist_i(a, i);
        recursivo = dist_r(a, i);
        printf(
            "dist(%3d,%3d) = (%3d,%3d) [iterativa, recursiva]\n",
            a,
            i,
            dist_i(a, i), 
            dist_r(a, i) 
        );
        if (iterativo != recursivo)
        {
            printf("Erro para i = %d\n", i);
            return - 1;
        }
    }    // end for
    printf("\nAs rotinas retornaram valores identicos para o intervalo\n");
  	return 0;
}    // end main()


// retorna distancia entre a e b usando recursao
int        dist_r(int a, int b)
{
    if (a == b) return 0;    // fim. Ja temos a distancia
    if (b > a) return 1 + dist_r(a, (b - 1));
    // o primeiro e maior entao diminui do outro lado
    return            1 + dist_r((a - 1), b);
    // sim, podia escrever usando dois pares '?' ':'
}    // end dist_r()


// retorna distancia entre a e b usando aritmetica
int        dist_i(int a, int b)
{
    if (a > b) return a - b;
    return b - a;
    // sim, podia ser escrito em uma linha so usando '?'e ':'
}    // end dist_i()

 


 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...