Vous êtes sur la page 1sur 34

Programacin Orientada a Objetos

Unidad II Introduccin a la programacin con C++

M.C. Adrin Snchez Vidal

Objetivo
El estudiante identificar los diferentes tipos de variables y de sentencias mediante la construccin de programas; para disear programas ms complejos.

ENUMERACIONES Enumeracin
Al declarar la enum se puede asociar a los tipos de datos a valores constantes en vez de la asociacin que por defecto se realiza (0, 1, 2, ), se utiliza entonces este formato: enum Nombre { enumerador1 = valor_constante1, enumerador2 = valor_constante2, ... enumeradorn = valor_constanten, };

ENUMERACIONES Enumeracin
Ejemplo 6:
#include <stdio.h>
enum DiasSemanas { Domingo = 2, Lunes, Martes, Miercoles, Jueves, Viernes, Sabado }; /* Se inicializa nuestra constante Domingo en 2, * As las dems constantes se inicializan con los * siguientes valores enteros. */

ENUMERACIONES Enumeracin
int main(int argc, char** argv) { enum DiasSemanas dia; int a; for (dia= Domingo; dia <= Sabado; dia++) { printf("%d ", dia); /* Salida: 2 3 4 5 6 7 8 */ }
return 0; }

Enumeracin
Ejercicio de Tarea 1.

Las mquinas vendedoras de refrescos son simples mquinas de estado. stas mquinas, de una manera simplificada, tienen los siguientes estados:
1. Inicio. 2. Recibiendo Monedas. 3. Dispensando Refresco.

Cree un programa que reciba como parmetro el costo del refresco y utilizando la funcin para el generador de nmeros aleatorios (rand()) acumule hasta que iguale o supere tal monto y dispense el refresco; por ejemplo:
C:>/ dispensaRefresco 1.5 C:>/ Recibiendo dinero .28 acumulado C:>/ Recibiendo dinero .89 acumulado

Enumeracin
C:>/ Recibiendo dinero 1.28 acumulado C:>/ Recibiendo dinero 1.58 acumulado C:>/ Monto completo, dispensando refresco.

Se recomienda que utilize un enum para identificar los estados de la maquina dentro de un SWITCH, y un while para ciclar mientras se acumula el monto necesario, por ejemplo:
case RECIBIENDO_MONEDAS: while (varAcumulado < atoi(argv[1])){ printf(Recibiendo dinero %f acumulado, varAcumulado); varAcumulado += rand();} varEstado = DISPENSANDO_REFRESCOS; break;

TIEMPO: 10 MIN

Estructuras
En la creacin de soluciones para algunos problemas surge la necesidad de agrupar datos de diferente tipo o de manejar datos que serian muy difcil de describir en los tipos de datos primitivos, esta es la situacin en la que debemos aprovecharnos de las caractersticas que hacen al lenguaje C especial, o sea el uso de estructuras uniones y punteros.
La funcin strcpy En lenguaje C, para asignar una expresin de cadena a un array de caracteres, no se puede utilizar el operador de asignacin (=). Para ello, se puede utilizar la funcin strcpy, que est disponible en la biblioteca estndar de C. La sintaxis de una llamada a strcpy es: strcpy( <variable_destino>, <cadena_fuente> )

ESTRUCTURAS Estructuras
Una estructura contiene varios datos. La forma de definir una estructura es haciendo uso de la palabra clave struct. Ejemplo:
struct mystruct { int int_member; double double_member; char string_member[25]; } variable; "variable" es una instancia de "mystruct" y no es necesario ponerla aqu. Se podra omitir de la declaracin de "mystruct" y ms tarde declararla usando: struct mystruct variable;

ESTRUCTURAS Estructuras
Es muy comn asignarle un alias o sinnimo al nombre de la estructura, para evitar el tener que poner "struct mystruct" cada vez. C nos permite la posibilidad de hacer esto usando la palabra clave typedef, lo que crea un alias a un tipo: typedef struct { ... } Mystruct;
La estructura misma no tiene nombre (por la ausencia de nombre en la primera lnea), pero tiene de alias "Mystruct". Entonces se puede usar as: Mystruct variable;

ESTRUCTURAS Estructuras
Otra forma de usar typedef puede ser:
struct var { int data1; int data2; char data3; }; struct var a;

typedef struct var nuevotipo; nuevotipo a;


Esto es ms legible porque no se requiere la palabra reservada struct antes de declarar una nueva variable de tipo var.

ENUMERACIONES Estructuras
Ejemplo 7:
# include <stdio.h> int main() { int i, j; static struct { int i; float x; } sta = { 1, 3.1415e4}, stb = { 2, 1.5e4 }; static struct { char c; int i; float s; } st [2][3] = { {{ 'a', 1, 3e3 }, { 'b', 2, 4e2 }, { 'c', 3, 5e3 }}, { { 'd', 4, 6e2 },} };

ENUMERACIONES Estructuras

printf ("sta:\n"); printf ("%d %f \n\n", sta.i, sta.x); printf ("st:\n"); for (i=0; i<2; ++i) for (j=0; j<3; ++j) printf ("%c %d %f\n", st[i][j].c, st[i][j].i, st[i][j].s); }

Estructuras
Ejercicio 1. El tipo ms comn de controlador para motores es el PID. ste, tpicamente tiene tres ganancias denominadas Kp. Ki, y Kd; adems, cuando existen mltiples lazos, cada controlador tiene un ndice identificador. Escriba un programa que reciba cuatro parmetros, el primero es el identificador de lazo (tipo char) y las tres ganancias (tipo float) y las almacene en una estructura de datos tipo STRUCT. C:>/ controladorPID 2 3.1234 4.81 0.23

El programa despus de ejecutarse, reporta los eventos de la siguiente manera: C:>/ Ganancias del Lazo 2: Kp = 3.1234 Ki = 4.81 TIEMPO: 30 MIN Kd = 0.23

Unin
La definicin de "unin" es similar a la de "estructura", La diferencia entre las dos es que en una estructura, los miembros ocupan diferentes reas de la memoria, pero en una unin, los miembros ocupan la misma rea de memoria. Entonces como ejemplo: union { int i; double d; } u;

El programador puede acceder a travs de "u.i" o de "u.d", pero no de ambos al mismo tiempo. Como "u.i" y "u.d" ocupan la misma rea de memoria, al modificarse a uno de sus miembros se modifica el valor del otro, algunas veces de maneras impredecibles. El tamao de una unin es el de su miembro de mayor tamao.

ENUMERACIONES Unin
Ejemplo 8:
#include <stdio.h> #include <string.h>

/*Creamos una union*/ union frases { char mensajes[50]; char ayudas[50]; char lineas[50]; } palabra;
/*Creamos una estructura*/ struct comparte { char mensajes[50]; char ayudas[50]; char lineas[50]; }Sistema;

ENUMERACIONES Unin
/*Ntese que la estructura y la unin tienen los mismos tipos de datos*/ int main(int argc, char** argv) { /*Inicializamos Union*/ strcpy(palabra.mensajes,"Primer Mensaje"); strcpy(palabra.ayudas, "Una Ayuda"); /*Imprimimos miembros de union*/ printf("\nFrases en Union: "); printf("\n1- %s", palabra.mensajes); printf("\n2- %s", palabra.ayudas); /*Inicializamos Estructura*/ strcpy(Sistema.mensajes, "Primer Mensaje"); strcpy(Sistema.ayudas, "Una Ayuda"); printf("\n\nFrases en Struct: ");

ENUMERACIONES Unin
/*Imprimimos miembros de struct*/ printf("\n1- %s", Sistema.mensajes); printf("\n2- %s", Sistema.ayudas); /* En la estructura comparte, se reservan * 150 bytes de memoria para los tres * miembros, en este caso cada uno es * independiente en memoria, asi pues se * puede inicializar cada uno o usar como * un campo independiente. */ return 0; }

PUNTEROS Punteros
Los punteros son una de las ms potentes caractersticas de C, pero a la vez uno de sus mayores peligros. Los punteros nos permites acceder directamente a cualquier parte de la memoria. Esto da a los programas C una gran potencia. Sin embargo son una fuente ilimitada de errores. Un error usando un puntero puede bloquear el sistema. Al declarar una variable estamos diciendo al ordenador que reserve una parte de la memoria RAM para almacenarla. Cada vez que ejecutemos el programa la variable se almacenar en un sitio diferente; eso no lo podemos controlar; depende de la memoria disponible y de otros varios factores. Puede que se almacene en el mismo sitio, pero es mejor no fiarse. Dependiendo del tipo de variable que declaremos, el ordenador reservar ms o menos memoria.

PUNTEROS Punteros
Existe una forma de saber qu direcciones ha reservado el ordenador. Se trata de usar el operador:
& (operador de direccin).
F#include <stdio.h> main() { int a = 10; printf( "Dir. de a= %p, valor de a = %i\n", &a, a);} El valor de la variable puede cambiar a lo largo del programa, lo cambiamos a voluntad mediante el cdigo.
Ese valor est almacenado en la direccin de la variable. El identificador (nombre) de la variable es equivalente a poner un nombre a una zona de la memoria est almacenado en la direccin de memoria a la que llamamos a.

PUNTEROS Punteros
Qu son los punteros??? Un puntero es una variable un tanto especial. Con un puntero podemos almacenar direcciones de memoria. En un puntero podemos tener guardada la direccin de una variable. Veamos la diferencia entre una variable puntero y las variables "normales". Si se declara una variable: char numero = 43;

Ahora esta posicin de la memoria queda reservada y ya no la puede usar nadie ms.

PUNTEROS Punteros
Muchas veces los punteros se usan para guardar las direcciones de variables. Como cada tipo de variable ocupaba un espacio distinto, cuando declaramos un puntero debemos especificar el tipo de datos cuya direccin almacenar. As que para declararlo debemos hacer:
int *punt;

El * (asterisco) sirve para indicar que se trata de un puntero y debe ir justo antes del nombre de la variable, sin espacios. En la variable punt slo se pueden guardar direcciones de memoria, no se pueden guardar datos.

PUNTEROS Punteros
Ejemplo 9: #include <stdio.h> main() { int numero; int *punt; numero = 43; punt = &numero; printf( "Direccin de numero = %p\n", punt); printf("El valor de numero = %i\n", *punt); } Donde la direccin contenida en punt apunta al valor almacenado en la direccin numero.

PUNTEROS Punteros
Ejemplo 10:

Ahora para cambiar el valor de numero a travs de *punt. El resultado sera:


#include <stdio.h> main() { int numero; int *punt; numero = 43; punt = &numero; *punt = 30; printf( "Direccion de numero = %p\n", &numero); printf("El valor de numero = %i\n", numero ); }

PUNTEROS Punteros
Comparacin de punteros. Ejemplo 11: Si queremos comprobar si dos variables son iguales usando punteros. Qu se imprime en pantalla y porqu? #include <stdio.h> main() { int a,b; int *punt1, *punt2; a = 5; b = 5; punt1 = &a; punt2 = &b; if ( punt1 == punt2 ) printf( "Son iguales\n" );}

Qu se necesitara corregir?

PUNTEROS Punteros
Y ahora? Ejemplo 12: #include <stdio.h> main() { int a,b; int *punt1, *punt2; a = 5; punt1 = &a; punt2 = &a; if ( *punt1 == *punt2 ) printf("Ambos apuntan al mismo sitio\n" ); }

PUNTEROS Punteros
Punteros como argumentos de funciones. Se pueden pasar parmetros y obtener resultados de las funciones con los valores devueltos mediante return, pero solamente un nico valor. Ahora con los punteros se pueden modificar varias variables en una funcin.

La forma tradicional de pasar los argumentos es:


Ejemplo 13: #include <stdio.h> int suma( int a, int b ) { return a+b; } main() { int var1, var2; var1 = 5; var2 = 8; printf( "La suma es : %i\n", suma(var1, var2) ); }

PUNTEROS Punteros
Ejemplo 14:

Si ahora se desea tener la suma pero adems se busca que var1 se haga cero dentro de la funcin. Se hara lo siguiente:
#include <stdio.h> int suma( int *a, int b ) { int c; c = *a + b; *a = 0; return c; } main() { int var1, var2; var1 = 5; var2 = 8; printf( "La suma es: %i \n", suma(&var1, var2)); printf("La variable a vale: %i\n", var1 ); }

PUNTEROS Punteros

Si se pasa el argumento a la funcin por valor, ste solo se copia y se usa sin posibilidad de modificar su valor. Sin embargo, si se pasan por referencia usando la direccin del valor a travs de un puntero, es posible modificar su valor dentro de la misma funcin.

Punteros
Ejercicio 2. Genere un programa en C que reciba como parmetro un numero e imprima, byte por byte, como se almacena en memoria; por ejemplo la llamada al programa, sera algo as: C:>/ imprimeMemoria -3593 El programa despus de ejecutarse, reporta byte por byte en memoria el entero de la siguiente manera: C:>/ [247][241][255][255] Se recomienda, utilizar una unin con tipos de datos unsigned char e int.

TIEMPO: 30 MIN

Punteros
Ejercicio 3. Modifique el programa anterior para que ahora reciba un parmetro adicional, el tipo de dato, de tal manera que el usuario diga si es un flotante, un entero o un entero sin signo, por ejemplo: C:>/ imprimeMemoria i -3593 C:>/ imprimeMemoria f 34.678 C:>/ imprimeMemoria u 62496 Y el programa utilizando una sentencia de control switch, reporta byte por byte en memoria segn el tipo de dato de la siguiente manera: C:>/ Entero : [247][241][255][255] C:>/ Flotante: [64][251][11][74] C:>/ Sin Signo: [32][244][0][0]

TIEMPO: 30 MIN

Punteros
Ejercicio de Tarea 2. Ahora, mueva la conversin e impresin de los parmetros recibido a una funcin de tal manera que el archivo que contiene la funcin main quede de la siguiente manera: #include <stdio.h> #include <stdlib.h> #include datosMemoria.h int main(int argc, char** argv) { imprimeDatos (argv[1][0], argv[2]); return 0; }

Punteros
Ejercicio de Tarea 3. Por ltimo, repita el ejercicio anterior y cree otra funcin, para que en vez de utilizar uniones para obtener la representacin en memoria, utilice tipos de datos principales (float, int, unsigned int) y un apuntador tipo unsigned char para leer el contenido de la memoria. Asegrese de que la nueva implementacin con apuntadores funcione llamando a ambas funciones y comparando los resultados:

imprimeDatos (argv[1][0], argv[2]); imprimeConApuntadores (argv[1][0], argv[2]);

Bibliografa

1. Cmo programar C++, 6 Edicin, P. J. Deitel / H. M. Deitel. Editorial Prentice Hall. 2. Cmo programar C#, 2 Edicin, P. J. Deitel / H. M. Deitel. Editorial Prentice Hall. 3. Programacin en C++, 2 Edicin, Luis Joyanes Aguilar. Editorial Mc Graw Hill. 4. Manual de Referencia C, 4 Edicin, Herbert Schildt. Editorial Mc Graw Hill.

Vous aimerez peut-être aussi