Conceptos de Programacion
Conceptos de Programacion
FUNDAMENTOS
DE
PROGRAMACIÓN
Conceptos de Teoría
2023
Fundamentos de Programación
CONCEPTO BÁSICOS
¿Qué es un sistema?
Un sistema es un conjunto de componentes interrelacionados que trabajan juntos para alcanzar un objetivo
predefinido. Por ejemplo, el sistema circulatorio humano (Figura 1).
Memoria Central
La memoria central o principal de una computadora se utiliza para almacenar información. En general, la
información almacenada en memoria puede ser de 2 tipos: instrucciones de programa o datos con los que operan las
instrucciones. Para que un programa se ejecute debe cargarse (load) en memoria principal, asimismo los datos utilizados
en el procesamiento también deben ser cargados.
La memoria se organiza en unidades de almacenamiento individual (celdas) denominadas registros o palabras. Un
registro o palabra es un conjunto, generalmente, de 8 bits al que se llama byte (octeto). Un bit es la unidad mínima de
información que puede almacenarse y representa un valor cero o uno. Cada registro o palabra de memoria tiene asociado
2 conceptos: dirección y contenido. La dirección de una palabra indica su posición en la memoria, y permite especificar que
byte será leído o escrito. El contenido de una palabra de memoria hace referencia al valor almacenado en esa posición.
Memoria Secundaria
Para ejecutar un programa es necesario que éste se cargue en la memoria principal. La memoria tiene capacidad
limitada (tamaño) y pierde su contenido cuando la computadora se apaga o sufre la interrupción del suministro de energía
eléctrica. Es por ello que los dispositivos de almacenamiento masivo se hacen necesarios para guardar tanto datos como
programas de modo permanente. Los discos rígidos, cintas magnéticas (tape backup), soportes ópticos y dispositivos
extraíbles en general, constituyen las memorias auxiliares, externas o secundarias. En comparación con éstas, la memoria
principal es más rápida (en la lectura y escritura de datos) y costosa, pero también volátil (se borra al no tener energía).
3
Fundamentos de Programación
Los dispositivos de entrada/salida cumplen tanto la función de ingreso de datos como la de presentación de
resultados. Por ejemplo, las impresoras multifunción permiten escanear imágenes (entrada) y obtener resultados impresos
(salida).
La figura 4 presenta la estructura física general de una computadora.
SÍMBOLO FUNCIÓN
Terminal, representa el “inicio” y el “fin” de un programa.
5
Fundamentos de Programación
SÍMBOLO FUNCIÓN
Conector, permite conectar 2 puntos del organigrama situado en
páginas diferentes.
Llamada a subrutina o un proceso predeterminado. Una
subrutina es un módulo independiente del programa principal,
que recibe una entrada procedente de dicho programa, realiza
una tarea determinada y regresa, al terminar, al programa
principal.
Pantalla, se utiliza en ocasiones en lugar del símbolo E/S.
Codificación
Codificación es la escritura en un lenguaje de programación de la representación del algoritmo desarrollada en las
etapas precedentes. Dado que el diseño de un algoritmo es independiente del lenguaje de programación utilizado para su
implementación, el código puede ser escrito con igual facilidad en un lenguaje o en otro.
Para realizar la conversión del algoritmo en un programa se deben sustituir las palabras reservadas en español por
sus homónimos en inglés, y las operaciones/instrucciones indicadas en lenguaje natural expresarlas en el lenguaje de
programación correspondiente.
Es conveniente aclarar que los lenguajes de programación se clasifican básicamente en:
• lenguajes máquina,
• lenguajes de bajo nivel (ensamblador) y
• lenguajes de alto nivel
Los lenguajes máquina son aquellos que están escritos en lenguajes directamente inteligibles por la computadora,
ya que sus instrucciones son cadenas binarias (secuencias de 0’s y 1’s) que especifican una operación y las posiciones de
6
Fundamentos de Programación
memoria implicadas en la operación. Las instrucciones en lenguaje máquina dependen del hardware de la computadora, y
por tanto, serán diferentes de una computadora a otra. Esto lleva a que el programador requiera de un profundo
conocimiento de la estructura interna de la computadora para la que escribe el programa.
Los lenguajes de bajo nivel son más fáciles de utilizar que los lenguajes máquina, pero, al igual que ellos, dependen
del hardware de la computadora. El lenguaje de bajo nivel por excelencia es el ensamblador. Las instrucciones en
ensamblador son conocidas como nemotécnicos (por ejemplo, ADD es una instrucción de suma). Estos nemotécnicos se
utilizan en lugar de los códigos máquina de las instrucciones correspondientes. Un programa en lenguaje ensamblador no
es directamente ejecutable por la computadora, sino que requiere una traducción a lenguaje máquina.
Los lenguajes de alto nivel son los más utilizados por los programadores y están diseñados para que las personas
escriban y entiendan los programas fácilmente. Además los programas escritos en lenguajes de alto nivel son
independientes del hardware de la computadora, por lo que se dice que son portables o transportables (pueden ser
ejecutados en diferentes computadoras con poco o ninguna modificación). Los programas en lenguajes de alto nivel deben
ser traducidos por programas traductores (compiladores/intérpretes) para poder ser ejecutados.
Compilación y Ejecución
Una vez que el algoritmo se ha traducido en un programa fuente (generalmente en un lenguaje de alto nivel), es
preciso introducirlo en memoria mediante el teclado y almacenarlo en disco. Esta operación se realiza con un programa
editor, posteriormente el programa fuente se convierte en un archivo de programa que se graba en disco.
El programa fuente debe ser traducido a lenguaje máquina. Este proceso se realiza con el compilador y el sistema
operativo que se encarga de la compilación. Si tras la compilación se presentan errores (errores de compilación) en el
programa fuente, es preciso volver a editar el programa, corregir los errores y compilar de nuevo. Esto se repite hasta que
no se producen errores, obteniéndose el programa objeto que todavía no es ejecutable directamente. Suponiendo que no
existen errores en el programa fuente, se debe instruir al sistema operativo para que realice la fase de montaje o enlace
(link), que carga el programa objeto con las librerías del programa compilador. El montaje genera un programa ejecutable.
La Figura 5 ilustra el proceso de compilación y ejecución de un programa.
Cuando el programa ejecutable se ha creado, se puede ejecutar. Suponiendo que no se producen errores durante
la ejecución se obtendrán los resultados del programa.
Verificación y Depuración
La verificación de un programa es el proceso de ejecución del programa con una amplia variedad de datos, llamados
datos de test o prueba, que determinarán si el programa tiene errores (“bugs”). Para realizar la verificación se debe
desarrollar una amplia gama de datos de test: valores normales de entrada, valores extremos de entrada que comprueben
los límites del programa y valores de entrada que comprueben aspectos especiales del programa.
La depuración es el proceso de encontrar los errores del programa y corregir o eliminar dichos errores.
Cuando se ejecuta un programa, se pueden producir tres tipos de errores:
1.- Errores de compilación. Se producen normalmente por el uso incorrecto de las reglas del lenguaje de
programación y suelen ser errores de sintaxis. Si existe un error de sintaxis, la computadora no puede comprender
la instrucción, no se obtendrá el programa objeto y el compilador imprimirá una lista de todos los errores
encontrados durante la compilación.
2.- Errores de ejecución. Estos errores se producen por instrucciones que la computadora puede comprender pero
7
Fundamentos de Programación
no ejecutar. Ejemplos típicos son: división por cero y raíces cuadradas de números negativos. En estos casos se
detiene la ejecución del programa y se imprime un mensaje de error.
3.- Errores lógicos. Se producen en la lógica del programa y la fuente del error suele ser el diseño del algoritmo.
Estos errores son los más difíciles de detectar, ya que el programa puede funcionar y no producir errores de
compilación ni de ejecución, y sólo puede advertirse el error por la obtención de resultados incorrectos. En este
caso se debe volver a la fase de diseño del algoritmo, modificar el algoritmo, cambiar el programa fuente, compilar
y ejecutar una vez más.
Documentación y Mantenimiento
La documentación de un problema consta de las descripciones de los pasos a dar en el proceso de resolución de un
problema. La importancia de la documentación debe ser destacada por su decisiva influencia en el producto final.
Programas pobremente documentados son difíciles de leer, más difíciles de depurar y casi imposibles de mantener y
modificar.
La documentación de un programa puede ser interna y externa. La documentación interna es la contenida en las
líneas de comentarios que aparecen en el programa fuente. La documentación externa incluye análisis, diagramas de flujo
y/o pseudocódigos, manuales de usuario con instrucciones para ejecutar el programa y para interpretar los resultados.
La documentación es vital cuando se desea corregir posibles errores futuros o bien cambiar un programa. Tales
cambios se denominan mantenimiento del programa. Después de cada cambio la documentación debe ser actualizada para
8
Fundamentos de Programación
facilitar cambios posteriores. En la práctica, se suele numerar las sucesivas versiones de los programas 1.0, 1.1, 2.0, 2.1,
etc. (si los cambios introducidos son importantes, se varía el primer dígito [1.0, 2.0, …], en caso de pequeños cambios sólo
se varía el segundo dígito [2.0, 2.1, …]).
Partes de un Programa
Los componentes básicos de un programa son instrucciones y datos. Las instrucciones o acciones representan
operaciones que ejecutará una computadora al interpretar un programa. Los lenguajes de programación brindan un
conjunto de instrucciones que permiten escribir programas (soluciones algorítmicas) para resolver problemas específicos.
Los datos son los valores que deben ser procesados por la computadora (que ejecuta el programa) para obtener resultados
o información. Los datos pueden ser constantes (si no cambian) o variables (si sufren modificaciones durante la ejecución
del programa).
Documentación de Algoritmos
Un programa bien documentado es más fácil de leer y mantener. Para ello la documentación es fundamental. La
mayoría de los lenguajes de programación proporcionan algún mecanismo de documentación, por ejemplo, a través de
comentarios en el programa (documentación interna). Es recomendable utilizar un comentario general para el objetivo del
programa en cuestión, que refleje la especificación del problema a resolver de la forma más completa posible. Además
deben describirse todos los objetos de datos que se utilicen en el programa así como fecha de creación, autor, etc. Cuando
se realizan modificaciones a un programa es necesario que se actualicen los comentarios para reflejar los cambios llevados
a cabo sobre el código.
Corrección de Algoritmos
Un algoritmo es correcto cuando cumple con su especificación, esto significa que cumple con los requerimientos
propuestos. Para determinar cuáles son esos requerimientos se debe tener una especificación completa, precisa y libre de
ambigüedades (imprecisiones) del problema a resolver antes de escribir el mismo.
Una de las formas de determinar si un programa es correcto consiste en realizar pruebas con un juego de datos
reales que permitan establecer si cumple con su especificación.
Eficiencia de Algoritmos
Un problema puede tener varias soluciones algorítmicas. Sin embargo, el uso de los recursos de la computadora
(tiempo, memoria) que ejecuta cada una de las soluciones puede ser muy diferente.
La eficiencia se define como una medida de la calidad de los algoritmos que está asociada a la utilización óptima de
los recursos de la computadora que ejecuta el algoritmo.
Mantenimiento de Programas
El mantenimiento de un programa involucra básicamente dos tareas: corregir errores y modificar código. Los
errores pueden ocurrir antes que el programa esté terminado o bien pueden ser descubiertos más tarde (cuando ya está
en uso). En estas situaciones se debe identificar los errores, determinar las posibles causas y corregir el código
correspondiente. Las modificaciones del código, en general, están asociadas a la necesidad de agregar funcionalidades a
los programas o mejorar el rendimiento actual de éstos.
Según la naturaleza de los cambios que deban realizarse en un programa, el mantenimiento puede ser:
9
Fundamentos de Programación
• Correctivo: una vez entregado, un programa aún puede contener errores que el usuario descubre al utilizarlo. El
mantenimiento correctivo tiene por objetivo localizar y eliminar estos errores.
• Preventivo: este tipo de mantenimiento consiste en la modificación del software para mejorar sus propiedades sin
alterar su funcionalidad (las tareas que realiza). Por ejemplo, se pueden incluir sentencias que comprueben la
validez de los datos de entrada, reestructurar los programas para mejorar su legibilidad, o incluir nuevos
comentarios que faciliten su comprensión.
• Adaptativo: este tipo de mantenimiento consiste en la modificación de un programa debido a cambios en el
entorno (hardware o software) en el cual se ejecuta. Este mantenimiento permite al software adaptarse a las
nuevas condiciones en las que debe trabajar.
• Perfectivo: el mantenimiento perfectivo se define como el conjunto de actividades para mejorar o añadir nuevas
funcionalidades requeridas por el usuario.
La experiencia demuestra que un programa bien diseñado reduce el costo de mantenimiento del software.
Reusabilidad de Código
En el desarrollo de soluciones basadas en computadora es común que se escriban componentes de programa de
propósito general. Esto hace posible que cada vez que se crea un nuevo programa se usen los componentes diseñados
anteriormente, reduciéndose así los costos, tiempo y esfuerzo invertidos en la creación de software.
10
Fundamentos de Programación
Un programa es un conjunto de instrucciones y datos que permiten solucionar problemas de forma eficiente y
rápida, agilizando el trabajo de las personas. Los datos e información que procesa un programa, así como las operaciones
que realiza tienen asociados una serie de conceptos que aquí se presentan.
Entero
Estándar Real
Carácter
Datos Simples Lógico
Cadena
Estáticos Conjunto
Arreglo
Registro
Datos Compuestos Archivos
listas simples
Dinámicos listas dobles
Árboles
Grafos
• Datos Simples: Los tipos de datos simples caracterizan a las formas de presentación más sencillas de objetos de
datos e información de un programa. Los lenguajes de programación permiten representar y manipular datos
enteros, reales, caracteres y lógicos. Además es posible que el usuario defina tipos especiales, como subrango o
enumerado, de acuerdo a los requerimientos que presente un problema en particular.
• Datos Compuestos: Los tipos de datos estructurados están construidos a partir de los tipos de datos simples y
pueden ser estáticos o dinámicos. Las estructuras de datos estáticas son aquellas cuyo tamaño en memoria debe
ser definido antes que el programa se ejecute y que no pueden modificar dicho tamaño durante su ejecución.
Las estructuras de datos dinámicas pueden modificar el tamaño de memoria que ocupan mientras se ejecuta el
programa, solicitando o liberando memoria según se requiera. Mediante el uso de un tipo de datos especial,
denominado puntero, se pueden construir estructuras dinámicas soportadas por la mayoría de los lenguajes.
Es importante destacar que los tipos de datos simples tienen como característica común que cada objeto de datos
representa a un elemento; mientras que los tipos compuestos tienen como característica común que un identificador
(nombre de un objeto de datos) puede representar múltiples datos individuales, pudiendo referenciarse cada uno en forma
11
Fundamentos de Programación
independiente.
A continuación, se describen los tipos de datos simples, definidos por el usuario y algunos tipos estructurados.
Datos Simples
Los diferentes objetos de información con los que trabaja un programa de computadora se conocen como datos.
Todos los datos tienen un tipo asociado a ellos. El tipo de un dato determina el conjunto de valores que éste puede asumir.
Los tipos de datos simples utilizados en casi todos los lenguajes de programación son:
Datos Numéricos
El tipo numérico es el conjunto de valores numéricos. Éstos pueden representarse en dos formas:
• Enteros: este tipo es un subconjunto de los números enteros, es decir, se trata de números sin parte decimal y que
pueden ser positivos o negativos. Por ejemplo: -123, 0, 48, etc.
• Reales: este tipo es un subconjunto de los números reales, es decir, se trata de números con parte entera y parte
decimal, que pueden ser positivos o negativos. Por ejemplo: -234.33, 0.0, 78.21, etc.
Datos Lógicos
El tipo lógico es un tipo ordinal, es decir, que tiene un número fijo de posibles valores y orden definido para éstos.
• Lógico: el tipo lógico o booleano puede tomar sólo 2 valores: Verdadero (V) o Falso (F). En general, este tipo se
utiliza para representar la ocurrencia o no de un suceso o condición. Se considera que el valor Falso es menor que
el valor Verdadero.
Datos Carácter
El tipo carácter representa una letra (‘a’, ‘A’), un dígito (‘0’,’9’) o símbolo especial (‘@’, ‘&’, ‘#’). Los datos de tipo
carácter son ordinales.
• Caracteres: este tipo es el conjunto finito y ordenado de caracteres que la computadora reconoce. Un dato tipo
carácter contiene un solo símbolo, dígito o letra.
Constantes y Variables
Una constante es un objeto de datos cuyo valor no cambia durante la ejecución de un programa. Una constante
recibe su valor al momento de la compilación del programa y este valor no será modificado durante la ejecución.
Una variable es un objeto de datos de programa cuyo valor puede cambiar durante la ejecución de un programa.
Este cambio se producirá mediante sentencias ejecutables. Una variable es una posición de memoria con nombre. El
nombre de la posición se llama nombre de variable, y el valor almacenado en la posición se llama valor de la variable.
Tanto constantes como variables se definen con un tipo específico (numérico, lógico, carácter).
Operadores
12
Fundamentos de Programación
Los operadores permiten realizar acciones sobre los datos de acuerdo al tipo de éstos. A continuación se presentan
los operadores más utilizados en los lenguajes de programación.
Tipo Símbolo Nombre Función
Paréntesis () Anida expresiones
Aritméticos ** ó ^ Potencia Conectan objetos o campos
*, / Producto, división numéricos
+, - Suma, diferencia
div, mod División entera, resto
Alfanuméricos + Concatenación Conectan campos alfanuméricos
Relacionales = Igual a Conectan objetos, campos o
< Menor que expresiones de cualquier tipo. Su
<= Menor o igual que evaluación da como resultado
> Mayor que “Verdadero” o “Falso”.
>= Mayor o igual que
<> Distinto a
Lógicos NOT Negación Conectan expresiones de tipo lógico.
AND Conjunción Su evaluación da como resultado
OR Disyunción “Verdadero” o “Falso”.
Los operadores lógicos NOT, AND y OR se evalúan según tablas de verdad. Considerando las variables booleanas a
y b, las siguientes tablas indican los valores que se obtienen al aplicarles los operadores indicados.
Cuando se combinan operadores, es necesario considerar el orden en que se resuelven para obtener un resultado
correcto. La siguiente tabla indica la precedencia de operadores.
Operador Prioridad
NO, ^ Más alta (se evalúa primero)
*, /, Y,div, mod
+, -, O
<, <=, =, <>, >=, > Más baja (se evalúa al final)
Si se utilizan paréntesis, las expresiones encerradas
se evalúan primero.
Expresiones
Las expresiones son combinaciones de constantes, variables, símbolos de operación y nombres de funciones
especiales. Una expresión consta de operandos y operadores. De acuerdo al tipo de datos que manipulan las expresiones,
éstas se clasifican en aritméticas, alfanuméricas y lógicas.
Las expresiones aritméticas son análogas a fórmulas matemáticas, en donde se utilizan operadores aritméticos y
variables y constantes numéricas (reales o enteras).
Las expresiones alfanuméricas son aquellas en las que se utilizan operadores alfanuméricos y se producen
resultados de tipo alfanumérico.
Las expresiones lógicas utilizan tanto operadores lógicos como relacionales para representar alguna condición. Al
evaluar esta condición se obtiene un valor VERDADERO o FALSO.
Expresión Tipo Observación
3+9 Expresión numérica (entera)
2.5 * 6.8 + 2 Expresión numérica (real)
A+B*2 Expresión numérica A y B deben ser variables o de tipo
numérico.
13
Fundamentos de Programación
Falso Y Verdadero Expresión lógica
23 >= 30 Expresión lógica
(A < B) Y (C = Falso) Expresión lógica A y B deben ser variables del mismo
tipo y C debe ser variable de tipo
lógico.
Asignación
La operación de asignación es el modo de darle valores a una variable. La operación de asignación se representa
con el símbolo u operador . La operación de asignación se conoce como instrucción o sentencia de asignación cuando se
refiere a un lenguaje de programación.
El formato general de la operación asignación es:
Nombre_Variable Expresión
La asignación es destructiva, esto significa que cuando se le asigna un valor a una variable se pierde el valor anterior.
Por ejemplo, si la variable suma tiene valor 5, y luego se le asigna 12, éste será el valor final de la variable.
Las acciones de asignación se clasifican según el tipo de expresiones en: aritméticas, lógicas y de caracteres.
Asignación Descripción Ejemplos
Aritméticas Las expresiones en las operaciones de asignación son cantidad 100
aritméticas. total suma * 2 + 30
Lógicas La expresión que se evalúa en la operación de mayor 23 > 4
asignación es lógica. estado verdadero y (16 = 2 * valor)
Caracteres La expresión que se evalúa es de tipo carácter o letra ‘a’
cadena de caracteres. palabra ‘programación’
Funciones Internas
Las operaciones que realizan los programas exigen en numerosas ocasiones, además de las operaciones básicas,
un número determinado de operaciones especiales que se denominan funciones internas, incorporadas o estándar. Los
lenguajes de programación incorporan estas funciones para facilitar el trabajo del programador. La siguiente tabla presenta
algunas de las funciones internas incluidas en los lenguajes de programación.
Función Descripción Tipo de argumento Resultado
abs(x) valor absoluto de x entero o real igual que el argumento
arctan(x) arco tangente de x entero o real Real
cos(x) coseno de x entero o real Real
exp(x) exponencial de x entero o real Real
ln(x) logaritmo neperiano de x entero o real Real
log10(x) logaritmo decimal de x entero o real Real
redondeo(x) redondeo de x Real Entero
sen(x) seno de x entero o real Real
cuadrado(x) cuadrado de x entero o real igual que el argumento
raíz2(x) raíz cuadrada de x entero o real Real
Comparación de Cadenas
La comparación de cadenas (igualdad y desigualdad) se basa en el orden numérico del código o juego de caracteres
(por ejemplo, código ASCII) que admite una computadora.
Dos cadenas a y b de longitudes m y n son iguales si:
• El número de caracteres de a es igual al número de caracteres de b (m=n)
• Cada carácter de a es igual a su correspondiente de b; si a=a1a2a3…am y b=b1b2b3…bn, se debe verificar que ai=bi.
15
Fundamentos de Programación
Por ejemplo, las siguientes expresiones comprueban la igualdad de cadenas:
‘hola mundo’ = ‘hola mundo’
‘informática’=’computadora’
‘Escuela de Minas’ = ’escuela de minas’
La primera expresión es VERDADERA, la segunda es evidentemente FALSA, y la tercera expresión a primera vista
puede parecer VERDADERA, sin embargo, los caracteres ‘E’ y ‘e’ son diferentes (el código binario que identifica a cada uno
es distinto) por cuanto la expresión es FALSA.
Para comprobar la desigualdad de cadenas, en general, se utilizan los operadores relacionales (>, <, >=, <=, <>) y se
ajustan a una comparación sucesiva de caracteres correspondientes en ambas cadenas hasta conseguir dos caracteres
diferentes.
Por ejemplo, las siguientes expresiones comprueban la desigualdad de cadenas:
‘zapato’<’avestruz’
‘CARAMELO’<’golosina’
‘amarillo’>=’Amarillo’
La primera expresión es FALSA, al comparar el primer carácter de ambas cadenas (en realidad, sus correspondientes
códigos binarios) se comprueba que ‘z’ no es menor que ‘a’ (considerando los caracteres ASCII). La segunda expresión es
FALSA, porque las mayúsculas tienen códigos binarios menores a los de las minúsculas (código ASCII). Finalmente la tercera
expresión es VERDADERA.
Concatenación
La concatenación es la operación de reunir varias cadenas de caracteres en una sola, pero conservando el orden de
los caracteres de cada una de ellas.
El símbolo que representa la concatenación varía de un lenguaje a otro. Los más utilizados son: +, // y &.
Por ejemplo, la siguiente operación de concatenación combina las cadenas almacenadas en las variables A y B en
la variable C.
A ‘facultad’
B ‘de minas’
CA + B
El contenido de la variable C tras realizar la concatenación es ‘facultadde minas’.
Subcadenas
La operación de extraer una parte específica de una cadena se representa por la función subcadena. Esta función
presenta el siguiente formato:
subcadena(cadena, p_inicial, p_final)
Como puede observarse la función utiliza 3 parámetros, siendo opcional el último. El primer parámetro especifica
la cadena original, el segundo indica la posición del primer carácter de la subcadena y el tercero, si se especifica, indica la
posición del carácter final de la subcadena.
Por ejemplo:
palabrasubcadena(‘domingo’,3,5)
La variable palabra (tipo cadena de caracteres) almacena cadena ‘min’.
frase ‘hola mundo’
subfrasesubcadena(frase,6)
16
Fundamentos de Programación
La variable subfrase (tipo cadena de caracteres) almacena la cadena ‘mundo’. Obsérvese que si el último parámetro
de la función subcadena no se especifica, los caracteres se extraen desde la posición inicial hasta el último carácter de la
cadena original.
17
Fundamentos de Programación
El diseño de algoritmos constituye una de las fases más importantes en la resolución de problemas basados en
computadora. En esta fase se indican las acciones que se llevarán a cabo para dar solución a un problema específico. El
paradigma de la programación estructurada utiliza 3 estructuras de control (secuenciales, condicionales y repetitivas) para
representar los pasos de resolución de un algoritmo. A continuación se aborda este paradigma.
Programación Estructurada
La Programación Estructurada se refiere al conjunto de técnicas empleadas para aumentar la productividad de los
programas, reduciendo el tiempo necesario para escribir, verificar, depurar y mantener los programas. El paradigma de la
Programación Estructurada utiliza un número limitado de estructuras de control que minimizan la complejidad de los
problemas, y por consiguiente, reducen los errores.
Este paradigma hace que los programas sean más fáciles de escribir, verificar, leer y mantener. Los programas
deben estar dotados de estructura.
La Programación Estructurada es el conjunto de técnicas que incorporan:
• Diseño descendente
• Recursos Abstractos
• Estructuras Básicas
Diseño Descendente
El diseño descendente (TOP-DOWN) es el proceso mediante el cual un problema se descompone en una serie de
niveles o pasos sucesivos de refinamiento (stepwise). La metodología descendente consiste en efectuar una relación entre
las sucesivas etapas de estructuración, de modo que se relacionen unas con otras mediante entradas y salidas de
información. Es decir, se descompone el problema en etapas o estructuras jerárquicas, de modo que se puede considerar
cada estructura desde dos puntos de vista: ¿lo que hace? (Figura 2) y ¿cómo lo hace? (Figura 3)
Recursos Abstractos
La Programación Estructurada se auxilia de recursos abstractos en lugar de los recursos concretos de que se dispone
(un determinado lenguaje de programación).
Descomponer un programa en términos de recursos abstractos, consiste en descomponer una determinada acción
compleja en términos de un número de acciones más simples capaces de ser ejecutadas por una computadora y que
constituirán sus instrucciones.
• Secuenciales
• Selectivas
• Repetitivas
Un programa se define como propio si cumple con las siguientes características:
• tiene exactamente una entrada y una salida para control del programa,
• existen caminos que se pueden seguir desde la entrada hasta la salida que conducen por cada parte del programa,
es decir, no existen lazos infinitos ni instrucciones que no se ejecutan.
Secuenciales
La estructura de control más simple está representada por una sucesión de operaciones, en la que el orden de
ejecución coincide con el orden físico de aparición de las instrucciones. La representación en pseudocódigo y diagrama de
flujo de una estructura secuencial se presenta a continuación:
Pseudocódigo Diagrama de Flujo
INICIO
acción_1
acción_2
...
acción_n
FIN
Observe que INICIO y FIN indican el punto de entrada y punto de salida, respectivamente, del algoritmo.
El siguiente ejemplo muestra un algoritmo (pseudocódigo y diagrama de flujo) que resuelve la suma de dos valores
(valor_a y valor_b) ingresados por el usuario a través de instrucciones secuenciales (lectura, asignación, escritura).
En el ejemplo puede observarse el uso de las instrucciones LEER, ESCRIBIR y ASIGNAR (); así como los símbolos
de diagrama de flujo correspondientes a cada instrucción.
19
Fundamentos de Programación
Pseudocódigo Diagrama de Flujo
INICIO
LEER valor_a
LEER valor_b
suma valor_a + valor_b
ESCRIBIR ‘La suma es:’, suma
FIN
Las estructuras selectivas dobles (SI-ENTONCES-SINO-FIN_SI) presentan 2 caminos alternativos de acción, los que
se eligen de acuerdo al valor de una determinada condición (VERDADERA o FALSA). La representación en pseudocódigo y
diagrama de flujo de una estructura selectiva doble se presenta a continuación:
Pseudocódigo Diagrama de Flujo
SI condición ENTONCES
acciones_1
SINO
acciones_2
FIN_SI
A continuación, se presentan algoritmos que ejemplifican el uso de las instrucciones selectivas en la resolución de
problemas simples.
Ejemplo 1: Diseñe un algoritmo que determine si la suma de 2 valores ingresados por el usuario es mayor a 300.
20
Fundamentos de Programación
Pseudocódigo Diagrama de Flujo
INICIO
LEER primero
LEER segundo
sumaprimero + segundo
SI suma > 300 ENTONCES
ESCRIBIR ‘La suma es mayor a 300’
FIN_SI
FIN
Ejemplo 2: Diseñe un algoritmo que determine cuál es el mayor de dos valores ingresados por el usuario.
Repetitivas e Iterativas
Las computadoras están especialmente diseñadas para todas aquellas aplicaciones en las que una operación o
conjunto de ellas deben repetirse muchas veces.
Las estructuras que permiten repetir una secuencia de instrucciones se denominan bucles, y se llama iteración al
hecho de repetir la ejecución de una secuencia de acciones.
Las sentencias que permiten especificar la repetición de un conjunto de instrucciones son:
• Para (PARA-FIN_PARA)
• Mientras (MIENTRAS-FIN_MIENTRAS)
• Repetir (REPETIR-HASTA_QUE)
La estructura iterativa PARA permite repetir un conjunto de acciones un número conocido de veces. Esta estructura
comienza con un valor inicial (vi) de la variable de control o índice y las acciones especificadas en el cuerpo del bucle se
ejecutan hasta que el índice alcanza el valor final (vf). Por defecto, el incremento o decremento del índice se realiza en una
unidad, aunque puede especificarse otro valor (PASO n). La variable de control debe ser tipo ordinal, y por lo general se la
designa i, j, k.
La representación en pseudocódigo y diagrama de flujo de una estructura iterativa PARA se presenta a
continuación:
Pseudocódigo Diagrama de Flujo
21
Fundamentos de Programación
La estructura iterativa MIENTRAS permite repetir un conjunto de acciones en tanto la condición evaluada sea
VERDADERA, no conociéndose de antemano el número de repeticiones. Esta estructura se clasifica en pre-condicional, ya
que evalúa la condición y, si es VERDADERA, entonces ejecuta el bloque de acciones; por cuanto el bloque se puede ejecutar
0, 1 o más veces. En general, esta estructura se utiliza para cálculos aritméticos.
La representación en pseudocódigo y diagrama de flujo de una estructura iterativa MIENTRAS se presenta a
continuación:
Pseudocódigo Diagrama de Flujo
MIENTRAS condición HACER
acciones
FIN_MIENTRAS
La estructura iterativa REPETIR permite repetir un conjunto de acciones en tanto la condición evaluada sea FALSA,
no se conoce de antemano el número de repeticiones. Esta estructura se clasifica en pos-condicional, ya que primero
ejecuta el bloque de acciones y luego se evalúa la condición; si ésta es FALSA, el bloque de acciones se ejecuta nuevamente.
A diferencia de las estructuras pre-condicionales, el bloque de acciones se puede ejecutar 1 o más veces. En general, esta
estructura se utiliza para el ingreso de datos.
La representación en pseudocódigo y diagrama de flujo de una estructura iterativa REPETIR se presenta a
continuación:
Pseudocódigo Diagrama de Flujo
REPETIR
acciones
HASTA_QUE condición
22
Fundamentos de Programación
Bucles Infinitos
• Algunos bucles no exigen fin, sin embargo otros no encuentran fin por errores en su diseño. Un bucle que nunca
termina se denomina bucle infinito o sin fin. Los bucles sin fin no intencionados son perjudiciales para la
programación y siempre deben evitarse.
Finalización de Bucles
• Si un algoritmo o programa ejecuta un bucle cuyas iteraciones dependen de una condición, este bucle puede estar
controlado por un valor centinela, una bandera o un contador.
• Un bucle controlado por centinela es aquel en el que un valor que se ingresa en el bucle permite finalizar las
iteraciones. Este valor especial se denomina valor centinela.
• Un bucle controlado por bandera es aquel en el que una variable lógica permite determinar la ocurrencia de un
evento y de este modo finalizar o no las iteraciones del bucle. Esta variable lógica se denomina bandera.
• Un bucle controlado por contador es aquel en el que una variable se utiliza para contabilizar la cantidad de veces
que ocurre algún evento y de este modo finalizar o no las iteraciones del bucle. Esta variable se denomina
contador.
Ejemplos: A continuación, se presentan 3 algoritmos que ejemplifican el uso de las instrucciones repetitivas en la resolución
de problemas simples.
Ejemplo 1: Diseñe un algoritmo que sume 30 valores ingresados por el usuario.
Pseudocódigo Diagrama de Flujo
INICIO
suma <- 0
PARA i DESDE 1 HASTA 30 HACER
ESCRIBIR ‘ingrese valor:’
LEER valor
suma <- suma + valor
FIN_PARA
ESCRIBIR ‘la suma es:’ suma
FIN
Ejemplo 2: Diseñe un algoritmo que calcule la suma de valores ingresados por el usuario en tanto la suma sea menor a 80.
Pseudocódigo
INICIO
suma0
MIENTRAS suma < 80 HACER
ESCRIBIR ‘Ingrese dato:’
LEER valor
sumasuma+valor
FIN_MIENTRAS
ESCRIBIR ‘La suma es:’, suma
FIN
23
Fundamentos de Programación
Ejemplo 3: Diseñe un algoritmo que calcule el promedio de valores introducidos por el usuario. El ingreso finaliza cuando el
usuario introduce un valor cero.
Pseudocódigo Diagrama de Flujo
INICIO
suma0
contar<-0
REPETIR
ESCRIBIR ‘Ingrese valor:’
LEER num
SI num <> 0 ENTONCES
sumasuma+num
contarcontar+1
FIN_SI
HASTA_QUE num=0
SI contar<> 0 ENTONCES
ESCRIBIR ‘El promedio es:’ suma/contar
FIN_SI
FIN
24
Fundamentos de Programación
Obsérvese que para una mejor comprensión y lectura del algoritmo se utilizaron sangrías que permiten diferenciar
las estructuras anidadas. Esta es una práctica recomendable al momento de escribir un programa.
Los siguientes ejemplos muestran anidamientos válidos de sentencias repetitivas.
a) b)
MIENTRAS condición_1 HACER REPETIR
MIENTRAS condición_2 HACER REPETIR
acciones acciones
FIN_MIENTRAS HASTA_QUE condición_2
FIN_MIENTRAS HASTA_QUE condición_1
c) d)
PARA i DESDE vi HASTA vf HACER MIENTRAS condición_1 HACER
PARA k DESDE vi_2 HASTA vf_2 HACER PARA i DESDE vi HASTA vf HACER
acciones acciones
FIN_PARA FIN_PARA
FIN_PARA FIN_MIENTRAS
e) f)
PARA i DESDE vi HASTA vf HACER REPETIR
REPETIR MIENTRAS condición_2 HACER
acciones acciones
HASTA_QUE condición_1 FIN_MIENTRAS
FIN_PARA HASTA_QUE condición_1
En los bucles anidados, el bucle interno ejecuta todas sus repeticiones para cada una de las iteraciones del bucle
externo.
Los siguientes ejemplos muestran anidamientos inválidos de sentencias selectivas y repetitivas.
a) b)
MIENTRAS condición_1 HACER PARA i DESDE vi HASTA vf HACER
SI condición_2 ENTONCES MIENTRAS condición_1 HACER
acciones acciones
FIN_MIENTRAS FIN_PARA
FIN_SI FIN_MIENTRAS
c) d)
REPETIR SI condición_1 ENTONCES
MIENTRAS condición_2 HACER PARA i DESDE vi HASTA vf HACER
SI condición_3 ENTONCES acciones
acciones FIN_PARA
FIN_MIENTRAS REPETIR
ELSE ELSE
SI condición_4 ENTONCES acciones
acciones FINS_SI
FIN_SI HASTA_QUE condición_2
FIN_SI
HASTA_QUE condición_1
En cada ejemplo se destacan en negritas las estructuras que están incorrectamente anidadas.
25
Fundamentos de Programación
• Inicio del programa: siempre se debe indicar el punto en el que comienzan las acciones correspondientes al
programa. En pseudocódigo se denota con la palabra inicio y en los lenguajes de programación por lo general con
la palabra begin.
• Cuerpo del programa: en esta parte están contenidos todos los procesos y acciones que realizará el programa.
• Fin del programa: así como se indica el inicio de las acciones del programa, también se debe dejar marcado el final
de estas acciones, en pseudocódigo esto hace con la palabra fin y en lenguajes de programación con la palabra
end.
26
Fundamentos de Programación
De este modo la prueba de escritorio permite comprobar, en tiempo de diseño, si el algoritmo es correcto o si es
necesario realizar ajustes.
A continuación se muestra un ejemplo de prueba de escritorio del siguiente algoritmo:
Ejemplo: Diseñe un algoritmo que calcule la suma de valores ingresados por el usuario en tanto la suma sea menor a 80.
Variables y Condiciones
Pasos suma suma<80 valor
01 0 - -
02 VERDADERO -
03 30
04 30
05 VERDADERO
06 14
07 44
08 VERDADERO
09 25
10 69
11 VERDADERO
12 21
13 90
14 FALSO
15 LA SUMA ES: 90
INICIO
suma0
MIENTRAS suma < 80 HACER
ESCRIBIR ‘Ingrese dato:’
LEER valor
sumasuma+valor
FIN_MIENTRAS
ESCRIBIR ‘La suma es:’, suma
FIN
En la tabla anterior puede observarse cómo las variables (suma, valor) y la condición (suma<80) se van modificando
al ejecutar, paso a paso, las instrucciones del algoritmo.
Nótese, además, que el número de repeticiones del bucle (que realiza la suma) depende de los datos ingresados
por el usuario, finalizando éste en el momento en que la variable suma alcanza o supera el valor 80.
27
Fundamentos de Programación
LECTURA
ESCRITURA
acciones acciones;
fin_si
si condición entonces
if (condición)
acciones1
acciones1;
sino
else
acciones2
acciones2;
fin_si
op1: acciones_1 {
opn: acciones_n …
fin_segun }
REPETIR
do
Repetir
{
acciones
acciones;
hasta_que condición
} while (condición);
MIENTRAS
28
Fundamentos de Programación
acciones {
fin_mientras acciones; }
PARA
para v desde vi hasta vf con paso n hacer for (v=vi; v<=vf; v++)
acciones {
fin_para acciones; }
▪ Declaraciones
• Librerías del lenguaje: la directiva #include permite indicar al compilador qué librerías debe incluir en el
programa objeto para generar el programa ejecutable correspondiente. Las librerías a utilizar se indican
entre paréntesis angulares, por ejemplo, <stdio.h> (librería de las funciones estándar de entrada/salida).
De esta manera, el programador puede utilizar las funciones internas del lenguaje.
• Módulos del programador: se especifica el tipo y argumentos de los módulos escritos por el programador.
• Variables globales: se especifica el tipo de dato y nombre de las variables globales del programa.
• Constantes: se especifica el tipo, nombre y valor de las constantes del programa.
▪ Programa principal (función main): la función main() contiene declaraciones de variables e instrucciones necesarias
para controlar la secuencia de operaciones que ejecuta el programa a fin de resolver el problema para el que fue
pensado.
▪ Módulos del programador: se especifica el código correspondiente a cada uno de los módulos creados por el
programador. Un módulo contiene la declaración de variables e instrucciones que resuelven un subproblema
específico.
A continuación, se presenta un modelo de la estructura general para un programa codificado en lenguaje C.
/* Algoritmo principal */
tipo_dato main(argumentos)
29
Fundamentos de Programación
{
/* Variables locales del algoritmo principal */
tipo_dato nombre_variable1, nombre_variable2;
tipo_dato nombre_variable3, nombre_variable4;
...
/* Instrucciones del algoritmo principal */
...
modulo1(argumentos);
...
modulo2(argumentos);
...
return valor;
}
La selección del tipo de dato adecuado para los elementos del programa se realiza teniendo en cuenta el rango de valores
a representar y las operaciones que se deben aplicar.
30
Fundamentos de Programación
La función printf es la salida genérica por consola utilizada por C, mientras que la función scanf es la entrada estándar
asociada al teclado. Tanto la función printf como la función scanf permiten especificar el formato en el que se van a
escribir o leer los datos, esto se conoce como entrada/salida formateada.
La función de entrada gets permite almacenar una cadena de caracteres ingresada por teclado. Es decir, lee datos de la
entrada estándar y los almacena en la variable de tipo cadena que utiliza como argumento. La sintaxis de esta función es
la siguiente:
gets(nombre_variable);
En C++ además de las funciones printf y scanf, que siguen estando vigentes, se pueden utilizar las “funciones” cin y cout.
Para utilizarlas es necesario incluir la librería iostream especificando la directiva #include <iostream>, cin y cout responden
a la siguiente sintaxis:
Utilizando cin y cout no es necesario especificar el tipo de dato que se imprimirá o leerá, asociándolo con un formato
determinado (como ocurre con printf y scanf), sino que es el propio programa el que decide el tipo de dato en tiempo de
ejecución. De este modo, cin y cout admiten tanto los tipos predefinidos como aquellos tipos de datos definidos por el
usuario. Al ser C++ una ampliación del lenguaje C, es necesario agregar nuevas palabras reservadas. Estas palabras
reservadas están en un espacio de nombres o “namespace”. Para usar las palabras reservadas cout y cin, que están el
namespace std (standard), se debe incorporar la instrucción:
al incorporar en la cabecera del programa esta directiva estamos indicando al compilador que use el espacio de nombres
std, y que busque e interprete todos los elementos definidos en el archivo.
Operadores en C
La siguiente tabla presenta los operadores básicos utilizados en C.
Tipo Operadores
Potencia: pow(x,y) (librería math.h); x, y valores numéricos
Producto: *
Cociente: /
Aritmético
Módulo o resto: %
Sumar: +
Diferencia: -
Alfanuméricos Operaciones con cadenas (librería string.h)
31
Fundamentos de Programación
Tipo Operadores
strcat(s,t); concatena t al final de s.
strcmp(s,t); compara s y t, retornando negativo, cero, o positivo para: s<t,
s==t, s > t.
strcpy(s,t); copia t en s.
strlen(s); retorna la longitud de s.
donde s y t son variables de tipo cadena.
Negación (NO, NOT): !
Lógicos Conjunción (Y, AND): &&
Disyunción (O, OR): ||
Igual: ==
Distinto: !=
Mayor: >
Relacionales
Mayor o igual: >=
Menor: <
Menor o igual: <=
Asignación =
CodeBlocks es un entorno de desarrollo integrado libre y multiplataforma para el desarrollo de programas en lenguaje
C++. Está basado en la plataforma de interfaces gráficas WxWidgets, por lo que puede usarse libremente en diversos
sistemas operativos, y está bajo GNU. Es una herramienta para desarrollar programas en C++ que ofrece una interfaz
sencilla a los usuarios. Fuentes y sitio de descarga [Link]
ZinjaI es un IDE (entorno de desarrollo integrado) libre y gratuito para programar en C/C++. Pensado originalmente para
ser utilizado por estudiantes de programación durante el aprendizaje, presenta una interfaz incial muy sencilla, pero sin
dejar de incluir funcionalidades avanzadas que permiten el desarrollo de proyectos tan complejos como el propio ZinjaI.
Fuentes y sitio de descarga: [Link]
Opciones online:
Onlinegdb se accede ingresando el siguiente link en su navegador de preferencia (el navegador no debe tener activado el
traductor): [Link]
OmegaUp Es un proyecto web enfocado a elevar el nivel de competitividad de desarrolladores de software en América
Latina mediante la resolución de problemas de algoritmos, con un enfoque competitivo. Un gestor de concursos basado
en cómputo en la Nube (Cloud-Computing) y la plataforma oficial para la Olimpiada Mexicana de Informática.
[Link]
32
Fundamentos de Programación
PROGRAMACIÓN MODULAR
Descomposición de Problemas
En general los problemas que se presentan en el mundo real son complejos y extensos, por lo que su resolución no
es directa. Para encarar tales problemas la programación cuenta con herramientas de abstracción y descomposición de
problemas. La abstracción permite representar los objetos relevantes de un problema, y la descomposición, basada en el
paradigma “Divide y vencerás”, permite dividir problemas complejos en subproblemas y éstos a su vez en subproblemas
más pequeños, y así sucesivamente. Cada uno de los subproblemas finales será entonces más simple de resolver.
Los programas que dan solución a problemas complejos están diseñados de tal forma que sus componentes (partes
independientes, llamadas módulos) realizan actividades o tareas específicas (que resuelven subproblemas). Cada uno de
estos componentes se programa utilizando las estructuras de control (secuenciales, selectivas y repetitivas) de la
programación estructurada. La integración de los módulos, a través de métodos ascendentes o descendentes, permite
obtener un programa modular que resuelve el problema planteado.
33
Fundamentos de Programación
Programación Modular
La programación modular es un método de diseño flexible y potente que mejora la productividad de un programa.
En programación modular, un programa se divide en subprogramas (módulos) que realizan tareas específicas y que se
codifican independientemente (figuras 4 y 5). Cada módulo se analiza, codifica y pone a punto por separado.
En cada programa existe un módulo especial, llamado principal, que controla la ejecución de las tareas del
programa. El principal transfiere temporalmente el control a los módulos (y éstos a su vez a submódulos, si es necesario)
para que realicen una determinada tarea y luego retornen el control al módulo que los invocó.
En general los módulos o subrutinas se clasifican en procedimientos y funciones.
Módulos: Funciones.
La resolución de problemas complejos se facilita considerablemente si se dividen en problemas más pequeños
(subproblemas). La resolución de estos subproblemas se realiza mediante subalgoritmos. Los subalgoritmos pueden ser de
2 tipos: procedimientos y funciones. Los subalgoritmos o subprogramas se diseñan para realizar una tarea específica, y
pueden ser llamados desde distintas partes del programa. Cuando un subprograma es invocado, quien realiza el llamado
(el programa principal u otro subprograma) transfiere el control de las acciones temporalmente a esta subrutina para que
ejecute las acciones que contiene. Finalizado el procedimiento o la función, devuelve un resultado y el control a quién
realizó la invocación.
Funciones
Matemáticamente una función es una operación que toma uno o más valores llamados argumentos y produce un
valor denominado resultado (valor de la función para los argumentos dados).
En programación, una función es un módulo o subprograma que toma una lista de valores llamados argumentos o
parámetros y devuelve un único valor. Como las funciones retornan un valor, éstas deben definirse del tipo de dato
apropiado (entero, real, carácter, lógico), por lo que deben incluirse en expresiones (el nombre de la función está asociado
a un valor) o visualizarse.
34
Fundamentos de Programación
Todos los lenguajes de programación tienen funciones incorporadas o intrínsecas (por ejemplo, seno, coseno) y
funciones definidas por el usuario. Las funciones incorporadas al sistema se denominan funciones internas o intrínsecas y
las funciones definidas o creadas por el usuario, funciones externas.
Las funciones son diseñadas para realizar tareas específicas: tomar una lista de valores llamados argumentos o
parámetros, procesarlos y devolver un único valor.
Cuando se invoca una función debe utilizarse su nombre en una expresión, indicando los argumentos actuales o
reales encerrados entre paréntesis.
Cada vez que se llama a una función desde el algoritmo principal se establece automáticamente una
correspondencia entre los parámetros formales (cabecera de la declaración de función) y los parámetros actuales (valores
que se envían a la función cuando se realiza la invocación). Debe haber exactamente el mismo número de parámetros
actuales que de parámetros formales en la declaración de la función y se supone una correspondencia uno a uno de
izquierda a derecha entre los parámetros formales y los actuales.
Una llamada a una función implica los siguientes pasos:
1. A cada parámetro formal se le asigna el valor real de su correspondiente parámetro actual.
2. Se ejecuta el cuerpo de acciones de la función.
3. Se asigna el resultado al nombre de la función y se retorna al punto de llamada.
Ámbito de la Variables
En el desarrollo de un sistema complejo con gran número de módulos, realizados por diferentes programadores,
debe tenerse en cuenta que cada uno de ellos escribirá el código correspondiente a un módulo. Estos implica que cada cual
define sus propios datos, con identificadores apropiados y como consecuencia de ello se podrían observar algunos
inconvenientes tales como:
• Demasiados identificadores.
• Conflictos entre los nombres de los identificadores de cada programador.
• Integridad de los datos lo que implica que se puedan utilizan datos que tengan igual identificador pero que realicen
funciones diferentes.
• Side Effects no previstos.
Si se considera que los módulos también pueden anidarse (módulos dentro de otros módulos), deben aplicarse 2
reglas muy importantes que gobiernan el alcance de los identificadores:
• El alcance de un identificador es el bloque de programa donde se lo declara.
• Si un identificador declarado en un bloque es nuevamente declarado en un bloque interno al primero, el segundo
bloque es excluido del alcance de la primera sección.
main()
{
int num1,num2,resultado;
cout << "Ingrese divisor: ";
cin >> num1;
cout << "Ingrese dividendo: ";
cin >> num2;
resultado=division(num1,num2);
cout << "Resultado: " << resultado << endl;
system("pause");
}