62
Tema VI. Diseño de programas para la resolución de problemas de ingeniería Objetivo: El alumno aplicará el método de Diseño de Programas en la elaboración de programas que resuelvan problemas básicos de ingeniería.

Tema VI. Diseño de programas para la resolución de ...profesores.fi-b.unam.mx/tanya/CPI/Presentaciones/Tema-VI.pdf · Escritura de las diferentes fases del ciclo de vida del software,

  • Upload
    lamcong

  • View
    218

  • Download
    0

Embed Size (px)

Citation preview

Tema VI. Diseño de programas para la

resolución de problemas de ingeniería

Objetivo: El alumno aplicará el método de Diseño de Programas

en la elaboración de programas que resuelvan problemas básicos

de ingeniería.

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

Programación Podemos deducir que en construcción del software, la fase mas importante, y en la que se invertirá más tiempo, es la fase de desarrollo en la que, utilizando lenguajes y técnicas de programación, se escribirá el programa que resolverá el problema.

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

Paradigmas de programación La evolución de los lenguajes de programación ha ido paralela a la idea de paradigma de programación: enfoques alternativos a los procesos de programación. En realidad un paradigma de programación representa fundamentalmente enfoques diferentes para la construcción de soluciones a problemas y por consiguiente afectan al proceso completo de desarrollo de software.

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

Paradigmas de programación Fiable, es decir, funcionar correctamente y sin fallos. Adaptable, es decir, fácil de incorporar en otros sistemas con modificaciones mínimas. Reusable, total o parcialmente, para reducir costes y reutilizar componentes cuya fiabilidad está comprobada. Mantenible. Los programas son construidos por muchas personas agrupadas en equipos de trabajo.

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

Tipos de programación

Existen diferentes técnicas de programación que se pueden ordenar según su complejidad. Debido a esta complejidad, el aprendizaje debería seguir el siguiente orden propuesto.

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

• Es el primer programa realizado por alguien que empieza a programar, será un único “programa principal” constituido por una serie de comandos o instrucciones escritos secuencialmente.

Programación Convencional

• Da un paso más a la estructuración de un programa agrupando partes del mismo en módulos de una funcionalidad similar.

Programación Modular

• Resuelve algunos de los problemas que surgen con la programación modular y estructurada.

Programación orientada a objetos

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

• Cuando los programas se vuelven más grandes, cosa que lógicamente sucede cuando aumenta la complejidad del problema a resolver, la lista de instrucciones aumenta considerablemente , de modo tal que el programador tiene muchas dificultades para controlar ese gran número de instrucciones.

• Para resolver este problema los programas se descompusieron en unidades mas pequeñas que adoptaron el nombre de funciones (procedimientos, subprogramas o subrutinas)

Programación Estructurada

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

Fases en la resolución de problemas El proceso de resolución de un problema con una computadora conduce a la escritura de un programa y a su ejecución en la misma. Aunque el proceso de diseñar programas es –esencialmente– un proceso creativo, se puede considerar una serie de fases o pasos comunes, que generalmente deben seguir todos los programadores.

Las fases de resolución de un problema con computadora son:

Análisis del problema Diseño del algoritmo Codificación Compilación y ejecución

Verificación Depuración Mantenimiento Documentación

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

Análisis

El problema se analiza teniendo presente la especificación de los requisitos dados por el cliente de la empresa o por la persona que encarga el programa.

Diseño

Una vez analizado el problema, se diseña una solución que conducirá a un algoritmo que resuelva el problema.

Codificación

La solución se escribe en la sintaxis del lenguaje de alto nivel y se obtiene un programa fuente que se compila a continuación.

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

Ejecución, verificación y depuración

EL programa se ejecuta, se comprueba rigurosamente y se eliminan todos los errores que puedan aparecer.

Mantenimiento

El programa se actualiza y modifica, cada vez que sea necesario, de modo que se cumplan todas las necesidades de cambio de sus usuarios.

Documentación

Escritura de las diferentes fases del ciclo de vida del software, esencialmente el análisis, diseño y codificación, unidos a manuales de usuario y de referencia, así como normas para el mantenimiento.

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

Calidad

Las sentencias de un programa, también llamadas código del programa o código fuente, pueden ser leídas por muchas personas a lo largo de su ciclo de vida, por tanto es fundamental que estén bien redactadas, con un estilo determinado para que su significado sea claro y no lleve a ambigüedades.

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

Documentación

La documentación ayudará a comprender un programa para así saber utilizarlo y poder realizar futuras modificaciones.

6.1 Teoría del diseño de programas

Ing. Tanya Arteaga Ricci

• Son los comentarios o aclaraciones que van junto al código fuente para clarificar los pasos seguidos en un programa.

Interna

• Es un documento donde se define: la descripción del problema, nombre del autor, el algoritmo utilizado para la resolución del problema, expresado en pseudocódigo o diagrama de flujo, el diccionario de datos, en el que se especifica dónde y cómo se almacenan los datos del sistema y los lugares donde se utilizan, el código fuente o programa.

Externa

• Describe los pasos que debe seguir el usuario para utilizar el programa y conseguir los resultados esperados.

Manual de usuario

Ing. Tanya Arteaga Ricci

Dennis Ritchie inventó y escribió el primer compilador para el lenguaje C en un DEC PDP-11

Variantes de C

Turbo C

C++

Visual C++

C#

Lenguaje C

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

La historia del lenguaje C comienza a finales de los años 60 en los Laboratorios Bell propiedad de la empresa americana AT&T. Uno de los proyectos que ahí se desarrollaban era la escritura de un sistema operativo con características multitarea y multiproceso llamado UNIX. La primera versión del lenguaje de programación creado para desarrollar el SO UNIX fue el lenguaje B, escrito por Ken Thompson. En 1972, Dennis Ritchie, toma el relevo y realiza algunas modificaciones en el lenguaje B, convirtiéndose en el lenguaje C. Ese mismo año, se reescribe el código de UNIX en lenguaje C y, a partir de 1973, se convierte en el lenguaje oficial de UNIX.

Historia del Lenguaje C

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

En definitiva, el lenguaje C tiene las siguientes características:

Portabilidad

Código binario altamente optimizado

Lenguaje general y pensado para la programación estructurada

Características del Lenguaje C

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

El lenguaje C está basado en el concepto de funciones. Un programa C es una colección de una o más funciones, en donde cada una tiene un nombre y una lista de argumentos.

La función main( )

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

Estructura general de un programa C: Directivas para el procesador

• Archivos include

• Constantes define

Declaraciones globales

• Declaraciones de funciones

• Declaraciones de variables globales

Función principal main()

• Declaración de variables locales

Finalización del programa exit(()

• Sentencias ejecutables

Funciones

• Cabecera de la función

Sentencias Ejecutables

• Declaración de variables locales

Sentencia de salida de la función: return

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

Escribir un programa que imprima las palabras “¡Hola mundo!” en el dispositivo de salida.

/*Programa saludo*/

#include <stdio.h>

void main(void)

{

printf(“\n ¡Hola mundo!”);

}

Ejemplo:

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

• /* */ son símbolos que engloban a los comentarios de un programa escrito en C.

• main() es el nombre de la función que en este momento no requiere ningún tipo de parámetros de entrada y salida.

• { } delimitan el alcance de la función

• printf() es una función llamada por main() a la cual se le pasa el parámetro “\n ¡Hola mundo!”

• \n Indica un salto de línea

Observaciones

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

• “void” indica al compilador que la función no retornará un valor al terminar de ejecutarse y que tampoco requiere de un argumento de entrada

• La directiva #include indica que se hará uso de la lista de encabezados que se encuentran en el archivo descrito entre < >

Observaciones

Directivas para el preprocesador Las directivas para el preprocesador aparecen siempre al comienzo de los programas. Se identifican por su primer carácter, que es el carácter almohadilla (#). Estas directivas le indican al compilador que incluya en el código fuente, el código fuente contenido en los archivos dentro de ‘<‘ y ‘>’

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

…Recordatorio

Aprender a programar es semejante a aprender a conducir, solamente se logra frente a la computadora.

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

0 a 4 294 967 295 32 unsigned long int

-2 147 483 647 a 2 147 483 647 32 long int

0 a 65 535 8 unsigned short int

Igual que int 16 short int

0 a 65 535 16 unsigned int

-32 767 a 32 767 16 int

Rango Tamaño en Bits Tipo

Rangos mínimos para los tipos de datos en lenguaje C

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

6 32 float

10 128 long double

10 64 double

Precisión en dígitos Tamaño en Bits Tipo

Precisión de los tipos de datos

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

Formato de un programa en C

Después de presentar la estructura de un programa en C mediante un ejemplo real, donde se observa la manera que tienen los diferentes elementos del lenguaje de encajar en el programa, es necesario, al igual que en cualquier otro lenguaje de programación, llevar a cabo un análisis pormenorizado de dichos elementos. Éstos, combinándolos de forma apropiada, no permitirán elaborar los programas deseados.

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

El conjunto de caracteres de C Del mismo modo que en nuestro lenguaje habitual utilizamos un conjunto de caracteres para construir instrucciones que tengan significado, los programas que se realicen en C se escriben utilizando un conjunto de caracteres formado por:

• Las 26 letras minúsculas del alfabeto inglés ( a b c d e f g h i j k l m n o p q r s t u v w x y z)

• Las 26 letras mayúsculas (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)

• Los 10 dígitos (1 2 3 4 5 6 7 8 9 0)

• Los símbolos especiales (@ ^ { } [ ] ( ) & $ % # ~ ‘ “ / ? ; : _ . , = / * - +)

• El espacio en blanco o barra espaciadora

6.2 Vinculación del diseño de programas

al conocimiento algorítmico

Ing. Tanya Arteaga Ricci

6.3 Características básicas de un programa en

lenguaje C

Identificadores

Los identificadores son los nombres que utilizamos para representar los diferentes elementos de nuestro programa (tipos de datos, constantes, variables, funciones y etiquetas). Los identificadores se crean especificándolos en las declaraciones, de este modo, se puede utilizar dicho identificador en las sentencias posteriores del programa para referirnos al elementos asociado a él.

Ing. Tanya Arteaga Ricci

Sentencias de Control

En muchas ocasiones, los programas requieren que un conjunto de instrucciones se ejecute de forma repetida hasta que se cumpla una condición.

En otras ocasiones, los programas requieren que se realice un test o comprobación lógica en algún punto concreto, realizándose a continuación alguna acción que dependerá del resultado de la comprobación.

Todas estas operaciones se pueden realizar mediante las sentencias de control de C.

6.4 Elementos y estructuras del lenguaje C en

el diseño de programas

Ing. Tanya Arteaga Ricci

6.4 Elementos y estructuras del lenguaje C en

el diseño de programas

Tipo Sentencia de control

Condicionantes if

switch

Repetitivas o bucles

while

do – while

for

Salto condicional

break

continue

goto

Clasificación de las sentencias de control

Ing. Tanya Arteaga Ricci

6.4 Elementos y estructuras del lenguaje C en

el diseño de programas

/* area.c */

#include<stdio.h>

void main(void)

{

int fBase,fAltura;

double fArea;

fBase=34;

fAltura=54;

fArea = (fBase*fAltura)/2.0;

printf("\n Area de un triangulo");

printf("\n Base: %d \n Altura: %d \n Area: %f", fBase, fAltura, fArea);

printf("\n");}

Elabore un programa que resuelva el área de un triángulo (la base y la altura son valores fijos)

Ing. Tanya Arteaga Ricci

6.4 Elementos y estructuras del lenguaje C en

el diseño de programas

Sentencia IF/ELSE Su forma básica sería la siguiente:

If (expresión) sentencia;

En esta sentencia se evalúa expresión. Si el resultado es verdadero, se ejecuta sentencia; si el resultado es falso, se salta a sentencia y se prosigue en la línea siguiente. Hay que recordar que sentencia puede ser una sentencia simple o un conjunto de sentencias (en caso de que fueran varias deberían ir contenidas en bloque entre llaves {…})

6.4 Elementos y estructuras del lenguaje C en

el diseño de programas

Ing. Tanya Arteaga Ricci

Sentencia SWITCH

En este caso se evalúa una expresión (condición) y dependiendo del valor que devuelva, que pueden ser múltiples valores, se ejecutará un bloque de sentencias y otro. En el caso de la sentencia if/else, se evaluaba una condición y sólo podían ejecutarse dos bloques de sentencias dependiendo de si esa condición se cumplía o no. La forma general de switch es la siguiente:

switch (expresión){

case valor1: sentencia;

break;

case valor2: sentencia;

break;

. . .

case valorN: sentencia;

break;

default: sentencia;

break;

}

6.4 Elementos y estructuras del lenguaje C en

el diseño de programas

Ing. Tanya Arteaga Ricci

Sentencia WHILE (Iteración)

Esta sentencia se considera una sentencia de tipo bucle que permite repetir una serie de veces la ejecución de un bloque de código. Esta repetición se realiza hasta que se cumpla una determinada condición de tipo lógico o aritmético. En su forma general seria: while (condición) { Sentencia1; Sentencia2; … }

6.4 Elementos y estructuras del lenguaje C en

el diseño de programas

Ing. Tanya Arteaga Ricci

Sentencia DO..WHILE (Iteración)

Se considera una sentencia de tipo bucle que se comporta exactamente igual que la sentencia while, con la diferencia de que dicha evaluación se realiza al final de cada pasada en lugar de al principio, por lo que se asegura que, al menos, se ejecutará una vez el bloque de sentencias. Su forma general es la siguiente: do

{

sentencia1;

sentencia2;

} while (condición);

6.4 Elementos y estructuras del lenguaje C en

el diseño de programas

Ing. Tanya Arteaga Ricci

Sentencia FOR (Iteración)

La sentencia de control for permite repetir una serie de veces la ejecución de un bloque de código. La ventaja de la sentencia for sobre while está en que en la cabecera de la construcción for se tiene toda la información sobre cómo se inicializan, controlan y actualizan las variables de bucle. La evaluación de la condición se realiza al principio de la ejecución. La forma general de esta sentencia es la siguiente:

for (expresion1; expresion2; expresion3)

{

Sentencia1;

Sentencia2;

}

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Un arreglo es una colección de variables del mismo tipo, con el mismo nombre, y que se diferencian unos de otros a través de un subíndice.

La forma general de un arreglo es:

Tipo Nombre_Variable[Número_de_elementos]

Cuando el compilador encuentra una declaración de tipo para un arreglo, reserva una cantidad de espacio suficiente en la memoria para poder contenerlo. Todo el arreglo es asignado en localidades contiguas de memoria.

Arreglos Unidimensionales

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

NOTA:

Arreglo de 5 elementos

4 3 2 1 0

Primer Elemento

Último Elemento

… Para tener en mente …

C nos permite acceder cualquier elemento fuera de los límites del arreglo, pero los datos no son válidos.

C no valida los límites de sus arreglos, dicha validación es responsabilidad del programador.

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Ejemplo:

Hacer un programa que lea una cadena y una letra desde el teclado. El programa debe indicar si la letra se encuentra presente en la cadena o no.

Digite una cadena HOLA CHICOS LISTOS

Digite una letra C

L O C I O L S O S I S H A T C H

17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

L O C I O L S O S I S H A T C H

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

#include <stdio.h> #include <string.h> void main(void)

{ char szCadena[80]; char cLetra; int lExisteLetra; int iContador; int iLongCadena; /*Lectura de la cadena*/ printf("\nDigite una cadena: "); gets(szCadena); /*Lectura de la letra*/ printf("Digite una letra: "); scanf("%c",&cLetra);

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

/*Preparacion de los contadores */

iLongCadena=strlen(szCadena); iContador=0; /* No existe la letra por omision */

lExisteLetra=0; /* Mientras no se llegue al fin de cadena y no se encuentre la letra*/

while(iContador < iLongCadena && !lExisteLetra)

{ /* verificar si existe la letra */

if (szCadena[iContador] == cLetra)

lExisteLetra=1; iContador++; } if (lExisteLetra)

printf("\nLa letra %c si existe en la cadena\n",cLetra); else printf("\nLa letra %c no existe en la cadena\n",cLetra); }

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Hacer un programa que lea una cadena y determine cuántas palabras existen en ella.

3 2 1

INGENIEROS CHICOS HOLA

Espacios en

blanco

Fin de cadena

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Arreglos Bidimensionales

Un arreglo bidimensional es una colección finita, homogénea y ordenada de datos, en la que se hace referencia a cada elemento del arreglo por medio de dos índices. El primero de los índices se utiliza para indicar la fila, y el segundo, para indicar la columna.

Primera fila

Segunda fila

Enésima fila

Arreglo Bidimensional

Primera columna Enésima columna

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Arreglos Multidimensionales

Un arreglo puede tener más de una dimensión, de tal manera que forme matrices de dos, tres o aun más dimensiones.

Tipo nombre_arreglo[d1][d2][d3]…. [dn]

Donde dn es la longitud del arreglo en la n-ésima dimensión.

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Funciones

¿Qué es una función?

Secuencias de operaciones que se utilizarán en varios puntos de un programa y que permitirán reutilizar dicha secuencia de operaciones mediante una llamada a la misma a través del nombre que se le dé a la función.

Hay dos tipos de funciones, las funciones propias de librerías de C y las definidas por el programador.

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Diseño modular de programas En “fragmentos” independientes es más fácil de programar. El “programa principal” será más fácil de leer, porque no necesitará contener todos los detalles de cómo se hace cada cosa. Podremos repartir el trabajo, para que cada persona se encargue de realizar un “trozo de programa”, y finalmente se integrará el trabajo individual de cada persona.

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Esos “fragmentos” de programa son lo que se

suele llamar “subrutinas”,

“procedimientos” o “funciones”.

En el lenguaje C, el

nombre que más se usa es el de funciones.

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Declaración La forma básica de definir una función es: indicar el nombre de la función seguido de unos paréntesis, como se hace con “main”. después, entre llaves indicaremos todos los pasos que queremos que dé ese “fragmento de programa”.

saludar() {

printf("Bienvenido al programa\n");

printf("de ejemplo\n"); printf("Bienvenido al programa\n");

}

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Ahora desde dentro del cuerpo del programa, es posible “llamar” o “utilizar” a esa función:

main() {

saludar();

}

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Parámetros de una función Si nos interesa además indicarle a nuestra función ciertos datos especiales con los que queremos que trabaje. Por ejemplo, si escribimos en pantalla números reales con frecuencia, puede resultar útil que los muestre con el formato que nos interese. Lo podríamos hacer así:

escribeNumeroReal( float n ){

printf("%4.2f", n);

}

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

La función se llamaría desde el cuerpo de nuestro programa así: float x; main() { x= 5.1; printf("El primer numero real es: "); escribeNumeroReal(x); printf(" y otro distinto es: "); escribeNumeroReal(2.3); } Los datos adicionales que indicamos a la función es lo que llamaremos “parámetros”.

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Valor devuelto por una función También es posible que la función realice una serie de cálculos y nos “devuelva” el resultado de esos cálculos

main() { int resultado, numero= 5; resultado = cuadrado(numero); printf(“El cuadrado del numero es %d“, resultado); printf(“\nY el de 3 es %d", cuadrado(3)); }

int cuadrado (int n) { return n*n; }

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Variables locales y Variables globales

Las variables se pueden declarar dentro de un bloque (una función), y entonces sólo ese bloque las conocerá, no se podrán usar desde ningún otro bloque del programa. Es lo que se llaman “variables locales”.

Si se declara una variable al comienzo del programa, fuera de todos los “bloques” de programa, será una “variable global”, a la que se podrá acceder desde cualquier parte.

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

#include<stdio.h> void hola(void){ printf(“\n\nEsta es la función hola”); printf(“\n *** Hola Amigos ***”); } void adios(void){ printf(“\n\nEsta es la función adios”); printf(“\n *** Adios Amigos ***”); } void main(void){ printf(“\nEste es el programa principal”); printf(“\nRealiza la llamada a la función HOLA”); hola(); printf(“\nRealiza la llamada a la función ADIOS”); adios(); printf(“\n\nFin del programa.\n Fin de programa principal”); }

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci

Este es el programa principal Realiza la llamada a la función HOLA Esta es la función hola *** Hola amigos *** Realiza la llamada a la función ADIOS Esta es la función adiós *** Adiós amigos *** Fin de programa. En el programa principal

6.5 Elaboración de programas básicos de ingeniería

Ing. Tanya Arteaga Ricci