[C con Clase] Funciones

amauri d b_duhart en live.com.mx
Jue Ene 10 20:21:01 CET 2013




Gracias a ambos. 
Antonio:
Respecto a utilizar el array como parametro, había hecho eso hasta que, revisando el curso, vi que aún no sabía cómo hacer esto y que es distinto que con una sola variable. 
Respecto al bucle y las variables globales, tienes razón, me percaté cuando leí el código de nuevo viendo tu repuesta.
Y respecto a la parte de los algoritmos y los diagramas, sí me fue útil, aunque eso no me causaba problema, puesto que ya sabía sobre dicho tema.
Gracias de nuevo.

Ambos: 
Sigo sin tener claro por qué requiero repetir el tipo de parámetro al declarar la función, creí que bastaba con declararlo al principio del  programa: 

...
char tipo_orden;

void Ordenar(tipo_orden);



Date: Wed, 9 Jan 2013 08:22:38 +0100
From: antonio.arjona.melches en gmail.com
To: cconclase en listas.conclase.net
Subject: Re: [C con Clase] Funciones


  
    
  
  
    El 09/01/13 02:56, amauri d escribió:

    
    #include <iostream>

      using namespace std;

      

      int array_1[10],i,round;

      char tipo_orden;

       

      //La siguiente función ordena la cadena

      void Ordenar(tipo_orden)

      {

          int cambio=0;

      

          //Cuando el ordenamiento sea ascendente

          if(tipo_orden=='a')

          {

              round=0;

              do

              {

                  //Se revisan los elementos del array y se ordenan por
      pares

                  for(i=1;array_1[i];i++)

                  {

                      if(array_1[i]<array_1[i-1]) {cambio=array_1[i];
      array_1[i]=array_1[i-1]; array_1[i-1]=cambio;}

                  }

          

                  round++

              }

              while(array_1[round]); //El ciclo se repite mientras
      exista el elemento array_1[round], round es la pasada por el array

          }

      

          //Cuando el ordenamiento sea descendente

          else if(tipo_orden=='z')

          {

              round=0;

              do

              {

                  //Se revisan los elementos del array y se ordenan por
      pares

                  for(i=1;array_1[i];i++)

                  {

                      if(array_1[i]>array_1[i-1]) {cambio=array_1[i];
      array_1[i]=array_1[i-1]; array_1[i-1]=cambio;}

                  }

          

                  round++;

              }

              while(array_1[round]); //El ciclo se repite mientras
      exista el elemento array_1[round], round es la pasada por el array

          }

      }

    
    

    Hola amauri:

    

    lo primero que veo son las variables, y te comento:

    

    es aconsejable que uses variables locales en vez de globales, esto
    seria dentro de la función.

    

    luego declaras la función directamente, esto no esta mal, pero si
    seria aconsejable que la primera función que se vea al leer tu
    codigo sea main(), esto simplemente ayuda a interpretar mejor el
    código, por parte de las personas, pero esto supone que le tienes
    que informar al compilador que las funciones que llames desde main()
    u otra función, para ello dispones de la posibilidad de crear
    prototipos, de la siguiente forma:

    

    // declaras un prototipo de las funciones que hagas

    

    void MiFuncion(char, int, bool); // esto seria un prototipo de una
    función con tres parámetros de entrada y sin retorno (void)

    

    // en el prototipo solo necesitas usar el tipo de parámetro (char,
    int, float ....), pero puedes añadir a modo de explicación el
    parámetro

    // por poner un ejemplo el prototipo de una función que te diera la
    nota de fin de curso

    // a partir de un array de notas parciales, y la confirmación de
    asistencia mínima:

    

    int NotasFinDeCurso( int NotasTrimestrales, bool AsistenciaMinima);

    

    int OtraFuncion(); // esto seria un prototipo de una función sin
    parámetros que retorna un entero (int)

    

    // declaración de main() después de los prototipos

    int main()

    {

         // llamo a MiFuncion(), como antes hay un prototipo de esta
    función

         // el compilador sabe que existe y la busca en el código
    restante

    

        MiFuncion(cadena[10], 5, true);

    

        return 0;

    }

    

    // después de main() declaras tus funciones

    

    void MiFunción(char cadena[10], int numero, bool SIoNO) 

    {

        // el código de la función

        ...

    }

    

    // otra función

    int NotasFinDeCurso( int Notas, bool Asistencia)

    {

        ... // el codigo

    }

    

    de esta forma es mucho mas fácil de leer por parte de las personas

    

    luego, en la declaración de la función solo especificas un parámetro
    para el sentido de ordenación: void Ordenar (tipo_orden)

    tienes que especificar de que se trata, en tu caso seria: void
    Ordenar (char tipo_orden) // de hay el error que te da el compilador

    

    creo que usar un char para indicar una decision es complicarse la
    vida, yo usaria un bool para las 2 opciones: false para ordenar de
    mayor a menor y true de menor a mayor, o un int si las opciones son
    3 o mas.

    

    luego también necesitarías incluir un parámetro para los arrays, el
    motivo es que de momento en tu código creas globalmente una cadena
    numerica: int array_1[10]; y la manejas directamente desde la
    función:

    

        if ( array_1[i] < array_1[i-1] )

    

    esto te fuerza a no poder usar la función con otras cadenas, y la
    solución es pasar la cadena por medio de un parámetro, para
    explicarlo veamos unas llamadas a la función desde main:

    

    int main()

    {

        // declaro varios arrays para probar la función

        int arrayNumerico[] = {1, 3, 5, 7, 9, 0, 8, 6, 4, 2}; // array
    de 10 dígitos

        char arrayAlfanumerico[] = {'a', '0', 'c', '9', 'b', 'h', '3',
    '5', '2', '1'}; // array de 10 caracteres

    

        // llamo a mi función con el primer array de mayor a menor

        Ordenar(arrayNumerico, false);

        cout << arrayNumerico << endl; // imprimo el array
    para ver el resultado

    

        // llamo a mi función con el primer array de menor a mayor

        Ordenar(arrayNumerico, true);

        cout << arrayNumerico << endl;

    

        // llamo a mi función con el segundo array de mayor a menor

        Ordenar(arrayAlfanumerico, false);

        cout << arrayAlfanumerico << endl;

    

        // llamo a mi función con el segundo array de menor a mayor

        Ordenar(arrayAlfanumerico, true);

        cout << arrayAlfanumerico << endl;

    } 

    

    como se puede observar para que sea útil se debe poder indicar que
    array quieres ordenar, además del sentido de ordenación...

    

    luego tienes cosas que arreglar en el código como los bucles, pero
    de momento ya es mucho lo que te he dicho, así que animo, sigue
    intentándolo y si ves que no te sale simplifica, y hazlo por partes,
    por ejemplo, primero ordenando directamente una cadena, cuando veas
    que el código funciona, y como funciona, intenta separarlo en la
    función, y posteriormente añadir la opción de cambiar el orden de
    ordenación, lo importante es entender cada parte de código que
    escribas y saber bien lo que hace, para ello ayuda mucho hacer
    diagramas de flujo, no te asustes por el nombre tan solo son unos
    esquemas gráficos,  te dejo un enlace al respecto:

    

    
      
    http://www.slideshare.net/bleoav100/algoritmos-y-diagramas-de-f-lujo

    

    espero que algo de esto te sirva de ayuda.

  


_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
 		 	   		  
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130110/abfe1533/attachment.html>


Más información sobre la lista de distribución Cconclase