Programación I
Lucas Mesas Tabares
CLASE 11
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
303
Temas del programa
Temas de esta clase:
➢ Control del Programa
○ goto
○ break
○ continue
➢ Manejo de Variables
○ Conversiones de Tipos
○ Clases de Almacenamiento
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
304
Programación I - Clase 11
Manejo de variables:
(21 palabras)
Lenguaje “C”
Resumen con lo visto hasta ahora
Reglas:
Signos:
➢
➢
➢
➢
Palabras claves
/ reservadas
Operadores
Delimitadores
Puntuación
➢
➢
➢
➢
➢
➢
➢
➢
Sintaxis
Control de flujo
Estructuración
Precedencia
Asociatividad
Alcance
Estilo
Promoción
Control de programa:
(11 palabras)
Selección Simple:
if / else
Especificadores de Tipo:
char
double
float
int
Modificadores de Tipo:
long
short
signed
unsigned
“Tipos” Especiales:
void
enum
Calificadores de Tipo:
const
volatile
Selección Múltiple:
switch / case / default
Clases de Almacenamiento:
auto
extern
register
static
Repetición:
for
while / do
Tipos de Datos Derivados:
struct
typedef
union
Enunciados Modificadores:
break
continue
goto
Operadores:
return
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
sizeof
305
Programación I - Control del Programa
Enunciado modificador goto
➢
El resultado del enunciado goto es una modificación en
el flujo de control del programa.
➢
Es una “bifurcación” incondicional: permite al
programador especificar una transferencia de control a
cualquier punto posible, dentro de un programa.
➢
La ejecución del programa continúa en el primer
enunciado inmediatamente después de la etiqueta
especificada en el enunciado goto.
➢
Una etiqueta es un identificador seguido por dos
puntos.
➢
Debe de aparecer una etiqueta en la misma función
que en el enunciado goto que se refiere a ella.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
306
Programación I - Control del Programa
Enunciado modificador goto
✓
La noción de lo que se conoce como programación estructurada se convirtió
prácticamente en sinónimo de "eliminación de goto".
➢
Las etiquetas son los únicos identificadores con alcance de función.
➢
Las etiquetas pueden ser utilizadas en cualquier parte dentro de la función en
la cual aparecen, pero no pueden ser referenciadas fuera del cuerpo de la
función.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
307
Programación I - Control del Programa
Enunciado modificador break
➢
La sentencia break termina la ejecución
de un bucle, de una sentencia switch, y
en general de cualquier sentencia.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
308
Programación I - Control del Programa
Enunciado modificador
continue
➢
La sentencia continue
hace que la ejecución de
un bucle, vuelva a la
cabecera del bucle.
➢
La sentencia continue
hace que cuando se
ejecuta, se salten todas las
sentencias que vienen a
continuación, y comienza
una nueva iteración si se
cumple la condición del
bucle.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
309
Programación I - Control del Programa
Comparación entre break y continue
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
310
Programación I - Manejo de Variables
Conversiones de Tipos
➢
Con frecuencia, se necesita convertir un valor de un tipo a otro sin cambiar el valor que
representa.
➢
Las conversiones de tipos pueden ser implícitas (ejecutadas automáticamente) o explícitas
(solicitadas específicamente por el programador).
➢
C hace muchas conversiones de tipos automáticamente:
✓
Cuando se asigna un valor de un tipo a una variable de otro tipo.
✓
Cuando se combinan tipos mixtos en expresiones.
✓
Cuando se pasan argumentos a funciones.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
311
Programación I - Manejo de Variables
Conversión Implícita
➢
Los tipos fundamentales (básicos) pueden ser mezclados libremente en asignaciones y
expresiones.
➢
Las conversiones se ejecutan automáticamente: los operandos de tipo más bajo se convierten
en los de tipo más alto.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
312
Programación I - Manejo de Variables
Reglas de Conversión Implícita
➢
Si cualquier operando es de tipo char, short o enum se convierte en tipo int.
➢
Si los operandos tienen diferentes tipos, la siguiente lista determina a qué operación
convertirá:
int
unsigned int
long
unsigned long
float
double
➢
El tipo que viene primero en esta lista se convierte en el que viene segundo.
➢
Esta operación se llama promoción integral.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
313
Programación I - Manejo de Variables
Conversión Explícita
➢
C fuerza la conversión explícita de tipos mediante el operador de molde (cast).
➢
El operador molde tiene el formato:
(nombretipo) valor;
(float) i;
(int) 3.4;
(int*) malloc(2*16);
➢
Con lo cual el valor se convierte en un dato de tipo nombretipo.
➢
El operador molde (tipo, cast) tiene la misma prioridad que otros operadores unitarios tales
como +, - y !.
precios = (int)19.99 + (int)11.99;
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
314
BREAK
✓
10 minutos
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
315
Programación I - Manejo de Variables
Calificador de tipo volatile
➢
El calificador de tipo volatile se aplica a una definición de una variable que se puede
alterar desde el exterior del programa (es decir, la variable no está completamente bajo el
control del programa).
➢
El compilador no puede realizar optimizaciones (como agilizar la ejecución del programa, o
reducir el consumo de memoria, por ejemplo) que dependan en “saber que el comportamiento
de una variable está influenciado sólo por las actividades del programa que el compilador puede
observar”.
➢
Debido a que el valor puede cambiar inesperadamente, el compilador recargará el valor cada
vez desde la memoria.
✓
Un entero volatile puede ser declarado de estas dos maneras:
int volatile x;
volatile int x;
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
316
Programación I - Manejo de Variables
Calificador de tipo volatile
Las variables volatile
no son optimizadas, lo
cual puede ser muy útil.
A primera vista, el código anterior parece ser un bucle
infinito.
El compilador puede intentar optimizarlo dejándolo de
esta manera:
Para evitar que el compilador
lleve a cabo esa
optimización, podemos
indicarle que esperamos que
esa variable pueda ser
modificada por algún otro
elemento del sistema.
Para esto utilizamos el
calificador volatile del
siguiente modo:
Pero con ese cambio el código se convierte,
efectivamente, en un bucle infinito.
Sin embargo, podría ser que alguna operación externa
escribiese un 0 en la posición de memoria de la variable
Opcion y de esa manera se podría salir del bucle.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
317
Programación I - Manejo de Variables
Clases de Almacenamiento
➢
El ámbito o alcance de una variable determina cuáles son las funciones que reconocen ciertas
variables.
➢
Si una función reconoce una variable, la variable es visible en esa función.
➢
El ámbito es la zona de un programa en la que es visible una variable.
➢
Existen cuatro tipos de ámbitos: programa, archivo fuente, función y bloque.
➢
Se puede designar una variable para que esté asociada a uno de estos ámbitos.
➢
Tal variable es invisible fuera de su ámbito y sólo se puede acceder a ella en su ámbito.
➢
Normalmente la posición de la sentencia en el programa determina el ámbito.
➢
Los especificadores de clases de almacenamiento, auto, extern, register, static,
permiten modificar el ámbito de una variable.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
318
Programación I - Manejo de Variables
Variables Automáticas
➢
Las variables locales de las funciones no existen en
memoria hasta que se ejecuta la función.
➢
Esta propiedad permite ahorrar memoria, ya que permite
que varias funciones compartan la misma memoria para
sus variables locales (pero no a la vez).
➢
Las variables que se declaran dentro de una función se
dice que son automáticas (auto), significando que se les
asigna espacio en memoria automáticamente a la entrada
de la función y se les libera el espacio tan pronto se sale
de dicha función.
➢
La palabra reservada auto es opcional.
➢
Normalmente no se especifica la palabra auto.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
319
Programación I - Manejo de Variables
Variables Externas
➢
A veces se presenta el problema de que una función necesita utilizar
una variable que otra función inicializa.
➢
Como las variables locales sólo existen temporalmente mientras se está
ejecutando su función, no pueden resolver el problema.
➢
Se soluciona haciendo que una función de un archivo de código
fuente utilice una variable definida en otro archivo.
➢
Una solución es declarar la variable local con la palabra reservada
extern.
➢
Cuando una variable se declara extern, se indica al compilador que el
espacio de la variable está definida en otro lugar.
➢
En el archivo extern2.c la declaración externa de Opcion indica al
compilador que Opcion se ha definido en otra parte (archivo).
➢
Posteriormente, cuando estos archivos se enlacen, las declaraciones se
combinan de modo que se referirán a las mismas posiciones de
memoria.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
extern.c
extern2.c
320
Programación I - Manejo de Variables
extern2.c
Variables Externas
➢
Al contrario que las variables,
las funciones son externas
por defecto.
➢
Es preciso considerar la
diferencia entre definición de
una función y declaración.
➢
Si una declaración de
variable comienza con la
palabra reservada extern,
no se considera definición de
variable.
➢
Sin esta palabra reservada es
una definición.
➢
Cada definición de variable es
al mismo tiempo una
declaración de variable.
extern.c
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
321
Programación I - Manejo de Variables
Variables Registro
➢
Precediendo a la declaración de una variable con la palabra reservada register, se
sugiere al compilador que la variable se almacene en uno de los registros hardware
del microprocesador.
➢
La familia de microprocesadores 80x86 no tiene muchos registros hardware de
reserva, por lo que el compilador puede decidir ignorar sus sugerencias.
➢
Una variable register debe ser local a una función, nunca puede ser global al
programa completo.
➢
El uso de la variable register no garantiza que un valor se almacene en un registro.
Esto sólo sucederá si existe un registro disponible.
➢
Si no existen registros suficientes, C ignora la palabra reservada register y crea
la variable localmente como ya se conoce.
La palabra
register es
una sugerencia
al compilador y
no una orden.
Una aplicación típica de una variable registro es como variable de control de un bucle.
Guardando la variable de control de un bucle en un registro, se reduce el tiempo que la
CPU requiere para buscar el valor de la variable de la memoria.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
322
Programación I - Manejo de Variables
Variables Registro
➢
La familia de microprocesadores 80x86 no tiene
muchos registros hardware de reserva, por lo que el
compilador puede decidir ignorar sus sugerencias.
➢
Si no existen registros suficientes, C ignora la
palabra reservada register y crea la variable
localmente como ya se conoce.
BUS DE DATOS
VONSIM
CPU
MEMORIA
UNIDAD DE
ENTRADA /
SALIDA
Simulador de
microprocesador
BUS DE DIRECCIONES
BUS DE CONTROL
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
323
Programación I - Manejo de Variables
Variables Estáticas
➢
Las variables estáticas son opuestas, en
su significado, a las variables
automáticas.
➢
Las variables estáticas no se borran
(no se pierde su valor) cuando la función
termina y, en consecuencia, retienen sus
valores entre llamadas a una función.
➢
Al contrario que las variables locales
normales, una variable static se
inicializa sólo una vez.
➢
Se declaran precediendo a la
declaración de la variable con la palabra
reservada static.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
324
Programación I - Clase 11
Manejo de variables:
(21 palabras)
Lenguaje “C”
Resumen con lo visto hoy
Reglas:
Signos:
➢
➢
➢
➢
Palabras claves
/ reservadas
Operadores
Delimitadores
Puntuación
➢
➢
➢
➢
➢
➢
➢
➢
Sintaxis
Control de flujo
Estructuración
Precedencia
Asociatividad
Alcance
Estilo
Promoción
Control de programa:
(11 palabras)
Selección Simple:
if / else
Especificadores de Tipo:
char
double
float
int
Modificadores de Tipo:
long
short
signed
unsigned
“Tipos” Especiales:
void
enum
Calificadores de Tipo:
const
volatile
Selección Múltiple:
switch / case / default
Clases de Almacenamiento:
auto
extern
register
static
Repetición:
for
while / do
Tipos de Datos Derivados:
struct
typedef
union
Enunciados Modificadores:
break
continue
goto
Operadores:
return
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
sizeof
325
Bibliografía
Programación en C
Metodología, algoritmos y estructura de datos
Luis Joyanes Aguilar - Ignacio Zahonero Martinez
SEGUNDA EDICIÓN
Editorial Mc Graw Hill
Cracking the Coding Interview
189 Programming Questions & Solutions
Gayle Laakmann McDowell
SIXTH EDITION
CareerCup, LLC, Palo Alto, CA
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
326
Programación I - Ejercicio de Práctica
¿Cuáles de las siguientes afirmaciones son
verdaderas y cuáles son falsas?
1) Las variables locales se llaman también
automáticas o auto.
A.
Todas son verdaderas.
B.
Solo las afirmaciones 5) y 3) son
verdaderas.
C.
Solo las afirmaciones 5) y 2) son falsas.
D.
Solo las afirmaciones 5), 3) y 6) son falsas.
E.
5) Una variable auto es aquella que tiene una
duración automática.
Solo las afirmaciones 3), 4) y 6) son
verdaderas.
F.
6) Una variable global no puede ser una variable
auto.
Solo las afirmaciones 1) y 5) son
verdaderas.
G.
Todas son falsas.
2) Las variables locales se crean automáticamente
en la entrada a la función.
3) Las variables locales se liberan automáticamente
cuando se termina la ejecución de la función.
4) Los especificadores de clases de almacenamiento
static, extern, auto y register, pueden afectar al
ámbito.
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
327
Presentaciones de las clases
Disponibles en
ACADEMIA
http://utn.academia.edu/LucasMesasTabares
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
328
Y eso es todo… ¡por ahora!
Gracias
Lucas Mesas Tabares
http://utn.academia.edu/LucasMesasTabares
[email protected]
Lucas Mesas Tabares - http://utn.academia.edu/LucasMesasTabares -
[email protected]
329