Duvida em c++

olá estou começando a aprender c++ e tenho um programa bem simples que é resolver uma equação do segundo grau.

#include<stdio.h>
#include<math.h>
main()
{
int a,b,c,d,x1,x2,D;
printf("digite os valores dos coeficientes a,b e c.\n");
scanf("%f",&a);
scanf("%f",&b);
scanf("%f",&c);
d=(b*b)-(4*a*c);
D=sqrt(d);
if(d>=0)
{
	x1=((b*(-1))+D)/2*a;
	x2=((b*(-1))-D)/2*a;
	printf("as raizes são %4.2f e %4.2f",x1,x2);
}
return 0;
}

Mas ele não está compilando, mostrando que a referencia estar errada , como posso resolver esse problema?
:oops:

  1. Não use float para fazer contas, use double. Usar int para fazer contas também não funciona muito bem.

  2. Dei uma corrigida no seu código (que estava quase certo). Pus uns comentários onde eu tive de ajeitar seu código.

#include&lt;stdio.h&gt;
#include&lt;math.h&gt;
int main(int argc, char *argv[]) // não use &quot;main&quot; sem retorno, use &quot;int main()&quot;, ou melhor, &quot;int main(int argc, char *argv[])
{
	double a,b,c,d,x1,x2,D; // use double, não int, para fazer contas
	printf(&quot;digite os valores dos coeficientes a,b e c.\n&quot;);
	scanf(&quot;%lf&quot;,&a);
	scanf(&quot;%lf&quot;,&b);
	scanf(&quot;%lf&quot;,&c);
	d=(b*b)-(4*a*c);
	D=sqrt(d);
	if(d&gt;=0)
	{
		x1=((b*(-1))+D)/2*a;
		x2=((b*(-1))-D)/2*a;
		printf(&quot;as raizes são %4.2f e %4.2f&quot;,x1,x2);
	}
	return 0;
}

A propósito, seria interessante mostrar que "a equação não tem raízes reais" se D < 0. Que tal?

Você está aprendendo C++ ou C?

Num estilo mais propício ao C++, esse código ficaria assim:

[code]
#include <iostream>
#include <cmath>

int main(int argc, char *argv[])
{
//Use cout ao invés de printf
std::cout << "digite os valores dos coeficientes a,b e c." << std::endl;

//Declare as variáveis o mais próximo possível de onde for usa-las
double a;
std::cin &gt;&gt; a;   //Use cin ao invés de scanf

double b;
std::cin &gt;&gt; b;

double c;
std::cin &gt;&gt; c;
//De nomes mais significativos. não poupe letras.
double delta = (b*b)-(4*a*c);

if(delta&gt;=0)
{
    double sqrtDelta =sqrt(delta);
    double x1= ((b*(-1))+ sqrtDelta)/2*a;
    double x2= ((b*(-1))- sqrtDelta)/2*a;

    std::cout &lt;&lt; &quot;as raizes sao &quot; &lt;&lt; x1 &lt;&lt; &quot; e &quot; &lt;&lt; x2;
}
else
    std::cout &lt;&lt; &quot;Não possui raizes reais.&quot;;
return 0;

}[/code]

É bom dar uma calibrada na entrada de parâmetros.

Por exemplo, uma equação de 2o grau não pode ter (a == 0), se eu colocar a=0 ele destroi seu programa…

[code]
#include <iostream>
#include <cmath>

int main(int argc, char *argv[])
{
//Use cout ao invés de printf
std::cout << "digite os valores dos coeficientes a,b e c." << std::endl;

//Declare as variáveis o mais próximo possível de onde for usa-las
double a;
std::cin &gt;&gt; a;   //Use cin ao invés de scanf

while(a == 0)
{
std::cout &lt;&lt; &quot;a deve ser diferente de zero. Entre a novamente: &quot;;
std::cin &gt;&gt; a;
}


double b;
std::cin &gt;&gt; b;

double c;
std::cin &gt;&gt; c;
//De nomes mais significativos. não poupe letras.
double delta = (b*b)-(4*a*c);

if(delta&gt;=0)
{
    double sqrtDelta =sqrt(delta);
    double x1= ((b*(-1))+ sqrtDelta)/2*a;
    double x2= ((b*(-1))- sqrtDelta)/2*a;

    std::cout &lt;&lt; &quot;as raizes sao &quot; &lt;&lt; x1 &lt;&lt; &quot; e &quot; &lt;&lt; x2;
}
else
    std::cout &lt;&lt; &quot;Não possui raizes reais.&quot;;
return 0;

}[/code]

Outra boa alternativa é tratar assim:

[code]#include <iostream>
#include <cmath>

int main(int argc, char *argv[])
{
printf("digite os valores dos coeficientes a,b e c.\n");

double a;
std::cin &gt;&gt; a;

double b;
std::cin &gt;&gt; b;

double c;
std::cin &gt;&gt; c;

if (a == 0 && b &gt; 0) //Equacao do primeiro grau?
{
    std::cout &lt;&lt; &quot;Resultado da equacao de primeiro grau: &quot; &lt;&lt; -c / b;
    return 0;
}

if (a == 0 && b == 0) //Só informou a constante?
{
    std:: cout &lt;&lt; &quot;O valor de C é &quot; &lt;&lt; c;
    return 0;
}

//Equacao do segundo grau.
double delta = (b*b)-(4*a*c);

if(delta &lt; 0)
{
    std::cout &lt;&lt; &quot;Não possui raizes reais.&quot;;
    return;
}

double sqrtDelta =sqrt(delta);
double x1= ((b*(-1))+ sqrtDelta)/2*a;
double x2= ((b*(-1))- sqrtDelta)/2*a;

std::cout &lt;&lt; &quot;as raizes sao &quot; &lt;&lt; x1 &lt;&lt; &quot; e &quot; &lt;&lt; x2;
    
return 0;

}[/code]

Uma dica para melhorar organização e facilitar uma possível manutenção posterior do código:

–Declare as variáveis no inicio do Código.

E como foi dito anteriormente na Linguagem C++ usamos

– COUT<<“Texto”;
– CIN>>variavel;

Já na Linguagem C

– printf(“Texto”);
– scanf(&variavel);

Discordo. A variável deve ser declarada o mais próximo possível de onde for usada. Isso reduz o escopo e evita problemas.

A dica de reduzir o escopo é dada em vários livros, como refatoração, do Martin Fowler.

Eu acho bem melhor declarar a variavel no inicio do programa da um melhor senso de localização, apesar que eu não sei tb se é por que já se tornou um vicio seguir este “padrão” :stuck_out_tongue:

Discordo. A variável deve ser declarada o mais próximo possível de onde for usada. Isso reduz o escopo e evita problemas.

A dica de reduzir o escopo é dada em vários livros, como Refatoração, do Martin Fowler. [/quote]

+1

Quanto menor o escopo para uma variável, há vantagens reais no C++:

  • O compilador pode gerar código muito melhor
  • Os destrutores podem ser chamados mais rápido, porque o escopo é menor, e isso vai acabar usando menos recursos da máquina.

No Java e no C# é mais ou menos a mesma coisa - use o menor escopo possível.

Declarar todas as variáveis no começo de um bloco era uma exigência da linguagem-mãe do C++ (a linguagem C), mas mesmo essa restrição está sendo considerado para ser eliminado na próxima versão do C (a última é C99).

Sinceramente, isso é novidade para mim!
Atualmente faço faculdade de Ciencia da Computação e os professores exigem
a declaração de variaveis no incio do código, ou melhor dizendo, aconselham isso.
Em relação ao escopo, isso tem lógica!
Se pensarmos em uma empresa, onde você trabalhasse,
facilitaria a manutenção ou compreenção do codigo pela equipe.

Abrimos uma outra discução interessante neste tópico!
haha…

Resolvi meu problema, obrigado por todas dicas e discurções abertas nesse fórum.

:arrow: :smiley:

[quote=diogofabri]Sinceramente, isso é novidade para mim!
Atualmente faço faculdade de Ciencia da Computação e os professores exigem
a declaração de variaveis no incio do código, ou melhor dizendo, aconselham isso.
Em relação ao escopo, isso tem lógica!
Se pensarmos em uma empresa, onde você trabalhasse,
facilitaria a manutenção ou compreenção do codigo pela equipe.

Abrimos uma outra discução interessante neste tópico!
haha…

[/quote]

Eu também fiz Ciência da Computação e os professores diziam a mesma coisa: declare as variáveis no início do código. Mas depois que me formei e fui fazer código para a vida real, percebi que isso é inútil e mais atrapalha que ajuda. Um exemplo é para fazer refatoração para extrair método, outro é para ler o código para fazer manutenção.

Enfim, não siga isso à risca. E aproveitando, esse mesmo professor vai te dizer para não usar break. Ignore essa recomendação, pois a opção estruturada costuma ser mais verbosa.

[quote=diogofabri]Sinceramente, isso é novidade para mim!
Atualmente faço faculdade de Ciencia da Computação e os professores exigem
a declaração de variaveis no incio do código, ou melhor dizendo, aconselham isso.
Em relação ao escopo, isso tem lógica!
Se pensarmos em uma empresa, onde você trabalhasse,
facilitaria a manutenção ou compreenção do codigo pela equipe.

Abrimos uma outra discução interessante neste tópico!
haha…

[/quote]
Isso é porque grande parte dos professores universitários não programam há anos, apenas dão aula. As linguagens mais antigas, como o C, te obrigam a fazer todas as declarações no início do código. Apesar das linguagens mais novas possibilitarem que as declarações sejam feitas em qualquer parte do código, esses professores já criaram a cultura de declarar no início, mesmo que não saibam porque orientam os alunos a fazerem o mesmo…

Alguns professores ensinam a declaração no início do método porque é mais didático. Não significa que depois que você começar a compreender o assunto, vai continuar fazendo isso. Mas, quem está aprendendo a programar tem muitas dificuldades, para ainda se incomodar com o escopo.

Particularmente, essa não seria a minha abordagem e, mesmo que fosse, não exigiria isso dos alunos que já manjam.

Mas, declarar as variáveis no menor escopo possível foi um recurso intencionalmente inserido no C++.
E não foi a toa.

Declarar a variável no início do método, em vez de no menor escopo possível:

  • É realmente mais didático;
  • Permite aquela comparação com uma “receita de bolo” que às vezes se faz quando se ensina programação estruturada.

Quem já seguiu uma receita de bolo (na vida real, na cozinha) sabe que é importante ter uma lista de ingredientes bem definida; às vezes você vê receitas menos estruturadas onde alguns dos ingredientes são supostos ou aparecem só no meio da receita, e isso é meio perturbador, porque você tem de ler a receita completa (em vez de só a lista de ingredientes) para poder ir ao mercado fazer as compras.

Mas como não trabalhamos com bolos, e sim com programas, eu prefiro usar o menor escopo possível.