Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Encontrar el error en este programa

Estas en el tema de Encontrar el error en este programa en el foro de C/C++ en Foros del Web. Hola, escribí un programa que identifica si un numero es primo o no. Al compilarlo no me da ningún error, pero cuando introduzco un número ...
  #1 (permalink)  
Antiguo 15/12/2012, 20:02
 
Fecha de Ingreso: diciembre-2012
Mensajes: 3
Antigüedad: 11 años, 11 meses
Puntos: 0
Encontrar el error en este programa

Hola, escribí un programa que identifica si un numero es primo o no. Al compilarlo no me da ningún error, pero cuando introduzco un número que no es primo me da un resultado extraño. Además, la parte del final cuando quiero seleccionar no funciona, y no tengo idea de donde puede estar el error.

Código:
// un programa para calcular si
// un numero es primo o no

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
#include <stdlib.h>

#define retardo 1e9

void calculo(void);
void eleccion(void);
main()


{   
      calculo();
      return 0;
      }

void calculo(void)
{
     long n, m = 3, cuenta = 0;
     
     printf("\n\n\nIntroduzca el número a comprobar.\n\n");
     scanf("%d", &n);
     printf("\n\nMuy bien. Enviaremos el numero %d a nuestros cientificos\ndel Massachussets Institute of Technology\npara que comprueben si es primo o no.\n\n", n);
     while(cuenta++ < retardo);
     system("cls");
      
     if(n == 0||n == 1||n == 2||n % 2 == 0) 
     {
               printf("\n\n\n\n\n\n\n\n\n\n\n\n\nLo sentimos. El numero %d no es primo.");
               getch(); 
               system("cls");
               eleccion();
               }      
     while(m <= sqrt(n)||n % m != 0)
     {
               m = m + 2;
               }
     if(m <= sqrt(n))
     {
               printf("\n\n\n\n\n\n\n\n\n\n\n\n\n%d es primo.", n);
               getch(); 
               system("cls");
               eleccion();
               }
     if(n % m == 0) 
     {
               printf("\n\n\n\n\n\n\n\n\n\n\n\n\nLo sentimos. El numero %d no es primo.");
               getch(); 
               system("cls");
               eleccion();
               }
     }

void eleccion(void)
{
     char n, s;
     
     printf("\n\n\n\n\n\n\n\n\n\n\n\n\nDesea realizar otro calculo? S/N");
     
     if(getchar() == n) 
     {
           printf("\n\nHasta luego!");
           getch();
           exit(0);
           }
     if(getchar() == s) calculo();
     if(getchar() != n&&getchar() != s);
     {
           printf("\n\n\n\n\n\n\n\n\n\n\n\n\nPor favor, realize una seleccion valida.");
           eleccion();
           }
      }


Gracias por la ayuda!
  #2 (permalink)  
Antiguo 16/12/2012, 10:29
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 12 años, 4 meses
Puntos: 22
Respuesta: Encontrar el error en este programa

Hola.

Es que el modo en que calculas el número primo es incorrecto.
Un modo sencillo de comprobar si un número es primo consiste en dividirlo por los sucesivos valores comprendidos entre 2 y su raíz cuadrada.

Ejemplo:
Código C:
Ver original
  1. #include<stdio.h>
  2. #include<math.h>
  3.  
  4. int esprimo(int);
  5.  
  6. int main()
  7. {
  8.   int num;
  9.   printf("Introduzca el numero a comprobar: ");
  10.   scanf("%d",&num);
  11.   printf("\n");
  12.   esprimo(num) ? printf("%d es primo.",num) : printf("%d no es primo",num);
  13. }
  14.  
  15. int esprimo(int nro)
  16. {
  17.   int i;
  18.   for(i=2; i <= sqrt(nro); i++)
  19.     if (nro % i == 0) return 0;
  20.   return 1;
  21. }

Mas información: http://es.wikipedia.org/wiki/N%C3%BAmero_primo

Saludos.
  #3 (permalink)  
Antiguo 22/12/2012, 05:03
 
Fecha de Ingreso: diciembre-2012
Mensajes: 1
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Encontrar el error en este programa

Tienes multitud de errores en el código, te digo algunos para que vayas avanzando en tu propia solución, que es una de las mejores maneras de aprender:
en el procedimiento calculo:
<code>
printf("\n\n\n\n\n\n\n\n\n\n\n\n\nLo sentimos. El numero %d no es primo.");
</code>
debería ser
<code>
printf("\n\n\n\n\n\n\n\n\n\n\n\n\nLo sentimos. El numero %d no es primo.",n);
</code>
Es decir, se ha de indicar la variable de la que tomar el entero, sino mostrará basura.
en el procedimiento eleccion:
Tienes todas las ideas mal, te explico:
<code>
char n,s;
</code>
En esta línea declaras dos variables de tipo char, que además no están inicializadas por lo que contienen basura, y creo que querías algo así
<code>
char respuesta[]={'n','s'};
//o
char respuesta[]={"ns"};
</code>
Más adelante pones
<code>
if(getchar() == n)
{
printf("\n\nHasta luego!");
getch();
exit(0);
}
if(getchar() == s) calculo();
if(getchar() != n&&getchar() != s);
</code>
Debes de tener en cuenta que cada vez que llamas a getchar() se lee una tecla del teclado, que si no la asignas sólo te sirve para una unica comparación, después el valor se pierde, que además el valor que lees del teclado lo comparas con la variable n, que contiene basura, no con una variable n conteniendo el valor 'n' ni tan siquiera con la constante 'n'. Deberías entender los conceptos básicos de variable, constante, asignación, retorno de una función..., antes de continuar avanzando
por cierto, una implementación d¡ferente de la respuesta de ecfisa, en la que se debe tener en cuenta lo siguiente en una sentencia for la sentencia de evaluación se ejecuta una vez más de las veces que se ejecute el bucle, por lo que en aras de la eficiencia se deben evitar llamadas a función que retornan el mismo valor todas las veces que son llamada(s).
<code>
#include<stdio.h>
#include<math.h>

int esprimo(int);

int main()
{
int num;
printf("Introduzca el numero a comprobar: ");
scanf("%d",&num);
printf("\n");
printf("%d %s es primo",num,esprimo(num)?"":"no");

}

int esprimo(int nro)
{
int i,sq=sqrt(nro);
for(i=2; i <= sq; i++)
if (nro % i == 0) return 0;
return 1;
}
</code>

Etiquetas: encontrar, funcion, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:43.