Problema con bucles if y while.[C]

Iniciado por telecocabreado21, 5 Febrero 2016, 23:13 PM

0 Miembros y 2 Visitantes están viendo este tema.

telecocabreado21

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))

MAFUS

Los incrementos sin asignación:
PosDivj++;
PosDivi++;


El compilador te debe haber avisado de que

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í
int MCD(Numero1, Numero2) {
    int PosDivi = 1;
    int PosDivj;
    int MaxCD = 0;
   
    while(PosDivi<=Numero1) {
        if((Numero1 % PosDivi) == 0) {
            PosDivj = 1;
            while(PosDivj <= Numero2) {
                if(((Numero2 % PosDivj) == 0) && (PosDivi == PosDivj)) {
                    MaxCD = PosDivi;
                }
                PosDivj++;
            }
        }
        PosDivi++;
    }
    return MaxCD;
}


telecocabreado21

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.

MAFUS

En tu nueva versión hay un fallo de lógica que en la anterior estaba bien:
if(((Numero2 % PosDivj) == 0) && (PosDivi == PosDivj))

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

telecocabreado21

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.

MAFUS

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.

DMG87


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;
}