NOTAS - Introducción A La Programación - Sergio Paez Rodea
NOTAS - Introducción A La Programación - Sergio Paez Rodea
por
Unidad Iztapalapa
3
3
1.- BREVE RESUMEN HISTÓRICO DE LA COMPUTACION
Wilheim Schickard
Máquina de Schickard
Imágenes bajadas de: [Link]
3
La segunda máquina de engranes de la que se tiene noticia es la diseñada y
construida en 1640 por en matemático, físico, filósofo y teólogo francés Blas Pascal (1623
- 1662). Él diseñó y mandó construir esta máquina contando con tan solo diecinueve años
de edad para ayudar a su padre Etienne, el cual era recaudador de impuestos, por lo que
requería hacer gran cantidad de cálculos. Esta máquina estaba construida con engranes
y únicamente podía realizar sumas. Él mandó construir la primera, pero al no gustarle el
resultado se puso a estudiar mecánica para construirla él mismo. Produjo alrrededor de
cincuenta copias y trató de comercializalas, pero desafortunadamente el invento no tuvo
buena acojida, tal vez por que a veces se generaba un error en los acarreos. Actualmente
hay dos versiones de ella, una se encuentra en el Museo Zwinger, en Dresden, Alemania
y la otra se encuentra en el Museo de Artes y Oficios de París.
Blas Pascal
Imagen bajada de: [Link]
Máquina de Engranes
Imagen bajada de: [Link]
3
El tercer antecedente de la computadora fue un diseño que nunca llegó a
construirse pero que mostraba ideas bastante interesantes. Charles Babbage (1791 -
1871) fue un matemático inglés que diseñó lo que él llamó máquina analítica. A esta
máquina se le podía programar una función de cálculo, la cual, una vez programada era
fácil pedirle que calculara la función de cualquier argumento que se le suministrara. Cada
vez que fuera necesario calcular otra función sería necesario reprogramar la máquina.
Charles Babbage
Imagen bajada de:
[Link]
3
Un concepto matemático que resultó ser de gran utilidad para el área de la
computación fue la Máquina de Turing. Desde su juventud el matemático inglés Alan
Mathison Turing (1912 - 1954) tuvo la inquietud de crear una máquina que incorporara
inteligencia. Desde 1928 aproximadamente Turing estuvo trabajando con un problema
llamado problema del paro o the halting problem en donde se requería saber si existían
algoritmos que no terminaran en un tiempo finito. Para resolver este problema era
necesaria una máquina abstracta en la que se pudieran hacer representaciones de la
realidad a la que Turing llamó Máquina de Turing o Turing Machine (TM). Luego ideó otra
máquina capaz de representar cualquier otra máquina incluyéndose a si misma a la que
llamó Máquina Universal de Turing o Universal Turing Machine (UTM). Con el juego de
dos Máquinas Universales, una codificada dentro de otra Turing resolvió el problema del
paro y en 1936 demostró matemáticamente que existen procesos para los cuales no es
posible decidir si terminarán o no en un tiempo finito, llamados procesos indecidibles.
Turing fue solicitado para ayudar en el diseño de una máquina llamada "Bomba"
que exploraba las combinaciones posibles generadas por la máquina codificadora
alemana llamada "Enigma". La Bomba fue una máquina de propósito particular para
descifrar códigos construida electromecánicamente con relés, los cuales son dispositivos
electromecánicos.
3
Turing también trabajó en el desarrollo de la máquina llamada "Colossus" (que
algunos consideran el primer ordenador electrónico) que ya funcionaba con válvulas
electrónicas (tubos de vacío o bulbos) en lugar de relés; gracias a ella los británicos
pudieron mantener alejados a los submarinos alemanes de los barcos de suministro que
cruzaban el Atlántico.
Turing tenía el interés de crear una máquina con la cual pudiera romper los
códigos secretos a una mayor velocidad, lamentablemente nunca fue apoyado para
materializar su idea, no obstante, sus trabajos sirvieron más adelante para desarrollar los
lenguajes de programación y sentó las bases de la Teoría Matemática de la Computación
y de la Inteligencia Artificial.
John Mauchly
Imagen bajada de algún lugar de la red
3
John Eckert
Imagen bajada de algún lugar de la red
3
John von Neumann
Copiado del Libro Introducción a la Computación y a la Programación Estructurada
Guillermo Levine Gutierrez, Mc Graw Hill, 2ª Edición
3
operación “no operation” es “nop”. A estos programas se les llamó ensambladores y por
lo tanto al lenguaje que ensamblaban se le llamó ensamblador. Como había secciones
de código que se repetían se crearon las macros. >Las macros son secciones en código
ensamblador que se insertan cada vez que se invocan y por lo tanto a los programas que
ensamblaban el código se les llamó macro-ensambladores. Cada procesador que es
fabricado debe contar con su macro-ensamblador. Aunque ya no se programa en
ensamblador, aún así, cuando se requiere código super eficiente generalmente éste se
programa en ensamblador.
A finales de los 50's Jhon Backus lidereó un pequeño grupo de IBM que desarrolló
el primer lenguaje de alto nivel que podía ser traducido a lenguaje de máquina, este
lenguaje se llamó FORTRAN (Formula Translator) y su cualidad sorprendente era que los
científicos podían ahora escribir sus formulas casi de la misma manera en la que las
escriben en álgebra. Los físicos aún utlilizan este lenguaje.
En 1960 Jhon McCarty del Massachusetts Institute of Technology (MIT) crea Lisp
(List Processor) en donde un programa se ve como una lista y se programa a través de
funciones recursivas. Lisp es un lenguaje altamente abstracto.
3
a hacer realidad. Aparecieron en el mercado una serie de computadoras personales que
tuvieron cierto éxito, como la Timex Sinclair y la TRS-80 de Radio Shack basadas en el Z-
80 de Zilog (microprocesador de 8 bits) y las famosas Apple basadas en el 6502 de
Motorota (también de 8 bits).
Al darse cuenta IBM del nicho que se estaba abriendo decidió entrar a la
competencia y sacó la Personal Computer (PC) basada en el 8088 de Intel, también de 8
bits, solo que se asoció con una compañía de software que se encargaría de elaborar el
sistema operativo de la máquina. Ésta empresa fue nada más y nada menos que
Microsoft la cual desarrolló el sistema operativo MS-Dos que corre en las PC compatibles
hasta la fecha. Microsoft pactó recibir los pagos por las licencias y es por esto que la
empresa se ha hecho inmensamente rica.
Con las ventanas la Xerox desarrolló una interfaz manual a la que llamó mouse
(del inglés mouse ratón) la cual poco a poco comenzaron a utilizar para la interfaz gráfica
de los sistemas operativos convirtiéndose en un instrumento estándar utilizado
actualmente en las computadoras.
Desde la década de los 80's las redes de computadora comenzaron a tomar auge
ya que las empresas requerían hacer un uso más eficiente de sus recursos apareciendo
diferentes topologías de red y diferentes marcas de redes como Novel y otras más.
3
Estados Unidos propuso un proyecto para hacer un protocolo abierto y así poder
interconectar máquinas de diferente marca. Este agencia propuso el Modelo OSI (Open
Systems Interconection) que es un modelo de siete capas en donde la capa de transporte
la maneja un protocolo de control, Transport Control Protocol (TCP) y la capa de enlace la
maneja el protocolo de internet, Internet Protocol (IP).
Modelo OSI
También apareció una nueva área de inversiones dando lugar al un nuevo índice
de cotizaciones de compañías de software llamado NASDAQ.
3
programas desde lugares remotos, transferir archivos, publicitar bienes y servicios,
información social y gubernamental, oír estaciones de radio, compartir música, etc.
Todo esto está revolucionando al mundo haciendo que el mundo sea cada vez
más pequeño en el sentido del acceso y el alcance de la información, por lo tanto
actualmente las computadoras no solo sirven como herramientas de cálculo, sino también
como herramientas para profesionistas, la oficina, el hogar y para conectarse al mundo.
3
3
EJERCICIOS CAPÍTULO 1 Fecha de entrega: ______________
Nombre (comenzando por el apellido): ________________________________________
1.- ¿Cuales son las máquinas que antecedieron la creación de la computadora? _______
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
2.- ¿Quién sentó las bases de la teoría matemática de la computación? ______________
_______________________________________________________________________
3.- ¿Cuando, donde y quienes fabricaron la primera computadora de la historia? _______
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
4.- ¿Qué nombre le dieron a ésta máquina y cual era su desventaja? ________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
5.- ¿Cual es el nombre del matemático húngaro que propuso un modelo en donde los
programas se manejan como datos? __________________________________________
6.- ¿Qué nombre recibió éste nuevo modelo? ___________________________________
_______________________________________________________________________
7.- ¿Cual es el nombre de la empresa que comenzó a comercializar este hallazgo
científico? _______________________________________________________________
8.- ¿Cuales fueron las etapas de evolución de las computadoras en cuanto a
componentes? ___________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
9.- .- ¿Cuales fueron las etapas de evolución de las computadoras en cuanto a software?
_______________________________________________________________________
3
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
10.- Liste cinco usos que se les puede dar a las computadoras:
______________________
_______________________________________________________________________
_______________________________________________________________________
11.- ¿Cual es la empresa que desarrolló el sistema operativo para las PC's de IBM?
_______________________________________________________________________
12.- ¿Cual es el nombre de la empresa que fabricó el primer navegador en modo gráfico
que apareció en la red? ____________________________________________________
3
2.- SISTEMAS DE NUMERACIÓN
A la celda que puede tomar valores de "0" ó "1" se le llama bit que quiere decir
dígito binario.
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1001
1010
1011
1100
1101
1110
1111
Observe que la primera columna varía de uno en uno, la segunda de dos en dos, la
tercera de cuatro en cuatro y así sucesivamente.
3
Para encontrar el correspondiente decimal de cualquier número de cualquier base
se hace lo siguiente:
2n……… 24 23 22 21 20
con
20 = 1
21 = 2
22 = 4
23 = 8
24 = 16
.
.
1 x 20 + 1 x 21 + 1 x 24 + 1 x 25 = 1 + 2 + 16 + 32 = 5110
El siguiente sistema que nos interesa es el octal. Este sistema está formado por
ocho símbolos. Así tendríamos:
0
1
2
3
4
5
6
7
10
11
12
3
.
.
con
80 = 1
81 = 8
82 = 64
83 = 512
84 = 4096
.
.
Símbolo Decimal
A 10
B 11
C 12
D 13
E 14
F 15
3
Si se agrupan los bits en grupos de tres es fácil convertir un número binario en
octal. Para facilitar las conversiones construiremos una tabla de los primeros dieciséis
números en los cuatro sistemas numéricos.
Ejemplo:
El número 1011011001112
Ahora, si queremos pasar un número en decimal a una base dada lo único que
tenemos que hacer es dividir el número entre la base dada tantas veces como se pueda
hasta que el siguiente cociente ya no se pueda dividir. Los residuos darán los factores en
orden inverso al que vayan apareciendo, y el último factor lo dará el último cociente.
3
Ejemplo: se desea convertir el siguiente número en decimal a hexadecimal
423510
__264_
16 | 4235
103
75
11
_16_
16 | 264
8
_1_
16 | 16
0
_ 0_
16 | 1
1
De esta forma podemos tener números en una determinada base y pasarlos a otra
base si así nos conviene.
Otro método para pasar un número decimal a binario consiste en poner una línea y
dividir el número en dos poniendo el residuo del lado derecho y el cociente en la parte
baja. Esto se repite hasta que el cociente sea cero, el número en binario es el número en
secuencia inversa en la que apareció, ejemplo:
213 |
3
106 | 1
53 | 0
26 | 1
13 | 0
6|1
3|0
1|1
0|1
3
3
3
EJERCICIOS CAPÍTULO 2 Fecha de entrega: ___________
Nombre (comenzando por el apellido): ________________________________________
La calificación se calcula sobre el número total de respuestas, en este caso, 30.
Agregue las operaciones en la parte de atrás.
1.- Utilizando el método de suma de potencias convierta los siguientes números de
binario, octal y hexadecimal a decimal:
110110112 _________________ 46728 _______________ E0F116 __________________
2.- Utilizando el método de divisiones sucesivas convierta los siguientes números de
decimal a binario, octal y hexadecimal:
4010 _____________________ 8010 __________________ 10010 _____________________________
3.- Utilizando el método de agrupamiento convierta los siguientes números al sistema de
numeración octal y hexadecimal.
3
5. – Utilizando el método de divisiones sucesivas convierta los siguientes números a
hexadecimal, binario y octal.
14710 15810 13610
______________________16 ___________________16 ___________________16
______________________2 ___________________2 ____________________2
______________________8 ___________________8 ____________________8
6.- Utilzando el método de suma de potencias convierta los siguiente números de binario,
octal y hexadecimal a decimal:
101100112 _______________10 33338 _____________10 ABCD16 _________________10
3
3.- REPRESENTACIÓN DE LA INFORMACIÓN
NÚMEROS ENTEROS
Los números que son más fáciles de representar en una computadora son los
números enteros ya que para su almacenaje y su recuperación los procedimientos son
sencillos. Es imposible representar en la computadora al conjunto infinito de números, ya
que para esto se requeriría una memoria infinita, además no todos los números son
usados, por lo que acortando el intervalo se puede tener una representación bastante útil.
La representación del signo se puede hacer tomando el primer bit a la izquierda como el
signo, un 0 representa un signo positivo y un 1 representa un signo negativo. El número
de bytes razonable para un buen intervalo es de 16. Un byte está constituido por ocho
bits. Por lo tanto, un número entero está representado generalmente por dos bytes. El
intervalo de números que podemos representar con dieciséis bits es [+32,767, -32,767]
pasando por el 0.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
214+213+212+210+29+28+27+26+25+24+23+22+21+20 = 32,767
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
= +0
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
= -32,767
Es importante hacer ver al lector que cada vez que ingresa un número a la
computadora entra a una memoria donde una vez capturado como cadena de símbolos
se procesa para ser almacenado en forma binaria y cada vez que se desea ver un
número en la pantalla la computadora tiene que hacer el proceso inverso para mostrarlo
3
como una cadena de símbolos. Las operaciones aritméticas dentro de la computadora se
realizan en binario.
Ya vimos como se representan los números enteros, pero resulta que hay
problemas en donde se manejan escalas mayores que las anteriores, ¿qué hacer? La
solución a éste problema son los números en notación científica o de punto flotante.
Éstos constan de dos partes, una que es la mantisa y otra que es el exponente. El
exponente se representa con un número entero y la mantisa con un número fraccionario
en donde el punto es imaginario y se representa a su lado izquierdo.
1e-38
1.0000000000E-38
3
y si se da la siguiente entrada:
1e38
1.0000000000E38
con la entrada:
0.555555555555
5.5555555555E-1
0.5555555555555
5.55555555556E-1
Con tres bits tenemos ocho combinaciones por lo que todavía no alcanzamos un
orden de magnitud.
3
Con cuatro bits ya tenemos 16 combinaciones y como ya rebasamos la primera
potencia de diez, es decir, 101 ya podemos representar un orden, aunque nos sobrarán
seis combinaciones, lo que quiere decir que con cuatro bits en realidad podemos
representar poco más de un orden de magnitud.
Debido a que las potencias en binario no coinciden con las potencias de diez las
representaciones con cierto número de bits no representan órdenes de magnitud
cerrados en decimal por lo que los órdenes sólo nos dan un parámetro cualitativo para
medir la precisión de una determinada representación.
Así, existen dos formas de evaluar una representación, una es por el intervalo de
los números representados y otra por las cifras significativas o los ordenes de magnitud
cubiertos.
3
Número de bits Número de combinaciones
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1K
11 2K
12 4K
13 8K
14 16K
15 32K
16 64K
17 128K
18 256K
19 512K
20 1M
21 2M
22 4M
23 8M
24 16M
25 32M
26 64M
27 128M
28 256M
29 512M
30 1KM
31 2KM
32 4KM
33 8KM
34 16KM
35 32KM
36 64KM
37 128KM
38 256KM
39 512KM
40 1MM
41 2MM
42 4MM
3
Observe que cada diez bits el número de combinaciones crece en tres órdenes de
magnitud. Se puede obtener la siguiente tabla:
Para obtener el complemento a uno lo único que hay que hacer es cambiar los 1's
por 0's y viceversa, ejemplo:
10011001
+ 00000001
10011010 -102
Para mostrar que son opuestos en signo los números los sumamos y obtenemos:
01100110 +102
+ 10011010 + -102
100000000 0
00110100 +52
11001100 -52
3
Esto se puede extender a números de n bytes.
representa 1 x 2 -1 = ½ = 0.5
de tal manera que es posible aproximar un número con fracciones de potencias de dos.
Es claro que habrá números que sean exactos, pero habrá números que no. Si un
número es la suma de algunas o todas las fracciones se representará exacto, de otra
forma se hará una aproximación. Con 42 bits la aproximación será funcional.
La representación de la mantisa negativa no se hace en complemento a dos.
Generalmente se hace en representación con signo, es decir la mantisa es positiva
siempre, únicamente el signo es positivo o negativo. Esto hace que las operaciones de
números en punto flotante se lleven más tiempo. Actualmente los procesadores constan
de una unidad que hace las operaciones en punto flotante para hacer más rápido este
proceso.
CARACTERES ALFANUMÉRICOS
3
La tabla del código ASCII extendido es la siguiente:
0 0 NULL null
1 1 SOH start of heading
2 2 STX start of text
3 3 ETX end of text
4 4 EOT end of transmission
5 5 ENQ enquiry solicitud de envío
6 6 ACK acknoledge reconocimiento
7 7 BELL bell campana
8 8 BS backspace retroceso
9 9 HT horizontal tab tabulador horozpntal
10 A LF line feed salto de línea
11 B VT vertical tab tabulador vertical
12 C FF form feed nueva página
13 D CR cariage return regreso de carro
14 E SO shift out
15 F SI shift in
16 10 DLE data link escape
17 11 DC1 device control 1
18 12 DC2 device control 2
19 13 DC3 device control 3
20 14 DC4 device control 4
21 15 NAK negative acknowledge
22 16 SYN synchronous idle
23 17 ETB end of trans. block
24 18 CAN cancel
25 19 EM end of medium
26 1A SUB substitute
27 1B ESC escape escape
28 1C FS file separator
29 1D GS group separator
30 1E RS record separator
31 1F US unit separator
32 20 SPACE Espacio
33 21 !
34 22 "
35 23 #
36 24 $
37 25 %
38 26 &
39 27 '
40 28 (
41 29 )
42 2A *
3
43 2B +
44 2C ,
45 2D -
46 2E .
47 2F /
48 30 0
49 31 1
50 32 2
51 33 3
52 34 4
53 35 5
54 36 6
55 37 7
56 38 8
57 39 9
68 3A :
69 3B ;
60 3C <
61 3D =
62 3E >
63 3F ?
64 40 @
65 41 A
66 42 B
67 43 C
78 44 D
79 45 E
70 46 F
71 47 G
72 48 H
73 49 I
74 4A J
75 4B K
76 4C L
77 4D M
78 4E N
79 4F O
80 50 P
81 51 Q
82 52 R
83 53 S
84 54 T
85 55 U
86 56 V
87 57 W
88 58 X
89 59 Y
3
90 5A Z
91 5B [
92 5C \
93 5D ]
94 5E ^
95 5F _
96 60 `
97 61 a
98 62 b
99 63 c
100 64 d
101 65 e
102 66 f
103 67 g
104 68 h
105 69 i
106 6A j
107 6B k
108 6C l
109 6D m
110 6E n
111 6F o
112 60 p
113 71 q
114 72 r
115 73 s
116 74 t
117 75 u
118 76 v
119 77 w
120 78 x
121 79 y
122 7A z
123 7B {
124 7C |
125 7D }
126 7E ~
127 7F DEL
128 80 Ç
129 81 ü
130 82 é
131 83 â
132 84 ä
133 85 à
134 86 å
135 87 ç
136 88 ê
3
137 89 ë
138 8A è
139 8B ï
140 8C î
141 8D ì
142 8E Ä
143 8F Å
144 90 É
145 91 æ
146 92 Æ
147 93 ô
148 94 ö
149 95 ò
150 96 û
151 97 ù
152 98 ÿ
153 99 Ö
154 9A Ü
155 9B ø
156 9C £
157 9D Ø
158 9E ×
159 9F ƒ
160 A0 á
161 A1 í
162 A2 ó
163 A3 ú
164 A4 ñ
165 A5 Ñ
166 A6 ª
167 A7 º
168 A8 ¿
169 A9 ®
170 AA Ñ
171 AB ½
172 AC ¼
173 AD ¡
174 AE «
175 AF »
176 B0
177 B1
178 B2
179 B3
180 B4
181 B5 Á
182 B6 Â
183 B7 À
3
184 B8 ©
185 B9
186 BA
187 BB
188 BC
189 BD ¢
190 BE ¥
191 BF
192 C0
193 C1
194 C2
195 C3
196 C4
197 C5
198 C6 ã
199 C7 Ã
200 C8
201 C9
202 CA
203 CB
204 CC
205 CD
206 CE
207 CF ¤
208 D0 ð
209 D1 Ð
210 D2 Ê
211 D3 Ë
212 D4 È
213 D5 i
214 D6 Í
215 D7 Î
216 D8 Ï
217 D9
218 DA
219 DB
220 DC
221 DD
222 DE
223 DF
224 E0 Ó
225 E1 ß
226 E2 Ô
227 E3 Ò
228 E4 õ
229 E5 Õ
230 E6 é
3
231 E7 þ
232 E8 Þ
233 E9 Ú
234 EA Û
235 EB Ù
236 EC ý
237 DE Ý
238 EE ¯
239 FF ´
240 F0
231 F1 ±
232 F2
243 F3 ¾
244 F4
245 F5 §
246 F6 ÷
247 F7 ¸
248 F8 °
249 F9 ¨
250 FA ·
241 FB ¹
242 FC ³
253 FD ²
254 FE
255 FF
3
EJERCICIOS CAPÍTULO 3 Fecha de entrega: ______________
Nombre (comenzando por el apellido): ________________________________________
La calificación se calcula sobre el número total de respuestas, en este caso, 30.
1.- ¿Qué intervalo de números se puede representar con ocho bits y en donde uno es
para el signo? ____________________________________________________________
2.- ¿Qué intervalo de números se puede representar dieciseis bits y en donde un bit es
para el signo? ____________________________________________________________
3.- ¿Cuántas cifras significativas se logran con una mantisa de cinco bits y en donde un
bit es para el signo? _______________________________________________________
4.- ¿Cuántas cifras significativas se logran con una mantisa deocho bits y en conde un bit
es para el signo? _________________________________________________________
5.- ¿Cuántas cifras significativas se logran con una mantisa de dos bytes en donde un bit
es el signo? _____________________________________________________________
6.- ¿Cuántas cifras significativas se logran con una mantisa de cuatro bytes en donde un
bit es para signo? ________________________________________________________
7.- ¿Cuántas cifras significativas se logran con una mantisa de 42 bits en donde un bit es
para el signo? ____________________________________________________________
8.- Escriba el número en decimal con signo al que corresponden los siguientes números:
010100112 001111012 010011102 010101012 011111112
________10 ________10 ________10 ________10 _________10
9.- Escriba su complemento a 1(1’):
________ ________ ________ _________ _________
10.- Escriba su complemento a 2 (2’):
_________ _________ _______ ________ _________
11.- Escriba el correspondiente en decimal con signo de los números anteriores en
representación 2’ con signo:
________10 _______10 ________10 ________10 ________10
12.- ¿Qué pasa si se le saca el complemento a 2 dos veces a un número? ____________
_______________________________________________________________________
_______________________________________________________________________
3
13.- Escribir la cadena "hola mundo" en código ASCII en hexadecimal:
3
4.- DESCRIPCIÓN DE UNA COMPUTADORA
DESCRIPCIÓN FÍSICA
Desde el punto de vista físico una computadora está formada básicamente de tres
partes:
a) El procesador
b) La memoria
c) Puertos de Entrada/Salida
Estas tres partes interactúan como una pequeña ciudad en donde la memoria
funciona como un almacén de datos, el procesador toma datos de la memoria, los
procesa y regresa los resultados y finalmente los puertos de entrada/salida (input/output)
a través de los cuales la información entra y sale de la computadora.
Para que los datos puedan viajar dentro de la ciudad es necesario crear autopistas
para que los datos viajen. Esta autopista para los datos se conoce como canal de datos
(Data Bus) donde los datos se suben para viajar a través de él.
Para saber a que dirección se requiere acceder se utiliza un canal llamado canal
de direcciones (Address Bus) a través del cual el microprocesador direcciona el registro
que desea acceder.
Para que los datos sean aportados a los canales se utilizan una serie de líneas de
control que le indican a los diferentes componentes cuando deben aportar su dato al
canal, y a los que lo van a recibir, cuando deben hacer la captura del dato. Las dos líneas
más importantes de este canal son habilita salida (Output Enable o OE) y habilita captura
(Latch Enable o LE) las cuales llegan a la mayoría de los componentes. Estas líneas
salen de la Unidad de Control, la cual está dentro del procesador
Dentro del procesador se encuentran los registros auxiliares, los cuales sirven
como almacenamiento temporal de la información. Además de registros, dentro del
procesador se encuentra una Unidad Aritmética Lógica (Arinmetic Logic Unit o ALU) a
través de la cual el procesador es capaz de realizar operaciones aritméticas tales como
sumas y restas, y lógicas tales como “and”, “or”, “not” entre los bits de los los registros.
3
normalmente sirve como fuente y destino de las operaciones aritméticas y lógicas.
Después de ejecutar la operación, el resultado, el cual queda en el acumulador, se envía
a memoria.
El lector se podrá preguntar ¿Y qué pasa con el teclado, el monitor y las unidades
de disco? Todas estas son accedidas a través de puertos. Internamente para la
computadora es lo mismo un monitor que una impresora, ya que las dos son salidas, lo
3
único que varía son los programas que controlan las diferentes salidas de la
computadora.
Se ha dado en llamar CPU (Central Processing Unit o CPU) a la caja que contiene
la tarjeta madre (Mother Board) y las unidades de disco, pero en realidad el CPU está
adentro y es únicamente el procesador o actualmente llamado microprocesador ya que
está en una sola pastilla de silicio.
3
DESCRIPCIÓN LÓGICA
Por lo tanto, una gramática formal está constituida por un conjunto de reglas de
producción, son esquemas generativos, modelos dinámicos para generar frases de un
lenguaje.
Las reglas de producción son como su nombre lo indica reglas que se aplican para
generar cadenas pertenecientes al lenguaje.
G = ( {S}, {0,1}, P, S)
1.- S 0S1
2.- S 01
3
S 01 (la doble flecha representa la aplicación de alguna regla)
S 0S1
0S1 0011
que ya es una cadena terminal y por lo tanto pertenece al lenguaje que produce
esta gramática.
Así, las reglas de producción son, como su nombre lo indican, reglas que al
aplicarlas producen cadenas con símbolos terminales y no terminales. Las cadenas que
constan únicamente de símbolos terminales constituyen las cadenas que forman el
lenguaje. Un símbolo es terminal cuando ya no se puede aplicar sobre él ninguna regla
de producción, ejemplo "0" o "1". Ejemplo de no terminal "S".
Reconocedor Gramática
Máquina de Turing Tipo 0
Autómata Lineal Tipo 1 (Sensible al contexto)
Autómata de Pila Tipo 2 (Independiente del contexto)
Autómata Finito Tipo 3 (Regular)
Los compiladores son autómatas de pila, lo que quiere decir que reconocen
lenguajes generados por gramáticas de tipo 2, independientes del contexto.
3
El término computabilidad proviene de computo. En los despachos de contabilidad
había trabajadoras especializadas que su único trabajo era realizar cómputos, es decir
operaciones aritméticas. Turing tomó de estas el término computable ya que la máquina
que el ideó era capaz de realizar el mismo trabajo que una de estas secretarias. Una
secretaria solo necesita papel y lápiz para realizar sus cómputos, de la misma manera la
máquina de Turíng solo necesita una cinta infinita y una cabeza lectora-escritora para
hacer sus cómputos. La máquina de Turing se puede programar mediante una tabla de
estímulo-respuesta y de esta forma, una vez que se inicia el proceso, la máquina realiza
los cómputos indicados por su tabla de estímulo-respuesta. Por lo tanto, un problema es
computable cuando existe una máquina de Turing que se puede programar para resolver
el problema, es decir, cuando existe una descripción algorítmica para resolver el
problema.
Así pues, los datos se representan con 1’s y 0’s y los algoritmos son descripciones
de procesos sobre ciertos datos. Una representación es el ejercicio de representar una
cosa por otra, ejemplo un capacitor descargado puede representar un valor lógico “falso”
o un símbolo “0” y uno cargado puede representar un valor lógico “verdad” o un símbolo
“1” en un determinado proceso. Una descripción es un relato que cuenta como es cierto
objeto, proceso o hecho. Ejemplo: un escritor puede hacer una descripción de una tarde
soleada de primavera en algún lugar paradisiaco.
3
EJERCICIOS CAPÍTULO 4 Fecha de entrega: ______________
Nombre (comenzando por el apellido): ________________________________________
1.- Desde el punto de vista físico ¿Cuáles son las tres partes más importantes de que
consta una computadora y qué funciones tienen? ________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
2.- ¿Qué función tiene el canal de datos? ______________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
3.- ¿Qué función tiene el canal de direcciones? _________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
4.- ¿Qué función tienen las líneas de control? ___________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
5.- ¿Para qué sirve la Unidad Aritmética/Lógica? ________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
6.- ¿Para que sirve el DMA? ________________________________________________
3
_______________________________________________________________________
_______________________________________________________________________
7.- ¿Qué es el código de máquina? ___________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
8.- ¿Qué son las interrupciones? _____________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
9.- ¿Cuáles son las dos formas de transmitir datos de una computadora? _____________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
10.- ¿Desde el punto de vista lógico cual es la idea en la que se basa la creación de la
computadora?____________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
11.- ¿Qué es un autómata? _________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
12.- ¿Qué es una gramática? ________________________________________________
_______________________________________________________________________
_______________________________________________________________________
3
_______________________________________________________________________
_______________________________________________________________________
13.- ¿Qué son las reglas de producción? ______________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
14.- ¿Qué es un compilador? ________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
15.- ¿Qué es programar? ___________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
16.- ¿Que significa que un proceso sea computable? _____________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
______________________________________________________________________
17.- ¿Qué es una descripción y de un ejemplo? _________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
18.- ¿Qué es una representación y de un ejemplo? ______________________________
_______________________________________________________________________
_______________________________________________________________________
3
_______________________________________________________________________
_______________________________________________________________________
3
5.- MÉTODO DE CASCADA
El método de cascada está formado por seis etapas, en donde una vez completada
cada etapa, se va pasando a la siguiente no existiendo la posibilidad del regresar, de ahí
el nombre del método.
3
El algoritmo solución puede ser expresado en lenguaje natural y además se puede
hacer en forma de especificación, como si fuera una receta de cocina. Algunos problemas
matemáticos ya tienen un algoritmo solución por lo que no hay necesidad de buscarlo. En
ocasiones la solución está expresada en lenguaje matemático y en otras lo podemos
conceptualizar en la mente aunque es recomendable transcribirlo en lenguaje natural.
3.- PROGRAMACIÓN
3
La sintaxis trata acerca de las reglas de construcción de los enunciados de un
lenguaje. Ejemplo: la sintaxis de la gramática del Español marca que una oración debe
estar constituida por las siguientes partes, sujeto, verbo y complemento. De la misma
forma, los enunciados en un programa deben de estar constituidos dados los siguientes
casos:
4.- CODIFICACIÓN
3
En esta etapa se procede a la codificación del programa en un lenguaje formal. Un
lenguaje formal es aquel generado por una gramática desde el punto de vista de la teoría
matemática de la computación. Es posible construir un reconocedor para cualquier
cadena que pertenezca a este lenguaje. A este reconocedor se le llama Compilador. Para
elaborar cadenas válidas de este lenguaje es necesario que el programador conozca
perfectamente las reglas de sintaxis del lenguaje que se va a utilizar como herramienta,
así como sus recursos y particularidades.
En este paso si es importante respetar con todo rigor las reglas de sintaxis ya que
de otra manera el programa o no se compilará correctamente o no realizará la tarea que
se desea que realice, además de que no debe de haber errores tipográficos. Un error
tipográfico es aquel en donde se escribe un carácter por otro, o se escribe doble o no se
escribió en una palabra, ejemplo: en lugar de escribir “if” escribir “iff”.
5.- CARGA
Deberemos probar que nuestro programa corra con los ejemplos hechos en la
etapa de programación para verificar que el algoritmo funciona como deseamos y
posteriormente con casos límite y con entradas absurdas para ver cómo se comporta en
éstos casos.
Es importante que la primera versión del programa sea una versión sencilla, sin
muchos adornos ya que el punto es que resuelva el problema. Más adelante se le pueden
poner adornos o mejorar la presentación con la seguridad de que el programa ya corre.
En muchas ocasiones los programadores se comen el tiempo poniendo adornos a sus
programas fallando en el tiempo de entrega. De nada servirán todos los adornos si el
programa no corre.
Se debe tener cuidado al poner los filtros y validación de entradas para que el
programa no deje de mostrar su objetivo más importante.
3
6.- MANTENIMIENTO DEL SISTEMA
Esta etapa se realiza normalmente en los sistemas grandes ya que cuando entran
en operación es posible que durante su uso se detecten fallas o se promuevan mejoras,
por lo que debe de haber un equipo de personas que se encarguen de darle
mantenimiento al sistema. En el desarrollo de los sistemas grandes es necesario que
éstos queden bien documentados ya que en caso de requerir algún cambio toda la
información debe estar disponible. Todos los proyectos grandes llevan un registro donde
se almacena toda la información del sistema.
3
3
EJERCICIOS CAPÍTULO 5 Fecha de entrega: ______________
Nombre: ________________________________________________________________
1.- Describa el método de desarrollo de cascada y explique brevemente cada una de sus
etapas: _________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
2.- ¿Qué es un algoritmo? __________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
3.- ¿Qué es el pseudocódigo? _______________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
4.- ¿Qué es un lenguaje natural? _____________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
5.- ¿Qué es un lenguaje estructurado? ________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
6.- ¿Cuales son las reglas de sintaxis? ________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
3
3
6.- ESTRUCTURA DE UN PROGRAMA, ENUNCIADOS, ENUNCIADOS DE
ASIGNACIÓN, PALABRAS RESERVADAS E IDENTIFICADORES
El programa que rige las actividades de todo el programa es llamado programa
principal. Este programa puede ser ayudado por otros subprogramas llamados módulos,
procedimientos o subrutinas.
Declaraciones de variables
Las declaraciones de variables sirven, como su nombre lo dice, para declarar las
variables que se van a utilizar en el programa. No es posible utilizar una variable que no
se haya declarado antes.
A, B, C: entero;
D, E, GradosFahrenheit: real;
H: char;
Nombre: cadena[10];
0.5 - A + B * C / (D * Seno(X)) - 2
3
Una constante es una cadena de caracteres numéricos que representan una
cantidad. Ejemplo:
4, 0.5, -3.2
Una función es un código predefinido que calcula un valor a través de uno o varios
argumentos y se sustituye en su invocación. En todos los lenguajes existen un conjunto
de funciones predefinidas o bibliotecas de funciones predefinidas. Ejemplos:
A←5
A←B
A ← Seno (1.0)
A ← 5 + B * Seno (1.0)
3
Ya que el orden en la ejecución de los operadores en una expresión genera
resultados distintos es necesario tener un orden de precedencia de operadores para no
tener ambigüedad en la evaluación. El orden de precedencia es el criterio para resolver el
orden de evaluación en una expresión.
Ejemplo:
Las expresiones:
A←B+D*C
A ← (B + C ) * D
3
compilador marcará un error, por lo tanto, es importante que el programador verifique que
el dato que se le va a asignar a una variable sea del mismo tipo de la variable, ejemplo:
C := A / B;
La operación A / B produce un resultado real, por lo que C debe ser de tipo real, si
no se hace de esta manera el compilador marcará un error.
A ← B + C * D - E div F / G
\____/
T1
\_____/
T2
\______/
T3
\______/
T4
\_____________/
A
En la siguiente expresión los paréntesis son los que tienen la mayor precedencia
por lo que las expresiones que se encuentren entre paréntesis se evalúan primero,
ejemplo:
D ← A * (B + C)
\_____/
T1
\_______/
D
3
c = 5 * (f – 32)/9
c = 5.0 * (f – 32)/9
programa Suma
A, B, C: entero
comienza
Lee(A)
Lee(B)
C=A+B
Escribe(C)
termina
program Suma;
var
A, B, C: integer;
begin
3
ReadLn(A);
ReadLn(B);
C := A + B;
WriteLn(C)
end.
#include <stdio.h>
main()
{
int a, b, c;
scanf(“%d”, &a);
scanf(“%d”, &b);
c = a + b;
printf(“%d”, c);
}
3
WriteLn(‘El valor de ‘, Celsius:12:2’, ‘grados Celsius corresponde a ‘,
Fahrenheit:12:2, ‘ grados fahrenheit’);
En C esto sería:
La cadena “\n” indica que se hará un salto de línea después de haber desplegado
la línea.
3
Para ayudar al estudiante se han incluido las tablas del orden de precedencia de
operadores de C y las tablas de descripción de las funciones scanf y printf.
Operadores Asociatividad
( ) [ ] -> Izquierda a derecha
! - ++ -- + - * & (tipo) sizeof Derecha a izquierda
* / % Izquierda a derecha
+- Izquierda a derecha
<< >> Izquierda a derecha
< <= > >= Izquierda a derecha
== != Izquierda a derecha
& Izquierda a derecha
^ Izquierda a derecha
| Izquierda a derecha
&& Izquierda a derecha
|| Izquierda a derecha
?: Derecha a izquierda
= += -= *= /= %= &= ^= |= <<= >>= Derecha a izquierda
, Izquierda a derecha
3
Carácter Dato de entrada; tipo de argumento
D entero decimal; int *.
I entero; int *. El entero puede estar en octal (iniciando con 0) o
hexadecimal (iniciando con 0x o 0X).
O entero octal (con o sin cero al principio); int *.
U entero decimal sin signo; unsigned int *.
X,x entero exadecimal (con o sin 0x o 0X al principio); int *.
C caracteres; char *. Los siguientes caracteres de entrada se podrán en el
arreglo indicado, hasta el número dado por el ancho de campo; el valor
por omisión es 1. No se agrega ‘\0’. En este caso se suprime el salto
normal sobre los caracteres de espacio en blando; para leer el siguiente
carácter que no sea blanco, use %ls.
S cadena de caracteres que no es espacio en blanco (no
entrecomillados);char *, apunta a un arreglo de caracteres
suficientemente grande para contener la cadena y un ‘\0’ terminal que se
agregará.
e,f,g número de punto flotante; float *. El formato de entrada para los float es
un signo optativo, una cadena de números posiblemente con un punto
decimal, y un campo optativo de exponente con una E o e seguida
posiblemente de un entero con signo.
P valor apuntador como se imprime por printf(“%p”); void *.
N escribe en el argumento el número de caracteres escritos hasta el
momento por esta llamada; int *. No se lee entrada alguna. La cuenta de
elementos convertidos no se incrementa.
[...] coincide con la mayor cadena no vacía de caracteres de entrada del
conjunto entre corchetes ; char *. Se agrega un ‘\0’. [ ] ...] incluye en el
conjunto.
[ˆ...] coincide con la mayor cadena no vacía de caracteres de entrada que no
sean del conjunto entre corchetes; char *. Se agrega un ‘\0’. [ˆ]...] incluye ]
en el conjunto
% literal; no se hace ninguna asignación.
3
Carácter Tipo de argumento; Convertido a
d, I int; notación decimal con signo
O int; notación octal sin signo (sin ceros al principio
X,x int; notación hexadecimal sin signo (sin 0x o 0X al principio), utilizando
abcdef para 0x o ABCDF para 0X.
U int; notación decimal sin signo.
C int; carácter sencillo, después de la conversión a unsigned char.
S char *s; los caracteres de la cadena son impresos hasta que se alcanza
un ‘\0’ o hasta que ha sido impreso el número de caracteres indicados por
la presición.
F double; notación decimal de la forma [-][Link], en donde el número de
d es especificado por la precisión. La precisión por omisión es 6; una
precisión 0 suprime el punto decimal.
E,e double; notación decimal de la formma [-][Link]±xx o [-
][Link]±xx, en donde el número de d está especificado por la
precisión. La precisión por omisión es 6; una precisión 0 suprime el punto
decimal.
G,g double; usa %e o %E si el exponente es menor que –4 o mayor o igual
que la precisión; de otra forma es usado %f. Los ceros y el punto decimal
al finar no son impresos.
P void *; imprime como un apuntador (representación dependiente de la
implantación).
N int *; en número de caracteres escritos hasta el momento por esta
llamada a printf es escrito en el argumento. No es convertido ningún
argumento.
% No es convertido ningún argumento; se imprime como %.
3
Secuencia de escape Acción
\a Character de alarma (campana)
\b Retroceso
\f Avance de hoja
\n Nueva línea
\r Regreso de carro
\t Tabulador horizontal
\v Tabulador vertical
\\ Diagonal invertida
\? Interrogación
\’ Apóstrofo
\” Comillas
\ooo Número octal
\xhh Número hexadecimal
3
Programa Principal
/ | \
/ \ \ \
PALABRAS RESERVADAS
Ya que en un lenguaje se tienen que emplear ciertas palabras para los tipos de
datos y la sintaxis de las estructuras de control no será posible utilizar una de estas
palabras como un identificador de variable, procedimiento o función. Por lo tanto palabras
como “programa”, “entero”, “real”, “carácter”, “comienza”, “termina”, “si” y todas las demás
que utilice el lenguaje se les da el nombre de palabras reservadas y a ninguna variable,
procedimiento o función podrá dársele el nombre de una de ellas.
IDENTIFICADORES
3
se le asigna a una variable o a un procedimiento o a una función. Cada lenguaje tiene sus
reglas para los nombres de identificadores. Una regla general es que un identificador no
puede comenzar con un número, esto se debe a que al leer una cadena si el compilador
detecta que el primer carácter es un número sabe que se trata de una cadena que
significa número, en cambio si la cadena comienza con letra tendrá que ser o un
identificador o una palabra reservada.
El nombre con el que se "bautice" a una variable deberá reflejar su función dentro
del programa y es muy importante que sea el nombre adecuado para que el programa se
autoexplique. La tipografía que se recomienda es escribir los identificadores con la
primera letra en mayúscula y las restantes en minúscula. Si el nombre del identificador es
compuesto, concatenar las palabras poniendo en mayúscula la primera letra de cada
palabra, ejemplo:
GradosFahrenheit
GrdsFhrnheit
Cont para Contador, Temp para temporal, Pot para potencia Fact para Factorial.
grados_fahrenheit
3
También es importante comentar que es buena práctica escribir como comentarios
quién y cuando se escribió el programa con el propósito de llevar un mejor de control de
versiones del programa.
3
EJERCICIOS CAPÍTULO 6 Fecha de entrega: ______________
Nombre: ________________________________________________________________
1.- ¿Qué estructura tiene un programa? _____________________________________
_______________________________________________________________________
_______________________________________________________________________
2.- ¿De qué elementos está constituido un programa? ____________________________
_______________________________________________________________________
3.- ¿Qué es un enunciado? _________________________________________________
_______________________________________________________________________
_______________________________________________________________________
4.- De un ejemplo de un enunciado de asignación: ______________________________
_______________________________________________________________________
5.- De un ejemplo de enunciado de llamado a procedimiento: ______________________
_______________________________________________________________________
6.- ¿Cuales son los procedimientos estándar en Turbo Pascal? ____________________
_______________________________________________________________________
_______________________________________________________________________
7.- ¿Cómo se le llama a la estructura que forma el programa principal, sus procedimientos
y funciones? _____________________________________________________________
8.- Obtenga el orden e evaluación de la siguiente expresión:
G ← A div B * C + D / E - F
3
9.- Obtenga el orden e evaluación de la siguiente expresión:
G ← A + B * C / Sqr( D + E) - F
Pseudocódigo:
3
Turbo Pascal:
C:
Pseudocódigo:
3
Turbo Pascal:
C:
SMI SMD
1 Milla 1.6093 Km
1 Libra 2.2 Kg
1 Galón 4.5461 Lt
SMD SMI
1 Km 0.6214 Millas
1 Kg 0.436 Libras
1 Lt 0.26 Galones
C = 5/9 (F – 32)
F = 9/5 C + 32
3
16.- Un programa que haga la conversión de Kilogramos a Libras.
17.- Un programa que haga la conversión de Litros a Galones.
18.- Un programa que haga la conversión de Galones a Litros.
19.- Un programa que haga la conversión de Grados Centígrados a Grados Fahrenheit.
20.- Un programa que haga la conversión de Grados Fahrenheit a Grados Centígrados.
21:- Un programa que calcule la ecuación una recta en función de la variable de entrada
X. M y B deben ser constantes numéricas.
22.- Un programa que calcule el valor de una función de segundo grado también en
función de X.
y = c0 + c1 x + c2 x2
23.- Un programa que calcule el valor de una función de tercer grado también en función
de X.
y = c0 + c1 x + c2 x2 + c3 x3
3
3
7.- LÓGICA PROPOSICIONAL
La lógica fue una de las ciencias desarrollada por Aristóteles en Grecia en el siglo
III antes de Cristo. Básicamente la preocupación de Aristóteles era encontrar las leyes
que regían la mecánica del pensamiento. Así fue como definió el silogismo. Un ejemplo
de silogismo es el siguiente.
La lógica fue una esperanza para poder verificar si las estructuras propuestas por
los filósofos eran consistentes. Prácticamente después de Aristóteles los avances de la
lógica estuvieron detenidos hasta el siglo XIX. Varios filósofos y matemáticos
contribuyeron al nacimiento de la lógica moderna como lo son Augustus De Morgan,
George Boole, Leibinitz, Euler, Lambert y Bolzano.
George Boole hace la aportación del álgebra de Boole en donde se puede tener
variables lógicas y trabajar con ellas en expresiones cualquiera que sea su valor, falso o
verdadero. En lógica no es posible que una proposición sea falsa y verdadera al mismo
tiempo, tiene que ser falsa o verdadera pero no ambas.
Augustus De Morgan aporta leyes que trabajan sobre el álgebra de Boole las
cuales permiten manipular expresiones booleanas ya sea para reducirlas o para
encontrar otras expresiones equivalentes. La lógica combinatoria de las computadoras
aprovecha estas leyes para el diseño de la parte combinatoria de las computadoras.
3
A puede representar cualquiera de las siguientes proposiciones:
La pelota es redonda.
El cubo tiene seis caras.
El triángulo tiene cinco lados.
Las constantes son términos con significado preciso. Las constantes en lógica
proposicional únicamente son dos, falso y verdadero.
Se emplea una notación tabular muy común llamada tabla de verdad para indicar
los valores que toman las expresiones con las diferentes combinaciones de valores
lógicos y los operadores.
p ¬p
V F
F V
p q p^q
F F F
F V F
V F F
V V V
3
Se define la disyunción de p y q, denotada p v q como aquella que es verdadera
cuando p o q o ambas son verdaderas y falsa en caso contrario. Esto se conoce como el
"o inclusivo", que en latín se llama vel, de donde proviene el símbolo v.
p q pνq
F F F
F V V
V F V
V V V
Cuando en una expresión booleana que contiene variables se sustituyen estas por
constantes ésta se convierte en una función proposicional la cual tiene la característica de
tener uno y sólo uno de los valores permitidos, es decir, una función proposicional
únicamente puede ser verdadera o falsa, pero no ambas.
Ejemplo:
(A ^ B) v C
(la pelota es redonda y el cubo tiene seis caras) o el triángulo tiene cinco lados
Al evaluar cada término el lector puede comprobar que el valor de esta función
proposicional es verdadero.
3
Operador Interpretación
= igual que
> mayor que
< menor que
≥ mayor o igual
≤ menor o igual
A > B, C = D, E ≤ G
En donde las variables pueden ser enteros o reales, con el cuidado de no utilizar el
operador identidad "=" entre reales ya que la probabilidad de que un real llegue a ser
igual que otro es relativamente cero, por lo que esta expresión nunca sería verdadera.
(A + B ) ∙ C’
(A + B)’ = A’ · B’ y (A · B)’ = A’ + B’
Las reglas de precedencia para evaluar estos operadores serán las siguientes:
1° La evaluación es recursiva
2º Se evalúa lo que está entre paréntesis
3° Se evalúan los operadores relacionales
4º Se evaúal los operadores de negación
5° Se evalúan los operadores lógicos de izquierda a derecha.
3
Español Inglés Lógica Álgebra de Boole
Proposicional
o or +
y and
no not ’
3
3
EJERCICIOS CAPÍTULO 7 Fecha de entrega: ______________
Nombre: ________________________________________________________________
(La calificación se calcula sobre el número total de respuestas, en este caso, 24.)
1.- ¿Quién el padre de la lógica? _____________________________________________
2.- ¿Qué aportación hace George Boole a la lógica proposicional? __________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
3.- ¿Qué aportación hace Augustus De Morgan a la lógica proposicional? ____________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
4.- ¿Qué es una variable lógica? _____________________________________________
_______________________________________________________________________
_______________________________________________________________________
5.- ¿Qué es una constante lógica? _________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
6.- ¿ Qué es una tabla de verdad? ____________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
7.- ¿ Cómo se define la negación? ___________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
8.- ¿Cómo se define la conjunción? ___________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
3
9.- ¿Cómo se define la disyunción inclusiva? ___________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
10.- ¿Cómo se define la disyunción exclusiva? __________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
11.- ¿Qué operadores son conectores lógicos? _________________________________
_______________________________________________________________________
12.- ¿Qué es una función proposicional? _______________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
13.- ¿Qué es una tautología? _______________________________________________
_______________________________________________________________________
_______________________________________________________________________
14.- ¿Qué es una contradicción? _____________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
15.- Construya un conjunto de cinco proposiciones a cerca de un mismo objeto que
puedan ser falsas o verdaderas y evalúelas:
i. __________________________________________________________________
ii. __________________________________________________________________
iii. __________________________________________________________________
iv. __________________________________________________________________
v. __________________________________________________________________
16.- Sustituya las variables por los valores de las proposiciones anteriores y evalúe la
siguiente función proposicional:
3
A y no B y C o D y E
17.- Sustituya las variables por los valores de las proposiciones y evalúe la siguiente
función proposicional:
A y no B y (C o D) y E
3
21.- Construya el árbol de evaluación de la siguiente expresión lógica con A = 0, B = 4, C
=7yD=7
A>BoC=D
3
8.- ESTRUCTURAS DE CONTROL DE FLUJO Y CONDICIONES
Análisis es una palabra que deriba del griego y quiere decir separación. Cuando en
química se habla de análisis se habla de las descomposición de una substancia en sus
componentes. El análisis de sistemas consiste en plantear cuales pueden ser los
diferentes subsistemas que pueden formar el sistema completo. A su vez, cada
subsistema se revisará y se verá si es posible y óptimo que éste este formado de más
subsistemas. El proceso se repite hasta que ya no hay ningún subsistema que se pueda
diseñar con más subsistemas. Cuando ya no hay más subsistemas que analizar el trabajo
hasta este punto quedara terminado. El siguiente problema es elaborar el código de cada
subsistema y acoplarlo al sistema para que el sistema completo trabaje correctamente.
3
La tercera etapa consiste en expresar el algoritmo solución en términos
computacionales. En muchas ocasiones ya existe un algoritmo solución por lo que lo
único que hay que hacer es describir el algoritmo en términos computacionales. Cuando
no existe se procederá a desarrollar el algoritmo que lo resuelva.
3
siempre habrá al menos un enunciado de asignación dentro de las estructuras de control
de flujo de los procedimientos o funciones de nivel semántico más bajo, no tiene sentido
una estructura de control que no tenga enunciados adentro. Un enunciado de asignación
como su nombre lo indica se asigna el valor de una expresión a una variable, ejemplo:
A←1
Lee( A)
Lo que se encontró fue que sólo eran necesarios ciertos patrones de los diagramas
de flujo y a éstos se les dio el nombre de estructuras de control de flujo o simplemente
estructuras de control. Con éstas estructuras se diseñó un metalenguaje estructurado al
cual se denominó pseudocódigo. Con este lenguaje se buscaba tener un lenguaje
genérico universal para poder representar algoritmos y se encontró también que es más
conveniente utilizar el pseudocódigo que los diagramas de flujo ya que se pueden obtener
3
programas más claros, óptimos, fáciles de depurar y optimizar. Por todo lo anterior los
diagramas de flujo quedaron en el pasado.
Será necesario que exista una palabra reservada para la selección otra para la
iteración condicional y otras para las estructuras de control que veremos más adelante.
Por ejemplo la palabra si que se utiliza para la selección es una palabra clave ya que
tiene un significado preestablecido a diferencia de un identificador el cual puede ser
asignado a cualquier variable, procedimiento o función. Un identificador es el nombre con
el que se reconoce a una variable, función o procedimiento y la regla es que debe de
comenzar con letra, ejemplo: Temperatura, Presión, Volumen, Alumno1, etc.
En virtud de que las palabras reservadas son palabras que hablan acerca de otras
adquieren la categoría de metapalabras.
Secuenciación e1
e2
o bien
e1; e2
Selección si C entonces e1
otro e2
Observe que cada una de estas estructuras de control tiene un solo punto de
entrada y un solo punto de salida. Esto nos ayudará para armar programas completos
3
uniendo salidas con entradas para formar cadenas de enunciados estructurados
acomodados en secuencia.
Si esta regla de composición parece rara es por que es recursiva. Una definición
es recursiva si emplea el definiens dentro del definiendum, o en otras palabras, si dice
como obtener conceptos nuevos empleando para tal fin el mismo concepto que se intenta
definir. Un razonamiento recursivo tiene dos partes: una base y la regla recursiva de
construcción. La base no es recursiva y es el punto tanto de partida como de terminación
de la definición.
e1
e2
3
e1
e2
e3
si C entonces
comienza
e1
e2
termina
otro
comienza
e3
e4
termina
Si una estructura de control compleja está bien formada seguirá teniendo una sola
entrada y una sola salida. De la misma manera, si un programa está bien formado seguirá
teniendo una sola entrada y una sola salida.
3
profundidad, pero éste generalmente es elevado por lo que no nos preocuparemos por
ésto.
Ejemplos de anidamiento:
repite
si C1 entonces e
hasta (C2)
Las estructuras de control adicionales del tipo iteración condicional son dos:
mientras y para, con la diferencia de que primero evalúan la condición booleana y luego
ejecutan el (o los) enunciados asociados hasta que se cumple la condición de
terminación.
e
mientras (C) e
que primero ejecuta una vez el enunciado y luego averigua si debe o no continuar
haciéndolo.
I = LimiteInferior
mientras(I < LimiteSuperior)
comienza
3
e
I=I+1
termina
si V = 1 entonces e1
otro si V = 2 entonces e2
otro si V = 3 entonces e3
otro ....
En efecto, esta construcción anidada no es más que una prueba de opción múltiple
sobre el valor de la variable V y que también puede representarse con esta estructura
completa:
caso V de
constante 1: e1
constante 2: e2
.
.
constante n: en
fin-caso
La cual in extenso quiere decir: en caso que la variable sea igual a la constante 1
ejecuta el enunciado 1, en caso de que sea igual a la constante 2 ejecuta el enunciado 2
y así sucesivamente; Esta estructura de control se utiliza cuando se tienen varios si's
anidados que dependen del valor de una variable haciendo más claro el código y
quitando el problema del indentado. El caso es muy usado menús de opciones. Esta
estructura abrevia gran cantidad de si's anidados.
Metaparéntesis
comienza y termina
3
Estructuras de Control
si condición entonces e
si condición entonces e otro e
caso V de
A1: e
A2: e
A3:e
fin-caso
mientras (condición) e
repite e hasta (condición)
ejecuta i = Li, Ls e
Condiciones
Ejemplo
3
Símbolos Relacionales
= igual
> mayor que
< menor que
>= mayor o igual que
<= menor o igual que
<> Diferente
Conector Lógico
o disyunción
y conjunción
no negación
Llamadas a procedimiento
proc principal
declaraciones
proposiciones
llama uno
proposiciones
fin.
proc uno
declaraciones
proposiciones
regresa
fin.
3
El paso de parámetros únicamente se hace por referencia, no se indica nada.
proc principal
entero a, b, resultado
lee a, b
llama suma(a, b, resultado)
escribe “a + b = ”, resultado
fin.
Ejemplo:
entero LISTA(10)
Tipo de Dato
entero
real
caracter
Los criterios para utilizar las estructuras de control repetitivas son los siguientes:
3
Si se requiere que no se ejecute ninguna iteración si no se cumple la condición se
debe de utilizar un mientras, en otro caso se usará un repite.
Ahora jugaremos con los términos computacionales para mostrar como una receta
de cocina se puede escribir en términos computaciones. Tendremos una descripción en
lenguaje natural, la cual traduciremos en una descripción en términos computaciones. La
receta es la siguiente:
Huevos a la Inglesa
6 huevos frescos.
1 ½ tazas de queso gruyere rallado.
¼ de cucharadita de mostaza preparada.
1 ½ tazas de crema fresca.
2 cucharadas de harina cernida tres veces.
2 cucharadas de mantequilla.
Sal y pimienta al gusto.
comienza
Consigue 6 huevos frescos.
3
Consigue 1 ½ tazas de queso Gruyere rallado.
Consigue ¼ de cucharadita de mostaza preparada.
Consigue 1 ½ tazas de crema fresca.
Consigue 2 cucharadas de harina cernida tres veces.
Consigue 2 cucharadas de mantequilla.
Consigue Sal y pimienta.
Observe que esta descripción está hecha a través de ordenes, esto se debe a que
en realidad en la programación se le dan ordenes a la computadora, es por esta razón
que a este paradigma de programación se le llama programación imperativa, por lo tanto
no está en 3a persona, sino en 2a.
3
Y finalmente es la misma descripción excepto que aparecen estructuras de control
para dirigir el flujo del programa.
Tal vez existan personas a las que les guste cocinar, pero hay trabajos rutinarios
que generalmente a nadie le gusta hacer como lavar la ropa, plancharla, limpiar la casa y
lavar los platos, tender las camas, por lo que sería muy interesante construir autómatas
que fueran capaces de hacer este trabajo liberándonos del trabajo rutinario.
Claro que es probable que de todos modos tengamos que supervisarlos, ya que
estos autómatas no tendrían la capacidad de razonar y no podrían resolver ciertos
problemas que no hayan sido contemplados en el programa como sería que una sabana
se rompió o que la plancha no calienta cuando no hay energía eléctrica.
3
El proceso se da de la siguiente manera:
Incluiremos una tabla para indicar las diferentes formas de representar los
operadores lógicos en Pascal y C.
Operador Pascal C
y And &&
o Or ||
no Not !
3
Relacional Pascal C
= = ==
> > >
< < <
≥ >= >=
≤ <= <=
Operador Pascal C
+ + +
- - -
Multiplicación * *
División entera Div
División / /
Módulo Mod %
Observe que la estructura de un programa son una serie de cajas que obedecen
solo a dos formas de agruparse, una en forma secuencial y otra en forma de una caja que
esta adentro de otra caja. Con estas dos propiedades podemos formar bloques que
únicamente tendrán una entrada y una sola salida, además de que producirán secciones
de código claras que solo efectúan una función, pero que esta función la realizan bien.
Enunciado
3
EJERCICIOS CAPÍTULO 8 Fecha de entrega: ______________
Nombre: ________________________________________________________________
1.- En el siguiente programa marque en un recuadro rojo las sentencias de asignación,
con verde los llamados a procedimiento, con azul la estructura de control iterativa. Nota:
marque la estructura de control desde donde comienza hasta donde termina.
programa Lineal;
entero X, Y;
comienza
ejecuta X = 0, 10
comienza
Y=2*X+5
escribe Y
termina
termina
3
3.- Represente la misma receta en términos computacionales, es decir con estructuras de
control: _________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
4.- Desarrolle un programa que diga la relación cardinal de dos números suministrados,
es decir, si el primero es mayor que el segundo, si son iguales o si el segundo es mayor
que el primero.
5.- Desarrolle un programa que encuentre la relación cardinal de tres números enteros
suministrados. Ejemplo: A es mayor que B y B es mayor que C
3
6.- Desarrolle los programas de conversión del capítulo 6 pero que escriban una tabla de
conversión desde un valor inicial entero, dado por el usuario, hasta el valor final entero,
también dado por el usuario, con incrementos de uno en uno.
7.- Desarrolle un programa que convierta un número en base decimal a cualquier base
que el usuario requiera, de base 2 a base 9. Ejemplo: 20 10 es 101002. No importa que el
número salga invertido, solo tiene que notificar el programa al usuario que el número se
se escribirá invertido.
8.- Haga un programa que encuentre la suma de la serie armónica hasta el elemento que
el usuario indique (efecto acumulador).
n
3
3
9.- PROCEDIMIENTOS, FUNCIONES, PASO DE PARÁMETROS, VARIABLES
GLOBALES, VARIABLES LOCALES, ALCANCE SINTÁCTICO Y RECURSIÓN.
Las herramientas fundamentales para poder hacer programas más complejos son
las funciones y los procedimientos. Una función es un segmento de código que evalúa
una expresión de acuerdo a uno o más argumentos que se reciban y el resultado de la
evaluación se regresa y se sustituye en el lugar donde fue invocada la función.
Ejemplo:
comienza
Medio ← (LimiteSuperior - LimiteInferior) / 2
termina
3
Los parámetros formales y actuales pueden tener en general nombres diferentes.
Esto se debe a que la definición de la función o el procedimiento puede ser muy general
mientras que las invocaciones pueden ser muy particulares.
Cabe recordar que el sueño de Charles Babbage era construir una máquina en la
que se pudiera cambiar la función de cálculo, observe que esto se puede hacer
fácilmente cambiando la definición de la función.
Generalmente también es necesario enviar ciertos datos que serán requeridos por
un procedimiento pero que no interesan al momento de finalizar el procedimiento, a esta
forma de enviar argumentos se le llama paso de parámetros por valor. En el paso de
parámetros por valor el procedimiento o la función realizan una copia del valor, de tal
forma que el valor en la variable original permanecerá inalterado. Para indicar que el paso
de parámetros es por valor no se tiene que hacer nada, solo poner el nombre de la
variable y su tipo como parámetro.
Ejemplo de procedimiento:
3
En este procedimiento el paso de parámetros se hace por referencia ya que es
necesario que después de ejecutado el procedimiento las variables registren la
actualización. Si no se antepusiera la palabra “var” en la lista, el paso de parámetros se
haría por valor no generando ningún cambio después de ejecutar el procedimiento..
Esto solo es valido para Pascal ya que en C no existen procedimientos, todas son
funciones, pero es posible invocar a una función de la misma manera que se invoca a un
procedimiento en Pascal.
Un ejemplo de esto podría ser un programa que simula un juego de ajedrez. Será
necesario modelar el tablero y las piezas de alguna manera. El tablero y las piezas deben
de estar presentes durante toda la ejecución del programa.
3
ALCANCE SINTÁCTICO
Aunque si se utiliza un índice, por ejemplo "I" en varias partes del programa, es
tentador definirlo como global, pero no es recomendable hacer esto ya que se violaría el
principio de auto-contenido. Es mejor definir la variable en cada procedimiento cada vez
que se vaya a utilizar aunque esto parezca redundante.
Por otro lado las variables globales, si es que son necesarias, deben tener
nombres muy particulares para evitar confusiones con variables definidas localmente.
LA RECURSIÓN
3
si M = 1 entonces
Potencia ← N
otro
Potencia ← N * Potencia(N, M -1)
termina
El procedimiento sería:
programa Hanoi
comienza
MuevePila(A, C, B, H)
termina
comienza
si H = 1 MueveDisco(Fuente, Destino)
3
otro
comienza
Mueve Pila(Fuente, Paso, Destino, H - 1)
MueveDisco(Fuente, Destino)
MuevePila(Paso, Destino, Fuente, H - 1)
termina
termina
Note que aunque el tercer argumento diga Destino, en realidad lo que importa es la
posición del argumento, el primer argumento siempre será la fuente, el segundo siempre
será el destino y el tercero siempre será el medio por el cual se va a realizar la
transferencia.
Los discos se pueden representar por números, los postes como arreglos de
números de dimensión 64.
Finalizamos este capítulo diciendo que los procedimientos, las funciones y el paso
de parámetros son elementos fundamentales para poder explotar los lenguajes de
programación a su máxima potencia, sin ellos la complejidad sería inabordable.
3
PREGUNTAS CAPITULO 9 Fecha de entrega:______________
Nombre: ________________________________________________________________
(La calificación se calcula sobre el número total de respuestas, en este caso, 11.)
1.- ¿Qué son las funciones? ________________________________________________
_______________________________________________________________________
_______________________________________________________________________
2.- ¿Qué son los procedimientos? ____________________________________________
_______________________________________________________________________
_______________________________________________________________________
3.- ¿Cuáles son las dos formas de paso de parámetros? __________________________
_______________________________________________________________________
4.- ¿Cómo es el paso de parámetros por referencia? _____________________________
_______________________________________________________________________
_______________________________________________________________________
5.- ¿Cómo es el paso de parámetros por valor? _________________________________
_______________________________________________________________________
_______________________________________________________________________
6.- ¿Cuáles son las variables globales y cuándo se deben usar? ____________________
_______________________________________________________________________
_______________________________________________________________________
7.- ¿Cuales son las variables locales y cuando se usan? __________________________
_______________________________________________________________________
_______________________________________________________________________
8.- En la siguiente figura, indique que tipo de paso de parámetros utilizaría.
Medidas
Paso de parámetros por:
___________________
Traje
Sastre
Tela
Paso de parámetros por:
___________________
3
9.- Desarrolle la función Factorial en versión no recursiva y versión recursiva, haga un
programa para probarlas.
Nota: Como el factorial crece muy rápido manéjela con el tipo de dato entero largo
(longint) el cual es un tipo de dato entero de cuatro bytes que puede almacenar enteros
de poco más de nueve cifras significativas.
10.- Desarrolle la función Potencia en versión iterativa y en versión recursiva, haga un
programa para probarlas (utilice longint como el tipo de dato de la función).
3
10.- ¿Qué es un programa?, ¿Qué es programar?, pseudocódigo,
método Páez de implementación de algoritmos iterativos, refinamientos
sucesivos y codificación.
El concepto programar aparece cuando los científicos logran crear una máquina
capaz de ejecutar instrucciones.
Programar en estos lenguajes era muy problemático ya que se tenía que conocer
la arquitectura de la computadora y saber en que zonas de memoria se podían cargar los
programas y los datos, además de que el hacer programas con un alto grado de
complejidad implicaba muchas horas de trabajo tanto de elaboración como de prueba.
Hay quien piensa que la programación apareció con las computadoras, pero en
realidad el concepto de programación es más antiguo.
3
Para programar lo único que se necesita es un lenguaje de especificación que no
sea ambiguo y algo que se requiera representar.
Se podría decir que los primeros programas que aparecieron en la historia fueron
las obras de teatro de los griegos, en donde a través de un lenguaje se narraba algún
acontecimiento de la historia en forma de hacer la reconstrucción de los hechos de la
suma manera en que se dieron y en donde cada personaje de la obra podría ser
interpretado por un diferente actor de tal forma que se podría decir que el guión de la obra
de teatro es también un programa. Nótese la capacidad de las obras de reconstruir
virtualmente una realidad acontecida en el pasado.
3
un lenguaje universal a través del cual fuera posible programar y después traducir este
lenguaje a algún lenguaje en particular. El resultado fue el pseudocódigo.
El pseudocódigo abarca desde una versión muy burda del algoritmo hasta una
versión que no presenta problema para ser codificada, es decir, tolera secciones de
código en lenguaje natural y a través de refinamientos sucesivos se va bajando el código
de nivel semántico hasta que éste ya puede ser codificado. Utiliza sus propias estructuras
de control las cuales, de acuerdo a lo que se encontró, son suficientes y necesarias para
implementar cualquier algoritmo. Niclaus Wirth el creador de Pascal tuvo la idea de
implementar un lenguaje que manejara las estructuras de control tal como estaban
descritas en el pseudocódigo con el objeto de ahorrar esta traducción del pseudocódigo a
un lenguaje no estructurado haciendo que programar en Pascal se convirtiera
prácticamente en escribir los algoritmos en pseudocódigo.
Por lo tanto, como ya vimos, los pasos para la elaboración de un programa son:
1) Entender el problema
2) Hacer el análisis del mismo.
3) Programar en pseudocódigo el modelo de solución propuesto.
4) Codificarlo.
5) Cargarlo en la computadora para su ejecución y ajuste.
6) Darle mantenimiento durante su tiempo de vida.
3
Se trata de que la computadora pregunte cuántos números primos desea el
usuario y ella encuentre los números primos hasta completar el número de números
primos que pide el usuario.
si EsPrimo(I) entonces
comienza
Escribe(I)
NmroDPrms ← NmroDPrms + 1
termina
3
Como no sabemos antes de comenzar el bucle cuantas iteraciones se van a
realizar las dos instrucciones que se pueden utilizar son repite y mientras, pero no el
para. Escogeremos el repite, así que necesitaremos actualizar el contador I para el
siguiente bucle quedando el algoritmo de la siguiente manera:
si EsPrimo(I) entonces
comienza
Escribe(I)
NmroDPrms ← NmroDPrms + 1
termina
I←I+1
repite
comienza
si EsPrimo(I) entonces
comienza
Escribe(I)
NmroDPrms ← NmroDPrms + 1
termina
I←I+1
termina
hasta(NumroDPrmos = NmroDPrmosUsro)
4° Inicialización de variables.
En este paso se observa qué variables requieren inicialización. Hay dos formas de
inicializar una variable, una a través de un enunciado de asignación y otra a través de una
lectura. Por lo tanto el algoritmo quedará:
I←2
NmroDPrmos ← 0
Lee(NmroDPrmosUsro)
repite
comienza
si EsPrimo(I) entonces
comienza
Escribe(I)
NmroDPrms ← NmroDPrms + 1
3
termina
I←I+1
termina
hasta (NmroDPrmos = NmroDPrmosUsro)
5° Entrega de resultados.
Una vez que ya sabemos cuantas y cuales variables vamos a necesitar lo único
que hay que hacer es declarar las variables. Solo tenemos que identificar qué tipo de dato
es cada variable. Al final del algoritmo terminamos con un punto final. De tal forma que el
programa quedará de la siguiente manera:
pograma NumerosPrimos;
declaraciones
I, NmroDPrms, NmroDPrmsUsro: entero
comienza
I←2
NmroDPrmos ← 0
Lee(NmroDPrmosUsro)
repite
comienza
si EsPrimo(I) entonces
comienza
Escribe(I)
NmroDPrms ← NmroDPrms + 1
termina
I←I+1
termina
hasta(NmroDPrmos = NmroDPrmosUsro)
termina
Podemos correr en papel nuestro algoritmo para probar que funcione. Pero, como
podemos observar, nos falta definir la función EsPrimo, así que haremos este trabajo
para que nuestro algoritmo quede completo.
3
"Un número es primo si es un número natural que únicamente puede ser dividido
por exactamente dos número naturales, él mismo y la unidad”.
Para la computadora será más fácil comprender ésta especificación y ésto será
todo lo que vamos a tener que hacer, revisar si existe un divisor intermedio entre la
unidad y el número.
A todas luces éste es un algoritmo iterativo por lo que podemos utilizar de nuevo la
metodología Páez para desarrollo de algoritmos iterativos.
si N módulo I = 0 entonces
EsPrimo ← falso
Esto quiere decir que si encontramos un número cuyo residuo de dividir nuestro
número y él es cero hemos encontrado al menos un número que divide en forma exacta a
nuestro número por lo que la variable Primo tomará un valor falso. Observe también la
forma de programar con si´s ( if´s en inglés). Es posible crear otra función que se llame
divisible para hacer más clara la definición. Esta función lo único que haría es recibir dos
números y contestar “verdadero” si es que son divisibles y “falso” en caso contrario. El
operador “módulo” generalmente tiene mayor precedencia que el operador “=” por lo que
no se requieren los paréntesis.
3
Para que los bucles se realicen adecuadamente es necesario actualizar variables
al final de cada uno para que las variables estén en el número correcto en el siguiente, de
otra manera podemos generar bucles infinitos.
si N módulo I = 0 entonces
EsPrimo ← falso
I←I+1
repite
comienza
si N módulo I = 0 entonces
EsPrimo ← falso;
I←I+1
termina
hasta(N módulo (I – 1) = 0) o (I - 1 >= N - 1)
I←2
EsPrimo ← verdadero
3
repite
comienza
si N módulo I = 0 entonces
Primo ← falso
I←I+1
termina
hasta((N módulo (I – 1) = 0) o (I >= N – 1))
Es importante agregar algunos filtros para que el algoritmo se comporte bien con
casos especiales todo tipo de entrada posible, por lo que quedaría de la siguiente forma:
3
si((2 <= N) y (N <= MaxInt)) entonces
comienza
si N = 2 entonces EsPrimo ←verdadero
otro
comienza
I←2
EsPrimo ← verdadero
repite
comienza
si N módulo I = 0 entonces
EsPrimo ← falso
I←I+1
termina
hasta((N módulo (I – 1) = 0) o (I -1 >= N - 1))
termina
termina
otro
Primo ← falso
5° Entrega de resultados.
3
comienza
si((2 <= N) y (N <= MaxInt)) entonces
comienza
si N = 2 entonces EsPrimo ← verdadero
otro
comienza
I←2
EsPrimo ← verdadero
repite
comienza
si N módulo I = 0 entonces
Primo ← falso
I←I+1
termina
hasta((N módulo (I – 1) = 0) o (I - 1 >= N - 1))
termina
termina
otro EsPrimo ← falso
termina
5° Declaración de variables.
Una vez que ya está terminado el algoritmo podemos declarar las variables. Esto
es mejor que primero declarar variables y luego hacer el programa, puesto que todavía no
sabemos que variables iremos a usar.
3
declaraciones
I: entero
comienza
si((2 <= N) y (N <= MaxInt)) entonces
comienza
si N = 2 entonces EsPrimo ← verdadero
otro
comienza
I←2
EsPrimo ← verdadero
repite
comienza
si N módulo I = 0 entonces
Primo ← falso
I←I+1
termina
hasta((N módulo (I – 1) = 0) o (I - 1 >= N - 1))
termina
termina
otro EsPrimo ← falso
termina
3
6° Nombre de la función
comienza
si((2 <= N) y (N <= MaxInt)) entonces
comienza
si N = 2 entonces EsPrimo ← verdadero
otro
comienza
I←2
EsPrimo ← verdadero
repite
comienza
si N módulo I = 0 entonces
Primo ← falso
I←I+1
termina
hasta((N módulo (I – 1) = 0) o (I - 1 >= N - 1))
termina
termina
otro EsPrimo ← falso
termina
También podemos agregar una línea que avise en caso de que exista un sobreflujo
en el calculo del siguiente número primo quedando los algoritmos como sigue:
3
función EsPrimo(N: entero): booleano;
declaraciones
I: entero;
comienza
si((2 <= N) y (N <= MaxInt)) entonces
comienza
si N = 2 entonces EsPrimo ← verdadero
otro
comienza
I←2
EsPrimo ← verdadero
repite
comienza
si N módulo I = 0 entonces
Primo ← falso
si I = MaxInt Escribe(‘Sobreflujo en la variable I’)
otro
I←I+1
termina
hasta((N módulo (I – 1) = 0) o (I - 1 >= N - 1))
termina
termina
otro EsPrimo ← falso
termina
3
programa NumerosPrimos
declaraciones
I, NmroDPrms, NmroDPrmsUsro: entero
comienza
I←2
NmroDPrmos ← 0
Lee(NmroDPrmosUsro)
repite
comienza
si EsPrimo(I) entonces
comienza
Escribe(I)
NmroDPrms ← NmroDPrms + 1
Termina
si I = MaxInt Escribe(‘Sobreflujo en la variable I’)
otro I ← I + 1
termina
hasta(NumroDPrmos = NmroDPrmosUsro)
termina
Este trabajo se le deja al estudiante. En esta etapa el código fuente debe constar
con mensajes que hagan al programa amigable para el usuario.
Lo primero que hará la herramienta para correr el programa paso a paso será
compilar el programa. El compilador comprobará que el programa es un programa
producido por su gramática. En caso de no serlo el compilador marcará errores en los
casos en donde no pueda reconocer al programa. Si hay cosas extrañas pero salvables
únicamente enviará advertencias (warnings).
Será necesario que el programador remueva todos los errores para que el
programa pueda correr. No será lo mismo con las advertencias, es responsabilidad del
programador dejar las advertencias.
3
Generalmente los errores que marca un compilador son errores sintácticos. Estos
errores se producen cuando no se emplea el formato adecuado de las estructuras de
control. Cada estructura de control tiene una sintaxis, es decir, un formato que tiene que
ser respetado, de otra manera el compilador no la reconocerá como parte de su
gramática.
Etapa 6) Mantenimiento del sistema, para los alcances de este curso este paso no
lo realizaremos.
3
EJERCICIOS CAPÍTULO 10 Fecha de entrega: ______________
Nombre: ________________________________________________________________
1.- Codifique el programa de los números primos, cárguelo, depúrelo y pruébelo.
2.- Escriba los programas que calculen las siguientes funciones con el error que solicite el
usuario con la siguiente condición de paro: El error del valor calculado por el programa
debe ser menor que el error solicitado por el usuario. El criterio de error puede ser el
siguiente: El error calculado puede ser el valor del último término sumado. Observe que
en las series un término es positivo y otro es negativo por lo que se debe tomar el valor
absoluto del término y por lo que el valor real debe estar a una distancia menor al último
valor sumado del último valor calculado. Ejemplo: el primer valor para la serie del seno es
x por lo que si comenzamos de cero, la incertidumbre para la primera iteración es x, es
decir el valor calculado es x ± x. En las sigientes iteraciones la incertidumbre se irá
reduciendo tanto como se reduzcan los términos. Observe que los términos se reducen
muy rápido ya que se dividen entre la función factorial y la función factorial es la que
crece más rápido. Utilice funciones para calcular las potencias y los factoriales y utilice
longint para el tipo de tato de la función factorial, ya que ésta crece muy rápido. El valor
de x está dado en radianes. 360° equivalen a 2π radianes.
Ejemplo de pregunta: ¿Calcule el valor del seno de 0.5 radianes con un error de 0.1?
3
n
sen x = -1 (i-1) x (2 i - 1) = +x1 - x3 + x5 - ……
i=1 (2 i - 1) ! 1! 3! 5!
n
cos x = -1 (i-1) x (2 i - 2 ) = +1 – x2 + x4 - ……
i=1 (2 i - 2) ! 0! 2! 4!
ex = _x (i-1) = +1 – x1 + x2 - ……
i=1
( i - 1)! 0! 1! 2!
ln ( 1 + x ) = -1 (i - 1) x i= +x – x2 + x3 - ……
i=1
i 1! 2! 3!
3
11.- ARREGLOS, CADENAS Y REGISTROS.
Hasta ahora sólo hemos trabajado con los tipos de datos básicos, enteros, reales,
caracter y booleanos. Con todos estos datos es posible construir arreglos, cadenas y
estructuras.
ARREGLOS
int a[4];
int a[4][4];
Ejemplo:
3
En este caso A es un arreglo de enteros de dimensión tres de tamaño 10.
int a[9][9][9];
Como sabemos de antemano cuantos ciclos vamos a ejecutar nos conviene utilizar
la estructura de control for.
for I := 1 to 10 do
for J := 1 to 10 do
A[ I, J] := 0;
En C es de la siguiente manera:
Con los arreglos es posible representar todo tipo de cosas que se muevan sobre
un tablero, ejemplo, damas inglesas, ajedrez, gato y también elementos matemáticos
como matrices.
Los algoritmos de búsqueda son muy importantes ya que sin ellos sería imposible
acceder a los datos en los grandes sistemas en tiempos prácticos. Los algoritmos de
búsqueda más simples son el algoritmo de búsqueda secuencial y el de búsqueda
binaria.
3
ya que en cada pasada el elemento mayor queda al final de la sección del arreglo que se
está ordenando, es decir, se va moviendo hacia arriba de la misma forma que lo hace una
burbuja. El inconveniente de éste algoritmo es que se realizan muchos cambios para
poder ordenar el arreglo. Es extremadamente simple en líneas de código pero no es el
más eficiente. El algoritmo es el siguiente:
for I := 1 to Limite -1 do
for J := 1 to Limite - 1 do
if A[J] > A[J +1] then
begin
Temp := A[I];
A[I] := A[I +1];
A[I+1] := Temp
end;
En C el código es el siguiente:
3
Los primeros algoritmos de ordenamiento que se crearon fueron muy intuitivos
pero poco eficientes y poco a poco se fueron elaborando algoritmos más complejos en
base a la experiencia de los primeros.
programa Hanoi
comienza
MuevePila(A, C, B, ApA, ApC, ApB, H)
termina
procedimiento MuevePila(var Fuente, Destino, Paso: arreglo; var ApA, ApC, ApB: entero
H: entero)
comienza
si H = 1 MueveDisco(Fuente, Destino, ApF, ApD)
otro
comienza
Mueve Pila(Fuente, Paso, Destino, ApF, ApP, ApD, H - 1)
MueveDisco(Fuente, Destino, ApF, ApD)
MuevePila(Paso, Destino, Fuente, ApP, ApD, ApF, H - 1)
termina
termina
3
termina
CADENAS
Pero ¿por qué son necesarias las cadenas de caracteres? En realidad una variable
caracter no nos serviría de mucho ya que generalmente el lenguaje se escribe por medio
de cadenas de caracteres, éste texto por ejemplo está compuesto de cadenas de
caracteres. El caso más común de cadenas de caracteres es una lista de nombres.
También, gracias a las cadenas se pueden escribir los programas para computadora.
WriteLn( Nombre[1]);
Nombre1 := Nombre2;
3
Las cadenas en C se manejan como arreglos de caracteres. El tipo string no existe
en C por lo que se hace mediante definir un arreglo tipo char. Existe una librería que
contiene funciones para manejar cadenas.
REGISTROS
Los datos de una persona están formados por tipos de datos de diferente
naturaleza, por ejemplo el nombre y la dirección son cadenas mientras que la edad es un
entero. A cada uno de los elementos de un registro se le llama campo.
type
persona =
record
Nombre: string[30];
Direccion: string[40];
Telefono: string[10]
end;
var
Empleado: persona;
3
ReadLn( [Link]);
Es decir, se hace poniendo el nombre del registro seguido de un punto seguido del
nombre del campo que queremos manipular.
Pascal proporciona una manera de evitar reescribir varias veces el nombre del
registro con el que se va a trabajar. Esto se hace por medio de la proposición with. La
sintaxis es la siguiente:
3
Ejemplo:
with Empleado do
begin
WriteLn( Nombre);
WriteLn( Direccion);
WriteLn( Telefono);
end
3
EJERCICIOS CAPÍTULO 11 Fecha de entrega: ______________
Nombre: ________________________________________________________________
1.- Suponga que tiene una caja con cinco casilleros numerado del 1 al 5 y cinco bolas de
pull de billar, es decir, bolas numeradas, no necesariamente seguidas. ¿Sería usted
capaz de ordenar las bolas en orden ascendente? Escriba el algoritmo que usted utiliza
en pseudocódigo utilizando el método de diseño descendente que ordene las bolas en
orden ascendente.
(Tip: analice que es lo que usted hace para ordenarlas y escríbalo en términos
computacionales, si esto no ayuda escriba lo que usted hace en lenguaje natural paso a
paso y luego escríbalo en términos computacionales, identifique lo que se hace
iterativamente)
2.- Codifique el algoritmo.
3.- Cárgelo y pruébelo.
4.- Sustituya el 5 por una constante Const Limite = 5 al inicio y sustituya todos los 5 por
Limite y corra el algoritmo.
5.- Ahora cambie Límite por 10 y vea que funciona el programa. Escriba que utilidad tiene
hacer esto.
6.- Optimice el algoritmo anterior.
7.- Cambie el algoritmo para que trabaje con cadenas.
8.- Haga un programa para ordenar por medio del método de la burbuja.
9.- Haga un programa para ordenar por medio del método insertion sort. Imagine que se
encuentra jugando cartas. Piense qué es lo que hace un jugador para ordenar sus cartas.
Se toma la primera como referencia. Se comienza con la segunda. Si es menor que la
primera se recorre la primera y se inserta la segunda, si no se deja en su posición. Luego
se toma la tercera y se le busca posición que puede ser antes de la primera, entre la
primera y la segunda o después de la segunda y se inserta. Esto se hace hasta que la
última carta ha sido insertada en su posición, de aquí su nombre de insertion sort
algorithm.
10.- Escriba un programa que despliegue el cuadro mágico de la dimensión que quiera el
usuario. El cuadro mágico es un cuadro en el que todas sus columnas y todos sus
renglones suman lo mismo. El cuadro mágico lo puede elaborar con arreglos de tamaño
impar. En la casilla del centro pone el número 1, el siguiente número lo pondrá arriba a la
3
derecha siempre y cuando la celda no esté ocupada. Si la celda ya está ocupada lo
pondrá abajo de la casilla en turno. Si se sale del cuadro al hacer el cálculo del siguiente
lugar reentre por el lado contrario, es decir, si se sale por arriba, reentre por abajo, si se
sale por el lado derecho, reentre por el lado izquierdo hasta colocar el último número.
Después de hacer esto la suma cada una de las columnas y de cada uno de los
renglones dará el mismo número.
11.- Escriba un programa que sume matrices.
12.- Escriba un programa que multiplique matrices.
13.- Escriba un programa en donde se declare una arreglo de 10 registros, en donde el
registro se llame Persona y en donde tenga los siguientes campos: Nombre: cadena 30,
Dirección: cadena de 40, Edad, entero, Teléfono: cadena de 15, Celular: cadena de 15,
Correo electrónico: cadena de 25 y Página web: cadena de 20. Se lean los campos del
registro y se escriban. El programa debe presentar un menú en donde haya un
procedimiento para ingresar un registro, otro para editar un registro y otro para desplegar
todo el arreglo.
3
12.- MODO GRÁFICO.
Las interfaces hombre máquina han ido cambiando y evolucionado conforme a ido
pasando el tiempo. En un principio la comunicación con la computadora era mediante
tarjetas perforadas. Después se hizo interactiva a través de monitores y finalmente se
convirtió en gráfica haciendo uso de iconos y botones.
Generalmente la pantalla es una matriz de 479 por 639 pixeles. El pixel (1,1) es el
pixel que se encuentra en la parte superior izquierda de la pantalla y el pixel (639, 479) se
encuentra en la parte inferior derecha de la pantalla.
Lo primero que tenemos que hacer para manejar el modo gráfico es declarar en el
uses la librería Graph, esto se hace mediante la siguiente instrucción:
uses Graph;
GraphDriver := Detect;
3
que en la actualidad utilizando un monitor SuperVGA es [Link]. Este archivo
generalmente se encuentra en la ruta C:\TP\BGI\.
Ejemplo:
Para saber cuales son los valores máximos de X y Y se utilizan las siguientes funciones:
GetMaxX;
GetMaxY;
3
Los colores disponibles son los siguientes:
INSTRUCCIONES GRÁFICAS
Line (X1, Y1, X2, Y2) Pinta una línea de las coordenadas iniciales a las
finales.
LineTo (X2, Y2) Pinta una línea de las coordenadas actuales a las
indicadas.
Rectangle (X1, Y1, X2, Y2) Pinta un rectángulo en la pantalla entre las
esquinas dadas.
Ellipse (X, Y, StAngle, EndAngle, XRadius, YRadius) Pinta una elipse en las
coordenadas X, Y en el ángulo de inicio, con ángulo de terminación, con radio en X
XRadius y con radio en Y en YRadious.
3
Arc (X,Y, StAngle, EndAngle, Radius) Pinta un arco en X, Y con ángulo de inicio
StAngle, ángulo de terminación EndAngle y radio Radius.
Sector (X, Y, XRadius, YRadius, StAngle, EndAngle) Pinta un sector con centro
X,Y, radio en X XRadius y radio en Y YRadius, ángulo de inicio StAngle y ángulo de
terminación EndAngle.
PieSlice (X, Y, StAngle, EndAngle, Radius) Pinta un sector similar al anterior pero
relleno.
COLOREAR Y RELLENAR
FloodFill (X, Y, Color) rellena una región determinada por un punto de la región y el
color de la frontera.
3
TEXTO EN UNA PANTALLA GRÁFICA
DefaultFont
TriplexFont
SmallFont
SansSeriFont
GothicFont
HorizDir
VerDir
El parámetro CharSize tiene un valor definido por omisión de 1 para el tipo de letra
con base en los bits y 4 para tipos de letra con cierto trazo. Se pueden elegir otros valores
para tamaños mayores de tipos.
CenterText (centrado)
3
Las opciones para Vert son:
BottomText (abajo)
CenterText (centrado)
TopText (arriba)
ClearViewPort;
3
SONIDO
f (n) = F Exp (K n)
donde:
n es el número de la nota
F es la frecuencia de la nota cero
K es una constante
Por convención "la" de la quinta octava tiene una frecuencia de 440 Hz, así que F =
440. En la música occidental una octava se divide en 12 semitonos:
f (n + 12) = 2 f (n)
La música occidental usa intervalos de 1/16, 1/8, 1/4, 1/2, 1, 2, y 4 tiempos. No hay
una definición de cuanto es un tiempo, y puede ser muy corto en un arreglo "molto
vivace", regular en un "andante" y muy largo en un "adagio".
3
contenidos en la librería Crt como lo son ClrScr, GoToXY, ReadKey y KeyPressed,
además de que si se termina la pantalla al hacer scrolls la gráfica se irá corriendo hacia
arriba por lo que habrá que dar un ClearViewPort.
Cuando se utilizan Read's hay que tener cuidado donde se encuentra el cursor
antes de leer ya que el número tecleado aparecerá en la pantalla en formato ASCII y
alterará lo que se encuentre desplegado.
También puede hacer la lectura de los datos en modo ASCII antes de que entre al
modo gráfico si es que el problema requiere datos para graficar. Inclusive puede salir de
modo gráfico y regresar a modo ASCII después, o puede estar pasando de modo ASCII a
modo Gráfico y viceversa intermitentemente si así lo desea.
MoveTo(50, 50);
OutText('Dame el valor de X. ');
ReadLn(X);
Finalmente para salir del modo gráfico hay que cerrarlo, esto se hace con la
instrucción:
CloseGraph;
Finalizamos el capítulo diciendo que las interfaces más vistosas y amigables son
las interfases en modo gráfico por lo que se han convertido en un estandar para crear las
interfases hombre máquina. Es importante resaltar que la información presentada en
modo gráfico es más agradable a la vista que la información presentada en una pantalla
en modo ASCII (también llamado modo texto).
3
que ver únicamente números, y no se diga de los matemáticos, que trabajan en topología
y gráficas de cuerpos en tres dimensiones. En fin, los campos de aplicación son muchos
y es importante hacer notar que este campo no solo es desarrollado por las compañías
de juegos electrónicos.
3
3
EJERCICIOS CAPÍTULO 12 Fecha de entrega: ______________
Nombre: ________________________________________________________________
1.- En una hoja de papel cuadriculada dibuje un carrito coloreado de perfil con figuras
geométricas.
2.- Haga un programa que dibuje ese carrito en pantalla.
3.- Haga que el carrito se mueva a la derecha y a la izquierda de la pantalla hasta que el
usuario pulse una tecla.
4.- Dibuje un escenario.
3
3
13.- ARCHIVOS
De ésta forma es posible hacer un programa que lea los datos de un archivo y
también es posible hacer un programa que mande los resultados a un archivo, del mismo
modo es posible que lea los datos de un archivo y escriba los resultados en otro y hasta
es posible que actualice los datos de uno o varios archivos.
La forma de hacer esto varía de acuerdo a los diferentes lenguajes, pero la esencia
es la misma.
En Pascal lo primero que tenemos que hacer es declarar que tipo de dato va a
conformar nuestro archivo. Los archivos pueden contener enteros, reales, caracteres,
registros y arreglos, en general cualquier tipo de dato estándar o definido por el usuario.
Por lo tanto en el área para declarar las variables globales se declarará también el tipo de
archivo con el que vamos a trabajar.
type
alumno = record
Nombre: string[30];
Carrera: string[35];
Telefono: string[15];
end;
var
Alumno1, Alumno2: alumno;
3
F: archivo;
ejemplo:
Assign(F, '[Link]');
{$I-}
Reset (F);
{$I+}
IOResult es una variable del compilador a través de la cual es posible saber si hubo un
error de entrada/salida, por eso no es necesario declararla. Así como ésta, existen varias
que solo se utilizan en caso necesario.
Una vez que el archivo ya está asignado e inicializado ya podemos trabajar con él
haciendo lecturas y/o escrituras.
3
Write(IdentificadorDArchivo, Lista de variables);
ejemplo:
Write(F, Alumno1);
ejemplo:
Read(F, Alumno1);
Close(IdentificadorDArchivo);
ejemplo:
Close(F);
El while se utiliza para proteger al programa en caso de que el archivo esté vacío y
no se pueda hacer ni siquiera una lectura.
3
Otro procedimiento que es muy útil en el manejo de archivos es el comando:
Seek(F, 5)
Seek(F, FileSize(F))
Esta línea posiciona el apuntador de archivo al final de éste, de tal forma que si se
requiere anexar registros solo es necesario ejecutar posteriormente una escritura.
FileSize regresa un entero que es mayor por uno al de la última componente. A esta
operación compuesta se conoce como append.
3
EJERCICIOS DEL CAPÍTULO 13 Fecha de entrega: ______________
Nombre: ________________________________________________________________
1.- ¿Qué es un archivo? ____________________________________________________
2.- ¿Cuantos tipos de acceso archivos existen? _________________________________
3.- ¿Cuando es necesario emplear archivos en un programa? ______________________
_______________________________________________________________________
4.- Diseñe un programa que funcione como un directorio telefónico.
5.- Altere el programa para que funcione como un diccionario.
3
3
14.- MÉTODOS DE DESCOMPOSICIÓN, DESARROLLO DESCENDENTE (TOP-
DOWN) Y PROGRAMACIÓN MODULAR.
2° Esbozar el algoritmo a grandes rasgos con estructuras de control. Para esto se pueden
nombrar procedimientos o funciones que aún no se hayan definido (éstas se definirán
después y serán de menor nivel).
si EsPrimo(N) entonces
si N es primo entonces
4° Esto se repetirá sucesivamente hasta que no quede ningún procedimiento y función sin
definir. Se pueden usar funciones estándar del lenguaje.
3
Cuando se terminen de codificar todos los procedimientos y funciones tendremos
la primera versión de nuestro programa.
Luego hacer lo mismo con los procedimientos restantes hasta que ya no haya
ningún procedimiento en el programa principal que no esté cargado.
Una vez hechas las pruebas ya podemos generar el ejecutable. Está será nuestra
versión 1.0 de nuestro programa y deberemos hacer una copia de seguridad por
cualquier cosa que suceda. Lo peor que le puede pasar a un programador en no tener
nada que entregar. Las siguientes versiones serán optimizaciones y ampliaciones de
nuestro programa.
Problema: Hacer un programa que maneje un directorio telefónico. El programa debe ser
capaz de dar de alta un nuevo nombre, consultar o actualizar los datos de una persona.
program Directorio;
begin
repeat
begin
Opcion := ReadKey;
case Opcion of:
'a': WriteLn('Altas');
'c': WriteLn('Consultas);
'e': WriteLn('Edicion');
's': WriteLn('Salir')
3
else
WriteLn('opción inválida)
end;
end
until Opcion = 's';
end.
Este sería el bosquejo del programa principal. Podríamos correr el programa para
revisar el flujo y ver que funciona. Este uso del case es una forma muy práctica para
navegar dentro del programa. Observe como no es necesario tener los procedimientos
definidos para que el programa corra.
uses Crt;
const
N = 30;
C = 20;
T = 10;
type
alumno = record
Nombre: string [N];
Carrera: String [C];
Telefono: string [T];
end;
var
Opción: char;
Alumno1: alumno;
F: archivo;
procedure Altas
{ Este procedimiento lee los datos en un registro y los escribe en un archivo.}
begin
with Alumno1 do
begin
ReadLn (Nombre);
ReadLn (Carrera);
ReadLn (Telefono);
end
Assign (F, '[Link]');
{$I-}
3
Reset (F);
{$I+}
if IOResult <> 0 then
ReWrite (F);
Write (F, Alumno1);
Close (F);
end; { Altas}
Esto se hace con todos los procedimientos que aparecen en el programa principal
y una vez que se desarrolla el último procedimiento el programa ya puede correr
completo por primera vez. Revisamos que haga lo que queremos y entonces ya tenemos
nuestra versión 1.0.
3
EJERCICIOS CAPÍTULO 14 Fecha de entrega: ______________
Nombre: ________________________________________________________________
1.- Explique en que consiste el método de desarrollo descendente: __________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
_______________________________________________________________________
2.- Desarrolle los procedimientos de Consultas, Edición y Listado del programa Directorio
mostrado en el capítulo.
3.- Desarrolle el siguiente problema utilizando el método de desarrollo descendente. Se
requiere colocar en un tablero de ajedrez ocho damas que no se ataquen. Haga un
programa que encuentre todas las soluciones.
Tips: Llene el tablero de arriba a abajo y de izquierda a derecha. Se sabe si una reina
ataca a otra en una diagonal si sus coordenadas suman lo mismo (diagonal que sube) o
restan lo mismo (diagonal que baja). No es necesario revisar hacia atrás ya que si se
puso una nueva reina ya se revisó que las anteriores no se atacan entre si. Utilice back
track cuando se llegue a una solución sin salida. El back track consiste en mover la reina
anterior en una posición si es que se llegó a un estado en donde no se pueden colocar
más reinas. El retroceso se hace recursivamente hasta que se llegue a un estado de no
bloqueo. El programa termina cuando la primera reina ya recorrió todas las posiciones y
la siguiente posición estaría fuera del tablero.
3
3
APÉNDICE A
REGLAS DE INDENTADO
3
3
BIBLIOGRAFÍA