Traductor

FUNCIONES Y ESTRUCTURA DE DATOS


  • Funciones:
 Es un conjunto de líneas de código que realizan una tarea específica y puede retornar un valor. 
Las funciones pueden tomar parámetros que modifiquen su funcionamiento. Las funciones son utilizadas para descomponer grandes problemas en tareas simples y para implementar operaciones que son comúnmente utilizadas durante un programa y de esta manera reducir la cantidad de código.
  •  Estructura de datos: 
 puede ser declarada inicialmente escribiendo una palabra reservada, luego un identificador.
para la estructura y un nombre para cada uno de sus miembros, sin olvidar los tipos de datos que estos representan. Generalmente, cada miembro se separa con algún tipo de operador, carácter o palabra reservada.
  • Arreglo de parámetros:   

permite guardar una relación de varios a uno: varios argumentos pueden ser representados por un único arreglo de parámetros. En otras palabras, los arreglos de parámetros permiten listas de argumentos de tamaño variable. se declara con el modificador params.
 Sólo puede haber un arreglo de parámetros en cada método, y siempre debe ser el último parámetro especificado. 
El tipo del arreglo de parámetros debe ser siempre un tipo arreglo unidimensional. Al llamar a la función se puede pasar uno o varios argumentos del tipo del arreglo.


Ejemplo de Arreglos como Parámetros:



Prog15.cpp

#include <stdio.h>
#include <conio.h>
#include <string.h>
void proc1(int vector[]);
void main() {
clrscr();
//creando arreglo y cargandolo
int lista[5]= {10,11,12,13,14};
// mandandolo a procedimiento recordar como se manda sin []
proc1(lista);
// desplegando arreglo lista y observar que datos salen
for(int reng=0; reng<=4; reng++)
printf("%d \n",lista[reng]);
getchar();
} // termina main
void proc1(int vector[])
{
// sumandole 50 a lo que se tenia en arreglo lista
// es decir vector queda cargado con 60,61,62,63,64
for(int reng=0; reng<=4; reng++)
vector[reng]=vector[reng]+ 50;
// observar que no se regresa nada
} //termina proc1
corrida:




Es de recordar que los cambios que le hagan al arreglo dentro de la función se reflejaran en el arreglo original, es por esto que si se quiere modificar un arreglo en una función no hay necesidad de regresar ningún valor.

  •  Registro como parámetros:   
De una función o procedimiento se tiene que crear el tipo de dato que representa al registro, el siguiente programa crea un tipo de dato registro con identificador TAlumno, que después será usado en los procedimientos Leer Registro y Mostrar Registro.
Imagen de Registro



 A-Ejemplo donde visualicen la conversión del programa estructurado en programa modular utilizando las funciones:
/*Programa que calcula y muestra el resultado de la suma, resta, mult o división de dos números introducidos por el usuario, segun la opcion elegida*/

#include<stdio.h> //Libreria estandar de entradas y salidas
#include<stdlib.h> //Libreria estandar.

float num1, num2; //Variables globales num1 y num2

void leer() //Definicion de la funcion leer
{ //Inicio del cuerpo de la funcion
printf(“Ingrese valor 1: “); //Solicita el valor del primer dato
scanf(“%f”,&num1); //Lee el dato y lo guarda en la variable num1
printf(“Ingrese valor 2: “); //Solicita el valor del segundo dato
scanf(“%f”,&num2); //Lee el dato y lo guarda en la variable num2
} //Fin de la función

void sumar() //Definicion de la funcion sumar
{ //Inicio del cuerpo de la funcion
float suma; //Variable local suma
suma = num1 + num2; //Operacion para calcular suma
printf(“Suma = %.2f\n”,suma); //Imprime en pantalla el valor de suma
} //Fin del cuerpo de la función

void restar() //Definicion de la funcion restar
{ //Inicio del cuerpo de la funcion
float resta; //Variable local resta
resta = num1 – num2; //Operacion para calcular resta
printf(“Resta = %.2f\n”,resta); //Imprime en pantalla el valor de resta
} //Fin del cuerpo de la función

void multiplicar() //Definicion de la funcion multiplicar
{ //Inicio del cuerpo de la funcion
float mult; //Variable local mult
mult = num1 * num2; //Operacion para calcular multiplicacion
printf(“Multiplicacion = %.2f\n”,mult); //Imprime en pantalla el valor de mult
} //Fin del cuerpo de la funcion

void dividir() //Definicion de la funcion dividir
{ //Inicio del cuerpo de la funcion
float div; //Variable local div

if (num2==0) //Condicion: Si la variable num2 es igual a 0…
{ //Inicia el conjunto de sentencias a ejecutar en caso de cumplirse la condicion
printf(“ERROR. Division por cero\n”); //Imprime en pantalla un mensaje de error
system(“pause”); //Pausa la consola
exit(0); //Salir
} //Cierra el conjunto de sentencias a ejecutar en caso de cumplirse la condicion

else //En caso de que no se cumpla la condicion…
{ //Inicia el conjunto de sentencias a ejecutar en caso de no cumplirse la condicion
div = num1 / num2; //Operacion para calcular division
printf(“Division = %.2f\n”,div); //Imprime en pantalla el valor de div
} //Cierra el conjunto de sentencias a ejecutar en caso de no cumplirse la condicion
} //Fin del cuerpo de la funcion

void main() //Funcion principal
{ //Inicio
int op; //Variable local op

leer(); //Llamada a la funcion leer

printf(“\nMENU\n”); //Imprime en pantalla las opciones de menu
printf(“1. Sumar\n”);
printf(“2. Restar\n”);
printf(“3. Multiplicar\n”);
printf(“4. Dividir\n”);
printf(“Ingrese una opcion: “); //Solicita al usuario elegir una opcion
scanf(“%d”,&op); //Lee el dato y lo guarda en la variable op
printf(“\n”); //Salto de línea

switch(op) //Sentencia switch. Estructura de control de seleccion
{ //Inicio de la sentencia switch

case 1: //Caso 1
sumar(); //Llamada a la funcion sumar
break; //Termina el caso 1

case 2: //Caso 2
restar(); //Llamada a la funcion restar
break; //Termina el caso 2

case 3: //Caso 3
multiplicar(); //Llamada a la funcion multiplicar
break; //Termina el caso 3

case 4: //Caso 4
dividir(); //Llamada a la funcion dividir
break; //Fin del caso 4

default: //En caso de no cumplirse ninguno de los casos anteriores…
printf(“No es una opcion\n”); //…Imprimir un mensaje en pantalla.
} //Fin de la sentencia switch
system(“pause”); //Pausa la consola
} //Fin



B-Analizar la interrelación entre las funciones y las estructuras de datos como parámetro de las funciones.

  • Relación entre funciones y estructura de datos.
Cuando se llama a una función en c   , los valores de los parámetros se copian desde el ámbito llamador (lugar en el que está la llamada a la función) al ámbito llamado (el cuerpo de la función). El siguiente programa muestra la ejecución de una función que recibe como parámetro dos estructuras.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <math.h>
/* Definición de la estructura */
struct coordenadas
{
    float x;
    float y;
    float z;
};
/* Definición de función que calcula la distancia entre dos puntos */
float distancia(struct coordenadas a, struct coordenadas b)
{
    return sqrtf(pow(a.x - b.x, 2.0) +
                 pow(a.y - b.y, 2.0) +
                 pow(a.z - b.z, 2.0));
}

int main()
{
    /* Declaración e inicialización de dos variables */
    struct coordenadas punto_a = { 3.5e-120, 2.5, 1.5 };
    struct coordenadas punto_b = { 5.3e-120, 3.1, 6.3 };
    float d; /* Almacenar el resultado */

    /* Llamada a la función con las dos estructuras */   
    d = distancia(punto_a, punto_b);
    /* Imprimir el resultado */
    printf("%f\n", d);

    return 0;
}

En la línea 26 se realiza una copia de las estructuras punto_a y punto_b en el ámbito de la función main a las estructuras a y b en el ámbito de la función distancia. Esta copia tiene dos efectos: el programa invierte tanto tiempo como datos haya en la estructura, y durante la ejecución de la función se mantienen en memoria dos copias completas de las estructuras. El uso de punteros ofrece una alternativa más eficiente. La función puede reescribirse para que reciba dos punteros a las estructuras. La definición de la función pasa a ser:
float distancia(struct coordenadas *a_ptr, struct coordenadas *b_ptr)
{
    return sqrtf(pow(a_ptr->x - b_ptr->x, 2.0) +
                 pow(a_ptr->y - b_ptr->y, 2.0) +
                 pow(a_ptr->z - b_ptr->z, 2.0));
}
La llamada a la función en la línea 26 pasa ahora a ser
d = distancia(&punto_a, &punto_b);
Con esta nueva versión, el programa ejecuta exactamente los mismos cálculos, obtiene el mismo resultado, pero su ejecución es más rápida, y utiliza menos memoria.

C-Coloque 1 ejemplo de programación que involucren el uso de la funciones, estructuras de datos y alguna técnica de diseño modular por ejemplo HIPO.



II. MÓDULOS (FUNCIONES)


En programación, una función es un grupo de instrucciones con un objetivo en particular y que se ejecuta al ser llamada desde otra función o procedimiento.

2.1  TIPOS DE FUNCIONES: INTERNAS Y CREADAS POR EL USUARIO.

  • Internas: Las funciones internas son funciones escritas en C que han sido enlazadas estáticamente en el proceso backend de Postgres.
  • Creadas por el usuario: Son aquellas que crea usted mismo para usarlas en aplicaciones, a diferencia de las funciones en las clases incorporadas, que realizan funciones predefinidas.
Imagen 6. Programación modular: Funciones.

2.2  COMPONENTE
Es un objeto escrito de acuerdo a unas especificaciones.
       2.2.1 DECLARACIÓN
Es una construcción del lenguaje que asocia un nombre con una entidad. 

Imagen 7.  Ejemplo de la Declaración de funciones.












2.2.2 ARGUMENTOS
es una variable utilizada para recibir valores de entrada en una rutina o subrutina. Dichos valores, que serán enviados desde la rutina invocante, son llamados argumentos.

2.2.3 PARAMÉTROS
Es un valor que la función espera recibir cuando sea llamada (invocada), a fin de ejecutar acciones en base al mismo.


2.2 INVOCACIÓN U RETORNO DEL VALOR DE LA FUNCIÓN
Las funciones se utilizan por invocacion o llamada, su sintaxis es:
Imagen 8. Invocación u retorno del valor de la función.
Nombre Funcion (arg1, arg2,...); donde los argumentos corresponden exactamente en orden y número como se escriben en la declaracion de la funcion.

Funciones que regresan un valor; esto significa que cuando la función es invocada llevará a cabo la ejecución de su código.
 El código calculará un valor de alguna manera y este valor será regresado a quien haya invocado la función. 

La invocación puede haber sido hecha por la función Main () o alguna otra función, y como ésta regresará un valor, necesitamos indicar su tipo.

 El tipo dependerá del valor devuelto. 
Si el valor es un entero, entonces el tipo de la función es int. Si el valor es un flotante, la función tendrá tipo float. 

  
2.4 ÁMBITO O ALCANCE DE LAS VARIABLES
Es la zona del programa en la que se define la variable.

2.5 PASO DE ARGUMENTOS POR VALOR
Este método copia el valor de los argumentos sobre los parámetros formales, de manera que los cambios de valor de los parámetros no afectan a las variables utilizadas como argumentos en la llamada.

Lo importante en el paso por valor es el valor del argumento, por eso es indiferente si este argumento es una variable, una constante o una expresión.

2.6 PASO DE ARGUMENTOS POR REFERENCIA
A diferencia del paso por valor, en el paso por referencia los parámetros no copian el valor del argumento, sino que comparten su valor. 
Por lo que cuando cambia el valor del parámetro también cambia el valor de la variable utilizada como argumento en la llamada. 

La forma de indicar un parámetro por referencia es anexar el símbolo & al final del nombre de la variable de tipo en la lista de parámetros formales, tanto en el prototipo de la función como en el encabezado de su definición.



ACTIVIDADES


A.      EJEMPLO DONDE SE ANALIZA LAS FUNCIONES INTERNAS, ASOCIÁNDOLAS CON LA DEFINICIÓN MATEMÁTICA DE FUNCIÓN.

FUNCIÓN QUE PERMITA CALCULAR EL CUBO DE UN NÚMERO REAL.

#include<stdio.h>
#include <cmath>
//1) Crear una función que permita calcular el cubo de un número real (float)
 void proc(float a,float b){
scanf("%f",&a);
b = pow(a,3);
printf("\n \n El cubo del numero ingresado es: %.2f",b);
}
int main(){ float a,b; 
printf("\n Ingrese un numero: \n \n"); 
proc(a,b);
return 0;

B.1  EJEMPLO DE EJERCICIO DE PROGRAMACIÓN, DONDE SE ANALIZA LA DIFERENCIA ENTRE EL PASO POR VALOR Y PASO POR REFERENCIA.


Por valor sería:
Código:

#include <stdio.h>#include <stdlib.h>
typedef struct
{
    int orden;
    char nombre[30];
}agenda;

void escribir_datos(agenda param)
{
    param.orden = 1;
    strcpy(param.nombre, "Daniel");
    printf("\n Orden....:%d", param.orden);
    printf("\n Nombre...:%s", param.nombre);
}  
int main()
{
    agenda datos;
    escribir_datos(datos);
    printf("\n\n Pulse una tecla para cerrar la aplicacion...");
    getchar();
    getchar();
    return 0;
}

Y por referencia: 
Código:

#include <stdio.h>#include <stdlib.h>
typedef struct
{
    int orden;
    char nombre[30];
}agenda;
void escribir_datos(agenda *param)
{
    param->orden = 1;
    strcpy(param->nombre, "Daniel");
}  
int main()
{
    agenda datos;
    escribir_datos(&datos);
    printf("\n Orden....:%d", datos.orden);
    printf("\n Nombre...:%s", datos.nombre);
    printf("\n\n Pulse una tecla para cerrar la aplicacion...");
    getchar();
    getchar();
    return 0;
}

En el caso de pasar la variable por referencia se envía a la función la dirección en la memoria en que se encuentra la variable, la función lo recibe como puntero y el valor es modificado tanto afuera como dentro de la función. Y el signo "->" es lo mismo que "*.", como se trata de un puntero se ocupa cualquiera de esas 2 notaciones para acceder al campo de una estruct o union.


B.2 VIDEO EXPLICATIVO

C++ - Paso por valor y por referencia

PROGRAMACIÓN ESTRUCTURADA Y PROGRAMACIÓN MODULAR


  • Programación estructurada:
Esta compuesta por un conjunto de técnicas que han ido evolucionando aumentando considerablemente la productividad del programa reduciendo el tiempo de depuración y mantenimiento del mismo. 
  
Imagen 1- Programación Estructura

















  •     Programación modular:
 Consta de varias secciones dividas de forma que interactúan a través de llamadas a procedimientos, que integran el programa en su totalidad. 
Imagen 2- Programación Modula








Definición de Programación Modular:
Es un paradigma de programación que consiste en dividir un programa en módulos o subprogramas con el fin de hacerlo más legible y manejable.

Características de la Programación Modular:

·  Este paradigma también se conoce como principio de ocultación de procedimientos y datos
·  Consiste en dividir un programa en módulos o subprogramas con el fin de hacerlo más legible y manejable.
·  Se presenta históricamente como una evolución de la programación estructurada para solucionar problemas de programación más grandes y complejos de lo que ésta puede resolver.
Un módulo puede ser:

·  Un programa
·  Una función
·  Una subrutina (o procedimiento).

VENTAJAS  Y DESVENTAJAS DE LA PROGRAMACIÓN MODULAR 

    Ventajas:
v Simplifica el diseño. 
v Disminuye la complejidad de los algoritmos. 
v Disminuye el tamaño total del programa. 
v Ahorra en tiempo de programación porque promueve la reusabilidad del código.
v Es fácil de mantener y modificar.
v Favorece el trabajo en equipo. 
v Facilita la escritura, depuración y prueba.
v Facilita el mantenimiento.
v Permite la estructuración de librerías específicas.

    Desventajas:
v Separación de módulos.
v No se dispone de algoritmos formales de modularidad, por lo que aveces los programadores no tienen claras las ideas de los módulos
v La programación modular requiere más memoria y tiempo de ejecución. 

Metodología de Diseño



La programación modular es uno de los métodos de diseño más flexibles y potentes para mejorar la productividad de un programa. En programación modular el programa se divide en módulos (partes independientes), cada una de las cuales ejecuta una única actividad o tarea y se codifican independientemente de otros módulos. Cada uno de estos módulos se analizan, codifican por separado.


Cada programa contiene un módulo denominado programa principal, que controla todo lo que sucede, se transfiere el control a submódulos (posteriormente se denominan subprogramas), de modo que ellos puedan ejecutar sus funciones; sin embargo, cada submódulo devuelve el control al módulo principal cuando termina su tarea. Si la tarea asignada a cada submódulo es demasiado compleja, éste deberá dividirse en otros módulos más pequeños. El proceso sucesivo de subdivisión de módulos continúa hasta que cada módulo tenga solamente una tareas específica que ejecutar.

                                                                                                                              
                                                              GLOSARIO

1. Acoplamiento: Medida intermodular que mide la relación de los módulos en un sistema.
2. Cohesión: Medida intramodular que mide la relación entre los contenidos de un modulo.
3. Estructura: Es la forma en la cual se impone orden y predeterminaciones de un diseño.
4. Función: Es un grupo de instrucciones con un objetivo en particular y que se ejecuta al ser llamada desde otra función o procedimiento.
5. Modular: Se  aplica  al objeto  que  está  formado por varias partes que se 
Pueden separar.
6. Subrutina: Es un segmento de código separado del bloque principal y que puede ser invocado en cualquier momento desde este o desde otra subrutina.
7. Submódulo: Es el componente más simple de un sistema integrado, el cual se encuentra repetido. Puede combinarse de diferentes maneras para lograr diversas formas.
8. Paradigma de programación: Es una propuesta tecnológica adoptada por una comunidad de programadores y desarrolladores cuyo núcleo central es incuestionable en cuanto que únicamente trata de resolver uno o varios problemas claramente delimitados.
9.Ámbito de variables: Las variables sólo se pueden referenciar desde la función o procedimiento en la que están declaradas.
10.Submódulo: Es el componente más simple de un sistema integrado, el cuál se encuentra repetido. Puede combinarse de diferentes maneras para lograr diversas formas.

                                       
www.youtube.com/watch?v=lcp_OrGSlIk