Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... ·...

Preview:

Citation preview

1

Recordando C

2Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Característicasn Lenguaje de programación estructurada

n Extremadamente simple

n Permite generar código pequeño y eficiente

n Poca comprobación de errores en elcompilador (ej. tipado débil, punteros)

n Impone poca disciplina, da mucha libertad al programador

3Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Estructura general de un programa

//cabeceras#include<stdio.h>/* declaraciones de funciones */

//definiciones (cuerpos de funciones)//declaraciones de variables globalesmain(){//cuerpo del main}//otras definiciones de funciones

4Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Generación de un programa ejecutable

preprocesador

compilador

enlazador

Fuentehola.cc

libm.o

libc.o

Ejecutablehola

Objetohola.o

hola.hstdio.h

math.h

cabeceras

bibliotecas

5Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Elementos de programaciónn Estructuras de datos

n literales, tipos básicos, tipos enumeradosn tipos estructurados (struct, union)n punteros y vectoresn Tipos nuevos : typedef

n Construcciones algorítmicasn construcciones condicionales (if, switch)n construcciones iterativas (while, for, do...while)n subrutinas (funciones)

6Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Variables

n tipo nombre {, nombre};

n tipo nombre=valor_inicial;

n ¡OJO!, distingue mayúsculas

int una=1, otra, Una, UNA=3;long int entero_largo;unsigned int entero_sin_signo;

7Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Expresiones, operadoresn Expresión: operación sobre literales o variables que

devuelve un resultado

n Las asignaciones son expresionesn c=20-(b=2*(a=5)+4);

n Operadoresn Aritméticos: + - * / %n Manip. de bits: | & ^ ~ << >>n Lógicos: == != > < >= <= || && !n Pre-post in/decremento: x++, x--,++x, --xn Asignacion compuesta:

n a+=3 es como a=a+3 n a*=x+1 es como a=a*(x+l)

8Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Más sobre expresionesn No se detectan desbordamientos

n En las divisiones, si los operandos son enteros, se devuelve solo el cociente (sin decimales)

n Las operaciones booleanas devuelven un cero o un uno, en C no existe el tipo booleano

n Conversión de tipos: (nuevo_tipo)expresionn Por ejemplo, se puede utilizar para forzar que una

división de enteros se realice en coma flotante

9Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Vectores y matricesn tipo variable[dimension1][dimension2]...

n Los índices van de 0 a N-1

n ¡No se comprueban accesos fuera de rango!

int vector[10];float M[3][3];int vector2[3]={1,2,3};int M2[2][3]={{1,2,3},{4,5,6},{7,8,9}};vector[5]=1;vector[0][2]=18.5;

10Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Cadenasn Vectores de caracteres: char cadena[5];

n Toda cadena termina en un carácter nulo (‘\0’ o simplemente 0)

n El C no tiene operaciones con cadenas; se usan funciones de la biblioteca <string.h>n strcpy(s1,s2); (s1:=s2)n strcat(s1,s2); (s1:=s1 & s2);n strcmp(s1,s2); (compara s1 con s2)n strlen(s); (longitud de s)

11Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Funcionesn tipo nombre_función(parámetros)

n Se sale con una sentencia return

n Los procedimientos son las “funciones void” (void funcion(){...})

n Los parámetros siempre se pasan por valor (el paso por referencia se hace mediante punteros)

n Si no tiene argumentos se declaran con void(sólo en C; en C++ sólo paréntesis)

12Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Funciones

n En la llamada siempre se usan paréntesis

n En la llamada no es obligatorio recoger el valor

n En C no se permiten anidar funciones

n Si se permiten llamadas recursivas

13Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Ambito y existencia

n Un identificador (tipo, variable o función) puede ser global o local

n Las funciones sólo pueden ser globales

n Variables static (mantienen su valor en sucesivas llamadas)

n Modificador “extern”

14Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Punterosn Un puntero es un valor que representa una

dirección de memoria donde hay un dato de un determinado tipo

n Declaraciónn tipo *puntero;

n Operadoresn Dirección de una variable: &var;n desreferenciar un puntero: *ptr;

15Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Punteros

int *ptr;int var=15;ptr=&var;*ptr=33;

int vec[30];*(vec+2)=5; //vec[2]=5

struct cosa *ptr;struct cosa A;ptr=&A;ptr->campo=xxx; //(*ptr).campo=xxx

16Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Punteros

//paso de parámetros por referenciavoid duplica(int *variable){*variable=*variable*2;}int a=3;duplica(&a); // a valdrá seis

//memoria dinámicaptr=(int*)malloc(100^*sizeof(int))free(ptr)

17Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Entrada / Salidan printf, scanf (%d, %c, %f, %s)

n Para la lectura de cadenas, scanf CASI NUNCA FUNCIONA; mejor utilizarn gets, fgets

printf(“El doble de %d es %d\n”,x,2*x);scanf(“%d %d”, &x,&y);gets(cadena);fgets(cadena,80,stdin);

18Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Preprocesadorn Órdenes al preprocesador #

n #include <> o “”n #definen #undefn #ifdef, #ifndef, #ifn #elifn #else,n #endif

19

Salto a C++

20Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Características básicas

n Entrada/salidan cin >>, cout <<

#include<iostream.h>main(){int i;cout << “Esto es C++.\n”;cout << “Escriba un número: “;cin >> i;cout << “El número escrito es” << i << “\n”;

}

21Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Características básicasn Comentarios

n /* */ y además //

n A diferencia de C, las declaraciones de variables no tienen que estar necesariamente al comienzo del bloquen for(int i=0;i<N;i++)

n Todas las funciones tienen que ser declaradas (en C los prototipos eran opcionales)

22Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Clasesn Es la herramienta que C++ nos proporciona para

definir tipos abstractos de datos (encapsulamiento)

n Consiste en:n Unas estructuras de datosn Conjunto de operaciones asociadas a tales estructuras

(funciones miembro o métodos)

n Una clase puede contener partes privadas y partes públicas

n Por defecto, todos los elementos definidos en una clase son privados

23Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Clasesclass nombre_clase{

datos y funciones privadospublic:

datos y funciones públicos} [lista de nombres de objetos];

tipo nombre_clase::nombre_funcion(params){

cuerpo de la función{...

24Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Clases#include <iostream.h>class ejemplo{

int p;public:

void dar_valor(int val);void mostrar_valor();

};void ejemplo::dar_valor(int val){

p=val;}void ejemplo::mostrar_valor(){

cout << p << “\n”;}

main(){

ejemplo ob;ob.dar_valor(5);ob.mostrar_valor();

}

25Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Clasesn Es muy normal que una parte de un objeto

necesite una inicialización antes de poder usarse

n C++ permite que los objetos se inicialicen ellos solos cuando se crean

n Esta inicialización automática se realiza a través del uso de una función constructora o constructor

26Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Clasesn El constructor es una función miembro

especial que tiene el mismo nombre que la clasen Se llama al constructor cuando se crea el objeto

(al declararlo o crearlo dinámicamente)

n El complemento del constructor es el destructor:n Se llama al destructor cuando se destruye el

objeto (en el caso de objetos locales, al salir del bloque y en el caso de objetos globales al terminar el programa)

27Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Clases#include <iostream.h>class ejemplo{

int p;public:

ejemplo(int val=0);~ejemplo();void dar_valor(int val);void mostrar_valor();

};void ejemplo::dar_valor(int val){

p=val;}void ejemplo::mostrar_valor(){ cout << p << “\n”;}

void ejemplo::ejemplo(int val){

p=val;cout << “Constructor”;

}void ejemplo::~ejemplo(){

cout << “Destructor”;}main(){

ejemplo ob(2),ob2;ob.mostrar_valor();ob.dar_valor(5);ob.mostrar_valor();ob2.mostrar_valor();

}

28Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Funciones de línea

n Es una función que se expande en el punto donde llama en vez de ser llamada

n Formas de crear una función de línea:n Modificador inlinen Definiendo el código de una función

miembro dentro de la definición de la clase

29Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Funciones de línea#include <iostream.h>class ejemplo{

int p;public:

ejemplo(int val) {p=val;}~ejemplo(){cout << “Destructor”;}void dar_valor(int val) {p=val};void mostrar_valor() {cout <<p <<“\n”;}

};main(){

ejemplo ob,ob2;ob.mostrar_valor();ob2.mostrar_valor();

}

#include <iostream.h>inline int f(params){...

}main(){

f(params);}

30Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Paso de objetos a funciones

n Un objeto se puede pasar a una función de la misma forma que cualquier otro tipo de dato

n Paso por valorn Lo que se pasa es una copia del objeto

31Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Paso de objetos a funciones#include <iostream.h>void f(Objeto x);class Objeto{

int p;public:

Objeto(int val) {p=val;}~Objeto(){cout << “Destructor”;}void dar_valor(int val) {p=val};void mostrar_valor() {cout <<p <<“\n”;}

};void f(Objeto x){

x.dar_valor(5);x.mostrar_valor();

}

main(){

ejemplo ob(2);f(ob);ob.mostrar_valor();

}

32Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Arrays de objetosn Se pueden crear array de objetos de la

misma manera que se crean arrays de cualquier otro tipo de datos

main(){

Objeto ob[5]={Objeto(30), Objeto(2),Objeto(33), Objeto(40), Objeto(5)};

ob[1].mostrar_valor();}

33Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Punteros a objetosn Referencia a un objeto

n Directamenten Usando un puntero a ese objeto

main(){

Objeto ob(1), *p;

ob.mostrar_valor();p=&ob;p->dar_valor(4);p->mostrar_valor();

}

main(){

Objeto ob[2], *p;ob[0].dar_valor(1);ob[1].dar_valor(2);p=&ob[0];(p++)->mostrar_valor();p->mostrar_valor();

}

34Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Otras característicasn Inicialización dinámica

n En C++, las variables locales y globales pueden inicializarse en tiempo de ejecución

n Cada vez que se invoca una función miembro, se pasa automáticamente un puntero al objeto que la invocan Se puede acceder a este puntero usando this

n Asignación dinámica usando new y delete

n ASSERT(condición a cumplir);n Si no se cumple la condición (0) veremos un mensaje:n Assertion failed: file <archivo>, line <numlinea>

35Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Ejemplosclass Objeto{

int p;public:

Objeto(int val) {this->p=val;}~Objeto(){cout << “Destructor”;}void dar_valor(int val) {this->p=val};void mostrar_valor() {cout <<p <<“\n”;}

};

gets(cadena)int k=strlen(cadena);scanf(“%d”,x);Objeto ob(x);assert(p>=0);

int *p;p=new int;if (!p) { cout <<“fallo”;}*p=20;delete p;

p=new int(23);

p=new int[10];for(int i=0;i<10;i++){ p[i]=0;}delete [10]p;

p=new Objeto(2);p->mostrar_valor();

36Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Compilación

n Compilación programa sencillo hola.cc

$g++ -c hola.cc$g++ -o hola hola.o

// en un solo paso$g++ -o hola hola.cc

37Sistemas Operativos© Alexis Quesada Arencibia – José Miguel Santos Espino

Ejercicio

n Realizar un pequeño programa que maneje una pila de elementos enteros (empleando para la pila un vector)

Recommended