Sie sind auf Seite 1von 63

INTRODUCCIÓN AL

LENGUAJE C++
2

Entrada y salida

 En C++ la Entrada y Salida de datos se realiza a


través de operaciones de flujos (streams)

 Estos flujos están definidos en la librería


iostream.h que deberá ser incluida en el
programa
3

Salida: cout

 cout corresponde al flujo de SALIDA.


 Normalmente corresponde a la pantalla del
usuario.
 El operador de insercción, <<, inserta datos en
el flujo cout. Por ejemplo:
cout<< “Mensaje de prueba “;
cout<< 500<<600<<700
int i=5, j=10,m=100;
cout<< "El valor de i es:"<<i << j << m;
4

Salida con formato

 cout.setf(ios::fixed) Imprime en formato


punto fijo (scientific es el estándar)

 cout.setf(ios::showpoint) Imprime mostrando


el punto decimal

 cout.precision(n) Decimales de precisión

 cout.width(n) Espacios para mostrar un valor

 cout.setf(ios::right) Justifica el texto a


imprimir a la derecha (left)
5

Entrada: cin

 Proporciona un flujo de entrada

 El operador de extracción >>, extrae valores


del flujo y lo almacena en variables

 Normalmente el flujo de entrada es el teclado

int numero1, numero2;


cin>>numero1;
cin>>numero2;
6

Ingresar 2 edades y
Ejercicio determinar quién es mayor

#include <iostream.h>
int main() {
cout << "Ingrese su edad: ";
int miEdad;
cin >> miEdad;
cout << "Ingrese la edad de un amigo: ";
int suEdad;
cin >> suEdad;
if (miEdad < suEdad)
cout << "Yo soy menor que mi amigo“ << endl;
else
if (miEdad > suEdad)
cout << "Mi amigo es menor que yo \n ";
else
cout << “Ambos tenemos la misma edad \n ";
return 0;
}
7

Tipos de Datos
ELEMENTALES
8

Tipos numéricos

Tipo Ejemplo Bytes Rango


char ‘a’ 1 0..255

short -15 1 -128..127

int 1024 2 -32768..32767

long 262144 4 -2147483648..2147483637

float 10.5 4 3.4*10E-38.3.4*10E308

double 0.00045 8 1.7*10E-308..1.7*10E308


9

Punteros

 Un puntero es una variable que puede almacenar


una dirección de memoria.

 Una variable de tipo puntero puede guardar


direcciones de variables de un tipo determinado:
punteros a int, a double, a char, etc.
10

Declaración de punteros

tipo *nombre_variable;

int i=3, *p,*r; // p y r son punteros a entero


double d=3.3,*q; // q es un puntero a double
char c='a', *t; // t es un puntero a carácter

 p=&i;
 r=p;
 p=q; es un ERROR porque son punteros de diferente
tipo
11

Otras operaciones con punteros

 cin>>*p;
 if (p==r)
 cout<<"El valor de i es: "<<*p;
 *p=*p+3;
 p=p+3;
12

Mostrar una dirección

 Es posible desplegar una dirección como valor de una


variable de tipo puntero, o la dirección de cualquier
variable, utilizando cout

cout << “p = “ << p << endl;


cout << “&n = “ << &n << endl;
cout << “&p= “ << &p << endl;
13

Ejemplo ilustrativo

1. int *p, *q, a=5 2. p=&a 3. *p=8;


p ? a p a
p 5 8
q q
? q ?
?
a:
5

4. q=p; 5. *q=85;
a a
p p
8 85
q q
14

Ejemplo ilustrativo

6. a=33; 7. int b=1;


a a
p 33 p 33
q q b
1

8. q=&b;
NOTA
a
p 9 a, b, p, q : variables
b locales automáticas
q 1
15

Ejemplo 1:

int main() {
int x, y, *p, *q;
p = &x;
*p = 5;
q = &y;
*q = 23;
cout << *p << " “ << *q << endl;
q = p;
*p = 35;
cout << *p << " “ << *q << endl;
q = NULL;
cout << x << " “ << y << endl;
return 0;
}
16

Ejemplo 2:

int main() {
int *p, *q, x, y;
p = &x;
*p = 14;
q = p;
cout << *p << " " << *q << endl;
q = NULL;
cout << x << " “ << y << endl;
return 0;
}
17

Ejemplo 3:

int main() {
int x, y, *p, *q;
p = &x;
*p = 12;
q = &y;
*q = 23;
cout << *p <<" "<<*q<<endl;
*p = *q;
cout << *p <<" "<<*q<<endl;
q = NULL;
cout<<*p<<endl;
cout<<x<<" "<<y<<endl;
return 0;
}
18

Ejemplo 4:

int main() {
int x, y, *p, *q;
p = &x;
*p = 14;
q = p;
if ( p == q) cout<<"Mensaje 1";
q = &y;
if ( p == q) cout<<"Mensaje 2";
*q = 14;
if (p == q) cout<<"Mensaje 3";
if (*p == *q)cout<<"Mensaje 4";
return 0;
}
19

Tipos Enumerados

 enum Frutas {Manzana, Pera, Guinda, Kiwi,};


 enum Color {Rojo=10, Verde, Azul};
 enum Raza {Pastor, Cooker, Poodle, Setter, Collie};

int main() {
Color c=Verde;
if (c==Verde)
cout<<"Color VERDE";
return 0;
}
20

Tipos de Datos
ESTRUCTURADOS
21

Arreglos

 Un arreglo es un objeto de dato estructurado de


carácter homogéneo
 Los arreglos pueden ser de una o mas dimensiones
 Un Vector es un arreglo unidimensional
int v[10];
int v[10] = {41, 23, 87, 19, -9};
int v[] = {41, 23, 87, 19, -9, 91, 103, 25, 11, 22};
0 1 2 3 4 5 6 7 8 9
v: 41 23 87 19 -9 91 103 25 11 22 cout << v[3];
22

Arreglos

 Una Matriz es una arreglo bidimensional


0 1 2
float a[5][3];
0 33 21 47
int x[5][3] = {{33, 21, 47},
1 82 91 95
{82, 91, 95}, 2 50 72 45
{50, 72, 45}, 3 36 79 63
{36, 79, 63}, 4 53 60 74
{53, 60, 74}}
cout << a[3][2];
23

Strings

 Strings: Vector de caracteres, que termina con el


caracter NULO: '\0'

char s[5];
char s1[5] = {'h','o','l','a','\0'};
char s2[5] = "hola";
char s3[] = "hola";

typedef char String[25];


String s;
24

Strings

 Captura de un String cin >> s;


 Lee del flujo de entrada un string.
 Deja para la siguiente lectura el '\n'
 No reconoce el espacio inicial en las entradas

Ingresar:
i = 1; Este es un ejemplo

do {
cin >> s;
cout << i << ": " << s << endl;
i++;
}
while (i<5);
25

Strings

 Captura de un String cin.getline(s, largo);


 Lee del flujo de entrada un string de largo
caracteres
 La lectura termina
 Con la línea ('\n'), si la cantidad de caracteres es
menor que largo
 Cuando se ha extraído la cantidad largo de
caracteres, aunque NO haya terminado la línea
26

Strings

 Captura de un String
i=1;
do {
cin.getline(s,20);
cout << i << ": " << s << endl;
i++;
}
while (i<5);
27

Strings

 Funciones sobre strings

 strlen(string); // largo
 strcpy(destino, origen); // copia
 strcmp(string1, string2); // compara
 0: Si string1 == string2
 1: Si string1 > string2
 -1: Si string1 < string2
28

Strings

#include <iostream.h>
#include <string.h>
int main() {
char x[5];
char y[] = "Hola";
strcpy(x,y);
cout << "x:" << x << endl;
cout << "y:" << y << endl;
return 0;
}
29

Strings

#include <iostream.h>
#include <string.h>
int main() {
char *x;
char y[] = "Hola";
x = new char[strlen(y)+1];
cin.getline(x, 20);
cout << "x:" << x << endl;
cout << "y:" << y << endl;
return 0;
}
30

Strings

#include <iostream.h>
#include <string.h>
void Copiar(char a[], char b[]) {
strcpy(a, b);
}
int main() {
char *x;
char y[] = "Hola";
x = new char[strlen(y)+1];
Copiar(x,y);
cout << "x:" << x << endl;
cout << "y:" << y << endl;
return 0;
}
31

Strings

#include <iostream.h>
#include <string.h>
void Copiar(char *a, char *b) {
strcpy(a, b);
}
int main() {
char *x;
char y[] = "Hola";
x=new char[strlen(y)+1];
Copiar(x,y);
cout<< "x:" << x << endl;
cout<< "y:" << y << endl;
return 0;
}
32

Strings

#include <iostream.h>
#include <string.h>
char *Mayor(char a[], char *b) {
if (strcmp(a,b)>0)
return a;
return b;
}
int main() {
char *x;
char y[] = "Hola";
x = new char[strlen(y)+1];
cin.getline(x,20);
cout << "El mayor: " << Mayor(x,y);
return 0;
}
33

Estructuras

 Constructor de tipos de dato que permite agrupar


elementos de diversos tipos de datos como UNA
variable

struct { RUT nom prom


int RUT; a
char nom[10];
float prom; cout << a.prom;
} Persona;
Persona a;
34

Estructuras

struct {
int hh;
int mm;
int ss;
} Hora;
Hora h, v[10], *p;
h.hh = 8;
p = &h;
v[3].hh = 5;
v[7] = *p;
cout << p->hh << h.hh << v[7].hh
35

Definición de nuevos tipos

typedef int Vector[10]; typedef float Matriz[5][3];


Vector v; Matriz a;

typedef enum Boolean {FALSE, TRUE};


enum Color {Rojo, Verde, Azul, Amarillo}

typedef struct Persona {


char paterno[10];
char materno[10];
char nombre[10];
};
36

Definición de nuevos tipos

typedef union Numero {


int i;
float f;
};

Vector v; // int v[10];


Boolean sw = FALSE;
Persona alumno;
Numero x;
37

OBJETOS CONSTANTES
38

Objetos Constantes

 Se definen mediante el prefijo const


 Estos objetos NO puede ser modificados por
asignación
 Sólo se permite su inicialización

const int x; // error: x debe ser inicializada


x = 7; // error: x no puede ser
// modificada por asignación
const int z = 3;
cout << z << '\n';
39

FUNCIONES
40

Definición

<tipo de retorno> <nombre>(<parámetros>) {


<datos locales>
<instrucciones>
}

 Las funciones no se pueden anidar


 Todas las funciones son externas, se pueden llamar
desde cualquier punto del programa
41

Definición

#include <iostream.h>
void f1() {
cout << "Función sin argumentos \n";
}
void f2(void) {
cout << “También sin argumentos \n";
}
int main() {
f1();
f2();
return 0;
}
42

Tipos de retorno

 Si la función retorna un valor, se debe


especificar el tipo de dato retornado:
char, double, float
 También puede retornar un UN PUNTERO.
 Puede no retornar valores (void).
 Puede retornar una referencia: (ALIAS)

<tipo> &<nombre>(<parámetros>)
43

Declaración (prototipo)

<tipo de retorno> <nombre>(<parámetros>);

 Se pueden omitir los nombres de los parámetros y


dejar solamente los tipos
 No es necesario declarar las funciones si se
definen antes de usarlas
44

Variables locales y globales

 Una variable que se declara fuera de las funciones


es una variable global y puede ser utilizada dentro
de todas las funciones del programa
 Una variable que se declara dentro de una función
es una variable local y solamente puede ser
utilizada dentro de dicha función. Al terminar la
ejecución de la función desaparece
45

Parámetros

 Parámetros Formales
 O de definición, son los que aparecen en la
declaración de la función
 Parámetros Actuales
 O de invocación, son los que aparecen en la llamada
a la función
 Se usan para
 inicializar los parámetros formales, o
 recibir valores de los parámetros formales
46

Parámetros actuales

 Los parámetros actuales pueden ser:


 Constantes
 Variables
 Expresiones
 Ejemplo:

total = CalcArea(20, 4);


L = 30;
A=12;
total = CalcArea(L, A+2);
47

Modos de parametrización

 Parámetros por Valor


 Al llamar a la función, se copia el valor del
parámetro actual como valor del parámetro formal
 El parámetro formal se inicializa con el valor de
parámetro actual
 La función trabaja con una copia; luego, no modifica
el valor de la variable usada como parámetro actual
LLAMADA DEFINICIÓN
Ejemplo(a); void Ejemplo(int x)
Ejemplo(a+1);
Ejemplo(4);
48

Modos de parametrización

 Parámetros por Referencia


 Al llamar a la función, se copia la dirección del
parámetro actual como dirección del
parámetro formal
 El parámetro formal es ALIAS del parámetro
actual
 La función puede cambiar su valor
LLAMADA DEFINICIÓN
Ejemplo(a); void Ejemplo(int &x)
49

Ejemplos

void Ejemplo (int a, int &b) {


a = 5;
b = 8;
}

int main( ) {
int x = 2, y = 4, &z = x; // z es ALIAS de x
Ejemplo(x, y);
cout << x << " " << y << " " << z;
cout << endl;
return 0;
}
50

Ejemplos

int cuadXVal(int a) {
return a = a*a;
}
void cuadXInd(int *b) {
*b = (*b) * (*b);
}
void cuadXRef(int &c) {
c = c*c;
}
51

Ejemplos

int main() {
int x = 2, y = 3, z = 4;
cout << "Por valor : x = " << cuadXVal(x) << '\n';
cuadXInd(&y);
cout << "Por indirección : y = " << y << '\n';
cuadXRef(z);
cout << "Por referencia : z = " << z << '\n';
return 0;
}
52

Prototipos de funciones

#include <iostream.h>
void f1();
void f2(void);
int main() {
f1();
f2();
return 0;
}
void f1() {
cout << "Función sin argumentos \n";
}
void f2(void) {
cout << "Función también sin argumentos \n";
}
53

Funciones en línea

 La cláusula inline sugiere al compilador la generación


de una copia del código de esa función "in situ"
(cuando sea apropiado), a fin de evitar una llamada
 Esta sugerencia es generalmente acogida en el caso
de funciones pequeñas
54

Funciones en línea

inline float cubo(float x) {


return x*x*x;
}
int main() {
cout << "Ingrese el largo del lado de un cubo: ";
float lado;
cin >> lado;
cout << "Volumen del cubo de lado “ << lado
<< " es " << cubo(lado) << '\n';
return 0;
}
55

Memoria Dinámica

int *p;
p = new int;
:::
delete p;

int q = new int(3);


float f = new float(2,2);
:::
delete q;
56

Ejemplo ilustrativo

1. int *p, *q; 2. p=new int; 3. *p=10;

p ? p ? p 10
q ? q ? q ?

4. q=p; 5. *q=85;

p 10 p 85
q q
57

Ejemplo ilustrativo

5. *q=85; 6. p new ( int);


p 85 p ?
q q 85

7. *p= 9;

p 9
q 85
58

Ejemplo ilustrativo

p 85 p 9
q q 85

8. delete q; 9. delete q;

p ? p 9
q ? q ?
59

Memoria Dinámica

typedef struct {
int num;
float saldo;
} Cuenta;

Cuenta *c;
c = new Cuenta;
60

Memoria Dinámica

int *v;

v = new int [100];


// crea un arreglo dinámico de 100 enteros

delete [] v;
// libera la memoria ocupada por v
61

Resolución de alcance

Operador ::
float x = 1.23;
int main() {
int x = 7
cout << "x local = "<< x <<endl;
cout << "x global = " << ::x << endl;
return 0;
}
62

Sobrecarga de funciones

 Es posible definir funciones con el mismo nombre,


las cuales se pueden diferenciar en:
 El tipo del valor retornado
 La lista de parámetros
 Cantidad de parámetros
 Tipo de los parámetros
63

Sobrecarga de funciones

float cuadrado(int k) {
return k*k;
}
float cuadrado(float x) {
return x*x;
}
int main() {
int i = 5; float x = 3.3;
cout << i << " al cuadrado = " << cuadrado(i);
cout << endl;
cout << x << " al cuadrado = " << cuadrado(x);
return 0;
}