problemas con else no puedo compilar

Iniciado por myblade2011, 19 Marzo 2014, 16:51 PM

0 Miembros y 1 Visitante están viendo este tema.

myblade2011

Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
//Realice un programa en C++ que lea un numero N, entero y positivo, que diga si N es un numero primo o no. Los números primos son aquellos que solo son divisibles por 1 y por ellos mismos. .//
int n,i,c;
cout<<"ingrese un numero"<<endl; cin>>n;
for( i=1; i<=n;i++);
if (n%i==0)c++;

      if(c==2);{
          cout<<"el numero es primo"<<endl;
          }
else {
         cout<<"no es un numero primo "<<endl;
          }

system("pause");
return EXIT_SUCCESS;

}[code][code][code][code][code][code][code][/code][/code][/code][/code][/code][/code][/code]

Gh057

hola myblade2011 antes de todo el código debes insertarlo dentro de las etiquetas geshi, a groso modo, sobra el ; en las líneas:

for( i=1; i<=n;i++);   


(haría el loop y luego seguría las sentencias siguientes)

y en


if(c==2);{


(luego de la condición, no haría nada; después seguiría el curso normal del programa)

saludos
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...

eferion

Como te comentó Gh057 el problema por el que no compila se encuentra en la línea

Código (cpp) [Seleccionar]
if(c==2);{

Al tener ese punto y coma el if, simplemente, termina ahí, luego se abren unas llaves que ya no están relacionadas con el if y el else se queda huérfano.

Hay que tener bastante cuidado al poner los ';' en C y C++... ya que si no el compilador da errores que pueden llegar a ser bastante complicados de encontrar.

leosansan

#3
Antes que nada, cuando le das a GeSHi elige las etiquetas de C++, así el código sale coloreado y es más fácil de seguir y justito en medio de las dos etiquetas code que te salen, repito, justito en medio, pegas tu código.

Además de lo que ya te han comentado sólo un par de observaciones:

* Si un for, if else...se componen de una sola instrucción, no son necesarias las llaves, sólo consigues recargar el códigó

Por ejemplo en:


Código (cpp) [Seleccionar]
if(c==2);{
         cout<<"el numero es primo"<<endl;
         }
else {
        cout<<"no es un numero primo "<<endl;
         }


te sobran las llaves. No están mal, no, pero lo que te dije, recargas el código innecesariamente, además te falla la indentación sin ninguna necesidad.

* Y si el "cuerpo" del for, while, if, ....se componen de varias líneas entonces es obligado el poner las llaves.

Por ejemplo en tu código:


Código (cpp) [Seleccionar]
for( i=1; i<=n;i++);
if (n%i==0)c++;


además de sobrarte, como ya te comentaron el punto y coma del for, sólo te queda por separa en líneas diferentes, para una mejor claridad:

Código (cpp) [Seleccionar]
for( i=1; i<=n;i++);
if (n%i==0)c++;


amén de que no es buena praxis el usar la misma línea para lo que en realidad son dos  juegos de instrucciones:así no:

Código (cpp) [Seleccionar]
f (n%i==0)c++;

así sí:

Código (cpp) [Seleccionar]
for( i=1; i<=n;i++)
     if (n%i==0)
       c++;
 




Un último detalle, la variable "c" es lo que podríamos denominar un acumulador ya que "partiendo de un valor inicial" se le van sumando incrementos en este caso concreto, c++, y sin embargo tú en la declaración no tienes inicializada  esta variable:


Código (cpp) [Seleccionar]
int n,i,c;

deberías haberle dado a "c" el valor inicial de cero para luego ir sumando con "c++". Al no hacerlo así es muy probable, todo depende del compilador ya que algunos por defecto inicializan las variables a cero por defecto, aunque no es lo usual, como decía es muy probable que la variable tome lo que se llama un valor basura o aleatorio y ahí te fallará siempre la condición de c==2 por culpa de haber tomado c un valor inicial extraño.

Además no dejes de indentar o sangrar todo el código con el mismo criterio.

Te paso el código con todas las observaciones:


Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>

using namespace std;

int main(){
//Realice un programa en C++ que lea un numero N, entero y positivo, que diga si N es un numero primo o no. Los números primos son aquellos que solo son divisibles por 1 y por ellos mismos. .//
 int n,i,c=0;
 cout<<"ingrese un numero"<<endl;
 cin>>n;
 for( i=1; i<=n;i++)
   if (n%i==0)
     c++;
 if(c==2)
     cout<<"el numero es primo"<<endl;
 else
   cout<<"no es un numero primo "<<endl;
 system("pause");
 return EXIT_SUCCESS;
}


Otra cosa es el criterio que has seguido para comprobar si el número es o no primo. Si quieres mejorarlo busca en este mismo foro o googlea un poco y obtendrás códigos más eficientes que el que estas usando.

¡¡¡¡ Saluditos! ..... !!!!



EDITADO con la observación de ivancea96

ivancea96

Cita de: leosansan en 19 Marzo 2014, 18:36 PM
al componerse el for de dos líneas sí son necesarias y obligatorias las llaves, así no:
Código (cpp) [Seleccionar]
for( i=1; i<=n;i++);
if (n%i==0)c++;


En realidad, el "IF", y todo el código que entra dentro de este, es como solo 1 instrucción para el "FOR". Ya tiene sus propias llaves. Era correcto.

leosansan

#5
Cita de: ivancea96 en 19 Marzo 2014, 19:35 PM
En realidad, el "IF", y todo el código que entra dentro de este, es como solo 1 instrucción para el "FOR". Ya tiene sus propias llaves. Era correcto.

Bien visto ivancea96 . Ya he editado el código con tu observación.

¡¡¡¡ Saluditos! ..... !!!!