Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Adail Augusto

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

Recommended Posts

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(); 
    
}

 

Editado por Simon Viegas
Inserir tag CODE
  • Obrigado 1

Compartilhar este post


Link para o post
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?

Editado por giu_d
Correção no código

Compartilhar este post


Link para o post
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!!

Editado por Adail Augusto
  • Curtir 1

Compartilhar este post


Link para o post
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:

Editado por giu_d
corrigir comentário

Compartilhar este post


Link para o post
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;
}

 

Editado por Simon Viegas
Inserir tag CODE
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Adail Augusto Cara, bem estranho isso. Aqui tá tudo ok. Testei no CodeBlocks e no DevC++

Experimenta colocar o comando d = 0; no início da função p ver se resolve

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

  • Confuso 1

Compartilhar este post


Link para o post
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

Editado por giu_d
corrigir comentário
  • Curtir 1

Compartilhar este post


Link para o post
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?

 

Editado por AnsiC
melhorar a mensagem

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Olá. Aqui tá rodando normal das duas formas (resursiva e do-while), tanto no CodeBlocks como no DevC++

  • Obrigado 1

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma vez já tive problemas para compilar no Dev-C++,  um código ficava dando erro de compilação, mesmo sendo um código que funcionava perfeitamente antes... ai reinstalei o programa e voltou a funcionar. A depender faz isso também.

 

 

 

 

  • Curtir 2

Compartilhar este post


Link para o post
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 2

Compartilhar este post


Link para o post
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.)

Editado por isrnick
  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poucas evidencias para uma conclusão precisa, mas tudo indica uma troca IDE.

Ps.: Não não uso IDE, uso Notepad++

Editado por AnsiC
PS
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×