82
1 2013 1 M.A. Zapata, A. Francés, J.C.Ciria Componentes del ordenador Bus del sistema Unidad Central de Proceso (CPU) 8 Memoria Principal Periférico 1 Periférico n Memoria Secundaria El bus es un sistema digital que transfiere datos entre los componentes de un ordenador entre ordenadores 2013 2 M.A. Zapata, A. Francés, J.C.Ciria Bus del sistema Memoria Principal ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 Memoria Secundaria Periférico 1 Periférico n CP (Contador de Programa) Dirección de memoria de la siguiente instrucción que debe ser ejecutada. Ac (Acumulador): registro que se encuentra en la ALU, donde se almacena el primer dato para el caso de operaciones binarias, y el resultado de la operación de la ALU. DM: Dirección de memoria de la que se quiere leer, o donde se quiere escribir. RI (Registro de Instrucción): guarda la instrucción que está siendo ejecutada Unidad Central de Proceso (CPU) Unidad de Control Señales de control internas 8 8 8 4 4 4 4 . . . CP DM RI Ac ALU

informatica

Embed Size (px)

Citation preview

Page 1: informatica

1

2013 1M.A. Zapata, A. Francés, J.C.Ciria

Componentes del ordenador

Bus del sistema

Unidad Central de Proceso (CPU)

8

Memoria Principal

Periférico

1Periférico

n

Memoria Secundaria

El bus es un sistema digital que transfiere datos entre los componentes de un ordenador entre ordenadores

2013 2M.A. Zapata, A. Francés, J.C.Ciria

Bus del sistema

Memoria Principal

???? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

1011

Memoria Secundaria

Periférico

1Periférico

n

CP (Contador de Programa) Dirección de memoria de la siguiente instrucción que debe ser ejecutada.

Ac (Acumulador): registro que se encuentra en la ALU, donde se almacena el primer dato para el caso de operaciones binarias, y el resultado de la operación de la ALU.

DM: Dirección de memoria de la que se quiere leer, o donde se quiere escribir.

RI (Registro de Instrucción): guarda la instrucción que está siendo ejecutada

Unidad Central de Proceso (CPU)

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

...

CP

DM

RI

Ac

ALU

Page 2: informatica

2

2013 3M.A. Zapata, A. Francés, J.C.Ciria

1. Cargar el programa

Bus del sistema

Memoria Principal Memoria Secundaria

Periférico

1Periférico

n

???? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

1011

0001 01110001 10000100 01111000 10000101 10011100 10011111 0000

???? ???????? ???????? ???????? ???????? ????

Unidad Central de Proceso (CPU)

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

...

CP

DM

RI

Ac

ALU

2013 4M.A. Zapata, A. Francés, J.C.Ciria

¿Qué significa el programa? (i)

Diccionario código máquina-castellano

0001: leer1100: escribir (en pantalla)

1000: sumar1001: restar1010: multiplicar1011: dividir

0100: cargar (en el acumulador)0101: almacenar (en memoria principal)

1111: fin de programa

0001 01110001 10000100 01111000 10000101 10011100 10011111 0000

???? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

almacenar

leerleercargarsumar

escribirfin

Page 3: informatica

3

2013 5M.A. Zapata, A. Francés, J.C.Ciria

¿Qué significa el programa? (y ii)

0001 01110001 10000100 01111000 10000101 10011100 10011111 0000

???? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

almacenar

leerleercargarsumar

escribirfin

El programa utiliza variables, que también se almacenan en la memoria principal

C

ABAB

C

C

AB

2013 6M.A. Zapata, A. Francés, J.C.Ciria

2. Inicializar el Contador de Programa (CP)

Bus del sistema

Unidad Central de Proceso (CPU)

Ac

DM

RI

ALU

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

Memoria Principal

...

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

Memoria Secundaria

Periférico

1Periférico

n

CP 0000

Page 4: informatica

4

2013 7M.A. Zapata, A. Francés, J.C.Ciria

3. Leer de memoria la dirección indicada por CP

Bus del sistema

Unidad Central de Proceso (CPU)

Ac

DM

RI

ALU

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

Memoria Principal

...

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

Memoria Secundaria

Periférico

1Periférico

n

CP 0000

2013 8M.A. Zapata, A. Francés, J.C.Ciria

4. Almacenar en RI y DM la instrucción leída

Bus del sistema

Unidad Central de Proceso (CPU)

Ac

ALU

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

Memoria Principal

...

Memoria Secundaria

Periférico

1Periférico

n

CP 0000

DM

RI

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

leer

A

Page 5: informatica

5

2013 9M.A. Zapata, A. Francés, J.C.Ciria

5. Incrementar en 1 el CP

Bus del sistema

Unidad Central de Proceso (CPU)

Ac

ALU

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

Memoria Principal

...

Memoria Secundaria

Periférico

1Periférico

n

CP 0000

DM

RI

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

leer

A

0001

2013 10M.A. Zapata, A. Francés, J.C.Ciria

6. Ejecución de la instrucción leída

Bus del sistema

Unidad Central de Proceso (CPU)

Ac

ALU

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

...

Memoria Secundaria

Periférico

1

CP 0000

DM

RIleer

A

0001

Memoria Principal

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

Periférico

n10

Page 6: informatica

6

2013 11M.A. Zapata, A. Francés, J.C.Ciria

¿ y ahora?

Bus del sistema

Unidad Central de Proceso (CPU)

Ac

ALU

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

...

Memoria Secundaria

Periférico

1

CP 0000

DM

RIleer

A

0001

Memoria Principal

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

Periférico

n10

Ha terminado de ejecutarse la primera instrucción.Como no es instrucción de fin, se vuelve otra vez al paso 3 (leer de memoria la celda que indica CP)

2013 12M.A. Zapata, A. Francés, J.C.Ciria

Ejecución de la segunda instrucción

Bus del sistema

Unidad Central de Proceso (CPU)

Ac

ALU

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

...

Memoria Secundaria

Periférico

1

CP 0000

DM

RI

0001 0010

10

Memoria Principal

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

1015

Periférico

n

leer

A

leer

B

Page 7: informatica

7

2013 13M.A. Zapata, A. Francés, J.C.Ciria

Ejecución de la tercera instrucción

Bus del sistema

Unidad Central de Proceso (CPU)

Unidadde

Control

Señalesde

controlinternas

ALU

8

8

8

4

4

4

4

...

Memoria Secundaria

Periférico

1

CP 0000

DM

RI

0010 0011

10

Memoria Principal

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

1015

Periférico

n

leer

B

cargar

A

Ac10

2013 14M.A. Zapata, A. Francés, J.C.Ciria

Ejecución de la cuarta instrucción

Bus del sistema

Unidad Central de Proceso (CPU)

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

...

Memoria Secundaria

Periférico

1

CP 0000

DM

RI

0011 0100

10

Memoria Principal

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

1015

Periférico

n

cargar

A

sumar

B

Ac1025

ALU

Page 8: informatica

8

2013 15M.A. Zapata, A. Francés, J.C.Ciria

Ejecución de la quinta instrucción

Bus del sistema

Unidad Central de Proceso (CPU)

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

...

Memoria Secundaria

Periférico

1

CP 0000

DM

RI

0100 0101

10

Memoria Principal

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

1015

Periférico

n

sumar

B

almacenar

C

Ac10

ALU

25

25

2013 16M.A. Zapata, A. Francés, J.C.Ciria

Ejecución de la sexta instrucción

Bus del sistema

Unidad Central de Proceso (CPU)

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

...

Memoria Secundaria

CP 0000

DM

RI

0101 0110

10

Memoria Principal

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

1015

Periférico

n

almacenar

C

escribir

C

Ac10

ALU

25

25

Periférico

1

25

Page 9: informatica

9

2013 17M.A. Zapata, A. Francés, J.C.Ciria

Final del programa

Bus del sistema

Unidad Central de Proceso (CPU)

Unidadde

Control

Señalesde

controlinternas

8

8

8

4

4

4

4

...

Memoria Secundaria

CP 0000

DM

RI

0110 0111

10

Memoria Principal

leer Aleer Bcargar Asumar Balmacenar Cescribir Cfin 0000

???? ???????? ???????? ???????? ???????? ????

0000

0001

0010

0011

0100

0101

0110

ABC

1010

1011

1015

Periférico

n

escribir

C

fin

0000

Ac10

ALU

25

25

Periférico

1

25

2013 18M.A. Zapata, A. Francés, J.C.Ciria

Fin del programa

Page 10: informatica

1

2013 0M.A. Zapata, A. Francés, J.C.Ciria

Codificación del software

2013 1M.A. Zapata, A. Francés, J.C.Ciria

Codificación de datos en binario

Los ordenadores utilizan el sistema binario para codificar cualquier tipo de información (números, caracteres, imagen, sonido…)

La unidad mínima de información es el BIT (BInary digiT)

Un bit tiene dos valores posibles, que representamos mediante los caracteres 0 y 1.

Page 11: informatica

2

2013 2M.A. Zapata, A. Francés, J.C.Ciria

Sistemas posicionales de numeración

Cada número se representa mediante una colección ordenada de cifras, cada una de las cuales contribuye con un valor que depende:

– del propio valor de la cifra– de un valor llamado base (el número de cifras disponibles)

– de la posición de la cifra en la colección

Base decimal:– Base: 10– Cifras: 0, 1, 2, 3, …, 9

Ejemplos:

1 9 0 5

-1 7 . 2 5 =

Nota: Los sistemas posicionales requieren de una cifra especial para representar el valor CERO, que fue introducido en Europa por los árabes Más información en: http://thales.cica.es/rd/Recursos/rd97/Otros/SISTNUM.html

0123

= 1·103 + 9·102 + 0·101 + 5·100

01 -1 -2

−(1·101 + 7·100 + 2·10-1 + 5·10-2 )

2013 3M.A. Zapata, A. Francés, J.C.Ciria

Sistema binario

Base dos (binario):– Base: 2 Cifras: 0, 1

Ejemplo: 1101.01 (2

1 1 0 1 . 0 1

0123 -1 -2

= 1·23 + 1·22 + 0·21 + 1·20 + 0·2-1 + 1·2-2 = 13.25(10

¿Cuál es la representación en base 10 del número 1001.11 (2 ?

Page 12: informatica

3

2013 4M.A. Zapata, A. Francés, J.C.Ciria

Paso decimal � binario

18 29 2

41 220 2

10 201

0

1 0 0 1 0

Parte entera: sucesivas divisiones por la base (2) hasta que el cociente valga 0; los restos son las cifras del resultado, en orden inverso al de obtención

¿Cuál es la representación binaria del número 18(10 ?

(2

2013 5M.A. Zapata, A. Francés, J.C.Ciria

Parte decimal: sucesivos productos por la base (2) hasta que la parte decimal es cero; tras cada multiplicación:• Se toma la parte entera como una cifra del resultado, que

ocupan las posiciones -1, -2,…• Antes de pasar al siguiente producto, la parte entera se hace

cero

Paso decimal � binario

¿Cuál es la representación binaria de 0.6875(10?

0.6875 * 2 = 1.375

0.375 * 2 = 0.75

0.75 * 2 = 1.5

0.5 * 2 = 1.0

0.6875 (10 = 0.1011 (2

Page 13: informatica

4

2013 6M.A. Zapata, A. Francés, J.C.Ciria

Convención: si no se indica explícitamente lo contrario, suponemos que un número está representado en base decimal.

Ejercicio: expresar en base 2 los siguientes números:

13.25 = ¿? (20.1 = ¿? (2

Paso decimal � binario

2013 7M.A. Zapata, A. Francés, J.C.Ciria

Suma en base 2

Operaciones aritméticas

0 + 0 = 0(2

0 + 1 = 1(2

1 + 0 = ¿?1 + 1 = ¿?

1 + 1 + 1 = ¿?

1(2

11(2

Números de más de un dígito: de modo análogo:

1 1 1 1 0 1 0(2

0 1 1 0 0 0 1(2

10(2

11

10 110101

Para realizar las operaciones aritméticas (suma, diferencia, producto,…) de números expresados en cualquier base podemos utilizar los algoritmos que normalmente usamos en base decimal.

(2

Page 14: informatica

5

2013 8M.A. Zapata, A. Francés, J.C.Ciria

Sistema octal

Base ocho (octal):– Cifras: 0, 1,… , 7 − Base: 8

Ejemplos:

743(8 = 7·82 + 4·81 + 3·80 = 483(10

Paso de decimal a octal: similar al usado en binario483.25(10 = ??(8

Paso de octal a binario: representar cada cifra octal por su equivalente binario usando siempre tres cifras:

743(8

Paso de binario a octal: agrupar los dígitos binarios en grupos de tres, comenzando por la derecha, y transformar cada uno en una cifra octal conservando la posición:

11010(2

= 171 140 031111 100 011 (2

= 3 2(8= 11 010 (2 = 26(10

2013 9M.A. Zapata, A. Francés, J.C.Ciria

Sistema hexadecimal

Base hexadecimal:– Cifras: 0, 1,… , 9, A, B, C, D, E, F − Base: 16

Las letras A, B,…,F representan los valores 10, 11,…,15Ejemplos:

1 0

7B(16 = 7·161 + 11·160 = 123(10

Paso de decimal a hexadecimal: similar al usado en binario483.25(10 = ??(16

Paso de hexadecimal a binario: representar cada cifra hexadecimal por su equivalente binario usando siempre cuatro cifras:

7C3(16 = 0111 1100 0011(2

Paso de binario a hexadecimal: agrupar los dígitos binarios en grupos de cuatro, comenzando por la derecha, y transformar cada uno en una cifra hexadecimal conservando la posición:

11010(2 = 1A(16 = 26(10

Page 15: informatica

6

2013 10M.A. Zapata, A. Francés, J.C.Ciria

Codificación de enteros

El número de bits disponibles para representar un número es finito(¡¡ la memoria de un ordenador es finita !!)

¿Cuántos números enteros distintos es posible representar…… con 3 bits?

… con n bits?

de 000 a 111 : 8 números distintos

2n números distintosde 0 … 0 a 1 …1 :n n

2013 11M.A. Zapata, A. Francés, J.C.Ciria

Codificación de enteros

El número de bits disponibles para representar un número es finito

Eso afecta al resultado de las operaciones:

¿Cuál es el resultado de sumar 3 + 5 ... si sólo disponemos de 3 bits?

10 111 0

00 0

1

1

1

101 es el número que sumado a 011 me da 0:Podemos utilizarlo para representar números negativos (complemento a 2):Podemos tomar 101 como la representación de -3

Page 16: informatica

7

2013 12M.A. Zapata, A. Francés, J.C.Ciria

Codificación de enteros

El número de bits disponibles para representar un número es finitoPodemos representar negativos mediante su complemento a 2

¿Cómo se calcula?(Ejemplo: representación de -5, si disponemos de 8 bits para representar un número)

1.Se toma el valor absoluto (5)

2.Intercambiamos 0 <-> 1

3.Sumamos 1

Comprobación:

0000 0101

1111 1010

1111 1011

0000 0101

1111 1011

Existen otras convenciones posibles para representar números negativos, pero con el complemento a 2 la suma de enteros, independientemente de su signo, se realiza con el mismo algoritmo que la suma de positivos.

2013 13M.A. Zapata, A. Francés, J.C.Ciria

Codificación de enteros

El número de bits disponibles para representar un número es finitoPodemos representar negativos mediante su complemento a 2Al tratar con un entero, hay que especificar cómo interpretarlo:

Consideramos sólo positivos Consideramos positivos y negativosSi el primer bit es 0: positivoSi el primer bit es 1: negativo

01234567

0123

-4-3-2-1

000001010011100101110111

Page 17: informatica

8

2013 14M.A. Zapata, A. Francés, J.C.Ciria

Codificación de enteros

El número de bits disponibles para representar un número es finitoPodemos representar negativos mediante su complemento a 2Al tratar con un entero, hay que especificar cómo interpretarlo:

número de bits

Sólo positivos Positivos y negativosSi el primer bit es 0: positivoSi el primer bit es 1: negativo

3 mayor

menor

n mayor

menor

011(2

011…1(2

n

= 3

= 2n-1 -1

100(2 = -4

100…0(2

n

= - 2n-1

000(2

111…1(2

n

= 0

= 2n -1

111(2 = 7

000…0(2

n

= 0

¿Cuál es el rango de enteros que podemos representar usando n bits?

2013 15M.A. Zapata, A. Francés, J.C.Ciria

Codificación de números reales

Coma flotante: la idea es representar el número real en “notación científica” (pero usando base 2).

mantisa

exponente

Un número real: +/- 1.m 2e

SignoMantisa

Exponente

10.25 = 1010.01(2 = + 1.01001 x 2 3

Page 18: informatica

9

2013 16M.A. Zapata, A. Francés, J.C.Ciria

Codificación de números reales

Coma flotante: la idea es representar el número real en “notación científica” (pero usando base 2).

mantisa

exponente10.5 = 1010.1(2 = + 1.0101 x 2 3

nm bits para la mantisa

1 bit para el signo: 0 (positivo), 1(negativo)

ne bits para el exponente

0 0 1 1 0 1 0 1

A mayor ne: podemos representar reales más grandes y más pequeños (en valor absoluto)A mayor nm: podemos representar reales con más decimales (mayor precisión)

2013 17M.A. Zapata, A. Francés, J.C.Ciria

Codificación de números reales

En esta idea se basa el estándar IEEE754Para representar reales “cortos”) utiliza 32 bits: 1 para el signo, 23 mantisa (precisión), 8 para el exponente (magnitud).

nm bits para la mantisa

1 bit para el signo: 0 (positivo), 1(negativo)

ne bits para el exponente

Nota: en el estándar, el exponente se codifica con sesgo 2ne-1-1

Page 19: informatica

10

2013 18M.A. Zapata, A. Francés, J.C.Ciria

Codificación de números reales

Sólo representamos una cantidad finita de reales, usando una cantidad fijada de bytes.

La precisión es finita: eso puede dar lugar a errores de redondeo: operaciones cuyo resultado no es representable en particular al operar con números de magnitud muy diferente

Ejemplo: 10-20 + 1 se redondea a 1 (no hay precisión suficiente)

2013 19M.A. Zapata, A. Francés, J.C.Ciria

Codificación de caracteres

La idea para codificar caracteres en binario es sencilla: basta adoptar una serie de acuerdos!!

– Cuántos y qué caracteres representamos:alfabéticos (mayúsculas/minúsculas)dígitos (0, 1, 2, …)símbolos (+, −, :, !, ?, %, $…)otros ??

– Del número de caracteres determinamos cuántos bits necesitaremos para representar cada uno.

n caracteres bitsej. Si n=95 (26 < 95 ≤ 27 = 128) necesitamos 7 bits

– Asociamos a cada carácter un entero codificado en binario:ej.:

n2log

Carácter Codificación (binaria) Codificación (base 10)

'A' 0100 0001(2 65

'B' 0100 0010(2 66

'a' 0110 0001(2 97

Page 20: informatica

11

2013 20M.A. Zapata, A. Francés, J.C.Ciria

Código ASCII

2013 21M.A. Zapata, A. Francés, J.C.Ciria

Codificación de caracteres (estándares)

• Uno de los primeros estándares fue ASCII (American Standard Code for Information Interchange). Usa 7 bits para codificar 128 caracteres (no contiene caracteres como ‘Ñ’, ‘ñ’, ‘á’, ‘ç’,…)

• Diversas ampliaciones que usan 1 byte (256 caracteres). Por ejemplo, ISO-8859-1 (ISO-Latin-1). En todas los 128 primeros caracteres coinciden con ASCII.

• ANSI (American National Standard Institute) es el usado por Windows. Es una revisión de ASCII ampliado a 1 byte.

• EBCDIC (de IBM para grandes ordenadores): 1 byte

• UNICODE (Java): 2 bytes = 65536 caracteres¿ … ?

Page 21: informatica

12

2013 22M.A. Zapata, A. Francés, J.C.Ciria

Ejercicio

Suponemos:• Las celdas de memoria tienen 7 bits• Codificamos los reales siguiendo una versión simplificada del estándar IEEE754:

• Codificamos los enteros por el método de complemento a 2• Codificamos los caracteres siguiendo el código ASCII

2.25 = 10.01(2 = + 1.001 x 2 1 0 0 0 1 0 0 1

Usando un lenguaje de programación, reservamos celdas para almacenar:

Un número natural, mUn entero, nUn real, xUn carácter, c

1 0 1 0 1 0 1

1 0 1 0 1 0 1

1 0 1 0 1 0 1

1 0 1 0 1 0 1

m:

n:

x:

c:

Si el contenido de las respectivas celdas es el siguiente, ¿cómo se interpretan (qué valor se asigna a cada uno)?

2013 23M.A. Zapata, A. Francés, J.C.Ciria

Ejercicio

Con el estándar IEEE754,si se dispone de nm bits para la mantisa, ¿cuál es la mayor precisión posible?

¿Cuál es el menor número 1 + x que sea distinguible de 1?

… si nm = 23… si nm = 52

Page 22: informatica

1

2013 0M.A. Zapata, A. Francés, J.C.Ciria

Informática

Tipos de datosy

sentencias elementales

2013 1M.A. Zapata, A. Francés, J.C.Ciria

Los algoritmos manipulan datos, que pueden ser de distintos tipos.

Un tipo de datos es un conjunto bien definido de valores (dominio)

y de operaciones definidas sobre ellos

Tipos de datos elementales:• Booleano• Entero• Real• Carácter• Cadena de caracteres

Tipos de datos

Page 23: informatica

2

2013 2M.A. Zapata, A. Francés, J.C.Ciria

Dominio: valores lógicos VERDADERO y FALSONotación: V, FOperadores:

Tipos de datos: booleano (i)

Y V F

V

F

O V F

V

F

De igualdad (== , !=)

== V F

V

F

!= V F

V

F

NO V F

VF FV

FF

VV

FV

FV

VF

VF

FV

NO:operador unario (un solo operando) Y, O, ==, !=: binarios (dos operandos)

Lógicos ( NO , Y , O)

2013 3M.A. Zapata, A. Francés, J.C.Ciria

Comprueba las igualdades: NO (PA Y PB) = (NO PA) O (NO PB)

Tipos de datos: booleano (y ii)

PA PB PA Y PB NO (PA Y PB ) NO PA NO PB (NO PA) O (NO PB)

V V

V F

F V

V V

NO (PA O PB) = (NO PA) Y (NO PB)

PA PB PA O PB NO (PA O PB ) NO PA NO PB (NO PA) Y (NO PB)

V V

V F

F V

V V

Page 24: informatica

3

2013 4M.A. Zapata, A. Francés, J.C.Ciria

Dominio: conjunto de todos los enterosNotación: notación decimal (10, -4, +33)Operadores:

Tipos de datos: entero

Relacionales: >, <, ≥, ≤, ==, != (el resultado: booleano)

6 > 3 � Verdadero

Aritméticos (el resultado es entero)cambio de signo (-) - 3 � -3 - -4 � 4suma (+)resta (-)producto (*)cociente (/) 3/2 � 1, 2/3 � 0resto (%) 3%2 � 1, 2%3 � 2

2013 5M.A. Zapata, A. Francés, J.C.Ciria

Dominio: conjunto de todos los realesLiterales: notación decimal (1., 1.4, -3.5) o científica (2.2E2 = 2.2 102)Operadores:

Tipos de datos: real

Relacionales: >, <, ≥, ≤, ==, != (el resultado: booleano)

-6 > 3 � Falso

Aritméticos (el resultado es real)cambio de signo (-)suma (+)resta (-)producto (*)cociente (/) 3.0/2.0 � 1.5, 2.0/3.0 � 0.66

Page 25: informatica

4

2013 6M.A. Zapata, A. Francés, J.C.Ciria

Dominio: conjunto de símbolos para representar letras, dígitos,...• Símbolos de la tabla ASCII (ISO-8859-1)

Literales: 'a', 'b', 'A', '0', '1', '+', '%'• especiales: ‘\’’, ‘\\’ (similares a C/C++)

Operadores:

Tipos de datos: carácter

Relacionales: >,<, ≤, ≥, ==, != (el resultado es booleano)orden de su código según la tabla ASCII (casi alfabético)

'0' 48

'1' 49

'2' 50

... ...

'9' 57

'ñ' 164

'Ñ' 165

'A' 65

'B' 66

'C' 67

... ...

'Z' 90

'a' < 'b':'a' < 'B':'1' < '2':'a' < '1':

'a' 97

'b' 98

'c' 99

... ...

'z' 122

97 < 98 � Verdadero97 < 66 � Falso49 < 50 � Verdadero97 < 49 � Falso

2013 7M.A. Zapata, A. Francés, J.C.Ciria

Dominio: cadenas de caracteres (~ palabras, frases)secuencias finitas de caracteres de la tabla ASCII

Literales: “entre comillas dobles”1 literal entero'1' literal carácter"1" literal cadena

Operadores:

Tipos de datos: cadena

Relacionales: >,<, ≤, ≥, ==, !=• resultado booleano (verdad, falso)• orden lexicográfico inducido por el orden de los caracteres:(~ alfabético)Una cadena es menor que otra si coinciden sus primeros n-1 caracteres y el n-ésimo de la primera cadena es menor queel n-ésimo de la segunda:

"abc" < "b": "ana" < "aro":"02" < "1":

� Verdadero� Verdadero� Verdadero

Page 26: informatica

5

2013 8M.A. Zapata, A. Francés, J.C.Ciria

Los algoritmos manipulan datos.

Los objetos de datos básicos que se manipulan en un programa son variables y constantes.

Una variable...• tiene un tipo de dato (booleano, entero, real, carácter) bien

definido.• tiene un nombre (identificador)• tiene un valor• tiene asignado un espacio en la memoria principal, y una

dirección de memoria.

Variables, constantes y expresiones

2013 9M.A. Zapata, A. Francés, J.C.Ciria

Una constante puede ser:• Un literal: 7, -14.77, 'a'• Una constante con nombre: podemos definir una constante llamada PI a la que asignamos un valor 3.141592

Una expresión es una combinación bien formada de operadores y operandos (que pueden ser constantes o variables).

Evaluar una expresión es realizar las operaciones que contiene, obteniendo un valor como resultado. El tipo de expresión es el tipo de dato al que corresponde el valor devuelto.

Variables, constantes y expresiones

Page 27: informatica

6

2013 10M.A. Zapata, A. Francés, J.C.Ciria

1) Operadores unarios (!, -)

2) * / %

3) + -

4) Operadores de relación (>, <, ≥, ≤)

5) Operadores de igualdad ( ==, !=)

6) Y

7) O

Asociatividad: de izquierda a derechaAnte la duda: usar paréntesis

Precedencia de operadores

2013 11M.A. Zapata, A. Francés, J.C.Ciria

Expresiones

Evaluación de expresiones compuestas: se evalúan, de izquierda a derecha (asociatividad), las subexpresiones en orden de precedencia de sus operadores. Las subexpresiones entre paréntesis se evalúan primero.

Ej.: 17 + 3 < 1.0 * 8.0

17 + 3 < 8.0

20 < 8.0

falso

¡ mezcla tipos entero y real ! ¿es correcto?

Promoción automática de entero a real dentro de una expresión

Page 28: informatica

7

2013 12M.A. Zapata, A. Francés, J.C.Ciria

Metodología

Ante un problema: (no hay un método universal para resolver todos los problemas)

Análisis/Especificación: ¿Hemos comprendido correcta y completamente el problema, con todas sus implicaciones? ¿Hemos previsto sus posibles puntos críticos? Determinar qué debe hacer el algoritmo y cuáles son sus entradas y resultados

Diseño: Encontrar una solución para el problema, haciendo abstracción de aspectos técnicos (de la plataforma, del lenguaje de programación…) (Pseudocódigo). Empezar por una descripción a grandes rasgos, que se irá refinando hasta obtener una solución detallada..Decidir qué estructuras de datos vamos a necesitar.

Implementación: codificación en un lenguaje de programación (C/C++), teniendo en cuenta sus peculiaridades específicas.

2013 13M.A. Zapata, A. Francés, J.C.Ciria

Ejemplo

Problema: dado un entero n≥0, que representa una cantidad de tiempo en segundos, calcular su equivalente en horas, minutos y segundos.

>>

<<

Salida

Entrada

Memoria

horas

n

minutos

segundos

Procesamiento(aritmética y control)

Page 29: informatica

8

2013 14M.A. Zapata, A. Francés, J.C.Ciria

Ejemplo

Problema: dado un entero n≥0, que representa una cantidad de tiempo en segundos, calcular su equivalente en horas, minutos y segundos.

Análisis: Entradas: un entero ≥0Salidas: tres enteros ≥0 (dos de ellos <60)

2013 15M.A. Zapata, A. Francés, J.C.Ciria

Ejemplo

¿Qué variables necesitamos? n horas minutos segundos

Estado inicial: ¿? ¿? ¿? ¿?

Paso 2) Calcular el número de horas, tomando el cociente de dividir n / 3600

3783 1 ¿? ¿?

Paso 3) Calcular el resto de dividir n / 3600, y guardarlo en n

183 1 ¿? ¿?

Paso 4) Calcular el número de minutos, tomando el cociente de dividir n/60

183 1 3 ¿?

Paso 5) Calcular el número de segundos, tomando el resto de dividir n/60

183 1 3 3

Paso 1) Leer el valor de n

3783 ¿? ¿? ¿?

Paso 6) Mostrar el resultado por pantalla

Estado final:

Page 30: informatica

9

2013 16M.A. Zapata, A. Francés, J.C.Ciria

Ejemplo

¿Qué variables necesitamos? n horas minutos segundos

Estado inicial: ¿? ¿? ¿? ¿?

Paso 2) Calcular el número de horas, tomando el cociente de dividir n / 3600

3783 1 ¿? ¿?

Paso 3) Calcular el resto de dividir n / 3600, y guardarlo en n

183 1 ¿? ¿?

Paso 4) Calcular el número de minutos, tomando el cociente de dividir n/60

183 1 3 ¿?

Paso 5) Calcular el número de segundos, tomando el resto de dividir n/60

183 1 3 3

Paso 1) Leer el valor de n

3783 ¿? ¿? ¿?

Paso 6) Mostrar el resultado por pantalla

Estado final:

Algoritmo: Secuencia (ordenada) finita de pasos que permiten obtener la solución de un problema.

Traza de un algoritmo: la secuencia de estados por los que va pasando

2013 17M.A. Zapata, A. Francés, J.C.Ciria

Tipos de sentencias

¿Qué tipos de sentencias necesitamos?

� Declaración de variables: cuántas vamos a usar y de qué tipos

� Asignación: almacenar en una variable el resultado de evaluar una expresión

� Comunicación con el exterior:– Lectura de teclado (asignación externa): asignar a una

variable un valor que tecleamos– Escritura en pantalla: mostrar en pantalla el valor de

una variable

Page 31: informatica

10

2013 18M.A. Zapata, A. Francés, J.C.Ciria

Declaración de variables

• Sintaxis: <id_variable> ES <tipo><id_var1>, <id_var2> ES <tipo>

• Semántica:No expresa una acción. Sólo indica cuántas variables usaremos, sus nombres y el tipo de cada una de ellas.

n, horas, minutos, segundos ES entero

x ES real

b ES booleano

2013 19M.A. Zapata, A. Francés, J.C.Ciria

Asignación

• Sintaxis: cómo se escribe la instrucciónid_variable expresión

– La expresión puede ser una constante o una variable– id_variable y expresión deben ser del mismo tipo– Si id_variable es real, la expresión puede ser entera

• Semántica: qué hace la sentencia1) Se evalúa la expresión2) El valor obtenido se almacena en la variable (su valor

anterior se pierde)

Page 32: informatica

11

2013 20M.A. Zapata, A. Francés, J.C.Ciria

Asignación: ejemplos

horas n / 3600n n % 3600minutos n / 60segundos n % 60

Suponer que x es una variable entera y

b una variable booleana

x 1324

b falsox 7+5*2

x 17

b falsob x > 3

x 17

b verdad

x 1.0

b ‘a’ERROR !!

2013 21M.A. Zapata, A. Francés, J.C.Ciria

Lectura de teclado

• Sintaxis: leer(id_var) leer(id_var1, id_var2,...)– Las variables pueden ser de cualquier tipo básico (entero,

real, carácter, cadena)

• Semántica: en el teclado se escriben caracteres que representan un valor adecuado para el tipo de la variable. Entonces, el valor se asigna a la variable. Si el valor no es adecuado el resultado de la operación está indefinido (ERROR)

Ej.: variables x real, n entero, c carácter, s cadena

Leer(x) 7.5 -48.3 -4.1E2 Hola X

Leer(n) -1234 34 abc 7.5

Leer(c) a 1 ,

Leer(s) hola

Cadenas y caracteres se introducen sin comillas

MAL

Page 33: informatica

12

2013 22M.A. Zapata, A. Francés, J.C.Ciria

Escritura en pantalla

• Sintaxis: escribir(expresión) escribir(exp1, exp2, ...)– Las expresiones pueden ser de cualquier tipo básico (entero,

real, carácter, cadena y booleano)– Las expresiones pueden ser simplemente una variable o una

constante• Semántica:

1) Se evalúa la expresión2) En pantalla se escribe una secuencia de caracteres que

representa el valor (cadenas y caracteres sin comillas)

Escribir(7+4) 11

Escribir(2*x) 2.2 (suponiendo que el valor de x es 1.1)

Escribir(“hola”) hola

Escribir(7<4) falso

escribir(exp1, exp2) equivale a escribir(exp1), escribir(exp2)

2013 23M.A. Zapata, A. Francés, J.C.Ciria

Estructura de un algoritmo

Algoritmo nombre_algConstantes cte1 = valor1

cte2 = valor2...

Variables var1 es tipo1...

Principiosecuencia de sentencias(se ejecutan en el ordenen que se escriben)

Fin

Pasos:

Declarar las variables (y, en su caso, constantes) necesariasPedir al usuario que teclee el valor de nLeer el valor de nCalcular el número de horas, tomando el cociente de dividir n / 3600Calcular el resto de dividir n / 3600, y guardarlo en nCalcular el número de minutos, tomando el cociente de dividir n/60Calcular el número de segundos, tomando el resto de dividir n/60Mostrar el resultado por pantalla

Recordatorio de sentencias:

Declaración id_variable {, id_variable} es <tipo_dato>

Ej: n es entero

x, y es real

x,y,z es real

Lectura (de teclado) leer (id_variable)

Ej: leer (x)

Asignación id_variable expresión

Ej: m n/4

Escritura (en pantalla) escribir (expresión {,expresión})

Ej: escribir ( "El resultado es ", m)

{ }: el contenido del paréntesis se puede repetir 0 o muchas veces

Page 34: informatica

13

2013 24M.A. Zapata, A. Francés, J.C.Ciria

Estructura de un algoritmo

Algoritmo nombre_algConstantes cte1 = valor1

cte2 = valor2...

Variables var1 es tipo1...

Principiosecuencia de sentencias(se ejecutan en el ordenen que se escriben)

Fin

Algoritmo Conversion_HorasConstantes

SEGUNDOS_POR_HORA = 3600SEGUNDOS_POR_MINUTO = 60

Variablesn, h, min, seg es entero

Principioescribir(“Cantidad segundos: “)leer(n)horas n / SEGUNDOS_POR_HORA

n n % SEGUNDOS_POR_HORA

min n / SEGUNDOS_POR_MINUTO

seg n % SEGUNDOS_POR_MINUTO

escribir(horas, min, seg)Fin

Ejemplo

Page 35: informatica

1

2013 M.A. Zapata, A. Francés, J.C.Ciria 0

Informática

Tipos de datosSentencias elementales

en C

2013 M.A. Zapata, A. Francés, J.C.Ciria 1

Niveles de abstracción

Nivel lógico: diseño de soluciones implementables en cualquier lenguaje de programación con el paradigma imperativo (C, FORTRAN, PASCAL…)• Nos centramos en el algoritmo en sí, haciendo abstracción de

detalles "técnicos"• Permite demostrar formalmente la validez del algoritmo,

independientemente de qué herramienta se usará para implementarlo

Nivel físico: implementación del diseño, teniendo en cuenta las características específicas del lenguaje concreto utilizado.

Page 36: informatica

2

2013 M.A. Zapata, A. Francés, J.C.Ciria 2

Booleanos: no existen en C. En C++: bool

Carácter: char

Enteros: char short int longcalificador: unsigned

Reales: float double long double

Tipos de datos predefinidos de C/C++

2013 M.A. Zapata, A. Francés, J.C.Ciria 3

Tipo bool de C++

Dominio: valores lógicos verdadero/falsoLiterales: true, falseOperadores:• lógicos: ! (negación), && (y lógico), || (o lógico)• de igualdad: ==, !=

En C existen los operadores lógicos, pero no existe el tipo bool.

• el valor 0 (cero) de cualquier tipo representa falso• cualquier valor distinto de 0 representa verdad

Page 37: informatica

3

2013 M.A. Zapata, A. Francés, J.C.Ciria 4

Dominio: caracteres de la tabla ASCIILiterales: 'a', '0', '1', '+',...Operadores: >,<, <=, >=, ==, !=

(orden del código ASCII)devuelven 0 (falso) ó 1 (verdad)

Literales para representar caracteres especiales:

'\0' código ascii 0 (carácter nulo)

'\n' código ascii 10 (nueva línea)

'\t' código ascii 9 (tabulador)

'\’' '\”' '\\'

Tipo char

2013 M.A. Zapata, A. Francés, J.C.Ciria 5

Tipos enteros en C

Un entero ocupa un número determinado de bits en memoria. A la hora de interpretarlo, hay que especificar si se trata de un número con o sin signo:

Tipos:

charshortintlong

[unsigned][unsigned][unsigned][unsigned]

Nota: en notación BNF [] significa opcional

Literales: 10, -798 (notación decimal)Operadores:• Aritméticos: +, -, *, /, %• Relacionales: >,<, <=, >=, ==, !=

Page 38: informatica

4

2013 M.A. Zapata, A. Francés, J.C.Ciria 6

Tipos de enteros en C/C++

short ≥ 2 bytes

short -215 215 - 1

unsigned short 0 216-1

long ≥ 4 bytes

long -231 231 - 1

unsigned long 0 232-1

Tamaño long ≥ tamaño int ≥ tamaño short

Los tipos int y unsigned int coinciden con la correspondiente versión short o long: la elección puede ser diferente para distintos compiladores de C

char 1 byte

char -27 27 - 1

unsigned char 0 28-1

int

2013 M.A. Zapata, A. Francés, J.C.Ciria 7

float double long doubleTamaño ≤ 4 bytes ≤ 8 bytes ≤ 8 bytes

Precisión ≤ 8 decimales ≤ 16 decimales

Dominio 3.4e-38 a 3.4e+38(4 bytes)

1.7e-308 a 1.7e+308(8 bytes)

3.4e-4932 a 3.4e+4932(12 bytes)

Literales: 10.23, -798.32 (notación decimal)4.476E1 (científica)

Operadores:• Aritméticos: +, -, *, /• Relacionales: >,<, <=, >=, ==, !=

Tipos reales en C

Page 39: informatica

5

2013 M.A. Zapata, A. Francés, J.C.Ciria 8

Sentencias elementales en C/C++

NOTA: toda sentencia elemental termina en ;

Declaración de variables:<tipo> var1, var2, var3,..., varN;

Asignación:var = expresión;

Lectura de teclado (C++):cin >> var1 >> var2 >> ... >> varN;

Escritura en pantalla (C++):cout << exp1 << exp2 << ... << expN;

2013 M.A. Zapata, A. Francés, J.C.Ciria 9

Identificadores

• Palabras no reservadas por el lenguaje (if, while,...)• Formadas por letras (excepto 'ñ', 'Ñ', 'á',...),

dígitos y carácter '_'• NO empiezan por dígito (10x no es válido)• Las letras mayúsculas y minúsculas son caracteres

distintos (case sensitive)• Pueden tener longitud arbitraria, pero sólo se

distinguen los 31 primeros caracteres

Ejemplos:Var, var, VAR, v10, _v10, precioArticulo, precio_articulo

Page 40: informatica

6

2013 M.A. Zapata, A. Francés, J.C.Ciria 10

Declaración de variables

Sintaxis:<tipo> var; <tipo> var1, var2,..., varN;

Ejemplos:char car, c1;int n, edad;double precioArticulo;

Semántica: Se reserva el identificador como nombre de la variable. El valor de la variable queda indefinido.

2013 M.A. Zapata, A. Francés, J.C.Ciria 11

Variables para representar cadenas

• En C no existe un tipo predefinido para representar cadenas de caracteres.

char var[MAX];

• MAX es una constante entera positiva. Podemos almacenar en var cadenas con longitud MAX-1 caracteres.

Inicialización:char ej[30] = "hola mundo";

Page 41: informatica

7

2013 M.A. Zapata, A. Francés, J.C.Ciria 12

Asignación

Sintaxis:<var> = <expresión>;

– C no obliga a que la expresión y la variable sean del mismo tipo; pero si no se puede hacer una conversión adecuada lo advierte con un mensaje de warning (corriendo el riesgo de pérdida de datos).

Ejemplos:int m, n; float x;n = 10; x = 5;n = n*16;x = x*4 – n/2;

Semántica:1. Se evalúa la expresión2. El valor obtenido se almacena en la variable (destruyendo el

valor anterior)

2013 M.A. Zapata, A. Francés, J.C.Ciria 13

Inicialización de variables

Es posible unir declaración y asignación en una misma sentencia:

<tipo> var = expresión;

char salto = '\n';

int n = -7;

double r = 9.6, t;

Page 42: informatica

8

2013 M.A. Zapata, A. Francés, J.C.Ciria 14

Escritura en pantalla (C++)

La sentencia en C es printf

Sintaxis:cout << expresión;cout << exp1 <<...<< expN;

– Las expresiones pueden ser de cualquier tipo, pero las booleanas deben ir entre paréntesis

– Se deben añadir explícitamente blancos y saltos de línea para separar el valor de las expresiones

Ejemplos: cout << "hola mundo";cout << "El resultado es " << 7*5 << '\n';cout << (1<7);

Semántica:Se evalúan las expresiones y se sacan por pantalla en el mismo orden en que aparecen en la sentencia.

2013 M.A. Zapata, A. Francés, J.C.Ciria 15

Lectura de teclado (C++)

La sentencia en C es scanf

Sintaxis:cin >> var;cin >> var1 >>... >> varN;

– Las variables pueden ser de cualquier tipo elemental y también cadenas (char[]), pero sólo lee una palabra.

Ejemplos:cin >> n; cin >> x >> y >> z;

Semántica:– En general, se suspende la ejecución del programa hasta que se

teclean algunos caracteres y se pulsa retorno de carro.– cin intenta interpretar los caracteres introducidos como un dato del

tipo de la variable.– Los caracteres sobrantes se utilizarán en lecturas siguientes (sin

suspender la ejecución del programa).

Page 43: informatica

9

2013 M.A. Zapata, A. Francés, J.C.Ciria 16

Ejemplo

Algoritmo Conversion_HorasConstantes

SEGUNDOS_POR_HORA = 3600SEGUNDOS_POR_MINUTO = 60

Variablesn, h, min, seg es entero

Principioescribir(“Cantidad segundos: “)leer(n)horas � n / SEGUNDOS_POR_HORA

n � n % SEGUNDOS_POR_HORA

min � n / SEGUNDOS_POR_MINUTO

seg � n % SEGUNDOS_POR_MINUTO

escribir(horas, min, seg)Fin

Implementa el algoritmo que, dado un tiempo expresado en segundos (por un número entero), lo desglose en horas, minutos y segundos

Declaración de variables:<tipo> variable1,..., variableN;Ej: int n; double x;

Asignación:variable = expresión;Ej: n = 2*m/3;

Lectura de teclado (C++):cin >> variable1 >> ... >> varN;Ej: cin >> n;

Escritura en pantalla (C++):cout << expr1 << ... << exprN;Ej: cout<< m << ", " << n;

Recuerda:

2013 M.A. Zapata, A. Francés, J.C.Ciria 17

Compilación, precompilación y ejecución

Compilación: traducción del código fuente al código máquina del procesador (ejecutable).

En C/C++, previamente se realiza una precompilación– Las directivas del precompilador no son sentencias– Se ejecutan antes de la compilación– Las más frecuentes son:

#include <fichero> //inserta código de otro fichero fuente#define PI 3.141592 //define constantes simbólicas

La compilación crea un fichero llamado MiFichero.exe que contiene el código ejecutable.

La ejecución del programa comienza por la primera sentencia de la "función" main.

Page 44: informatica

10

2013 M.A. Zapata, A. Francés, J.C.Ciria 18

Programa: ejemplo

#include <iostream>

# define SEGUNDOS_HORA 3600# define SEGUNDOS_MINUTO 60

using namespace std;

int main() {

int n, h, min, seg;

cout << "Dame la cantidad en segundos: ";

cin >> n;

h = n / SEGUNDOS_HORA ;n = n % SEGUNDOS_HORA ;min = n / SEGUNDOS_MINUTO ;seg = n % SEGUNDOS_MINUTO ;

cout << "El tiempo introducido equivale a " << h << " horas, " <<min << " minutos y " << seg << " segundos" << '\n' ;

return 0;}

Directivas del precompilador#include <iostream>

# define SEGUNDOS_HORA 3600# define SEGUNDOS_MINUTO 60

using namespace std;

int main() {

int n, h, min, seg;

cout << "Dame la cantidad en segundos: ";

cin >> n;

h = n / SEGUNDOS_HORA ;n = n % SEGUNDOS_HORA ;min = n / SEGUNDOS_MINUTO ;seg = n % SEGUNDOS_MINUTO ;

cout << "El tiempo introducido equivale a " << h << " horas, " <<min << " minutos y " << seg << " segundos" << '\n' ;

return 0;}

2013 M.A. Zapata, A. Francés, J.C.Ciria 19

Ciclo de vida de un programa

1. Edición (usando bloc de notas, codeblocks…)

2. El programador da la orden de compilar el programa:a) El compilador invoca automáticamente al preprocesador, que ejecuta

las directivas de preprocesador (incluir otros ficheros, hacer sustituciones…)

b) El compilador traduce el programa a código máquina, ejecutable por el ordenador.mingw32-g++.exe -c prueba.cpp -o prueba.o

3. El linkador incluye en el programa funciones procedentes de bibliotecas externas (matemáticas, de entrada/salida…)

mingw32-g++.exe prueba.o -o ejecutable.exe

4. El programa ejecutable se carga en la memoria principal

5. Ejecución del programa

Page 45: informatica

11

2013 M.A. Zapata, A. Francés, J.C.Ciria 20

Compilación y ejecución (detalle)

0. Incluimos en el path (ruta de búsqueda) la carpeta donde está el compilador2. Compilamos el fichero .cpp, generando el código objeto (prueba.o)3. Linkamos el código objeto, generando un fichero ejecutable (ejecutable.exe)4. Damos orden de cargar el ejecutable en memoria y de ejecutarlo.5. El programa se ejecuta

2

34

5

0

Page 46: informatica

/* Para conocer los rangos de valores de los distintos tipos de datos de tu compilador puedes usar las cabeceras <limits.h> y <float.h>, que definen constantes para el tamaño de los tipos enteros y reales, respectivamente. El siguiente programa te facilitará esa información:*/  #include <iostream>  #include <limits.h> #include <float.h>  #include <math.h> using namespace std;  int main() {         cout   << "Rango de valores:" <<'\n';         cout   << "\t char:\t" << CHAR_MIN << " a " << CHAR_MAX << '\n';         cout   << "\t unsigned char:\t" << 0 << " a " << UCHAR_MAX << '\n'<<'\n';         cout   << "\t short:\t" << SHRT_MIN << " a " << SHRT_MAX << '\n';         cout   << "\t unsigned short:\t" << 0 << " a " << USHRT_MAX << '\n'<<'\n';         cout   << "\t int:\t" << INT_MIN << " a " << INT_MAX << '\n';         cout   << "\t unsigned int:\t" << 0 << " a " << UINT_MAX << '\n'<<'\n';         cout   << "\t long:\t" << LONG_MIN << " a " << LONG_MAX << '\n';         cout   << "\t unsigned long:\t" << 0 << " a " << ULONG_MAX << '\n'<<'\n';                  cout   << "Tipos reales:" << '\n';         cout   << "\tfloat:\n";         cout   << "\t\t digitos decimales de precision: "<<FLT_DIG << '\n';         cout   << "\t\t numero x menor tal que 1+x != x: "<<FLT_EPSILON    << " =  2^" << log(FLT_EPSILON) / log (2) << '\n';         cout   << "\t\t valor minimo: "<<FLT_MIN    << " =  2^" << log(FLT_MIN) / log (2) << '\n';         cout   << "\t\t valor maximo: "<<FLT_MAX    << " =  2^" << log(FLT_MAX) / log (2) << '\n';         cout   << "\n\tdouble:\n";         cout   << "\t\t digitos decimales de precision: "<<DBL_DIG << '\n';         cout   << "\t\t numero x menor tal que 1+x != x: "<< DBL_EPSILON    << " =  2^" << log(DBL_EPSILON) / log (2) << '\n';         cout   << "\t\t valor minimo: "<<DBL_MIN    << " =  2^" << log(DBL_MIN) / log (2) << '\n';         cout   << "\t\t valor maximo: "<<DBL_MAX    << " =  2^" << log(DBL_MAX) / log (2) << '\n'; 

Page 47: informatica

         cout << endl << endl;          double x , y, total;         x = DBL_MAX;         y = DBL_MAX / pow (10, DBL_DIG);         total = x + y;         cout << x << " + " << y << " = " << total << endl;          short n, m = SHRT_MAX;         n = m + 1;         cout << m << " + 1  = " << n  << endl; return 0; } 

Page 48: informatica

1

2013 0M.A. Zapata, A. Francés, J.C.Ciria

Informática

Sentencias estructuradas (i)

2013 1M.A. Zapata, A. Francés, J.C.Ciria

Estructuras de control

Objetivos

• Adquirir conciencia de la necesidad de mecanismos de control de flujo de un programa

• Adquirir la noción de sentencia estructurada

• Familiarizarse con los principios de la programación estructurada

Page 49: informatica

2

2013 2M.A. Zapata, A. Francés, J.C.Ciria

Estructuras de control

Contenido:

• Sentencias compuestas. Concatenación de sentencias.

• Composiciones condicionales.

• Composiciones iterativas. Procesamiento de secuencias.

2013 3M.A. Zapata, A. Francés, J.C.Ciria

Algoritmo:

Conjunto ordenado y finito de operaciones que permite hallar la solución de un problema. Además: finitud, definibilidad, entrada, salida, efectividad

¿En qué orden se ejecutan las sentencias?

ordenado

Page 50: informatica

3

2013 4M.A. Zapata, A. Francés, J.C.Ciria

¿En qué orden se ejecutan las sentencias?

Orden secuencial: en el mismo orden en que están escritas

ESCRIBIR ( “Dame un tiempo en segundos”);LEER(n);h n/3600; m (n % 3600) / 60;s (n % 60);ESCRIBIR (n, “segundos son ”); ESCRIBIR (h , “horas, ”); ESCRIBIR (m , “minutos y ”);ESCRIBIR (s , “segundos ”);

1)2)3)4) 5)6)7)8) 9)

Pero hay problemas que no podemos solucionar si sólo consideramos este orden, por ejemplo:

•Leer dos números por teclado, y mostrarlos por pantalla ordenados•Calcular el factorial de un entero

2013 5M.A. Zapata, A. Francés, J.C.Ciria

¿En qué orden se ejecutan las sentencias?

Leer dos números por teclado y escribirlos en orden creciente

ESCRIBIR ( “Dame dos números”);

LEER(m, n);

ESCRIBIR (m, n);

ESCRIBIR (n, m);

1)

2)

¿Cuál se ejecuta a continuación de 2)?

Sólo se ejecuta una de las dos sentencias ESCRIBIRDepende de si m ≤ n o no

Page 51: informatica

4

2013 6M.A. Zapata, A. Francés, J.C.Ciria

¿En qué orden se ejecutan las sentencias?

Leer un entero por teclado y calcular su factorial

1)2)3)

4)5)

6)7)

8)9)

ESCRIBIR ( “Dame un número entero”);LEER( n );i n ;

factorial i; i i-1;

factorial factorial * i;i i -1;

factorial factorial * i;i i -1;

¿?¿?¿?i factorialn

¿?¿?5¿?55

555545

20452035

60356025

2013 7M.A. Zapata, A. Francés, J.C.Ciria

¿En qué orden se ejecutan las sentencias?

Leer un entero por teclado y calcular su factorial

¿Cuántas veces deben ejecutarse las sentencias

factorial factorial * i;i i -1;

?

Page 52: informatica

5

2013 8M.A. Zapata, A. Francés, J.C.Ciria

¿En qué orden se ejecutan las sentencias?

Existe un orden natural (secuencial) de ejecución de las sentencias de un programa. Pero a veces será necesario alterarlo...

... para elegir, de entre varias opciones, cuál es la siguiente sentencia que debe ejecutarse

... para repetir la ejecución de una o varias sentencias mientras se dé una condición

2013 9M.A. Zapata, A. Francés, J.C.Ciria

Sentencia estructurada

sentencias elementales

mecanismo de control de flujo

Una serie de

junto con un

que determina en qué orden deben ejecutarse

Page 53: informatica

6

2013 10M.A. Zapata, A. Francés, J.C.Ciria

Sentencias estructuradas: secuencial (bloque)

Sintaxis:sentencia_1sentencia_2

. . .sentencia_n

Las sentencias pueden ser elementales o estructuradas

Semántica:Las sentencias se ejecutan empezando por la primera, en el orden en que están escritas. Tras ejecutarse la última sentencia, se sale del bloque.

Ejemplo: los algoritmos realizados hasta ahora tienen una única sentencia "bloque" que agrupa a todas las sentencias elementales

sentencia_1

sentencia_2

sentencia_n

2013 11M.A. Zapata, A. Francés, J.C.Ciria

Sentencias estructuradas: condicional

Sintaxis:SI condición

sentencia_1;[ SI NO

sentencia_2;]FIN SI

• La cláusula SI NO es opcional• sentencia_1, sentencia_2 pueden ser sentencias

estructuradas

Semántica:1) Se evalúa la condición

2) Si el valor es VERDAD, se ejecuta la sentencia_1. Si no, se ejecuta la sentencia_2.

3) Termina la ejecución de la sentencia condicional

sentencia_1

condición V

sentencia_1sentencia_2

condición VF

Page 54: informatica

7

2013 12M.A. Zapata, A. Francés, J.C.Ciria

condicional :ejemplo

Leer dos números por teclado y escribirlos en orden creciente

Algoritmo Ordenar númerosVariables

m,n es enteroPrincipio

leer(m, n)SI (m<n)

escribir (m,n)SI NO

escribir (n,m)FIN SI

Fin

escribir (m,n)escribir (n,m)

m<n VF

2013 13M.A. Zapata, A. Francés, J.C.Ciria

Sentencias estructuradas en C/C++: secuencial (bloque)

Sintaxis:{

sentencia_1 ;sentencia_2 ;

. . .sentencia_n ;

}Las sentencias pueden ser elementales o estructuradas

Semántica:Las sentencias se ejecutan empezando por la primera, en el orden en que están escritas. Tras ejecutarse la última sentencia, se sale del bloque.

sentencia_1

sentencia_2

sentencia_n

Page 55: informatica

8

2013 14M.A. Zapata, A. Francés, J.C.Ciria

Bloque

Ejemplo:int main() {

int x = 2;{

int y = 3;cout << "x= " << x << " y= " << y << endl;

}x = x*2;cout << "x= " << x << endl;

}

NOTAS:

• En C se pueden declarar nuevas variables al comienzo de cada bloque (uso exclusivo dentro del bloque)

• En C++ se pueden declarar variables en cualquier parte (se pueden usar desde el punto donde se declaran hasta el final del bloque en que se declaran)

int x= 2

x = x*2

cout << "x= " << x << endl;

int y = 3

cout << x…

2013 15M.A. Zapata, A. Francés, J.C.Ciria

Bloque

Ejemplo:int main() {

int x = 2;{

int y = 3;cout << "x= " << x << " y= " << y << endl;

}x = x*2;cout << "x= " << x << "y= " << y << endl;

}ERROR !!!

de compilación

NOTAS:

• En C se pueden declarar nuevas variables al comienzo de cada bloque (uso exclusivo dentro del bloque)

• En C++ se pueden declarar variables en cualquier parte (se pueden usar desde el punto donde se declaran hasta el final del bloque en que se declaran)

int x= 2

x = x*2

cout << "x= " << x << endl;

int y = 3

cout << x…

NOTAS:

• En C se pueden declarar nuevas variables al comienzo de cada bloque (uso exclusivo dentro del bloque)

• En C++ se pueden declarar variables en cualquier parte (se pueden usar desde el punto donde se declaran hasta el final del bloque en que se declaran)

Page 56: informatica

9

2013 16M.A. Zapata, A. Francés, J.C.Ciria

Composición condicional en C/C++

Hay dos sentencias de selección en C/C++

• if / else selección simple• switch selección múltiple

2013 17M.A. Zapata, A. Francés, J.C.Ciria

C/C++: sentencia if

Sintaxis:if (condición) sentencia_1

[else sentencia_2]

• La cláusula else es opcional• sentencia_1, sentencia_2 pueden ser sentencias estructuradas• Los paréntesis de la condición son obligatorios• La condición es una expresión de cualquier tipo. Recordar que en C no hay booleanos

(el valor 0 representa falso y cualquier valor 0 representa verdad)• La sentencia if NO termina en ‘;’. Si hay un ‘;’ tras sentencia_1 o sentencia_2

depende de ellas mismas.

Semántica:1. Se evalúa la condición

2. Si el valor representa VERDAD ( 0), se ejecuta la sentencia_1. Si representa FALSO (=0), se ejecuta la sentencia_2.

3. Termina la ejecución de la sentencia condicionalsentencia_1sentencia_2

condición VF

Page 57: informatica

10

2013 18M.A. Zapata, A. Francés, J.C.Ciria

C/C++: sentencia if (ejemplos)

Ordenar dos enteros leídos de teclado (el primero debe acabar teniendo el valor más pequeño).

int main() {int n, m;cout << "Introduce dos enteros: ";cin >> m >> n;

if (m > n) {

m = n; n = m;

}

cout << m << " " << n;}

¿? ¿?

m n

¿? ¿?

4 5

4 4

5 4

4 4

4 4

2013 19M.A. Zapata, A. Francés, J.C.Ciria

C/C++: sentencia if (ejemplos)

Ordenar dos enteros leídos de teclado (el primero debe acabar teniendo el valor más pequeño).

int main() {int n, m, auxcout << "Introduce dos enteros: ";cin >> m >> n;

if (m > n) {

aux = m; m = n; n = aux;

}

cout << m << " " << n;}

¿? ¿? ¿?

m n

¿? ¿?

4 55 4

¿?

¿?

aux

5 4 5

4 4 5

4 5 5

4 5 5

Page 58: informatica

11

2013 20M.A. Zapata, A. Francés, J.C.Ciria

C/C++: sentencia if (ejemplos)

int main() {int n, m, aux;cout << "Introduce dos enteros: ";cin >> m >> n;

if (m > n) {

aux = m; m = n; n = aux;

}

cout << m << " " << n;}

Sí: Agrupan varias sentencias en una única de tipo bloque

Las llaves, ¿ son obligatorias ?

2013 21M.A. Zapata, A. Francés, J.C.Ciria

C/C++: sentencia if (ejemplos)

int main() {int n, m, aux;cout << "Introduce dos enteros: ";cin >> m >> n;

if (m > n) {

aux = m; m = n; n = aux;

}

cout << m << " " << n;}

Sí: Agrupan varias sentencias en una única de tipo bloque

Las llaves, ¿ son obligatorias ?

Equivale a:

SI m>n

aux m

FIN SI

m n

n aux

Page 59: informatica

12

2013 22M.A. Zapata, A. Francés, J.C.Ciria

C/C++: sentencia if (ejemplos)

int main() {int n1, n2, n3;cout << “Introduce tres enteros: “;cin >> n1 >> n2 >> n3;

if ((n1 <= n2) && (n2 <= n3))cout << "creciente";

elseif ((n1 >= n2) && (n2 >= n3))

cout << "decreciente";else

cout << "desordenada";

}

No son necesarias las llaves:

• Sólo hay una sentencia

El ‘;’ final se escribe porque lo necesita cout, NO la sentencia if

Dados tres enteros, introducidos por teclado, decidir si están dados en orden creciente, decreciente o si están desordenados

2013 23M.A. Zapata, A. Francés, J.C.Ciria

Problema de los else’s colgantes

Problema: leer tres enteros de teclado. La salida será un mensaje en pantalla indicando si el primer entero es estrictamente menor o mayor que los otros dos. En otro caso no se escribirá nada en pantalla.

Algoritmo ejemploVariables a, b, c son enterosPrincipio

leer(a, b, c)SI (a < b)

SI (a < c)escribir(a, " es el menor")

FIN SISI NO

SI (a > b Y a > c)escribir(a, " es el mayor")

FIN SIFIN SI

Fin

Las palabras “FIN SI” indican dónde

terminan las sentencias “SI”....

... y queda claro a qué “SI”

pertenece el “SI NO”

Page 60: informatica

13

2013 24M.A. Zapata, A. Francés, J.C.Ciria

Problema de los else’s colgantes

int main() {int a, b, c;cin >> a >> b >> c;if ( a < b )

{if ( a < c ){

cout << a << “ es el menor”;}

}else

{if ( a > b && a > c ){

cout << a << “ es el mayor”;}

}}

¿A qué if corresponde el else?

Al inmediatamente anterior del

mismo bloque al que no se le haya

asignado todavía un else

SOLUCIÓN: poner llaves para separar bloques

RECOMENDACIÓN: poner todas las llaves

2013 25M.A. Zapata, A. Francés, J.C.Ciria

C/C++: switch (selección múltiple)

SINTAXIS:switch (expresión) {

case cte1: sentencia11....sentencia1kbreak;

case cte2: sentencia21....sentencia2kbreak;

........[ default: sentencia_d1

....sentencia_dkbreak; ]

}

expresión: de un tipo entero o char(los paréntesis son obligatorios)

Constantes del mismo tipo que la expresión (puede haber tantas como se quiera, pero sólo una en cada case)

La cláusula default es opcional:

• No es necesario que sea la última

El break de la última cláusula (case o default) no es necesario

Las sentencias pueden ser simples o estructuradas

Page 61: informatica

14

2013 26M.A. Zapata, A. Francés, J.C.Ciria

C/C++: switch (selección múltiple)

SINTAXIS:switch (expresión) {

case cte1: sentencia11....sentencia1kbreak;

case cte2: sentencia21....sentencia2kbreak;

........[ default: sentencia_d1

....sentencia_dkbreak; ]

}

Los case’s y default actúan como etiquetas dentro del switch

SEMÁNTICA:

1. Se evalúa la expresión

2. Si el valor coincide con una de las constantes, se ejecutan las sentencias que hay tras el correspondiente case hasta

• Llegar a un break

• Llegar al final del switch (})

3. Si no coincide con ninguna constante, se procede del mismo modo comenzando con las sentencias de la parte default (si no hay default no se hace nada)

2013 27M.A. Zapata, A. Francés, J.C.Ciria

C/C++: switch (ejemplo)

int main() {char letra;cin >> letra;switch (letra) {

case 'a':case 'e':case 'i':case 'o':case 'u':

cout << letra << " es una vocal";break;

default:cout << letra << " NO es una vocal";break;

}}

Page 62: informatica

15

2013 28M.A. Zapata, A. Francés, J.C.Ciria

El operador =

¿Es correcto el siguiente programa?

cout << "Introduce un número";cin >> n;if ( c = 2)

cout << "Has introducido el número 2";

Se ha utilizado el operador de asignación (=) en lugar del de comparación (==).

Variabl = expr es una expresión, cuyo valor es el resultado de evaluar expr.

En el caso anterior, (c=2) es una expresión con valor 2: siempre es cierta.

Para evitar el problema: escribir la condición al revés: (2==c)

cout << "Introduce un número";cin >> n;if ( c = 2)

cout << "Has introducido el número 2";

2013 29M.A. Zapata, A. Francés, J.C.Ciria

Fin

Page 63: informatica

1

2013 0M.A. Zapata, A. Francés, J.C.Ciria

Informática

Sentencias estructuradas (ii): Bucles

2013 1M.A. Zapata, A. Francés, J.C.Ciria

Bucle (ejemplo): Factorial (análisis)

Problema: calcular el factorial de un entero n>0.

entradas) un entero n 0 (por teclado)salidas) un entero: n! (por pantalla)

Solución:El factorial de un número es n! = 1 * 2 * … * (n-1) * (n-2) * n

Además de n, necesitamos otras dos variables enteras:

• una (fact) para ir almacenando los productos parciales:

1 1*2 = 2 2 * 3 = 6 6 * 4 = 24 … 1*2*3* … * n = n!

• otra (k) que lleve cuenta del último factor considerado:

1 2 3… n-1 n

Bastará con comenzar con k=1 y repetir el proceso n veces (~ inducción).

Al finalizar la variable fact tendrá el valor n!.

Page 64: informatica

2

2013 2M.A. Zapata, A. Francés, J.C.Ciria

Bucle (ejemplo): Factorial (diseño)

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

leer(n)

fact 1

k 1MIENTRAS (k <= n)fact fact * k

k k + 1FIN MIENTRASescribir(fact)

Fin

5 ¿? ¿?

5 1 ¿?

5 1 1

5 1 1

5 1 2

n fact k

2013 3M.A. Zapata, A. Francés, J.C.Ciria

Bucle (ejemplo): Factorial (diseño)

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

leer(n)

fact 1

k 1MIENTRAS (k <= n)fact fact * k

k k + 1FIN MIENTRASescribir(fact)

Fin

5 ¿? ¿?

5 1 ¿?

5 1 1

5 1 2

n fact k

5 2 2

5 2 3

Page 65: informatica

3

2013 4M.A. Zapata, A. Francés, J.C.Ciria

Bucle (ejemplo): Factorial (diseño)

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

leer(n)

fact 1

k 1MIENTRAS (k <= n)fact fact * k

k k + 1FIN MIENTRASescribir(fact)

Fin

5 ¿? ¿?

5 1 ¿?

5 1 1

5 2 3

n fact k

5 6 3

5 6 4

2013 5M.A. Zapata, A. Francés, J.C.Ciria

Bucle (ejemplo): Factorial (diseño)

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

leer(n)

fact 1

k 1MIENTRAS (k <= n)fact fact * k

k k + 1FIN MIENTRASescribir(fact)

Fin

5 ¿? ¿?

5 1 ¿?

5 1 1

5 6 4

n fact k

5 24 4

5 24 5

Page 66: informatica

4

2013 6M.A. Zapata, A. Francés, J.C.Ciria

Bucle (ejemplo): Factorial (diseño)

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

leer(n)

fact 1

k 1MIENTRAS (k <= n)fact fact * k

k k + 1FIN MIENTRASescribir(fact)

Fin

5 ¿? ¿?

5 1 ¿?

5 1 1

5 24 5

n fact k

5 120 5

5 120 6

2013 7M.A. Zapata, A. Francés, J.C.Ciria

Bucle (ejemplo): Factorial (diseño)

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

leer(n)

fact 1

k 1MIENTRAS (k <= n)fact fact * k

k k + 1FIN MIENTRASescribir(fact)

Fin

5 ¿? ¿?

5 1 ¿?

5 1 1

5 24 5

n fact k

5 120 5

5 120 6

Page 67: informatica

5

2013 8M.A. Zapata, A. Francés, J.C.Ciria

Bucle (ejemplo): Factorial (diseño)

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

leer(n)

fact 1

k 1MIENTRAS (k <= n)fact fact * k

k k + 1FIN MIENTRASescribir(fact)

Fin

5 ¿? ¿?

5 1 ¿?

5 1 1

5 24 5

n fact k

5 120 5

5 120 6

Estructura del bucle:

Cuerpo: una sentencia que se repiteEn nuestro caso:el bloquefact fact * kk k + 1

Condición:mientras se cumpla, seguimos dentro del buclesi no se cumple, salimos del bucle

En nuestro caso:k <=n

2013 9M.A. Zapata, A. Francés, J.C.Ciria

Sentencias estructuradas: bucle

Sintaxis:

MIENTRAS condiciónsentencia_1;

FIN MIENTRAS

• sentencia_1 puede ser elemental o estructurada

Semántica:1) Se evalúa la condición

2) Si es VERDAD, se ejecuta el cuerpo del bucle(sentencia_1) y se vuelve a 1).Si no, se sale del bucle.

El bucle siempre termina evaluando la condición. Si la primera vez que la condición se evalúa es falsa, el cuerpo no se ejecuta.

¡Cuidado con los bucles infinitos!

condición V

F

sentencia

Page 68: informatica

6

2013 10M.A. Zapata, A. Francés, J.C.Ciria

Bucle (ejemplo): Factorial (diseño)

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

leer(n)fact 1k 1MIENTRAS (k <= n)

fact fact * kk k + 1

FIN MIENTRASescribir(fact)

Fin

leer (n)

fact 1

k 1

escribir (fact)

calcular factorialk <= n V

Fsentenciak k + 1

fact fact * k

2013 11M.A. Zapata, A. Francés, J.C.Ciria

Dados dos números naturales, m y n, calcular su máximo común divisor

Bucle (ejemplo): m.c.d (análisis)

Problema: calcular el mcd de dos naturales, m y n

Análisis:

entradas) dos enteros m, n 0 (por teclado)salidas) un entero: mcd (por pantalla)

Solución: Vamos probando sucesivamente con m, m-1, m-2…

hasta encontrar un número que sea divisor de m y de n.

Page 69: informatica

7

2013 12M.A. Zapata, A. Francés, J.C.Ciria

Bucle (ejemplo): m.c.d (diseño)

Algoritmo mcdVariables

m,n, mcd SON enterosPrincipio

leer(m,n)mcd m

MIENTRAS ( m%mcd != 0 O n%mcd != 0 )mcd mcd -1

FIN MIENTRASescribir("El mcd de ", m , " y ", n, " es ", mcd)

Fin

2013 13M.A. Zapata, A. Francés, J.C.Ciria

Corrección de un bucle

¿Cómo asegurar que un bucle es correcto?

• Informal: traza

• Formal:– Hace lo que queremos: invariante del bucle– Problema de la parada: función de cota

Page 70: informatica

8

2013 14M.A. Zapata, A. Francés, J.C.Ciria

Técnicas de demostración: inducción matemática

Sean una propiedad P: N {true, false} definida sobre los números naturales

Si se cumplen las dos siguientes condiciones:

1) P(1) es válido.2) Si P(n) es cierta para un natural n, entonces lo es

también para n+1 [ P (n+1) es cierta]

entonces P es cierta para todos los números naturales

Nota: el enunciado puede generalizarse a los números enteros, y generalizando la hipótesis 1) suponiendo que la propiedad P se verifica dentro de un intervalo [a,b]

2013 15M.A. Zapata, A. Francés, J.C.Ciria

Técnicas de demostración: inducción matemática

Ejemplo: el problema del embaldosado.Sea un tablero dividido en mxm cuadrados iguales (m filas, m columnas), donde m es una potencia de 2. En él elegimos un cuadrado cualquiera.¿Es posible cubrir todo el tablero con teselas con la forma de L de modo que quede cubierto TODO el tablero, EXCEPTO el cuadrado seleccionado?

Si m= 2n con n=1, sí

Page 71: informatica

9

2013 16M.A. Zapata, A. Francés, J.C.Ciria

Técnicas de demostración: inducción matemática

Hipótesis: es posible cubrir un tablero de lado 2n-1. ¿Es posible cubrirlo si el lado mide 2n?

Descomponemos el tablero en cuatro, de lado 2n-1.

En uno cualquiera de los cuadrantes, seleccionamos un cuadrado

En cada uno de los otros tres cuadrantes, seleccionamos un cuadrado de modo que hagan esquina

Por hipótesis, es posible rellenar cada uno de los cuatro cuadrantes con la L. Por tanto, es posible rellenar todo el tablero.

Ejercicio: por inducción, probar n3 < 2n, para números naturales n lo suficientemente grandes( Es suficiente con que la condición se cumpla para todo n ≥ n0 ≥ 1 )

2013 17M.A. Zapata, A. Francés, J.C.Ciria

Invariante de un bucle (1)

Invariante de un bucle: es una propiedad sobre las variables del bucle que se satisface antes y después de cada iteración (prueba por inducción)

Invariantes:fact = (k-1) !

y k n+1

Hay que probar:1. Son ciertas al inicio del bucle2. Si son ciertas antes de una

iteración, entonces lo son después de la misma.

Corolario: son ciertas siempre

fact = (k-1) !y k n+1

1. Son ciertas al inicio del bucle2. Si son ciertas antes de una

iteración, entonces lo son después de la misma.

Corolario: son ciertas siempre

leer (n)

fact 1

k 1

escribir (fact)

calcular factorialk <= n V

Fsentenciak k + 1

fact fact * k

Page 72: informatica

10

2013 18M.A. Zapata, A. Francés, J.C.Ciria

Invariante de un bucle (2)

Invariantes: fact = (k-1) ! y k n+1¿Son ciertos al inicio del bucle?

Al inicio:k = 1 ( n>= 0) fact = 1 = 0!

¡¡ Son ciertas !!

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

leer(n)fact 1k 1MIENTRAS (k <= n)

fact fact * kk k + 1

FIN MIENTRASescribir(fact)

Fin

2013 19M.A. Zapata, A. Francés, J.C.Ciria

Invariante de un bucle (3)

Invariantes: fact = (k-1) ! y k n+1Si son ciertas al inicio de una iteración, ¿lo son ciertos al final?

MIENTRAS (k <= n)fact fact * kk k + 1

FIN MIENTRAS

Si se ejecuta el cuerpo del bucle (es decir, k0 n):fact = (k0 – 1)! k0 y k = k0 + 1

luego el invariante es cierto al terminar la iteración:fact = k0! = (k – 1)! y k = k0 + 1 n+1

Y al salir del bucle: n < k n+1 k = n+1 y así fact = n!

Hipótesis: al inicio son ciertask = k0 n+1fact = (k0 – 1)!

Page 73: informatica

11

2013 20M.A. Zapata, A. Francés, J.C.Ciria

Invariante de un bucle (4)

Algoritmo primo

Variables n, k son enteros

Principio

leer(n); k 2

mientras (n%k 0)

k k + 1

fin mientras

si (k < n) escribir(“no es primo”)

si_no escribir(“es primo”)

Fin

El invariante puede ser usado como técnica de diseño de bucles correctos

Problema: determinar si un entero n > 1 es primo

Análisis: entradas) un entero n > 1 (por teclado)salidas) un mensaje (por pantalla)

Idea: encontrar el menor entero k que divide a n

Invariante:k n y j, 2 j < k, n “no es divisible por” j

2013 21M.A. Zapata, A. Francés, J.C.Ciria

Función de cota

La función de cota o función limitadora es una función f, de las variables del bucle en Z, tal que1. si la condición es verdad, el valor de la función para el valor de las variables

antes de realizar la iteración i-ésima es fi 02. tras la ejecución del bucle, el valor de la función para los nuevos valores de las

variables es fi+1 < fiEl bucle terminará tras un número finito de iteraciones ya que:

f1 > f2 > f3 > .... > fi > fi+1 > .... 0

Algoritmo factorial

Variables n, fact, k son enteros

Principio

1) leer(n); fact 1; k 1

2) mientras (k <= n)

3) fact fact * k

4) k k + 1

fin mientras

escribir(fact)

Fin

• Función limitadora: f(n,k) = n – k

• Suponer que el valor de la variable k antes de una iteración es

k = k0

1. Dado que k0 n entonces f(n,k0) 0

2. Y tras la ejecución de la iteración

f(n,k) =

f(n,k0+1)= n – k0 –1 < n –k0 = f(n,k0)

Page 74: informatica

12

2013 22M.A. Zapata, A. Francés, J.C.Ciria

Composición de sentencias estructuradas

¿Cómo se combinan las sentencias estructuradas?

Secuencialmente:

VFV

F

VF

VF

2013 23M.A. Zapata, A. Francés, J.C.Ciria

Composición de sentencias estructuradas

¿Cómo se combinan las sentencias estructuradas?

Anidadas unas dentro de otras:

VF

VF

VF

Page 75: informatica

13

2013 24M.A. Zapata, A. Francés, J.C.Ciria

Sentencias estructuradas

Los bloques básicos de un programa son sentencias estructuradas

3 tipos de sentencias estructuradas: bloque, condicional, bucle

Cada una: un único punto de entrada y un único punto de salida

Pueden componerse secuencialmente o anidadas

Hay una única sentencia inicial, en la que empieza a ejecutarseel programa.

Al acabar la ejecución de una sentencia, se pasa a la siguiente. Si no hay siguiente, se termina el programa.

2013 25M.A. Zapata, A. Francés, J.C.Ciria

Bucles en C/C++

C/C++ proporciona tres modos de implementar los bucles:

• La sentencia while• La sentencia do ... while• La sentencia for

Page 76: informatica

14

2013 26M.A. Zapata, A. Francés, J.C.Ciria

Bucles en C/C++: while (sintaxis)

MIENTRAS condiciónsentencia

FIN MIENTRASwhile (condición)

sentencia;

sentenciacondiciónV

F

2013 27M.A. Zapata, A. Francés, J.C.Ciria

Bucles en C/C++: while (semántica)

La semántica de la sentencia while es la misma que hemos definido para el pseudocódigo:

while (condición)sentencia;

1) Se evalúa la condición

2) Si es VERDAD, se ejecuta el cuerpo del bucle(sentencia_1) y se vuelve a 1).Si no, se sale del bucle.

El bucle siempre termina evaluando la condición. Si la primera vez que la condición se evalúa es falsa, el cuerpo no se ejecuta.

Page 77: informatica

15

2013 28M.A. Zapata, A. Francés, J.C.Ciria

Bucles en C/C++: do ... while (sintaxis)

MIENTRAS condiciónsentencia

FIN MIENTRAS dosentencia;

while(condición);

sentenciacondiciónV

F

En algunos problemas es natural verificar la condición después de haber ejecutado la sentencia:

sentencia

MIENTRAS condiciónsentencia

FIN MIENTRAS

sentencia

condiciónV

F

do .. while es la únicasentencia estructurada que

termina en ;

2013 29M.A. Zapata, A. Francés, J.C.Ciria

Bucles en C/C++: do ... while (semántica)

dosentencia;

while (condición);

1) Se ejecuta el cuerpo del bucle

2) Se evalúa la condición

3) Si es VERDAD, se vuelve a 1.Si no, se sale del bucle.

El cuerpo del bucle siempre se ejecuta al menos una vez.

Page 78: informatica

16

2013 30M.A. Zapata, A. Francés, J.C.Ciria

Factorial (variación 1)

Completa el probrama para calcular el factorial, de modo que nos aseguremos de que el usuario ha tecleado un número válido (entero positivo):

Introduce un número entero positivo-2Introduce un número entero positivo-4Introduce un número entero positivo-1Introduce un número entero positivo-8Introduce un número entero positivo-9Introduce un número entero positivo-100Introduce un número entero positivo-3 Introduce un número entero positivo3El factorial de 3 es 6

2013 31M.A. Zapata, A. Francés, J.C.Ciria

Diseño del algoritmo

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

escribir ("Introduce un número entero positivo")leer (n)

MIENTRASescribir ("Introduce un número entero positivo")leer (n)

FIN MIENTRAS

Calcular el factorial de n como ya sabemosFin

(n <= 0)

Page 79: informatica

17

2013 32M.A. Zapata, A. Francés, J.C.Ciria

Implementación del algoritmo

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

escribir ("Introduce un número entero positivo")leer (n)

MIENTRAS n<= 0escribir ("Introduce un número entero positivo")leer (n)

FIN MIENTRAS

Calcular el factorial de n como ya sabemosFin

do{

cout << "Introduce un entero positivo: ";cin >> n;

}while (n<= 0);

2013 33M.A. Zapata, A. Francés, J.C.Ciria

Factorial (variación 2)

Algoritmo factorialVariables

n, fact, k SON enterosPrincipio

escribir ("Introduce un número entero positivo")leer (n)

MIENTRAS (n<=0)escribir ("Introduce un número entero positivo")leer (n)

FIN MIENTRAS

Calcular el factorial de n

Fin

El usuario sólo dispone de tres oportunidades

n, fact, k, contador SON enteros

( ¿…? )

contador contador + 1FIN MIENTRAS

contador 0

SI ( ¿?) Calcular el factorial de nSI NO escribir ("Agotaste tus posibilidades, cansino")FIN SI

Page 80: informatica

18

2013 34M.A. Zapata, A. Francés, J.C.Ciria

Bucles en C/C++: for (;;) (sintaxis)

for (inicialización ; condición ; incremento )sentencia;

Frecuentemente un bucle está controlado por un contador, que se inicializa antes del bucle y se incrementa en cada iteración

contador valor_inicial;

MIENTRAS (condición)sentencia;contador contador + incremento;

FIN MIENTRAScondición V

F

inicialización

incremento

otras sentencias

2013 35M.A. Zapata, A. Francés, J.C.Ciria

Bucles en C/C++: for (;;) (semántica)

1) Se ejecuta la inicialización

2) Se evalúa la condición

3) Si es VERDAD, se ejecuta la sentencia y, a continuación, se realiza el incremento.Si no, se sale del bucle.

for (inicialización ; condición ; incremento )sentencia;

Page 81: informatica

19

2013 36M.A. Zapata, A. Francés, J.C.Ciria

Bucles en C/C++: for (;;) (ejemplo)

i1;

MIENTRAS (i≤n)

ESCRIBIR (i);i i+1;

FIN MIENTRAS

for (i=1; i<= n; i=i+1)cout << i;

i≤n V

F

i 1

i i+1;

ESCRIBIR (i);

2013 37M.A. Zapata, A. Francés, J.C.Ciria

El operador ++

for (i=1; i<= n; i ++)cout << i;

• Es un operador unario.• Incrementa en una unidad el valor de la variable a que se

aplica.• Puede escribirse antes o después de la variable:

++i : primero se incrementa el valor de i y, a continuación, se evalúa la expresión en la que se encuentra.

i++ : primero se evalúa la expresión en la que se encuentra y, a continuación, se incrementa el valor de i.

Page 82: informatica

20

2013 38M.A. Zapata, A. Francés, J.C.Ciria

El operador ++ (ejemplos)

int i;

i = 4;

cout << i << endl;

cout << i++ << endl;

cout << i << endl;

cout << ++i << endl;

cout << i<< << endl;

4

4

5

6

6

2013 39M.A. Zapata, A. Francés, J.C.Ciria

Bibliografía recomendada

Programación MetódicaJ.L. Balcázar, McGraw-Hill 1993

Curso de ProgramaciónJ. Castro, F. Cucker, X. Messeguer, A. Rubio, L.Solano Prentice-Hall Hispanoamericana 1995

Diseño de Programas. Formalismo y AbstracciónM. Peña Prentice-Hall 1993

Fundamentos de Programación. Algoritmos y Estructuras de DatosL. Joyanes Aguilar, McGraw-Hill, 1996