Ir ao conteúdo
  • Cadastre-se

C++ Meu código está entrando em loop infinito!!


Posts recomendados

Boa noite!!

 

Estou tentando aprender programar com o Dev C++, mas estou encontrando problemas. 

 

Eu escrevo uma função qualquer de cálculo e depois uso uma variável para voltar nessa função. 
Uma pergunta ex: digite 1
Vai a função
Se não 
Exit (); 

Só que cada vez que faço isso eu somo o valor do cálculo no total. 

Depois de cinco vezes entrando e saindo da função, o programa entra em loop infinito.

 

Toda vez que eu voltar a função, eu tenho que somar o valor já calculado antes. 

Se a função é  f= 2*b
C+=f resolve isso. Mas depois de cinco vezes ou mais o negócio desanda!!

Não pode ser um for por que preciso calcular uma quantidade indefinida!!!

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

    float d;
    float b;
    float f;
    float c;


int funcaod2()

{
    system("cls");
    printf("digite um numero: \n");
    scanf("%f", &b);
    f = 2 * b;
    c +=f;
    printf("O valor total %.2f\n", c);
    printf("Digite: 1 \n");
    scanf("%f", &d);
    if(d == 1){
        
        funcaod2();
    }
    else{
        exit(0);
    }
}

int main(){
    
   funcaod2(); 
    
}

 

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

@Adail Augusto Olá. Ao q parece o problema é "sujeira no buffer". Coloquei uma função no código para limpar o stdin, ou seja, limpar a "sujeira no buffer". Teria q testar aí p ver se resolve. Aqui funcionou:

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

float d;
float b;
float f;
float c;

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

void funcaod2() {
    
    system("cls");

    f = 0;
    c = 0;

    printf("digite um numero: ");
    scanf("%f", &b);
    limpa_linha();

    f = 2 * b;
    c += f;
    printf("O valor total %.2f\n", c);

    printf("Digite 1: ");
    scanf("%f", &d);
    limpa_linha();

    if (d == 1) {
        funcaod2();
    } else {
        exit(0);
    }
}

int main() {

    funcaod2();

    return 0;
}

Se está começando a programar não se preocupe em entender a função q coloquei no seu código.

Se tiver dúvidas pergunte, ok?

Link para o comentário
Compartilhar em outros sites

Olá, meu amigo!

 

Aqui o programa rodou como antes, só copiei e colei o que você escreveu, ele continua entrando no loop infinito, só que agora ele não realiza mais a parte  c += f;.

Somente mostra o dobro dos valores que eu digito em b e a tela fica piscando, indicando que a mesma está aparecendo várias vezes na tela, infinitamente!!

Link para o comentário
Compartilhar em outros sites

@Adail Augusto Estanho isso. Aqui tá rodando normal

Seguinte: Ao digitar um valor com casas decimais, por ex: 7.80 você está usando o ponto, como no exemplo q passei, ou a vírgula? Se está usando a vírgula, algo assim: 7,80 aí vai dar erro mesmo. Você deve fazer uso do ponto: 4.43 (por exemplo)

Quanto a lógica devo confessar q não considerei ao postar o código. Falha minha!

Nesse caso, para corrigir, apenas inicialize as variáveis f e c com o valor 0 onde elas estão declaradas, no início do código e tire da sua função os comandos f = 0 e c = 0

Também sugiro mudar a variável d para int, para evitar erro na comparação do if. E aí fazer a leitura dela 

printf("Digite 1: ");
scanf("%d", &d);
limpa_linha();

Logo, seu código ficaria assim:

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

int d;
float b;
float f = 0;
float c = 0;

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

void funcaod2()
{
    system("cls");

    printf("digite um numero: ");
    scanf("%f", &b);
    limpa_linha();

    f = 2 * b;
    c += f;
    printf("O valor total %.2f\n", c);

    printf("Digite 1: ");
    scanf("%d", &d);
    limpa_linha();

    if (d == 1) {
        funcaod2();
    } else {
        exit(0);
    }
}

int main() {

    funcaod2();

    return 0;
}

Obs: Não use a vírgula para informar valores com casas decimais. Use o ponto!

Se o erro persistir avisa, ok?

Tem mais uma: Se você informar valores muito grandes, vai chegar em um ponto q o resultado não vai ser possível de ser armazenado em um tipo de dado float. Ou informe valores pequenos ou mude as variáveis para double ou long double. Se quiser posso passar o código com essa alteração.

OBS: Se caiu no erro de usar a vírgula não se incomode com isso. Faz parte do processo d aprendizagem de qualquer um erros desse tipo :thumbsup:

Link para o comentário
Compartilhar em outros sites

Boa noite meu amigo!

 

Muito obrigado pela  atenção e paciência!

Mas não utilizei números com vírgula, só números inteiros como 8, 7, 9, 50, 10, 5, etc

Não entendo de limpeza de buffer , mas venho trabalhando muito com esse compilador e pode ter algo do tipo para fazer.

 

O código ficou assim mesmo, c += f; já funciona, mas continua entrando em loop infinito na quarta ou quinta vez que digito o número 1 para voltar a funcaod2!!

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

int d;
float b;
float f = 0;
float c = 0;

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

void funcaod2() {
    
    system("cls");


    printf("digite um numero: ");
    scanf("%f", &b);
    limpa_linha();

    f = 2 * b;
    c += f;
    printf("O valor total %.2f\n", c);

    printf("Digite 1: ");
    scanf("%d", &d);
    limpa_linha();

    if (d == 1) {
        funcaod2();
    } else {
        exit(0);
    }
}

int main() {

    funcaod2();

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@Adail Augusto Olá. Como uma forma alternativa para resolver o problema fiz algumas alterações em seu código. Apenas teste aí da forma q vou postar abaixo para ver se dá erro, ok?

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

float b = 0.0;
float f = 0.0;
float c = 0.0;

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

void funcaod2() {
    
    system("cls");

    printf("digite um numero: ");
    scanf("%f", &b);
    limpa_linha();

    f = 2 * b;
    c += f;
    printf("O valor total %.2f\n", c);
}

int main() {

    int d = 0;

    do {
        funcaod2();

        printf("Digite 1: ");
        scanf("%d", &d);
        limpa_linha();

    } while (d == 1);

    return 0;
}

O código ficou com a mesma funcionalidade, porém a forma de implementar o mesmo q mudou.

Se o erro persistir avisa

Mas, se acaso o erro persistir, creio q a melhor coisa a fazer é esperar pela sugestão de algum outro colega aqui do fórum

Link para o comentário
Compartilhar em outros sites

***[ Olá, sou estudante de Ciências-Física, e tenho dialeto C ANSI como hobby, C'hobby rsrs!

      Meu contato com C/Python foi na matéria Introdução à Computação. ]

 

A versão recursiva funciona sem o problema de loop infinito @giu_d @Adail Augusto

A versão do meu compilador é GCC 6, qual a de vocês?

 

Link para o comentário
Compartilhar em outros sites

Ambas implementações são operativas aqui também, ainda acho que seja um limitação imposta pelo compilador dele. 

adicionado 1 minuto depois
11 horas atrás, Adail Augusto disse:

É não deu não, tenho que arrumar um jeito de mostrar um vídeo aqui, ou posto no youtube para que possa ver !!!

Execute o programa e tire um print do prompt em tela cheia.

Link para o comentário
Compartilhar em outros sites

Bom dia!!

 

Vou por aqui o passo a passo do prompt OK!!

 

image.png.854f65b8728e1568cb54b6ab4601f254.png

 

image.png.185368d1d135c7803428d553d4c04dab.png

 

image.png.cd1b4e550cdc0b06cb5b8121fdbbd436.png

 

Lá para quarta chamada da função dá isso aí!!

 

image.png.47d3c4bf8e1fc318bf0f207a8b5fad07.png

 

Onde o valor total não para de subir e essa tela fica assim para sempre , até travar. Só reiniciando o pc !!!

 

A minha versão é 5.11 e não tem outra disponível na internet, que eu saiba!!

Pode ser defeito no meu pc??/

 

 

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

O ambiente de desenvolvimento integrado (ou IDE) Dev-C++ versão 5.11 vem com o compilador TDM-GCC versão 4.9.2. (TDM-GCC é uma distribuição do compilador MinGW, e o MinGW é uma versão para Windows do compilador do Linux chamado GCC.)

 

A versão mais recente do compilador TDM-GCC é a 5.1.0:

 

http://tdm-gcc.tdragon.net/download

 

Seria possível baixar e instalar o compilador atualizado e configurar manualmente o Dev-C++ para usar esse compilador.

 

 

 

Ou, ao invés de fazer isso, poderia baixar o IDE "Codeblocks" que já vem com o compilador TDM-GCC 5.1.0:

 

http://www.codeblocks.org/downloads/26 (Use um dos links de download com MinGW incluso, por exemplo codeblocks-17.12mingw-setup.exe, senão vai pegar a IDE sem nenhum compilador.)

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

  • 2 semanas depois...

Boa noite!!

 

Consegui resolver meu problema!!

 

Instalei o code-blocks e agora meus programas rodam !!!

 

instalei e desinstalei o Dev várias vezes e não adiantou nada.

Os mesmos códigos rodam no code-blocks( com funções recursivas e tudo), mas não rodam no Devc++!!!

Valeu pessoal!!!

Abraços!!!

adicionado 1 minuto depois

Boa noite!!

 

Consegui resolver meu problema!!

 

Instalei o code-blocks e agora meus programas rodam !!!

 

instalei e desinstalei o Dev várias vezes e não adiantou nada.

Os mesmos códigos rodam no code-blocks( com funções recursivas e tudo), mas não rodam no Devc++!!!

Valeu pessoal!!!

Abraços!!!

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!