[c]Duda con return en funcion

Iniciado por dmacias, 8 Abril 2014, 00:28 AM

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

dmacias

Hola a todos de nuevo  ;D aqui sigo liado estudiando y haciendo un programa que calcule los numeros primos me ha surgido una duda, os la explico a continuacion

El programa lo escribi asi y me daba un resultado erroneo


/*Programa del libro, tema 5
* ejercicio 5.27, pagina 170
* programa que busque los numeros primos*/

#include <stdio.h>

int primo(int x);  //prototipo de la funcion primo

int main()
{
     int x;

     for(x = 1; x <= 100; x++){
        printf("%d\n", primo(x));
     }  //fin de for
     return 0;


     }  //fin de main

     /*funcion primo*/

int primo(int x){
     int y;
     int contador = 0;

     for (y = 1; y <= x; y++){
         if (x % y == 0){
             contador++ ;
         }  //fin de if
     }  //fin de for

     if (contador == 2){
         return x;
     }
     }  //fin de la funcion primo






entonces me puse a trastear posibles soluciones y lo modifique de tal manera y ya funciona perfecto, o eso creo


/*Programa del libro, tema 5
* ejercicio 5.27, pagina 170
* programa que busque los numeros primos*/

#include <stdio.h>

void primo(int x);  //prototipo de la funcion primo

int main()
{
     int x;

     for(x = 1; x <= 100; x++){
        primo(x);
     }  //fin de for
     return 0;


     }  //fin de main

     /*funcion primo*/

void primo(int x){
     int y;
     int contador = 0;

     for (y = 1; y <= x; y++){
         if (x % y == 0){
             contador++ ;
         }  //fin de if
     }  //fin de for

     if (contador == 2){
         printf("%d\n", x);
     }
     }  //fin de la funcion primo





y me da la duda de porque de la primera forma no funciona si yo pensaba que seria lo mismo  :o , haber si alguien me lo explica

Un saludo  ;D

amchacon

Pues porque en el primer caso, el retorno que has puesto en primo no tiene sentido. Además tampoco lo compruebas ni nada.

Lo ideal esque devuelvas un 1 si es primo y 0 si no lo es. Después lo compruebas con un if y listo:
Código (cpp) [Seleccionar]
for(x = 1; x <= 100; x++)
    if (primo(x)) printf("%d\n",x);


Por cierto sobre los numeros primos:
http://foro.elhacker.net/programacion_cc/codigo_para_calcular_los_numeros_primos-t405451.0.html
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

dmacias

ok, probare a hacerlo como me dices, no se me había ocurrido lo de 0 si no es primo y 1 si lo es.

Aun no me queda claro el porque no funciona en el primer caso si supuestamente retorno el valor de x si solo tiene dos divisores, que serian 1 y el numero mismo.

Un saludo  ;D

do-while

¡Buenas!

El "error" de la primera función supongo que será debido a que solo devuelves un valor cuando el número tiene dos divisores. Si no los tiene no devuelves nada y supongo que tomará como valor de retorno el último valor devuelto por la función (lo que implicaría que la llamada a la función se está realizando siempre en la misma posición de la pila...). Si no es eso, ni idea.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

leosansan

Cita de: do-while en  8 Abril 2014, 11:22 AM
¡Buenas!

El "error" de la primera función supongo que será debido a que solo devuelves un valor cuando el número tiene dos divisores. Si no los tiene no devuelves nada y supongo que tomará como valor de retorno el último valor devuelto por la función (lo que implicaría que la llamada a la función se está realizando siempre en la misma posición de la pila...). Si no es eso, ni idea.

¡Saludos!

Creo que estas en lo cierto do-while.

Una forma de evitar lo que sucede en tu primer  código es que retorne "algo" si no es primo, algo parecido a lo que propone amchacon:


Código (cpp
    ) [Seleccionar]
if (contador == 2)
         return x;
    else
        return 0;


Y en la función main:

Código (cpp) [Seleccionar]

    for(x = 1; x <= 100; x++){
      if (primo(x)!=0)
        printf("%d\n", primo(x));
     }  //fin de for


Y ya te funciona el código inicial sin problemas ya que ahora retorna la función primo si o si.

Salu2!.

dmacias

Entonces teoricamente lo que me faltaba era el else con el return para que si o si "returne" algo  ;D

Yo es que soy completamente novato en estas cosas asi que tengo mil y una dudas. Me vereis por aqui asiduamente  :-X

Un saludo