Estructura de C++
Estructura de C++
Estructura de C++
2.1 Estructura de un programa en C++ impresin de una lnea suma de dos enteros aritmtica: expresiones y operadores 2.2 Componentes de un programa proposiciones declaraciones: variables, constantes y referencias los tipos: int, char, bool, float, double typedef conversin de tipos entrada/salida bsica
2.3 Proposiciones de control: composicin secuencial seleccin: if, if/else, switch iteracin: while, do/while, for los operadores (?:) y coma (,) prioridades 2.4 Propiedades de los programas
//Este programa solamente escribe //Bienvenido al C++ #include <iostream> #include <cstdlib> using namespace std; int main () { cout << Bienvenido al C++; cout << "\n\n\a"; system("PAUSE"); return 0; }
Est o es necesario para que se mantenga la vent ana de salida La funcin principal que devuelve 0
Secuencia de escape \n \t \r \a
descripcin Salto de linea Tabulacin horizontal. Mueve el cursor hasta la siguiente tabulacin Retorno de carro. Coloca el cursor al inicio de la lnea actual Alerta. Hace sonar la campana
Problema: Solucin
Suma dos nmeros enteros ledos desde el teclado y muestra el resultado de la suma Algoritmo sumar dos numeros es leer los dos nmeros x1 y x2; sumar x1 y x2 y acumular el valor en suma; escribir el valor de suma fin. Codificado en C++
/* Este programa pide dos numeros enteros, despus los suma y muestra el resultado */ #include <iostream> #include <cstdlib> using namespace std; int main (){ int x1, x2, suma; //declaracin de variables cout << "\nEscribe el primer numero entero "; cout << "\nEscribe el segundo numero entero "; 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; }
son sensibles a las maysculas o minsculas (a1, A1) no pueden comenzar por un dgito y pueden llevar _ pero NO blancos: este_es_un_nombre_de_variable_algo_largo EsteEsUnNombreDeVariableAlgoLargo _mivariable_83 // se suelen reservar para uso del propio lenguaje
conviene no usar ident ificadores de m s de 31 caract eres por cuest iones de portabilidad
deben declararse (su tipo) antes de ser usadas las declaraciones pueden incluir valores iniciales
Aritmtica
suma = x1 + x2; x1 = x1 + 1;
Operadores Aritmticos: + - * /
divisin
Enteros (int) int x1= 5, x2 = 2; cout << (x1 / x2) 2 cout << (x1 % x2) 1
Reales (float) float x1= 5, x2 = 2; cout << (x1 / x2) 2.5 cout << (x1 % x2) error
modulo
Funciones Predefinidas: pow(x,y), log(x), log10(x), sin(x), cos(x) Definidas por el programador
Introduccin al lenguaje C++ 6
(#include <cmath> )
Ejemplos
(y + z) * 2 + 1
3/z+1
3%z
f(x + 1)
((2 * z) + (5 3 * y))
pow(2,3)
() * / % + =
Se evalan primero. Si estn anidados, 1 los ms internos En segundo lugar. Si hay varios, de izquierda a derecha para acabar
z = p * r % q + w / x y; 6 1 2 4 3 5
Est e program a lee dos nm eros ent eros, los com para e indica si son iguales o, en caso contrario, cul es el mayor y cul 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; ...}
... { 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; ...}
Tipo parntesis negacin multiplicacin suma Insercin o extraccin de flujo relacional igualdad conjuncin disyuncin asignacin
Observaciones
== =!
!= =>
>= =<
<=
no pueden ir con un blanco entre los dos smbolos son errores sintcticos
Asignaciones
Son expresiones El operador de asignacin devuelve el valor de la part e derecha que, com o efect o lateral (importantsimo) lo asigna al objeto situado a la izquierda.
Asignaciones Abreviadas x += 2 x=x/y x /= y x *= y x = x + 1 x += 1 x -= 1 x-- --x x++ ++x Exp Abreviadas int x = 3, y = 4; y = x++; y++ = x (++y)++; x = ++x + --y x += (y /= 2) y=3, x=4 Error!! y=6 y=3, x=7 y=2, x=5 y = ++x; ++y = x; x = x++ + y-x = (y *= 5) + 3 y=4, x=4 y=3, x=3 y=3, x=8 y=20, x=23
11
funciones:
int main ()
proposicin expresin proposicin compuesta proposicin de seleccin proposicin de iteracin proposicin de salto
12
Las variables, ya lo vimos, deben ser declaradas antes de ser usadas. Una declaracin
<calificador> <tipo> <lista de objetos declarados> int main() const int cien = 100; double &l = longitud;
pueden usarse para valores que no se podrn cambiar pueden especificar referencias (sinnimos de variables)
{........ const double pi = 3.1416; double radio = 25.345; double longitud = 2 * pi * radio; double &l = longitud;
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; ........}
13
Nmeros enteros: int, short, long, unsigned reales: float, double, long double
Lgico bool
14
bit
0/1
bits para su representacin pueden almacenar 2n valores distintos unsigned, signed char int
long, short
short
int
long
Expone nte 8 16 32
15
Usando #include <climits> se pueden obtener los valores extremos para cada implementacin (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 tambin tiene 'long long int' LONG_LONG_MAX = 9223372036854775807 LONG_LONG_MIN = -9223372036854775808 ULONG_LONG_MAX = 18446744073709551615
16
Tipos Reales
Punto fijo y punto flotante representacin externa con decimal con punto: 12.045 producto de una mantisa por una exponencial con base 10: 12.34E- 23
Size (bits) 32 64 64
Operaciones
Operadores Aritmticos: + - * / double x, y, z; y = 1.23; . . . (y + z) * 2 + 1.98 . . . . . . ((2.3E-2 * z) + (5.98 * y)) . . . Comparaciones y Funciones z >= 3.6
(x + y) < pow(z,2.0) z == y x != y
17
/* NO DEBEN HACERSE! */
Introduccin al lenguaje C++
Fragmento del Programa que imprime los lmites de distintos tipos numricos #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; //***************************************************************************** // Lmites 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;
Vase tambin (06 Exp Aritmticas)
Introduccin al lenguaje C++
(05 Limites)
18
Tipo Carcter
unsigned char
[0..255]
especiales
\n \t ....
Operaciones Comparaciones:
== != > < >= <=
Funciones Predefinidas y definidas por el programador #include <ctype> ... char c = 'A'; int otra_char; otra_char = tolower(c); cout << "\nEn mayuscula " << (char) otra_char << endl; if (isdigit('9')) cout << "\n9 Es un digito" <<endl;
Tipo lgico
Observaciones
Los valores numricos se interpretan como lgicos y los lgicos como numricos
numero != 0 0 true false 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;
Conversin de tipos
int x = 4 + a;
float r = 3.0 + 4;
if (x + a) { ... }
No automtica (cast o promocin) cout << static_cast<int>(a); char c =a; cout << static_cast<float>(c); cout << (float)(c); static_cast <tipo> (. . . ) (tipo) expresion
21
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;
// // // //
a 97 25 122
cout << "\nIntroduce un valor para c "; cin >> c; // b cout << "\nEl valor de c es " << c // b << "\nEl valor de static_cast<bool>(c) es " << static_cast<bool>(c); // 1 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 ; . . .}
Introduccin al lenguaje C++
// // // // // // // //
// 1
22
Entrada/salida bsica La bibliot eca iostream de C+ + cont iene cient os de posibilidades de ent rada/ salida. Aqu est n definidos los objetos cin, cout y los operadores << y >> cin >> variable; cout << variable; son expresiones que devuelven el fluj o que t ransm it en, por defect o a los disposit ivos st andard de entrada y de salida funciones:
cin.get(), cout.put(),
23
Ejemplo (09 Lee Escribe Car) Est e program a lee una secuencia de caract eres que se int roduce por t eclado y t erm ina 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) */
24
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"; ...}
25
compuesta
26
accion-1
Ei
Comp. Secuencial
Ef
Ei
a1
a2
E .....
an
Ef
falso condicion
cierto accion
semntica: if (<condicion>) <accion-1>; else <accion-2>; sintaxis: if (<expresion>) <proposicion-1>; else <proposicion-2>;
cierto condicion
falso
accion-1
accion-2
Estilo de programacin Debe evitarse if (variable == true) ..... if (otra_variable == false) .... Mejor usar if (variable) . . . if (!otra_variable) . . .
28
{. . . bool p, q, r; cout << "Introduce valores logicos para p, q, r (0 = false, 1 = true): " << endl; cin >> p >> q >> r;
p true true false false true true false false q true false true false true false true false r true true true true false false false false accion A B B B A B B A
//obsrvese la sangra if ((p && q && r) || (p && q && !r) || (!p && !q && !r)) cout << "Accion A" << endl; else cout << "Accion B" << endl; . . .}
29
Valor de c a b c d e otro
char c; c = cin.get(); //obsrvese la sangra 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>;
30
Es un error comn 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 evaluacin 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 definicin de condicion_2 Dualm ent e, la evaluacin de || se lleva t am bin de izquierda a derecha hast a que se encuentre una condicin verdadera.
31
{. . . int x, y, z, mayor; cout << "Escribe tres numeros enteros" << endl; cin >> x >> y >> z;
cierto
(x < y) (x >= y)
(x < y)
cierto
(y < z)
cierto
(x < z)
if (x < y) if (y < z) mayor = z; else mayor = y; 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; . . .}
32
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 prct icas est n m al o bien si la not a de t eora es m enor que 5, la not a final es suspenso Si la not a de t eora llega al 5 pero es m enor que 7, ent onces la not a final ser suspenso, aprobado o not able en el caso de que la not a de prct icas sea regular, bien o m uy bien, respectivamente Si la not a de t eora llega al 7 pero no al 8,5, ent onces la not a final ser aprobado, not able o sobresaliente dependiendo de que la nota de practicas sea regular, bien o muy bien Por lt im o en el caso, poco probable, de que la not a de t eora supere el 8,5 la not a final ser notable, sobresaliente o matrcula de honor, anlogamente a los casos anteriores Escribir un programa que implemente razonablemente esta lista de condiciones.
33
Nota de Practicas (np) 0 nt < 5 Suspenso Mal (m) Suspenso Regular (R) Suspenso Bien (B) Muy Bien (M) Suspenso
Suspenso
Aprobado
Notable
Aprobado
Notable
Sobresal.
Notable
Sobresal.
M. de H.
34
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'; cout << "\nLa nota final es: " << nf << endl; . . . . . . . . .. }
35
El esquema switch
switch (<expresion>){ case <expresion-constante-entera>: proposiciones; case <expresion-constante-entera>: proposiciones; ......... default: proposiciones }
Tant o la expresin com o las que acom paan 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 ej ecut a desde all. Los case . . son etiquetas y no son ejecutables. Por eso se suelen usar los break o los return (funciones) la clusula default no es obligat oria y se considera sat isfecha si ninguna de las dem s coincide.
36
char c; ..... switch (c){ case a: <accion-a>; break; case b: <accion-b>; break; ........ default: <accion>; }
cierto
c=a
falso cierto
accion-a
break
c=b
falso
accion-b
break
accion
37
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; break; case 'i': cout << 3 << endl; break; case 'o': cout << 4 << endl; break; case 'u': cout << 5 << endl; break; default: cout << 6 << endl; };
switch (c) { case 'a': cout << 1 << endl; break; case 'e': case 'i': case 'o': cout << 4 << endl; // 4 si es e, i u o break; case 'u': cout << 5 << endl; break; default: cout << 6 << endl; };
38
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
falso cierto
accion-a
c=b
falso cierto
accion-b
break
c=c
falso cierto
c=d
falso accion
accion-d
break
39
int main () { char np,nf; int nt; cout << \nNota de Teoria [0..10]: ; cout << \nNota de Practicas (m,R,B,M) ; 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;
40
El Operador condicional
Se evala la <expresin-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
41
Esquema while
cierto accion
falso
La ejecucin de la accin debe repetirse mientras que la condicin sea verdadera La proposicin o cuerpo del while debe cont ener acciones que hagan que la condicin pueda ser falsa. En otro caso tendramos un bucle infinito while (i < 3) j++; while (true) {. . . . }
Correctamente diseado est int x = 0; while (x < 10) { x++; cout << x << endl; }
(14 while) int x = 0; while (x++ < 10) { cout << x << endl; }
42
El siguient e program a calcula la prim era pot encia de 2 ( 2 exponente ) que es m ayor que 1000. Es decir 2^(exponente-1) <= 1000 < 2^exponente
int x = 1;
// 2^0 int exponente = 0; exponente++; // exp = 1 x = 2 * x; // x = 2^exp & 2 ^exp-1 < 1000 while (x <= 1000) { exponente++; x = 2 * x; // x = 2^exp & 2 ^exp-1 < 1000 }
int exponente = 0; // x = 2^exp & 2 ^exp-1 < 1000 while (x <= 1000) { exponente = exponente + 1; x = 2 * x; // x = 2^exp & 2 ^exp-1 < 1000 }
cout << "La primera potencia de 2 mayor que 1000 es 2^" << exponente << " = " << x << endl;
43
16 While Media de 10
El siguiente programa lee una secuencia de 10 nmeros 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;
44
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 ....
Tambin se puede hacer con // suma ahora es .... while (cin >> x) { i = i + 1; suma = suma + x; }
Introduccin al lenguaje C++
45
Esquema for
Semntica (prcticamente equivalente a:) for(<expresion1>;<expresion2>;<expresion3>) <accion> <expresion1>; while(<expresion2>) { <accion> <expresion3>; }
Normalmente, expresion1 y expresion3 son asignaciones o llam adas a funciones, mientras que la expresin2 central, es una relacin 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 iteracin infinita
46
Si se declara una variable en expresion1, no tendr valor fuera del bucle for. (17 For) for (int i = 1; i <= 10; i++) cout << << i; cout << i; //este i no est definido: error de sintaxis
Si varias de est as expresiones no son necesarias, result a m s natural usar while que for while ((C = cin.get()) == ) ; // salta los espacios en blanco
47
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)
const int N = 2, M = 3; for (int i = 1; i <= N; i++) for (int j = 1; j <= M; j++) cout << ( << i << , << j << ) << endl; (1,1) (1,2) (1,3) (2,1) (2,2) (2,3)
48
Cuando se usan se rompe la equivalencia while-for i=1; while (i<=10) { if (i == 5 ) continue; // lo siguiente es la // comparacion: no para!! cout << i; i++; }
for (i=1; i<=10; i++) { if (i == 5) continue; //lo siguiente es el i++ cout << i; }
49
Asociatividad ID DI ID ID ID ID ID ID ID DI DI ID
Tipo parntesis negacin multiplicacin suma insercin o extraccin de flujo relacional igualdad conjuncin disyuncin condicional asignacin coma
50
do <accion>; while(<condicion>);
accion
cierto
condicion falso
La accin se ejecuta, al menos, 1 vez Este esquema no se usa tantas veces como los otros iterativos
51
{ int n; . . . char signo; if (n > 0) signo = '+'; else {signo = '-'; n = -n;} 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 dgito de n // elimina ese dgito de n
52
El proceso de program acin deber est ar encam inado a producir program as con las siguient es propiedades: correctos o eficaces.- produzcan resultados coherentes con su especificacin legibles.- fcilm ent e com presibles por el program ador ( t iem po despus de su diseo) y por cualquier ot ro program ador con acceso a la docum ent acin aport ada junto con el cdigo fuente modificables.- a lo largo de su ciclo de vida reutilizables.- algunos trozos deberan poder ser utilizados en otros casos eficientes.- que opt im icen el consum o de recursos inform t icos ( t iem po, espacio, uso de perifricos)
53