Ir ao conteúdo

C Problema com funcao em C


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

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
Postado

@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 .

Postado

@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
Postado

@JVGS1111 Boa Tarde!

 

No caso da função recursiva não sei dizer se é "adequado" o uso de variáveis globais, ainda mais levando em consideração a complexidade da tarefa. Pois existem pelo menos mais uma forma de se fazer com não variáveis globais.

  • Curtir 1
  • Solução
Postado

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

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...