Está en la página 1de 17

"Las computadoras son buenas siguiendo instrucciones,

pero no leyendo tu mente." - Donald Knuth

Problema
Un problema es un conjunto de cuestiones que se plantean para ser
resueltas. En Informtica: se busca la solucin utilizando computadoras,
mediante un programa (buscando el mejor resultado en tiempo y forma).

Planteamiento

QUE me estn pidiendo;


CMO resolverlo;
CON QU, expresar la supuesta solucin (recursos, herramientas...).

Lenguajes de programacin
Un programa es un conjunto de rdenes para una computadora.
Estas rdenes se le deben dar en un cierto lenguaje, que la computadora sea
capaz de comprender. El problema es que los lenguajes que realmente
entienden las computadoras resultan difciles para nosotros, porque son muy
distintos de los que nosotros empleamos habitualmente para hablar. Escribir
programas en el lenguaje que utiliza internamente la computadora (llamado
lenguaje mquina o cdigo mquina) es un trabajo duro, tanto a la hora
de crear el programa como (especialmente) en el momento de corregir algn
fallo o mejorar lo que se hizo.
Por eso, en la prctica se emplean lenguajes ms parecidos al lenguaje
humano, llamados lenguajes de alto nivel. Normalmente, estos son muy
parecidos al idioma ingls, aunque siguen unas reglas mucho ms estrictas.
Lenguajes de alto nivel y de bajo nivel.
Vamos a ver en primer lugar algn ejemplo de lenguaje de alto nivel, para
despus comparar con lenguajes de bajo nivel, que son los ms cercanos al
ordenador.
Uno de los lenguajes de alto nivel ms sencillos es el lenguaje BASIC. En este
lenguaje, escribir el texto Hola en pantalla, sera tan sencillo como usar la
orden
PRINT "Hola"

Otros lenguajes, como Pascal, nos obligan a ser algo ms estrictos, pero a
cambio hacen ms fcil descubrir errores:
program Saludo;
begin
write('Hola');
end.
El equivalente en lenguaje C resulta algo ms difcil de leer:

#include <stdio.h>
int main()
{
printf("Hola");
}
Los lenguajes de bajo nivel son ms cercanos al ordenador que a los
lenguajes humanos. Eso hace que sean ms difciles de aprender y tambin
que los fallos sean ms difciles de descubrir y corregir, a cambio de que
podemos optimizar al mximo la velocidad (si sabemos cmo), e incluso
llegar a un nivel de control del ordenador que a veces no se puede alcanzar
con otros lenguajes. Por ejemplo, escribir Hola en lenguaje ensamblador de
un ordenador equipado con el sistema operativo MsDos y con un procesador
de la familia Intel x86 sera algo como
dosseg
.model small
.stack 100h
.data
hello_message db 'Hola',0dh,0ah,'$'
.code
main proc
mov ax,@data
mov ds,ax
mov ah,9
mov dx,offset hello_message
int 21h
mov ax,4C00h
int 21h

main endp
end main
Resulta bastante ms difcil de seguir. Pero eso todava no es lo que el
ordenador entiende, aunque tiene una equivalencia casi directa. Lo que el
ordenador realmente es capaz de comprender son secuencias de ceros y
unos. Por ejemplo, las rdenes mov ds, ax y mov ah, 9 (en cuyo
significado no vamos a entrar) se convertiran a lo siguiente:
1000 0011 1101 1000 1011 0100 0000 1001

Ensambladores, compiladores e intrpretes


Est claro entonces que las rdenes que nosotros hemos escrito (lo que se
conoce como programa fuente) deben convertirse a lo que la computadora
comprende (obteniendo el programa ejecutable).
Si elegimos un lenguaje de bajo nivel, como el ensamblador (en ingls
Assembly, abreviado como Asm), la traduccin es sencilla, y de hacer esa
traduccin se encargan unas herramientas llamadas ensambladores (en
ingls Assembler).
Cuando el lenguaje que hemos empleado es de alto nivel, la traduccin es
ms complicada, y a veces implicar tambin recopilar varios fuentes
distintos o incluir posibilidades que se encuentran en bibliotecas que no
hemos preparado nosotros. Las herramientas encargadas de todo esto son
los compiladores.
El programa ejecutable obtenido con el compilador o el ensamblador se
podra hacer funcionar en otra computadora similar al que habamos utilizado
para crearlo, sin necesidad de que esa otra computadora tenga instalado el
compilador o el ensamblador.
Por ejemplo, en el caso de Windows (y de MsDos), y del programa que nos
saluda en lenguaje Pascal, tendramos un archivo fuente llamado
SALUDO.PAS. Este archivo no servira de nada en una computadora que no
tuviera un compilador de Pascal. En cambio, despus de compilarlo
obtendramos un archivo SALUDO.EXE, capaz de funcionar en cualquier otra
computadora que tuviera el mismo sistema operativo, aunque no tenga un
compilador de Pascal instalado.
Un intrprete es una herramienta parecida a un compilador, con la diferencia
de que en los intrpretes no se crea ningn programa ejecutable capaz de
funcionar por s solo, de modo que si queremos distribuir nuestro
programa a alguien, deberemos entregarle el programa fuente y tambin el
intrprete que es capaz de entenderlo, o no le servir de nada. Cuando
ponemos el programa en funcionamiento, el intrprete de encarga de
convertir el programa en lenguaje de alto nivel a cdigo mquina, orden por

orden, justo en el momento en que hay que procesar cada una de las
rdenes.
Para algunos lenguajes, es frecuente encontrar compiladores pero no suele
existir intrpretes. Es el caso del lenguaje C, de Pascal y de C++, por
ejemplo. En cambio, para otros lenguajes, lo habitual es trabajar con
intrpretes y no con compiladores, como ocurre con Python, Ruby y PHP.
Adems, hoy en da existe algo que parece intermedio entre un compilador y
un intrprete:
Existen lenguajes que no se compilan para obtener un ejecutable para un
ordenador concreto, sino un ejecutable genrico, que es capaz de
funcionar en distintos tipos de computadoras, a condicin de que en esa
computadora exista una mquina virtual capaz de entender esos
ejecutables genricos. Esta es la idea que se aplica en Java: los fuentes son
archivos de texto, con extensin .java, que se compilan a archivos .class.
Estos archivos .class se podran llevar a cualquier computadora que tenga
instalada una mquina virtual Java (las hay para la mayora de sistemas
operativos). Esta misma idea se sigue en el lenguaje C#, que se apoya en una
mquina virtual llamada Dot Net Framework (algo as como armazn
punto net).

Pseudocdigo
A pesar de que los lenguajes de alto nivel se acercan al lenguaje natural, que
nosotros empleamos, es habitual no usar ningn lenguaje de programacin
concreto cuando queremos plantear los pasos necesarios para resolver un
problema, sino emplear un lenguaje de programacin ficticio, no tan estricto,
muchas veces escrito incluso en espaol. Este lenguaje recibe el nombre de
pseudocdigo.
Esa secuencia de pasos para resolver un problema es lo que se conoce como
algoritmo (realmente hay alguna condicin ms, por ejemplo, debe ser un
nmero finito de pasos). Por tanto, un programa de computadora es un
algoritmo expresado en un lenguaje de programacin.
Por ejemplo, un algoritmo que controlara los pagos que se realizan en una
tienda con tarjeta de crdito, escrito en pseudocdigo, podra ser:
Leer banda magntica de la tarjeta
Conectar con central de cobros
Si hay conexin y la tarjeta es correcta:
Pedir cdigo PIN
Si el PIN es correcto
Comprobar saldo_existente
Si saldo_existente > importe_compra
Aceptar la venta

Descontar importe del saldo.


Fin Si
Fin Si
Fin Si

Los sistemas de procesamiento de la informacin


Para los informticos, datos e informacin no son sinnimos. Datos se refiere
a la representacin de algn hecho, concepto o entidad real, en cambio,
informacin implica datos procesados y organizados.
Un sistema en general se define como un conjunto de componentes
conectados e interactivos, que tiene un propsito y una unidad total. En
consecuencia, sistema de procesamiento de informacin es un sistema que
transforma datos brutos en informacin organizada, significativa y til.
El conjunto de instrucciones que especifican la secuencia de operaciones a
realizar para resolver un sistema especfico o clase de problema se denomina
algoritmo. En otras palabras, un algoritmo es una frmula para la resolucin
de un problema.
Un programa se escribe en un lenguaje de programacin y a la actividad de
expresar un algoritmo en forma de programa se le denomina programacin.
Un programa consta de una secuencia de instrucciones, cada una de las
cuales especifica las operaciones que debe realizar la computadora.
La resolucin de problemas exige al menos los siguientes pasos:
1.
2.

Definicin o anlisis del problema


Diseo del algoritmo (Secuencia ordenada de pasos que conducen a la
solucin).
3. Transformacin del algoritmo en un programa (Fase de codificacin).
4. Ejecucin y validacin del programa.

CONCEPTO DE ALGORITMO
Para ser un programador eficaz se necesita aprender a resolver problemas de
un modo riguroso y sistemtico.
Los algoritmos son ms importantes que los lenguajes de programacin o las
computadoras. Un lenguaje de programacin es tan slo un medio para
expresar el algoritmo, y una computadora es slo un procesador para
ejecutarlo.
Definicin
Un algoritmo es un conjunto de tareas o pasos en una cantidad finita que se
ejecutan en un orden determinado, y para determinada situacin inicial se
resuelve el problema en un tiempo finito.
situacin ---------> algoritmo ----------> solucin inicial
Caractersticas que debe cumplir
1.
2.
3.
4.
5.
6.

Debe ser correcto; responder a lo que me piden y resolver el problema;


Eficiente en cuanto a recursos y tiempo;
Claro;
Flexible; poder adaptarse a pequeos cambios de lgica;
Preciso; e indicar el orden de realizacin de cada paso;
Estar definido: si se sigue un algoritmo dos veces, se debe obtener el
mismo resultado cada vez;
7. Ser finito:, se debe terminar el algn momento; debe tener un nmero
finito de pasos;
8. Fiable confiable; estar acorde a lo anterior en cuanto a propuesta de
solucin.
La definicin de un algoritmo debe describir tres partes: entrada, proceso y
salida.
La resolucin de problemas con computadoras se puede dividir en tres fases:

Anlisis del problema


Diseo del algoritmo
Resolucin del algoritmo en la computadora

El primer paso requiere que el problema sea definido y comprendido


claramente para que pueda ser analizado con todo detalle. Una vez analizado
el problema, se debe desarrollar el algoritmo. Por ltimo, para resolver el
algoritmo mediante una computadora se necesita codificar el algoritmo en un
lenguaje de programacin.
Anlisis del problema
El propsito del anlisis del problema es ayudar al programador para llegar a
una cierta comprensin de la naturaleza del problema. El problema debe
estar bien definido si se quiere llegar a una solucin satisfactoria.
Para poder definir con precisin el problema se requiere que las
especificaciones de entrada y salida sean descritas en detalle. stos son los
requisitos ms importantes para llegar a una solucin eficaz.
Diseo del algoritmo
La descomposicin del problema original en subproblemas ms simples y a
continuacin dividir estos subproblemas en otros mas simples, que pueden
ser implementados para su solucin en la computadora, se denomina diseo
descendente (top-down design). Este mtodo se suele denominar tambin
divide y vencers.
Para problemas complejos se necesitan con frecuencia diferentes niveles de
refinamiento antes de que se pueda obtener un algoritmo claro, preciso y
completo.
Las ventajas ms importantes del diseo descendente son:

El problema se comprende ms fcilmente al dividirse en partes ms


simples, denominadas mdulos;
Realizarle modificaciones al algoritmo es ms fcil;
La comprobacin de la solucin del problema se puede verificar
fcilmente.

Estructura inicial del algoritmo:


-

Las tareas deben estar seguidas de alguna secuencia definida se pasos


hasta que se obtenga un resultado coherente;
El flujo de control usual de un algoritmo es secuencial;
Un aspecto importante a considerar es el mtodo elegido para
describir los algoritmos: empleo de justificacin en la escritura de
algoritmos.

Resolucin del problema mediante computadoras


Esta fase se descompone en las siguientes subfases:
-

Comprobacin del algoritmo en un programa

Ejecucin del programa


Comprobacin del programa

La fase de conversin del algoritmo en


programacin se denomina codificacin, y
denomina cdigo.

un lenguaje
el algoritmo

especfico de
resultante se

Tras la codificacin del programa, el mismo deber ejecutarse en una


computadora y a continuacin de comprobar los resultados, pasar a la fase
final de documentacin.

Representacin grfica de los algoritmos


Se debe utilizar algn mtodo que permita independizar el algoritmo del
lenguaje de programacin elegido. Ello permitir que un algoritmo pueda ser
codificado indistintamente en cualquier lenguaje.
Los mtodos usuales para representar un algoritmo son:
-

Diagrama de flujo
Diagrama N-S (Nassi-Schneiderman)
Lenguaje de especificacin de algoritmos: Pseudocdigo
Lenguaje espaol
Frmulas

Un diagrama de flujo (flowchart) es un diagrama que utiliza smbolos (cajas)


estndar y que tiene los pasos del algoritmo escritos en esas cajas, unidas
por flechas denominadas lneas de flujo, que indican la secuencia en que se
deben ejecutar. Los smbolos estndar normalizados por ANSI (American
National Standars Institute) son muy variados.

El diagrama N-S, tambin conocido como diagrama de chapln, es como un


diagrama de flujo en el que se omiten las lneas de flujo y las cajas son
contiguas. Las acciones sucesivas se escriben en cajas sucesivas y, como en
los diagramas de flujo, se pueden escribir diferentes acciones en una caja.

El pseudocdigo es un lenguaje de especificacin (descripcin) de algoritmos.


El uso de tal lenguaje hace el paso de codificacin final relativamente fcil.
Se considera como un primer borrador, dado que el pseudocdigo tiene que
traducirse posteriormente a un lenguaje de programacin.
La ventaja del pseudocdigo es que, en la planificacin de un programa, el
programador se puede concentrar en la lgica y en las estructuras de control,
y no preocuparse por las reglas de un lenguaje especfico. Adems, es fcil
de modificar si se encuentran errores.
Es muy importante aadir comentarios durante la utilizacin de ste o
cualquier otro lenguaje. El comentario brinda informacin acerca de las
acciones que realiza el programa, y no realiza ninguna instruccin ejecutable,
slo tiene efecto de documentacin interna del programa.

ESTRUCTURA GENERAL DE UN PROGRAMA


Un programa es un conjunto de instrucciones (rdenes) que producirn la
ejecucin de una determinada tarea; es la conversin del algoritmo haciendo
uso de los constructores formales de un lenguaje de programacin para ser
ejecutado en una pc.
Atributos, caractersticas
-

debe estar definido: nico punto de entrada/salida, que se comprenda


la secuencia de las acciones;
debe ser confiable;
eficiente, en cuanto al uso de los recursos de la mejor manera posible;
-tiempo (anlisis de cantidad de acciones/operaciones);
-espacio (asociado a la cantidad de datos a considerar en el

algoritmo).
-

debe ser claro, tener una documentacin;


debe ser portable: permitir ser ejecutado en distintas pcs con un
mnimo de cambios.

El proceso de programacin es un proceso de solucin de problemas, y el


desarrollo de un programa requiere las siguientes fases:
1. Definicin y anlisis del problema.
2. Diseo de algoritmos:
- diagrama de flujo

3.
4.
5.
6.

- diagrama N-S
- pseudocdigo
Codificacin del programa.
Depuracin y verificacin del programa.
Documentacin externa.
Mantenimiento.

En todos los casos anteriores, llevar a cabo simultneamente la adecuada


documentacin interna.
PARTES CONSTITUTIVAS DE UN PROGRAMA
Tras la decisin de desarrollar un programa, el programador debe establecer
el conjunto de especificaciones que debe contener el programa: entrada,
salida y algoritmos de resolucin, que incluir las tcnicas para obtener las
salidas a partid de las entradas.
Instrucciones y tipos de instrucciones
Un programa puede ser lineal o no lineal:

Es lineal si las instrucciones se ejecutan secuencialmente, sin


bifurcaciones, decisiones ni comparaciones;
Es no lineal cuando se interrumpe la secuencia mediante instrucciones
de bifurcacin.

La clasificacin ms usual es:

Instrucciones
Instrucciones
Instrucciones
Instrucciones
Instrucciones

de
de
de
de
de

inicio / fin.
asignacin: dar valores a una variable.
lectura: leer datos de un dispositivo de entrada.
escritura.
bifurcacin.

Instrucciones de bifurcacin
Pueden ser hacia delante o hacia atrs, y pueden realizarse de manera
condicional o incondicional:

Bifurcacin incondicional: se realiza siempre que el flujo del programa


pase por la instruccin sin necesidad del cumplimiento de ninguna
condicin.
Bifurcacin condicional: que se ejecute o no, depende del
cumplimiento de una determinada condicin.

Elementos bsicos de un programa


Los lenguajes de programacin tienen elementos bsicos que se utilizan
como bloques constructivos, as como reglas para que estos elementos se
combinen; esas reglas se denominan sintaxis del lenguaje. Solamente las
instrucciones sintcticamente correctas pueden ser interpretadas por la

computadora, y los programas que contengan errores de sintaxis sern


rechazados por la mquina.
Los elementos bsicos constitutivos de un programa o algoritmo son:

palabras reservadas (hacer, fin hacer, si >> entonces...)


identificadores (nombres de variables esencialmente)
caracteres especiales (coma, apstrofe...)
constantes
variables
expresiones
instrucciones

Adems de estos elementos bsicos, existen otros que forman parte de los
programas:

bucles.
acumuladores.
contadores.
interruptores.
estructuras de control: secuenciales, selectivas, repetitivas.

Bucles
Un bucle o lazo (loop) es un segmento de un algoritmo o programa, cuyas
instrucciones se repiten una n cantidad de veces mientras se cumpla una
determinada condicin.
Se debe establecer un mecanismo para determinar las tareas repetitivas;
este mecanismo es una condicin que puede ser verdadera o falsa, y que se
comprueba cada vez que se realiza un paso o iteracin del bucle.
Un bucle consta de tres partes:

decisin
cuerpo
salida

Los bucles son anidados cuando estn dispuestos de tal modo que unos son
interiores a otros, y son independientes cuando son externos unos de otros.

Contadores y acumuladores
VARIABLE ACUMULADORA: Su funcin es acumular valores, distintos o no, en
forma parcial; valores resultantes de sumas sucesivas. Se debe inicializar
siempre, de lo contrario el valor que esta tome va a incluir el acumulado de
todas las veces que corri el programa. Generalmente se inicializa al

comienzo o casi al final del programa. El modo de acumularle valores es


siempre el mismo:
<var acumuladora>:= <var acumuladora> + <var a sumar >

VARIABLE CONTADORA: Es una variable cuyo


decrementa en una unidad, en cada iteracin.

valor

se

incrementa

<var contadora>:= <var contadora> + <constante>

Interruptores
Un interruptor o conmutador (switch) llamado a veces, indicador o bandera
(flag) es una variable que puede tomar diversos valores a lo largo de la
ejecucin del programa, y que permite comunicar informacin de una parte a
otra del mismo.

Estructura de algoritmos / programas


Un algoritmo constar de dos componentes: una cabecera de programa y un
bloque algoritmo.
La cabecera de programa es una accin simple que comienza con la palabra
algoritmo o programa. Esta palabra estar seguida por el nombre
completo asignado al programa.
El bloque algoritmo es el resto del programa, y consta de dos componentes o
secciones: las acciones de declaracin y las acciones ejecutables.
Las declaraciones definen o declaran las variables y constantes que tengan
nombre .
Las acciones ejecutables son las acciones que posteriormente deber realizar
la pc cuando el algoritmo convertido en programa se ejecute.
Comentarios
La documentacin de un programa es el conjunto de informacin interna y
externa al programa, que facilitar su posterior mantenimiento y puesta a
punto.
La documentacin interna es la que acompaa en el cdigo o programa
fuente y se realiza a base de comentarios significativos. Estos comentarios se
representan con diferentes notaciones, segn el tipo de lenguaje de
programacin.
La documentacin externa se realizar con informacin ajena al programa, y
ser proporcionada por el programador.