No es un bug, es una característica no documentada

viernes, 17 de octubre de 2014

Programación. Codificación de programas en C (IV)

21:34 Posted by Inazio , No comments
Subprogramas en C

En C no existen ni los procedimientos ni las funciones tal cual vistas.

¿Qué existe pues? La gran chapuza desde un punto de vista formal. Las funciones procedimentales (todo en uno, a partir de ahora llamadas funciones) que es un instrumento de lo más flexible para escribir subprogramas.
·         Devuelven un valor (como las funciones)
·         Admiten parámetros E, S o E/S (como los procedimientos)

Funciones en programas

Un programa en C consta de una o más funciones.

Tiene que tener necesariamente la función main

void main()

Puede tener otras funciones declaradas que serán usadas por main o por otras funciones que sean usadas en main o en funciones que son usadas por funciones que son usadas en main, o…
Es conveniente declarar una función antes de usarla, para que el compilador la reconozca cuando se encuentre una invocación a ella.

Una función (en sentido estricto) en C:
int factorial(int n)

Un procedimiento en C:
void intercambiar (int *a,int *b) /*Si es de entrada, sin asteriscos */

También admite además de las funciones que hayamos podido declarar en el fichero, funciones que haya en librerías.

·         Librerías del propio compilador: stdio.h, string.h, ctype.h, math.h, stdlib.h, time.h…
§  Para usarlas: #include<librería>
·         Librerías creadas por el usuario.
§  Para usarlas: #include”librería”

Declaración de una función en C

<tipo función><nombre función>(<lista parámetros formales>) {
       /* Declaración de variables locales */
       /* Instrucciones */
       return(expresión)
}

Como tipo función sirve cualquier tipo que se os pueda ocurrir (y otros que todavía no conocéis) más el tipo void que indica que la función no devuelve nada.

Return sólo hay que usarlo si el tipo no es void

Parámetros en funciones

Tenemos tres tipos de parámetros: E, S y E/S

C y otros lenguajes de programación sólo disponen de dos mecanismos para pasar parámetros.

·         Por valor à Sirve para parámetros de entrada
·         Por referencia à Sirve para parámetros de salida o entrada/salida

Paso de parámetros por valor

El valor de la variable que se pasa como parámetros o el resultado de evaluar la expresión que se ha puesto (parámetro actual) es copiado a una variable local de la función C.

Como esa variable local muere cuando termina de ejecutarse la función, no sirve para devolver nada.

int mi_funcion(int n){
       …
       n=30;
}

main()
{
       …
       a=7;
       f=mi_funcion(a);
}

Paso de parámetros por referencia

En vez de pasar el valor de la variable, se copia la dirección de la variable que contiene el valor.

Para hacer esto, obsérvese que como parámetro actual ponemos delante de la variable correspondiente el símbolo & y en la función invocada, como parámetro formal, aparecer delante un * cada vez que nos referimos a él.

int mi_proc(int *n){
       …
       *n=30;
}

main()
{
       …
       a=7;
       f=mi_proc(&a);
       …
}

Ejercicio:

Hacer válida una fecha. Crear una función que pasándole día, mes y año diga si es correcta

int fecha_correcta(int dia, mes, agno)
       return(dia_correcto(dia,mes,agno)&&mes_correcto(mes));

int mes_correcto(int mes)
       return(mes<0 &&mes>13);

int dia_correcto(int dia, int mes, int agno)
       return(dia<0&&dia<=días_mes(mes,agno);

int bisiesto(int agno)
       return(agno%4==0 && agno%100!=0 || agno%400==0);

int días_mes(int m, int a){
       switch m{
            case 1
            case 3
            case 5
            case 7
            case 8
            case 10
            case 12: return(31);
            break;
            case 4
            case 6
            case 9
            case 11: return(30);
            break;
            case 2: if (bisiesto(a))
                                   return(29);
                        else
                                   return(28);
                        break;
            default: return(0);
       }
}

main()
{
       …
       pedir_fecha(…)/* Pon lo necesario para que esa función pida al usuario día, mes y año guardándolos en las variables oportunas */
      
       while (!fecha_correcta(d,m,a))
            pedir_fecha(…);
}

Números aleatorios

Incluir <stdlib.h> y <time.h>

       srand((unsigned int)time(NULL)); /*forma CORRECTA de realizarlo */
       random=rand()%26 /*Con este ejemplo los números serán del 0 al 25 */

Tamaño de los tipos: sizeof()

#include<stdio.h>

main()
{
       long double tipo;
       printf(“El tamaño del tipo long doublé es: %d bytes \n”,sizeof(tipo));
}

Selección múltiple: Sintaxis y semántica

switch (variable){
       case valor1: … break;
       case valor2: … break;
       …
       Default: …;
}

El default es obligatorio.
En cuanto el valor de las variables coincide con el valor, se ejecutan TODAS las instrucciones que se encuentran a continuación HASTA QUE APAREZCA UN break.

Composición iterativa indexada

for(…;…;…) {…}

Consta de tres partes:
1.      Inicialización. Se ejecuta una vez al principio
2.      Condición para terminar. Se ejecuta el bucle mientras esa condición es cierta
3.      Cada vez. Esta parte se ejecuta cada vez que se ejecuta el contenido del bucle.

Ejemplos:

for(i=1;i<MAX;i++){…}
for(i=1,j=0;i<MAX;i++){…}
for(i=1;j=0;i<MAX && j>0;i++,j--){…}

Otras formas de iterar

Condición al final: do{…}while() Primero ejecuta y luego chequea una condición para ver si sigue ejecutando. Siempre se ejecuta mínimo una vez.

Lo que jamás hay que usar en C, pero lo permite, es:
·         etiqueta…;…;…;…; goto etiqueta;

Dos instrucciones especiales dentro del bucle:
·         break: Fuerza la salida del bucle aunque se cumpla la codición
·         continue: Se salta todo lo que queda de bucle y pasa a la siguiente iteración


En cualquier caso, usando cualquiera de las formas de iterar que hemos visto podemos hacer de todo. No es necesario usarlas todas para programar. Los programadores de C suelen usar el for por su flexibilidad.

0 comentarios:

Publicar un comentario