37
1 Recordando C

Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

1

Recordando C

Page 2: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 3: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 4: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 5: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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)

Page 6: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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;

Page 7: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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)

Page 8: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 9: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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;

Page 10: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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)

Page 11: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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)

Page 12: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 13: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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”

Page 14: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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;

Page 15: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 16: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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)

Page 17: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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);

Page 18: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 19: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

19

Salto a C++

Page 20: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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”;

}

Page 21: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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)

Page 22: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 23: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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{...

Page 24: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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();

}

Page 25: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 26: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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)

Page 27: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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();

}

Page 28: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 29: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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);}

Page 30: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 31: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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();

}

Page 32: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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();}

Page 33: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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();

}

Page 34: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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>

Page 35: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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();

Page 36: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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

Page 37: Recordando C - sopa.dis.ulpgc.essopa.dis.ulpgc.es/so/practica/diapositivas-practicas/C_C++_1... · decimales) n Las operaciones booleanas devuelven un cero o un uno, en C no existe

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)