[C con Clase] Funciones

Antonio Arjona antonio.arjona.melches en gmail.com
Mie Ene 9 08:22:38 CET 2013


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.nachocabanes.com/c/curso/cc03.php>http://www.slideshare.net/bleoav100/algoritmos-y-diagramas-de-f-lujo

espero que algo de esto te sirva de ayuda.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130109/fd357dfa/attachment.html>


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