Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
3 Tipos De Datos Cont
1. Tipos de datos (cont.)
Repaso lecturas SSD5
SSD5 Mtl Lourdes Cahuich 1
2. Entrada y salida
• Flujos (Stream)
– La entrada y salida de información se basa en
flujos; un flujo es una secuencia de bytes que
se mueven de un lugar a otro
– El proceso de salida implica el movimiento de
bytes (uno a la vez) de un programa hacia un
dispositivo (monitor, impresora, archivo, etc.)
SSD5 Mtl Lourdes Cahuich 2
3. Entrada y salida
• La entrada implica el flujo de bytes desde
un dispositivo (teclado, archivo, red) hacia
el programa
entrada: cin >> name;
salida: cout << “enter your name”;
SSD5 Mtl Lourdes Cahuich 3
4. Uso de los flujos estándar
• Tres flujos específicos están siempre
disponibles para cada programa: entrada
estándar, salida estándar y error estándar; cada
uno tiene un uso específico
– entrada estándar: lee los datos de consola
– salida estándar: escribe datos a la consola
– error estándar: muestra mensajes de error en
la consola
SSD5 Mtl Lourdes Cahuich 4
5. Uso de los flujos estándar
• Los objetos cin y cout dan acceso respectivo
al flujo estándar de entrada y salida. El
objeto cerr da acceso al flujo de error
estándar
cin >> name >> age
cerr << “nInvalid age entered”;
cout << “n” << name << “is” << age;
SSD5 Mtl Lourdes Cahuich 5
6. Uso de los flujos estándar
• Los programadores pueden definir cómo
las clases que crean interactúan con los
flujos usando los operadores << y >>
• Esto es conocido como sobrecarga del
operador Inserción (<<) y Extracción (>>)
SSD5 Mtl Lourdes Cahuich 6
7. Uso de los flujos estándar
• Se puede definir el comportamiento de
estos operadores para las clases que
creamos
SSD5 Mtl Lourdes Cahuich 7
8. El archivo de entrada y salida
• La entrada y salida en archivos es similar al
de teclado y pantalla
• La diferencia esta en que hay que abrir y
cerrar archivos explícitamente
• El objeto requerido es ifstream
• Esta clase no es parte del lenguaje C++ y
se debe incluir su biblioteca
SSD5 Mtl Lourdes Cahuich 8
9. El archivo de entrada y salida
• Es buena práctica revisar si al intentar abrir
un archivo realmente se tiene éxito
SSD5 Mtl Lourdes Cahuich 9
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();
…
SSD5 Mtl Lourdes Cahuich 10
}
11. El archivo de entrada y salida
• La salida del archivo se semeja a su entrada
y se necesita incluir la referencia a la
biblioteca fstream; pero utilizando un objeto
ofstream en lugar de un ifstream
SSD5 Mtl Lourdes Cahuich 11
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();
… SSD5 Mtl Lourdes Cahuich 12
13. El archivo de entrada y salida
• Hay que tener presente que el archivo de
Entrada/Salida está basado en un flujo que
es secuencial por naturaleza por lo que es
difícil y muy costoso moverse hacia delante
y hacia atrás, y el único método de acceso
es recorrer el archivo de inicio a fin
SSD5 Mtl Lourdes Cahuich 13
14. Fallas comunes
• El flujo espera espacios en blanco para
separar los valores que lee (pueden ser
espacios en blanco, tabuladores, caracteres
de nueva línea o retorno)
• La entrada del flujo ignora por default
espacios blancos adicionales; la operación
de entrada no hace caso de este espacio en
blanco adicional
SSD5 Mtl Lourdes Cahuich 14
15. Fallas comunes
• Otra falla común es cuando se intenta leer
una línea de texto en variable string; la
forma apropiada de introducir una línea
entera de texto es usando la función
getline que se encuentra en la biblioteca
string: esta función tiene su propia falla, ya
que la implantación de Microsoft tiene un
error en que se requiere un doble enter al
final de cada línea
SSD5 Mtl Lourdes Cahuich 15
16. El preprocesador
• Sustitución de texto
– El preprocesador es una herramienta para
manipular el contenido de los archivos fuente
antes de compilar; el preprocesador realiza la
sustitución y modificadores de texto
– La inclusión de archivos, sustitución macro y
compilación condicional son tres
características de alto nivel que el
preprocesador brinda al programador
SSD5 Mtl Lourdes Cahuich 16
17. El preprocesador
– Los archivos de código fuente por lo general
necesitan ser modificados antes de la
compilación y para esto es necesario conocer
el uso básico del procesador.
– Los programas de C++ se componen
enteramente de texto por lo que se debe usar
el preprocesador para incluir la declaración de
clases o funciones externas, conocido como
“inclusión de archivo”
SSD5 Mtl Lourdes Cahuich 17
18. El preprocesador
– Un programador interactúa con el
preprocesador mediante comandos llamados
“directivas del procesador” que comienzan
con el signo de número (#); las directivas son
comandos de una sola línea que se colocan en
un archivo de código fuente
SSD5 Mtl Lourdes Cahuich 18
19. El preprocesador
– La inclusión de una directiva indica al
preprocesador la realización de cierta acción;
ésta acción depende de la directiva en algunos
casos el preprocesador hace una modificación
en el archivo de código fuente; por ejemplo, la
inclusión del contenido de otro archivo
SSD5 Mtl Lourdes Cahuich 19
20. Inclusión de archivos
• La inclusión de archivos es una
característica del preprocesador de C++
que permite que un archivo fuente utilice
código compartido; con la línea #include
se incluye un archivo; el preprocesador
sustituye la línea que contiene la directiva
con el contenido del archivo específicado
SSD5 Mtl Lourdes Cahuich 20
21. Inclusión de archivos
• #include acepta dos diferentes formas de
su parámetro <nombre> busca un archivo
especificado en un conjunto de lugares
independientes de la implantación
(directorios del sistema y bibliotecas)
“nombre” manda a buscar el archivo en el
mismo directorio de la aplicación (archivos
creados por el usuario)
SSD5 Mtl Lourdes Cahuich 21
22. Sustitución macro
• Se puede realizar una sustitución del texto
definido por el programador o a través de
un archivo completo del código fuente;
esto se conoce como sustitución macro
#define identifica el texto de reemplazo
SSD5 Mtl Lourdes Cahuich 22
23. Sustitución macro
• Al usar esta directiva un programador
declara un identificador y especifica su
texto de reemplazo
#define MAXIMO 20
• Se puede utilizar la sustitución macro para
implantar una variable constante
SSD5 Mtl Lourdes Cahuich 23
24. Sustitución macro
• Los programadores deben utilizar la
palabra reservada const en lugar de la
sustitución macro para crear variables
constantes debido a que const es parte del
lenguaje C++ y no una característica del
preprocesador; estos const soportan mejor
la revisión de tipos
SSD5 Mtl Lourdes Cahuich 24
25. Sustitución macro
• El preprocesador soporta macros con
parámetros y es muy parecido a una
función normal de C++
• El preprocesador sustituye la llamada de la
función aparente con el texto de reemplazo
de macro
SSD5 Mtl Lourdes Cahuich 25
27. Compilación condicional
• #define soporta la compilación
condicional; donde se compilan solamente
ciertas secciones de nuestro código fuente;
lo cual es útil para insertar código de
depuración que puede ser habilitado y
deshabilitado fácilmente (#define, #if,
#endif)
SSD5 Mtl Lourdes Cahuich 27
29. Compilación condicional
• Se evalúa como verdadera solamente si se
ha definido un identificador DEBUG
• La compilación condicional sirve para
prevenir definiciones múltiples de las clases
y funciones contenidas en archivos de
cabecera, para no incluir varias veces un
mismo archivo si se incluye en varios
códigos fuente
SSD5 Mtl Lourdes Cahuich 29
30. #if ! defined (_PERSON_H_)
#define _PERSON_H_
class Person{
…
}
#endif
SSD5 Mtl Lourdes Cahuich 30
31. Verificación de suposiciones
• Verificar las suposiciones que usan
afirmaciones es un ejemplo del uso común
del preprocesador y sus características
• Una afirmación es una declaración puesta en
el código para verificar una suposición
SSD5 Mtl Lourdes Cahuich 31
32. Verificación de suposiciones
• Si al ejecutarla la suposición demuestra ser
incorrecta, la declaración de la “afirmación”
despliega un mensaje de notificación y
detiene la ejecución del programa, lo cual
es muy útil para la detección de errores
• Todos los tipos de suposiciones se hacen
sobre los datos contenidos en las variables
SSD5 Mtl Lourdes Cahuich 32
33. Verificación de suposiciones
• Cuando diseñamos y codificamos una
función esperando que los parámetros
contengan datos válidos; en caso contrario
podría ser un error
• La codificación alrededor de datos
inválidos sirve solamente para ocultar el
error, mientras que usar una afirmación
puede detectar y precisar la existencia de
ese error
SSD5 Mtl Lourdes Cahuich 33
34. Verificación de suposiciones
• ¿Cómo manejar datos inválidos? Una
manera implica el codificar de manera
defensiva para detectar éstos, se previene
una operación inválida pero no nos ayuda a
detectar cómo y dónde se generó el error o
los datos inválidos
SSD5 Mtl Lourdes Cahuich 34
35. Verificación de suposiciones
• La segunda manera es usando “afirmaciones”
(assert) en caso de que la función reciba
datos no válidos la afirmación despliega un
mensaje de error y detiene la ejecución del
programa
assert (expresion)
SSD5 Mtl Lourdes Cahuich 35
36. Verificación de suposiciones
• La declaración assert es una macro
almacenada en <assert> e incorpora
diversas aplicaciones del procesador
• Cuando se liberan las versiones del
software, los programadores, por lo general
eliminan las afirmaciones
SSD5 Mtl Lourdes Cahuich 36