Sei sulla pagina 1di 53

TEMA 2. Introducción al Lenguaje C++

2.1 Estructura de un programa en C++ impresión de una línea suma de dos enteros aritmética: expresiones y operadores

2.2 Componentes de un programa proposiciones declaraciones: variables, constantes y referencias los tipos: int, char, bool, float, double typedef conversión de tipos entrada/salida básica

2.3 Proposiciones de control:

composición secuencial selección: if, if/else, switch iteración: while, do/while, for los operadores (?:) y coma (,) prioridades

2.4 Propiedades de los programas

2.1 Estructura de un programa en C++ (01 Bienvenido)

//Este programa solamente escribe //Bienvenido al C++

Comentarios

#include <iostream> #include <cstdlib>

Directiva de preprocesador inclusión de archivo de encabezado (cabeceras) de flujo de entrada/salida

using namespace std;

int main ()

 

{

cout << “Bienvenido al C++”; cout << "\n\n\a"; system("PAUSE");

Esto es necesario para que se mantenga la ventana de salida

La función principal que devuelve 0

 

return 0;

}

 
  Bienvenido

Bienvenido

cout << “\tBienvenido \nal \n\nC++\n”;

al <<Línea en blanco>> C++

Secuencia de escape

descripción

\n

Salto de linea

\t

Tabulación horizontal. Mueve el cursor hasta la siguiente tabulación

\r

Retorno de carro. Coloca el cursor al inicio de la línea actual

\a

Alerta. Hace sonar la campana

Suma de dos enteros

(02 Suma dos enteros)

Problema: Suma dos números enteros leídos desde el teclado y muestra el resultado de la suma

Solución

Algoritmo sumar dos numeros es leer los dos números x1 y x2; sumar x1 y x2 y acumular el valor en suma; escribir el valor de suma

fin.

Codificado en C++

/*

#include <iostream> #include <cstdlib> using namespace std;

Este programa pide dos numeros enteros, después los suma y muestra el resultado */

int main (){ int x1, x2, suma; //declaración de variables cout << "\nEscribe el primer numero entero "; cout << "\nEscribe el segundo numero entero ";

cin >> x1; cin >> x2;

suma = x1 + x2;

//los suma y guarda el valor

cout << "\nLa suma de " << x1 << " y " << x2 << " es " << suma << endl; cout << "\n\n\a"; system("PAUSE");

return 0;

}

Primeras observaciones sobre los programas en C++

Los identificadores

nombran los objetos que intervienen en los programas

son sensibles a las mayúsculas o minúsculas (a1, A1)

no pueden comenzar por un dígito y pueden llevar _ pero NO blancos:

este_es_un_nombre_de_variable_algo_largo

EsteEsUnNombreDeVariableAlgoLargo

_mivariable_83

conviene

no

portabilidad

usar

// se suelen reservar para uso del propio lenguaje

identificadores

de

más

de

31

caracteres

por

cuestiones

Las variables

de

nombradas por un identificador

deben declararse (su tipo) antes de ser usadas

las declaraciones pueden incluir valores iniciales

int x1 = 0, x2 = 47, suma = 21;

corresponden a direcciones de memoria de la computadora

Aritmética

suma = x1 + x2;

x1 = x1 + 1;

Operadores Aritméticos:

+

-

*

/

//los suma y guarda el valor

//los suma y guarda el valor

%

 

Enteros (int)

Reales (float)

división

int x1= 5, x2 = 2; cout << (x1 / x2)

float x1= 5, x2 = 2; cout << (x1 / x2)

2

2.5

 

cout << (x1 %

cout << (x1 % x2)

modulo

x2)

1

error

Funciones Predefinidas:

pow(x,y), log(x), log10(x), sin(x), cos(x)

Definidas por el programador

(#include <cmath> )

Ejemplos

(y + z) * 2 + 1

3 / z + 1

3 % z

f(x + 1)

((2 * z) + (5 – 3 * y))

pow(2,3)

pow(

((2 * z) + (5 – 3 * y))

,

(z + 2)
(z + 2)

)

Prioridades de los operadores aritméticos

()

Se evalúan primero. Si están anidados, 1º los más internos

*

/

En segundo lugar.

%

+

-

Si hay varios, de izquierda a derecha

=

para acabar

z = p

6

* 1
*
1

r % q + w / x – y;

2

4

3

5

Comparación de dos números

(03 Compara dos enteros)

Este programa lee dos números enteros, los compara e indica si son iguales o, en caso contrario, cuál es el mayor y cuál el menor.

.

{

.

.

.

.

int x1, x2; cout << “Escribe dos numeros enteros” << endl; cin >> x1 >> x2; if (x1 == x2) cout << “Los numeros son iguales” << endl; if (x1 > x2) cout << x1 << “ es mayor que “ << x2 << endl; if (x1 < x2) cout << x2 << “ es mayor que “ << x1 << endl;

.

}

Otra versión de Comparación de dos números

.

.

.

{

 

int x1, x2; cout << “Escribe dos numeros enteros” << endl; cin >> x1 >> x2; if (x1 == x2) cout << “Los numeros son iguales” << endl; else if (x1 > x2) cout << x1 << “ es mayor que “ << x2 << endl; else cout << x2 << “ es mayor que “ << x1 << endl;

.

.

. }

Operadores de igualdad y relacionales

Operador

Asociatividad

Tipo

()

ID

paréntesis

!

DI

negación

(tiene carácter funcional por ser unario)

*

/

%

ID

multiplicación

+

-

ID

suma

>>

<<

ID

Inserción o extracción de flujo

<

<=

>

ID

relacional

>=

==

!=

ID

igualdad

&&

 

ID

conjunción

||

ID

disyunción

=

DI (carácter funcional)

asignación

Observaciones

==

!=

>=

<=

no pueden ir con un blanco entre los dos símbolos

=!

=>

=<

son errores sintácticos

() incluye la llamada de funciones

no se debe confundir == con =

Asignaciones

Son expresiones

El operador de asignación

lateral (importantísimo) lo asigna al objeto situado a la izquierda.

devuelve

el valor de la parte derecha que, como efecto

Asociatividad de “=

x

+ y + z

significa

significa

(x + y) + z

x

= y = 0

x = (y = 0)

x

= y = 0

significa

y = 0; x = 0;

Asignaciones Abreviadas

x

= x + 2

x += 2

x = x / y

x /= y

x

= x * y

x *= y

x = x + 1

x += 1

x

= x - 1

x -= 1

x-- --x

x++++x

07 Exp Abreviadas

int x = 3, y = 4;

y

= x++;

y=3, x=4

y

= ++x;

y=4, x=4

y++ = x

Error!!

++y = x;

y=3, x=3

(++y)++;

y=6

x

= x++ + y--

y=3, x=8

x

= ++x + --y

y=3, x=7

x

= (y *= 5) + 3

y=20, x=23

x

+= (y /= 2)

y=2, x=5

   

2.2 Componentes de un programa

El texto de un programa en C++ esencialmente consta de

funciones

int main ()

:

contienen proposiciones que especifican las operaciones que se van a realizar:

proposición

proposición

proposición

proposición de iteración

proposición de salto

expresión

compuesta

de selección

x1 = x2 + 3;

{ x1 = x2 + 3; cout << x1;}

if (x1 == x2)

for (int i = 1;i<=10;i++) { …}

break;

variables

: almacenan los valores utilizados durante los cálculos

Declaraciones: variables, constantes y referencias (04 Const y Refs)

Las variables, ya lo vimos, deben ser declaradas antes de ser usadas. Una declaración

incluye:

pueden ir fuera del

pueden usarse para valores que no se podrán cambiar

pueden especificar referencias (sinónimos de variables)

<calificador> <tipo> <lista de objetos declarados>

int main()

const int cien = 100;

double &l = longitud;

{

const double pi = 3.1416; double radio = 25.345; double longitud = 2 * pi * radio; double &l = longitud;

// l y longitud son sinonimos

cout << "\nradio = " << radio << "\nLongitud = " << longitud << "\nl = " << l << endl;

cout << "\nSi asignamos a Longitud el valor 35.56 tenemos: " << endl; longitud = 35.56; cout << "\nlongitud = " << longitud << "\nl = " << l << endl; }

Tipos de datos elementales de C++

Números

enteros: int, short, long, unsigned

reales:

float, double, long double

Caracteres

char, unsigned char

Lógico

bool

Definiciones sinónimas

typedef

int entero;

Tipos Enteros: con base en la representación entera

La representación entera: bit

en la representación entera La representación entera: bit 0/1 Si usan n bits para su representación

0/1

Si usan n bits para su representación pueden almacenar 2 n valores distintos

char

unsigned, signed

long, short

int

Valores o Constantes, sus límites

short

long, short int Valores o Constantes, sus límites short int long Expone 2 elevado a Exponente

int

long, short int Valores o Constantes, sus límites short int long Expone 2 elevado a Exponente

long

Expone

2 elevado a Exponente =

nte

8

256

16

32,768

32

2,147,483,648

Usando #include <climits> se pueden obtener los valores extremos para cada implementación

(05 Limites)

int

Maximo valor entero, INT_MAX = 2147483647 Minimo, INT_MIN = -2147483648 Enteros sin signo. El mayor es UINT_MAX = 4294967295

short SHRT_MAX = 32767 SHRT_MIN = -32768 USHRT_MAX = 65535

long

LONG_MAX = 2147483647 LONG_MIN = -2147483648 ULONG_MAX = 4294967295

El compilador GNU C también tiene 'long long int' LONG_LONG_MAX = 9223372036854775807 LONG_LONG_MIN = -9223372036854775808 ULONG_LONG_MAX = 18446744073709551615

Tipos Reales

Punto fijo y punto flotante

representación externa con decimal con punto:

12.045

producto de una mantisa por una exponencial con base 10:

12.34E- 23

representación interna: punto flotante con mantisa y exponente en base 2

 

#include <cfloat>

 

Type

Size (bits)

Limites de los valores positivos de los numeros reales

float

32

1.17549e-38

float 32 1.17549e-38 3.40282e+38

3.40282e+38

double

64

2.22507e-308

1.79769e+308double 64 2.22507e-308

long double

64

2.22507e-308

1.79769e+308long double 64 2.22507e-308

Operaciones

Operadores Aritméticos:

+

-

double x, y, z; y = 1.23;

. (y + z) * 2 + 1.98

*

/

. ((2.3E-2 * z) + (5.98 * y)) Comparaciones y Funciones

z = 0.0; z = -2.4567; 3.0 / z + 1

z >= 3.6

(x + y) < pow(z,2.0)

/* NO DEBEN HACERSE! */

z == y

x != y

Fragmento del Programa que imprime los límites de distintos tipos numéricos

(05 Limites)

#include <iostream> #include <cstdlib>

#include <cfloat> #include <climits>

using namespace std;

int main () {

cout << "\nLimites de los valores positivos de los numeros reales" << endl;

cout

<< "\n\n\tFloat:" << "\n\t\t menor positivo:\t" << FLT_MIN << "\n\t\t mayor positivo:\t" << FLT_MAX;

//*****************************************************************************

//

Límites de enteros

cout

<< "\nLimites de los valores enteros" << endl;

cout

<< "\n Valores maximos y minimos para'int'egers"

<< "\n\tMaximo valor entero, INT_MAX = " << INT_MAX << "\n\tMinimo, INT_MIN = " << INT_MIN << "\n\tEnteros sin signo. El mayor es UINT_MAX = " << UINT_MAX; ………………………

Véase también (06 Exp Aritméticas)

//

// (-INT_MAX-1)

2147483647

//(2U * INT_MAX + 1)

Tipo Carácter

Se representan en 1 byte (8 bits)

char

∑ char [-128 127]) ∑ unsigned char [0 255]

[-128 127])

unsigned char

∑ char [-128 127]) ∑ unsigned char [0 255]

[0 255]

Valores o Constantes

normales

‘a’ ‘A’ ‘+’ ‘1’ ‘;’

especiales

‘\n’ ‘\t’

Operaciones

Comparaciones:

==

!=

>

<

>=

<=

Funciones Predefinidas y definidas por el programador

#include <ctype>

. char c = 'A'; int otra_char;

.

.

otra_char =

cout << "\nEn mayuscula " << (char) otra_char << endl;

tolower

(c);

if (

isdigit
isdigit

('9')) cout << "\n9 Es un digito" <<endl;

Observación: no debe confundirse

Tipo lógico

Valores o Constantes (1 bit) false true

Operaciones

Operadores Lógicos:

&&

||

!

Comparaciones:

false < true

Observaciones

Los valores numéricos se interpretan como lógicos y los lógicos como numéricos

numero != 0

0

como lógicos y los lógicos como numéricos numero != 0 0 true false 1 0 Ejemplos

como lógicos y los lógicos como numéricos numero != 0 0 true false 1 0 Ejemplos

true

false

y los lógicos como numéricos numero != 0 0 true false 1 0 Ejemplos bool cierto_o_no;

y los lógicos como numéricos numero != 0 0 true false 1 0 Ejemplos bool cierto_o_no;

1

0

Ejemplos

bool cierto_o_no;

 

int

x = 2, y;

cierto_o_no = x; y = cierto_o_no;

 

cout << "\nLo que es cierto_o_no = " << cierto_o_no << "\nLo que es x = " << x << "\nLo que es y = " << y << endl;

Lo que es cierto_o_no = 1 Lo que es x = 2 Lo que es y = 1

No se pueden leer y al escribirlos se interpretarán como números

Conversión de tipos

Automática

char

Conversión de tipos ∑ Automática char integer int x = 4 + ‘a’; float double bool

integer

int x = 4 + ‘a’;

de tipos ∑ Automática char integer int x = 4 + ‘a’; float double bool float

float

∑ Automática char integer int x = 4 + ‘a’; float double bool float r =

double

Automática char integer int x = 4 + ‘a’; float double bool float r = 3.0

bool

float r = 3.0 + 4;

int x = 4 + ‘a’; float double bool float r = 3.0 + 4; números

números

No automática (cast o promoción)

cout << static_cast<int>(‘a’); char c =‘a’; cout << static_cast<float>(c); cout << (float)(c);

static_cast <tipo>

)

(tipo) expresion

if (x + ‘a’) {

}

08 Conversión de tipos

int main() { char c = 'a';

int x = 25;

float f = 2.3;

bool h = true;

cout << "\n Ejemplos de promocion de tipos " << "\n ==============================" << "\n\nEl valor de c es " << c << "\nEl valor de static_cast<int>(c) es " << static_cast<int>(c) << "\n\nEl valor de x es " << x << "\nLa expresion 'c + x' vale " << (c+x) << endl;

cout << "\nIntroduce un valor para c "; cin >> c; cout << "\nEl valor de c es " << c << "\nEl valor de static_cast<bool>(c) es " << static_cast<bool>(c);

cout << "\n\nEl valor de f es " << f << ". El valor de x es " << x << ". El valor de c es " << c << "\nLa expresion 'f + c + x' vale " << (f+x+c) <<endl;

cout << "\n\nEl valor de f es " << f << ". El valor de x es " << x << ". El valor de c es " << c << "\nEl valor de h es " << h; h = c + x + f; cout << "\nEl valor de h tras hacer 'h = c + x + f' es " << h <<endl ; .}

// a // 97 // 25 // 122
//
a
// 97
// 25
// 122

Entrada/salida básica

La biblioteca

definidos los objetos cin, cout y los operadores << y >>

iostream

de C+ + contiene cientos de posibilidades de entrada/ salida. Aquí están

cin >> variable; cout << variable;

son expresiones que devuelven el flujo que transmiten, por defecto a los dispositivos standard de entrada y de salida

funciones:

cin.get(),

cout.put(),

Ejemplo (09 Lee Escribe Car)

Este programa lee una secuencia de caracteres que se introduce por teclado y termina en ‘.’ y la escribe sin el “.”

int main ()

{

char c;

cout

<< "Escribe la secuencia de caracteres, en una o varias lineas." << "\nPara terminar escribe un \".\" " << endl;

c = cin.get();

while ( c != '.' ) { cout.put(c);

if

(c!='\n') cout << '-';

c

= cin.get();

}

cin.ignore(); /* esto es para que se ignore el contenido actual del buffer de entrada que contiene lo que hayamos tecleado despues del '.' (solo el '\n' seguramente) */

cout << "\n\nAhora haremos lo mismo pero terminando con la marca de fin de" << "\nfichero. Escribe otra secuencia de caracteres y" << "\npara terminar escribe <ctrl> + z al principio de una linea" << endl;

c = cin.get(); while ( !cin.eof() ) { cout << c;

if

(c!='\n') cout << ' ';

c

= cin.get();

}

cout << "\nFin de la salida del programa"; }

.

.

.

2.3 Proposiciones de control

Las instrucciones de C++ normalmente se ejecutan en el orden de escritura.

compuesta

{ x1 = x2 + 3; cout << x1;}

Esto lo evitan las proposiciones que vamos a ver a continuación:

de

selección

if (x1 == x2)

de

iteración

for (int i = 1;i<=10;i++)

.}

de salto

break;

Composición secuencial de acciones

accion-1 accion-n
accion-1
accion-n

Bloque

{accion-1;acción-2;

E

Comp. Secuencial i
Comp. Secuencial
i

Descubrir los estados intermedios

Descubrir las acciones

E

a i 1
a
i
1

E’

a 2
a 2

E’’

;accion-n;}

E f

a n
a n

E f

Asegurar la coherencia Accion/Estado

Esquemas condicionales if e if/else

falso condicion cierto accion
falso
condicion
cierto
accion

semántica:

if (<condicion>) <accion-1>; else <accion-2>;

sintaxis:

if (<expresion>) <proposicion-1>; else <proposicion-2>;

Estilo de programación

semántica:

if (<condicion>) <accion>;

sintaxis:

if (<expresion>) <proposicion>;

sintaxis: if (<expresion>) <proposicion>; cierto falso condicion accion-1 accion-2 Debe evitarse
cierto falso condicion
cierto
falso
condicion
accion-1

accion-1

accion-1
accion-1
accion-1
accion-1
accion-2
accion-2
accion-2

accion-2

accion-2
accion-2
cierto falso condicion accion-1 accion-2 Debe evitarse Mejor usar if (variable == true) if
cierto falso condicion accion-1 accion-2 Debe evitarse Mejor usar if (variable == true) if

Debe evitarse

Mejor usar

if (variable == true)

if (variable)

if (otra_variable == false)

if (!otra_variable)

Ejemplos de uso de los condicionales (10 Exp Logicas)

bool p, q, r; cout << "Introduce valores logicos para p, q, r (0 = false, 1 = true): " << endl; cin >> p >> q >> r;

p

q

r

accion

true

true

true

A

true

false

true

B

false

true

true

B

false

false

true

B

true

true

false

A

true

false

false

B

false

true

false

B

false

false

false

A

//obsérvese la sangría

if ((p && q && r) || (p && q && !r) || (!p && !q && !r))

else

.}

cout

cout << "Accion B" << endl;

<< "Accion A" << endl;

Ejemplo (ifs anidados)

Valor

Accion a

de c

realizar

‘a’

<accion-a>

‘b’

<accion-b>

‘c’

<accion-c>

‘d’

<accion-d>

‘e’

<accion-e>

otro

<accion>

char c;

c = cin.get();

//obsérvese la

sangría

if (c == ‘a’)

<accion-a>; else if (c == ‘b’) <accion-b>; else if (c == ‘d’) <accion-d>; else if (c == ‘e’) <accion-e>; else <accion>;

Observaciones sobre los condicionales

Es un error común escribir 3 < x < 4 en lugar de (3 < x) && (x < 4) o bien (3 < x && x < 4) pues la prioridad de ‘<’ es mayor que la de &&

La

evaluación

de

condicion_1 && condicion_2

se

realiza

de

izquierda

a

derecha.

Si

condicion_1 es falsa ya no

se

sigue

evaluando.

Est o

debe

t enerse

en

cuent a

para

cuestiones de eficiencia y de pertenencia al dominio de definición de condicion_2

Dualm ent e, la evaluación de || se lleva t am bién

encuentre una condición verdadera.

de izquierda a derecha hast a que se

¿Cuál es el mayor de 3 enteros? (11 MayorDeTres)

int x, y, z, mayor; cout << "Escribe tres numeros enteros" << endl; cin >> x >> y >> z;

cierto (x < y) (x < y) (x >= y) if cierto (x < y)
cierto
(x < y)
(x < y)
(x >= y)
if
cierto
(x < y)
if (y < z) mayor = z;
else mayor = y;
cierto
(y < z)
(x < z)
else
if (x < z) mayor = z;
else mayor = x;
mayor=z
mayor=y
mayor=z
mayor=x

cout << "El mayor de los tres es: " << mayor << endl; .}

? Cada else se asocia con el if anterior sin else más cercano

Otro ejemplo de uso de condicionales: notas de los alumnos (12 NotaFinal)

En cierta asignatura se siguen estas normas para determinar la nota final:

• Si las prácticas están mal o bien suspenso

si

la nota de teoría es menor

que 5,

la nota final

es

• Si la nota de teoría llega al 5 pero es menor que 7, entonces la nota final será suspenso, aprobado o notable en el caso de que la nota de prácticas sea regular, bien o muy bien, respectivamente

• Si la nota de teoría llega al 7 pero no al 8,5, entonces la nota final será aprobado, notable o sobresaliente dependiendo de que la nota de practicas sea regular, bien o muy bien

• Por último en el caso, poco probable, de que la nota de teoría supere el 8,5 la nota final será notable, sobresaliente o matrícula de honor, análogamente a los casos anteriores

Escribir un programa que implemente razonablemente esta lista de condiciones.

Análisis de las condiciones y acciones asociadas

Nota Practicas (np)

Mal

(‘m’)

Regular

(‘R’)

Bien

(‘B’)

Muy

Bien

(‘M’)

de

0

nt < 5

Nota de Teoría (nt)

5

nt < 7

7

nt <8,5

8,5

nt

Suspenso

Suspenso

Suspenso

Suspenso

Suspenso

Suspenso

Aprobado

Notable

Suspenso

Aprobado

Notable

Sobresal.

Suspenso

Notable

Sobresal.

M. de H.

Una solución con esquemas if (12 NotaFinal)

int main () { char np,nf;

cout << "\nNota de Practicas (m,R,B,M) ";

cout << "\nNota de Teoria [0

10]: ";

if ( (nt < 5.0) || (np == 'm') ) nf = 'S'; else if ( nt < 7.0 ) if ( np == 'R') nf = 'S'; else if ( np == 'B') nf = 'A'; else /* np == 'M' */ nf = 'N'; else if ( nt < 8.5 ) if ( np == 'R') nf = 'A'; else if ( np == 'B') nf = 'N'; else /* np == 'M' */ nf = 'B'; else /* 8.5 <= nt <= 10 */ if ( np == 'R') nf = 'N'; else if ( np == 'B') nf = 'B'; else /* np == 'M' */ nf = 'M';

float nt; np = cin.get(); cin >> nt;

.

.

cout << "\nLa nota final es: " << nf << endl; .

.

.

.

.

}

El esquema switch

switch (<expresion>){ case <expresion-constante-entera>: proposiciones; case <expresion-constante-entera>: proposiciones; . default: proposiciones

.

.

.

.

.

.

.

.

}

Tant o la expresión com o las que acom pañan al case deben ser de t ipo ent ero ( int

char)

Si el valor de la expresion coincide con la et iquet a de un case se ejecuta desde allí.

Los case

return (funciones)

son etiquetas y no son ejecutables. Por eso se suelen usar los break o los

la cláusula default no es obligatoria y se considera satisfecha si ninguna de las demás coincide.

char c; switch (c){ case ‘a’:

<accion-a>; break; case ‘b’:

<accion-b>;

break;

default:

<accion>;

}

cierto c=’a’ accion-a break falso cierto c=’b’ accion-b break falso accion
cierto
c=’a’
accion-a
break
falso
cierto
c=’b’
accion-b
break
falso
accion

Ejemplos de uso del esquema switch (13 Switch)

char c;

cout << "Introduce un caracter: " << endl; cin.get(c); //otro modo de uso de cin.get() cout << "\n\tEl entero que le corresponde es: ";

switch (c) { case 'a': cout << 1 << endl; break;

case 'e': cout << 2 << endl;

switch (c) { case 'a': cout << 1 << endl;

case 'e':

break;

break;

case 'i':

case 'i':

cout << 3 << endl; break;

case 'o': cout << 4 << endl; break; case 'u': cout << 5 << endl; break;

case 'o': cout << 4 << endl; // 4 si es ‘e’, ‘i’ u ‘o’ break; case 'u': cout << 5 << endl; break;

default:

cout << 6 << endl;

default:

};

cout << 6 << endl;

};

char c; . switch (c){ case ‘a’:

.

.

<accion-a>; case ‘b’:

<accion-b>; break; case ‘c’:

case ‘d’:

<accion-d>;

break;

default:

<accion>;

}

cierto c=’a’ accion-a falso cierto c=’b’ accion-b break falso cierto c=’c’ falso cierto c=’d’
cierto
c=’a’
accion-a
falso
cierto
c=’b’
accion-b
break
falso
cierto
c=’c’
falso
cierto
c=’d’
accion-d
break
falso
accion

Otra solución al problema de las notas con esquemas if y switch

int main () { char np,nf; int nt;

cout << “\nNota de Teoria [0

cout << “\nNota de Practicas (m,R,B,M) “;

10]: ”;

if ( (nt < 5) || (np == ‘m’) ) nf = ‘S’; else if ( nt < 7 ) switch (np) { case ‘R’: nf = ‘S’; break; case ‘B’: nf = ‘A’; break; case ‘M’: nf = ‘N’; break;

cin >> nt; cin >> np;

El Operador condicional

<expresion-1> ? <expresion-2> : <expresion-3>

Se evalúa la <expresión-1>. Si es ciert a ( dist int a de cero) devuelve el valor de <expresion-2>. Si es falsa (<expresion-1> es cero) devuelve el valor de <expresion-3>

int x ; cout << "\nPor favor, escribe un entero y pulsa retorno "; cin >> x; cout << ( x >= 0 ? "\nPositivo" : "\nNegativo" );

z = (a > b) ? a : b;

// z = maximo de a y b

Este operador tiene una prioridad inferior a && y a || y superior a las asignaciones

Es un operador ternario

Esquema while

semántica:

while(<condicion>) <accion>;

sintaxis:

while (<expresion>) <proposicion>;

cierto condicion accion falso
cierto
condicion
accion
falso

La ejecución de la acción debe repetirse mientras que la condición sea verdadera

La proposición o cuerpo del while debe contener acciones que hagan que la condición pueda ser falsa. En otro caso tendríamos un “bucle infinito”

while (i < 3) j++;

Correctamente diseñado está

(14 while)

int x = 0; while (x < 10) { x++; cout << x << endl;

}

while (true)

{.

.

.

. }

int x = 0; while (x++ < 10) { cout << x << endl;

}

Ejemplos de uso del while (15 While Potencia Mayor)

El siguiente programa calcula la primera potencia de 2 (2 exponente ) que es mayor que 1000. Es decir

2^(exponente-1) <= 1000 < 2^exponente

int x = 1;

// 2^0

int exponente = 0;

int exponente = 0; exponente++; // exp = 1 x = 2 * x;

 
 

//

x = 2^exp & 2 ^exp-1 < 1000

int exponente =

1 ;
1
;

while (x <= 1000) {

 

//

x = 2^exp & 2 ^exp-1 < 1000

while

((x *= 2)

<= 1000) {

 

exponente = exponente + 1;

while (x <= 1000) { exponente++;

exponente++;

 

x

= 2 * x;

//

x = 2^exp & 2 ^exp-1 < 1000

 

x

= 2 * x;

}

}

//

x = 2^exp & 2 ^exp-1 < 1000

}

cout << "La primera potencia de 2 mayor que 1000 es 2^" << exponente << " = " << x << endl;

16 While Media de 10

El siguiente programa lee una secuencia de 10 números y calcula su media

{ float media; cout << "Escribe los 10 numeros: " << endl; int x, i = 0, suma = 0;

// suma ahora es

while (i < 10){ i = i + 1; cin >> x; suma = suma + x;

// suma ahora es

}

while (i++ < 10) { cin >> x; suma += x;

// suma ahora es

}

media =

static_cast<float>

(suma) / 10;

cout << "El valor de la media es: " << media << endl;

Media de los números enteros leídos

int main () { int x, i, suma; float media; cout << “Escribe los numeros y <ctrl>+Z: “ << endl; i = 0; suma = 0;

cin >> x;

 

while (

!cin.eof()

) {

i = i + 1; suma = suma + x;

cin >> x

;

}

// suma ahora es

// suma ahora es

media = ( (i==0) ? 0.0 : static_cast<float>(suma) / i );

}

También se puede hacer con

// suma ahora es

while (

cin >> x

) {

i = i + 1; suma = suma + x;

}

// suma ahora es

Esquema for

for(<expresion1>;<expresion2>;<expresion3>)

<accion>

Semántica (prácticamente equivalente a:)

<expresion1>;

while(<expresion2>) { <accion>

<expresion3>;

}

Observaciones sobre el ‘for’

Normalmente, expresion1 y expresion3 son asignaciones o llamadas a funciones, mientras que la expresión2 central, es una relación

for (int i = x; i <= j + 10; i+= k/x)

Cualquiera de la expresiones es opcional, pero los “;” son obligatorios

Si expresion2 se omite, se interpreta que siempre es verdadera

for( ; ; ) {

} // es una iteración infinita

Observaciones sobre el ‘for’

Si se declara una variable en expresion1, no tendrá valor

for (int i = 1; i <= 10; i++) cout << “ “ << i;

fuera
fuera

cout << i;

//este i no está definido: error de sintaxis

del bucle for. (17 For)

Si varias de estas expresiones no son necesarias, resulta más for

while ((C = cin.get()) == ‘ ‘)

; // salta los espacios en blanco

natural

usar while que

for tiene una

interpretación

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

.}

intuitiva y directa en fragmentos del tipo

para todos los i <= n desde 1 y yendo de 1 en 1

Ejemplos de uso razonable del for

const int N = 25; int i; for (i = 1; i <= N; i++) cout << i;

const int N = 25; int i; for (i = N; i >= 1; i--) cout << i;

const int N = 25; int i, x, suma = 0; float media; for (i = 1; i <= N; i++){ cin >> x; suma += x;

}

media = static_cast<float>(suma) / N;

Imprime los índices de una matriz N M, por filas (18 For Indices Matriz)

de una matriz N M, por filas (18 For Indices Matriz) const int N = 2,

const int N = 2, M = 3;

 

(1,1)

for (int i = 1; i <= N; i++) for (int j = 1; j <= M; j++) cout << “(“ << i << “,” << j << “)” << endl;

(1,2)

(1,3)

(2,1)

(2,2)

 

(2,3)

Las sentencias break y continue (19 Break Continue)

break (con switch, while, for) provoca la salida del esquema

for (int x = 1;x<=10;x++) {

}

if ( x == 5) cout << x;

break;
break;

continue (con while, for) provoca un salto a la siguiente iteración

for (int x = 1; x<=10; x++) {

}

if ( x == 5) continue ;

cout << x;

Cuando se usan se rompe la equivalencia while-for

 

i=1;

for (i=1; i<=10; i++) {

 

while (i<=10) {

 

if (i == 5 )

continue

; // lo siguiente es la

 

if (i == 5) cout << i;

continue

; //lo siguiente es el i++

 

// comparacion:

no para!!

 

}

cout << i; i++;

 

}

Precedencia de los operadores vistos

Operador

 

Asociatividad

Tipo

()

ID

paréntesis

!

DI

negación

*

/

%

ID

multiplicación

+

-

ID

suma

>>

<<

ID

inserción o extracción de flujo

<

<=

>

>=

ID

relacional

==

!=

ID

igualdad

&&

 

ID

conjunción

||

ID

disyunción

? :

DI

condicional

=

+=

-=

*=

/= %=

DI

asignación

,

ID

coma

Esquema do/while (20 DoWhile)

do

<accion>;

while(<condicion>);

do <proposicion>; while (expresion>);

accion
accion
condicion falso
condicion
falso

cierto

<accion>;

while(<condicion>)

<accion>;

La acción se ejecuta, al menos, 1 vez

Este esquema no se usa tantas veces como los otros iterativos

Este programa lee un entero y lo imprime, dígito a dígito, al revés

{

int n; char signo;

if (n > 0)

signo = '+'; {signo = '-'; n = -n;}

else

do { cout << n % 10; n = n / 10; } while (n > 0);

cout << signo << endl; .}

[K & R]

// guardamos el signo de n // y trabajaremos con n sin signo

// escribe el último dígito de n // elimina ese dígito de n

2.4 Propiedades de los programas

El proceso de programación deberá estar encaminado a producir programas con las siguientes propiedades:

correctos o eficaces .- produzcan resultados coherentes con su especificación  

correctos o eficaces.- produzcan resultados coherentes con su especificación

 
legibles .- fácilm ente com presibles por el program ador (tiem po después de su

legibles.-

fácilm ente

com presibles

por

el

program ador

(tiem po

después

de

su

diseño) y por cualquier otro programador con acceso a la documentación aportada

junto con el código fuente

 
modificables .- a lo largo de su ciclo de vida  

modificables.- a lo largo de su ciclo de vida

 
reutilizables .- algunos trozos deberían poder ser utilizados en otros casos  

reutilizables.- algunos trozos deberían poder ser utilizados en otros casos

 
eficientes .- que optim icen el consum o de recursos inform áticos (tiem po, espacio,

eficientes.-

que optim icen el consum o de recursos inform áticos (tiem po, espacio,

uso de periféricos)