Programación Estructurada Codificada 1 Aurelio López Ovando http://aureliux.wordpress.com Unidad 1 Introducción a la programación I Componentes de programación Algoritmo Un algoritmo se puede ver como cualquier procedimiento computacional bien definido el cual toma uno o varios valores de entrada y produce uno o varios valores de salida. o Propiedades a) Carácter finito. "Un algoritmo siempre debe terminar después de un número finito de pasos". b) Precisión. "Cada paso de un algoritmo debe estar precisamente definido; las operaciones a llevar a cabo deben ser especificadas de manera rigurosa y no ambigua para cada caso". c) Entrada. "Un algoritmo tiene cero o más entradas: cantidades que le son dadas antes de que el algoritmo comience, o dinámicamente mientras el algoritmo se ejecuta. Estas entradas son tomadas de conjuntos específicos de objetos". d) Salida. "Un algoritmo tiene una o más salidas: cantidades que tienen una relación específica con las entradas". e) Eficacia. "También se espera que un algoritmo sea eficaz, en el sentido de que todas las operaciones a realizar en un algoritmo deben ser suficientemente básicas como para que en principio puedan ser hechas de manera exacta y en un tiempo finito por un hombre usando lápiz y papel". o Historia En 1834 Charles Babbage concibió de forma mecánica el concepto de un algoritmo mediante su “Máquina Analítica”, esta máquina sería programable mediante tarjetas perforadas, cada tarjeta representaría un paso en la solución de un problema, de tal manera que el conjunto de tarjetas para resolver dicho problema representaría un algoritmo computacional. El concepto matemático formal de algoritmo, fue formulado hasta 1930, antes de la llegada de las computadoras. La mayor influencia sobre el desarrollo de las teorías algorítmicas vino del matemático inglés Alan Turing, quien describió un modelo llamado la Máquina de Turing, en el cual estableció el mecanismo mediante el cual las computadoras podrían resolver problemas matemáticos. Además de esto, también describió de forma teórica el paradigma de los programas almacenados, el cual representa la base para las computadoras de propósito general de hoy en día, sin embargo, John von Neumann fue quien demostró formalmente la practicidad de introducir las instrucciones y los datos que estas procesan en la memoria de una computadora. o ¿Para qué y por qué? Los problemas alguna vez imposibles hoy se pueden resolver mediante el uso de los algoritmos correctos, ejemplo de esto son la robótica y la inteligencia artificial que implica, el cómputo gráfico, la solución a grandes problemas mediante sistemas computacionales, incluso la comunicación mediante redes implica el uso de los algoritmos correctos. Se requiere saber analizar los problemas para poder identificar el algoritmo correcto en cada situación, ya que la mayoría de las veces podremos resolver el problema de más de una forma; si podemos analizar estos algoritmos, podremos mejorarlos y en el mejor de los casos elegir el que resuelva nuestro problema. o Ejemplo 1: Un virus informático llamado “AcertijoMath” se adueñaba de las computadoras de una empresa mostrando un molesto mensaje en pantalla que decía:
20
Embed
Programación Estructurada Codificada Unidad 1 ... · Programación Estructurada Codificada 1 Aurelio López Ovando Unidad 1 Introducción a la programación
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
a) Capacidad de comunicación: Permite la puesta en común de conocimientos individuales sobre un proceso,
y facilita la mejor comprensión global del mismo.
b) Claridad Proporciona información sobre los procesos de forma clara, ordenada y concisa.
o Símbolología
Imágenes o figuras con la que se representa
los procesos. Algunos de los símbolos son:
Seudocódigo
Es una secuencia de instrucciones parecidas el lenguaje humano y aplicable a cualquier lenguaje de programación
en la que se plantean soluciones a determinadas situaciones programables.
Ejemplo 2: Se necesita una rutina que muestre como se obtiene la potencia de un número.
Los diagramas de flujo pueden ser traducidos a
seudocódigo y viceversa, sin embargo lo más
recomendables es que al tener planteada una
solución confiable con cualquier algoritmo, este sea
traducido directamente a un lenguaje de
programación.
Terminal: Marca el inicio y final de un diagrama.
Proceso: Realiza alguna actividad.
Definición: Realiza alguna actividad predefinida.
Decisión: Análisis de situación y toma de decisiones.
Documentación
Archivo
Conector entre partes de un diagrama.
Flujo
i desde 1 hasta x
residuo residuo * y
Entero residuo, x,y
y
X=0
x
La potencia es 1
La potencia es residuo
Inicio entero residuo, x, y, i; Leer y Leer x si (x == 0) Escribir "La potencia es 1" De lo contrario residuo y for i = desde 0 hasta x residuo residuo * y fin for Escribir "La potencia es " residuo Fin si Fin
Realiza para cada problema (del A al C) su diagrama de flujo y su seudocódigo correspondiente que plantee una
solución a los problemas:
A) Se necesita saber el promedio de un alumno en una materia en la que se califican tres cosas:
Examen escrito.
Entrega de proyecto.
Participación en clase. Se debe pedir el valor correspondiente a cada calificación y dar como salida el promedio de estas calificaciones.
B) En un casa de apuestas los jugadores tienen bonos los cuales pueden apostar, cada bono se cotiza en $10,000, en una jornada participan 5 jugadores, cada uno de ellos puede apostar una determinada cantidad de bonos, al finalizar la jornada se debe saber quien de ellos apostó mas y quien apostó menos. Como dato de entrada se pide el número de bonos que apuesta cada jugador.
C) Los usuarios de una página web, al momento de registrarse, se les pide registrar también una clave numérica para poder ingresar posteriormente a la página. La clave de acceso debe tener exactamente tres cifras. Hacer un programa que valide que la clave que teclea el usuario realmente tenga tres cifras, si el número tecleado no es de tres cifras marcar el error y volver a pedirlo hasta que tenga tres cifras.
D) ¿Encuentra el número debe reemplazar al signo de interrogación y explica porque crees que es ese
número?
6, 9, 19, 73 9, 6, 13, 67 7, 8, ?, 71
E) ¿Cuál es la respuesta si, de los números de abajo, multiplicas por cinco el número de números pares que
Variables Una variable es un espacio reservado en el procesador para contener valores que pueden cambiar durante la
ejecución de un programa, los tipos determinan cómo se manipulará la información contenida en esas variables. El
tipo nos dice a nosotros y al compilador cómo debe interpretarse y manipularse la información almacenada en la
memoria.
o Tipos de datos
"char" o carácter: En C++ este tipo siempre contiene un único carácter del código ASCII.
Tipo "int" o entero: Las variables enteras almacenan números enteros dentro de los límites de su tamaño, a su vez, ese tamaño
depende de la plataforma del compilador, y del número de bits que use por palabra de memoria: 8, 16,
32... No hay reglas fijas para saber el mayor número que podemos almacenar en cada tipo: int, long int o
short int; depende en gran medida del compilador y del procesador. Sólo podemos estar seguros de que
ese número en short int es menor o igual que en int, y éste a su vez es menor o igual que en long int y que
long long int es mayor o igual a long int.
Tipo "float" o coma flotante: Las variables de este tipo almacenan números con decimales, son aptos para variables de tipo real, o para
números muy grandes, como la producción mundial de trigo, contada en granos. El fuerte de estos
números no es la precisión, sino el orden de magnitud, es decir lo grande o pequeño que es el número que
contiene.
Tipo "bool" o Booleana: Las variables de este tipo sólo pueden tomar dos valores "true" o "false", sirven para evaluar expresiones
lógicas.
Tipo "double" o coma flotante de doble precisión: Las variables de este tipo almacenan números en formato de punto decimal, mantisa y exponente, al igual
que float, pero usan mayor precisión, usaremos estas variables cuando trabajemos con números grandes,
pero también necesitemos gran precisión. ¿Por qué no usar siempre double o long double y olvidarnos de
float? porque C siempre ha estado orientado a la economía de recursos, tanto en cuanto al uso de memoria
como al uso de procesador. Si tu problema no requiere la precisión de un double o long double, ¿Por qué
derrochar recursos? C++ nos dan un gran control sobre estas características, es nuestra responsabilidad
aprender a usarlos como es debido.
Tipo "void" o sin tipo:
Es un tipo especial que indica la ausencia de tipo, se usa en funciones que no devuelven ningún valor, las
funciones que no devuelven valores simplemente hacen su trabajo, y no devuelven valores.
4.- Programa muestre la suma de dos números. Declaramos 3 variables de tipo entero. Las inicializamos con valores Realizamos la suma Mostramos el resultado
En este ejemplo vemos el uso de operadores.
Operadores Son elementos que disparan ciertos cálculos cuando son aplicados a variables o a otros objetos en una expresión.
Expresión: es cualquier conjunto de operadores y operandos, que dan como resultado una cantidad.
Operando: cada una de las cantidades, constantes, variables o expresiones que intervienen en una
expresión.
Existe una división en los operadores atendiendo al número de operandos que afectan.
Según esta clasificación pueden ser unitarios, binarios o ternarios, los primeros afectan a un solo operando, los
segundos a dos y los ternarios a tres.
Tipos de operadores o Operadores aritméticos
Son usados para crear expresiones matemáticas, que admiten enteros y de punto flotante.
Evidentemente se trata de las conocidísimas operaciones aritméticas de suma, resta, multiplicación y división,
el operador de módulo '%', devuelve el resto de la división entera del primer operando entre el segundo. Por
esta razón no puede ser aplicado a operandos en punto flotante.
o Operadores de asignación Existen varios operadores de asignación, el más evidente y el más usado es el "=", pero no es el único, aquí hay
una lista: "=", "*=", "/=", "%=", "+=", "-=", "<<=", ">>=", "&=", " ^=" y "|=".
Y la sintaxis es:
<variable> <operador de asignación> <expresión>
En general, el funcionamiento es siempre el mismo, primero se evalúa la expresión de la derecha, se aplica el
operador mixto, si existe y se asigna el valor obtenido a la variable de la izquierda.
+ SUMA
- RESTA * MULTIPLICACION
/ DIVISIÓN ENTERA
% RESIDUO DE LA DIVISIÓN (MODULO)
#include<iostream> using namespace std; int main() { int n1,n2,suma; n1=10; n2=5; suma=n1+n2; cout<<"La suma es: "<< suma<<endl; system("PAUSE"); }
o Operadores de igualdad Se utiliza para hacer comparaciones mediante ==, si nos equivocamos al escribir estas expresiones, y ponemos
sólo un signo '=', podemos obtener un error del compilador, ya que estaremos intentando cambiar un valor, lo
cual podría no ser posible, en otro caso, el valor de alguna variable cambiaría, y el resultado de evaluar la
expresión no dependerá de una comparación, sino de una asignación, y siempre será "true", salvo que el valor
asignado sea 0.
o Operadores lógicos Los operadores "&&", "||" y "!" relacionan expresiones lógicas, formando a su vez nuevas expresiones lógicas.
El operador "&&" equivale al "AND" o "Y"; devuelve "true" sólo si las dos expresiones evaluadas son "true" o
distintas de cero, en caso contrario devuelve "false" o cero. Si la primera expresión evaluada es "false", la
segunda no se evalúa. Generalizando, con expresiones AND con más de dos expresiones, la primera expresión
falsa interrumpe el proceso e impide que se continúe la evaluación del resto de las expresiones. Esto es lo que
se conoce como "cortocircuito".
El operador "||" equivale al "OR" u "O inclusivo"; devuelve "true" si cualquiera de las expresiones evaluadas es
"true" o distinta de cero, en caso contrario devuelve "false" o cero. Si la primera expresión evaluada es "true",
la segunda no se evalúa. El operador "!" es equivalente al "NOT", o "NO", y devuelve "true" sólo si la expresión
evaluada es "false" o cero, en caso contrario devuelve "false".
o Operadores relacionales Sirven para comparar, los operadores son:
> mayor que
< menor que
>= mayor o igual que
<= menor o igual que
Entrada por teclado Las clases “iostream” proporcionan la habilidad de leer datos desde el teclado, el objeto usado para la entrada
estándar es “cin” abreviación de “console input”, cin normalmente espera la entrada de la consola, pero esta
entrada se puede redirigir desde otras fuentes, el operador que usa iostream con el objeto cin es” >>”. Este
operador espera como parámetro algún tipo de entrada.
5.- Modificando el programa anterior demos como datos de entrada los valores de los números que se van a sumar.
Los valores de las variables ahora son dados como datos de entrada desde el teclado con cin.
#include<iostream> using namespace std; int main() { int n1,n2,suma; cout<<"Teclee el valor del primer numero: "; cin>>n1; cout<<"Teclee el valor del segundo numero: "; cin>>n2; suma=n1+n2; cout<<"La suma es: "<< suma<<endl; system("PAUSE"); }
Ejercicios propuestos 1) Suponiendo los siguientes valores iniciales para las variables: x = 2; y = 6; z = 9; r = 100; s = 10; a = 15; b = 3; ¿Cuáles son los valores correctos en cada expresión? a) x += 10; 12 10 11 b) s *= b; 9 13 30 c) r /= 0; infinito 1 error d) y += x + 10; 8 12 18 e) z -= a*b; -36 -18 36 2) Marca la expresión equivalente usando operadores mixtos. a) x = 10 + x - y;
b) r = 100*r;
r *= 100*r r *= 100 r += 100
c) y = y/(10+x);
y /= 10*x y /= 10 + y/x y /= 10+x
d) z = 3 * x + 6;
3) Evaluar las siguientes expresiones y marca la correcta, siendo: x= 10; y = 20; z = 30;
III Clases y objetos El poderío de C++ radica en el uso de objetos, en tratar a cada programa como una interacción de objetos del mundo real y no como simples variables y constantes independientes y solitarias que guardan cierta información, primero entendamos un poco acerca de la programación orientada a objeto.
Programación orientada a objetos La idea básica de este tipo de programación es agrupar los datos y los procedimientos para manejarlos en una
única entidad: el objeto. Un programa es un objeto, que a su vez está formado de objetos, la idea de la
programación estructurada no desaparece sino más bien se refuerza.
o Objeto es cualquier persona, animal, cosa o acción que exista en la vida real, que tiene existencia propia y
que interviene de alguna manera en nuestro programa.
Por ejemplo pensemos en un programa que controle las cuestiones escolares de una escuela. Los objetos que intervienen son:
Cada uno de ellos engloba datos y procedimientos, es decir cada
uno realiza diferentes actividades en el programa y tiene
diferentes datos que se necesitan controlar, a estas actividades le
llamaremos métodos y a los datos atributos.
Es muy importante tener claro cual es la participación de cada
objeto en el programa ya que éstos se verán reflejados en el
código fuente que se va a realizar y no es poner atributos y
métodos nada mas porque si sin justificación alguna, porque
estaríamos creando un programa con muchas líneas de código
inútiles.
Para reflejar estos objetos en el código haremos uso de clases.
o Clase es un modelo en el que los objetos se representan mediante código.
La diferencia entre clase y objeto es que el objeto es el que existe en el mundo real y la clase es la representación
de ese objeto dentro del programa con sus atributos y sus métodos.
Creación de una clase
Primeramente veamos como se define una clase dentro de un programa en C++.
Su sintaxis es :
class nombreClase { };
En medio de las llaves se deben definir todos los atributos y métodos de la clase.
Al final de la clase se debe colocar un punto y coma. La clase debe tener un nombre (nombreClass) el cual se
recomienda empiece siempre con mayúscula.
class La palabra clave “class” es una manera elaborada de describir un tipo de dato nuevo, la utilizamos para representar un “objeto”
La sintaxis de un método sencillo que no retorna ningún valor ni tampoco recibe parámetro es:
6.- Programa que muestre un saludo en pantalla utilizando clases.
Se define una clase que se llama Saludar.
Dentro de esta clase se crea un método público llamado saludo,
a su vez dentro de saludo mostramos mediante cout el mensaje
en pantalla.
A pesar que se ha definido la clase aún no se ha creado, eso debe hacerse dentro de main, a través del operador new. Una vez creada la clase podemos acceder a los métodos públicos que existen en ella mediante el operador”-> “
Hemos creado una pequeña clase para irnos adentrando en la manera de programar orientada a objetos. Los atributos y métodos que estén dentro de la clase se llaman miembros de la clase, existe otra manera de
trabajar con clases, pero esta es mejor porque trabajamos con clases dinámicas, es decir trabajamos directamente
con la memoria, ese * que utilizamos es precisamente el que se encarga de crear el espacio necesario para la clase.
Es importante indicar el especificador de ámbito, en este caso el que utilizamos es público, pero ¿Que hubiera
pasado si en lugar de public hubiéramos utilizado prívate? La respuesta es simple, nos hubiera generado un error
porque como ya mencioné entes los atributos y métodos privados sólo se reconocen dentro de la misma clase
#include<iostream> using namespace std; class Saludar { public: void saludo() { cout<<"Hola bienvenido al curso de C++"<<endl; } }; int main() { Saludar *saludar = new Saludar(); saludar->saludo(); system("PAUSE"); }
void nombreMetodo() { }
En medio de las llaves se debe codificar las operaciones necesarias que se esperan del método.
Un método debe tener paréntesis después del nombre El método debe tener un nombre (nombreMetodo) el cual se
recomienda empiece siempre con minúscula
public:
Para poder crear la clase dentro de main debe tener por menos un método público, a esto se le llama
especificador de ámbito, es decir un método puede ser público y que sea reconocido en todo el programa
o privado y solo sea reconocido dentro de la clase, esto se especifica con la palabra “public”.
new
Este operador nos permite crear la clase, la función que en realidad hace es acceder y reservar la memoria que la clase va a necesitar, esta memoria es imprescindible liberarla con el operador “delete”.
Métodos
Los métodos son funciones, es decir son rutinas de código las cuales pueden retornar algún valor o no, cuando no retorna ningún valor se utiliza la palabra reservada void que significa nulo.
Esto es un error ya que le estaríamos pidiendo al compilador
que ejecute un método llamado saludar.
La respuesta del compilador es que ese método no lo puede
ejecutar porque es privado y no lo reconoce.
Por eso es necesario que una clase tenga por lo menos un
método público.
Otra duda que puede surgir es ¿Qué pasa si no pongo ni público
ni privado? La respuesta es que cuando no se especifica su
especificador de ámbito, se toma como si fuera privado.
7.- Se necesita guardar los datos de los libros de una librería.
En este ejemplo se puede apreciar el uso de ambos especificadores de ámbito
(public y private).
Se han declarado 4 atributos, es decir que de cada libro obtendremos el título, el
nombre del autor, cuantas unidades del libro están entrando y el precio al que se
va a vender cada uno, estos atributos son privados y solo pueden ser accedidos
dentro de la clase.
Cada atributo es un dato del objeto (en este caso nuestro objeto es un libro) y
podemos leerlo con la instrucción cin, es recomendable que cada nombre que le
pongamos a los atributos tenga relación o ilustre el dato que se va aguardar, evitar
poner nombres que puedan causar confusiones.
Sin embargo nuestro programa a pesar de haber evolucionado con respecto a los
anteriores ejemplos, aún tiene algunos errores que deben corregirse.
o getline
Por ejemplo el primero de estos errores y que seguramente salta a la vista de
inmediato es que al leer el titulo y el nombre del autor solo podemos teclear una
palabra, por ejemplo, supongamos que nuestro libro se llama “Don Quijote de la
Marcha” y su autor es “Diego Cervantes de Saavedra”, cin solo nos permitiría leer
“Don” y “Diego” respectivamente es decir solo acepta una palabra (la primera),
para resolver este problema y poder leer toda la cadena completa debemos
#include<iostream> using namespace std; class Saludar { prívate: void saludo() { cout<<"Hola bienvenido al curso de C++"<<endl; } }; int main() { Saludar *saludar = new Saludar(); saludar->saludo(); system("PAUSE"); }
#include<iostream> using namespace std; class Libros { private: string titulo, autor; int unidades; float precio; public: void datosLibro() { cout<<"Titulo del libro: "; cin>>titulo; cout<<"Autor: "; cin>>autor; cout<<"Unidades: "; cin>>unidades; cout<<"Precio: "; cin>>precio; } }; int main() { Libros *libro = new Libros(); libro->datosLibro(); system("PAUSE"); }
Se debe proteger al máximo los datos de una clase, así que lo recomendable es utilizar hasta donde sea
posible el especificador prívate.
Atributos Son datos pertenecientes a la clase, estos datos se declaran, pero no se inicializan, funcionan de manera similar a una variable.
1.- Coloca el nombre correcto en la línea correspondiente, los datos son: objeto, clase, atributos, métodos.
2.- Del ejemplo anterior, programa la función main si quiero llamar a los métodos capturaDatos e imprimeDatos. 3.- Explica del ejemplo anterior cual es la diferencia entre la clase y el objeto. 4.- ¿Que es una función inline? 5.- ¿Cual es la principal diferencia entre cin y getline? 6.- ¿Para que sirve endl? 7.- Crea un programa que mediante una clase controle tus datos como alumno de la materia de programación, no debe tener funciones inline. Los datos que se necesitan controlar son matricula, nombre, promedio, faltas.
class Casa { public: void capturaDatos(); void imprimeDatos(); prívate: string direccion; float precio; int numeroCuartos; };