Funciones

 

1. If/else

En lenguaje C, para escribir una instrucción alternativa doble (if else) se utiliza la sintaxis:

if ( <expresión_lógica> )
{
   <bloque_de_instrucciones_1>
}
else
{
   <bloque_de_instrucciones_2>
}

A la <expresión_lógica> de una instrucción alternativa doble (if else) también se le denomina condición.

Para que se ejecute el <bloque_de_instrucciones_1>, la condición tiene que ser verdadera. Por el contrario, si la condición es falsa, se ejecutará el <bloque_de_instrucciones_2>.

En resumen, en C una instrucción if else (alternativa doble) permite seleccionar, por medio de una condición, el siguiente bloque de instrucciones a ejecutar, de entre dos posibles.

Ejemplo: Se quiere escribir un programa que:

1º) Pida por teclado la nota (dato real) de una asignatura.
2º) Muestre por pantalla:

  • "APROBADO", en el caso de que la nota sea mayor o igual que 5.
  • "SUSPENDIDO", en el caso de que la nota sea menor que 5.

De modo que, por pantalla se verá, por ejemplo:


   Introduzca nota (real): 7.5

   APROBADO

Otra posibilidad es:


   Introduzca nota (real): 3.5

   SUSPENDIDO

Cuando un bloque de instrucciones sólo contiene una instrucción, los caracteres abrir llave ({) y cerrar llave (}) son opcionales. Por tanto, en lenguaje C, para resolver el problema del ejemplo se puede escribir:

#include <stdio.h>

int main()
{
   float nota;

   printf( "\n   Introduzca nota (real): " );
   scanf( "%f", &nota );

   if ( nota >= 5 )
      printf( "\n   APROBADO" );
   else
      printf( "\n   SUSPENDIDO" );

   return 0;
}

Cuando en el código fuente de un programa existe una condición de la cual depende que a continuación se ejecuten unas instrucciones u otras, se dice que existe una bifurcación.


2. Switch

Esta estructura selecciona entre varias posibilidades, dependiendo del valor de la expresión. Cuando en la estructura si (if) todas las condiciones utilizan la igualdad de una variable determinada con constantes predefinidas, se puede utilizar la instrucción segun_sea (switch), en dicha instrucción existen más de dos opciones. La estructura segun_sea (switch) evalúa una expresión que puede tomar n valores distintos; según con cuál de estos valores coincida, se ejecutarán ciertas acciones, es decir, el programa o algoritmo seguirá un determinado camino entre los n posibles. Dicha expresión sólo acepta valores enteros o caracteres para entrar a la opción y el operador de relación es el igual.

 



Se compara la “expresión” (puede ser una sola variable) con cada una de las opciones “const” y en el momento de encontrar una constante idéntica se ejecutan la(s) instrucción(es) correspondiente(s) a ese caso. Al terminar de realizar las instrucciones del caso, se debe usar la palabra reservada salir (break) para que vaya al final de la estructura. Si ninguno de los casos cumple con la expresión, se puede definir un caso por omisión, que también puede tener instrucciones; la computadora.

 

#include <stdio.h>

#include <conio.h>

int main()

{

int dia;

printf("Escriba el número de día: \n");

scanf("%d",&dia);

switch(dia)

{

case 1: printf("El día %d es Lunes",dia);

break;

case 2: printf("El día %d es Martes",dia);

break;

case 3: printf("El día %d es Miércoles",dia);

break;

case 4: printf("El día %d es Jueves",dia);

break;

case 5: printf("El día %d es Viernes",dia);

break;

case 6: printf("El día %d es Sábado",dia);

break;

case 7: printf("El día %d es Domingo",dia);

break;

default: printf("El día no existe");

}

getch();

return 0;

}


3. While

En lenguaje C, para escribir una instrucción while (repetitiva mientras) se utiliza la sintaxis:

while ( <expresión_lógica> )
{
   <bloque_de_instrucciones>
}

Cuando el <bloque_de_instrucciones> sólo contiene una instrucción, los caracteres abrir llave ({) y cerrar llave (}) son opcionales.

Por otra parte, al igual que en las instrucciones alternativas doble y simple, a la <expresión_lógica> de una instrucción repetitiva while, también se le llama condición.

Para que se ejecute el <bloque_de_instrucciones>, la condición tiene que ser verdadera. Por el contrario, si la condición es falsa, el <bloque_de_instrucciones> no se ejecuta.

Por tanto, cuando el flujo de un programa llega a un bucle while, existen dos posibilidades:

  1. Si la condición se evalúa a falsa, el bloque de instrucciones no se ejecuta, y el bucle while finaliza sin realizar ninguna iteración.
  2. Si la condición se evalúa a verdadera, el bloque de instrucciones sí que se ejecuta y, después, se vuelve a evaluar la condición, para decidir, de nuevo, si el bloque de instrucciones se vuelve a ejecutar o no. Y así sucesivamente, hasta que, la condición sea falsa.

El <bloque_de_instrucciones> de un bucle while puede ejecutarse cero o más veces (iteraciones). Si el <bloque_de_instrucciones> se ejecuta al menos una vez, seguirá ejecutándose repetidamente, mientras que, la condición sea verdadera. Pero, hay que tener cuidado de que el bucle no sea infinito.

Cuando la condición de un bucle while se evalúa siempre a verdadera, se dice que se ha producido un bucle infinito, ya que, el programa nunca termina. Un bucle infinito es un error lógico.

Es importante hacer hincapié en el hecho de que, en un bucle while, primero se evalúa la condición y, en el caso de que ésta sea verdadera, entonces se ejecuta el bloque de instrucciones. Veremos que, en el bucle do while, el procedimiento es al revés. En él, primero se ejecuta el bloque de instrucciones y, después, se evalúa la condición.

Para que un bucle while no sea infinito, en el bloque de instrucciones debe ocurrir algo para que la condición deje de ser verdadera. En la mayoría de los casos, la condición se hace falsa al cambiar el valor de una variable.

En resumen, una instrucción repetitiva while permite ejecutar, repetidamente, (cero o más veces) un bloque de instrucciones, mientras que, una determinada condición sea verdadera.

Ejemplo 1: Se quiere escribir un programa que muestre por pantalla los primeros diez números naturales:


   1 2 3 4 5 6 7 8 9 10

En lenguaje C, para resolver el problema de este ejemplo se puede escribir:

#include <stdio.h>

int main()
{
   int contador;

   printf( "\n   " );

   contador = 1; /* Inicialización del contador */
   while ( contador <= 10 )        /* Condición */
   {
      printf( "%d ", contador );   /* Salida */
      contador++;    /* Incremento del contador */
   }

   return 0;
}



4. For

En lenguaje C, para escribir una instrucción for (repetitiva para) se utiliza la sintaxis:

for ( <expresión_1> ; <expresión_2> ; <expresión_3> )
{
   <bloque_de_instrucciones>
}

Cuando el <bloque_de_instrucciones> sólo contiene una instrucción, los caracteres abrir llave ({) y cerrar llave (}) son opcionales.

Por otro lado, el bucle 
for es ideal usarlo cuando, de antemano, ya se sabe el número de veces (iteraciones) que tiene que ejecutarse un determinado bloque de instrucciones.

El bucle 
for es una variante del bucle while y, al igual que éste, puede iterar cero o más veces. Sin embargo, el bucle for sólo se suele usar cuando se conoce el número exacto de veces que tiene que iterar el bucle. Éste es el caso del problema planteado en el ejemplo 1 del apartado instrucción while en C, en el cual, se sabe de antemano que el bucle tiene que iterar, exactamente, diez veces.

Ejemplo: Por tanto, dicho problema, se puede resolver con una instrucción repetitiva for de la siguiente forma:

#include <stdio.h>

int main()
{
   int contador;

   printf( "\n   " );

   for ( contador=1 ; contador<=10 ; contador++ )
       printf( "%d ", contador );

   return 0;
}

En este caso, <expresión_1>, <expresión_2> y <expresión_3>, se corresponden, respectivamente, con:

  • la inicialización de la variable contador,
  • la condición de salida del bucle y
  • el incremento de la variable contador

de una instrucción repetitiva mientras (while).



 5. Funciones Matemáticas

El lenguaje C nos facilita una biblioteca de funciones matemáticas entre las que se incluyen las de uso más habitual como pueden ser: valor absoluto, potencia de un número elevado a otro, raíz cuadrada, funciones trigonométricas (seno, coseno, tangente, etc.), redondeo, exponenciación, logaritmo decimal, logaritmo neperiano y otras.

Para utilizar las funciones matemáticas indicadas a continuación es necesario incluir en la cabecera de nuestros programas la siguiente declaración: #include <math.h>

El resultado de aplicar una función matemática es un valor numérico de tipo double (aunque el resultado puede ser un valor entero, internamente C lo considerará como un valor tipo decimal de doble precisión o tipo double)

Las funciones disponibles de uso más habitual son las siguientes:

Funciones Matemáticas

Significado

Funciones Matemáticas

Significado

fabs (x)

Valor absoluto de x

ceil (x)

Redondeo entero superior

pow (x, y)

Potencia de x elevado a y

floor (x)

Redondeo entero inferior

sqrt (x)

Raíz cuadrada de x

exp (x)

Exponenciación (número e elevado a x, siendo e = 2.71828)

sin (x)

Seno de x

log (x)

Logaritmo neperiano de x

cos (x)

Coseno de x

log10 (x)

Logaritmo decimal de x

tan (x)

Tangente de x

atan (x)

Arcotangente de x

 

La biblioteca de funciones matemáticas de C es más amplia de lo que hemos expuesto (por ejemplo se dispone de más funciones trigonométricas y de otros tipos que las aquí indicadas), pero con estas funciones quedan cubiertos los cálculos más habituales.

Las funciones relacionadas con ángulos trabajan en radianes. Por tanto para operar con grados habremos de realizar la conversión oportuna.


6. Funciones de cadena

C no dispone de un tipo de dato String para trabajar con cadenas de texto como en otros lenguajes. En su lugar, una cadena está representada por un array de caracteres (char) habitualmente terminado con el carácter especial de fin de cadena << \0 >>. Este carácter especial no se visualiza por pantalla, podríamos decir que está pero es "transparente" o "no visible" a través de la pantalla.

Comentamos previamente que las funciones para pedir datos al usuario scanf y gets introducen automáticamente un fin de cadena (\0) al final del texto capturado. En estos casos el array de caracteres tiene en C un carácter adicional además del texto visible, el correspondiente al final de cadena. Por ejemplo la longitud en caracteres de la palabra “abc” introducida por el usuario con scanf o gets no es tres, sino cuatro, ya que a los tres caracteres hemos de sumarle el carácter especial de final de cadena representado con \0.

 

CONOCER LA LONGITUD DE UNA CADENA CON SIZEOF

Podemos declarar cadenas de varias maneras. Por ejemplo:

char pruebaCadena [3]; pruebaCadena [0]= 'a'; pruebaCadena [1]= 'b'; pruebaCadena [2]= 'c';

char pruebaCadena [] = "abc";

En el primer caso el array es de tres caracteres, el de índice cero es a, el de índice 1 es b, el de índice 2 es c. En el segundo caso el array es de cuatro caracteres al introducir C el carácter de fin de cadena \0.

Llamamos tamaño (length) de un array al número de elementos de que consta. En el caso del array de caracteres “abc” con el carácter de fin de cadena decimos que consta de 4 elementos (contando el carácter especial de fin de cadena). Podemos conocer la longitud de un array de caracteres usando la función sizeof, siendo la sintaxis a emplear: sizeof (nombreDelArray).

Escribe este código, que ya debemos ser capaces de comprender con lo estudiado hasta ahora.

#include <stdio.h>

#include <stdlib.h>

int main() {

    int i = 0; int j=0; char pruebaCadena [] = "abc";

    while (pruebaCadena[i] != '\0') { printf ("%c", pruebaCadena[i]); i=i+1; }

    printf ("%cUsando \\0: ", '\n');

    while (pruebaCadena[j] != '\0') { printf ("Iteracion %d - ", j+1); j=j+1; }

    printf ("%cUsando sizeof: ", '\n');

    j= 0; //Reinicializar j

    while (j < sizeof(pruebaCadena)) { printf ("Iteracion %d - ", j+1); j=j+1; }

    printf ("\nsizeof pruebaCadena es %d", sizeof(pruebaCadena));

    return 0; // Ejemplo aprenderaprogramar.com

}

 

Aquí mostramos distintas formas de recorrer un array de caracteres. La primera se basa en buscar el carácter de fin de cadena \0. En este ejemplo el bucle while recorre a – b – c (tres iteraciones). La segunda se basa en usar sizeof. En este ejemplo el bucle while recorre a – b – c - \0 (cuatro iteraciones).

 

LIBRERÍA STRING.H FUNCIONES STRCPY, STRLEN, STRCAT, STRCMP

A través de la librería string.h podemos usar distintas funciones relacionadas con cadenas. Para usar estas funciones debemos escribir #include <string.h> en cabecera de nuestro programa. A continuación relacionamos algunas de las funciones disponibles.

Función

Significado y ejemplo aprenderaprogramar.com

strcpy (arg1, arg2)

Copia arg2 en arg1. Ejemplo: strcpy (cadena, “control”);

strlen (arg1)

Devuelve la longitud del texto representado por arg1. Ejemplo: strlen(cadena1)

strcat (arg1, arg2)

Concatena las cadenas representadas por arg1 y arg2. Ejemplo: strcat(cadena1, “ unidades”)

strcmp (arg1, arg2)

Devuelve 0 si las cadenas representadas por arg1 y arg2 son iguales, o un valor menor que cero si arg1 precede alfabéticamente a arg2. Ejemplo: resComparacion = strcmp (cadena4, cadena2);

 

Escribe el siguiente código y comprueba los resultados de ejecución.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
    char cadena1 [] ="aprenderaprogramar.com"; char cadena2 [sizeof(cadena1)];
    char cadena3[] = " ok!";    char cadena4[50];
    int resComparacion;
    printf ("Cadena1 vale %s y Cadena2 vale %s \n", cadena1, cadena2);
    strcpy (cadena2, cadena1); //Copia cadena1 en cadena2
    printf ("Cadena1 vale %s y Cadena2 vale %s \n", cadena1, cadena2);
    printf ("Cadena1 tiene longitud %d (uno mas contando \\0) \n", strlen(cadena1));
    strcpy (cadena4, cadena1) ;
    printf ("Concatenacion %s \n", strcat(cadena4, cadena3));
    resComparacion = strcmp (cadena4, cadena2);
    printf ("Cadena1 vale %s y Cadena2 vale %s \n", cadena1, cadena2);
    printf ("Cadena3 vale %s y Cadena4 vale %s \n", cadena3, cadena4);
    if (resComparacion ==0) {
        puts ("Las cadenas 1 y 2 son iguales");
    }
    resComparacion = strcmp (cadena1, cadena3);
    if (resComparacion >0) {
        puts ("La cadena 1 precede alfabeticamente a la cadena 3");
    }
    return 0; // Ejemplo aprenderaprogramar.com
}

 

Nota: las cadenas en C no se pueden copiar escribiendo cadena1 = cadena2. En su lugar, debe usarse la función strcpy.


7. Funciones creadas por usuario

En programación, una función es un grupo de instrucciones con un objetivo particular y que se ejecuta al ser llamada desde otra función o procedimiento. Una función puede llamarse múltiples veces e incluso llamarse a sí misma (función recurrente).

Las funciones pueden recibir datos desde afuera al ser llamadas a través de los parámetros y puede entregar un resultado.

Una función tiene un nombre y un conjunto de instrucciones que son ejecutadas cuando se llama a la función. Son funciones setup() y loop() de las que ya se ha hablado anteriormente.

Las funciones de usuario pueden ser escritas para realizar tareas repetitivas y para reducir el tamaño de un programa. Segmentar el código en funciones permite crear piezas de código que hacen una determinada tarea y volver al área del código desde la que han sido llamadas.



Las funciones se declaran asociadas a un tipo de valor. Este valor será el que devolverá la función, por ejemplo ‘int’ se utilizará cuando la función devuelva un dato numérico de tipo entero. Si la función no devuelve ningún valor entonces se colocará delante la palabra “void”, que significa “función vacía”

Sintaxis:

1

2

3

tipo nombreFunción (parámetros) {

   instrucciones;

 


 


Comentarios