Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: telecocabreado21 en 5 Febrero 2016, 23:13 pm



Título: Problema con bucles if y while.[C]
Publicado por: telecocabreado21 en 5 Febrero 2016, 23:13 pm
Soy nuevo en esto de programar asi que es posible que sea una estupidez, pero no la veo. Asi que si sabeis cual es el problema por favor decidmelo.
El ejercicio es el siguiente:
tengo que escribir un programa que llame a una funcion MCD que realice el maximo comun divisor, el codigo que he escrito es el siguiente:

#include <stdio.h>
#include <stdlib.h>
int MCD(Numero1,Numero2)
{
    int PosDivi=1,MaxCD=0,PosDivj;
    while(PosDivi<=Numero1)
    {
        if((Numero1%PosDivi)==0)
        {
            PosDivj=1;
            while(PosDivj<=Numero2)
            {
                if(((Numero2%PosDivj)==0)&&(PosDivi==PosDivj))
                {
                    MaxCD=PosDivi;
                }
                PosDivj++;
                printf("a");
            }
            printf("b");
        }
        PosDivi++;
    }
    return MaxCD;
}

int main()
{
    int Divisor1, Divisor2;
    printf("introduce los divisores\n");
    scanf("%d,%d",&Divisor1,&Divisor2);
    printf("MCD=%d",MCD(Divisor1,Divisor2));
    return 0;
}

Intento que compare cada uno de los divisores de un numero con todos los divisores del otro, los 'printf' con a y b son para ver si el programa pasaba por los bucles y con ellos he descubierto que no lee el bucle while en el que se calculan los divisores de 'Numero2' asi que supongo que el problema estara ahi.
Un saludo y gracias de antemano ;D ;D

PD: En el build log me aparece el siguente mensaje:

-------------- Run: Debug in d (compiler: GNU GCC Compiler)---------------

Checking for existence: C:\Users\PEDRO\Desktop\d\bin\Debug\d.exe
Executing: "C:\Program Files\CodeBlocks/cb_console_runner.exe" "C:\Users\PEDRO\Desktop\d\bin\Debug\d.exe"  (in C:\Users\PEDRO\Desktop\d\.)
Process terminated with status 0 (0 minute(s), 7 second(s))


Título: Re: Problema con bucles if y while.[C]
Publicado por: MAFUS en 5 Febrero 2016, 23:35 pm
Los incrementos sin asignación:
Código
  1. PosDivj++;
  2. PosDivi++;
  3.  

El compilador te debe haber avisado de que
Código:
c.c:16:24: warning: operation on ‘PosDivj’ may be undefined [-Wsequence-point]
                 PosDivj=PosDivj++;

c.c:19:16: warning: operation on ‘PosDivi’ may be undefined [-Wsequence-point]
         PosDivi=PosDivi++;

La función debe ser algo así
Código
  1. int MCD(Numero1, Numero2) {
  2.    int PosDivi = 1;
  3.    int PosDivj;
  4.    int MaxCD = 0;
  5.  
  6.    while(PosDivi<=Numero1) {
  7.        if((Numero1 % PosDivi) == 0) {
  8.            PosDivj = 1;
  9.            while(PosDivj <= Numero2) {
  10.                if(((Numero2 % PosDivj) == 0) && (PosDivi == PosDivj)) {
  11.                    MaxCD = PosDivi;
  12.                }
  13.                PosDivj++;
  14.            }
  15.        }
  16.        PosDivi++;
  17.    }
  18.    return MaxCD;
  19. }


Título: Re: Problema con bucles if y while.[C]
Publicado por: telecocabreado21 en 5 Febrero 2016, 23:59 pm
Muchas gracias!! Es cierto que me daba esos avisos, y se han solucionado quitando las asignaciones, tambien he cambiado la delaracion de PosDivj y la he puesto junto con las otras dos variables declaradas, pero todavia debe de quedar algun fallo mas porque sigue sin entrar en el bucle while, si sirve, te adjunto al tema los mensajes que me da ahora el compilador y cambio el tema para borrar los errores ya resueltos.


Título: Re: Problema con bucles if y while.[C]
Publicado por: MAFUS en 6 Febrero 2016, 11:09 am
En tu nueva versión hay un fallo de lógica que en la anterior estaba bien:
Código
  1. if(((Numero2 % PosDivj) == 0) && (PosDivi == PosDivj))

La versión que ahora tienes no cumple su trabajo:
Código
  1. if((Numero2%PosDivj)==0)


Título: Re: Problema con bucles if y while.[C]
Publicado por: telecocabreado21 en 6 Febrero 2016, 11:48 am
Es cierto estaba haciendo pruebas y se me olvido añadirlo de nuevo, aun asi cuando lo pongo sigue sin darme la solucion porque sigue sin entrar en el bucle aunque ya no me da       ningun mensaje de error el compilador, estoy ya desesperado :-( jajaja. Muchas gracias de nuevo MAFUS, como ya dije antes soy novato y todavia tengo muchos fallos de este estilo, corrijo de nuevo el codigo.


Título: Re: Problema con bucles if y while.[C]
Publicado por: MAFUS en 6 Febrero 2016, 12:41 pm
Podrías probar de usar el algoritmo de Euclides que dice algo así:
1. Si el resto de la división entre el mayor y el menor es 0, el MCD es el menor.
2. Sino, realizar de nuevo la división entre el menor y el resto de la división anterior.
3. Repetir todo hasta que el punto 1 se cumpla.


Título: Re: Problema con bucles if y while.[C]
Publicado por: DMG87 en 7 Febrero 2016, 01:08 am
Código:
int mcd(int a, int b){
  int c;
  while (a != b){

    if (a > b)
      a = a - b;
    else
      b = b - a;

  }
  c = a;
  return c;
}