0% encontró este documento útil (0 votos)
31 vistas9 páginas

Herramientas de Traducción en Programación C

Este documento contiene preguntas sobre traducción de programas a lenguaje máquina y herramientas como ensambladores y compiladores. También cubre temas como directivas, tipos de datos, conversiones y especificaciones de formato.

Cargado por

Wendy Gatica
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Temas abordados

  • directiva include,
  • conversiones de tipos,
  • ficheros de cabecera,
  • estructura do-while,
  • sentencia goto,
  • compiladores,
  • declaración de variables,
  • función scanf,
  • arrays,
  • comprobaciones de límites
0% encontró este documento útil (0 votos)
31 vistas9 páginas

Herramientas de Traducción en Programación C

Este documento contiene preguntas sobre traducción de programas a lenguaje máquina y herramientas como ensambladores y compiladores. También cubre temas como directivas, tipos de datos, conversiones y especificaciones de formato.

Cargado por

Wendy Gatica
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Temas abordados

  • directiva include,
  • conversiones de tipos,
  • ficheros de cabecera,
  • estructura do-while,
  • sentencia goto,
  • compiladores,
  • declaración de variables,
  • función scanf,
  • arrays,
  • comprobaciones de límites

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

Common questions

Con tecnología de IA

Una secuencia de escape en C está formada por el carácter '\' seguido de una letra o combinación de dígitos que permite representar caracteres especiales o realizar acciones como nueva línea, tabulaciones, y referencias a caracteres no imprimibles. Por ejemplo, '\n' corresponde a nueva línea y '\t' a tabulador horizontal .

En C, el tipo 'char' usa 1 byte de memoria, 'int' varía entre 2 y 4 bytes dependiendo del compilador y arquitectura, mientras que 'double' siempre usa 8 bytes, ofreciendo más capacidad de almacenamiento para representar números de coma flotante de doble precisión .

'scanf()' al leer una cadena (%s) solo captura hasta el primer espacio en blanco, lo que puede llevar a lecturas incompletas como en 'Maxi Garcia', donde solo se leerá 'Maxi'. Para solucionar esto, se puede usar 'scanf("%[^ ]")' para indicar que debe leer hasta encontrar un salto de línea .

La estructura 'switch' evalúa una expresión y selecciona el bloque de código que coincida con el valor de la expresión, siendo ideal para múltiples comparaciones discretas. 'if-else' condicional evalúa booleanos, generalmente usado cuando se involucran condiciones complejas. 'switch' es más eficiente para evaluar múltiples valores constantes de una misma variable .

'typedef' permite redefinir tipos de variable a partir de los fundamentales; en caso de que estos varíen en otra instalación, solo será necesario actualizar la declaración 'typedef', garantizando así la portabilidad del código entre distintas plataformas .

Una 'especificación de formato' indica el tipo de dato que una función va a recibir o mostrar. En 'printf' o 'scanf', ejemplos incluyen '%d' para enteros con signo en base 10, '%f' para números con decimales, '%s' para cadenas de caracteres, y '%x' para enteros sin signo en base 16 .

La conversión implícita es realizada automáticamente por el compilador, pasando los operandos a un tipo de mayor precisión. Por ejemplo, en 'd = a + b/c;' si 'b' es 'int' y 'c' es 'float', 'b' se convierte implícitamente a 'float' . La conversión explícita se realiza usando un 'cast', que convierte una expresión al tipo especificado. Por ejemplo, 'sqrt((double)(n+2))' convierte a 'double' explícitamente .

Definir constantes es importante porque facilita la modificación del programa; permite cambiar parámetros constantes que se repiten a lo largo del código sin revisar cada instancia, mejorando la mantenibilidad del programa .

Las variables globales se declaran fuera de cualquier bloque y son accesibles desde cualquier parte del archivo, mientras que las variables locales se declaran dentro de un bloque y solo son accesibles dentro de ese bloque . Una desventaja de las variables globales es que su valor puede ser modificado por otras funciones o bloques del programa, lo que puede conducir a errores difíciles de rastrear .

Los ensambladores requieren escribir programas en lenguaje ensamblador, utilizando códigos nemotécnicos que instruyen al hardware sobre las operaciones a realizar, mientras que los compiladores permiten escribir programas en lenguajes de alto nivel, más cercanos a lenguajes humanos, y luego los traducen a lenguaje máquina; sin conocimiento de la estructura del procesador, se requieren programas adicionales como el enlazador . Los intérpretes también permiten escritos en lenguajes de alto nivel pero, a diferencia de los compiladores, traducen y ejecutan simultáneamente cada sentencia del programa, facilitando la depuración pero con una ejecución más lenta .

También podría gustarte