Algoritmica para Programacion
Algoritmica para Programacion
Algoritmica para Programacion
Email [email protected]
MODULO POR
: ALGORITMICA PARA PROGRAMACION : YAMIL ARMANDO CERQUERA ROJAS Neiva Huila - Colombia 2002
Nota: Me gustara arrojar algunas luces para los principiantes, y para los no tan principiantes, sobre la forma "correcta" de escribir programas. Cuando digo "correcta", no me refiero a la mejor, pues desde mi punto de vista no hay mejor, ni peor forma de programar, sino buenos o malos hbitos de programacin ms cuando se refiere a programacin estructurada. Este texto se encuentra a disposicin de todos aquellos que estn interesados en adquirir destreza y habilidad en el desarrollo o solucin de problemas bsicos, haciendo uso de las herramientas que nos brindan los diferentes lenguajes de programacin para ello, conocidas como Estructuras de programacin (Asignacin, Decisin, Cclicas y de Seleccin Mltiple).
Para cualquier comentario o sugerencia se podrn dirigir al e-mail del autor [email protected]
UNIVERSIDAD SURCOLOMBIANA
1 de 190
Email [email protected]
A continuacin se relacionan los ejercicios que han sido desarrollados en el presente texto con el fin de que cada estudiante tenga una idea de lo que se ha desarrollado antes de iniciar con la revisin del mismo.
6. 7. 8.
UNIVERSIDAD SURCOLOMBIANA
2 de 190
Email [email protected]
5.
Desarrolle un algoritmo que le permita leer un valor cualquiera N y escribir si dicho nmero es comn mltiplo de M y P. M y P tambin se deben leer desde el teclado. Desarrolle un algoritmo que le permita leer dos valores A y B y que escriba cual de los dos valores ledos es el mayor Desarrolle un algoritmo que le permita leer dos valores A y B y escriba cual de los dos valores ledos es el menor Desarrolle un algoritmo que le permita leer 2 valores A y B e indicar si uno de los dos divide al otro exactamente Desarrolle un algoritmo que le permita leer dos valores A y B e indicar si el resultado de dividir la suma del los dos nmeros entre la resta del primer nmero con el segundo es exacta.
6. 7. 8. 9.
10. Desarrolle un algoritmo que le permita leer dos valores A y B e indicar si la suma de los dos nmeros es par 11. Desarrolle un algoritmo que le permita leer dos valores A y B e indicar cual de las dos restas (B-A) o (A-B) es positiva 12. Desarrolle un algoritmo que le permita leer tres valores y almacenarlos en las variables A, B, C respectivamente. El algoritmo debe indicar cual es el mayor. Para este caso se asume que los tres valores ledos por el teclado son valores distintos. 13. Desarrolle un algoritmo que le permita leer tres valores A, B, C e indicar cual es el menor 14. Desarrolle un algoritmo que le permita leer tres valores A, B, C diferentes e indicar cual es valor del centro 15. Desarrolle un algoritmo que le permita leer tres valores A, B, C e indicar si uno de los tres divide a los otros dos exactamente 16. Desarrolle un algoritmo que le permita leer tres valores A, B, C e indicar si la suma de dos nmeros cualquiera es igual al tercero. 17. Si se tiene la funcin: f(x) = ax 2 + bx + c , el valor de x se calcula as:
b b 2 4ac , la expresin dentro del radical se le llama discriminante 2a de la ecuacin. Las dos races son reales y desiguales, reales e iguales o imaginarias, segn que el discriminante sea positivo, cero o negativo. Desarrolle un algoritmo que lea valores para a, b, c y determine si hay posible solucin para x de dicha funcin. x=
UNIVERSIDAD SURCOLOMBIANA
3 de 190
Email [email protected]
10. Desarrolle un algoritmo que le permita leer un valor entero positivo N y verifique si es mximo comn divisor de W y Z. 11. Desarrolle un algoritmo que le permita leer un valor entero N y lo invierta usando estructuras cclicas y funciones. Por ejemplo que lea 1234 y escriba 4321. 12. Desarrolle un algoritmo que le permita leer un valor entero positivo N dado en base decimal y convertirlo a base binaria. 13. Leer un nmero entero y almacenarlo en la variable N y leer una base numrica cualquiera en la variable Base. Pasar el valor N a Base Base. 14. Desarrolle un algoritmo que le permita leer un valor entero positivo N y sacar su cuadrado sumando los primeros N impares. 15. Desarrolle un algoritmo que le permita leer un valor entero positivo N y calcular su cuadrado sumando N veces N. 16. Desarrolle un algoritmo que le permita leer N valores y calcular la media aritmtica ( x1 + x 2 + x3 + ....x n ) / n
UNIVERSIDAD SURCOLOMBIANA
4 de 190
Email [email protected]
17. Leer un nmero entero (entero largo) positivo e invertirlo. Por ejemplo, si el nmero es 15429852, se debe obtener como resultado 25892451. Es similar al ejercico 12 pero en este no se usan funciones. 18. Desarrolle un algoritmo que le permita leer N valores y calcule con dichos valores la media geomtrica n x1 * x 2 * x3 * ... * x n
e =1+
x
1 1 1 + 2 + 3 + ... 2 2 2! 2 3!
x2 x3 x4 e = 1+ x + + + + ...... 2! 3! 4!
e sin ( x ) = 1 + sin( x ) + sin 2 ( x ) sin 3 ( x ) sin 4 ( x ) + + + ...... 2! 3! 4!
x2 x4 x6 + + ... 2! 4! 6! x2 x4 x6 + + + ... 2! 4! 6!
12. Cos( x ) = 1 +
UNIVERSIDAD SURCOLOMBIANA
5 de 190
Email [email protected]
Cualquier sugerencia o ejercicio adicional que crean conveniente adicionar y/o explicar con ms detalle en el presente texto, por favor remitir al e-mail [email protected] y con gusto acatar lo sugerido.
CONTENIDO
INTRODUCCIN OBJETIVOS Y CONTENIDO PARA QUE SIRVE LA PROGRAMACIN QUE ES LA PROGRAMACIN QUE ES UN LENGUAJE DE PROGRAMACIN NIVELES DE LOS LENGUAJES TIPOS DE PROGRAMACIN EL SECRETO DE PROGRAMAR EST EN LA ESTRUCTURACIN ELEMENTOS BSICOS DE UN PROGRAMA ELEMENTOS BSICOS DE UN PROGRAMA EN C
main() La directiva #Include: Definicin de variables identificadores: Palabras clave en C Variables globales: Variables Locales: Prototipo de funcin: Enunciados del programa: Ejercicios de uso de la funcin printf()
9 11 12 13 14 15 16 17 19 21
22 23 23 24 26 26 27 27 29
UNIVERSIDAD SURCOLOMBIANA
6 de 190
Email [email protected]
30 30
35 36
36 36 37 37 38 39 40 40 40
ALGORITMOS Y PROGRAMAS
DISEO DE PROGRAMAS: DIAGRAMAS DE FLUJO REGLAS DE PROGRAMACIN: PROGRAMACIN ESTRUCTURADA
46
46 47 49 49
ESTRUCTURAS DE PROGRAMACIN
ESTRUCTURA DE ASIGNACIN Expresiones simples Expresiones complejas ESTRUCTURA DE DECISIN Estructura Sencilla: Operadores de Relacin: Operadores Lgicos: Estructuras de decisin anidadas: Ejercicios Aplicando Estructuras de Decisin ESTRUCTURAS CCLICAS Ciclos con control antes Ciclos con control despus: Estructuras cclicas anidadas: Estructura cclica FOR-ENDFOR ESTRUCTURA DE SELECCIN MULTIPLE
51
51 51 52 82 82 82 83 84 85 122 122 122 123 124 166
UNIVERSIDAD SURCOLOMBIANA
7 de 190
Email [email protected]
FUNCIONES
Definicin Llamadas por valor Llamadas por referencia Creacin de Bibliotecas propias: Funciones recursivas y Algoritmos Recursivos
169
169 173 173 176 178
ARREGLOS
Definicin Arreglos Unidimensionales Tipo_de_dato nombre_variable [tamao] arreglos bidimensionales Arreglos multidimensionales Inicializacin de arreglos con tamao Inicializacin de arreglos sin tamao
179
179 179 180 182 183 184 185
UNIVERSIDAD SURCOLOMBIANA
8 de 190
Email [email protected]
INTRODUCCIN
EL lenguaje C es el resultado de un proceso de desarrollo que inici con un lenguaje denominado BCPL escrito por Martin Richards. Este influenci a otro llamado B (inventado por Ken Thompson). En los aos 70 para el primer sistema UNIX en un DEC PDP-7; ste lenguaje llev a la aparicin del C. El primer compilador de C fue escrito por Kernighan y Dennis Ritchie en 1972 en la ATT para un DEC PDP-11 y escribi el propio sistema operativo en C. Con la popularidad de las microcomputadoras muchas compaas comenzaron a implementar su propio C por lo cual surgieron discrepancias entre s. Por esta razn ANSI (American National Standars Institute), estableci un comit en 1983 para crear una definicin no ambigua del lenguaje C e independiente de la mquina que pudiera utilizarse en todos los tipos de C. Algunos de las C existentes son: Ansi C Turbo C ++ Zortech C++ Borland C Quick C Microsoft C C++ Visual C Turbo C C Builder
Los cdigos presentados en este libro estn basados en el C, Turbo pascal y C para MatLab, los cuales pueden utilizarse en todos los tipos de C y Pascal existentes en el mercado. C es un lenguaje de programacin de nivel medio ya que combina los elementos del lenguaje de alto nivel con la funcionalidad del ensamblador. Su caracterstica principal es ser portable, es decir, es posible adaptar los programas escritos para un tipo de computadora en otra. Otra de sus caractersticas principales es el ser estructurado, es decir, el programa se divide en mdulos (funciones) independientes entre s. El lenguaje C inicialmente fue creado para la programacin de:
-
UNIVERSIDAD SURCOLOMBIANA
9 de 190
Email [email protected]
Actualmente, debido a sus caractersticas, puede ser utilizado para todo tipo de programas. Como principal objetivo, este libro trata de vulgarizar el lenguaje C colocndolo al alcance de todos los estudiosos de cualquier nivel o profesionales de la programacin con conocimientos mnimos informticos. Para ello, a lo largo de los diferentes captulos, se trata al lenguaje no como algo aislado en si mismo, sino relacionado especficamente con la Metodologa de la Programacin y la Estructura de Datos, fuentes indispensables del conocimiento profundo de cualquier lenguaje de programacin. El trmino vulgarizar, que aqu se utiliza, no significa en modo alguno eliminar la teora del lenguaje y descender al terreno prctico olvidando la misma, si no completamente teora y practica mediante la inclusin de todos los ejemplos oportunos y las aclaraciones necesarias aunque estas puedan parecer, a veces, superfluas e incluso dadas por sabidas.
UNIVERSIDAD SURCOLOMBIANA
10 de 190
Email [email protected]
OBJETIVOS Y CONTENIDO
Este libro tiene un objetivo fundamental: Introducir y explicar los conceptos fundamentales de las estructuras de programacin utilizadas en los diferentes de lenguajes de programacin de microcomputadoras. El libro esta diseado para ser utilizado de diversas formas: Como libro de texto, libro complementario, libro de problemas de programacin, libro de anlisis numrico o bien como libro de introduccin a la programacin de computadoras. El seguimiento de este libro no requiere ningn conocimiento previo de programacin de computadoras, aunque, si se utiliza como libro de problemas puede complementarse con algn libro de mayor contenido terico relativo a algoritmos, estructuras de datos o bien lenguajes de programacin. El libro esta dividido en varios captulos que abarcan los conceptos esenciales de las estructuras de programacin en los diferentes lenguajes comnmente utilizados en la programacin de computadoras. En la primera parte se trata lo relacionado con los smbolos utilizados en la diagramacin o solucin de problemas a nivel simblico (Diagramas de flujo). En la segunda parte se desarrollarn algunos ejercicios donde se muestra de manera prctica la utilizacin de dichos smbolos Una tercera parte donde se analizan las estructuras de asignacin Una cuarta parte donde se analizan las estructuras de decisin Una quinta parte donde se analizan las estructuras repetitivas o cclicas Una sexta parte donde se analizan las estructuras de seleccin mltiple. Cada uno de los captulos esta diseado de tal forma que el lector entienda de manera clara y sencilla el uso de cada uno de las estructuras mencionadas anteriormente. De igual forma cada uno de los captulos estar soportado con una buena cantidad de ejercicios resueltos que aclaran la forma correcta de utilizacin de dichas estructuras. A cada uno de los ejercicios que se plantean en el presente libro, se le har un anlisis de su solucin de manera mecnica, se llevar a un anlisis simblico y luego se desarrollar el algoritmo al nivel de diagramas de flujo, Seudo lenguajes, Seudo cdigos y Cdigos. Para esta ltima parte se codificar cada ejercicio en Turbo Pascal, Lenguaje C y Cdigo para ser ejecutado en MatLab.
UNIVERSIDAD SURCOLOMBIANA
11 de 190
Email [email protected]
UNIVERSIDAD SURCOLOMBIANA
12 de 190
Email [email protected]
QUE ES LA PROGRAMACIN
La definicin anterior deja muchas cosas que decir. Para llegar a tener una secuencia de instrucciones que den solucin a un problema es necesario ejecutar varias etapas. Etapa de anlisis: En esta etapa el programador debe entender claramente el problema. Saber que es lo que se quiere resolver. (Analizar) Etapa de Solucin general: Escribir la serie de pasos que sean necesarios para dar solucin al problema. Estos pasos se pueden desarrollar a travs de un Diagrama de flujo (Utilizando smbolos) a travs de un seudo lenguaje (Utilizando Lenguaje comn). A lo anterior es lo que se conoce con el nombre de Algoritmo. Etapa de prueba: Consiste en chequear el algoritmo paso a paso para estar seguro si la solucin da solucin verdaderamente el problema. (Prueba de escritorio). Etapa de implementacin especfica: Consiste en traducir el algoritmo a un lenguaje de programacin. (Codificar). Etapa de prueba: Consiste en ejecutar el programa en un computador y revisar los datos arrojados para ver si son correctos y hacer los ajustes necesarios. (Implementar). Etapa de uso: Consiste en instalar el programa de manera definitiva para el uso por parte del usuario.
UNIVERSIDAD SURCOLOMBIANA
13 de 190
Email [email protected]
UNIVERSIDAD SURCOLOMBIANA
14 de 190
Email [email protected]
UNIVERSIDAD SURCOLOMBIANA
15 de 190
Email [email protected]
TIPOS DE PROGRAMACIN
Dependiendo del lenguaje de programacin que se elija, se puede hablar del tipo de programacin que se va a realizar. Secuencial: Se considera programacin secuencial a los programas que se disean con instrucciones que van unas detrs de otras. Las lneas se ejecutan una a una en secuencia. Ejemplos tales como Basic, Cobol. Estructurada: Se considera programacin estructurada a la programacin que se hace por mdulos. Cada mdulo realiza alguna tarea especfica y cuando se necesite esa tarea simplemente se hace el llamado a ese mdulo independiente de que se tengan que ejecutar los dems. Ejemplos tales como: Turbo PASCAL, C, Modula, Ada. Orientada a Objetos: Se considera programacin orientada a objetos aquellos lenguajes que permiten la utilizacin de objetos dentro del diseo del programa y el usuario puede pegar a cada objeto cdigo de programa. Ejemplos de estos lenguajes se pueden mencionar el Visual Basic o Visual C de la Microsoft, C Builder de la Borland Internacional, Java, Xml entre otros. Lgica o de lenguaje natural: son aquellos programas que se disean con interfaces tal que la persona o usuario puede ordenar a la mquina tareas en un lenguaje natural. Pueden interactuar como una persona pero nunca llegan a producir conocimiento. Ejemplo como Prolog (Programming Logic). Estos lenguajes se desarrollaron con base en las estructuras de sus antecesores. Recorren o navegan las bases de datos obedeciendo a reglas. Inteligencia Artificial: Los programas de inteligencia artificial Son programas que se acercan a la inteligencia humana. Estos programas son capaces de desarrollar conocimiento. Este tipo de lenguajes trabajan similar a la mente humana.
UNIVERSIDAD SURCOLOMBIANA
16 de 190
Email [email protected]
UNIVERSIDAD SURCOLOMBIANA
17 de 190
Email [email protected]
Ejemplo de ambigedad: la frase Mira al hombre en el patio con un telescopio se presta a ambigedad. Utilizamos un telescopio para mirar al hombre en el patio o el hombre que miramos tiene un telescopio? Ejemplo de inconsistencia: Por inconsistencia entendemos que en el enunciado podamos incurrir en contradicciones. Ejemplo sobre el procesador de palabras: - Todas las lneas de texto tienen la misma longitud, indicada por el usuario. - Un cambio de lnea debe ocurrir solo despus de una palabra, a menos que el usuario pida explcitamente la divisin por slabas. La inconsistencia resulta al preguntarse Si la palabra es ms larga que la lnea? Entonces si el usuario no pide explcitamente la divisin por slabas, esta lnea tendr mayor longitud. Ejemplo de incompletitud: Por incompletitud se entiende que no todos los trminos estn bien definidos o que no estn capturados todos los requerimientos del problema. En un manual de un procesador de palabras se encuentra la frase Seleccionar es el proceso de designar las reas de su documento sobre las cuales desea trabajar qu significa designar, colocar el ratn dnde? Qu significa rea? Cmo deben ser las reas? Es una sola rea? En otras palabras, se trata de encontrar una representacin del problema donde todo est dicho, sea mediante grficos, o utilizando otro lenguaje distinto al natural (ej. Las matemticas). En esta etapa interviene el proceso de abstraccin, que permite simplificar el problema, buscando modelos abstractos equivalentes y eliminando informaciones superfluas. Un problema no estar del todo bien comprendido si no se ha encontrado una representacin en la cual todos los elementos que intervienen sean representados sin redundancia, sin ambigedad y sin inconsistencias. El universo de bsqueda de la solucin estar en ese momento bien delimitado y con frecuencia surgir en forma ms clara la dificultad principal del problema. El problema se convierte en ms abstracto y ms puro. Se habla entonces de un enunciado cerrado.
UNIVERSIDAD SURCOLOMBIANA
18 de 190
Email [email protected]
La seccin de encabezado es usada para declarar, mencionar o identificar las variables con sus respectivos tipos y/o las constantes que se vayan a utilizar en el desarrollo del programa, as como tambin el nombre de las funciones y/o los procedimientos que ejecutarn las instrucciones de los diferentes algoritmos que va a tener dicho programa. Adems en esta seccin se declaran los archivos de inclusin (Archivos generalmente con extensin .h hablando de lenguaje C) que permiten el uso de algunas funciones que son necesarias para el desarrollo en si del programa. Igualmente se especifican las estructuras de datos complejas que se vayan a manejar. En la seccin cuerpo de programa realmente se describen todos los procedimientos y/o funciones que se van a ejecutar dentro del programa as como tambin el cdigo del programa principal. Como cuerpo de programa es indispensable que haya parte principal (Begin. End. Para pascal Void main() { . } para lenguaje C) mientras que los procedimientos y/o funciones son opcionales.
Es de aclarar que los procedimientos y/o funciones son bloques de instrucciones que forman el cuerpo del programa.
La mejor forma de aprender un lenguaje es programando con l. El programa ms sencillo que se puede escribir en C es el siguiente: main() { } Como se puede imaginar, este programa no hace nada, pero contiene la parte ms importante de cualquier programa en C y adems, es el ms pequeo que se puede escribir y que se compile correctamente. En el se define la funcin main, que es la que ejecuta el sistema operativo al llamar a un programa C. El nombre de una funcin C siempre va seguida de parntesis, tanto si tiene argumentos
UNIVERSIDAD SURCOLOMBIANA
19 de 190
Email [email protected]
como si no. La definicin de la funcin est formada por un bloque de sentencias, que esta encerrado entre llaves {}.
UNIVERSIDAD SURCOLOMBIANA
20 de 190
Email [email protected]
UNIVERSIDAD SURCOLOMBIANA
21 de 190
Email [email protected]
Aunque cada programa es distinto, todos tienen caractersticas comunes. Los elementos bsicos de un programa codificado en lenguaje C son los siguientes tomando el ejemplo anteriormente descrito:
La funcin main() (lnea 5 y cuyo cuerpo esta entre lneas 6 a la 18) La directiva #include (lnea 2) Definicin de variables (lnea 3) Prototipo de funcin (lnea 4) Enunciados del programa (lnea 8,9,12,13,16,17,23) Definicin de funcin (lnea 21 24) Comentarios (Lnea 1,7,11,15,20)
Veamos en que consiste cada uno: main() La palabra main es muy importante y debe aparecer solo una vez en todo programa C. En C, todo el cdigo est basado en funciones. El programa principal no es la excepcin. main() indica el comienzo de la funcin principal del programa la cual se delimita con llaves. Este componente es obligatorio en cualquier programa que se compile con lenguaje C. En su forma simple la funcin main consiste en la palabra main seguida de parntesis () y las instrucciones que ejecutan se encuentran demarcadas por las dos llaves {-Inicio }-Fin. Sin embargo no todos los programas tienen esta tradicional funcin; los programas de Windows escritos en C y C++ disponen de una funcin de inicio llamada winmain() en lugar de la tradicional main():
La seccin main o funcin main es la primera seccin de cdigo que se ejecuta cuando se le d la orden de ejecutar el cdigo. Desde aqu se har el respectivo enlace con las dems funciones que posea el programa.
UNIVERSIDAD SURCOLOMBIANA
22 de 190
Email [email protected]
En el primer caso se le est indicando al compilador que la funcin main devolver un valor entero (int) cuando esta sea ejecutada, por tal razn es que se coloca la funcin return y el valor de 0 al final para indicar que el valor devuelto corresponde a 0. En el segundo caso se le est indicando al compilador que la funcin main no devolver valor alguno (void) cuando esta sea ejecutada. En este caso particular no es necesaria la funcin return. La directiva #Include: La directiva #include da instrucciones al compilador C para que aada el contenido de un archivo de inclusin al programa durante la compilacin. Un archivo de inclusin es un archivo de disco separado que contiene informacin necesaria para el compilador. Varios de estos archivos (Algunas veces llamados archivos de encabezado) se proporcionan con el compilador. Nunca se necesita modificar la informacin de estos archivos y esta es la razn por la cual se mantienen separados del cdigo fuente. Todos los archivos de inclusin deben tener la extensin (.h) por ejemplo #include stdio.h. En el caso de el archivo de inclusin stdio.h le indica al compilador que se han incluido funciones estndares std de entrada i=input y salida o=output que podr utilizar en el desarrollo del programa por ejemplo (funciones como printf(), scanf()) Se usa la directiva #include para darle instrucciones al compilador que aada un archivo especfico al programa durante la compilacin. La directiva #include, en este programa de ejemplo, significa aada el contenido del archivo stdio.h .
Nota: La mayora de los programas codificados en lenguaje C requieren uno o ms archivos de inclusin. Depende del tipo de funciones que se estn utilizando: Ejemplo de ellas printf(), scanf(), clrscr(); gotoxy().....
Definicin de variables identificadores: Una variable identificador es un nombre asignado a una posicin de almacenamiento de datos. El programa utiliza variables para guardar varios tipos de datos durante la ejecucin del programa. En C, una variable debe ser definida antes de que pueda ser usada. Una definicin de variable le informa al compilador el nombre de la variable y el tipo de datos que va a guardar. En el programa de ejemplo la definicin de la lnea 3, "int a,b,c;" define tres variables, llamadas a, b, y c que guardar cada una un valor de tipo entero.
UNIVERSIDAD SURCOLOMBIANA
23 de 190
Email [email protected]
Las variables se pueden declarar en la zona de encabezado de un programa o al inicio de una funcin o un procedimiento. Hay que aclarar que algunas estructuras de programacin permiten la definicin de variables dentro de ellas. Dos reglas se deben tener en mente cuando se define nombre a los identificadores: 1. El tamao de los caracteres alfabticos es importante. Usar PRINCIPAL para el nombre de una variable bajo C, no es lo mismo que usar principal, como tampoco es lo mismo que usar PrInCiPaL. Las tres palabras se refieren a variables o identificadores diferentes. 2. De acuerdo al estndar ANSI-C, al darle nombre a un identificador solo sern significativos los primeros 31 caracteres, todo caracter mas all de este lmite ser ignorado por cualquier compilador que cumpla la norma ANSI-C Un elemento importante es el smbolo de subrayado _ que puede utilizarse como parte del nombre de una variable variable_A, contribuyendo notablemente a la legibilidad del cdigo resultante. Es utilizado por algunos, pero no por todos los programadores experimentados. Algunos subrayados sern utilizados en este curso a manera de ilustracin o descripcin de programa. Debido a que una gran parte de los escritores de compiladores utilizan el subrayado como primer carcter para los nombres de variables internas de sistema, es aconsejable evitar el uso del subrayado para iniciar un identificador y as evitar la posibilidad de una confusin de nombres en la etapa de compilacin, ms especfico, los identificadores con doble subrayado __ estn reservados para uso del compilador as como los identificadores que empiezan con un subrayado seguido de una letra mayscula _A. Esto es importante, respetar sta sencilla regla evitar depurar errores innecesarios. Palabras clave en C El estndar ANSI-C define un total de 32 palabras clave, que estn reservadas para uso exclusivo del compilador C. A continuacin se da una referencia de la totalidad de las 32 palabras clave definidas por el estndar ANSI-C, sta gua da una definicin breve de cada palabra. Diversos fabricantes de compiladores C suelen incluir una cantidad variable de palabras reservadas para sus propios compiladores, sin embargo stas palabras reservadas no estn soportadas por el estndar ANSI-C y por lo tanto no se tratan en ste libro. Se puede clasificar las palabras clave del ANSI-C de acuerdo a su funcin, en primer lugar estn las palabras que definen un tipo especfico de dato:
UNIVERSIDAD SURCOLOMBIANA
24 de 190
Email [email protected]
int: un tipo de dato entero con signo de 16, 32 64 bits, dependiendo del compilador. En sistemas de 16 bits su rango de valores es de -32768 a 32767. Para sistemas de 32 bits el rango se de -2147483648 a 2147483647. En sistemas de 64 bits el rango ser de 1.7+/-308. Actualmente son muy pocos los compiladores con capacidad de manejar datos de tipo int de 64 bits, lo usual son sistemas de 16 32 bits. float: Un nmero real de 32 bits cuyo rango va de 3.4+/-38. Generalmente su precisin es de 7 dgitos. long: Un nmero entero de 32 bits de rango igual a -2147483648 a 2147483647. double: Un nmero de 64 bits y de rango igual a 1.7+/-308 con una precisin en general de 15 dgitos. short: Un nmero de 16 bits de rango igual a -32768 a 32767. char: Un tipo de dato especfico para manejo de caracteres de 8 bits de rango igual a -128 a 127. unsigned: Modificador que se aplica a los tipos de datos enlistados arriba, su efecto es eliminar el signo a el tipo de dato aplicado, por ejemplo, para un tipo de dato int podemos especificar unsigned int en cuyo caso el rango para el tipo de dato int cambia de ser -2147483648 a 2147483647, por ste nuevo rango: 0 a 4294967295. signed: Modificador que forza al compilador a utilizar un tipo de dato con signo si antes se declar como de tipo unsigned. volatile: Especifica una variable que almacena datos cuyo contenido puede cambiar en cualquier momento sea por la accin del programa como reaccin de la interaccin del usuario con el programa. const: Especifica una variable cuyo contenido no puede cambiar bajo ninguna circunstancia. enum: Especifica un conjunto de variables que toman valores en un orden especfico y consecutivo. static: Especifica una variable que slo puede cambiar por efecto del programa. typedef: Define un tipo de dato para fcil manejo del programador basado en los datos definidos por el compilador. Muy til cuando se programa en lenguajes diferentes al ingls. sizeof: Funcin que devuelve el tamao en bytes del tipo de dato al que se aplica.
Otro conjunto de palabras clave sirve para especificar instrucciones propias de C con carcter de control del flujo de datos:
UNIVERSIDAD SURCOLOMBIANA
25 de 190
Email [email protected]
switch: Estructura condicional. case: Define los elementos de una estructura condicional switch. default: Define las acciones a ejecutar no especificadas por una instruccin case dentro de una estructura condicional switch. break: Obliga a salir de una estructura condicional switch. for: Bucle que se ejecuta tantas veces como se cumplan las condiciones especificadas dentro del parntesis de la instruccin. while: Bucle condicional que se ejecuta conforme la condicin entre el parntesis sea cierta. do: Bucle condicional que se ejecuta en conjunto con la instruccin while. continue: Instruccin para suspender un ciclo de un bucle. goto: Instruccin que ejecuta un salto a otra parte del cdigo.
El siguiente conjunto de palabras clave designa una serie de instrucciones que implementan diversas construcciones tiles en C
struct: Define una estructura. return: Especifica el dato que devuelve una funcin. union: Un tipo de dato compuesto de otros datos definidos. register: Permite almacenar un dato en el registro del sistema. extern: Especifica una variable funcin que se encuentra en un archivo fuente diferente. void: Especifica que una funcin no devuelve valor alguno. auto: Una de las cuatro clases de almacenamiento de datos, auto es la opcin por defecto, las otras tres son register, static y extern.
Adicionalmente su compilador puede definir algunas palabras clave, mismas que estarn enlistadas en la documentacin del mismo.
Variables globales:
Las variables globales son aquellas variables que se definen o declaran en la zona de encabezado de cualquier programa en C, incluso en pascal. Estas variables pueden ser utilizadas en cualquier parte del programa, igualmente puede ser modificado su valor desde cualquier instruccin.
Variables Locales:
Las variables son consideradas como locales cuando su declaracin se hace al inicio de una funcin o al iniciar un procedimiento o funcin. Las variables que hayan sido declaradas como locales solo sern reconocidas por el procedimiento o funcin donde se hizo dicha declaracin. En ninguna otra parte del programa se puede hacer uso de ellas. Si intenta hacer uso de una variable local fuera del
UNIVERSIDAD SURCOLOMBIANA
26 de 190
Email [email protected]
procedimiento o funcin donde fue declarada entonces el compilador marcar un error del siguiente tipo: Error c:\yam\C\Bin\001.cpp 7: Undefined symbol x in function main() Un reciente cambio de regla de aproximacin del comit de ANSI de C++ afecta la visibilidad de una variable que se declara en una instruccin como for. El siguiente cdigo generar un error de compilador.
Int index; For (int i=1;I<10;I++) { cout <<I; } index=I;
Prototipo de funcin:
Un prototipo de funcin proporciona al compilador C el nombre y los argumentos de una funcin contenida en el programa, y debe aparecer antes de que la funcin sea usada. Un prototipo de funcin es diferente de una definicin de funcin que contiene las instrucciones actuales que hacen a la funcin. El prototipo de funcin debe llevar (;).
Nota: Un prototipo de funcin debe llevar (;) en la seccin de encabezado. Cuando se desarrolla en el cuerpo del programa no debe llevar (;)
UNIVERSIDAD SURCOLOMBIANA
27 de 190
Email [email protected]
d, i o u x X f e g E G c s % p
entero decimal con signo entero octal sin signo entero decimal sin signo entero hexadecimal sin signo (en minsculas) entero hexadecimal sin signo (en maysculas) coma flotante en la forma [-]dddd.dddd coma flotante en la forma [-]d.dddd e[+/-]ddd coma flotante segn el valor como e pero en maysculas como g pero en maysculas un carcter cadena de caracteres terminada en '\0' imprime el carcter % puntero
De forma sencilla se puede decir que el enunciado printf(mensaje) puede desplegar como mensaje, una simple cadena de texto o mezclar texto con valores de una o ms variables identificadores del programa, la salida siempre debe formatearse entre las comillas. Las variables que contienen los valores que se deben mostrar, se escribirn por fuera de las comillas y si son varias entonces se deben separar por comas.
Ej:
UNIVERSIDAD SURCOLOMBIANA
28 de 190
Email [email protected]
En el ejemplo anterior es necesario que se conozca el valor de la variable a que debi haber sido declarada de tipo entero %d. Ejercicios de uso de la funcin printf() Busca los errores en este programa:
int main( ) { /* Aqu va el bloque de instrucciones de la funcin principal */ Printf( "Hola principiantes en programacin C \n" ); return(0); }
Solucin: Si se compila el cdigo anterior en lenguaje C, se obtendr un error que indicar que no se ha definido la funcin Printf. Error c:\yamil\C\bin\001.cpp 7: Function Printf should have a prototype in function main(). Esto es porque no se incluy la librera <stdio.h> con la directiva #include. (En algunos compiladores no es necesario incluir esta directiva, pero es una buena costumbre hacerlo). Si se corrige el cdigo incluyendo la librera stdio.h y se vuelve a compilar se obtendr un nuevo error.
#include stdio.h int main( ) { /* Aqu va el bloque de instrucciones de la funcin principal */ printf( "Hola principiantes en programacin \n" ); return(0); }
Esta vez indicar el mismo error indicando desconocimiento de la funcin Printf. Esta vez el problema es de las maysculas que se ha indicado antes. Lo correcto es escribir printf con minsculas. Parece una tontera, pero seguro que dar ms de un problema. Hay un grupo de smbolos, que son tratados como caracteres individuales, que especifican algunos caracteres especiales del cdigo ASCII y son utilizados dentro de la instruccin printf. Los ms importantes son:
\a \b \f \n \r \t \v \\ \' \" Alerta Espacio atrs (Retroceso) Salto de pgina Salto de lnea Retorno de carro Tabulacin horizontal (Tab) Tabulacin vertical Barra invertida Comilla simple Comillas dobles
UNIVERSIDAD SURCOLOMBIANA
29 de 190
Email [email protected]
\OOO \xHHH
Visualiza un carcter cuyo cdigo ASCII es OOO en octal Visualiza un carcter cuyo cdigo ASCII es HHH en hexadecimal
scanf(): El enunciado scanf() es otra funcin de la librera o biblioteca stdio.h. Ella lee datos desde el teclado y asigna los datos a una o ms variables del programa.
Ej: scanf(%d,&a); scanf(%d %d,&a,&b);
En el primer ejemplo se lee un valor entero y este es asignado a la direccin de la variable a. En el caso del segundo ejemplo se leen dos datos enteros y cada valor es almacenado en las variable a y b respectivamente.
Definicin de funcin:
Una funcin es una seccin de cdigo independiente y auto contenida que es escrita para ejecutar determinada tarea. Cada funcin tiene un nombre y el cdigo de cada funcin es ejecutado incluyendo el nombre de la funcin, en una instruccin de programa. A esto se le llama llamado de la funcin. La funcin denominada producto, es una funcin definida por el usuario. Tal como lo indica su nombre las funciones definidas por el usuario son escritas por el programador durante el desarrollo del programa. Esta funcin es simple, ya que todo lo que hace es multiplicar dos valores y regresar el resultado de dicha multiplicacin al programa que la llam. El C tambin incluye funciones de biblioteca que son parte del paquete del compilador C. Las funciones de biblioteca ejecutan la mayora de las tareas comunes (como la entrada /salida de la pantalla el teclado y disco) que necesita el programa. En el programa de ejemplo printf y scanf son funciones de biblioteca.
Comentarios:
Agregar comentarios al cdigo C de un programa puede hacerlo mas entendible al usuario que este leyendo cdigo, pero carente de significado para el compilador, por lo que se indica al compilador ignorar completamente los comentarios encerrndolos en caracteres especiales. La combinacin de lnea diagonal y asterisco se usa en C para delimitar comentarios /* comentario */. Sirve para escribir informacin que referencie al programa, pero que no forme parte de l como instruccin o como dato. Por ejemplo especificar que hace el programa,
UNIVERSIDAD SURCOLOMBIANA
30 de 190
Email [email protected]
quien lo elabor, en que fecha, que versin es, etc. El compilador ignora lo que haya como comentario en el momento de hacer la compilacin del programa. Ejemplo para C: /* Este es un comentario */ En el caso de otra interfaces como MatLab los comentarios simplemente se declaran escribiendo un % al iniciar cada lnea que quedar como comentario. Ejemplo para Matlab: % Este es un comentario Para este caso en particular el programa Matlab cambia el color de la letra de la lnea que haya quedado como comentario.
Flujo de sentencias:
Es la declaracin de todas las instrucciones que conforman un programa. Todas las sentencias van separadas por (;), en renglones separados o de manera seguida. Definicin de funciones creadas por el programador utilizadas en main(): Finalmente, se procede a definir el contenido de las funciones utilizadas dentro de main(). Estas contienen los mismos elementos que la funcin principal.
Importante:
Despus de cada asignacin o funcin es imprescindible colocar un punto y coma (;) ya que ste es un terminador de proposiciones. En caso de que no se escriba, se marcar un error a la hora de compilar el programa. En C, los comandos, palabras reservadas o funciones deben ser escritos con letras minsculas, tal como se hizo en el programa de ejemplo. En el lenguaje Turbo Pascal no interesa de qu modo se escriban. En el caso de las variables o las funciones definidas por el usuario la situacin es similar para el caso del lenguaje C, no es lo mismo: Apellido - apellido APELLIDO Aunque para nosotros es lo mismo, el compilador de C, los toma como tres nombres distintos. Por tanto, asegrese de mandar llamar las variables o funciones exactamente de la misma forma en que las declar. En el caso del los lenguajes Turbo Pascal y Basic no diferencian entre maysculas y minsculas o sea que para dichos lenguajes lo mismo es "A" que "a". Ejemplos: a) En el siguiente ejemplo se despliega o muestra un mensaje de bienvenida en la posicin 20 sobre el eje X (Horizontal) y 10 sobre el eje Y (Vertical) de
UNIVERSIDAD SURCOLOMBIANA
31 de 190
Email [email protected]
la pantalla y se espera 2.5 segundos aproximadamente mientras el usuario observa dicho mensaje.
/* Este e sun programa que escribe en la pantalla una bienvenida */ #include <stdio.h> #include <conio.h> #include <dos.h> main() { clrscr(); gotoxy(20,10); printf("BIENVENIDO AL CURSO DE C ESTNDAR"); delay(2500); }
La funcin delay en el ejemplo anterior permite indicarle a la mquina cuando ejecute dicha funcin, que se espere 2.5 segundos aproximadamente mientras el usuario lee lo que esta presentado en la pantalla. Pasado los dos segundos el compilador continuar la ejecucin de la siguiente lnea. Es necesario incluir la librera dos.h a traves de la directiva include. b) El siguiente programa le pregunta por su nombre y los aos que tienes. Al final da como respuesta el nmero de das vividos y le coloca un mensaje para que termine el programa. Por la forma que se detiene el programa (getch()) hasta que no se pulse una tecla la computadora no terminara la ejecucin del programa.
#include<stdio.h> #include<conio.h> main() { char nombre[50]; int edad; clrscr(); gotoxy(10,5); printf("Cmo te llamas?\n "); scanf("%s",&nombre); gotoxy(10,6); printf("Cuntos aos tienes?\n"); scanf("%i",&edad); edad = edad * 365; gotoxy(10,8); printf("%s, has vivido %d das",nombre,edad); gotoxy(40,22); printf("Pulsa cualquier tecla para terminar..."); getch(); }
UNIVERSIDAD SURCOLOMBIANA
32 de 190
Email [email protected]
Los parmetros %s y %d corresponden a los tipos de datos que se leen o escriben. Tenga en cuenta que la instruccin de lectura la variable se acompaa del smbolo & (&edad, &nombre), mientras que en la instruccin de escritura solo se coloca la variable En la seccin de tipos de datos podr encontrar los diferentes tipos de datos as como sus parmetros. c) El siguiente ejemplo permite la captura por teclado de 3 nmeros cada uno de ellos almacenados en un nombre de variable diferente y al final se entrega el promedio de dichos valores.
#include<stdio.h> #include<conio.h> main() { float numero; float promedio=0; clrscr(); gotoxy(10,5); printf("Dame el primer nmero: "); scanf("%f",&numero); promedio+=numero; gotoxy(10,6); printf("Dame el segundo nmero: "); scanf("%f",&numero); promedio+=numero; gotoxy(10,7); printf("Dame el tercer nmero: "); scanf("%f",&numero); promedio += numero; promedio = promedio/3; gotoxy(10,8); printf("El promedio es %f",promedio); gotoxy(40,22); printf("Presione cualquier tecla para terminar..."); getch(); }
Si el ejemplo anterior lo desea correr bajo MatLab tiene que guardarlo en un archivo tipo m en el directorio Work de Matlab o en el directorio donde haya configurado en Set Path de la Opcin de men File. Una vez guardado bajo cualquier nombre, entonces simplemente en el prompt del matlab lo ejecuta llamando el archivo por el nombre guardado.
% este programa es ejecutado bajo Matlab promedio=0; n=input('Dame el 1 nmero:'); promedio=promedio+n; n=input('Dame el 2 nmero: '); promedio=promedio+n; n=input('Dame el 3 nmero: '); promedio = promedio+ n; promedio = promedio/3;
UNIVERSIDAD SURCOLOMBIANA
33 de 190
Email [email protected]
d)
El siguiente ejemplo convierte un nmero capturado por teclado en sistema numrico decimal al sistema octal utilizando parmetros que ofrece el lenguaje C para dicha conversin.
#include<stdio.h> #include<conio.h> main() { int numero; clrscr(); gotoxy(10,5); printf("Digite un nmero entero en decimal: "); scanf("%i", &numero); gotoxy(10,6); printf("\n\n Su representacin en octal es %o"); gotoxy(40,22); printf("Presione cualquier tecla para terminar..."); getch(); }
e)
El siguiente ejemplo escribe un mensaje de advertencia sobre algo al usuario y lo mezcla con algunos sonidos que son familiares.
#include <dos.h> #include<conio.h> int main(void) { clrscr(); gotoxy(28,11); printf(" P E L I G R O ! "); sound(250); delay(600); sound(80); delay(600); delay(600); nosound(); return (0); }
UNIVERSIDAD SURCOLOMBIANA
34 de 190
Email [email protected]
Las variables de carcter Las variables numricas enteras Las variables numricas de punto flotante o reales Las variables de tipo cadena (string) Las matrices (arrays), formadas por elementos contiguos en memoria de uno de los tipos citados anteriormente Los registros y archivos
Tradicionalmente se han definido como dinmicas las estructuras de cola, pila y rbol por permitir la variacin del nmero de sus elementos, dentro de ciertos lmites, durante la ejecucin del programa. Por lo complejo que resulta el manejo de todo tipo de estructuras, en este libro se menciona tan solo los tipos de estructuras simples que son los mas manejados para la solucin de problemas comunes a Ingeniera.
UNIVERSIDAD SURCOLOMBIANA
35 de 190
Email [email protected]
TIPOS DE DATOS
En el presente captulo se har un recuento del tipo de datos usados en los lenguajes de programacin con el fin de que el usuario pueda en un momento dado entender el tipo de datos utilizado en la mayor parte de ejercicios solucionados en el presente libro. Se visualizara para cada lenguaje en particular el tipo de dato que maneja al igual que sus rangos. Se dar cuenta que la mayora maneja los datos con la misma filosofa y la variacin de unos a otros esta dado solo por la sintaxis que se use para hacer referencia a ellos. La gran variedad de datos que trae consigo un lenguaje de programacin hace que el programador escoja el tipo mas adecuado para la aplicacin que est desarrollando. El rango de datos que maneja cada tipo, indica al usuario que escoger. Los datos se pueden agrupar en los siguientes tipos. PREDEFINIDOS POR LOS LENGUAJES: ENTEROS DECIMALES DE CADENA BOLANOS DEFINIDOS POR EL USUARIO SUBRANGO ENUMERADOS
UNIVERSIDAD SURCOLOMBIANA
36 de 190
Email [email protected]
0 0 0 0 (8 bits ceros)
1 1 1 1 1 1 1 1 (8 bits unos)
Si se pasa el conjunto de bits (Sistema Binario) a Sistema decimal se tiene que el rango que se maneja ahora ir desde: 0 (decimal correspondiente a los 8 bits ceros) a 255 (decimal correspondiente a los 8 bits unos)
Como el rango anterior est utilizando todos los ocho bits del byte para almacenamiento de datos, slo toma datos enteros positivos, no hay forma de reservar ningn campo bit para el signo. En el caso del entero corto, por utilizar siete bits para almacenamiento de datos, el octavo es usado para signar datos (signo mas o menos). Por tanto solo dispone en memoria de 7 bit para almacenar (bits unos) o (bits ceros). El rango manejado en sistema binario con siete (7) bit ir desde 0000000 hasta el 1111111, que en sistema decimal corresponde al rango de 0 al 127, o sea 128 datos enteros positivos. Como se deja un bit reservado para manejo de signo, entonces los datos negativos sern 128 tambin que irn en rango desde el -1 al -128. El rango definitivo de enteros positivos y negativos para el tipo de dato entero corto ser desde -128 al 127.
UNIVERSIDAD SURCOLOMBIANA
37 de 190
Email [email protected]
correspondiendo a los valores que van de 0 a 255 (en sistema decimal) o 00000000 a 11111111 (en sistema binario). El conjunto de caracteres de la tabla ASCII se agrupan en dos bloques as: El primer bloque conformado por los caracteres de control. Corresponden a ste bloque los caracteres del cdigo ASCII que van de 1 a 31. El segundo bloque conformado por los caracteres bsicos o caracteres imprimibles. Van del cdigo ASCII 32 al 126, se introducen directamente por el teclado. El tercer bloque conformado por caracteres del cdigo ASCII ampliado. Para hacer referencia a ellos en turbo PASCAL se preceden del signo #. Para asignar cualquier caracter ASCII a una variable de tipo Char existen varias formas as: A := 'g'; {Se asigna el caracter g a la variable A} B := A; {Se asigna el valor de A, a la variable B} C := #65; {Se asigna el caracter nmero 65 de la tabla ASCII a la variable C}
UNIVERSIDAD SURCOLOMBIANA
38 de 190
Email [email protected]
Ejemplo para lenguaje C char nom[10]; Cuando se define de tipo string y se restringe el nmero de caracteres, en el caso de nom tan solo a 20, se esta indicando al compilador que dentro del programa, mximo se le debe asignar una cadena de 20 caracteres o menos. Si un usuario asigna mas de lo que se estableci, simplemente se desechan los caracteres que sobren a la derecha. En el caso de la segunda definicin (Dir), no se est restringiendo su tamao por tanto es una variable que puede almacenar el mximo de caracteres para variables de este tipo (255); Vale anotar que durante la ejecucin de un programa se puede modificar la longitud de la variable tipo String. Algunas funciones de Turbo Pascal aplicadas a cadenas son las siguientes: Fillchar: Funcin que llena el buffers de la variable de una caracter determinado. Si en un momento determinado se quisiera llenar la variable Nom con letras 'A' en lugar de hacer la asignacin Nom:='AAAAAAAAAAAAAAAAAAAA', se puede realizar as: Fillchar(Nom,20,'A'); Se le est diciendo que llene la variable Nom con 20 caracteres 'A'. si no se conoce el tamao de la variable entonces se puede utilizar as: Fillchar(Nom,sizeof(Nom),'A'); Se utiliza la funcin Sizeof para indicar que llene totalmente la variable Nom con el caracter 'A'.
UNIVERSIDAD SURCOLOMBIANA
39 de 190
Email [email protected]
En el ejemplo anterior se le asigna a Op un valor lgico que depende de la evaluacin que se haga de ver si 2 es menor que 3. Como efectivamente es menor entonces se le asigna el valor de TRUE a op, y al evaluarlo en el si condicional (If) ejecuta la sentencia que est del lado del entonces (then en algunos lenguajes), de lo contrario algo raro andar pasando con su computador.
UNIVERSIDAD SURCOLOMBIANA
40 de 190
Email [email protected]
Type
fruta = (anon, mango, meln, mora, fresa, limn, naranja); color= (rojo, naranja, amarillo, verde, violeta, azul, negro);
La lista que forma un tipo enumerado se da siempre entre parntesis LENGUAJE C++ Los tipos de datos bsicos definidos por C son caracteres, nmeros enteros y nmeros en coma flotante. Los caracteres son representados por char, los enteros por short, int, long y los nmeros en coma flotante por float y double. Los tipos bsicos disponibles y su tamao son:
TIPO Char Short Int Unsigned Long Float Double DESCRIPCION Carcter Entero corto con signo Entero con signo Entero sin signo Entero largo con signo Flotante simple Flotante doble TAMAO EN BITS (normalmente 8 bits) (normalmente 16 bits) (depende de la implementacin) (depende de la implementacin) (normalmente 32 bits) (normalmente 32 bits) (normalmente 64 bits)
Posibles combinaciones de los tipos bsicos de datos en lenguaje C y los modificadores con los tamaos y rango de bits comunes se muestran en la siguiente tabla. Algunos de ellos pueden ser alterados por los modificadores short, signed, unsigned, long. Si se utiliza un modificador Short se antepone al modificar %h, Si se utiliza el modificador long %l, Para el unsigned el modificador %u. El uso incorrecto de los modificadores %d y %u, dar que los valores asignados a los identificadores pueden ser modificados. La palabra unsigned en realidad es un modificador aplicable a tipos enteros, aunque si no se especifica un tipo se supone int. Un modificador es una palabra clave de C que indica que una variable, o funcin, no se comporta de la forma normal. Hay tambin un modificador signed, pero como los tipos son por defecto con signo, casi no se utiliza. Las variables son definidas utilizando un identificador de tipo seguido del nombre de la variable. float cels, farh; int A,B; unsigned int x,y; long double a,b;
UNIVERSIDAD SURCOLOMBIANA
41 de 190
Email [email protected]
Tipo Char Unsigned char Signed char Int unsigned int short int unsigned short unsigned short unsigned short int long int unsigned long int float double long double Bool
Tam en Bits 8 8 8 16 16 16 16 16 16 32 32 32 64 80 1
Rango -128..127 0..255 -128..127 -32768..32767 0..65535 -32768..32767 -32768..32767 0..65535 0..65535 -2,147,483,648..2,147,483,647 0..4,294,967,295 3.4E-38..3.4E+38 1.7E-308..1.7E+308 3.4E-4932..1.1E+4932 True o false
Hay que aclarar que si se define una variable tipo char y se usa el modificador %s string, sta variable puede almacenar cadenas de caracteres. Solo los tipos de datos double y float aceptan nmeros con punto flotante (valores con fracciones decimales), en tanto que los otros tipos manejan nicamente enteros. Aunque es valido asignar un valor que contenga una fraccin decimal a un dato de tipo entero, dicha fraccin se elimina y solo se asigna la parte entera. Ejemplos de declaracin de variables son:
int x,y; unsigned short int y,k,a; long double x,y; int w=10;
Se puede al momento de declarar una variable asignarle un valor cualquiera, En el ejemplo anterior se declara la variable w de tipo entero y de una se inicializa con un valor igual a 10. Las variables en lenguaje C se declaran como locales a procedimientos o funciones y globales en el encabezado del programa.
UNIVERSIDAD SURCOLOMBIANA
42 de 190
Email [email protected]
DATOS ENTEROS
NOMBRE Integer Word Shortint Byte Longint RANGO (desde - hasta) -32.768..32.767 0..65.535 128..127 0..255 -2.147.483.648..2.147.483.647 TAM (Byte) 2 2 1 1 4 Entero con signo Entero sin signo Entero corto con signo Entero corto sin signo Entero largo con signo FORMATO
DATOS REALES
NOMBRE
Real Single *Double *Extended *Comp 2.9 e 1.5 e 5.0 e -9.2 e
RANGO
(desde - hasta) 39 45 324 18 1.7 e 3.4 e 38 38
TAM
Bytes 6 4 8 10 8
CIFRAS
SIGNIFICATIVAS 11-12 7-8 15-16 19-20 18-19
1.9 e 4851
Los tipos de datos reales diferentes al real, solo se pueden usar cuando existe u coprocesador matemtico o una emulacin del mismo mediante el uso de las directivas $N+ y $E-. Lo anterior gracias a que Turbo Pascal a partir de la versin 5.0 emula en software el chip coprocesador matemtico permitiendo utilizar los diferentes tipos de datos reales para ejecutar aplicaciones en mquinas que no posean este chip coprocesador. Ejemplos de la forma como se declaran los datos en Turbo pascal. Var X A B,c D :char; :byte; :integer; :double; Y E :string(10); :extended;
UNIVERSIDAD SURCOLOMBIANA
43 de 190
Email [email protected]
VISUAL BASIC: Posibles combinaciones de los tipos bsicos de datos en basic y todos sus sucesores hasta visual basic y los modificadores con los tamaos y rango de bits comunes. Los tipos bsicos de datos en lenguaje son: Integer, long, single, double, currency, string, byte, boolean, date, object y variant
Tipo Byte Integer Long Single Double Currency String Boolean Date Object Variant Tam byte 1 2 4 4 8 1 2 2 8 4 Rango 0..255 -32768..32767 -2147483648..2147483647 -3.4E+38..3.4E+38 -1.79E-308..1.79E+308 -22337203685477.58..922337203685477.58 0..65535 True o False 1/enero/100 .. 31/diciembre/9999 cualquier referencia a objeto 16 con nmeros, 22 con caracteres $ % & Tipo Carac
Ejemplos de declaracin de variables son: Dim X as integer Dim X as byte Dim X as double, Y as string La declaracin de variables en las versiones de Visual Basic se hacen locales a Objetos, generales a Formas o Globales a Proyectos. Las variables globales comparten variables entre formas diferentes que contenga el proyecto. En las dems versiones de Basic anteriores se declaran generales a todo el programa que se desarrolle. En Matlab se manejan casi los mismos datos que manejan en el lenguaje C. Para saber que tipo de formato se puede usar, simplemente digite en el prompt del MatLab la instruccin help format y enter (). Se mostrar una pantalla con informacin sobre formatos utilizados en MatLab. help format FORMAT Set output format. All computations in MATLAB are done in double precision.
UNIVERSIDAD SURCOLOMBIANA
44 de 190
Email [email protected]
FORMAT puede ser usado para escoger entre diferentes formatos de salida como sigue; FORMAT FORMAT pi FORMAT pi FORMAT pi FORMAT pi FORMAT pi FORMAT pi FORMAT pi FORMAT Por defecto, es lo mismo que short. formato de punto fijo con 5 dgitos. 3.1416 formato de punto fijo con 15 digitos. 3.14159265358979 formato de punto flotante con 5 dgitos. 3.1416e+000 formato de punto flotante con 15 dgitos 3.141592653589793e+000 Best of fixed or floating point format con 5 digitos. 3.1416 Best of fixed or floating point format con 15 digitos. 3.14159265358979 formato Hexadecimal 400921fb54442d18 los smbolos +, - y blank son impresos para elementos positivos, negativos y zero. Partes imaginarias son ignoradas. FORMAT BANK formato fijo para dlares y centavos. pi ans = 3.14 FORMAT RAT Aproximacin por fraccionarios de enteros pequeos. ans = 355/113 pi SHORT ans = LONG ans = SHORT E ans = LONG E ans = SHORT G ans = LONG G ans = HEX ans = + El format RAT da el fraccionario mas aproximado al valor expuesto. En este caso el valor de PI. No olvide que a pesar de que ac se escribe en maysculas cuando use el MatLab deber escribir las funciones en minscula. Spacing: FORMAT COMPACT Suppress extra line-feeds. FORMAT LOOSE Puts the extra line-feeds back in.
UNIVERSIDAD SURCOLOMBIANA
45 de 190
Email [email protected]
ALGORITMOS Y PROGRAMAS
La principal razn para que las personas aprendan lenguajes de programacin es utilizar la computadora como una herramienta para la resolucin de problemas. Dos fases pueden ser identificadas en este proceso. 1. Fase de resolucin del problema 2. Fase de implementacin en una microcomputadora El resultado de la primera fase es el diseo de un algoritmo para resolver el problema. Un algoritmo se puede considerar como el conjunto de instrucciones que conducen a la solucin de un problema determinado. Dichas instrucciones deben tener una secuencia lgica para poder llegar a la solucin real. El algoritmo se puede expresar de diversas maneras. Mediante smbolos, utilizando un lenguaje determinado para hablar la solucin, describir sintticamente dicha solucin o simplemente escribindolo en cualquier cdigo valido para algn lenguaje de programacin. La ltima forma de describir el algoritmo es a lo que se le denomina PROGRAMA.
DISEO DE PROGRAMAS:
El diseo de programas no es tarea difcil. Un programa se construye teniendo en cuenta dos cosas que me facilitan cualquier lenguaje de programacin: Las Estructuras de Programacin y las Estructuras de Datos. La utilizacin eficiente de cada una de las estructuras antes mencionadas permiten dar solucin a cualquier problema que se desee resolver. En este libro se tratar con profundidad las estructuras de programacin y se utilizara algunas estructuras de datos que sean necesarias para la solucin de los ejemplos que se resuelvan. (Bsicamente tienen que ver con variables simples y arreglos) En la fase de resolucin de cada uno de los ejemplos se incluyen etapas as: 1. Anlisis del problema 2. Diseo del algoritmo Diagrama de flujo Seudo lenguaje Cdigo Pascal Lenguaje C++ 3. Verificacin o prueba de escritorio
UNIVERSIDAD SURCOLOMBIANA
46 de 190
Email [email protected]
DIAGRAMAS DE FLUJO
Un diagrama de flujo es un dibujo que utiliza smbolos estndar de diagramacin de algoritmos para computador, en el que cada paso del algoritmo se visualiza dentro del smbolo adecuado y el orden en que estos pasos se ejecutan. Se indica su secuencia conectndolos con flechas llamadas lneas de flujo porque indican el flujo lgico del algoritmo. En esencia el diagrama de flujo es un medio de presentacin visual y grfica de flujo de datos, a travs de un algoritmo, las operaciones ejecutadas dentro del sistema y la secuencia en que se ejecutan. Se puede decir tambien que un diagrama de flujos o un organigrama es una representacin semigrfica del algoritmo en cuestin. Esto facilita la visin descriptiva de la ejecucin del programa, as como la generacin de la traza del algoritmo. Se denomina traza de un algoritmo a la ejecucin manual de un programa obteniendo para cada paso un resultado. Los smbolos utilizados en los diagramas han sido normalizados por las organizaciones ANSI (American National Institute) y por ISO (International Standard Organization) aunque el uso de esos Estndar es voluntario.
UNIVERSIDAD SURCOLOMBIANA
47 de 190
Email [email protected]
Para toma de decisiones: Smbolo utilizado tanto en decisiones como en estructuras cclicas Para representar entrada de datos
Indican la direccin de flujo en un diagrama, adems conecta todos los smbolos del diagrama
UNIVERSIDAD SURCOLOMBIANA
48 de 190
Email [email protected]
REGLAS DE PROGRAMACIN:
Desde que las ideas de Knuth, Dijkstra y Wirth fueron consolidadas en el campo informtico, las reglas para la construccin de algoritmos han ido variando constantemente y de igual forma los lenguajes de programacin, en general se han ido adaptando a estas reglas o tcnicas de programacin. Las reglas que se deben considerar en una buena programacin son:
Disear algoritmos en etapas yendo de lo general a lo particular (mtodo descendente) Dividir el algoritmo en partes independientes -mdulos- y tratar cada mdulo independientemente. 3. Establecer y utilizar la solucin de problemas tcnicas de programacin estructuradas Dar especial importancia a las estructuras de datos Describir completamente cada algoritmo Verificar o realizar la prueba de escritorio a cada algoritmo desarrollado. 1. 2.
4. 5. 6.
Un programa puede ser considerado como el conjunto de Estructuras de datos mas el conjunto de Estructuras de programacin ms el Encabezado que exige cada lenguaje en particular.
PROGRAMACIN ESTRUCTURADA
La programacin estructurada es el conjunto de tcnicas para desarrollar programas fciles de escribir, verificar, leer y mantener Se puede concretar mas la definicin diciendo que la programacin estructurada es el conjunto de tcnicas que incluye:
Un nmero limitado de estructuras de programacin Diseo descendente Descomposicin modular con independencia de los mdulos puede ser
El teorema de Bohm y Jacopini establece que un programa propio escrito utilizando solo tres tipos de estructuras de control: Secuencial Selectiva Repetitiva
Hoy me atrevera a decir que un programa propio puede ser escrito utilizando lo siguiente:
UNIVERSIDAD SURCOLOMBIANA
49 de 190
Email [email protected]
Declaraciones: Libreras de inclusin Declaracin de funciones y/o procedimientos Definicin de constantes y/o variables Estructuras de programacin: Asignacin Decisin Cclicas De seleccin mltiple Estructuras de datos: Estticas simples Dinmicas Registros Arreglos Archivos Funciones: Predefinidas por el lenguaje Definidas por el usuario. Generalmente cuando el algoritmo o solucin de un problema determinado se deja en trminos de diagrama de flujo, Seudo lenguaje e incluso en Seudo cdigo se puede trabajar nicamente con estructuras de programacin.
UNIVERSIDAD SURCOLOMBIANA
50 de 190
Email [email protected]
ESTRUCTURAS DE PROGRAMACIN
Tambin llamadas estructuras de control por algunos autores. Son aquellas que le permiten a un usuario ejecutar tareas que a la final le permiten dar solucin a problemas que se quieran resolver usando microcomputadoras. En general se puede decir que las estructuras de programacin son herramientas que el lenguaje le provee al usuario para solucionar problemas haciendo uso de computadoras. Las estructuras de programacin que tienen la mayora de los lenguajes son cuatro as: Estructuras Estructuras Estructuras Estructuras de Asignacin de Decisin Cclicas de Seleccin mltiple.
ESTRUCTURA DE ASIGNACIN
Esta estructura se conoce tambin como sentencia en algunos lenguajes estructurados. Las estructuras de asignacin, son utilizadas en el cuerpo de programa, procedimientos esclavos o funciones. Una estructura de este tipo consiste en la asignacin de una expresin a un identificador (comnmente llamado variable) vlido en un lenguaje de programacin. La parte de esta estructura solamente puede estar ocupada por una variable. Toda variable, literal o constante aparecer formando la expresin al lado derecho. Variable = Expresin
Expresiones simples
La expresin ms simple consiste en un solo concepto: una simple variable, constante literal, constante numrica o constante simblica.
UNIVERSIDAD SURCOLOMBIANA
51 de 190
Email [email protected]
PI '20' 20 I
Constante simblica definida por algunos lenguajes. Constante literal definida por el usuario. Constante numrica definida por el usuario. Variable definida de algn tipo ofrecido por los lenguajes.
Expresiones complejas
Las complejas consisten en expresiones simples conectadas o relacionadas con operadores bien sean matemticos o relacionales. Ejemplos: A+B (A + B) * (C + B) Operadores Un operador es un smbolo que le da instrucciones al lenguaje de programacin para que ejecute alguna operacin, o accin, en uno o ms operandos. Un operando es algo sobre lo cual acta un operador (podra considerarse como una expresin)
El operador de asignacin
Permite evaluar una expresin y calculado su valor guardarlo en una posicin de memoria asignando dicho valor al nombre de una variable. Dicho de otra manera, el valor calculado de la expresin queda referenciado a la variable a la cual se le asigna. La forma general de uso es: Lenguaje C Variable = Expresin lenguaje C X=Y Lenguaje Pascal Variable:= Expresin en Pascal. X := Y
En un programa codificado en algn lenguaje, la estructura de asignacin del ejemplo anterior no significa que X es igual a Y. En cambio significa "asigne el valor de Y a X".
UNIVERSIDAD SURCOLOMBIANA
52 de 190
Email [email protected]
En cualquier lenguaje de programacin el lado derecho representa cualquier expresin y el lado izquierdo debe ser un nombre de variable declarado previamente y valido en el lenguaje de programacin.
Operadores matemticos
Los distintos operadores permiten formar expresiones tanto aritmticas como lgicas. Los operadores aritmticos y lgicos son:
+, ++, -*, /, % >>, << & | ^ ~ ! ==, != &&, || <, <= >, >=
Suma, resta Incremento, decremento (Operador Unario) Multiplicacin, divisin, mdulo Rotacin de bits a la derecha, izquierda. AND booleano OR booleano EXOR booleano Complemento a 1 Complemento a 2, NOT lgico Igualdad, desigualdad AND, OR lgico Menor, menor o igual Mayor, mayor o igual
En estos operadores deben tenerse en cuenta la precedencia de operadores y las reglas de asociatividad, que son las normales en la mayora de lenguajes. Adems hay toda una serie de operadores aritmticos con asignacin, como pueden ser += y ^=. Cada lenguaje en particular involucra otra serie de operadores tales como: Basic: ^ : Exponenciacin
Lenguaje C:
Operadores Unarios:
++ -: Incremento en uno : Decremento en uno
Operador matemtico
UNIVERSIDAD SURCOLOMBIANA
53 de 190
Email [email protected]
: Mdulo: Toma la parte residuo de una divisin: Ej: Si se divide 11 entre 4 da de resultado 2 y sobra de residuo 3. Si se hace X=11%3 entonces X tomar el valor residuo de 3.
El siguente ejemplo realizado en codigo C, muestra algunas formas de utilizacin de operadores y sus respectivos valores o incidencias sobre variables segn el caso.
#include <stdio.h> void main() { int a,b,c,suma,producto,division,modulo; /* Sentencias de asignacin */ a = 2; /* Se asigna el valor de 2 a la variable a */ a = a+2; /* ahora a vale 4 */ b = 2*a+1; /* b se le asigna el valor de 9 = (2*4+1) */ /* Operaciones */ /* Se escribir en la siguiente instruccin el valor de 13 */ suma = a+b; printf("Resultado suma = %d\n", suma); /* Se escribir en la siguiente instruccin el valor de 36 */ producto = a*b; printf("Resultado producto = %d\n", producto); division = b/a; /* Se escribir en la siguiente instruccin el valor de 2 */ printf("Resultado division entera = %d\n", division); /* Escribe la parte entera porque se trata de variable que han sido definidas como enteras */ modulo = b%a; /* Se escribir en la siguiente instruccin el valor de 1 */ printf("Resultado modulo = %d (%d)\n", modulo, b - (b/a)*a); /* Escribe la parte del residod e vivir 9 entre 4 o sea 1. Igualmente porque se trata de variables que han sido definidas como enteras */ /* Asignacin + Operacin */ a *= b; a /= b; a += b; a -= b; ++a; a++; --a; a--; /* /* /* /* /* /* a a a a a a = a*b = a/b = a+b = a-b = a+1 = a-1 */ */ */ */ */ */ */ */ */ */
/* Operaciones Unarias */ b = ++a; /* Incremento antes de asignacion c = a++; /* Incremento despues de asignacion b = --a; /* Decremento antes de asignacion c = a--; /* Decremento despues de asignacion
La operacin Unaria (Inremento o Decremento) antes de la asignacin hace que se cambie el valor de la variable antes de ser asignada.
UNIVERSIDAD SURCOLOMBIANA
54 de 190
Email [email protected]
Por ejemplo si a vale 3 y realizamos la asignacin b=++a; entocnes b queda con el valor de 4, y si se asigna a c=--a, entonces c vale 2. Las siguientes instrucciones realizan exactamente lo mismo: A = A +1; A + = 1; A++; ++A;
Lenguaje pascal Mod Div : Para tomar la parte residual de una divisin. Similar al % del C. : Para tomar la parte entera de una divisin.
El operador sizeof
Adems de los operadores citados, comunes a otros lenguajes de programacin, C utiliza tambin, el operador sizeof(), que le permitir conocer la longitud, en bytes, que un tipo de dato ocupa en memoria. As, por ejemplo; sizeof(variable) Devolver 2 si la variable ha sido definida de tipo entera (int), 4 si la variable ha sido declarada de tipo real (float) y as sucesivamente para todos los tipos manejados por C. El valor devuelto por sizeof() depende del compilador utilizado; no obstante, este operador que se puede utilizar con variables predefinidas por el sistema o definidas por el usuario, asegura la portabilidad del programa entre sistemas. Anlogamente: sizeof(tipodedato) Retornar un valor que corresponder al espacio reservado por el compilador para el tipo de dato especificado en el momento de compilar el programa. Asi: sizeof(float) Devolver 4 que, como se puede observar en la tabla de tipo de datos, el valor corresponde al nmero de bytes que se reservan en memoria para cada variable que se declare del tipo de dato float.
UNIVERSIDAD SURCOLOMBIANA
55 de 190
Email [email protected]
El lenguaje C se diseo para sustituir en muchos trabajos al lenguaje ensamblador. Por ello, soporta un juego completo de operadores capaz de manejar los datos al nivel de bits. Las operaciones al nivel de bits soportan solamente los datos de tipo caracter (char) y entero (int) con sus variantes. Son los siguientes: & | ^ ~ >> << AND binario OR binario (ascii 124) XOR binario (ascii 94) NOT binario (tilde, ascii 126) Desplazamiento de bits a derecha Desplazamiento de bits a izquierda
Los operadores AND OR y NOT se comportan igual que los anteriormente definidos pero al nivel de bits. La tabla de verdad de estos operadores es la siguiente. X 0 0 1 1 Y 0 1 1 0 X&Y 0 0 1 0 X/Y 0 1 1 1 X^Y 0 1 0 1 ~X 1 1 0 0
Los operadores de desplazamiento de bits mueven todos los bits de una variable a la izquierda o a la derecha un nmero fijo de posiciones segn se especifique. Los formatos de estas instrucciones son los siguientes: NombreVariable>> NumeroPosicionesDerecha
Precedencia de operadores
En una expresin que contiene mas de un operador aritmtico diferente el computador evala dicha expresin de acuerdo a la siguiente jerarqua de operadores. = +/ * % mod div Negacin (-), ++, - Jerarqua ms baja
UNIVERSIDAD SURCOLOMBIANA
56 de 190
Email [email protected]
Exponenciacin
Jerarqua ms alta
La tabla anterior indica que la primera operacin aritmtica que realiza, sera la exponenciacin, luego la operacin de negacin y las operaciones unarias del lenguaje C, luego la multiplicacin y/o la divisin, luego las sumas y las restas y por ltimo la asignacin quien tiene la jerarqua mas baja, es decir que seria la ultima operacin que realizara la computadora. Cuando en una expresin existen operadores de igual jerarqua la computadora los resuelve de izquierda a derecha. Si la expresin contiene agrupadores (o sea parntesis), se destruye primero los parntesis resolviendo lo que est dentro de ellos y luego seguir resolviendo las operaciones de acuerdo a lo descrito anteriormente. Ejemplo: X=3
La expresin anterior es sencilla. Consta tan solo de una variable X definida de un tipo entero y una expresin constante igual a tres. En el ejemplo anterior se tiene un solo operador, por tanto el microprocesador asigna el valor de 3 a la variable X. Visto simblicamente se puede representar en un rbol de la siguiente manera
= X I Ce 3 De
Para tener una mejor idea del orden en que efecta cada una de las operaciones en una estructura de asignacin es necesario identificar el tipo de notacin con la cual trabaja el microprocesador.
Notacin infija:
Es la notacin con la cual escribimos todas las expresiones. En esta notacin los operadores estn entre los operandos Si se realiza el recorrido en el rbol del ejemplo anterior se puede decir que la expresin estara escrita en notacin infija haciendo el siguiente recorrido: Iz - Ce - De o sea X = 3
UNIVERSIDAD SURCOLOMBIANA
57 de 190
Email [email protected]
Notacin postfija:
Es la notacin que utiliza el microprocesador para resolver todas las expresiones que se asignen a una variable en una estructura de asignacin o simplemente al solucionar una expresin. En esta notacin los operadores estas despus de los operandos. Si se realiza el recorrido en el rbol del ejemplo anterior se puede decir que la expresin estara escrita en notacin postfija haciendo el siguiente recorrido:
Ejemplo:
X=3+5
La expresin anterior consta de dos partes. Una variable X a la cual se le asignar (=) la expresin de la derecha. Antes de asignar un valor a la variable X el computador tendr que resolver dicha expresin (3 + 5).
En el ejemplo anterior el microprocesador ejecuta primero la suma y el resultado lo asigna por ultimo a la variable X.
+
3 5
=
3 5
UNIVERSIDAD SURCOLOMBIANA
58 de 190
Email [email protected]
Si se expresa el anterior rbol en notacin infija se tendr: X= W Si se representa en notacin postfija se tendr : XW=
Quiere decir lo anterior, que primero se resolver la expresin W y luego se asignar el valor encontrado en dicha evaluacin a la variable X. Ahora si se resuelve el rbol de la expresin se tendr: Notacin infija W=3+5 Notacin postfija W=35+
Tomando toda la expresin se tendr entonces: Notacin infija X=3+5 Notacin postfija X35+=
Observando la ltima expresin, se notar que el microprocesador evaluar en notacin postfija la estructura de asignacin y los operadores los ejecuta de izquierda a derecha operando los dos operandos inmediatamente anteriores, o sea que sumar 3 y 5 y dicho valor (8), lo asignar a X.
Ejemplo:
Si se tiene la expresin X = A + B / C * E + F / G * H y se asigna al identificador W la expresin A + B / C * E + F / G * H, la estructura de asignacin se puede representar de la siguiente manera:
=
X W
En la expresin W = A + B / C * E + F / G * H, se tienen varios operadores repetidos, caso particular la suma (+) que est presente dos veces. Si al identificador Y se le asigna la expresin B / C * E "(Y=B/C*E)" y al identificador Z se le asigna la expresin F / G * H "Z=F/G*H", la expresin inicial puede escribirse entonces de la siguiente manera. X=A+Y+Z
Tenga en cuenta que si hay operadores de igual jerarqua el microprocesador los resuelve de izquierda a derecha.
UNIVERSIDAD SURCOLOMBIANA
59 de 190
Email [email protected]
+ +
A Y Z
Si se hace el recorrido en notacin postfija al rbol que representa la expresin anterior quedar de la siguiente manera: X A Y+Z+= En el rbol anterior se puede observar que las operaciones se realizan de abajo hacia arriba o sea que primero se realiza la suma de A con Y. A este resultado se le suma el valor de Z y por ltimo se asigna dicho valor a la variable X. Donde Y y Z representan las expresiones: Y=B/C*E Z=F/G*H
+ A
* * /
E C F G H
/
B
UNIVERSIDAD SURCOLOMBIANA
60 de 190
Email [email protected]
Si se hace el recorrido al rbol en notacin postfija, la expresin quedar de la siguiente manera: X A B C / E * + F G / H * + = Para pasar de notacin infija a notacin postfija, la mquina utiliza la teora de colas para dicho trabajo. Se utiliza para tal efecto las listas de pila y cola. Las pilas es la teora de manejo de datos en donde el ltimo dato que ingresa a la lista, es el primer dato que sale de ella (Last In First Out - LIFO) y las colas es la teora de manejo de informacin en donde el primer dato en entrar, es el primer dato en salir. (First In First Out - FIFO). Teniendo en cuenta lo anterior se trabajar de la siguiente manera para realizar el traslado de una expresin en notacin infija a notacin postfija. Cada uno de los operandos y operadores se van almacenando en un a lista de cola de entrada (LIFO). Una vez los datos ah entonces se empiezan a pasar cada uno de los trminos as: Cada operando pasar directamente a la cola de salida y cada operador pasa a una pila de espera de operadores. Hay que tener en cuenta que cuando un operador llega a la pila de operadores, dicho operador desplaza a la cola de salida todos aquellos operadores que sean de igual o mayor jerarqua. "Ver jerarqua de operadores".
Todo operador debe esperar en la pila de operadores, es decir el operador que llega de la lista de cola de entrada, necesariamente debe esperar en la lista de pila de operadores.
Retomando el ejemplo anterior se tendr lo siguiente: Lista de cola de ENTRADA (FIFO) X = A + B / C * E + F / G * H Cab Cola
Los identificadores "Cab" y "Cola" indican los elementos que se encuentran en la Cabeza "primer elemento en entrar" y Cola "ltimo elemento en entrar" respectivamente de la Lista de cola en referencia. En el caso de la Lista de Pila el elemento que se encuentra listo a salir "ltimo en entrar" ser apuntado por el identificador Tope.
En teora de Colas el elemento que est en la cabeza, fue el primer elemento en entrar a la lista y el elemento que est en la cola, fue el ltimo elemento que entr en dicha lista.
UNIVERSIDAD SURCOLOMBIANA
61 de 190
Email [email protected]
Si se pasan los dos primeros elementos de la lista de entrada, es decir el operando "X" a la lista de cola de salida y el operador "=" a la lista de pila de espera de operadores, las listas quedarn as: Lista de cola de ENTRADA (FIFO) A + B / C * E + F / G * H Cab Pila de espera (LIFO) = TOPE Lista de cola de SALIDA (FIFO) X Cab Cola Para este primer paso, el operando "X" pas directamente a la cola de salida. En estos momentos por ser el nico elemento que existe en la lista de cola de salida, es considerado como cabeza y cola de la misma. Y el operador "=" paso a la pila de espera (es de anotar nuevamente que todo operador debe hacer espera en la pila de operadores). Un segundo par de elementos de la cola de entrada sern enviados a la cola y pila de salida as: " A +" Lista de cola de ENTRADA (FIFO) B / C * E + F / G * H Cab Pila de espera + = TOPE Cola : : : Cola : :
UNIVERSIDAD SURCOLOMBIANA
62 de 190
Email [email protected]
El operador (+) que lleg a la pila de espera de operadores, no desplaz el operador "=" que estaba en el tope de la pila, porque dicho operador "=" es de menor jerarqua que el operador "+". Lista de cola de SALIDA (LIFO) : X Cab A Cola
Observando lo anterior, en la cola de salida hay dos operandos "X A" y en la pila de espera dos operadores "+ =". Un tercer par de elementos de la cola de entrada sern enviados a la cola y pila de salida as: "B /" Lista de cola de ENTRADA (FIFO) : C * E + F / G * H Cab Pila de espera : / + = TOPE El operador que lleg a la pila de espera no desplaza ningn operador de ella ya que los que se encuentran a la espera son de menor jerarqua. Lista de cola de SALIDA (LIFO) : X A B Cab Cola Cola
Un cuarto par de elementos de la cola de entrada sern enviados a la cola y pila de salida as: Lista de cola de ENTRADA (FIFO) Pila de espera :E + F / G * H Cab :* + = TOPE Lista de cola de SALIDA (LIFO) :X A B C / Cab Cola Cola
UNIVERSIDAD SURCOLOMBIANA
63 de 190
Email [email protected]
Al llegar a la pila de espera el operador (*) desplaza a la cola de salida al operador (/) que se encontraba en el tope de la pila porque es de igual jerarqua. Un quinto par de elementos de la cola de entrada sern enviados a la cola y pila de salida as: Lista de cola de ENTRADA (FIFO) :F / G * H Cab Pila de espera :+ = TOPE Lista de cola de SALIDA (LIFO) : X A B C / E * + Cab Cola Cola
Al pasar de la cola de entrada el operador "+" a la pila de espera, este desplaza a la cola de salida los operadores "*" y "+" que se encuentran en el tope de la pila ya que son de mayor e igual jerarqua respectivamente. Primero desplazar el operador "*" y por ltimo desplaza al operador "+". Si se contina pasando par de elementos hacia las respectivas listas se tendr lo siguiente: Lista de cola de ENTRADA (FIFO) Pila de espera :G * H Cab Cola :/ + = TOPE Lista de cola de SALIDA (LIFO) :X A B C / E * + F Cab Cola
El operador (/) pas a la pila de espera. El no desplaza ningn operador porque el que est en el tope de la pila es de menor jerarqua.
UNIVERSIDAD SURCOLOMBIANA
64 de 190
Email [email protected]
:H Cab Cola
Pila de espera
:* + = TOPE
: X A B C / E * + F G / Cab Cola
Ahora nos queda tan solo un operando en la lista de cola de entrada. Al pasar a la cola de salida y quedar vaca la lista de cola de entrada, se procede a vaciar la lista de pila de operadores en su orden. primero saldrn los ltimos que entraron as: Lista de cola de SALIDA (LIFO) : X A B C / E * + F G / H * + = Cab Cola
UNIVERSIDAD SURCOLOMBIANA
65 de 190
Email [email protected]
UNIVERSIDAD SURCOLOMBIANA
66 de 190
Email [email protected]
El clculo de la suma se realizar y su valor ser almacenado en la variable identificada como C (esta operacin se representar en el smbolo de proceso) y por ltimo, el valor de respuesta almacenado en la variable C, ser escrito en la pantalla (esta operacin se representa en el smbolo de escritura). Vea el diagrama siguiente. Diagrama de Flujo
INICIO
Seudo lenguaje
Inicio Leer un valor y guardarlo en la variable A y leer un segundo valor y guardarlo en el identificador B Realizar la suma de A con B y guardar su valor en la variable C Escribir el valor de C Fin
A,B C=A+B C
FIN
UNIVERSIDAD SURCOLOMBIANA
67 de 190
Email [email protected]
En el ejercicio anterior se hubiera podido escribir directamente el valor de la suma sin necesidad de almacenarlo previamente en la variable C utilizando para ello la siguiente sentencia.
Write(La suma es: ,A+B); Repeat until keypressed; gotoxy(10,12); printf("La suma es: %d ",A+B);
Tenga en cuenta que si lo hace de esta manera, no estar utilizando estructura de asignacin alguna.
En el caso de que se desee realizar bajo cdigo MatLab, se digitan las instrucciones en la ventana del editor ventana derecha de la figura y se graba el archivo bajo un nombre en el directorio work de MatLab.
En el caso del ejemplo se grab bajo el nombre eje1_libre.m. Una vez se haya salvado, se digita en el prompt del matlab el nombre bajo el cual fu grabado (eje1_libre) y se ejecuta automticamente lnea por lnea. 2. Desarrolle un algoritmo que le permita leer un valor entero, calcular su cuadrado y escribir dicho resultado.
Anlisis: En el ejercicio planteado, se puede identificar como tareas a realizar tres, es decir cada una de las tres acciones solicitadas. Leer, Calcular y Escribir. Cada uno de los procesos mencionados se describen en smbolo respectivo quedando el diagrama de flujo de la siguiente manera.
Es necesario aclarar que cada proceso corresponde a una estructura de Asignacin. En el caso del ejercicio el calcular el cuadrado.
UNIVERSIDAD SURCOLOMBIANA
68 de 190
Email [email protected]
Seudo lenguaje
Inicio Leer un valor numrico entero y almacenarlo en la variable N. Calcular el cuadrado del nmero ledo, almacenado en la variable N, y su resultado almacenarlo en la variable R. Escriba el valor encontrado, (cuadrado de N), que se encuentra almacenado en la variable R. Fin
R = N
FIN
Seudo cdigo:
Inicio Leer( N); R = N; Escribir (R) Fin
Cdigo Turbo Pascal: Program cuadrado; uses crt; var N,R:real; begin crscr; gtoxy(10,10); wite( Digite un nmero entero N); radln(N); R=exp(2*ln(N)); gotoxy(10,12); write( El cuadrado del numero es: ,R); repeat until keypressed; end Cdigo Lenguaje C++: #include "math.h" #include "conio.h" #include "stdio.h" int N,R; main() { clrscr(); gotoxy(10,10); printf("Digite un nmero entero N"); scanf("%d",&N); R=pow(N,2); gotoxy(10,12); printf("El cuadrado es: %d ",R); getch() }
En el caso de que se desee realizar bajo cdigo MatLab, se digitan las instrucciones en la ventana del editor ventana derecha de la figura y se graba el archivo bajo un nombre en el directorio work de MatLab.
UNIVERSIDAD SURCOLOMBIANA
69 de 190
Email [email protected]
En el caso del ejemplo se grab bajo el nombre eje2_libre.m. Una vez se tenga grabado se digita en el prompt del matlab dicho nombre y se da enter. El cdigo se ejecuta automticamente lnea por lnea. El valor de 5 es digitado por el usuario tan pronto se lo indique la computadora. 3. Desarrolle un algoritmo que le permita leer un valor para radio (R), calcular el rea (A) de un crculo A = R y escribir su valor.
Anlisis: En el ejercicio se identifican como tareas las tres acciones solicitadas. Leer, Calcular y Escribir. Cada uno de los procesos mencionados se describen en el smbolo respectivo quedando el diagrama de flujo de la siguiente manera.
Algunos lenguajes de programacin traen incorporada una constante con el valor del nmero pi "3.1415...". Dicha constante es PI. Para utilizarla simplemente se hace referencia a ella, por ejemplo en el caso de MatLab.
Seudo lenguaje:
Inicio Leer el valor del radio y guardarlo en la variable R Calcular el valor del rea aplicando la formula *R y almacenar dicho valor en la variable A Escribir el valor encontrado para el rea guardado en la variable A. Fin
R A = *R A
FIN
UNIVERSIDAD SURCOLOMBIANA
70 de 190
Email [email protected]
En el caso de que se desee realizar bajo cdigo MatLab, se digitan las instrucciones en la ventana del editor ventana derecha de la figura y se graba el archivo bajo un nombre en el directorio work de MatLab.
En el caso del ejemplo anterior se grabaron las instrucciones bajo el nombre de archivo eje3_libre.m. Una vez grabado, se digita en el indicador del matlab dicho nombre y se pulsa la tecla enter. El cdigo se ejecuta automticamente lnea por lnea. El valor de 4 es digitado por el usuario tan pronto se lo indique la computadora. Al finalizar la ejecucin de las instrucciones aparece de nuevo el indicador indicando que puede continuar utilizando matlab.
UNIVERSIDAD SURCOLOMBIANA
71 de 190
Email [email protected]
4.
Determinar la hipotenusa de un tringulo rectngulo conocidas las longitudes de sus dos catetos. Desarrolle los correspondientes algoritmos.
Anlisis:
En el ejercicio se puede definir como tareas las tres acciones solicitadas. "Leer, Calcular y Escribir", Leer cada uno de los valores de los dos catetos y almacenarlos en cada uno de los identificadores definidos para el caso, calcular la hipotenusa aplicando la frmula correspondiente almacenando su valor en el identificador del caso y escribir el valor encontrado para la hipotenusa como respuesta. Cada una de las acciones se describen dentro del smbolo respectivo, quedando el diagrama de flujo de la siguiente manera.
Algoritmo: Cuando se requiere desarrollar operaciones matemticas tanto en el diagrama de flujo como en el Seudo lenguaje se dejan planteadas tal y cual como se escriben normalmente de manera simblica. En el momento de codificar dicho algoritmo se traduce el smbolo a la funcin correspondiente en el lenguaje.
Caso especfico del ejemplo anterior la raz cuadrada en cdigo es sqrt y el smbolo es el que conocemos " ".
Para el desarrollo del siguiente ejercicio se trabajar con las siguientes variables: CatA : Cateto del triangulo CatB : Cateto del triangulo Hip : Hipotenusa del triangulo Diagrama de flujo
INICIO
Seudo lenguaje
Inicio Leer el valor de cada cateto y almacenarlo en la variable CatA y CatB Calcular el valor de Hip con la formula indicada Escribir el valor de la Hip Fin
CatA, CatB
UNIVERSIDAD SURCOLOMBIANA
72 de 190
Email [email protected]
Seudo cdigo En el seudo cdigo se dejan planteadas las operaciones tal y cual se hizo en el diagrama de flujo o en el seudo lenguaje. Inicio Leer(CatA,CatB) HIP = CatA 2 + CatB 2 Escribir(Hip) Fin
Cdigo Turbo Pascal: "programa que calcula el rea de un tringulo rectngulo conociendo el valor de sus catetos." program rea; uses crt; var CatA,CatB,HIP:real; Begin clrscr; gotoxy(10,10); write(Digite el valor CatetoA); readln(CatA); gotoxy(10,12) write(Digite el valor CatetoB); Readln(CatB); Hip= sqrt (exp(2 * ln(CatA)) + exp(2 * ln(CatB ))) gotoxy(10,14); write( El valor HIPOTENUSA= ,HIP); repeat until keypressed; End. Cdigo Lenguaje C++: /* Programa que calcula el valor del rea de un tringulo rectngulo conociendo sus catetos */ #include "math.h" #include "conio.h" #include "stdio.h" float CatA,CatB,HIP; main() { clrscr(); gotoxy(10,10); printf("Digite el valor CatetoA"); scanf(&CatA); gotoxy(10,12); printf("Digite el valor CatetoB"); scanf(&CatB);
UNIVERSIDAD SURCOLOMBIANA
73 de 190
Email [email protected]
Para digitarlo en MatLab es necesario guardar el siguiente cdigo en el directorio Work de MatLab y ejecutarlo desde el prompt del MatLab digitando solo el nombre con el cual fue guardado. cata=input('Digite el valor Cateto A : '); catb=input('Digite el valor Cateto B : '); hip=sqrt(cata^2+catb^2); fprintf('El valor de HIPOTENUSA = %f \n',hip);
Para el caso de MatLab no es necesario declarar la librera matemtica porque se supone que el ya la tiene.
Si necesita ayuda en el prompt digite help sqrt o help sym/sqrt.m 5. Desarrolle un algoritmo que le permita leer un valor que represente una temperatura expresada en grados Celcius y convierta dicho valor en un valor expresado en grados Fahrenheit.
En el ejercicio planteado, las tareas a realizar son: Leer, convertir y Escribir.
Anlisis: Tareas:
Leer la temperatura en grados Celcius Calcular la conversin a grados Fahrenheit Escribir el valor encontrado Algoritmo: Diagrama de flujo
INICIO
Seudo lenguaje
Inicio Leer los grados centgrados y almacenarlos en la variable c Asignar a la variable f la conversin de grados centgrados a Fahrenheit dado por la frmula 9/5c+32 Escribir el valor de la variable f Fin
C
F = 9/5C + 32 F
FIN
UNIVERSIDAD SURCOLOMBIANA
74 de 190
Email [email protected]
/* Cdigo Lenguaje C: */ #include "conio.h" #include "stdio.h" float c, f; main() { clrscr(); gotoxy(10,10); printf(Digite el valor expresado en Grados C); scanf("%f",&c); f= c*9/5+32; gotoxy(10,12); printf(El valor en grados Farenheith es: %f , f); getch(); }
Bajo MatLab, guarda el siguiente cdigo en un archivo y lo llama desde el prompt del MatLab. C = input('Digite el valor expresado en Grados C : '); f = c*9/5+32; fprintf('El valor en grados Farenheith es : %8.3f\n', f);
UNIVERSIDAD SURCOLOMBIANA
75 de 190
Email [email protected]
Nota: En el ejercicio anterior en la instruccin fprintf, El formato 8.3f le indica a la computadora que se utilizarn 8 espacios para escribir el valor de la variable f, y de los ocho espacios se utilizan 3 campos para las cifras decimales. El \n indica que cuando termine salte el indicador a una nueva lnea (New Line). Si se omite la instruccin \n entonces el indicador quedar unido al ltimo digito escrito para la variable f. 6. Desarrolle un algoritmo que le permita calcular el rea de un tringulo en funcin de las longitudes de sus lados previamente ledos desde el teclado.
Anlisis: Para darle solucin al problema planteado primero se leen los valores de los tres lados del tringulo, luego se procede a calcular el valor de su rea en funcin de los valores ledos, aplicando la frmula correspondiente y por ltimo se da orden de escribir el valor calculado. Tareas: Leer los lados Calcular el rea Escribir el valor calculado Algoritmo: Diagrama de flujo
INICIO
Seudo Lenguaje
Inicio Leer(a,b,c) Hacer p=(A+B+C)/2 Calcular el valor del rea dada por la frmula Escribir (a) Fin
UNIVERSIDAD SURCOLOMBIANA
76 de 190
Email [email protected]
Cdigo Turbo Pascal: program Area; uses crt; var C,AREA,p : real; Begin clrscr; gotoxy(10,10); write(Digite el valor de A); readln(A); gotoxy(10,12) write(Digite el valor de B); readln(B); gotoxy(10,14) write(Digite el valor de C); readln(C); p=(A+B+C)/2 AREA:=
sqrt ( p * ( p A) * ( p B) * ( p C ))
Cdigo Lenguaje C++: #include "conio.h" #include "stdio.h" float A,B,C,AREA,p; main() { clrscr(); gotoxy(10,10); printf("Digite el valor de A"); Scanf(&A); gotoxy(10,12) printf("Digite el valor de B"); Scanf(&B); gotoxy(10,14) printf("Digite el valor de C"); Scanf(&C); p=(A+B+C)/2 AREA= sqrt ( p * ( p A) * ( p
B) * ( p C ))
gotoxy(10,16); write(El valor del rea es : ,AREA); repeat until keypressed; End.
En MatLab se guardar las siguientes lneas en un archivo y luego se llama para ser ejecutado. A = input('Digite el cateto a : '); b = input('Digite el cateto b : '); c = input('Digite el cateto c : '); p = (a+b+c)/2; area = sqrt(p*(p-a)*(p-b)*(p-c)); fprintf('El valor del rea es : %8.3f\n', area); 7. Desarrolle un algoritmo que le permita determinar el rea y volumen de un cilindro cuyo radio (R) y altura (H) se leen desde teclado.
Anlisis:
Para dar solucin al ejercicio planteado es necesario leer el valor del radio y el valor de la altura del cilindro desde algn medio de entrada de datos a la computadora, generalmente el teclado. Una vez se tengan almacenados los dos valores en memoria del computador se procede a calcular el rea y el volumen aplicando las frmulas respectivas.
Tareas:
Iniciar Leer valores de R y H Calcular el volumen y rea Escribir los valores respectivos Finalizar
UNIVERSIDAD SURCOLOMBIANA
77 de 190
Email [email protected]
Seudo lenguaje
Inicio Leer el valor de Radio (R) y Altura (H) Calcular el Volumen aplicando la frmula
R,H VOL= * R H
AREA= 2* R H
AREA,VOL
FIN
Calcular el valor del rea aplicando la frmula respectiva Escribir el valor del rea y del Volumen Finalizar
Seudo cdigo Inicio Leer(R, H) VOL= *RH AREA= 2* *RH Escribir(AREA, VOL) Fin
Cdigo Turbo Pascal: Program Area_Volumen; Uses crt; var AREA,VOL:real; Begin clrscr; gotoxy(10,10); write(Digite el valor de R); readln(R); gotoxy(10,12) write(Digite el valor de H); readln(H); VOL := * R*R *H AREA := 2 * * R* H gotoxy(10,16); write(El valor del area es : ,AREA); gotoxy(10,17); write(El valor del Volumen es : ,VOL); repeat until keypressed; End. Cdigo Lenguaje C++: /* Programa Area_Volumen */ #include "conio.h" #include "math.h" #include "stdio.h" float R,H,AREA,VOL; main() { clrscr(); gotoxy(10,10); printf("Digite el valor de R"); readln(R); gotoxy(10,12) printf("Digite el valor de H"); readln(H); VOL= *pow( R,2)* H AREA= 2 * * R* H gotoxy(10,16); printf("El valor del rea es : %f",AREA); gotoxy(10,17); printf("El valor del volumen es : %f",VOL); getch(); }
UNIVERSIDAD SURCOLOMBIANA
78 de 190
Email [email protected]
Para desarrollarlo en MatLab se graba el siguiente cdigo en un archivo que despus ser ejecutado desde el prompt del MatLab. R = input('Digite el valor de R :'); H = input('Digite el valor de H :'); VOL = pi*R^2*H; AREA = 2*pi*R*H; fprintf('El rea del cilindro es : %f \n',AREA); fprintf('El volumen del cilindro es : %f \n',VOL);
Tenga en cuenta de que si declara variables con maysculas se debe usar en el desarrollo con maysculas. La funcin pi se puede utilizar as, porque MatLab la trae definida.
8.
Anlisis: Para calcular el rea de un segmento de crculo lo primero que hay que hacer es leer el valor del radio del vinculo y leer el valor de X que es la distancia del centro al segmento. Una vez ledo dichos valores se calcula aplicando la frmula respectiva y por ltimo se escribe el valor del rea. Tareas: Leer (X y r) Calcular (Area) Escribir Algoritmo: Diagrama de flujo
INICIO
Seudo lenguaje Inicio Leer el valor de X y r Calcular el valor de rea Escribir el valor de Area (A) Fin
x,r
A= (* r)/2 [x r - x + r Sin-1 (x / r)]
A
FIN
UNIVERSIDAD SURCOLOMBIANA
79 de 190
Email [email protected]
Cdigo Turbo Pascal: Program Area_Segmento_Circular; Uses crt; Var x,r,A:real; Begin clrscr; gotoxy(10,10); write(Digite el valor de R); readln(r); gotoxy(10,12) write(Digite el valor de X); readln(x); A= (*r*r)/2 (sqrt(r*rx*x)+r*r*asin (x / r)) gotoxy(10,16); write(El valor del rea es : ,A); repeat until keypressed; End.
Cdigo Lenguaje C++: /*Prog Area_Segmento_Circular */ #include "conio.h" #include "stdio.h" float R,H,A,VOL; main() { clrscr(); gotoxy(10,10); printf("Digite el valor de R "); scanf("%f",&r); gotoxy(10,12) printf("Digite el valor de X "); scanf("%f",&x); A= (* r)/2 [sqrt(r*r x*x)+r*r*asin (x / r)] gotoxy(10,16); printf("El valor del rea es : %f",A); gecth(); }
Otras salidas literales como salidas con datos numricos reemplazando la funcin "printf" son: printf("El valor del rea es %f",A); cout<<"el valor del rea es"<<A; puts (A); Hay que tener en cuenta que hay que incluir las libreras de estas funciones. Otras formas de entrar datos reemplazando la funcin "scanf" son:
scanf("%d",&A); cin>>A; gets(A);
Es importante que se tenga en cuenta algunas de las funciones matemticas mas utilizadas en los lenguajes para el desarrollo de problemas.
Tenga en cuenta que los argumentos de las funciones trigonomtricas, deben ser usadas en radianes. Es decir 180 grados corresponde a pi radianes. Si se desea calcular el seno de 90 grados es necesario calcularlo as: sin(pi/2), definiendo previamente el valor de pi. En el caso de matlab no es necesario definir el valor para pi, porque lo trae incorporado como funcin.
UNIVERSIDAD SURCOLOMBIANA
80 de 190
Email [email protected]
atan2 exp(x) acos(x) asin(x) atan(x) cos(x) cosh(x) sin(x) sinh(x) tan(x) tanh(x) log(x) log10(x) pow(x,y) sqrt(x)
toma dos argumentos x e y y devuelve la arcotangente de y/x en radianes. devuelve el valor e elevado a x. retorna el arco coseno del parmetro x. retorna el arco seno del parmetro x. retorna el valor de la arco tangente del parmetro x. retorna el coseno del ngulo x. retorna el coseno hiperblico del parmetro x. retorna el seno del ngulo x. retorna el seno hiperblico del parmetro x. retorna la tangente del ngulo x. retorna la tangente hiperblica del parmetro x. retorna el logaritmo natural del parmetro x. retorna el logaritmo en base 10 del parmetro x. toma dos parmetros x e y y devuelve el valor xy retorna la raz cuadrada del parmetro x.
Para poder utilizar una de las funciones descritas anteriormente es necesario incluir en el encabezado del programa a travs de la directiva incluye el archivo math.h, claro est hablando del lenguaje de programacin C.. #include <math.h> #include math.h
UNIVERSIDAD SURCOLOMBIANA
81 de 190
Email [email protected]
ESTRUCTURA DE DECISIN
Cuando el programador desea especificar dos caminos alternativos en un algoritmo se deben utilizar estructuras de decisin. Una estructura de decisin dirige el flujo de un programa en una cierta direccin, de entre dos posibles, en funcin de un valor booleano. En lenguajes de programacin estructurados la estructura condicional es la IF / ELSE. La clusula ELSE en esta estructura es optativa. La forma en que trabaja esta sentencia resulta casi evidente a partir de la lgica de la lengua inglesa: Si (IF) la expresin booleana resulta cierta (TRUE), entonces la sentencia se ejecuta. Si la expresin booleana resulta falsa (FALSE), el control pasa a la siguiente (en orden descendente) instruccin del programa.
Estructura Sencilla:
Forma general de uso: Si (Condicin) entonces Ejecuta bloque de instrucciones uno Si_no Ejecuta blo que de instrucciones dos Fin si
Si_No
Tarea 2 Condicin
Entonces
Tarea 1
Una estructura de decisin por sencilla o compleja que sea debe tener solo una entrada y una salida. (Vea estructura de diagrama anterior). Un bloque de instrucciones (Denominado tarea 1 y 2 en el diagrama anterior) puede ser un conjunto de estructuras de cualquier clase (asignacin, Decisin, Cclicas o de seleccin mltiple) que se ejecutan unas tras de otras. El bloque de instrucciones tarea1 se ejecuta en caso de que la condicin que se coloque sea verdadera, En caso de ser falsa la evaluacin de la condicin se ejecuta el bloque de instrucciones tarea2.
Operadores de Relacin:
Una condicin tiene que ver directamente con una pregunta. La pregunta se forma mnimo con dos operandos y un operador de relacin.
UNIVERSIDAD SURCOLOMBIANA
82 de 190
Email [email protected]
Para tales efectos los operadores de relacin utilizados en los lenguajes son: Pascal Lenguaje C Mayor Menor Mayor o igual Menor o igual Igual Diferente > < >= <= = <> > < >= <= == !=
As, con base en los operadores de relacin descritos, algunos ejemplos de preguntas o condiciones son: Pascal a>b b>c a=4 b<>c Lenguaje C a>b b>c a==4 b!=c A B A B es mayor que B? es mayor que C? es igual a 4? es diferente de C?
Tambin se pueden desarrollar condiciones con varias preguntas. Para el efecto anterior es necesario plantear las dos preguntas tal como se indic y relacionarlas con operadores lgicos.
Operadores Lgicos:
Los operadores lgicos utilizados en los lenguajes estructurados son: Pascal y No and or not Lenguaje C && || !=
Con base en lo anteriormente expuesto, las preguntas o condiciones compuestas podran quedar de la siguiente manera. Pascal Lenguaje C
(a>b) and (b>c) ((a>b)&&(b>c)) "A es mayor que B y B es mayor que C" (a<b) or (b<c) ((a<b)||(b<c)) "A es menor que B y B es menor que C"
UNIVERSIDAD SURCOLOMBIANA
83 de 190
Email [email protected]
Condicin 1
Entonces
Condicin 2
Si_No Tarea 2
Entonces
Tarea 1
Una estructura de decisin puede estar anidada dentro de otra estructura de decisin. Hay que tener en cuenta que el anidamiento sea total. El inicio y el final de la estructura anidada debe quedar totalmente dentro del inicio y el final de la estructura que permite dicho anidamiento. Se debe mantener el concepto que una estructura de decisin debe tener una sola entrada y una sola salida tanto para la estructura que anida como para la estructura anidada. En el diagrama anterior se puede observar una estructura anidada del lado verdadero de la condicin de la primera decisin. Seudo lenguaje de la estructura de decisin anidada. Si (Condicin 1) entonces Si (Condicin 2) entonces Ejecuta bloque de instrucciones tarea 1 Si_no Ejecuta bloque de instrucciones tarea 2 Fin_si Si_no Ejecuta blo que de instrucciones tarea 3 Fin si.
UNIVERSIDAD SURCOLOMBIANA
84 de 190
Email [email protected]
En el anterior Seudo lenguaje se puede observar que el anidamiento es total o sea que el inicio de la condicin y el final estn totalmente encajados dentro del lado verdadero de la primera estructura.
Anlisis: Para resolver el ejercicio planteado hay que leer primero el valor numrico y almacenarlo en una variable de tipo entero (N), En el caso del ejemplo se ha definido de tipo int para C e integer para pascal. Para determinar si el nmero es par, la divisin de dicho nmero por dos (2) debe ser exacta. Por tanto, la decisin de saber si la divisin es exacta o no, la debe tomar el computador usando el smbolo respectivo en el diagrama. (En los diagramas se utilizar el smbolo % para representar el residuo de la divisin de dos operandos, en este caso de la divisin de N y 2). Una vez resuelva la asercin el computador, escribir si es par o impar el nmero ledo y que se encuentra almacenado en el el identificador (variable) N. Algoritmo: Diagrama de flujo
INICIO N No Es impar Si Es par
Seudo lenguaje Inicio Leer un valor numrico y almacenarlo en la variable N Si el residuo de dividir a N entre 2 igual a cero Escriba que es par Sino Escriba que es impar Fin
N%2=0
FIN
UNIVERSIDAD SURCOLOMBIANA
85 de 190
Email [email protected]
Recuerde que el signo (%) utilizado en el ejercicio anterior calcula el residuo que hay de dividir N entre 2.
Seudo cdigo Inicio Leer (N) Si (N residuo 2 = 0) entonces Escriba (N es par) Si_no Escriba (N es impar) Fin_si Fin
Cdigo Turbo Pascal: Program par_impar; Uses crt; Var N: integer; Begin clrscr; gotoxy(10,10); write(Digite un nmero ); readln(N); gotoxy(10,12) if N mod 2 = 0 then write(El nmero es par) esle write(El nmero es impar); repeat until keypressed; End. Cdigo Lenguaje C /* programa para decir si un nmero es par o impar */ #include "conio.h" #include "stdio.h" int N; main() { clrscr(); gotoxy(10,10); printf("Digite un nmero "); scanf("%d",&N); gotoxy(10,12); if (N%2==0) printf("el nmero es par"); else printf("el nmero es impar"); getch(); }
Si se desarrolla bajo programacin MatLab, el cdigo se guarda bajo un nombre de archivo tipo m en el directorio work del MatLab y se ejecuta desde el indicador del matlab, escribiendo el nombre del archivo y dando enter.
N = input('Digite un nmero '); if mod(N,2) == 0 fprintf('el nmero es par \n'); else fprintf('el nmero es impar \n'); end
Es importante resaltar la diferencia que existe entre = y ==, el primero para asignar y el segundo para comparar. En el caso del MatLab la sentencia if se cierra con un end, ya que no trabaja con marcas como lo hace C { y }o Pascal
UNIVERSIDAD SURCOLOMBIANA
86 de 190
Email [email protected]
Begin y end. En el caso de C o Pascal omiten las marcas cuando hay una sola instruccin por alguna de las dos opciones. 2. Desarrolle un algoritmo que le permita leer un valor numrico cualesquiera, almacenarlo en el identificador (variable) N de tipo entera y escribir en la pantalla si dicho nmero es Positivo o Negativo Anlisis: Para resolver el ejercicio planteado hay que leer primero el valor numrico y almacenarlo en un identificador (variable) N. Para establecer si dicho nmero es positivo o no, simplemente se compara el identificador con cero. En caso de que sea mayor o igual a cero entonces el valor numrico almacenado en N ser positivo, y para el caso contrario el valor numrico ser negativo. Algoritmo: Diagrama de flujo Seudo lenguaje
INICIO
No Es negativo
N>=0
Si el nmero es mayor o igual a cero Escriba que es positivo Si no Escriba que es negativo Fin
FIN
Seudo cdigo Inicio Leer(N) Si (N>=0) entonces Escriba("Es positivo") Sino Escriba("Es negativo") Fin si
UNIVERSIDAD SURCOLOMBIANA
87 de 190
Email [email protected]
Fin
Cdigo en Turbo Pascal Program positivo_Negativo; Uses crt; Var N: integer; Begin clrscr; gotoxy(10,10); write(Digite un nmero ); readln(N); gotoxy(10,12) if N >= 0 then write(El nmero es positivo) esle write(El nmero es negativo); repeat until keypressed; End.
Cdigo Lenguaje C /* programa positivo o negativo */ #include "conio.h" #include "stdio.h" int N; main() { clrscr(); gotoxy(10,10); printf("Digite un numero "); scanf("%d",&N); gotoxy(10,12); if (N>=0) printf("el nmero es positivo"); else printf("el nmero es negativo"); getch(); }
El siguiente cdigo lo guarda bajo un nombre de archivo tipo m en el directorio work de MatLab y ejectelo desde el prompt del MatLab, digitando el nombre del archivo.
N = input('Digite un nmero '); if N>=0 fprintf('el nmero es positivo \n'); else fprintf('el nmero es negativo \n'); end
Recuerde que el archivo tipo m debe quedar guardao en el directorio Work o en su defecto en un directorio que haya configurado en la opcin Set Path de la opcin File del men del MatLab
3.
Desarrolle un algoritmo que le permita leer un valor numrico cualquiera N y escribir si dicho nmero es mltiplo de Z.
Anlisis: Para resolver el ejercicio planteado anteriormente, hay que leer primero el valor del nmero y almacenarlo en una variable (N). Luego leer otro valor y almacenarlo en la variable Z. Para saber si el nmero almacenado en la variable N es mltiplo del nmero almacenado en Z, se hace la divisin entre Z y N, si la
UNIVERSIDAD SURCOLOMBIANA
88 de 190
Email [email protected]
divisin es exacta entonces N es mltiplo de Z, de lo contrario N no ser mltiplo de Z. Algoritmo: Diagrama de flujo
INICIO N,Z No No es mltiplo Si Es mltiplo
Seudo lenguaje Inicio Leer un valor y almacenarlo en la variable N y leer otro valor y almacenar en la variable Z Si la divisin entre N y Z es exacta escriba N es mltiplo de Z Sino Escriba N no es mltiplo de Z Fin_Si Fin
N%Z=0
FIN
Seudo cdigo Inicio Leer (N,Z) Si (N residuo Z=0) entonces Escriba (N es mltiplo de Z) Sino Escriba(N no es mltiplo de Z) Fin si Fin
Cdigo Turbo Pascal: Program multiplo_de_Z; Uses crt; Z,N: integer; Begin clrscr; gotoxy(10,10); write(Digite un nmero N); Readln(N); gotoxy(10,11); write(Digite un nmero Z); Readln(Z); gotoxy(10,12); if N mod Z = 0 then write(N es mltiplo de Z) Esle write(N no es mltiplo de Z); repeat until keypressed; UNIVERSIDAD SURCOLOMBIANA End. Cdigo Lenguaje C /* Programa mltiplo_de_Z */ #include "conio.h" #include "stdio.h" int N,Z; main() { clrscr(); gotoxy(10,10); printf("Digite un nmero N "); scanf("%d",&N); gotoxy(10,11); printf("Digite un nmero Z "); scanf("%d",&Z); gotoxy(10,12); if (N%Z==0) printf("N es mltiplo de Z"); else printf("N no es mltiplo de Z"); getch(); 89 }
de 190
Email [email protected]
4.
Desarrolle un algoritmo que le permita leer un valor numrico cualesquiera N y escribir si dicho nmero es comn divisor de otros dos valores numricos ledos y almacenados en los identificadores W y Z
Anlisis:
Para resolver el ejercicio planteado, hay que leer un primer valor numrico y almacenarlo en el identificador (variable) N. Luego se procede a leer otros dos valores numricos y almacenarlos en las variables W y Z respectivamente. Para conocer si el valor almacenado en la variable N es comn divisor de W y Z, se chequea si la divisin entre W/N y Z/N son exactas. En caso de ser exactas entonces el valor numrico almacenado en el identificador (variable) N es comn divisor de los dos valores almacenados en W y Z. En caso contrario no lo ser. Para el caso del ejercicio todos los identificadores sern declarados del tipo entero.
No
W%N=0 y Z%N=0