3 tipos de datos cont
TRANSCRIPT
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 11
Tipos de datos (Tipos de datos (cont.cont.))
Repaso lecturas SSD5Repaso lecturas SSD5
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 22
Entrada y salidaEntrada y salida
•• Flujos (Flujos (StreamStream))
–– La entrada y salida de información se basa en La entrada y salida de información se basa en
flujos; un flujo es una secuencia de bytes que flujos; un flujo es una secuencia de bytes que
se mueven de un lugar a otrose mueven de un lugar a otro
–– El proceso de salida implica el movimiento de El proceso de salida implica el movimiento de
bytes (uno a la vez) de un programa hacia un bytes (uno a la vez) de un programa hacia un
dispositivo (monitor, impresora, archivo, etc.)dispositivo (monitor, impresora, archivo, etc.)
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 33
Entrada y salidaEntrada y salida
•• La entrada implica el flujo de bytes desde La entrada implica el flujo de bytes desde
un dispositivo (teclado, archivo, red) hacia un dispositivo (teclado, archivo, red) hacia
el programael programa
entrada: entrada: cincin >> >> namename;;
salida: salida: coutcout << “<< “ enterenter youryour namename”;”;
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 44
Uso de los flujos estándarUso de los flujos estándar
•• Tres flujos específicos están siempre Tres flujos específicos están siempre disponibles para cada programa: disponibles para cada programa: entrada entrada estándar, salida estándar y error estándarestándar, salida estándar y error estándar; cada ; cada uno tiene un uso específicouno tiene un uso específico
–– entrada estándar: lee los datos de consolaentrada estándar: lee los datos de consola
–– salida estándar: escribe datos a la consolasalida estándar: escribe datos a la consola
–– error estándar: muestra mensajes de error en error estándar: muestra mensajes de error en la consolala consola
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 55
Uso de los flujos estándarUso de los flujos estándar
•• Los objetos Los objetos cincin y y coutcout dan acceso respectivo dan acceso respectivo
al flujo estándar de entrada y salida. El al flujo estándar de entrada y salida. El
objeto objeto cerrcerr da acceso al flujo de error da acceso al flujo de error
estándarestándar
cincin >> >> namename >> >> ageage
cerrcerr << “<< “\\nInvalidnInvalid ageage enteredentered”;”;
coutcout << “<< “\\nn” << ” << namename << “<< “isis” << ” << ageage;;
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 66
Uso de los flujos estándarUso de los flujos estándar
•• Los programadores pueden definir cómo Los programadores pueden definir cómo
las clases que crean interactúan con los las clases que crean interactúan con los
flujos usando los operadores << y >> flujos usando los operadores << y >>
•• Esto es conocido como Esto es conocido como sobrecarga del sobrecarga del
operadoroperador Inserción (<<) y Extracción (>>)Inserción (<<) y Extracción (>>)
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 77
Uso de los flujos estándarUso de los flujos estándar
•• Se puede definir el comportamiento de Se puede definir el comportamiento de
estos operadores para las clases que estos operadores para las clases que
creamoscreamos
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 88
El archivo de entrada y salidaEl archivo de entrada y salida
•• La entrada y salida en archivos es similar al La entrada y salida en archivos es similar al
de teclado y pantallade teclado y pantalla
•• La diferencia esta en que hay que abrir y La diferencia esta en que hay que abrir y
cerrar archivos explícitamentecerrar archivos explícitamente
•• El objeto requerido es El objeto requerido es ifstreamifstream
•• Esta clase no es parte del lenguaje C++ y Esta clase no es parte del lenguaje C++ y
se debe incluir su bibliotecase debe incluir su biblioteca
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 99
El archivo de entrada y salidaEl archivo de entrada y salida
•• Es buena práctica revisar si al intentar abrir Es buena práctica revisar si al intentar abrir
un archivo realmente se tiene éxitoun archivo realmente se tiene éxito
SSD5 Mtl Lourdes Cahuich 10
#include <fstream>
…
ifstream inf;
inf.open(“arch.txt”);
if(!inf){
cerr << “no se puede abrir archivo” << endl;
return EXIT_FAILURE
}
int x;
while(inf>>x){
cout << x << endl>
}
inf.close();
…
}
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 1111
El archivo de entrada y salidaEl archivo de entrada y salida
•• La salida del archivo se semeja a su entrada La salida del archivo se semeja a su entrada
y se necesita incluir la referencia a la y se necesita incluir la referencia a la
biblioteca biblioteca fstreamfstream; pero utilizando un objeto ; pero utilizando un objeto
ofstreamofstream en lugar de un en lugar de un ifstreamifstream
SSD5 Mtl Lourdes Cahuich 12
…
ofstream onf;
onf.open(“nomarch.txt”);
if(!onf){
cerr << “no se pudo abrir archivo” << endl;
return EXIT_FAILURE;
}
for (int i = 1 ; i <= 10 ; i++){
onf << “esta es la linea” << i << endl;
}
onf.close();
…
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 1313
El archivo de entrada y salidaEl archivo de entrada y salida
•• Hay que tener presente que el archivo de Hay que tener presente que el archivo de
Entrada/Salida está basado en un flujo que Entrada/Salida está basado en un flujo que
es secuencial por naturaleza por lo que es es secuencial por naturaleza por lo que es
difícil y muy costoso moverse hacia delante difícil y muy costoso moverse hacia delante
y hacia atrás, y el único método de acceso y hacia atrás, y el único método de acceso
es recorrer el archivo de inicio a fines recorrer el archivo de inicio a fin
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 1414
Fallas comunesFallas comunes
•• El flujo espera espacios en blanco para El flujo espera espacios en blanco para separar los valores que lee (pueden ser separar los valores que lee (pueden ser espacios en blanco, tabuladores, caracteres espacios en blanco, tabuladores, caracteres de nueva línea o retorno)de nueva línea o retorno)
•• La entrada del flujo ignora por La entrada del flujo ignora por defaultdefaultespacios blancos adicionales; la operación espacios blancos adicionales; la operación de entrada no hace caso de este espacio en de entrada no hace caso de este espacio en blanco adicionalblanco adicional
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 1515
Fallas comunesFallas comunes
•• Otra falla común es cuando se intenta leer Otra falla común es cuando se intenta leer una línea de texto en variable una línea de texto en variable stringstring; la ; la forma apropiada de introducir una línea forma apropiada de introducir una línea entera de texto es usando la función entera de texto es usando la función getlinegetline que se encuentra en la biblioteca que se encuentra en la biblioteca stringstring: esta función tiene su propia falla, ya : esta función tiene su propia falla, ya que la implantación de Microsoft tiene un que la implantación de Microsoft tiene un error en que se requiere un doble error en que se requiere un doble enterenter al al final de cada líneafinal de cada línea
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 1616
El El preprocesadorpreprocesador
•• Sustitución de textoSustitución de texto
–– El El preprocesadorpreprocesador es una herramienta para es una herramienta para manipular el contenido de los archivos fuente manipular el contenido de los archivos fuente antes de compilar; el antes de compilar; el preprocesadorpreprocesador realiza la realiza la sustitución y modificadores de textosustitución y modificadores de texto
–– La inclusión de archivos, sustitución macro y La inclusión de archivos, sustitución macro y compilación condicional son tres compilación condicional son tres características de alto nivel que el características de alto nivel que el preprocesadorpreprocesador brinda al programadorbrinda al programador
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 1717
El El preprocesadorpreprocesador
–– Los archivos de código fuente por lo general Los archivos de código fuente por lo general necesitan ser modificados antes de la necesitan ser modificados antes de la compilación y para esto es necesario conocer compilación y para esto es necesario conocer el uso básico del procesador. el uso básico del procesador.
–– Los programas de C++ se componen Los programas de C++ se componen enteramente de texto por lo que se debe usar enteramente de texto por lo que se debe usar el el preprocesadorpreprocesador para incluir la declaración de para incluir la declaración de clases o funciones externas, conocido como clases o funciones externas, conocido como “inclusión de archivo”“inclusión de archivo”
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 1818
El El preprocesadorpreprocesador
–– Un programador interactúa con el Un programador interactúa con el
preprocesadorpreprocesador mediante comandos llamados mediante comandos llamados
“directivas del procesador” que comienzan “directivas del procesador” que comienzan
con el signo de número (#); las directivas son con el signo de número (#); las directivas son
comandos de una sola línea que se colocan en comandos de una sola línea que se colocan en
un archivo de código fuenteun archivo de código fuente
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 1919
El El preprocesadorpreprocesador
–– La inclusión de una directiva indica al La inclusión de una directiva indica al
preprocesadorpreprocesador la realización de cierta acción; la realización de cierta acción;
ésta acción depende de la directiva en algunos ésta acción depende de la directiva en algunos
casos el casos el preprocesadorpreprocesador hace una modificación hace una modificación
en el archivo de código fuente; por ejemplo, la en el archivo de código fuente; por ejemplo, la
inclusión del contenido de otro archivoinclusión del contenido de otro archivo
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 2020
Inclusión de archivosInclusión de archivos
•• La inclusión de archivos es una La inclusión de archivos es una
característica del característica del preprocesadorpreprocesador de C++ de C++
que permite que un archivo fuente utilice que permite que un archivo fuente utilice
código compartido; con la línea #código compartido; con la línea #includeinclude
se incluye un archivo; el se incluye un archivo; el preprocesadorpreprocesador
sustituye la línea que contiene la directiva sustituye la línea que contiene la directiva
con el contenido del archivo con el contenido del archivo específicadoespecíficado
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 2121
Inclusión de archivosInclusión de archivos
•• ##includeinclude acepta dos diferentes formas de acepta dos diferentes formas de
su parámetro <nombre> busca un archivo su parámetro <nombre> busca un archivo
especificado en un conjunto de lugares especificado en un conjunto de lugares
independientes de la implantación independientes de la implantación
(directorios del sistema y bibliotecas) (directorios del sistema y bibliotecas)
“nombre” manda a buscar el archivo en el “nombre” manda a buscar el archivo en el
mismo directorio de la aplicación (archivos mismo directorio de la aplicación (archivos
creados por el usuario)creados por el usuario)
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 2222
Sustitución macroSustitución macro
•• Se puede realizar una sustitución del texto Se puede realizar una sustitución del texto
definido por el programador o a través de definido por el programador o a través de
un archivo completo del código fuente; un archivo completo del código fuente;
esto se conoce como esto se conoce como sustitución macrosustitución macro
#define#define identifica el texto de reemplazoidentifica el texto de reemplazo
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 2323
Sustitución macroSustitución macro
•• Al usar esta directiva un programador Al usar esta directiva un programador
declara un identificador y especifica su declara un identificador y especifica su
texto de reemplazotexto de reemplazo
#define MAXIMO 20#define MAXIMO 20
•• Se puede utilizar la sustitución macro para Se puede utilizar la sustitución macro para
implantar una variable constanteimplantar una variable constante
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 2424
Sustitución macroSustitución macro
•• Los programadores deben utilizar la Los programadores deben utilizar la
palabra reservada palabra reservada constconst en lugar de la en lugar de la
sustitución macro para crear variables sustitución macro para crear variables
constantes debido a que constantes debido a que constconst es parte del es parte del
lenguaje C++ y no una característica del lenguaje C++ y no una característica del
preprocesadorpreprocesador; estos ; estos constconst soportan mejor soportan mejor
la revisión de tiposla revisión de tipos
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 2525
Sustitución macroSustitución macro
•• El El preprocesadorpreprocesador soporta macros con soporta macros con
parámetros y es muy parecido a una parámetros y es muy parecido a una
función normal de C++función normal de C++
•• El El preprocesadorpreprocesador sustituye la llamada de la sustituye la llamada de la
función aparente con el texto de reemplazo función aparente con el texto de reemplazo
de macrode macro
SSD5 Mtl Lourdes Cahuich 26
#define identific(identif, identif,…) texto_reempla zo
#define max(x,y) ( ( (x)>(y) ) ? (x) : (y) )
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 2727
Compilación condicionalCompilación condicional
•• #define soporta la compilación #define soporta la compilación
condicional; donde se compilan solamente condicional; donde se compilan solamente
ciertas secciones de nuestro código fuente; ciertas secciones de nuestro código fuente;
lo cual es útil para insertar código de lo cual es útil para insertar código de
depuración que puede ser habilitado y depuración que puede ser habilitado y
deshabilitado fácilmente (#define, #deshabilitado fácilmente (#define, #ifif, ,
##endifendif))
SSD5 Mtl Lourdes Cahuich 28
#define DEBUG
…
#if defined (DEBUG)
cerr << “debuggin habilitado” << endl;
#endif
…
#if defined (DEBUG)
cerr << “i=“ << i << endl;
cerr <<“arr[i]=” <<arr[i] << endl;
#endif
…
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 2929
Compilación condicionalCompilación condicional
•• Se evalúa como verdadera solamente si se Se evalúa como verdadera solamente si se ha definido un identificador DEBUGha definido un identificador DEBUG
•• La compilación condicional sirve para La compilación condicional sirve para prevenir definiciones múltiples de las clases prevenir definiciones múltiples de las clases y funciones contenidas en archivos de y funciones contenidas en archivos de cabecera, para no incluir varias veces un cabecera, para no incluir varias veces un mismo archivo si se incluye en varios mismo archivo si se incluye en varios códigos fuentecódigos fuente
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 3131
Verificación de suposicionesVerificación de suposiciones
•• Verificar las suposiciones que usan Verificar las suposiciones que usan
afirmaciones es un ejemplo del uso común afirmaciones es un ejemplo del uso común
del del preprocesadorpreprocesador y sus característicasy sus características
•• Una Una afirmaciónafirmación es una declaración puesta en es una declaración puesta en
el código para verificar una suposiciónel código para verificar una suposición
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 3232
Verificación de suposicionesVerificación de suposiciones
•• Si al ejecutarla la suposición demuestra ser Si al ejecutarla la suposición demuestra ser
incorrecta, la declaración de la “incorrecta, la declaración de la “afirmaciónafirmación” ”
despliega un mensaje de notificación y despliega un mensaje de notificación y
detiene la ejecución del programa, lo cual detiene la ejecución del programa, lo cual
es muy útil para la detección de erroreses muy útil para la detección de errores
•• Todos los tipos de suposiciones se hacen Todos los tipos de suposiciones se hacen
sobre los datos contenidos en las variablessobre los datos contenidos en las variables
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 3333
Verificación de suposicionesVerificación de suposiciones
•• Cuando diseñamos y codificamos una Cuando diseñamos y codificamos una función esperando que los parámetros función esperando que los parámetros contengan datos válidos; en caso contrario contengan datos válidos; en caso contrario podría ser un errorpodría ser un error
•• La codificación alrededor de datos La codificación alrededor de datos inválidos sirve solamente para ocultar el inválidos sirve solamente para ocultar el error, mientras que usar una afirmación error, mientras que usar una afirmación puede detectar y precisar la existencia de puede detectar y precisar la existencia de ese errorese error
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 3434
Verificación de suposicionesVerificación de suposiciones
•• ¿Cómo manejar datos inválidos? Una ¿Cómo manejar datos inválidos? Una
manera implica el codificar de manera manera implica el codificar de manera
defensiva para detectar éstos, se previene defensiva para detectar éstos, se previene
una operación inválida pero no nos ayuda a una operación inválida pero no nos ayuda a
detectar cómo y dónde se generó el error o detectar cómo y dónde se generó el error o
los datos inválidoslos datos inválidos
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 3535
Verificación de suposicionesVerificación de suposiciones
•• La segunda manera es usando “La segunda manera es usando “afirmacionesafirmaciones” ”
((assertassert) en caso de que la función reciba ) en caso de que la función reciba
datos no válidos la afirmación despliega un datos no válidos la afirmación despliega un
mensaje de error y detiene la ejecución del mensaje de error y detiene la ejecución del
programaprograma
assertassert (( expresionexpresion ))
SSD5SSD5 Mtl Lourdes CahuichMtl Lourdes Cahuich 3636
Verificación de suposicionesVerificación de suposiciones
•• La declaración La declaración assertassert es una macro es una macro
almacenada en <almacenada en <assertassert> e incorpora > e incorpora
diversas aplicaciones del procesadordiversas aplicaciones del procesador
•• Cuando se liberan las versiones del Cuando se liberan las versiones del
software, los programadores, por lo general software, los programadores, por lo general
eliminan las afirmacioneseliminan las afirmaciones