Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programación Dra. Elisa Schaeffer elisa.schaeffer@gmail.com Facultad de Ingenierı́a Mecánica y Eléctrica (FIME) Universidad Autónoma de Nuevo León (UANL) Verano 2008 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Computadoras y programación Variables y tipos de datos Información digital Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Entrada y salida Archivos Números pseudoaleatorios Más allá de lo básico Subrutinas Tipos propios Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Componentes de una computadora Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Modelos de computación Un modelo ideal de computación es lo de máquinas de acceso aleatorio (inglés: random access machines, Ram). Un Ram es capaz de manejar números enteros de tamaño arbitrario. La estructura de datos de un Ram es un arreglo de registros R0 , R1 , R2 , . . ., cada uno con capacidad de un entero cualquiera, posiblemente negativo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programa Ram Un programa Ram es una sucesión finita de instrucciones de tipo assembler, Π = (π1 , π2 , . . . , πm ). La entrada al programa está guardada en un arreglo finito de registros de entrada I1 , I2 , . . . , In . El primer registro r0 sirve como una acumuladora. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programa Ram Un programa Ram es una sucesión finita de instrucciones de tipo assembler, Π = (π1 , π2 , . . . , πm ). La entrada al programa está guardada en un arreglo finito de registros de entrada I1 , I2 , . . . , In . El primer registro r0 sirve como una acumuladora. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programa Ram Un programa Ram es una sucesión finita de instrucciones de tipo assembler, Π = (π1 , π2 , . . . , πm ). La entrada al programa está guardada en un arreglo finito de registros de entrada I1 , I2 , . . . , In . El primer registro r0 sirve como una acumuladora. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Notación ◮ j es un número entero ◮ rj es el contenido actual del registro Rj ◮ ij ◮ ◮ ◮ es el contenido del registro de entrada Ij x puede ser reemplazado por cualquier de los tres operadores j, ↑ j o = j x ′ es el resultado de tal reemplazo κ es el contador del programa que determina cual instrucción de Π se está ejecutando Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Instrucción READ READ STORE STORE LOAD ADD SUB HALF JUMP JPOS JZERO JNEG HALT Dra. Elisa Schaeffer Operando j ↑j j ↑j x x x j j j j Semántica r0 := ij r0 := irj rj := r0 rrj := r0 r0 := x ′ r0 := r0 + x ′ r0 := r0 − x ′ r0 := ⌊ r20 ⌋ κ := j si r0 > 0, κ := j si r0 = 0, κ := j si r0 < 0, κ := j κ := 0 FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Instrucción READ READ STORE STORE LOAD ADD SUB HALF JUMP JPOS JZERO JNEG HALT Dra. Elisa Schaeffer Operando j ↑j j ↑j x x x j j j j Semántica r0 := ij r0 := irj rj := r0 rrj := r0 r0 := x ′ r0 := r0 + x ′ r0 := r0 − x ′ r0 := ⌊ r20 ⌋ κ := j si r0 > 0, κ := j si r0 = 0, κ := j si r0 < 0, κ := j κ := 0 FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Instrucción READ READ STORE STORE LOAD ADD SUB HALF JUMP JPOS JZERO JNEG HALT Dra. Elisa Schaeffer Operando j ↑j j ↑j x x x j j j j Semántica r0 := ij r0 := irj rj := r0 rrj := r0 r0 := x ′ r0 := r0 + x ′ r0 := r0 − x ′ r0 := ⌊ r20 ⌋ κ := j si r0 > 0, κ := j si r0 = 0, κ := j si r0 < 0, κ := j κ := 0 FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Instrucción READ READ STORE STORE LOAD ADD SUB HALF JUMP JPOS JZERO JNEG HALT Dra. Elisa Schaeffer Operando j ↑j j ↑j x x x j j j j Semántica r0 := ij r0 := irj rj := r0 rrj := r0 r0 := x ′ r0 := r0 + x ′ r0 := r0 − x ′ r0 := ⌊ r20 ⌋ κ := j si r0 > 0, κ := j si r0 = 0, κ := j si r0 < 0, κ := j κ := 0 FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Instrucción READ READ STORE STORE LOAD ADD SUB HALF JUMP JPOS JZERO JNEG HALT Dra. Elisa Schaeffer Operando j ↑j j ↑j x x x j j j j Semántica r0 := ij r0 := irj rj := r0 rrj := r0 r0 := x ′ r0 := r0 + x ′ r0 := r0 − x ′ r0 := ⌊ r20 ⌋ κ := j si r0 > 0, κ := j si r0 = 0, κ := j si r0 < 0, κ := j κ := 0 FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Instrucción READ READ STORE STORE LOAD ADD SUB HALF JUMP JPOS JZERO JNEG HALT Dra. Elisa Schaeffer Operando j ↑j j ↑j x x x j j j j Semántica r0 := ij r0 := irj rj := r0 rrj := r0 r0 := x ′ r0 := r0 + x ′ r0 := r0 − x ′ r0 := ⌊ r20 ⌋ κ := j si r0 > 0, κ := j si r0 = 0, κ := j si r0 < 0, κ := j κ := 0 FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Configuración de una Ram Una configuración es un par C = (κ, R) ◮ κ es el contador del programa que determina cual instrucción de Π se está ejecutando ◮ R = {(j1 , rj1 ), (j2 , rj2 ), . . . , (jk , rjk )} es un conjunto finito de pares registro-valor Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Pasos de computación La configuración inicial es (1, ∅). Se define una relación de un paso (κ, R) → Π, I (κ′ , R′ ) (1) entre las configuraciones para un programa Ram Π y una entrada I de n instrucciones. ◮ κ′ es el valor nuevo de κ después de haber ejecutado la instrucción en posición κ (ojo: no necesariamente κ′ = κ + 1) ◮ R′ es una versión posiblemente modificada de R donde algún par (j, x) puede haber sido removido y algún par (j ′ , x ′ ) añadido según la instrucción en posición κ del programa Π. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Computación Si D es una sucesión finita de enteros, se dice que una máquina de acceso aleatorio compute una función φ : D → Z si y sólo si para toda I ∈ D aplica que (1, ∅) → Π, I ∗ (0, R) (2) ası́ que (0, φ(I )) ∈ R. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Una Ram que computa la función φ(x, y ) = |x − y | La entrada es I = (6, 10); el resultado es φ(I ) = 4. Programa READ 2 STORE 2 READ 1 STORE 1 SUB 2 JNEG 8 HALT LOAD 2 SUB 1 HALT Dra. Elisa Schaeffer Configuración (1, ∅) (2, {(0, 10)}) (3, {(0, 10), (2, 10)}) (4, {(0, 6), (2, 10)}) (5, {(0, 6), (2, 10), (1, 6)}) (6, {(0, −4), (2, 10), (1, 6)}) (8, {(0, −4), (2, 10), (1, 6)}) (9, {(0, 10), (2, 10), (1, 6)}) (10, {(0, 4), (2, 10), (1, 6)}) (0, {(0, 4), (2, 10), (1, 6)}) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tiempo de ejecución La ejecución de cada instrucción cuenta como un paso de computación. La abstracción normalmente considera la sumación de enteros grandes como es algo que no se puede hacer rápidamente. También hay que tomar en cuenta que multiplicación no está incluida como instrucción y que se implementa por sumación repetida. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tiempo de ejecución La ejecución de cada instrucción cuenta como un paso de computación. La abstracción normalmente considera la sumación de enteros grandes como es algo que no se puede hacer rápidamente. También hay que tomar en cuenta que multiplicación no está incluida como instrucción y que se implementa por sumación repetida. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tiempo de ejecución La ejecución de cada instrucción cuenta como un paso de computación. La abstracción normalmente considera la sumación de enteros grandes como es algo que no se puede hacer rápidamente. También hay que tomar en cuenta que multiplicación no está incluida como instrucción y que se implementa por sumación repetida. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tamaño de entrada El tamaño de la entrada se considera en logaritmos. Sea bi una representación binaria del valor absoluto un entero i sin ceros no significativos al comienzo. Para valores negativos, pensamos que hay un bit “gratuito” para el signo. El largo del entero en el contexto Ram es el número de bits en bi . El largo de la entrada entera L(I ) es la suma de los largos de los enteros en estos términos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tamaño de entrada El tamaño de la entrada se considera en logaritmos. Sea bi una representación binaria del valor absoluto un entero i sin ceros no significativos al comienzo. Para valores negativos, pensamos que hay un bit “gratuito” para el signo. El largo del entero en el contexto Ram es el número de bits en bi . El largo de la entrada entera L(I ) es la suma de los largos de los enteros en estos términos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tamaño de entrada El tamaño de la entrada se considera en logaritmos. Sea bi una representación binaria del valor absoluto un entero i sin ceros no significativos al comienzo. Para valores negativos, pensamos que hay un bit “gratuito” para el signo. El largo del entero en el contexto Ram es el número de bits en bi . El largo de la entrada entera L(I ) es la suma de los largos de los enteros en estos términos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tamaño de entrada El tamaño de la entrada se considera en logaritmos. Sea bi una representación binaria del valor absoluto un entero i sin ceros no significativos al comienzo. Para valores negativos, pensamos que hay un bit “gratuito” para el signo. El largo del entero en el contexto Ram es el número de bits en bi . El largo de la entrada entera L(I ) es la suma de los largos de los enteros en estos términos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tamaño de entrada El tamaño de la entrada se considera en logaritmos. Sea bi una representación binaria del valor absoluto un entero i sin ceros no significativos al comienzo. Para valores negativos, pensamos que hay un bit “gratuito” para el signo. El largo del entero en el contexto Ram es el número de bits en bi . El largo de la entrada entera L(I ) es la suma de los largos de los enteros en estos términos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programa eficiente Se dice que un programa Ram Π computa una función φ : D → Z en tiempo f (n) donde f : N+ → N+ si y sólo si para toda I ∈ D aplica que (1, ∅) → Π, I k (0, R) (3) ası́ que k ≤ f (L(I )). El programa es eficiente si f (n) es un polinomio. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programa eficiente Se dice que un programa Ram Π computa una función φ : D → Z en tiempo f (n) donde f : N+ → N+ si y sólo si para toda I ∈ D aplica que (1, ∅) → Π, I k (0, R) (3) ası́ que k ≤ f (L(I )). El programa es eficiente si f (n) es un polinomio. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programa — términos generales Un programa de computadora es una sucesión de operacionales computacionales. El lenguaje de la computadora en el nivel de ejecutar un programa se llama lenguaje de máquina y es un conjunto de operaciones muy simples que operan en los contenidos de registros de memoria. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programa — términos generales Un programa de computadora es una sucesión de operacionales computacionales. El lenguaje de la computadora en el nivel de ejecutar un programa se llama lenguaje de máquina y es un conjunto de operaciones muy simples que operan en los contenidos de registros de memoria. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programa — términos generales Un programa de computadora es una sucesión de operacionales computacionales. El lenguaje de la computadora en el nivel de ejecutar un programa se llama lenguaje de máquina y es un conjunto de operaciones muy simples que operan en los contenidos de registros de memoria. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programación Para facilitar el proceso de construir programas, se ha desarrollado numerosos lenguajes de programación de alto nivel para poder comunicar la sucesión deseada de operaciones a la computadora en un nivel más manejable para los seres humanos. Un programa escrito en un lenguaje de programación necesita ser compilado antes de su ejecución o alternativamente interpretado al ejecutar. El compilador y el intérprete son programas (comúnmente algo complejos) que se distribuye como herramientas a los programadores. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programación Para facilitar el proceso de construir programas, se ha desarrollado numerosos lenguajes de programación de alto nivel para poder comunicar la sucesión deseada de operaciones a la computadora en un nivel más manejable para los seres humanos. Un programa escrito en un lenguaje de programación necesita ser compilado antes de su ejecución o alternativamente interpretado al ejecutar. El compilador y el intérprete son programas (comúnmente algo complejos) que se distribuye como herramientas a los programadores. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programación Para facilitar el proceso de construir programas, se ha desarrollado numerosos lenguajes de programación de alto nivel para poder comunicar la sucesión deseada de operaciones a la computadora en un nivel más manejable para los seres humanos. Un programa escrito en un lenguaje de programación necesita ser compilado antes de su ejecución o alternativamente interpretado al ejecutar. El compilador y el intérprete son programas (comúnmente algo complejos) que se distribuye como herramientas a los programadores. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Programación Para facilitar el proceso de construir programas, se ha desarrollado numerosos lenguajes de programación de alto nivel para poder comunicar la sucesión deseada de operaciones a la computadora en un nivel más manejable para los seres humanos. Un programa escrito en un lenguaje de programación necesita ser compilado antes de su ejecución o alternativamente interpretado al ejecutar. El compilador y el intérprete son programas (comúnmente algo complejos) que se distribuye como herramientas a los programadores. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Sintaxis y semántica Los lenguajes de programación se parecen a idiomas naturales, pero su gramática, o sea la sintaxis, es muy estricta, el vocabulario es limitado y el significado, o sea la semántica de las expresiones es muy especı́fica. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Sintaxis y semántica Los lenguajes de programación se parecen a idiomas naturales, pero su gramática, o sea la sintaxis, es muy estricta, el vocabulario es limitado y el significado, o sea la semántica de las expresiones es muy especı́fica. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Paradigmas de programación ◮ Imperativa de procedimientos: Fortran, Cobol, C, ... ◮ Orientada a objetos: Ada, Smalltalk, C++, Java ◮ Funcional: LISP, Scheme, Common LISP, ML ◮ Lógica: PROLOG Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Paradigmas de programación ◮ Imperativa de procedimientos: Fortran, Cobol, C, ... ◮ Orientada a objetos: Ada, Smalltalk, C++, Java ◮ Funcional: LISP, Scheme, Common LISP, ML ◮ Lógica: PROLOG Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Paradigmas de programación ◮ Imperativa de procedimientos: Fortran, Cobol, C, ... ◮ Orientada a objetos: Ada, Smalltalk, C++, Java ◮ Funcional: LISP, Scheme, Common LISP, ML ◮ Lógica: PROLOG Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Paradigmas de programación ◮ Imperativa de procedimientos: Fortran, Cobol, C, ... ◮ Orientada a objetos: Ada, Smalltalk, C++, Java ◮ Funcional: LISP, Scheme, Common LISP, ML ◮ Lógica: PROLOG Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Paradigmas de programación ◮ Imperativa de procedimientos: Fortran, Cobol, C, ... ◮ Orientada a objetos: Ada, Smalltalk, C++, Java ◮ Funcional: LISP, Scheme, Common LISP, ML ◮ Lógica: PROLOG Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Paradigmas de programación ◮ Imperativa de procedimientos: Fortran, Cobol, C, ... ◮ Orientada a objetos: Ada, Smalltalk, C++, Java ◮ Funcional: LISP, Scheme, Common LISP, ML ◮ Lógica: PROLOG Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Paradigmas de programación ◮ Imperativa de procedimientos: Fortran, Cobol, C, ... ◮ Orientada a objetos: Ada, Smalltalk, C++, Java ◮ Funcional: LISP, Scheme, Common LISP, ML ◮ Lógica: PROLOG Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Paradigmas de programación ◮ Imperativa de procedimientos: Fortran, Cobol, C, ... ◮ Orientada a objetos: Ada, Smalltalk, C++, Java ◮ Funcional: LISP, Scheme, Common LISP, ML ◮ Lógica: PROLOG Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Vocabulario de ANSI-C auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Las mayúsculas y las minúsculas son letras distintas en C. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Vocabulario de ANSI-C auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Las mayúsculas y las minúsculas son letras distintas en C. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Programar? ◮ definir ◮ planificar ◮ diseñar ◮ implementar ◮ experimentar ◮ validar ◮ documentar ◮ mantener Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Programar? ◮ definir ◮ planificar ◮ diseñar ◮ implementar ◮ experimentar ◮ validar ◮ documentar ◮ mantener Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Programar? ◮ definir ◮ planificar ◮ diseñar ◮ implementar ◮ experimentar ◮ validar ◮ documentar ◮ mantener Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Programar? ◮ definir ◮ planificar ◮ diseñar ◮ implementar ◮ experimentar ◮ validar ◮ documentar ◮ mantener Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Programar? ◮ definir ◮ planificar ◮ diseñar ◮ implementar ◮ experimentar ◮ validar ◮ documentar ◮ mantener Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Programar? ◮ definir ◮ planificar ◮ diseñar ◮ implementar ◮ experimentar ◮ validar ◮ documentar ◮ mantener Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Programar? ◮ definir ◮ planificar ◮ diseñar ◮ implementar ◮ experimentar ◮ validar ◮ documentar ◮ mantener Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Programar? ◮ definir ◮ planificar ◮ diseñar ◮ implementar ◮ experimentar ◮ validar ◮ documentar ◮ mantener Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Algoritmos y estructuras de datos Algoritmo = un método de solución sistemática que da un resultado para un problema especı́fico dada una instancia del problema. Estructura de datos = una manera de manejar los datos tal que se garantiza operaciones de acceso o modificación sistemática de los datos contenidos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Algoritmos y estructuras de datos Algoritmo = un método de solución sistemática que da un resultado para un problema especı́fico dada una instancia del problema. Estructura de datos = una manera de manejar los datos tal que se garantiza operaciones de acceso o modificación sistemática de los datos contenidos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Algoritmos y estructuras de datos Algoritmo = un método de solución sistemática que da un resultado para un problema especı́fico dada una instancia del problema. Estructura de datos = una manera de manejar los datos tal que se garantiza operaciones de acceso o modificación sistemática de los datos contenidos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Buen algoritmo? ◮ ◮ ◮ ◮ rápido resultado correcto uso bajo de memoria la ejecución xtermina Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Buen algoritmo? ◮ ◮ ◮ ◮ rápido resultado correcto uso bajo de memoria la ejecución xtermina Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Buen algoritmo? ◮ ◮ ◮ ◮ rápido resultado correcto uso bajo de memoria la ejecución xtermina Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Buen algoritmo? ◮ ◮ ◮ ◮ rápido resultado correcto uso bajo de memoria la ejecución xtermina Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico int main(int c, char ∗ ∗ a) El método main es el punto de entrada al programa desde la lı́nea de instrucciones del sistema operativo. main toma dos parámetros: el número de parámetros de lı́nea de instrucciones y un arreglo (en forma de puntero) de cadenas de sı́mbolos que contienen aquellos parámetros. El primer parámetro (a[0]) en C siempre es el nombre del ejecutable mismo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico int main(int c, char ∗ ∗ a) El método main es el punto de entrada al programa desde la lı́nea de instrucciones del sistema operativo. main toma dos parámetros: el número de parámetros de lı́nea de instrucciones y un arreglo (en forma de puntero) de cadenas de sı́mbolos que contienen aquellos parámetros. El primer parámetro (a[0]) en C siempre es el nombre del ejecutable mismo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico int main(int c, char ∗ ∗ a) El método main es el punto de entrada al programa desde la lı́nea de instrucciones del sistema operativo. main toma dos parámetros: el número de parámetros de lı́nea de instrucciones y un arreglo (en forma de puntero) de cadenas de sı́mbolos que contienen aquellos parámetros. El primer parámetro (a[0]) en C siempre es el nombre del ejecutable mismo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico int main(int c, char ∗ ∗ a) El método main es el punto de entrada al programa desde la lı́nea de instrucciones del sistema operativo. main toma dos parámetros: el número de parámetros de lı́nea de instrucciones y un arreglo (en forma de puntero) de cadenas de sı́mbolos que contienen aquellos parámetros. El primer parámetro (a[0]) en C siempre es el nombre del ejecutable mismo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Herramientas Para escribir el código, en este curso utilizamos todos el editor Emacs. Se abre en el terminal con la instrucción emacs o directamente a un archivo con emacs prog.c. Compilamos en la lı́nea de instrucciones (no a través de Emacs, aunque se podrı́a) usando el compilador de C de Gnu, gcc. A gcc pasamos como argumentos los nombres de los archivos de código que queremos compilar. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Herramientas Para escribir el código, en este curso utilizamos todos el editor Emacs. Se abre en el terminal con la instrucción emacs o directamente a un archivo con emacs prog.c. Compilamos en la lı́nea de instrucciones (no a través de Emacs, aunque se podrı́a) usando el compilador de C de Gnu, gcc. A gcc pasamos como argumentos los nombres de los archivos de código que queremos compilar. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Herramientas Para escribir el código, en este curso utilizamos todos el editor Emacs. Se abre en el terminal con la instrucción emacs o directamente a un archivo con emacs prog.c. Compilamos en la lı́nea de instrucciones (no a través de Emacs, aunque se podrı́a) usando el compilador de C de Gnu, gcc. A gcc pasamos como argumentos los nombres de los archivos de código que queremos compilar. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Variable Una variable es efectivamente un espacio en la memoria de la computadora al cual se puede asignar un valor. La asignación puede tomar el valor de un constante o el valor de otra variable. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Variable Una variable es efectivamente un espacio en la memoria de la computadora al cual se puede asignar un valor. La asignación puede tomar el valor de un constante o el valor de otra variable. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Asignación En pseudocódigo, tı́picamente se denota por :=. a := 0,34 Las asignaciones se realiza de la derecha hacia la izquierda y la asignación en sı́ se evalua al valor asignado. a := b := c Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Asignación En pseudocódigo, tı́picamente se denota por :=. a := 0,34 Las asignaciones se realiza de la derecha hacia la izquierda y la asignación en sı́ se evalua al valor asignado. a := b := c Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Asignación En pseudocódigo, tı́picamente se denota por :=. a := 0,34 Las asignaciones se realiza de la derecha hacia la izquierda y la asignación en sı́ se evalua al valor asignado. a := b := c Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Tipos de datos Los contenidos posibles de una variable dependen de la cantidad de espacio que tiene reservado en la memoria. Este espacio tı́picamente se determina por definir el tipo de dato de la variable. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Tipos de datos Los contenidos posibles de una variable dependen de la cantidad de espacio que tiene reservado en la memoria. Este espacio tı́picamente se determina por definir el tipo de dato de la variable. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Bit El bit es la unidad básica de información digital. Un bit es una variable binaria: tiene dos valores posibles que se interpreta como los valores lógicos “verdad” (1) y “falso” (0). En la memoria de una computadora, se expresa los números enteros con sumas de potencias de dos, empezando con la potencia más grande que quepa en el número e iterando hasta llegar a la suma correcta. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Potencias de dos 140 1e+20 1e+18 120 1e+16 100 1e+14 80 1e+12 1e+10 60 1e+08 40 1e+06 10000 20 100 0 1 0 1 2 3 4 5 6 7 0 10 20 30 40 50 60 Figura: Gráficas de las potencias de dos: a la izquierda, con ejes lineales hasta x = 7, y a la derecha, con ejes de escala logarı́tmica hasta x = 64. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Representación binaria Representamos la presencia de una cierta potencia con un bit de valor 1 y su ausencia por un bit de valor 0, empezando con la potencia más grande presente: 61 = = = ⇒ 32 + 29 = 32 + 16 + 13 = 32 + 16 + 8 + 5 32 + 16 + 8 + 4 + 1 25 + 24 + 23 + 22 + 20 111101. Entonces se necesita seis bits para representar el valor 61. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Representación binaria Representamos la presencia de una cierta potencia con un bit de valor 1 y su ausencia por un bit de valor 0, empezando con la potencia más grande presente: 61 = = = ⇒ 32 + 29 = 32 + 16 + 13 = 32 + 16 + 8 + 5 32 + 16 + 8 + 4 + 1 25 + 24 + 23 + 22 + 20 111101. Entonces se necesita seis bits para representar el valor 61. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Cantidad de bits necesaria Por lo general, la cantidad b de bits requeridos para representar un valor x ∈ Z+ está el exponente de la mı́nima potencia de dos mayor a x, n o (4) b = mı́n k | 2k > x . k∈Z Para incluir los enteros negativos, se usa un bit auxiliar de signo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Cantidad de bits necesaria Por lo general, la cantidad b de bits requeridos para representar un valor x ∈ Z+ está el exponente de la mı́nima potencia de dos mayor a x, n o (4) b = mı́n k | 2k > x . k∈Z Para incluir los enteros negativos, se usa un bit auxiliar de signo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico 21 22 23 24 25 26 27 28 29 210 211 212 213 214 215 216 217 218 219 = = = = = = = = = = = = = = = = = = = Dra. Elisa Schaeffer 2 4 8 16 32 64 128 256 512 1 024 2 048 4 096 8 192 16 384 32 768 65 536 131 072 262 144 524 288 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 = = = = = = = = = = = = = = = = = = = = Información digital 1 048 576 2 097 152 4 194 304 8 388 608 16 777 216 33 554 432 67 108 864 134 217 728 268 435 456 536 870 912 1 073 741 824 2 147 483 648 4 294 967 296 8 589 934 592 17 179 869 184 34 359 738 368 68 719 476 736 137 438 953 472 274 877 906 944 549 755 813 888 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 = = = = = = = = = = = = = = = = = = = = 1 099 511 627 776 2 199 023 255 552 4 398 046 511 104 8 796 093 022 208 17 592 186 044 416 35 184 372 088 832 70 368 744 177 664 140 737 488 355 328 281 474 976 710 656 562 949 953 421 312 1 125 899 906 842 624 2 251 799 813 685 248 4 503 599 627 370 496 9 007 199 254 740 992 18 014 398 509 481 984 36 028 797 018 963 968 72 057 594 037 927 936 144 115 188 075 855 872 288 230 376 151 711 744 576 460 752 303 423 488 FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Byte El byte es la unidad básica de capacidad de memoria digital. Un byte (se pronuncia “bait”) es una sucesión de ocho bits. El número entero más grande que se puede guardar en un solo byte es 27 + 26 + 25 + 24 + 23 + 22 + 21 + 20 = 28 − 1 = 255 y entonces, contando cero, son 256 valores posibles por un byte. Nota que aplica en general la igualdad k+1 2 −1= k X 2i . (5) i =0 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Byte El byte es la unidad básica de capacidad de memoria digital. Un byte (se pronuncia “bait”) es una sucesión de ocho bits. El número entero más grande que se puede guardar en un solo byte es 27 + 26 + 25 + 24 + 23 + 22 + 21 + 20 = 28 − 1 = 255 y entonces, contando cero, son 256 valores posibles por un byte. Nota que aplica en general la igualdad k+1 2 −1= k X 2i . (5) i =0 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Kilo, mega, giga, tera, peta... Un kilobyte es 1,024 bytes, un megabyte es 1,024 kilobytes (1,048,576 bytes) y un gigabyte es 1,024 megabytes (1,073,741,824 bytes). Normalmente el prefix kilo implica un mil, pero como mil no es ningún potencia de dos, eligieron la potencia más cercana, 210 = 1,024, para corresponder a los prefixes. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Kilo, mega, giga, tera, peta... Un kilobyte es 1,024 bytes, un megabyte es 1,024 kilobytes (1,048,576 bytes) y un gigabyte es 1,024 megabytes (1,073,741,824 bytes). Normalmente el prefix kilo implica un mil, pero como mil no es ningún potencia de dos, eligieron la potencia más cercana, 210 = 1,024, para corresponder a los prefixes. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Enteros: short, int y long Depende de la máquina que rango tiene cada tipo. Por definir una variable unsigned, uno ahorra el bit de signo y aumenta el rango máximo al doble de lo que era. En ANSI-C, el archivo de las definiciones de los rangos de enteros es limits.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Enteros: short, int y long Depende de la máquina que rango tiene cada tipo. Por definir una variable unsigned, uno ahorra el bit de signo y aumenta el rango máximo al doble de lo que era. En ANSI-C, el archivo de las definiciones de los rangos de enteros es limits.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Enteros: short, int y long Depende de la máquina que rango tiene cada tipo. Por definir una variable unsigned, uno ahorra el bit de signo y aumenta el rango máximo al doble de lo que era. En ANSI-C, el archivo de las definiciones de los rangos de enteros es limits.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Rangos de enteros Tipo Por defecto En el Solaris de PISIS short unsigned short: int unsigned int long unsigned long [−32,768, 32,767] ≤ 65,535 [−32,767, 32,767] 65,535 [−2,147,483,647, ...] ≤ 4,294,967,295 lo mismo lo mismo [−2,147,483,648, ...] ≤ 4294967295 lo mismo lo mismo Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Variables binarias Algunos lenguajes traen su propio tipo de datos para variables binarias (o booleanas). Tı́picamente este tipo se llama boolean o bool. En ANSI-C, cada entero positivo se puede interpretar como “verdad” o “falso”: no cero = verdad cero = falso (true en Java) (false en Java) Estos dos valores de llaman valores de verdad. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Variables binarias Algunos lenguajes traen su propio tipo de datos para variables binarias (o booleanas). Tı́picamente este tipo se llama boolean o bool. En ANSI-C, cada entero positivo se puede interpretar como “verdad” o “falso”: no cero = verdad cero = falso (true en Java) (false en Java) Estos dos valores de llaman valores de verdad. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Variables binarias Algunos lenguajes traen su propio tipo de datos para variables binarias (o booleanas). Tı́picamente este tipo se llama boolean o bool. En ANSI-C, cada entero positivo se puede interpretar como “verdad” o “falso”: no cero = verdad cero = falso (true en Java) (false en Java) Estos dos valores de llaman valores de verdad. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Variables binarias Algunos lenguajes traen su propio tipo de datos para variables binarias (o booleanas). Tı́picamente este tipo se llama boolean o bool. En ANSI-C, cada entero positivo se puede interpretar como “verdad” o “falso”: no cero = verdad cero = falso (true en Java) (false en Java) Estos dos valores de llaman valores de verdad. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Variables binarias Algunos lenguajes traen su propio tipo de datos para variables binarias (o booleanas). Tı́picamente este tipo se llama boolean o bool. En ANSI-C, cada entero positivo se puede interpretar como “verdad” o “falso”: no cero = verdad cero = falso (true en Java) (false en Java) Estos dos valores de llaman valores de verdad. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Punto flotante Para representar números reales por computadora, hay que definir hasta que exactitud se guarda los decimales del número, como el espacio para guardar un número entero está limitada a un tamaño constante que depende únicamente en el tipo de dato elegido. El método común de lograr tal representación es lo de punto flotante (también conocido como coma flotante) donde la representación se adapta al orden magnitud del valor x ∈ R. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Punto flotante Para representar números reales por computadora, hay que definir hasta que exactitud se guarda los decimales del número, como el espacio para guardar un número entero está limitada a un tamaño constante que depende únicamente en el tipo de dato elegido. El método común de lograr tal representación es lo de punto flotante (también conocido como coma flotante) donde la representación se adapta al orden magnitud del valor x ∈ R. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Traslado de la coma La idea es trasladar la coma decimal hacia la posición de la primera cifra significativa de x mediante un exponente γ: x = m · bγ , m se llama la mantisa y contiene los dı́gitos significativos de x. Es común normalizar la mantisa tal que su parte entera consta de solamente la primera cifra significativa de x. La mantisa tı́picamente tiene un tamaño máximo limitado a una cierta cantidad fija de bytes. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Traslado de la coma La idea es trasladar la coma decimal hacia la posición de la primera cifra significativa de x mediante un exponente γ: x = m · bγ , m se llama la mantisa y contiene los dı́gitos significativos de x. Es común normalizar la mantisa tal que su parte entera consta de solamente la primera cifra significativa de x. La mantisa tı́picamente tiene un tamaño máximo limitado a una cierta cantidad fija de bytes. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Traslado de la coma La idea es trasladar la coma decimal hacia la posición de la primera cifra significativa de x mediante un exponente γ: x = m · bγ , m se llama la mantisa y contiene los dı́gitos significativos de x. Es común normalizar la mantisa tal que su parte entera consta de solamente la primera cifra significativa de x. La mantisa tı́picamente tiene un tamaño máximo limitado a una cierta cantidad fija de bytes. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Traslado de la coma La idea es trasladar la coma decimal hacia la posición de la primera cifra significativa de x mediante un exponente γ: x = m · bγ , m se llama la mantisa y contiene los dı́gitos significativos de x. Es común normalizar la mantisa tal que su parte entera consta de solamente la primera cifra significativa de x. La mantisa tı́picamente tiene un tamaño máximo limitado a una cierta cantidad fija de bytes. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Exponente y base Lo que determina el rango de valores posibles que se puede representar en punto flotante es la cantidad de memoria reservada para el exponente γ ∈ Z. El parámetro b es la base del sistema de representación. Los números binarios tienen base b = 2 y comúnmente en cálculo utilizamos b = 10. También existen sistemas en base b = 8 (el sistema octal) y b = 16 (el sistema hexadecimal). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Exponente y base Lo que determina el rango de valores posibles que se puede representar en punto flotante es la cantidad de memoria reservada para el exponente γ ∈ Z. El parámetro b es la base del sistema de representación. Los números binarios tienen base b = 2 y comúnmente en cálculo utilizamos b = 10. También existen sistemas en base b = 8 (el sistema octal) y b = 16 (el sistema hexadecimal). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Exponente y base Lo que determina el rango de valores posibles que se puede representar en punto flotante es la cantidad de memoria reservada para el exponente γ ∈ Z. El parámetro b es la base del sistema de representación. Los números binarios tienen base b = 2 y comúnmente en cálculo utilizamos b = 10. También existen sistemas en base b = 8 (el sistema octal) y b = 16 (el sistema hexadecimal). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Punto fijo La otra opción serı́a simplemente reservar una cierta cantidad de bytespara la representación y fijar a posición en la cual se supone que esté la coma decimal. La representación de punto fijo es mucho más restrictiva con respeto al rango de valores posibles de guardar. En comparación, el método de punto flotante causa variaciones en la exactitud de la representación, mientras permite guardar valores de un rango mucho más amplio. En ANSI-C, el archivo con los datos que refinen los rangos están en el archivo float.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Punto fijo La otra opción serı́a simplemente reservar una cierta cantidad de bytespara la representación y fijar a posición en la cual se supone que esté la coma decimal. La representación de punto fijo es mucho más restrictiva con respeto al rango de valores posibles de guardar. En comparación, el método de punto flotante causa variaciones en la exactitud de la representación, mientras permite guardar valores de un rango mucho más amplio. En ANSI-C, el archivo con los datos que refinen los rangos están en el archivo float.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Punto fijo La otra opción serı́a simplemente reservar una cierta cantidad de bytespara la representación y fijar a posición en la cual se supone que esté la coma decimal. La representación de punto fijo es mucho más restrictiva con respeto al rango de valores posibles de guardar. En comparación, el método de punto flotante causa variaciones en la exactitud de la representación, mientras permite guardar valores de un rango mucho más amplio. En ANSI-C, el archivo con los datos que refinen los rangos están en el archivo float.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Punto fijo La otra opción serı́a simplemente reservar una cierta cantidad de bytespara la representación y fijar a posición en la cual se supone que esté la coma decimal. La representación de punto fijo es mucho más restrictiva con respeto al rango de valores posibles de guardar. En comparación, el método de punto flotante causa variaciones en la exactitud de la representación, mientras permite guardar valores de un rango mucho más amplio. En ANSI-C, el archivo con los datos que refinen los rangos están en el archivo float.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Tipos: float, double, long y double ◮ Tı́picamente se usa la base 2. ◮ La mantisa tiene 24, 53 o 64 dı́gitos. ◮ En base 10: [1E-37, 1E+37] en el estándar. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Tipos: float, double, long y double ◮ Tı́picamente se usa la base 2. ◮ La mantisa tiene 24, 53 o 64 dı́gitos. ◮ En base 10: [1E-37, 1E+37] en el estándar. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Tipos: float, double, long y double ◮ Tı́picamente se usa la base 2. ◮ La mantisa tiene 24, 53 o 64 dı́gitos. ◮ En base 10: [1E-37, 1E+37] en el estándar. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Información digital Tipos: float, double, long y double ◮ Tı́picamente se usa la base 2. ◮ La mantisa tiene 24, 53 o 64 dı́gitos. ◮ En base 10: [1E-37, 1E+37] en el estándar. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Aritmética (ANSI-C etc.) a = b a + b a - b a ∗ b a / b a% b Dra. Elisa Schaeffer asignar sumar restar multiplicar dividir resto de la división FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Aritmética (ANSI-C etc.) a = b a + b a - b a ∗ b a / b a% b Dra. Elisa Schaeffer asignar sumar restar multiplicar dividir resto de la división FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Aritmética (ANSI-C etc.) a = b a + b a - b a ∗ b a / b a% b Dra. Elisa Schaeffer asignar sumar restar multiplicar dividir resto de la división FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Aritmética (ANSI-C etc.) a = b a + b a - b a ∗ b a / b a% b Dra. Elisa Schaeffer asignar sumar restar multiplicar dividir resto de la división FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Aritmética (ANSI-C etc.) a = b a + b a - b a ∗ b a / b a% b Dra. Elisa Schaeffer asignar sumar restar multiplicar dividir resto de la división FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Aritmética (ANSI-C etc.) a = b a + b a - b a ∗ b a / b a% b Dra. Elisa Schaeffer asignar sumar restar multiplicar dividir resto de la división FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Paréntesis Se puede (y recomienda) utilizar las paréntesis para agrupar expresiones. Cada expresión debe terminar en un punto-coma. Ejemplo: a = (b - c) % ((d - 2) ∗ 6); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Paréntesis Se puede (y recomienda) utilizar las paréntesis para agrupar expresiones. Cada expresión debe terminar en un punto-coma. Ejemplo: a = (b - c) % ((d - 2) ∗ 6); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Paréntesis Se puede (y recomienda) utilizar las paréntesis para agrupar expresiones. Cada expresión debe terminar en un punto-coma. Ejemplo: a = (b - c) % ((d - 2) ∗ 6); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Comparaciones == != < > <= >= Dra. Elisa Schaeffer igual no igual menor que mayor que menor o igual que mayor o igual que FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Comparaciones == != < > <= >= Dra. Elisa Schaeffer igual no igual menor que mayor que menor o igual que mayor o igual que FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Comparaciones == != < > <= >= Dra. Elisa Schaeffer igual no igual menor que mayor que menor o igual que mayor o igual que FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Comparaciones == != < > <= >= Dra. Elisa Schaeffer igual no igual menor que mayor que menor o igual que mayor o igual que FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Comparaciones == != < > <= >= Dra. Elisa Schaeffer igual no igual menor que mayor que menor o igual que mayor o igual que FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Comparaciones == != < > <= >= Dra. Elisa Schaeffer igual no igual menor que mayor que menor o igual que mayor o igual que FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entero versus punto flotante Al combinar diferentes tipos de variables o comparar valores de variables de tipos distintos, hay que tener cuidado. A veces la funcionalidad definida en el lenguaje no corresponde a la intuición humana... Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tipos de constantes 3.0 3.0f 12 12l Dra. Elisa Schaeffer es es es es double float int long FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tipos de constantes 3.0 3.0f 12 12l Dra. Elisa Schaeffer es es es es double float int long FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tipos de constantes 3.0 3.0f 12 12l Dra. Elisa Schaeffer es es es es double float int long FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tipos de constantes 3.0 3.0f 12 12l Dra. Elisa Schaeffer es es es es double float int long FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tipos de constantes 3.0 3.0f 12 12l Dra. Elisa Schaeffer es es es es double float int long FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Funciones de piso y techo La función piso ⌊x⌋ : R → Z define el número entero máximo menor a x ∈ R: ⌊x⌋ = máx {y | x ≤ y } . y ∈Z (6) La función techo ⌈x⌉ : R → Z define el número entero mı́nimo mayor a x ∈ R: ⌈x⌉ = mı́n {y | x ≤ y } . (7) y ∈Z Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Funciones de piso y techo La función piso ⌊x⌋ : R → Z define el número entero máximo menor a x ∈ R: ⌊x⌋ = máx {y | x ≤ y } . y ∈Z (6) La función techo ⌈x⌉ : R → Z define el número entero mı́nimo mayor a x ∈ R: ⌈x⌉ = mı́n {y | x ≤ y } . (7) y ∈Z Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Función parte entera Varios lenguajes de programación incorporan una manera de convertir un número en formato punto flotante a un valor entero. La función que captura esta comportamiento es la función parte entera [x] : R → Z. (8) Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico En ANSI-C float a = 3.76; int b = (int)a; donde la regla de asignar un valor a la variable b es una mezcla de la funciones piso y techo: denota el valor de la variable a por a. Si a ≥ 0, se asigna a b el valor ⌊a⌋, y cuando a < 0, se asigna a b el valor ⌈a⌉. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico En ANSI-C float a = 3.76; int b = (int)a; donde la regla de asignar un valor a la variable b es una mezcla de la funciones piso y techo: denota el valor de la variable a por a. Si a ≥ 0, se asigna a b el valor ⌊a⌋, y cuando a < 0, se asigna a b el valor ⌈a⌉. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Redondeo El redondeo tı́pico de x ∈ R al entero más próximo es equivalente a [x + 0,5]. Hay que tener mucho cuidado con la operación de parte entera en programación, como implica pérdida de datos. Acumulando uno después de otro, los errores de redondeo se pueden amplificar y causar comportamiento no deseado en el programa. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Redondeo El redondeo tı́pico de x ∈ R al entero más próximo es equivalente a [x + 0,5]. Hay que tener mucho cuidado con la operación de parte entera en programación, como implica pérdida de datos. Acumulando uno después de otro, los errores de redondeo se pueden amplificar y causar comportamiento no deseado en el programa. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Redondeo El redondeo tı́pico de x ∈ R al entero más próximo es equivalente a [x + 0,5]. Hay que tener mucho cuidado con la operación de parte entera en programación, como implica pérdida de datos. Acumulando uno después de otro, los errores de redondeo se pueden amplificar y causar comportamiento no deseado en el programa. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Ejemplo En algunas implementaciones una sucesión instrucciones como float a = 0.6/0.2; int b = (int)a; puede resultar en b asignada al valor 2, porque por la representación binaria de punto flotante de los valores 0,6 y 0,2, su división resulta en el valor punto flotante 2,999999999999999555910790149937. Entonces, aplicar la función parte entera al valor de la variable a resulta en el valor 2, aunque la respuesta correcta es 3. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Operaciones lógicas Notación && || ! Interpretación “y” (conjunción, los dos ambos) “o” (disyuncción, uno de los dos) “no” (negación) Sı́mbolo ∧ ∨ ¬ También con estos es recomendable usar paréntesis para agrupar las expresiones bien. a = (c && (d >= 4)) || (e && !(f != h)); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Operaciones lógicas Notación && || ! Interpretación “y” (conjunción, los dos ambos) “o” (disyuncción, uno de los dos) “no” (negación) Sı́mbolo ∧ ∨ ¬ También con estos es recomendable usar paréntesis para agrupar las expresiones bien. a = (c && (d >= 4)) || (e && !(f != h)); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Operaciones lógicas Notación && || ! Interpretación “y” (conjunción, los dos ambos) “o” (disyuncción, uno de los dos) “no” (negación) Sı́mbolo ∧ ∨ ¬ También con estos es recomendable usar paréntesis para agrupar las expresiones bien. a = (c && (d >= 4)) || (e && !(f != h)); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Precedencia Para los que quieren arriesgarse y no usar paréntesis, el orden de precendencia de los operadores ya mencionados del más fuerte al más débil: () ∗ / % + < <= > >= == != = Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Precedencia Para los que quieren arriesgarse y no usar paréntesis, el orden de precendencia de los operadores ya mencionados del más fuerte al más débil: () ∗ / % + < <= > >= == != = Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Precedencia Para los que quieren arriesgarse y no usar paréntesis, el orden de precendencia de los operadores ya mencionados del más fuerte al más débil: () ∗ / % + < <= > >= == != = Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Precedencia Para los que quieren arriesgarse y no usar paréntesis, el orden de precendencia de los operadores ya mencionados del más fuerte al más débil: () ∗ / % + < <= > >= == != = Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Precedencia Para los que quieren arriesgarse y no usar paréntesis, el orden de precendencia de los operadores ya mencionados del más fuerte al más débil: () ∗ / % + < <= > >= == != = Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Precedencia Para los que quieren arriesgarse y no usar paréntesis, el orden de precendencia de los operadores ya mencionados del más fuerte al más débil: () ∗ / % + < <= > >= == != = Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Precedencia Para los que quieren arriesgarse y no usar paréntesis, el orden de precendencia de los operadores ya mencionados del más fuerte al más débil: () ∗ / % + < <= > >= == != = Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Abreviaciones Notación a += b a -= b a ∗= b a /= b a %= b a++ a-++a --a Dra. Elisa Schaeffer Interpretación a = a + b a = a - b a = a ∗ b a = a / b a = a% b a = a+1 (al final) a = a-1 (al final) a = a+1 (primero) a = a-1 (primero) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Abreviaciones Notación a += b a -= b a ∗= b a /= b a %= b a++ a-++a --a Dra. Elisa Schaeffer Interpretación a = a + b a = a - b a = a ∗ b a = a / b a = a% b a = a+1 (al final) a = a-1 (al final) a = a+1 (primero) a = a-1 (primero) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Abreviaciones Notación a += b a -= b a ∗= b a /= b a %= b a++ a-++a --a Dra. Elisa Schaeffer Interpretación a = a + b a = a - b a = a ∗ b a = a / b a = a% b a = a+1 (al final) a = a-1 (al final) a = a+1 (primero) a = a-1 (primero) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Abreviaciones Notación a += b a -= b a ∗= b a /= b a %= b a++ a-++a --a Dra. Elisa Schaeffer Interpretación a = a + b a = a - b a = a ∗ b a = a / b a = a% b a = a+1 (al final) a = a-1 (al final) a = a+1 (primero) a = a-1 (primero) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Abreviaciones Notación a += b a -= b a ∗= b a /= b a %= b a++ a-++a --a Dra. Elisa Schaeffer Interpretación a = a + b a = a - b a = a ∗ b a = a / b a = a% b a = a+1 (al final) a = a-1 (al final) a = a+1 (primero) a = a-1 (primero) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Abreviaciones Notación a += b a -= b a ∗= b a /= b a %= b a++ a-++a --a Dra. Elisa Schaeffer Interpretación a = a + b a = a - b a = a ∗ b a = a / b a = a% b a = a+1 (al final) a = a-1 (al final) a = a+1 (primero) a = a-1 (primero) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Abreviaciones Notación a += b a -= b a ∗= b a /= b a %= b a++ a-++a --a Dra. Elisa Schaeffer Interpretación a = a + b a = a - b a = a ∗ b a = a / b a = a% b a = a+1 (al final) a = a-1 (al final) a = a+1 (primero) a = a-1 (primero) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Abreviaciones Notación a += b a -= b a ∗= b a /= b a %= b a++ a-++a --a Dra. Elisa Schaeffer Interpretación a = a + b a = a - b a = a ∗ b a = a / b a = a% b a = a+1 (al final) a = a-1 (al final) a = a+1 (primero) a = a-1 (primero) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Abreviaciones Notación a += b a -= b a ∗= b a /= b a %= b a++ a-++a --a Dra. Elisa Schaeffer Interpretación a = a + b a = a - b a = a ∗ b a = a / b a = a% b a = a+1 (al final) a = a-1 (al final) a = a+1 (primero) a = a-1 (primero) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Letras (char) Como todo contenido, las letras se guarda como números. El sistema de codificación básica se llama ASCII y tiene rango [0, 127] — no contiene letras con acentos. (http://www.asciitable.com/) Tienen su propio tipo de dato char, que es casi un sinónimo de short. Muchos lenguajes de programación inclyuen soporte para otras codificaciones para poder manerar sı́mbolos internacionales (como el Latin-1 o el UTF-8). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Letras (char) Como todo contenido, las letras se guarda como números. El sistema de codificación básica se llama ASCII y tiene rango [0, 127] — no contiene letras con acentos. (http://www.asciitable.com/) Tienen su propio tipo de dato char, que es casi un sinónimo de short. Muchos lenguajes de programación inclyuen soporte para otras codificaciones para poder manerar sı́mbolos internacionales (como el Latin-1 o el UTF-8). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Letras (char) Como todo contenido, las letras se guarda como números. El sistema de codificación básica se llama ASCII y tiene rango [0, 127] — no contiene letras con acentos. (http://www.asciitable.com/) Tienen su propio tipo de dato char, que es casi un sinónimo de short. Muchos lenguajes de programación inclyuen soporte para otras codificaciones para poder manerar sı́mbolos internacionales (como el Latin-1 o el UTF-8). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ctype.h: rutinas de detección int int int int int int int int isalpha(int isdigit(int islower(int ispunct(int isspace(int isupper(int tolower(int toupper(int Dra. Elisa Schaeffer c) c) c) c) c) c) c) c) si es una letra si es un dı́gito si es minúscula si es puntuación si es espacio blando si es mayúscula a minúscula a mayúscula FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ctype.h: rutinas de detección int int int int int int int int isalpha(int isdigit(int islower(int ispunct(int isspace(int isupper(int tolower(int toupper(int Dra. Elisa Schaeffer c) c) c) c) c) c) c) c) si es una letra si es un dı́gito si es minúscula si es puntuación si es espacio blando si es mayúscula a minúscula a mayúscula FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ctype.h: rutinas de detección int int int int int int int int isalpha(int isdigit(int islower(int ispunct(int isspace(int isupper(int tolower(int toupper(int Dra. Elisa Schaeffer c) c) c) c) c) c) c) c) si es una letra si es un dı́gito si es minúscula si es puntuación si es espacio blando si es mayúscula a minúscula a mayúscula FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ctype.h: rutinas de detección int int int int int int int int isalpha(int isdigit(int islower(int ispunct(int isspace(int isupper(int tolower(int toupper(int Dra. Elisa Schaeffer c) c) c) c) c) c) c) c) si es una letra si es un dı́gito si es minúscula si es puntuación si es espacio blando si es mayúscula a minúscula a mayúscula FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ctype.h: rutinas de detección int int int int int int int int isalpha(int isdigit(int islower(int ispunct(int isspace(int isupper(int tolower(int toupper(int Dra. Elisa Schaeffer c) c) c) c) c) c) c) c) si es una letra si es un dı́gito si es minúscula si es puntuación si es espacio blando si es mayúscula a minúscula a mayúscula FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ctype.h: rutinas de detección int int int int int int int int isalpha(int isdigit(int islower(int ispunct(int isspace(int isupper(int tolower(int toupper(int Dra. Elisa Schaeffer c) c) c) c) c) c) c) c) si es una letra si es un dı́gito si es minúscula si es puntuación si es espacio blando si es mayúscula a minúscula a mayúscula FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ctype.h: rutinas de detección int int int int int int int int isalpha(int isdigit(int islower(int ispunct(int isspace(int isupper(int tolower(int toupper(int Dra. Elisa Schaeffer c) c) c) c) c) c) c) c) si es una letra si es un dı́gito si es minúscula si es puntuación si es espacio blando si es mayúscula a minúscula a mayúscula FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ctype.h: rutinas de detección int int int int int int int int isalpha(int isdigit(int islower(int ispunct(int isspace(int isupper(int tolower(int toupper(int Dra. Elisa Schaeffer c) c) c) c) c) c) c) c) si es una letra si es un dı́gito si es minúscula si es puntuación si es espacio blando si es mayúscula a minúscula a mayúscula FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Operaciones de bits En ANSI-C, tenemos acceso a los bits de un byte a través de operadores especiales: ◮ mover los bits a la izquierda ◮ mover los bits a la derecha ◮ operaciones lógicas: y, o, no Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Operaciones de bits En ANSI-C, tenemos acceso a los bits de un byte a través de operadores especiales: ◮ mover los bits a la izquierda ◮ mover los bits a la derecha ◮ operaciones lógicas: y, o, no Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Multiplicar por dos Para multiplicar por dos k veces, o sea, multiplicar por 2k , tenemos el operador “empujar a la izquierda k posiciones”: int i = 5; i = i << 4; Salida: 80 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Multiplicar por dos Para multiplicar por dos k veces, o sea, multiplicar por 2k , tenemos el operador “empujar a la izquierda k posiciones”: int i = 5; i = i << 4; Salida: 80 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Multiplicar por dos Para multiplicar por dos k veces, o sea, multiplicar por 2k , tenemos el operador “empujar a la izquierda k posiciones”: int i = 5; i = i << 4; Salida: 80 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Dividir” por dos Para “dividir” por dos k veces, o sea, “dividir” por 2k , tenemos el operador “empujar a la derecha k posiciones”: int i = 35; i = i >> 4; Salida: 2 — ¡el efecto no es exactamente división por dos! Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Dividir” por dos Para “dividir” por dos k veces, o sea, “dividir” por 2k , tenemos el operador “empujar a la derecha k posiciones”: int i = 35; i = i >> 4; Salida: 2 — ¡el efecto no es exactamente división por dos! Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Dividir” por dos Para “dividir” por dos k veces, o sea, “dividir” por 2k , tenemos el operador “empujar a la derecha k posiciones”: int i = 35; i = i >> 4; Salida: 2 — ¡el efecto no es exactamente división por dos! Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Máscaras Creamos una máscara que tiene el bit que nos interesa en uno y los otros bits en cero: int i = (1 << k); donde k el ı́ndice del bit que queremos en uno (el “primer” bit es el menos significante). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Máscaras Creamos una máscara que tiene el bit que nos interesa en uno y los otros bits en cero: int i = (1 << k); donde k el ı́ndice del bit que queremos en uno (el “primer” bit es el menos significante). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Máscaras Creamos una máscara que tiene el bit que nos interesa en uno y los otros bits en cero: int i = (1 << k); donde k el ı́ndice del bit que queremos en uno (el “primer” bit es el menos significante). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Operaciones lógicas binarias Entrada: dos bits para “y” y “o”, un bit para “no” Salida: un bit Español y o no Dra. Elisa Schaeffer Inglés and or not C & | ~ Efecto (1, 1) 7→ 1, en otro caso 0 (0, 0) 7→ 0, en otro caso 1 1 7→ 0, 0 7→ 1 FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Operaciones lógicas binarias Entrada: dos bits para “y” y “o”, un bit para “no” Salida: un bit Español y o no Dra. Elisa Schaeffer Inglés and or not C & | ~ Efecto (1, 1) 7→ 1, en otro caso 0 (0, 0) 7→ 0, en otro caso 1 1 7→ 0, 0 7→ 1 FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Operaciones lógicas binarias Entrada: dos bits para “y” y “o”, un bit para “no” Salida: un bit Español y o no Dra. Elisa Schaeffer Inglés and or not C & | ~ Efecto (1, 1) 7→ 1, en otro caso 0 (0, 0) 7→ 0, en otro caso 1 1 7→ 0, 0 7→ 1 FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Operaciones lógicas binarias Entrada: dos bits para “y” y “o”, un bit para “no” Salida: un bit Español y o no Dra. Elisa Schaeffer Inglés and or not C & | ~ Efecto (1, 1) 7→ 1, en otro caso 0 (0, 0) 7→ 0, en otro caso 1 1 7→ 0, 0 7→ 1 FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Forzar” un bit de una variable Si tenemos una variable y queremos forzar un bit a uno, creamos la máscara para el bit que nos interesa y realizamos una “o”: mask = (1 << k); var = (var | mask); También se puede escribir: var |= (1 << k); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Forzar” un bit de una variable Si tenemos una variable y queremos forzar un bit a uno, creamos la máscara para el bit que nos interesa y realizamos una “o”: mask = (1 << k); var = (var | mask); También se puede escribir: var |= (1 << k); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Forzar” un bit de una variable Si tenemos una variable y queremos forzar un bit a uno, creamos la máscara para el bit que nos interesa y realizamos una “o”: mask = (1 << k); var = (var | mask); También se puede escribir: var |= (1 << k); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Aclarar” un bit Si queremos forzar un bit a cero, necesitamos la operación “y” y una máscara complementada donde todos los otros bits son uno y el bit que nos interesa es cero: int mask = (1 << k); int compmask = ~mask; var = var & compmask; Lo mismo en breve: var &= ~(1 << k); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Aclarar” un bit Si queremos forzar un bit a cero, necesitamos la operación “y” y una máscara complementada donde todos los otros bits son uno y el bit que nos interesa es cero: int mask = (1 << k); int compmask = ~mask; var = var & compmask; Lo mismo en breve: var &= ~(1 << k); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Aclarar” un bit Si queremos forzar un bit a cero, necesitamos la operación “y” y una máscara complementada donde todos los otros bits son uno y el bit que nos interesa es cero: int mask = (1 << k); int compmask = ~mask; var = var & compmask; Lo mismo en breve: var &= ~(1 << k); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Condiciones: if else if (condición) { código para ejecutar si cumple la condición } else if (otra condición) { código para ejecutar si cumple esta condición } else { código para ejecutar si no cumplió ninguna } Elegir una de las opciones a ejecutar. La elegida será la primera la condición de cual cumple. La parte “else if” es opcional y puede repertir varias veces. También la parte “else” es opcional, pero no se puede repetir. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Condiciones: if else if (condición) { código para ejecutar si cumple la condición } else if (otra condición) { código para ejecutar si cumple esta condición } else { código para ejecutar si no cumplió ninguna } Elegir una de las opciones a ejecutar. La elegida será la primera la condición de cual cumple. La parte “else if” es opcional y puede repertir varias veces. También la parte “else” es opcional, pero no se puede repetir. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Mini-if” Para asignar a una variable un valor u otro, dependiendo de una condición, se usa el “if chiquito”: a = (b) ? c : d Si la condición b es verdad, se asigna el valor de la expresión c a la variable a, y si es falso, el valor de la expresión d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Mini-if” Para asignar a una variable un valor u otro, dependiendo de una condición, se usa el “if chiquito”: a = (b) ? c : d Si la condición b es verdad, se asigna el valor de la expresión c a la variable a, y si es falso, el valor de la expresión d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Mini-if” Para asignar a una variable un valor u otro, dependiendo de una condición, se usa el “if chiquito”: a = (b) ? c : d Si la condición b es verdad, se asigna el valor de la expresión c a la variable a, y si es falso, el valor de la expresión d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico “Mini-if” Para asignar a una variable un valor u otro, dependiendo de una condición, se usa el “if chiquito”: a = (b) ? c : d Si la condición b es verdad, se asigna el valor de la expresión c a la variable a, y si es falso, el valor de la expresión d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico continue y break En las estructuras que permiten repetición, la instrucción continue permite saltar al final de la iteración actual (omitiendo la ejecución de algún código) y continuar ejecutando la iteración siguiente (si todavı́a quedan iteraciones pendientes). La instrucción break termina la ejecución de la repetición instantamente sin finalizar la iteración actual. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico continue y break En las estructuras que permiten repetición, la instrucción continue permite saltar al final de la iteración actual (omitiendo la ejecución de algún código) y continuar ejecutando la iteración siguiente (si todavı́a quedan iteraciones pendientes). La instrucción break termina la ejecución de la repetición instantamente sin finalizar la iteración actual. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico continue y break En las estructuras que permiten repetición, la instrucción continue permite saltar al final de la iteración actual (omitiendo la ejecución de algún código) y continuar ejecutando la iteración siguiente (si todavı́a quedan iteraciones pendientes). La instrucción break termina la ejecución de la repetición instantamente sin finalizar la iteración actual. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico continue y break En las estructuras que permiten repetición, la instrucción continue permite saltar al final de la iteración actual (omitiendo la ejecución de algún código) y continuar ejecutando la iteración siguiente (si todavı́a quedan iteraciones pendientes). La instrucción break termina la ejecución de la repetición instantamente sin finalizar la iteración actual. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico switch case switch (expresión que evalua a un entero) { case constante: código para ejecutar la expresión evaluó a este constante .. . case constante: código para ejecutar la expresión evaluó a este constante default: código para ejecutar evaluó a un valor no mencionado } En esta instrucción, todos los constantes deben ser enteros. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico switch case switch (expresión que evalua a un entero) { case constante: código para ejecutar la expresión evaluó a este constante .. . case constante: código para ejecutar la expresión evaluó a este constante default: código para ejecutar evaluó a un valor no mencionado } En esta instrucción, todos los constantes deben ser enteros. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Cómo funciona? Efectivamente es un if else para situaciones con muchas alternativas donde la condición se puede “convertir” a un entero. El case simplemente indica el punto desde donde ejecutar, no hasta donde. Es muy importante poner un break antes del case siguiente si no quieren que se ejecute todo lo que queda. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Cómo funciona? Efectivamente es un if else para situaciones con muchas alternativas donde la condición se puede “convertir” a un entero. El case simplemente indica el punto desde donde ejecutar, no hasta donde. Es muy importante poner un break antes del case siguiente si no quieren que se ejecute todo lo que queda. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Cómo funciona? Efectivamente es un if else para situaciones con muchas alternativas donde la condición se puede “convertir” a un entero. El case simplemente indica el punto desde donde ejecutar, no hasta donde. Es muy importante poner un break antes del case siguiente si no quieren que se ejecute todo lo que queda. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Cómo funciona? Efectivamente es un if else para situaciones con muchas alternativas donde la condición se puede “convertir” a un entero. El case simplemente indica el punto desde donde ejecutar, no hasta donde. Es muy importante poner un break antes del case siguiente si no quieren que se ejecute todo lo que queda. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Iteración por for for (asignaciones; condición; operaciones) { código para ejecutar } Todas las cuatro partes son opcionales - hasta for(;;); compila bien (aunque repite por siempre y el programa no termina). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Iteración por for for (asignaciones; condición; operaciones) { código para ejecutar } Todas las cuatro partes son opcionales - hasta for(;;); compila bien (aunque repite por siempre y el programa no termina). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Iteración por while y do while while (condición) { código para ejecutar } do { código para ejecutar } while (condición); La segunda versión siempre ejecuta una vez antes de evaluar la condición, mientras la primera comienza por evaluarla. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Iteración por while y do while while (condición) { código para ejecutar } do { código para ejecutar } while (condición); La segunda versión siempre ejecuta una vez antes de evaluar la condición, mientras la primera comienza por evaluarla. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Iteración por while y do while while (condición) { código para ejecutar } do { código para ejecutar } while (condición); La segunda versión siempre ejecuta una vez antes de evaluar la condición, mientras la primera comienza por evaluarla. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Arreglo Un arreglo es un conjunto de una cantidad fija de variables del mismo tipo que se maneja por el mismo nombre a través de ı́ndices: int elementos[5]; /∗ ANSI-C ∗/ int i = 3; int[] elementos = new int[i]; /∗ Java ∗/ elementos[i] = 4; Los ı́ndices comienzan de cero y terminan en n − 1 donde n es el número total de elementos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Arreglo Un arreglo es un conjunto de una cantidad fija de variables del mismo tipo que se maneja por el mismo nombre a través de ı́ndices: int elementos[5]; /∗ ANSI-C ∗/ int i = 3; int[] elementos = new int[i]; /∗ Java ∗/ elementos[i] = 4; Los ı́ndices comienzan de cero y terminan en n − 1 donde n es el número total de elementos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Arreglo Un arreglo es un conjunto de una cantidad fija de variables del mismo tipo que se maneja por el mismo nombre a través de ı́ndices: int elementos[5]; /∗ ANSI-C ∗/ int i = 3; int[] elementos = new int[i]; /∗ Java ∗/ elementos[i] = 4; Los ı́ndices comienzan de cero y terminan en n − 1 donde n es el número total de elementos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Arreglo Un arreglo es un conjunto de una cantidad fija de variables del mismo tipo que se maneja por el mismo nombre a través de ı́ndices: int elementos[5]; /∗ ANSI-C ∗/ int i = 3; int[] elementos = new int[i]; /∗ Java ∗/ elementos[i] = 4; Los ı́ndices comienzan de cero y terminan en n − 1 donde n es el número total de elementos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Cayendo afuera: ANSI-C int data[5]; data[5] = 3; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Reacciones variadas @ubuntu$ gcc errores.c @ubuntu$ ./a.out Done. Bus error (core dumped) @ubuntu$ @solaris$ gcc errores.c @solaris$ ./a.out Done. @solaris$ Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Reacciones variadas @ubuntu$ gcc errores.c @ubuntu$ ./a.out Done. Bus error (core dumped) @ubuntu$ @solaris$ gcc errores.c @solaris$ ./a.out Done. @solaris$ Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Arreglos multidimensionales int multi[3][4]; int a, b; for (a = 0; a < 3; a++) for (b = 0; b < 4; b++) multi[a][b] = rand() % 7; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Arreglos multidimensionales int multi[3][4]; int a, b; for (a = 0; a < 3; a++) for (b = 0; b < 4; b++) multi[a][b] = rand() % 7; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Puntero En C, para crear arreglos sacando la capacidad de una variable, se necesita punteros. Un puntero es una variable que contiene la dirección a otra variable en la memoria. Los punteros son unas maravillas sin los cuales uno lo logra nada útil en ANSI-C en el largo plazo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Puntero En C, para crear arreglos sacando la capacidad de una variable, se necesita punteros. Un puntero es una variable que contiene la dirección a otra variable en la memoria. Los punteros son unas maravillas sin los cuales uno lo logra nada útil en ANSI-C en el largo plazo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Puntero En C, para crear arreglos sacando la capacidad de una variable, se necesita punteros. Un puntero es una variable que contiene la dirección a otra variable en la memoria. Los punteros son unas maravillas sin los cuales uno lo logra nada útil en ANSI-C en el largo plazo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Definición de punteros char∗ puntero a char; int∗ puntero a int; char a = ’a’; int b = 7; puntero a char = &a; puntero a int = &b; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Definición de punteros char∗ puntero a char; int∗ puntero a int; char a = ’a’; int b = 7; puntero a char = &a; puntero a int = &b; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Notación t∗ &a ∗b = = = puntero a una variable de tipo t dirección de la variable a valor apuntado por el puntero b El compilador queja cuando uno usa mal esta notación. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Notación t∗ &a ∗b = = = puntero a una variable de tipo t dirección de la variable a valor apuntado por el puntero b El compilador queja cuando uno usa mal esta notación. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Notación t∗ &a ∗b = = = puntero a una variable de tipo t dirección de la variable a valor apuntado por el puntero b El compilador queja cuando uno usa mal esta notación. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Notación t∗ &a ∗b = = = puntero a una variable de tipo t dirección de la variable a valor apuntado por el puntero b El compilador queja cuando uno usa mal esta notación. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Notación t∗ &a ∗b = = = puntero a una variable de tipo t dirección de la variable a valor apuntado por el puntero b El compilador queja cuando uno usa mal esta notación. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tamaño de tipo Al reservar memoria, vamos a recibir un puntero a la región reservada. Al reservar, vamos a necesitar saber cuánto espacio reservar. La función sizeof(tipo) devuelve un entero que indica cuántos bytes necesita una variable del tipo definido. La salida de sizeof() es de tipo size t que es simplemente un entero constante sin signo. El espacio necesario para k variables se calcula por multiplicar: por ejemplo k∗sizeof(int), donde k puede ser constante o variable. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tamaño de tipo Al reservar memoria, vamos a recibir un puntero a la región reservada. Al reservar, vamos a necesitar saber cuánto espacio reservar. La función sizeof(tipo) devuelve un entero que indica cuántos bytes necesita una variable del tipo definido. La salida de sizeof() es de tipo size t que es simplemente un entero constante sin signo. El espacio necesario para k variables se calcula por multiplicar: por ejemplo k∗sizeof(int), donde k puede ser constante o variable. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Tamaño de tipo Al reservar memoria, vamos a recibir un puntero a la región reservada. Al reservar, vamos a necesitar saber cuánto espacio reservar. La función sizeof(tipo) devuelve un entero que indica cuántos bytes necesita una variable del tipo definido. La salida de sizeof() es de tipo size t que es simplemente un entero constante sin signo. El espacio necesario para k variables se calcula por multiplicar: por ejemplo k∗sizeof(int), donde k puede ser constante o variable. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico sizeof() size size size size size t t t t t charsize = sizeof(char); intsize = sizeof(int); longsize = sizeof(long); floatsize = sizeof(float); doublesize = sizeof(double); char 1, int 4, long 4, float 4, double 8 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico sizeof() size size size size size t t t t t charsize = sizeof(char); intsize = sizeof(int); longsize = sizeof(long); floatsize = sizeof(float); doublesize = sizeof(double); char 1, int 4, long 4, float 4, double 8 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico sizeof() size size size size size t t t t t charsize = sizeof(char); intsize = sizeof(int); longsize = sizeof(long); floatsize = sizeof(float); doublesize = sizeof(double); char 1, int 4, long 4, float 4, double 8 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico sizeof() size size size size size t t t t t charsize = sizeof(char); intsize = sizeof(int); longsize = sizeof(long); floatsize = sizeof(float); doublesize = sizeof(double); char 1, int 4, long 4, float 4, double 8 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico sizeof() size size size size size t t t t t charsize = sizeof(char); intsize = sizeof(int); longsize = sizeof(long); floatsize = sizeof(float); doublesize = sizeof(double); char 1, int 4, long 4, float 4, double 8 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico sizeof() size size size size size t t t t t charsize = sizeof(char); intsize = sizeof(int); longsize = sizeof(long); floatsize = sizeof(float); doublesize = sizeof(double); char 1, int 4, long 4, float 4, double 8 Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Reservación de memoria void∗ malloc(size t n) = reservar n bytes de memoria void∗ cealloc(size t n) = reservar e inicializar a cero void∗ realloc(void∗ p, size t n) = aumentar la región free(void∗ p) = liberar el espacio apuntado por el puntero Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Conversión de void Las salidas son tipo void. Para asignar la salida de malloc() a un int ∗, por ejemplo, hay que hacer conversión explı́cita (inglés: type casting): int∗ d = (int∗)malloc(7∗sizeof(int)); m/c/realloc da la salida NULL si la operación no es éxitosa. Es importante verificar esto en cada programa. Son de la librerı́a stdlib.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Conversión de void Las salidas son tipo void. Para asignar la salida de malloc() a un int ∗, por ejemplo, hay que hacer conversión explı́cita (inglés: type casting): int∗ d = (int∗)malloc(7∗sizeof(int)); m/c/realloc da la salida NULL si la operación no es éxitosa. Es importante verificar esto en cada programa. Son de la librerı́a stdlib.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Conversión de void Las salidas son tipo void. Para asignar la salida de malloc() a un int ∗, por ejemplo, hay que hacer conversión explı́cita (inglés: type casting): int∗ d = (int∗)malloc(7∗sizeof(int)); m/c/realloc da la salida NULL si la operación no es éxitosa. Es importante verificar esto en cada programa. Son de la librerı́a stdlib.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Conversión de void Las salidas son tipo void. Para asignar la salida de malloc() a un int ∗, por ejemplo, hay que hacer conversión explı́cita (inglés: type casting): int∗ d = (int∗)malloc(7∗sizeof(int)); m/c/realloc da la salida NULL si la operación no es éxitosa. Es importante verificar esto en cada programa. Son de la librerı́a stdlib.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Punteros a punteros int i, j, h, k = 4; int∗∗∗ tresd = (int∗∗∗)malloc(sizeof(int∗∗)∗k); for (i = 0; i < k; i++) { tresd[i] = (int∗∗)malloc(sizeof(int∗)∗(k-1)); for (j = 0; j < k - 1; j++) { tresd[i][j] = (int∗)malloc(sizeof(int)∗(k-2)); for (h = 0; h < k - 2; h++) tresd[i][j][h] = rand() % 10; } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Punteros a punteros int i, j, h, k = 4; int∗∗∗ tresd = (int∗∗∗)malloc(sizeof(int∗∗)∗k); for (i = 0; i < k; i++) { tresd[i] = (int∗∗)malloc(sizeof(int∗)∗(k-1)); for (j = 0; j < k - 1; j++) { tresd[i][j] = (int∗)malloc(sizeof(int)∗(k-2)); for (h = 0; h < k - 2; h++) tresd[i][j][h] = rand() % 10; } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Resultado? Lo que imprime el programa anterior: 1 6 8 3 2 0 7 7 7 6 9 5 0 2 2 9 9 6 0 2 3 1 2 2 Nota: falta verificar el resultado de malloc() Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico ¿Resultado? Lo que imprime el programa anterior: 1 6 8 3 2 0 7 7 7 6 9 5 0 2 2 9 9 6 0 2 3 1 2 2 Nota: falta verificar el resultado de malloc() Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico string.h La librerı́a string.h permite realizar varias operaciones con arreglos de char o punteros a char. Dra. Elisa Schaeffer char∗ strcpy(char∗, char∗) copiar el segundo al primero char∗ strcat(char∗, char∗) juntar dos en uno int strcmp(char∗, char∗) comparar (antes, igual, después) char∗ strchr(char∗, int) la primera ocurrencia de un sı́mbolo char∗ strstr(char∗, char∗) primera ocurrencia de otra cadena size t strlen(char∗) largo (número de sı́mbolos “ocupados”) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico string.h La librerı́a string.h permite realizar varias operaciones con arreglos de char o punteros a char. Dra. Elisa Schaeffer char∗ strcpy(char∗, char∗) copiar el segundo al primero char∗ strcat(char∗, char∗) juntar dos en uno int strcmp(char∗, char∗) comparar (antes, igual, después) char∗ strchr(char∗, int) la primera ocurrencia de un sı́mbolo char∗ strstr(char∗, char∗) primera ocurrencia de otra cadena size t strlen(char∗) largo (número de sı́mbolos “ocupados”) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico string.h La librerı́a string.h permite realizar varias operaciones con arreglos de char o punteros a char. Dra. Elisa Schaeffer char∗ strcpy(char∗, char∗) copiar el segundo al primero char∗ strcat(char∗, char∗) juntar dos en uno int strcmp(char∗, char∗) comparar (antes, igual, después) char∗ strchr(char∗, int) la primera ocurrencia de un sı́mbolo char∗ strstr(char∗, char∗) primera ocurrencia de otra cadena size t strlen(char∗) largo (número de sı́mbolos “ocupados”) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico string.h La librerı́a string.h permite realizar varias operaciones con arreglos de char o punteros a char. Dra. Elisa Schaeffer char∗ strcpy(char∗, char∗) copiar el segundo al primero char∗ strcat(char∗, char∗) juntar dos en uno int strcmp(char∗, char∗) comparar (antes, igual, después) char∗ strchr(char∗, int) la primera ocurrencia de un sı́mbolo char∗ strstr(char∗, char∗) primera ocurrencia de otra cadena size t strlen(char∗) largo (número de sı́mbolos “ocupados”) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico string.h La librerı́a string.h permite realizar varias operaciones con arreglos de char o punteros a char. Dra. Elisa Schaeffer char∗ strcpy(char∗, char∗) copiar el segundo al primero char∗ strcat(char∗, char∗) juntar dos en uno int strcmp(char∗, char∗) comparar (antes, igual, después) char∗ strchr(char∗, int) la primera ocurrencia de un sı́mbolo char∗ strstr(char∗, char∗) primera ocurrencia de otra cadena size t strlen(char∗) largo (número de sı́mbolos “ocupados”) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico string.h La librerı́a string.h permite realizar varias operaciones con arreglos de char o punteros a char. Dra. Elisa Schaeffer char∗ strcpy(char∗, char∗) copiar el segundo al primero char∗ strcat(char∗, char∗) juntar dos en uno int strcmp(char∗, char∗) comparar (antes, igual, después) char∗ strchr(char∗, int) la primera ocurrencia de un sı́mbolo char∗ strstr(char∗, char∗) primera ocurrencia de otra cadena size t strlen(char∗) largo (número de sı́mbolos “ocupados”) FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Puntero a función Funciones que dan el mismo tipo de salida y toman los mismos tipos de parámetros se puede manejar a través de un puntero de ese “prototipo”: double multiply(int a, double b) { return b∗a; } typedef double (∗funpoint)(int, double); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Puntero a función Funciones que dan el mismo tipo de salida y toman los mismos tipos de parámetros se puede manejar a través de un puntero de ese “prototipo”: double multiply(int a, double b) { return b∗a; } typedef double (∗funpoint)(int, double); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Puntero a función Funciones que dan el mismo tipo de salida y toman los mismos tipos de parámetros se puede manejar a través de un puntero de ese “prototipo”: double multiply(int a, double b) { return b∗a; } typedef double (∗funpoint)(int, double); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Uso de punteros a funciones Tres maneras de llamar la misma función: funpoint fp = &multiply; multiply(3, 1.2); (∗fp)(3, 1.2); fp(3, 1.2); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Uso de punteros a funciones Tres maneras de llamar la misma función: funpoint fp = &multiply; multiply(3, 1.2); (∗fp)(3, 1.2); fp(3, 1.2); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Uso de punteros a funciones Tres maneras de llamar la misma función: funpoint fp = &multiply; multiply(3, 1.2); (∗fp)(3, 1.2); fp(3, 1.2); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Uso de punteros a funciones Tres maneras de llamar la misma función: funpoint fp = &multiply; multiply(3, 1.2); (∗fp)(3, 1.2); fp(3, 1.2); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Uso de punteros a funciones Tres maneras de llamar la misma función: funpoint fp = &multiply; multiply(3, 1.2); (∗fp)(3, 1.2); fp(3, 1.2); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Uso de punteros a funciones Tres maneras de llamar la misma función: funpoint fp = &multiply; multiply(3, 1.2); (∗fp)(3, 1.2); fp(3, 1.2); Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Función como parámetro void task(funpoint f) { int first = rand() % 7; double second = (rand()∗1.0)/RAND MAX; f(first, second); return; } int main(int argc, char∗∗ args) { funpoint fp = &multiply; task(fp); return 1; } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Función como parámetro void task(funpoint f) { int first = rand() % 7; double second = (rand()∗1.0)/RAND MAX; f(first, second); return; } int main(int argc, char∗∗ args) { funpoint fp = &multiply; task(fp); return 1; } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Conversiones Para interpretar una sucesión de sı́mbolos como un número, usamos las subrutinas siguientes: atoi atol atof conversión a int conversión a long conversión a double Todas toman un solo argumento: la cadena a convertir a través de un char ∗. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Conversiones Para interpretar una sucesión de sı́mbolos como un número, usamos las subrutinas siguientes: atoi atol atof conversión a int conversión a long conversión a double Todas toman un solo argumento: la cadena a convertir a través de un char ∗. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Conversiones Para interpretar una sucesión de sı́mbolos como un número, usamos las subrutinas siguientes: atoi atol atof conversión a int conversión a long conversión a double Todas toman un solo argumento: la cadena a convertir a través de un char ∗. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Conversiones Para interpretar una sucesión de sı́mbolos como un número, usamos las subrutinas siguientes: atoi atol atof conversión a int conversión a long conversión a double Todas toman un solo argumento: la cadena a convertir a través de un char ∗. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Conversiones Para interpretar una sucesión de sı́mbolos como un número, usamos las subrutinas siguientes: atoi atol atof conversión a int conversión a long conversión a double Todas toman un solo argumento: la cadena a convertir a través de un char ∗. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Salida estándar Para escribir a la salida estándar, utilizamos printf: ´´ ´´ printf( Hola, mundo. ); Este proviene de la librerı́a stdio.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Salida estándar Para escribir a la salida estándar, utilizamos printf: ´´ ´´ printf( Hola, mundo. ); Este proviene de la librerı́a stdio.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Incorporación de variables a printf() int long float double char char∗ %d %ld %f %lf %c %s Para punto flotante, se puede definir el número de lugares decimales de mostrar (habrá redondeo): %.4f dará 4 lugares después de la coma. También con enteros se puede decir cuánto espacio dedicarles: %8d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Incorporación de variables a printf() int long float double char char∗ %d %ld %f %lf %c %s Para punto flotante, se puede definir el número de lugares decimales de mostrar (habrá redondeo): %.4f dará 4 lugares después de la coma. También con enteros se puede decir cuánto espacio dedicarles: %8d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Incorporación de variables a printf() int long float double char char∗ %d %ld %f %lf %c %s Para punto flotante, se puede definir el número de lugares decimales de mostrar (habrá redondeo): %.4f dará 4 lugares después de la coma. También con enteros se puede decir cuánto espacio dedicarles: %8d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Incorporación de variables a printf() int long float double char char∗ %d %ld %f %lf %c %s Para punto flotante, se puede definir el número de lugares decimales de mostrar (habrá redondeo): %.4f dará 4 lugares después de la coma. También con enteros se puede decir cuánto espacio dedicarles: %8d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Incorporación de variables a printf() int long float double char char∗ %d %ld %f %lf %c %s Para punto flotante, se puede definir el número de lugares decimales de mostrar (habrá redondeo): %.4f dará 4 lugares después de la coma. También con enteros se puede decir cuánto espacio dedicarles: %8d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Incorporación de variables a printf() int long float double char char∗ %d %ld %f %lf %c %s Para punto flotante, se puede definir el número de lugares decimales de mostrar (habrá redondeo): %.4f dará 4 lugares después de la coma. También con enteros se puede decir cuánto espacio dedicarles: %8d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Incorporación de variables a printf() int long float double char char∗ %d %ld %f %lf %c %s Para punto flotante, se puede definir el número de lugares decimales de mostrar (habrá redondeo): %.4f dará 4 lugares después de la coma. También con enteros se puede decir cuánto espacio dedicarles: %8d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Incorporación de variables a printf() int long float double char char∗ %d %ld %f %lf %c %s Para punto flotante, se puede definir el número de lugares decimales de mostrar (habrá redondeo): %.4f dará 4 lugares después de la coma. También con enteros se puede decir cuánto espacio dedicarles: %8d. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Entrada estándar scanf toma dos argumentos: un patrón de formato y la dirección de la variable a la cual leer un valor (del teclado). ´´ ´´ scanf( %d , &n); Ver también: sscanf, getchar y gets en stdio.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Entrada estándar scanf toma dos argumentos: un patrón de formato y la dirección de la variable a la cual leer un valor (del teclado). ´´ ´´ scanf( %d , &n); Ver también: sscanf, getchar y gets en stdio.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Entrada estándar scanf toma dos argumentos: un patrón de formato y la dirección de la variable a la cual leer un valor (del teclado). ´´ ´´ scanf( %d , &n); Ver también: sscanf, getchar y gets en stdio.h. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Tipo de dato FILE En ANSI-C, un FILE es un “mango” a un archivo en el sistema de archivos. Tı́picamente manejamos un puntero al mango, o sea, un FILE ∗. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Tipo de dato FILE En ANSI-C, un FILE es un “mango” a un archivo en el sistema de archivos. Tı́picamente manejamos un puntero al mango, o sea, un FILE ∗. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Terminal y teclado stdin stdout stderr teclado terminal errores para leer para escribir para escribir Entonces, fprintf(stdout, ...); fscanf(stdin, ...); Dra. Elisa Schaeffer = = printf(...); scanf(...); FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Terminal y teclado stdin stdout stderr teclado terminal errores para leer para escribir para escribir Entonces, fprintf(stdout, ...); fscanf(stdin, ...); Dra. Elisa Schaeffer = = printf(...); scanf(...); FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Terminal y teclado stdin stdout stderr teclado terminal errores para leer para escribir para escribir Entonces, fprintf(stdout, ...); fscanf(stdin, ...); Dra. Elisa Schaeffer = = printf(...); scanf(...); FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Terminal y teclado stdin stdout stderr teclado terminal errores para leer para escribir para escribir Entonces, fprintf(stdout, ...); fscanf(stdin, ...); Dra. Elisa Schaeffer = = printf(...); scanf(...); FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Terminal y teclado stdin stdout stderr teclado terminal errores para leer para escribir para escribir Entonces, fprintf(stdout, ...); fscanf(stdin, ...); Dra. Elisa Schaeffer = = printf(...); scanf(...); FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Abrir: leer/escribir FILE∗ f = fopen(...); Dos parámetros: ◮ el nombre del archivo ◮ el modo de acceso La salida es NULL si la operación no fue éxitosa. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Abrir: leer/escribir FILE∗ f = fopen(...); Dos parámetros: ◮ el nombre del archivo ◮ el modo de acceso La salida es NULL si la operación no fue éxitosa. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Abrir: leer/escribir FILE∗ f = fopen(...); Dos parámetros: ◮ el nombre del archivo ◮ el modo de acceso La salida es NULL si la operación no fue éxitosa. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Modos de acceso r w a r+ w+ a+ ...b leer escribir reemplazando escribir añadiendo leer o escribir crear para leer y escribir crear o abrir para añadir lo definido en modo binario Las operaciones para escribir crean el archivo dicho si todavı́a no existe. Cuidado con no reemplazar archivos existentes de importancia. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Modos de acceso r w a r+ w+ a+ ...b leer escribir reemplazando escribir añadiendo leer o escribir crear para leer y escribir crear o abrir para añadir lo definido en modo binario Las operaciones para escribir crean el archivo dicho si todavı́a no existe. Cuidado con no reemplazar archivos existentes de importancia. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Modos de acceso r w a r+ w+ a+ ...b leer escribir reemplazando escribir añadiendo leer o escribir crear para leer y escribir crear o abrir para añadir lo definido en modo binario Las operaciones para escribir crean el archivo dicho si todavı́a no existe. Cuidado con no reemplazar archivos existentes de importancia. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Modos de acceso r w a r+ w+ a+ ...b leer escribir reemplazando escribir añadiendo leer o escribir crear para leer y escribir crear o abrir para añadir lo definido en modo binario Las operaciones para escribir crean el archivo dicho si todavı́a no existe. Cuidado con no reemplazar archivos existentes de importancia. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Modos de acceso r w a r+ w+ a+ ...b leer escribir reemplazando escribir añadiendo leer o escribir crear para leer y escribir crear o abrir para añadir lo definido en modo binario Las operaciones para escribir crean el archivo dicho si todavı́a no existe. Cuidado con no reemplazar archivos existentes de importancia. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Modos de acceso r w a r+ w+ a+ ...b leer escribir reemplazando escribir añadiendo leer o escribir crear para leer y escribir crear o abrir para añadir lo definido en modo binario Las operaciones para escribir crean el archivo dicho si todavı́a no existe. Cuidado con no reemplazar archivos existentes de importancia. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Modos de acceso r w a r+ w+ a+ ...b leer escribir reemplazando escribir añadiendo leer o escribir crear para leer y escribir crear o abrir para añadir lo definido en modo binario Las operaciones para escribir crean el archivo dicho si todavı́a no existe. Cuidado con no reemplazar archivos existentes de importancia. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Modos de acceso r w a r+ w+ a+ ...b leer escribir reemplazando escribir añadiendo leer o escribir crear para leer y escribir crear o abrir para añadir lo definido en modo binario Las operaciones para escribir crean el archivo dicho si todavı́a no existe. Cuidado con no reemplazar archivos existentes de importancia. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Modos de acceso r w a r+ w+ a+ ...b leer escribir reemplazando escribir añadiendo leer o escribir crear para leer y escribir crear o abrir para añadir lo definido en modo binario Las operaciones para escribir crean el archivo dicho si todavı́a no existe. Cuidado con no reemplazar archivos existentes de importancia. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Leer sı́mbolo por sı́mbolo int c = fgetc(...) toma un mango FILE ∗, lee un sı́mbolo (en un int) y lo envia a su salida. El caractér EOF indica el fin de archivo. fgetc(stdin) = getc() ungetc(...) dado un sı́mbolo (char) y un mango (FILE ∗), devuelve el sı́mbolo “virtualmente” al archivo para que el siguiente sı́mbolo leı́do sea el sı́mbolo “repuesto”. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Leer sı́mbolo por sı́mbolo int c = fgetc(...) toma un mango FILE ∗, lee un sı́mbolo (en un int) y lo envia a su salida. El caractér EOF indica el fin de archivo. fgetc(stdin) = getc() ungetc(...) dado un sı́mbolo (char) y un mango (FILE ∗), devuelve el sı́mbolo “virtualmente” al archivo para que el siguiente sı́mbolo leı́do sea el sı́mbolo “repuesto”. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Leer sı́mbolo por sı́mbolo int c = fgetc(...) toma un mango FILE ∗, lee un sı́mbolo (en un int) y lo envia a su salida. El caractér EOF indica el fin de archivo. fgetc(stdin) = getc() ungetc(...) dado un sı́mbolo (char) y un mango (FILE ∗), devuelve el sı́mbolo “virtualmente” al archivo para que el siguiente sı́mbolo leı́do sea el sı́mbolo “repuesto”. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Leer sı́mbolo por sı́mbolo int c = fgetc(...) toma un mango FILE ∗, lee un sı́mbolo (en un int) y lo envia a su salida. El caractér EOF indica el fin de archivo. fgetc(stdin) = getc() ungetc(...) dado un sı́mbolo (char) y un mango (FILE ∗), devuelve el sı́mbolo “virtualmente” al archivo para que el siguiente sı́mbolo leı́do sea el sı́mbolo “repuesto”. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Leer lı́nea por lı́nea Con fgets(...) podemos leer una lı́nea a la vez. Toma tres parámetros: un char ∗ al espacio donde guardar la lı́nea leı́da, el largo máximo de la lı́nea (int) y el mango FILE ∗ al archivo. La salida es NULL si la operación falló y un char ∗ válido en otro caso. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Leer lı́nea por lı́nea Con fgets(...) podemos leer una lı́nea a la vez. Toma tres parámetros: un char ∗ al espacio donde guardar la lı́nea leı́da, el largo máximo de la lı́nea (int) y el mango FILE ∗ al archivo. La salida es NULL si la operación falló y un char ∗ válido en otro caso. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Leer lı́nea por lı́nea Con fgets(...) podemos leer una lı́nea a la vez. Toma tres parámetros: un char ∗ al espacio donde guardar la lı́nea leı́da, el largo máximo de la lı́nea (int) y el mango FILE ∗ al archivo. La salida es NULL si la operación falló y un char ∗ válido en otro caso. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Escribir lı́nea por lı́nea Los sı́mbolos a los cuales apunta un char ∗ pueden ser escritos en un archivo por pasar el puntero a ellos juntos con el mango al archivo a fputs(...). La salida es cero si todo fue bien, no cero si hubo errores. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Escribir lı́nea por lı́nea Los sı́mbolos a los cuales apunta un char ∗ pueden ser escritos en un archivo por pasar el puntero a ellos juntos con el mango al archivo a fputs(...). La salida es cero si todo fue bien, no cero si hubo errores. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios ¿Todavı́a queda algo? feof(...) toma un mango y devuelve “1” si el archivo ya está procesado a su final y “0” en otro caso. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Todo a la vez fread(...) lee los contenidos del archivo entero dado cuatro parámetros: 1. un char ∗ a dónde guardar lo leı́do 2. el tamaño de la unidad leı́da en múltiples de sizeof(char) (o sea, “1”) 3. el número de unidades para leer 4. el mango al archivo FILE ∗ La salida es no cero si algo fue leı́do éxitosamente. También existe fwrite(...) con los mismos tipos de parámetros. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Todo a la vez fread(...) lee los contenidos del archivo entero dado cuatro parámetros: 1. un char ∗ a dónde guardar lo leı́do 2. el tamaño de la unidad leı́da en múltiples de sizeof(char) (o sea, “1”) 3. el número de unidades para leer 4. el mango al archivo FILE ∗ La salida es no cero si algo fue leı́do éxitosamente. También existe fwrite(...) con los mismos tipos de parámetros. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Asegurar que todo entre No todo el contenido escrito en un archivo aparece en ello inmediatamente en el disco. Para asegurar que el contenido sea transferido al disco, hay que llamar fflush(...) con el mango del archivo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Asegurar que todo entre No todo el contenido escrito en un archivo aparece en ello inmediatamente en el disco. Para asegurar que el contenido sea transferido al disco, hay que llamar fflush(...) con el mango del archivo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Volver a procesar Con rewind podemos regresar el mango al inicio del archivo. El único parámetro es el mango mismo. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Cerrar Cuando acceso a un archivo ya no es necesario, el mango se elimina por fclose(...) donde el único parámetro es el mango FILE ∗. Es importante checar que no sea NULL el mango; al cerrar un NULL, tı́picamente habrá errores durante ejecución. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Cerrar Cuando acceso a un archivo ya no es necesario, el mango se elimina por fclose(...) donde el único parámetro es el mango FILE ∗. Es importante checar que no sea NULL el mango; al cerrar un NULL, tı́picamente habrá errores durante ejecución. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios rand() ANSI-C cuenta con una subrutina rand() que genera un número entero pseudoaleatorio entre cero y RAND MAX. La librerı́a necesaria es stdlib.h. Es muy importante inicializar el generador por definir una semilla con srand(int). Una buena semilla es el tiempo actual en millisegundos: time(0). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios rand() ANSI-C cuenta con una subrutina rand() que genera un número entero pseudoaleatorio entre cero y RAND MAX. La librerı́a necesaria es stdlib.h. Es muy importante inicializar el generador por definir una semilla con srand(int). Una buena semilla es el tiempo actual en millisegundos: time(0). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios rand() ANSI-C cuenta con una subrutina rand() que genera un número entero pseudoaleatorio entre cero y RAND MAX. La librerı́a necesaria es stdlib.h. Es muy importante inicializar el generador por definir una semilla con srand(int). Una buena semilla es el tiempo actual en millisegundos: time(0). Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Transformaciones ◮ [0, 1] ◮ [a, b] ◮ {0, 1} Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Transformaciones ◮ [0, 1] ◮ [a, b] ◮ {0, 1} Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Transformaciones ◮ [0, 1] ◮ [a, b] ◮ {0, 1} Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Validación Es muy importante verificar que la distribución de la salida es la deseada y que no presenten patrones de regularidad las salidas. Cuando rand() no resulta suficientemente “aleatorio”, existen otras librerı́as libremente disponibles en lı́nea y varios algoritmos en la literatura. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Validación Es muy importante verificar que la distribución de la salida es la deseada y que no presenten patrones de regularidad las salidas. Cuando rand() no resulta suficientemente “aleatorio”, existen otras librerı́as libremente disponibles en lı́nea y varios algoritmos en la literatura. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Otras distribuciones Los libros de probabilidad ayudan en convertir una variable aleatoria uniforme a una de otra distribución, aunque a veces es necesario generar más que un valor uniforme por cada valor de la otra distribución. (Hay tareas relacionadas. Para la distribución exponencial es fácil, por ejemplo.) Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Entrada y salida Archivos Números pseudoaleatorios Otras distribuciones Los libros de probabilidad ayudan en convertir una variable aleatoria uniforme a una de otra distribución, aunque a veces es necesario generar más que un valor uniforme por cada valor de la otra distribución. (Hay tareas relacionadas. Para la distribución exponencial es fácil, por ejemplo.) Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Preprocesador y assert.h #ifdef DEBUG Dra. Elisa Schaeffer ´´ ´´ fprintf(stderr, Verificando el puntero... ); assert(p != NULL); #endif FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Preprocesador y assert.h #ifdef DEBUG Dra. Elisa Schaeffer ´´ ´´ fprintf(stderr, Verificando el puntero... ); assert(p != NULL); #endif FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Preprocesador y assert.h #ifdef DEBUG Dra. Elisa Schaeffer ´´ ´´ fprintf(stderr, Verificando el puntero... ); assert(p != NULL); #endif FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Preprocesador y assert.h #ifdef DEBUG Dra. Elisa Schaeffer ´´ ´´ fprintf(stderr, Verificando el puntero... ); assert(p != NULL); #endif FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Subrutinas Cuando el código es largo o contiene partes repetitivas, es mejor divirlo en subrutinas. El diseño de buenas subrutinas es un arte. Es esencial o definir o por lo menos declarar cada subrutina antes de usarlo en el código para que el compilador pueda identificarla. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Subrutinas Cuando el código es largo o contiene partes repetitivas, es mejor divirlo en subrutinas. El diseño de buenas subrutinas es un arte. Es esencial o definir o por lo menos declarar cada subrutina antes de usarlo en el código para que el compilador pueda identificarla. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Subrutinas Cuando el código es largo o contiene partes repetitivas, es mejor divirlo en subrutinas. El diseño de buenas subrutinas es un arte. Es esencial o definir o por lo menos declarar cada subrutina antes de usarlo en el código para que el compilador pueda identificarla. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Subrutinas Cuando el código es largo o contiene partes repetitivas, es mejor divirlo en subrutinas. El diseño de buenas subrutinas es un arte. Es esencial o definir o por lo menos declarar cada subrutina antes de usarlo en el código para que el compilador pueda identificarla. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Parámetros a subrutinas Al entrar a una llamada de subrutina, el sistema operativo que está ejecutando el programa copia los valores de los parámetros a una nueva área de memoria. Si uno quiere que la subrutina pueda modificar la variable de la (sub-)rutina que hizo la llamada, hay que pasar un puntero a la variable como parámetro. Cada subrutina puede tener una sola salida al valor de la cual evalua su llamada. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Parámetros a subrutinas Al entrar a una llamada de subrutina, el sistema operativo que está ejecutando el programa copia los valores de los parámetros a una nueva área de memoria. Si uno quiere que la subrutina pueda modificar la variable de la (sub-)rutina que hizo la llamada, hay que pasar un puntero a la variable como parámetro. Cada subrutina puede tener una sola salida al valor de la cual evalua su llamada. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Parámetros a subrutinas Al entrar a una llamada de subrutina, el sistema operativo que está ejecutando el programa copia los valores de los parámetros a una nueva área de memoria. Si uno quiere que la subrutina pueda modificar la variable de la (sub-)rutina que hizo la llamada, hay que pasar un puntero a la variable como parámetro. Cada subrutina puede tener una sola salida al valor de la cual evalua su llamada. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Recursión = cuando una computación se repite por un mecanismo donde una subrutina llama a si misma (o varias diferentes subrutinas hacen llamadas entre ellos de una manera cı́clica). Utilizado inteligentemente, recursión es un mecanismo muy poderoso que facilita el diseño e implementación de buenos algoritmos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Recursión = cuando una computación se repite por un mecanismo donde una subrutina llama a si misma (o varias diferentes subrutinas hacen llamadas entre ellos de una manera cı́clica). Utilizado inteligentemente, recursión es un mecanismo muy poderoso que facilita el diseño e implementación de buenos algoritmos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Recursión versus iteración Varios problemas se puede resolver en dos maneras distintas: o por repetir iterativamente (con for, while, ...) o recursivamente ciertas operaciones hasta llegar a una condición de terminación. A veces una de las dos maneras es muy superior a la otra. Ejemplos: palı́ndromos, triángulo de Pascal, estructuras de datos... Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Recursión versus iteración Varios problemas se puede resolver en dos maneras distintas: o por repetir iterativamente (con for, while, ...) o recursivamente ciertas operaciones hasta llegar a una condición de terminación. A veces una de las dos maneras es muy superior a la otra. Ejemplos: palı́ndromos, triángulo de Pascal, estructuras de datos... Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Recursión versus iteración Varios problemas se puede resolver en dos maneras distintas: o por repetir iterativamente (con for, while, ...) o recursivamente ciertas operaciones hasta llegar a una condición de terminación. A veces una de las dos maneras es muy superior a la otra. Ejemplos: palı́ndromos, triángulo de Pascal, estructuras de datos... Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Librerı́as propias Una subrutina bien diseñado suele ser útil en varios programas, no solamente en ello para el cual fue originalmente escrito. Para facilitar el reuso de código, es mejor separar tales subrutinas en sus propios archivos, agrupándolas por archivo según su función. Preparar un archivo .h propio con las declaraciones de los constantes, subrutinas, etcétera. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Librerı́as propias Una subrutina bien diseñado suele ser útil en varios programas, no solamente en ello para el cual fue originalmente escrito. Para facilitar el reuso de código, es mejor separar tales subrutinas en sus propios archivos, agrupándolas por archivo según su función. Preparar un archivo .h propio con las declaraciones de los constantes, subrutinas, etcétera. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Librerı́as propias Una subrutina bien diseñado suele ser útil en varios programas, no solamente en ello para el cual fue originalmente escrito. Para facilitar el reuso de código, es mejor separar tales subrutinas en sus propios archivos, agrupándolas por archivo según su función. Preparar un archivo .h propio con las declaraciones de los constantes, subrutinas, etcétera. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Tipos de datos “al gusto” Practicamente todo lenguaje de programación avanzada les permite definir (de una manera u otra) sus propios tipos de datos. Los tipos definidos son combinaciones de los tipos básicos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Tipos de datos “al gusto” Practicamente todo lenguaje de programación avanzada les permite definir (de una manera u otra) sus propios tipos de datos. Los tipos definidos son combinaciones de los tipos básicos. Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Numeros complejos Por ejemplo, para manejar números complejos x + iy ∈ C, se puede definir un tipo de datos que contiene dos double: uno para x y otro para y . Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Declaración en ANSI-C Tı́picamente se incluye las declaraciones de estructuras en los archivos .h y la sintaxis es la siguiente: struct complexNumber { double real; double imaginary; }; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Declaración en ANSI-C Tı́picamente se incluye las declaraciones de estructuras en los archivos .h y la sintaxis es la siguiente: struct complexNumber { double real; double imaginary; }; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Acceso a las partes Para acceder a las partes de una estructura, usamos .: int main(int c, char∗∗ d) { struct complexNumber a; a.real = 1.0; a.imaginary = 2.5; ... return 1; } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Acceso a las partes Para acceder a las partes de una estructura, usamos .: int main(int c, char∗∗ d) { struct complexNumber a; a.real = 1.0; a.imaginary = 2.5; ... return 1; } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Acceso a las partes Para acceder a las partes de una estructura, usamos .: int main(int c, char∗∗ d) { struct complexNumber a; a.real = 1.0; a.imaginary = 2.5; ... return 1; } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Acceso a las partes Para acceder a las partes de una estructura, usamos .: int main(int c, char∗∗ d) { struct complexNumber a; a.real = 1.0; a.imaginary = 2.5; ... return 1; } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Acceso a las partes por un puntero Para acceder a las partes de una estructura a que tenemos un puntero, usamos ->: void setValue(struct complexNumber∗ n) { n->real = 1.0; n->imaginary = 0.0; return; } int main(int c, char∗∗ d) { struct complexNumber a; setValue(&a); ... return 1; } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Acceso a las partes por un puntero Para acceder a las partes de una estructura a que tenemos un puntero, usamos ->: void setValue(struct complexNumber∗ n) { n->real = 1.0; n->imaginary = 0.0; return; } int main(int c, char∗∗ d) { struct complexNumber a; setValue(&a); ... return 1; } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Acceso a las partes por un puntero Para acceder a las partes de una estructura a que tenemos un puntero, usamos ->: void setValue(struct complexNumber∗ n) { n->real = 1.0; n->imaginary = 0.0; return; } int main(int c, char∗∗ d) { struct complexNumber a; setValue(&a); ... return 1; } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Sobrenombres a tipos: typedef // en un .h typedef int entero; typedef double decimal; typedef struct complexNumber complejo; // uso en un .c entero a = 3; decimal b = 2.5; complejo c; c.real = 1.0; c.imaginary = -2.4; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Sobrenombres a tipos: typedef // en un .h typedef int entero; typedef double decimal; typedef struct complexNumber complejo; // uso en un .c entero a = 3; decimal b = 2.5; complejo c; c.real = 1.0; c.imaginary = -2.4; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Sobrenombres a tipos: typedef // en un .h typedef int entero; typedef double decimal; typedef struct complexNumber complejo; // uso en un .c entero a = 3; decimal b = 2.5; complejo c; c.real = 1.0; c.imaginary = -2.4; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Sobrenombres a tipos: typedef // en un .h typedef int entero; typedef double decimal; typedef struct complexNumber complejo; // uso en un .c entero a = 3; decimal b = 2.5; complejo c; c.real = 1.0; c.imaginary = -2.4; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Sobrenombres a constantes: #define #define MAXLENGTH 80 char buffer[MAXLENGTH]; for (i = 0; i < MAXLENGTH; i++) { ... } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Sobrenombres a constantes: #define #define MAXLENGTH 80 char buffer[MAXLENGTH]; for (i = 0; i < MAXLENGTH; i++) { ... } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Sobrenombres a constantes: #define #define MAXLENGTH 80 char buffer[MAXLENGTH]; for (i = 0; i < MAXLENGTH; i++) { ... } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Sobrenombres de “opciones”: enum enum options { NEXT = 1, PREVIOUS = 2, FIRST = 3, LAST = 4, EXIT = 5 }; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Sobrenombres de “opciones”: enum enum options { NEXT = 1, PREVIOUS = 2, FIRST = 3, LAST = 4, EXIT = 5 }; Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Uso de enum // pref. en .h typedef enum coloresPosibles { ROJO, AZUL, VERDE, AMARILLO, NEGRO } color; // uso en .c color c; switch (c) { case ROJO: ... case AZUL: ... } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Uso de enum // pref. en .h typedef enum coloresPosibles { ROJO, AZUL, VERDE, AMARILLO, NEGRO } color; // uso en .c color c; switch (c) { case ROJO: ... case AZUL: ... } Dra. Elisa Schaeffer FIME, UANL Computadoras y programación Variables y tipos de datos Operaciones Estructuras de control Arreglos y punteros Librerı́as estándares Más allá de lo básico Subrutinas Tipos propios Uso de enum // pref. en .h typedef enum coloresPosibles { ROJO, AZUL, VERDE, AMARILLO, NEGRO } color; // uso en .c color c; switch (c) { case ROJO: ... case AZUL: ... } Dra. Elisa Schaeffer FIME, UANL