[ Foro de C++ ]

ayuda de ejecucion....

07-Apr-2011 19:02
oscar gomez
5 Respuestas

Agradecerle de ante mano su tiempo y esa vocacion tan valiosa de enseñar por que la verdad no te imaginas lo importante que es tu ayuda para nosotros.

Profesor mi inquietud tiene que ver con un programa que plantee en pascal pero que decidi resolver en c++ para practicar este lenguaje tambien.El problema era el referente a:

Un arreglo de números se llama partidario si todo número que está en una casilla par (2,4,…) es mayor que cualquiera de los números que están en las casillas impares (1,3,5,…). Escriba un programa que ( SEA  EFICIENTE EN SU RESPUESTA, es decir, en el momento que encuentre que alguno de los elementos no cumple la condicion del enunciado no siga recorriendo el resto del array ) lea un arreglo de números enteros y luego, diga si es partidario o no.

Por ejemplo, si el arreglo es el siguiente:

 0    1    2    3     4    5    6   7   8    9 //indices del arreglo    
100 5 200 1 1000 0 600 50 300 4    //valores del arreglo

En este ejemplo el programa debe escribir: es partidario.

Tu me indicabas esta opcion:
Si cualquier número de posición par tiene que ser mayor que TODOS los de posiciones impares, yo daría una primera pasada para descubrir el mayor de los valores de posiciones impares.

Después, en una segunda pasada, vas comparando ese valor memorizado con el valor de cada posición par. En cuanto encuentres un valor que no cumpla, interrumpes el proceso (puedes usar un "repeat..until" para eso). Si llegas al final sin encontrar valores incorrectos, es que sí era partidario.


Bien pues lo desarrolle de la siguiente manera:

#include <iostream>
#include <string>
#include <iomanip>
#include <stdlib.h>
using namespace std;



//Funcion que pide el orden del vector y luego lee sus elementos
void leer_vector(int vector[], int &orden)
{
   cout<<"Ingrese el tamaño del vector? ";
   cin>>orden;
   for (int ren=0; ren < orden; ren++)
       {
           cout<<"vector ["<<ren<<"]: ";
           cin>>vector[ren];
       }
    cout<<"\n\n";  
}

//Funcion que muestra los elementos del vector
void muestravector(int vector[], int orden)
{
   for (int ren=0; ren<orden; ren++)
   {
       cout<<setw(4)<<vector[ren];
       
   }
    cout<<"\n\n";  
}

int main()
{
   int vector[20];
   int max,orden,cont;
   leer_vector(vector,orden);
   muestravector(vector,orden);
   
   max=vector[1];
   for(cont=3;cont<orden;cont++)
   {
                               
     if(cont % 2!=0)
      {
        if(max<vector[cont])
        {
          max=vector[cont];
        }  
       }
    }

 cont=0;
 do
  {
    if(vector[cont]<max)
    {
     cont=cont+2;
     }                            
   } while(vector[cont]>max || cont>orden);
   
   if (cont>orden)
    {
      cout<<"El vector es partidario"<<"\n";
      }
      else
       {
         cout<<"el vector NO  es partidario"<<"\n";
         }        
 
 system("pause");
}

el problema es que porejemplo cuando ejecuto el siguiente vector:

20  50  60  90  3  5  1  2  25  40

al ejecutar el codigo que te indique antes el resultado es el esperado, es decir ,el vector no es partidario, bien pero cuando ejecuto de manera intencionada para que la respuesta sea que el vector es partidario, porejemplo con el siguiente vector que cumple con ello:

100  50  120  90  98  5  97  2  110  40

al ejecutar el codigo el programa se queda ahi como bloqueado sin mostrarme el resultado esperado que seria el vector es partidario, por que puede estar pasandome esto profesor nacho , o si es que en el codigo hay algo que no es correcto? por tu ayuda mil gracias.


11-Apr-2011 19:28
Nacho Cabanes (+30)

El problema es el mismo que en la versión de Pascal: las condiciones:

Si lo comparas con la versión en Pascal y lo quieres hacer de la misma forma, lo que antes era

until((vect[cont] < max) or (cont > orden));

ahora, al ser "while" (la operación contraria), se convertiría en:

while((vector[cont] > max) && ((cont < orden));

Es decir, el > se convierte en < y viceversa, pero los "o" se convierten en "y".

Aun así, lo haces de una forma que resulta antinatural para C y C++. Sonaría más natural recorrer el array con un "for" que aumente de 2 en 2: en vez de

for(cont=3;cont<orden;cont++)
   {
                               
     if(cont % 2!=0)
     {

podrías hacer

for(cont=3; cont<orden; cont+=2)
   {

De la misma forma, la comprobación del "do..while" se podría hacer con un "for" que recorriera todos los pares, usando "break" para interrumpir las repeticiones si encuentras un valor que no cumpla.


14-Apr-2011 11:47
oscar gomez

Buenos dias profesor Nacho, mil gracias por atendernos por que sabemos de tu poco tiempo y que aun asi estas pendiente de nosotros, GRACIAS POR TU VOCACION DE EXCELENTE PROFESOR.

Profesor es que realice las observaciones que me sugeriste pero aun asi el resultado no es el esperado,me gustaria me revizaras en que puedo estar fallando, el codigo completo es el siguiente:



#include <iostream>
#include <string>
#include <iomanip>
#include <stdlib.h>
using namespace std;



//Funcion que pide el orden del vector y luego lee sus elementos
void leer_vector(int vector[], int &orden)
{
   cout<<"Ingrese el tamaño del vector? ";
   cin>>orden;
   for (int ren=0; ren < orden; ren++)
       {
           cout<<"vector ["<<ren<<"]: ";
           cin>>vector[ren];
       }
   cout<<"\n\n";  
}

//Funcion que muestra los elementos del vector
void muestravector(int vector[], int orden)
{
   for (int ren=0; ren<orden; ren++)
   {
       cout<<setw(5)<<vector[ren];
       
   }
   cout<<"\n\n";  
}

int main()
{
   int vector[20];
   int max,orden,cont;
   leer_vector(vector,orden);
   muestravector(vector,orden);
   
   max=vector[1];
   for(cont=3;cont<orden;cont+=2)  // *** como me sugeriste
   {
     if(max<vector[cont])
       {
         max=vector[cont];
       }  
    }



cont=0;
do
{
 if(vector[cont]>max)
  {
    cont=cont+2;
  }                            
}while((vector[cont] > max)&&(cont < orden));//** como sugeriste


   
   if (cont>orden)
   {
     cout<<"El vector es partidario"<<"\n";
     }
     else
       {
         cout<<"el vector NO  es partidario"<<"\n";
         }        
 
 system("pause");
}

al ejecutarlo porejemplo para:
100  5  200  1  1000  0  600  50  300  4
me dice que NO ES PARTIDARIO , lo cual es incorrecto!!!!

incluso si realizo la siguiente verificacion despues
del Do...While :...

  if ((cont>orden)||(vector[cont]<max))
   {
     cout<<"El vector es partidario"<<"\n";
     }
     else
       {
         cout<<"el vector NO  es partidario"<<"\n";
         }        
 
 system("pause");
}

tampoco me da la respuesta correcta  

Pido tu ayuda nuevamente en este ejercicio pues una vez hechas tus sugerencias aun no me sigue dando respuesta correcta segun el caso sea o no partidario,ayudame a ver si es que estoy haciendo algo mal o  contradictorio.

y como podria hacer respecto a lo que me dices que reemplazar el do ...while por un for utilizando break????

gracias por tu paciencia a nuestras dudas o vacios pero que poco a poco gracias a tus explicaciones vamos superando MIL GRACIAS.


21-Apr-2011 17:02
Nacho Cabanes (+30)

Yo lo plantearía de forma más sencilla:

- Buscar el mayor de los impares.

- Recorrer todos los pares; si alguno es menor que el máximo, se avisa de que el array no es partidario y se detiene la ejecución.

- Si se ha podido recorrer todos los pares hasta el final, sin detener la ejecución, es porque el array sí era partidario.

Esto se podría conseguir así:

-------

#include <iostream>
#include <string>
#include <iomanip>
#include <stdlib.h>
using namespace std;



//Funcion que pide el orden del vector y luego lee sus elementos
void leer_vector(int vector[], int &orden)
{
   cout<<"Ingrese el tamaño del vector? ";
   cin>>orden;
   for (int ren=0; ren < orden; ren++)
       {
           cout<<"vector ["<<ren<<"]: ";
           cin>>vector[ren];
       }
   cout<<"\n\n";  
}

//Funcion que muestra los elementos del vector
void muestravector(int vector[], int orden)
{
   for (int ren=0; ren<orden; ren++)
   {
       cout<<setw(5)<<vector[ren];
       
   }
   cout<<"\n\n";  
}

int main()
{
   int vector[20];
   int max,orden,cont;
   leer_vector(vector,orden);
   muestravector(vector,orden);
   
   max=vector[1];
   for(cont=3;cont<orden;cont+=2)  // Buscamos mayor de los impares
   {
     if(max<vector[cont])
       {
         max=vector[cont];
       }  
   }


   for(cont=0;cont<orden;cont+=2)  // Comparamos con los pares
   {
     if(vector[cont] < max)
       {
         cout<<"el vector NO  es partidario"<<"\n";
         return 1;
       }  
   }

   // Si llegamos hasta aqui, es que es partidario
   cout<<"El vector es partidario"<<"\n";
 
 system("pause");
 return 0;
}


21-Apr-2011 19:51
oscar gomez

Cordial saludo profesor Nacho, gracias por tu tiempo.
profesor no entieindo por que haces:

for(cont=0;cont<orden;cont+=2)  // Comparamos con los pares
   {
     if(vector[cont] < max)
       {
         cout<<"el vector NO  es partidario"<<"\n";
         return 1;
       }  
   }


es decir, que hace este return 1; al estar dentro de la funcion main() ??
gracias por su ayuda


22-Apr-2011 13:38
Nacho Cabanes (+30)

Un "return" devuelve un valor de una función, y, si no es la última orden, interrumpe la ejecución de la función. Se podría haber conseguido lo mismo interrumpiendo con un "break" y añadiendo un "if" a continuación para comprobar si se ha llegado al final porque realmente haya terminado el bucle o porque se haya interrumpido.

En "main", por convenio, un "return 0" indica que el programa ha terminado sin errores, y si se devuelve otro número es para indicar que se ha encontrado un situación anómala.

Mira el apartado 7.11 del curso de C:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=323






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)