Cuestionario 1
1) Para la traducción de programas a lenguaje máquina es importante conocer
distintas herramientas de software que se pueden emplear para dicho fin y que se
diferencian por:
· Ensambladores: el programa debe ser escrito en lenguaje
ensamblador, es decir, utilizar códigos nemotécnicos que le indiquen
al hardware las operaciones que tiene que realizar. Estos lenguajes
están orientados a la máquina ya que el modelo del ordenador indica
su propio lenguaje ensamblador. Se utiliza un programa llamado
ensamblador.
· Compiladores: el programa se escribe en lenguaje de alto nivel, es
decir, un lenguaje más cercano al nuestro y no es necesario tener
conocimiento de la estructura del procesador. Se utilizan dos
programas: el compilador (traducción a lenguaje máquina) y
automáticamente el enlazador para incorporar las funciones de la
biblioteca del lenguaje utilizado. Si hay un error de sintaxis durante la
traducción, el enlace no se efectúa y no se puede ejecutar. La
ejecución la realiza directamente el ordenador.
· Intérpretes: el programa se escribe en lenguaje de alto nivel, pero a
diferencia del compilador, el intérprete efectúa la traducción y
ejecución simultánea de cada una de las sentencias del programa.
Además, como verifica cada línea del programa cuando se escribe,
facilita la puesta a punto del programa, pero la ejecución resulta más
lenta ya que acarrea una traducción simultánea.
2) La directiva #include hace referencia a la directriz de inclusión en el fichero
fuente. Las declaraciones de las funciones de la biblioteca de C se localizan en
los ficheros de cabecera (ficheros con extensión .h). Estos ficheros generalmente
se localizan en la directiva #include. Para la invocación a una función antes de
su definición, es necesario incluir previamente a la llamada, el prototipo de la
función. Por ejemplo:
#include <stdio.h> /* declaraciones de las funciones C
Estándar de E/S *
Si el fichero se encuentra, indistintamente, en el directorio de trabajo o en el
directorio include, utilice #include "fichero.h". Por ejemplo:
#include "misfuncs.h"
En dicho ejemplo la directriz busca el fichero especificado primero en el directorio de
trabajo y si no lo localiza, sigue la búsqueda en el directorio include.
3) Los ficheros de cabeceras tienen extensión .h y en el proceso de
construcción del programa son invocados por el preprocesador, pero aún sigue
siendo un programa fuente. Allí sólo se encuentran las declaraciones de las
funciones de la biblioteca de C. En cambio, las bibliotecas de funciones es un
fichero separado en el disco que contiene las funciones que realizan las tareas
más comunes, como por ejemplo printf. Pueden tener varias extensiones
diferentes como .lib, .bpl, .a; entre otras no tan conocidas. Las bibliotecas de
funciones son invocadas por el enlazador.
4) Se denomina secuencia de escape a lo que está formado por el carácter \
seguido de una letra o una combinación de dígitos. A partir una secuencia de
escape se puede representar caracteres o realizar acciones de nueva línea,
tabular y hacer referencia a caracteres no imprimibles.
Secuencia de escape Nombre
\n Ir al principio de la siguiente línea
\t Tabulador horizontal
\v Tabulador vertical (sólo para impresora)
\b Retroceso (backspace)
\r Retorno de carro sin avance de línea
\f Alimentación de página (sólo para impresora)
\a Alerta, pitido
\’ Comilla simple
\” Comilla doble
\\ Barra invertida (backslash)
\ddd Carácter ASCII. Representación octal
\xdd Carácter ASCII. Representación hexadecimal
5)
Tipos fundamentales Capacidad de memoria
char 1 byte
short 2 bytes
int 2 o 4 bytes
long 4 u 8 bytes
float 4 bytes
double 8 bytes
long double 10 bytes
void Nulo
Este valor depende del rango de almacenamiento que tiene cada tipo fundamental.
6) La declaración de una variable se refiere a darle una existencia semántica,
asociada a un tipo de dato. En cambio, su la definición consiste en declararla
además de asociar una dirección de memoria, pudiendo ser inicializada en la propia
definición.
7) enum consiste en una lista de valores que puede tomar una variable de este tipo,
representados con identificadores donde cada uno de ellos tiene asociado un
número comenzando desde cero y aumentando en uno en el orden respectivo.
8) Se declaran nuevos tipos de variables a través de la declaración typedef. Permite
modificar el nombre de los tipos de variables, a partir de los fundamentales. Se dice
que permiten garantizar la portabilidad ya que, si los tipos de variables dependen de
la instalación, cuando el programa se lleva a otra instalación sólo se tendrán que
cambiar las declaraciones.
9)
Tipos de valores Notación
Entero int
Caracter char
Número en coma flotante (con punto float
decimal y/o exponente)
Número en coma flotante de doble double
precisión (más cifras significativas y
mayor valor de exponente)
10) Es importante definir constantes ya que permitiría modificar el programa
rápidamente, en caso de que haya que cambiar algún parámetro que sea constante
y repetitivo a lo largo del programa.
11) Diferencien los ámbitos de declaración de las variables. ¿Qué desventaja
tiene la declaración global?
Las variables que se declaran fuera de todo bloque, son del tipo global. Éstas, se
encuentran accesibles en todo el fichero. En cambio, las variables que se declaran
dentro de un bloque son del tipo local, y solo están accesibles dentro del propio
bloque.
La desventaja que tiene la declaración global es que otras funciones y/o bloques
pueden modificar su valor.
12) Diferencien “conversión implícita” y “conversión explícita” de tipos de
variables y ejemplifiquen cada una de ellas.
Conversiones implícitas
· Las realiza automáticamente el compilador
· Los operandos que intervienen en una determinada operación, son
convertidos al tipo del operando de precisión más alta.
· Ejemplo:
long a;
int b;
float c;
int d;
d=a+b/c;
La primera operación es la división: -> b es convertido a float, se obtiene un
resultado del tipo float.
La segunda operación es la suma: -> a es convertido a float, se ejecuta la suma, y
se obtiene un resultado del tipo float.
Conversiones explicitas:
· Se realiza mediante una construcción denominada cast, que tiene la forma:
(nombre-de-tipo) expresión.
· La expresión es convertida al tipo especificado si esa conversión está
permitida en otro caso, se obtendrá un error.
· Ejemplo
La función sqrt (raíz cuadrada) espera como argumento un tipo double. Se puede
evitar resultados inesperados a causa de otro tipo de argumento, se puede realizar:
sqrt ( (double)(n+2))
13) Diferencien las distintas clases de almacenamiento de las variables.
Construyan un cuadro comparando cada clase, su ámbito y su existencia.
13)
Calificador Clase Ámbito Existencia
auto almacenamiento Local Nivel interno
automático
register almacenamiento en un Local Nivel interno
registro
static almacenamiento estático Local, Global o Nivel externo
funciones
extern Almacenamiento externo Global o funciones Nivel externo
14) ¿Cuál es el problema que puede presentar la ejecución de la función
scanf()? ¿A qué se debe? Indique dos maneras de solucionarlo
Cuando ingresamos datos a través del teclado y pulsamos ↵ (Enter), se introduce
también el caracter nueva linea, es decir, que en el buffer quedará guardada la
secuencia de escape \n luego de la lectura. Si luego de esto ejecutamos otra
sentencia de entrada, este carácter podría ocupar el lugar de nuestra nueva lectura
y así generarnos un problema. Una solución práctica para este problema sería
limpiar el buffer asociado con la entrada estándar (stdin), usando la función fflush de
la biblioteca de C.
15) ¿A que se denomina “especificación de formato”? Construyan una tabla
indicando el significado de cada una de ellas.
Se llama especificación de formato a la indicación del tipo de dato que va a recibir o
mostrar una función.
Formato Significado
d enteros con signo, en base 10
i enteros con signo, en base 10
u enteros con signo, en base 10
o enteros sin signo, en base 8
x enteros sin signo, en base l6 (01...abcdef).
X enteros sin signo, en base 16 (01...ABCDEF).
f valor con signo de la forma: t-ldddd.dddd. El número de dígitos antes
del punto decimal depende de la magnitud del número y el número de
decimales de la precisión, la cual es 6 por defecto
e valor con signo, de la forma f-ld.ddddefx.lddd
E valor con signo, de la forma t-ld.ddddÁt+lddd
g valor con signo, en formato f o e (el que sea más compacto para el
valor y precisión dados)
G igual que g, excepto que G introduce el exponente E en vez de e.
c un sólo carácter, correspondiente al byte menos significativo.
s (cadena de caracteres) escribir una cadena de caracteres hasta el
primer carácter nulo ('\0').
n (puntero a un entero). En el entero correspondiente a esta
especificación de formato, se almacena el número de caracteres hasta
ahora escritos en el buffer.
p (puntero a void). Válido sólo en MS-DOS. Escribe la dirección
apuntada por el argumento. Si se especifrca %op o ToNp se escribe
sólo el desplazamiento de la dirección y si se especifica ToFp o Volp
se escribe una dirección segmentada (xxxx:yyyy).
16) Función getch(): lee un carácter del teclado, sin visualizarlo en el monitor (sin
eco).
Función getchar(): lee un carácter de la entrada estándar (stdin). Cada vez que se
ejecute dicha función se leerá el siguiente carácter al último leído. La función
getchar devuelve el carácter leído o un EOF si se detecta el final del fichero o si
ocurre un error.
Función getche(): lee un carácter del teclado visualizándolo en el monitor (con eco).
La ejecución del programa finaliza, en el caso de getchar(), cuando se introduce un
carácter y se pulsa Entrar. En cambio, para getch() y getche() solo con pulsar una
tecla alcanza y no es necesario pulsar Entrar. ↵
17) Estructura de la sentencia switch:
switch (expresión)
[declaraciones]
case: expresión-constante 1: [sentencia1; break;]
case: expresión-constante 2: [sentencia2; break;]
case: expresión-constante 3: [sentencia3; break;]
[default:] [sentencia;]
}
La sentencia switch evalúa la expresión entre paréntesis y compara su valor con las
constantes de cada case. La ejecución de las sentencias del bloque de la sentencia
switch, comienza en el case cuya constante coincida con el valor de la expresión y
continúa hasta el final del bloque o hasta una sentencia que transfiera el control
fuera del bloque de switch; por ejemplo, break o return. La sentencia switch puede
incluir cualquier número de cláusulas case.
18) Cuando se utiliza una estructura do-while el bloque de sentencias se ejecuta al
menos una vez, porque la condición se evalúa al final. En cambio, cuando se
ejecuta una estructura while puede suceder que el bloque de sentencias no se
ejecute, lo que ocurrirá siempre que la condición sea inicialmente falsa.
19) La sentencia goto transfiere el control a una línea específica del programa,
identificada por una etiqueta. Por lo tanto, no es recomendable abusar de esta
sentencia ya que hace que los programas sean difíciles de interpretar y mantener y
lo que se busca potenciar en una programación de dicho tipo es justamente eso.
20)Esta declaración es invalida ya que el número de elementos del array debe ser
una constante entera y no una variable. Si se quiere trabajar con un número de
elementos variable a una forma, pero no es esta.
21)La dimensión puede omitirse cuando se inicializa el array, cuando se
declara como un parámetro formal en una función o cuando se hace
referencia a un array declarado en otra parte del programa. Para una
matriz ocurre lo mismo en las situaciones anteriormente mencionadas.
22)No, el compilador no verifica que se exceda el límite de una array
cuando tratamos de acceder a uno de sus elementos. Ahora bien como
el compilador no verifica esto, es responsabilidad del programador
realizar este tipo de comprobaciones.
23) La dificultad que tiene la utilización de la función scanf() cuando la utilizamos
para ingresar una cadena (%s) es que va a tomar la cadena hasta el primer espacio
en blanco, por ejemplo:
Char nombre[41];
scanf(“%s”,nombre);
printf(“%s\n”, nombre);
si realizo una entrada como:
Maxi Garcia
Solo se visualizará Maxi ya que scanf() lee datos delimitados por espacios en
blanco. Para solucionar esto scanf admite una especificación de formato
personalizado que tiene la sintaxis siguiente:
%[caracteres] con esto se especifica que lea caracteres hasta que se lea uno que
no esté especificado en el conjunto indicado por caracteres