Está en la página 1de 37

CONCEPTOS

1 BÁSICOS
APUNTES DE PROGRAMACIÓN I -2-

1.1. COMPUTADORA

Una computadora es un sistema capaz de almacenar y procesar con gran


rapidez una gran cantidad de datos con el objetivo de producir información.

Las computadoras modernas tienen también una gran capacidad de conectarse en


red para comunicarse entre sí, intercambiando mensajes y archivos, o compartir
recursos tales como tiempo de CPU, impresoras, lectores de CD-ROM, escáneres,
etc. En la actualidad, estas redes de computadoras tienen cobertura realmente
mundial, y pasan por encima de fronteras, de continentes, e incluso de marcas y
modelos de computadora.

El hardware es el conjunto de componentes físicos de una computadora, que


realizan las 4 actividades fundamentales de un sistema de computación: entrada,
procesamiento, salida y almacenamiento.

MEMORIA
PRINCIPAL

UNIDAD DE
CONTROL

UNIDAD DE UNIDAD DE
ENTRADA SALIDA
UNIDAD
ARITMETICO-
LOGICA

CPU

UNIDAD DE
ALMACENAMIENTO

Figura 1. Arquitectura de una Computadora

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I -3-

1.1.1. UNIDAD DE ENTRADA


Dispositivos que permiten ingresar datos al sistema. Se pueden mencionar entre
otros: teclado, mouse, escáner, lector óptico, micrófonos, cámaras fotográficas y
de video, etc.

1.1.2. UNIDAD CENTRAL DE PROCESAMIENTO


El CPU (Central Proccessing Unit) es el responsable de controlar el flujo de datos
(Entrada y Salida) y de la ejecución de las instrucciones de los programas; realiza
todos los cálculos aritméticos y compara números y caracteres. Es el cerebro de la
computadora: Supervisa la ejecución de los programas; coordina y controla al
sistema de cómputo, es decir, determina qué instrucción se debe ejecutar y pone a
disposición los datos pedidos por la instrucción; determina dónde se almacenan
los datos y los transfiere desde las posiciones donde están almacenados, etc.

1.1.2.1. MEMORIA PRINCIPAL

Constituye un almacenamiento temporal para programas y datos. Todos los


programas y datos deben transferirse a la memoria desde un dispositivo de
entrada o desde el almacenamiento secundario antes de que los programas
puedan ejecutarse o procesarse los datos. Las computadoras usan 2 tipos de
memoria:

 ROM (Read Only Memory: Memoria de sólo lectura), en la cual se almacenan


ciertos programas e información que necesita la computadora, las cuales están
grabadas permanentemente y no pueden ser modificadas por el programador.
Las instrucciones básicas para arrancar una computadora están grabadas
aquí.

 RAM (Random Access Memory: Memoria de acceso aleatorio), la utiliza el


usuario mediante sus programas, y es volátil. La memoria del equipo permite
almacenar datos de entrada, instrucciones de los programas que se están
ejecutando en ese momento, los datos resultantes del procesamiento y los
datos que se preparan para la salida. La memoria está subdividida en celdas
individuales cada una de las cuales tiene una capacidad similar para
almacenar datos.

En forma muy simplificada, podemos decir que la memoria está compuesta por
circuitos electrónicos que pueden estar, en un momento dado cerrados o abiertos,
es decir, hay o no hay cierto voltaje. Estos dos estados podemos simbolizarlos
mediante un 0 para el estado cerrado y un 1 para el estado abierto. Esto
constituye el más elemental dato que puede procesar una computadora, y lo
denominamos bit, que viene de la expresión inglesa Binary Digit (dígito binario).

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I -4-

La unión de 8 bits constituye a su vez el byte (Binary Term), que es la mínima


unidad con que se mide la memoria de una computadora, y que representa un
carácter (una letra, un dígito, un signo ortográfico, etc.). Para expresar múltiplos de
esta unidad se utilizan potencias de 2, por tratarse de unidades binarias; así
tenemos el Kbyte, equivalente a 1024 bytes, es decir, 210 bytes; el Megabyte
equivalente a 220 bytes, el Gigabyte equivalente a 230 bytes y el Terabyte que
equivale a 240 bytes. Por supuesto, podemos decir también que un megabyte es
igual a 1024 Kbytes, que un gigabyte es igual a 1024 megabytes, etc.

1.1.4. UNIDAD DE ALMACENAMIENTO

Es un medio de almacenamiento definitivo (no volátil como el de la memoria


RAM). En la actualidad se pueden usar principalmente dos tecnologías para
almacenar información: el almacenamiento magnético y el almacenamiento óptico.
Algunos dispositivos combinan ambas tecnologías.

 Dispositivos de Almacenamiento Magnético: Discos Flexibles, Discos


Duros, Cintas Magnéticas o Cartuchos.

 Dispositivos de Almacenamiento Óptico: Las técnicas de almacenamiento


óptico hacen posible el uso de la localización precisa mediante rayos láser. Los
medios ópticos perforan físicamente la superficie para reflejar o dispersar la luz
del láser. Los principales dispositivos de almacenamiento óptico son: CD-ROM,
CD-R, CD-RW, DVD-R, DVD-RW, etc.

Recientemente han surgido otras formas de almacenamiento que utilizan chips de


memoria RAM, y son conocidos como memoria flash (pen drives, memory stick,
memory cards, etc.) ampliamente utilizados, no sólo para guardar información,
sino para guardar y procesar música, fotografías y videos.

1.1.5. UNIDAD DE SALIDA


Los dispositivos de salida de una computadora se encargan de enviar el resultado
de la información procesada por la computadora, y entre ellos tenemos:

 Monitores: El monitor ó pantalla de vídeo, es el dispositivo de salida más


común. Conforme ha avanzado la tecnología han surgido diferentes modelos:
TTL, monocromático, muy pobre resolución, los primeros no tenían capacidad
de graficar; CGA (Color Graphics Adapter), desplegaba 4 colores, con muy
pobre resolución en comparación a los monitores actuales, hoy en día fuera del
mercado; EGA (Enhanced Graphics Adapter), manejaba una mejor resolución
que el CGA, de 640x350 píxeles. (los píxeles son los puntos de luz con los que
se forman los caracteres y gráficas en el monitor, mientras más píxeles mejor
resolución). Desplegaban 64 colores; VGA (Vídeo Graphics Array), adecuados

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I -5-

para ambiente gráfico por su alta resolución (640x480 píxeles). Pueden llegar
hasta 256,000 colores ó 64 tonalidades de gris dependiendo de la memoria
destinada al dispositivo; SVGA (Super Vídeo Graphics Array), maneja una
resolución más alta (1,024x768), el número de colores desplegables varía
dependiendo de la memoria, pero puede ser mayor que 1 millón de colores;
UVGA (Ultra Vídeo Graphics Array), resolución de 1280 x 1024.

La calidad de las imágenes que un monitor puede desplegar se define más por
las capacidades de la tarjeta controladora de vídeo, que por las del monitor
mismo. El controlador de vídeo es un dispositivo intermediario entre el CPU y
el monitor. El controlador contiene la memoria y otros circuitos electrónicos
necesarios para enviar la información al monitor para que la despliegue en la
pantalla.

 Impresoras: Dispositivo que convierte la salida de la computadora en


imágenes impresas. Las impresoras se pueden dividir en 2 tipos: las de
impacto y las de no impacto.

 Impresoras de Impacto: utilizan un mecanismo de impresión que hace


impactar la imagen del carácter en una cinta y sobre el papel. Las
impresoras de línea, de matriz de punto y de rueda de margarita son
ejemplos de impresoras de impacto.

 Impresoras sin Impacto: Hacen la impresión por diferentes métodos, pero


no utilizan el impacto. Son menos ruidosas y con una calidad de impresión
notoriamente mejor a las impresoras de impacto. Los métodos que utilizan
son los siguientes: Térmicas, los caracteres son formados marcando
puntos por quemadura de un papel especial; Impresora de Inyección de
Tinta: Emite pequeños chorros de tinta desde cartuchos desechables hacia
el papel; Láser, crean letras y gráficas mediante un proceso de fotocopiado.
Un rayo láser traza los caracteres en un tambor fotosensible, después fija el
tóner al papel utilizando calor.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I -6-

1.2. PROGRAMA
Un programa es un conjunto de instrucciones, escritas en un determinado
lenguaje, que permite realizar una tarea dada con la computadora.

Las instrucciones, así como los datos, que un procesador digital es capaz de
entender están constituidas por conjuntos de unos y ceros, es decir, bits. A esto se
llama Lenguaje de Máquina, y es muy difícil de manejar por los seres humanos.
Por ello, se comenzaron a desarrollar los llamados Lenguajes de Alto Nivel (tales
como Fortran, Cobol, BASIC, Pascal, C, C++, Java, etc.), que están mucho más
cerca del lenguaje natural. Cada lenguaje dispone de una sintaxis o conjunto de
reglas con las que se indica de modo inequívoco las operaciones que se quiere
realizar.

Los lenguajes de alto nivel son más o menos comprensibles para el usuario, pero
no para el procesador. Para que éste pueda ejecutarlos es necesario traducirlos a
su propio lenguaje de máquina. Esta es una tarea que realiza un programa
especial llamado compilador, que traduce el programa a lenguaje de máquina.
Esta tarea se suele descomponer en dos etapas, que se pueden realizar juntas o
por separado. El programa escrito, con la ayuda de un editor, en un lenguaje de
alto nivel se suele almacenar en uno o más archivos llamados programa fuente,
que en casi todos los sistemas operativos se caracterizan por una terminación
especial, también llamada extensión. Así, todos los programas fuente de C deben
terminar por .c; ejemplos de nombres de estos ficheros son calculos.c, derivada.c,
etc.

La tarea del compilador es realizar una traducción directa del programa fuente al
lenguaje de máquina de la computadora, produciendo un programa objeto con el
mismo nombre que el archivo original, pero con la extensión .obj. En una segunda
etapa se realiza el proceso de montage (linkage) con un programa llamado
enlazador, que incorpora las funciones estándar utilizadas por el programa fuente
y que pertenecen a la así llamada biblioteca del sistema, con el objetivo de
producir un programa ejecutable en lenguaje de máquina. En un PC con sistema
operativo Windows el programa ejecutable se guarda en un fichero con extensión
.exe. Este fichero es cargado por el sistema operativo en la memoria RAM cuando
el programa va a ser ejecutado.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I -7-

Programador EDITOR

Programa
Fuente
*.cpp
Errores

COMPILADOR

Programa
Objeto
*.obj

Biblioteca ENLAZADOR

Programa
Ejecutable
*.exe

Figura 2. Proceso de creación de un programa

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I -8-

1.3. DATOS Y ALGORITMOS


Un programa es muy semejante a una receta de cocina, la cual está compuesta
por dos partes: ingredientes y preparación. Los ingredientes pueden ser de
distintos tipos: carnes, hortalizas, especias, salsas, condimentos, etc. La
preparación es un algoritmo, término que definiremos más adelante y que es
fundamental en la programación. Un programa también utiliza algoritmos, pero sus
ingredientes son los datos, los cuales también son de diferentes tipos.

Para entender lo que es un dato, debemos definir primero algunos conceptos: una
entidad es un objeto, físico o abstracto, que puede distinguirse de los demás; son
entidades una persona, un libro, un carro, una cuenta bancaria, un país, etc. Para
distinguir una entidad de otra apelamos a algunas características especiales a las
que llamaremos atributos o propiedades que en el caso de las personas podrían
ser nombre, cédula, edad, peso, estatura, nacionalidad, etc. Y tratándose de un
carro, marca, modelo, placas, año, color, entre otras.

Si varias entidades tienen los mismos atributos, se habla entonces de un conjunto


de entidades, por ejemplo el conjunto de personas, el conjunto de libros, el
conjunto de carros, etc. Dentro de un conjunto de entidades dado también
podemos hacer distinciones porque cada atributo está asociado con un valor, el
cual será de cierto tipo, y así dos personas cualesquiera tienen el atributo nombre,
pero mientras una puede tener asociado a nombre el valor María, la otra tiene
asociado, por ejemplo, Pedro.

Un dato es una representación simbólica (numérica, alfabética, etc.), que


representa un valor asociado con un atributo de una entidad determinada. El dato
no tiene valor semántico (sentido) en sí mismo, pero convenientemente procesado
se puede utilizar en la realización de cálculos o toma de decisiones. En
programación un dato es la expresión general que describe las características de
las entidades sobre las cuales opera un algoritmo.

Ejemplos de datos son: la edad de una persona, el precio de un artículo, el saldo


de una cuenta bancaria, el número de habitantes de un país, etc. La información
representa un conjunto de datos relacionados que constituyen una estructura de
mayor complejidad, y que provoca en el receptor una reacción y le permite tomar
una decisión. Un dato por sí mismo no constituye información, es el procesamiento
de los datos lo que nos proporciona información.

DATOS PROGRAMA INFORMACIÓN

Figura 3. Datos e Información

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I -9-

Un algoritmo es un conjunto ordenado y finito de operaciones que permite hallar


la solución de un problema. El término algoritmo no está exclusivamente
relacionado con la matemática o las ciencias de la computación. En la vida
cotidiana se emplean algoritmos en multitud de ocasiones para resolver diversos
problemas. Algunos ejemplos son el uso de una lavadora, la preparación de una
receta de cocina, el cambio de un neumático de un carro, etc. También existen
ejemplos de índole matemática, como el algoritmo de la división para calcular el
cociente de dos números, el algoritmo de Euclides para calcular el máximo común
divisor de dos enteros positivos, o el método de Gauss para resolver un sistema
de ecuaciones

El científico de computación Donald Knuth, ofreció una lista de cinco propiedades


que son ampliamente aceptadas como requisitos para un algoritmo:

 Finito. Un algoritmo siempre debe terminar después de un número finito de


pasos.

 Precisión. Cada paso de un algoritmo debe estar precisamente definido; las


operaciones se deben llevar a cabo en un orden determinado.

 Entrada. Un algoritmo tiene cero o más entradas: cantidades que le son dadas
antes de que el algoritmo comience, o dinámicamente mientras el algoritmo
corre. Estas entradas son tomadas de conjuntos específicos de objetos.

 Salida. Un algoritmo tiene una o más salidas, las cuales tienen una relación
específica con las entradas.

 Eficacia. Todas las operaciones a realizar en un algoritmo deben ser


suficientemente básicas como para que en principio puedan ser hechas de
manera exacta y en un tiempo finito por un hombre usando lápiz y papel.

Los algoritmos pueden ser expresados de muchas maneras incluyendo al lenguaje


natural, pseudocódigo, diagramas de flujo y lenguajes de programación. Las
descripciones en lenguaje natural tienden a ser ambiguas y extensas. El usar
pseudocódigo y diagramas de flujo evita muchas ambigüedades del lenguaje
natural. Dichas expresiones son formas más estructuradas para representar
algoritmos, no obstante, se mantienen independientes de un lenguaje de
programación específico.

Un diagrama de flujo es la representación gráfica de un proceso. Un diagrama de


flujo tiene como objetivo facilitarnos la comprensión de un algoritmo o simplificar el
análisis de un proceso. El diagrama de flujo consta de símbolos como cuadros,
rombos, óvalos, etc. que representan a cada uno de los pasos a seguir durante un
proceso. Estos símbolos están conectados por flechas de un solo sentido y nos
indican la secuencia en que se van desarrollando las distintas tareas.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 10 -

Los diagramas facilitan la comprensión de métodos de solución para problemas


matemáticos y lógicos, permitiendo a los estudiantes abstraerse de un lenguaje
determinado y enfocarse en el procedimiento de solución. De este modo, la
posterior etapa de codificación se simplifica enormemente al tener ya resuelta la
metodología a través de un diagrama de flujo. Existen diferentes símbolos
utilizados en la diagramación, de los cuales podemos destacar cinco símbolos
básicos con los cuales se puede representar prácticamente cualquier algoritmo
informático por muy complejo que éste sea.

 El diagrama puede desarrollarse en cualquier dirección, sin embargo es


aconsejable que el desarrollo se realice en lo posible de arriba hacia abajo y de
izquierda a derecha.
 Debe procurarse que el símbolo de inicio se encuentre en la parte superior o
superior-izquierda del diagrama.
 El final se debe procurar que quede en la parte inferior o inferior-derecha. Si
esto no es posible, debe separarse ligeramente del cuerpo del diagrama a fin
de que sea fácilmente identificado.
 Se pueden utilizar palabras para especificar la acción dentro del símbolo como
es el caso de “Introducir A y B”, aunque esto es innecesario ya que con poner
simplemente “A, B” se sobreentiende. Es el mismo caso de poner “Comparar si
A > B” o simplemente “A > B”.
 Es válido hacer que dos flechas apunten a un símbolo, aunque es más estético
hacer que la segunda flecha apunte a la primera que si está apuntando al
símbolo.

INICIO

N 1

N N+1

F
N > 10

FIN
Figura 4. Algoritmo para sumar los números de 1 al 10
(Diagrama de Flujos)

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 11 -

Inicio/Fin. Señala el comienzo o el final de un


diagrama. Se colocan las palabras INICIO ó FIN
dentro de la figura para hacerlo más explícito.

Entrada. Indica la entrada de datos,


generalmente por el teclado, pero también por
algún otro dispositivo.

Proceso. Señala operaciones matemáticas,


aritméticas o procesos específicos que se realicen
con nuestros datos.

Decisión. Representa una disyuntiva lógica o


decisión. En su interior se anota una expresión
que pueda ser evaluada como verdadera o falsa y
que determina el flujo del programa.

Salida. Muestra un resultado, el cual puede


representar la solución al problema que se
pretende resolver y que fue conseguida a través
del resto del diagrama.

Conector. Se utiliza para indicar un salto dentro


del diagrama. Se utiliza con el propósito de facilitar
la disposición plana de un diagrama y evitar el
cruce excesivo de líneas a través del mismo. El
círculo conecta a otra parte del diagrama en la
misma página, mientras el pentágono lo hace
hacia otra página.

Tabla 1. Símbolos de los Diagramas de Flujo

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 12 -

LENGUAJE C
2 ELEMENTOS
NERIO VILLALOBOS FINOL
APUNTES DE PROGRAMACIÓN I - 13 -

2.1. Historia
El lenguaje de programación C fue creado por Dennis Ritchie entre en 1973
cuando trabajaba en Bell Laboratories de la corporación AT&T junto con Ken
Thompson en el diseño del sistema operativo UNIX. C fue creado para poder
escribir dicho sistema operativo en un lenguaje de alto nivel, independiente del
hardware donde se ejecutara. Su evolución ha sido así:

 A mediados de los años 60s, Martin Richards diseña el lenguaje BCPL con la
finalidad de usarlo para escribir software de sistemas operativos y
compiladores.

 En 1969 Ken Thompson escribe el Lenguaje B, en Bell Laboratories, con el


objetivo de recodificar UNIX (escrito hasta ese momento en lenguaje
ensamblador) usando un lenguaje de alto nivel más portable y flexible.

 En 1972, Dennis Ritchie modifica el lenguaje B, creando el lenguaje C y


reescribiendo el sistema UNIX en dicho lenguaje; añade características
nuevas: diseño de tipos y estructuras de datos.

 1983 ANSI (American National Standars Institute) estandariza C.

 En 1983/84, "C con Clases", lenguaje C++. C++ queda disponible en 1985,
Creado por Bjarne Stroustrup (en Bell Laboratories).

2.2. Características del Lenguaje C


 C es un lenguaje para la programación estructurada.
 Un programa en C es una colección de funciones, que pueden devolver un
valor o no, y que se encuentran distribuidas en varios archivos o módulos.
 Entre todas las funciones, debe existir una llamada main que constituye la
función principal.
 Permite escribir operaciones relativamente complejas de forma sencilla y
concisa.
 Contiene muy pocas palabras reservadas. No contiene órdenes para trabajar
con objetos compuestos (cadenas, arrays o arreglos o registros).
 Tampoco tiene instrucciones propias para la asignación dinámica de memoria
ni instrucciones de entrada/salida. Todas estas operaciones de alto nivel
pueden ser realizadas por funciones llamadas explícitamente.
 Distingue entre mayúsculas y minúsculas.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 14 -

2.3. TIPOS DE DATOS


Cuando en C se dice que un objeto es de un tipo, se quiere decir que ese objeto
pertenece a un conjunto específico de valores con los cuales se pueden realizar
un conjunto de operaciones específicas.

Escoger el tipo de dato adecuado para cada variable es una de las primeras
tareas que realizamos al programar. Una selección equivocada puede provocar
resultados con fallas de precisión o exactitud, que no siempre somos capaces de
determinar al observarlos. Al modelar datos a partir de objetos o conceptos del
mundo real, hay que detenerse a observar ciertas características de los mismos y
decidir aspectos como si son números o cadenas de caracteres; si es un entero o
un número real; cuantos dígitos de precisión se requieren; cual es el dominio de
valores permitidos; si puede ser negativo o no; etc.

En C existen cinco tipos básicos:

 char. Un carácter (letra, dígito, signo de puntuación, etc.) definidos en el


código ASCII.

 int. Un número entero

 float. Un número real (de coma flotante como se prefiere decir en ciencia e
ingeniería) con una precisión de 7 dígitos aproximadamente.

 double. Número real con 16 dígitos de precisión

 void. Sin tipo, usado para propósitos especiales.

Pero en el lenguaje C contamos también con los modificadores de tipo que


permiten ampliar el rango de tipos. Estos modificadores de tipo son:

 short . Aplicado a int y significa “pequeño”

 long. Aplicado a int y double, y significa “grande”

 signed. Aplicado a char, int, short y long, y significa “con signo”

 unsigned. Aplicado a char, int, short y long, y significa “sin signo”

El tamaño y el rango de estos tipos de datos varían con cada tipo de procesador y
con la implementación del compilador de C. El tipo void, o bien declara
explícitamente una función que no devuelve valor alguno, o bien crea punteros
genéricos.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 15 -

La siguiente tabla muestra todas las combinaciones que se ajustan al estándar


ANSI C junto con sus rangos mínimos y longitudes aproximadas en bits.

Tipo Bytes Rango


char 1 Carácter ASCII
int 2 -32768 … 32768
unsigned char 1 0 … 255
signed char 1 -128 … 127
unsigned int 2 0 … 65535
signed int 2 -32768 … 32767
short int 2 -32768 … 32767
unsigned short 2 0 … 65535
signed short int 2 -32768 … 32767
long int 4 -2147483647 … 2147483647
unsigned long int 4 0 … 4294967295
float 4 3.4x1038 (7 dígitos)
double 8 1.7x10308 (16 dígitos)
long double 12 3.4x104932 (20 dígitos)
Tabla 2. Tipos de datos en C

Hay que advertir, sin embargo, que en muchos casos, que depende del
procesador, sistema operativo o compilador utilizado, los tipos int y unsigned int se
almacena en 4 bytes, por lo que su rango de valores son iguales al de los tipos
long int y unsigned long int, respectivamente. Por tanto, se recomienda verificar
esto en el compilador que utilice.

Por otro lado, en el lenguaje C no se hace una verificación estricta de


compatibilidad de tipos de datos, por lo que se puede asignar, por ejemplo, un
dato de entero a una variable real; pero, por supuesto, esto puede traer problemas
de truncamiento e impresiones indeseadas, tal como veremos más adelante. Así
podemos tener el siguiente caso:

int n;
char c;
n = ‘A’; c = 65;
printf(“El carácter %c tiene código ASCII %d\n”, n, n);
printf(“El carácter %c tiene código ASCII %d\n”, c, c);

Las 2 líneas impresas mostrarán:

El carácter A tiene código ASCII 65

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 16 -

2.4. ELEMENTOS SINTÁCTICOS


Existen seis clases de componentes sintácticos en el vocabulario del lenguaje C:
palabras clave, identificadores, constantes, cadenas de caracteres, operadores y
separadores.

2.4.1. PALABRAS CLAVE


Las palabras clave se utilizan para indicar al computador que realice una tarea
muy determinada y tienen un especial significado para el compilador. Con ellas se
construyen las sentencias de un programa. El C es un lenguaje muy conciso, con
muchas menos palabras clave que otros lenguajes. A continuación se presenta la
lista de las 32 palabras clave del ANSI C, para las que más adelante se dará su
significado detallado.

auto double int struct


break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
Tabla 3. Palabras clave en C

Las palabras clave deben escribirse siempre en minúsculas. En C las mayúsculas


y las minúsculas son diferentes: else es una palabra clave; ELSE no.

2.4.2. IDENTIFICADORES

Un identificador es un nombre creado por el programador y se usa para


referenciar variables, funciones, etiquetas y otros objetos definidos en un
programa. Cada lenguaje tiene sus propias reglas respecto a la formación de
identificadores. En ANSI C estas reglas son las siguientes:

1. Un identificador se forma con una secuencia de letras del alfabeto ingés


(minúsculas de la a a la z; mayúsculas de la A a la Z; y dígitos del 0 al 9).

2. El carácter subrayado ( _ ) se considera como una letra más.

3. Un identificador no puede contener espacios en blanco, ni otros caracteres


distintos de los citados, por ejemplo (* , ; . : - + , etc.).

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 17 -

4. El primer carácter de un identificador debe ser siempre una letra o un ( _ ), es


decir, no puede ser un dígito.

5. Se hace distinción entre letras mayúsculas y minúsculas. Así, Masa es


considerado como un identificador distinto de masa y de MASA.

6. ANSI C permite definir identificadores de hasta 31 caracteres de longitud.

Ejemplos de identificadores válidos son los siguientes: tiempo, distancia1, casoA,


PI, velocidad_de_la_luz y SueldoBasico. Por el contrario, los siguientes nombres
no son válidos: 1_valor, tiempo-total, dolares$, y %final.

Se recomienda escoger muy bien los identificadores de variables, constantes,


funciones y etiquetas, procurando que sean lo suficientemente significativos y
legibles, utilizando adecuadamente las mayúsculas y minúsculas; por ejemplo, es
preferibles utilizar NombreEmpleado que nombreempleado, NOMBREEMPLEADO
o nombre, nom, o peor aún Ne.

2.3.3. CONSTANTES

Las constantes son valores que no cambian durante la ejecución de un programa.


Un ejemplo típico es el número PI, que vale 3.141592654. Este valor, con más o
menos cifras significativas, puede aparecer muchas veces en las sentencias de un
programa. En C existen distintos tipos de constantes:

 Constantes numéricas. Son valores numéricos con signo o sin signo, enteros
o de punto flotante. Pueden usarse prefijos o sufijos para indicar explícitamente
el tipo o la base numérica de un número (decimal, octal o hexadecimal).
Ejemplos: 15400 (int), -350 (int), 572L (long), 063 (octal), 0x9f (hexadecimal),
0xa2e4 (hexadecimal), 0xffL (hexadecimal long). Igualmente pueden
expresarse en notación exponencial o científica: 1.25e-05 o 6.02e+23.

 Constantes carácter. Cualquier carácter individual encerrado entre apóstrofos


(tal como 'a', 'Y', ')', '+', etc.) es considerado por C como una constante
carácter. El código ASCII establece una equivalencia entre cada carácter y un
valor numérico correspondiente. Se incluyen en esta categoría una serie de
caracteres de control, o sea, caracteres no imprimibles sino que realizan una
acción como puede ser un retorno de carro, un retroceso o una tabulación,
incluyendo al carácter nulo. Se representan con un símbolo \ seguido de una
letra o número encerrados entre apóstrofos. A estos caracteres se les
denomina secuencia de escape.

 Cadenas de caracteres. Una cadena es un conjunto de caracteres encerrados


entre comillas; ejemplo: "espacio", "Esto es una cadena de caracteres", etc.
Nótese que ‘A’  “A”; el primer valor es un carácter, el segundo una cadena.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 18 -

Código Significado
\a Alerta (campana)
\b Retroceso
\f Salto de página
\n Nueva línea
\r Retorno de carro
\t Tabulación horizontal
\v Tabulación vertical
\0 Carácter nulo (ASCII)
\ddd Constante octal (d = dígito)
\xddd Constante hexadecimal
\\ Barra invertida (\)
Tabla 4. Secuencias de Escape ASCII

2.2.4. OPERADORES

Los operadores son signos especiales (a veces, conjuntos de dos caracteres) que
indican determinadas operaciones a realizar con las variables y/o constantes
sobre las que actúan en el programa. El lenguaje C es particularmente rico en
distintos tipos de operadores: aritméticos, relacionales, lógicos, binarios y de
asignación.

ARITMÉTICOS RELACIONALES
+ Suma == Igual
- Resta > Mayor
* Multiplicación < Menor
/ División >= Mayor o igual
% Módulo (Residuo) <= Menor o igual
!= Diferente
LÓGICOS BINARIOS
&& Conjunción (Y) – AND & AND binario
|| Disyunción (O) – OR | OR binario
! Negación (NO) - NOT ^ XOR binario
NOT binario
~
(Complemento a 1)
Desplazamiento a la
<<
izquierda
Desplazamiento a la
>>
derecha
Tabla 5. Operadores de C

De los operadores aritméticos hay que hacer referencia en particular de los


correspondientes a la división (/ y %). El primero obtiene el cociente de la división,

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 19 -

pero si los dos operandos son enteros el resultado será entero, es decir, sin la
parte fraccionaria. Mientras que el operador %, el cual sólo debe aplicarse a
operandos enteros, obtiene el residuo de la división. Ejemplos:

int m = 7, n = 2, a, b;

a = m / n; // a vale 3
b = m % n; // b vale 1

En cuanto a los operadores relacionales hay que decir que el resultado de dichas
operaciones es de tipo lógico, es decir, sus posibles valores son 0 (falso) y 1
(verdadero). Ejemplos:

int m = 5, n = 3, a, b, c;

a = m > n; // a vale 1
b = n >= 3 // b vale 1
c = m == n; // c vale 0

Los operadores lógicos comparan dos valores lógicos (falso o verdadero) y su


resultado, por supuesto, también será lógico. Los posibles resultados de una
operación lógica los obtenemos mediante las denominadas Tablas de Verdad, las
cuales presentamos a continuación:

p && q p || q p !p
0 0 0 0 0 0 0 1
1 0 0 1 1 0 1 0
0 0 1 0 1 1
1 1 1 1 1 1

donde p y q representan expresiones lógicas.

El uso de los operadores relacionales y lógicos, adquiere especial importancia en


la evaluación de expresiones lógicas en las sentencias if, while, do-while y for,
las cuales se verán más adelante.

2.2.5. DELIMITADORES
Los delimitadores están constituidos por uno o varios espacios en blanco,
tabuladores, y caracteres de nueva línea. Su papel es ayudar al compilador a
descomponer el programa fuente en cada uno de sus elementos sintácticos. Es
conveniente introducir espacios en blanco incluso cuando no son estrictamente
necesarios, con objeto de mejorar la legibilidad de los programas.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 20 -

2.2.6. COMENTARIOS
El lenguaje C permite que el programador introduzca comentarios en el código de
su programa fuente que sirven de explicación o aclaración sobre cómo está hecho
el programa, de forma que pueda ser entendido por una persona diferente (o por
el propio programador algún tiempo después). En C se usan los caracteres /* para
iniciar un comentario el cual termina con los caracteres */. Los comentarios son
siempre ignorados por el compilador. Estos símbolos pueden comenzar en una
línea y terminar en otra. Una fuente frecuente de errores al programar en C, es el
olvidarse de cerrar un comentario que se ha abierto previamente.

En el lenguaje C++ se utiliza además otra forma con el símbolo //, el cual inicia un
comentario que finaliza al final de la línea. Para comentarios cortos, esta forma es
más cómoda que la anterior, pues no hay que preocuparse de cerrar el
comentario. Ejemplos:

/* Este comentario está en una sólo línea */

/* Aquí comienza un comentario que ocupa varios líneas


Segunda línea.
Tercera línea. */

x = 25; // Valor inicial de la variable x

El siguiente es un encabezado típico en un programa en C:

/*****************************************/
/* Programa.CPP */
/* Objetivo: Programa que realiza alguna tarea */
/* Autor: Pedro Pérez */
/* Fecha: 21/05/2007 */
/*****************************************/

2.5. VARIABLES
Una variable es un espacio de la memoria donde se almacenan datos que pueden
cambiar durante la ejecución de un programa. Se representa por un nombre y
tiene que señalarse el tipo de datos que puede almacenar. Antes de usarse
cualquier variable en un programa debe declararse su tipo, de la siguiente manera:

tipo variable;

Ejemplo:
int m; // declara a m como una variable de tipo int

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 21 -

2.5.1. ASIGNACIÓN
A una variable se le puede asignar un valor en cualquier lugar del programa
mediante la sintaxis:

variable = expresión;

Una expresión es un conjunto de variables, constantes y funciones relacionadas


mediante distintos operadores; las expresiones pueden contener paréntesis que
agrupan a algunos de sus términos. El significado de los paréntesis coincide con el
habitual en las expresiones matemáticas. Ejemplos:

int a, b, c, n;

a = 25;
b = a;
c = b * 2 + a;
n = sqrt(a) * (b + c);

El operador = se lee “guárdese el resultado de la expresión de la derecha en la


variable de la izquierda”.

En C es necesario declarar todas las variables que se vayan a utilizar. Una


variable no declarada produce un mensaje de error en la compilación. Cuando una
variable es declarada se le reserva memoria de acuerdo con el tipo incluido en la
declaración. Es posible inicializar, o sea, dar un valor inicial, a las variables en el
momento de la declaración; aunque la mayoría de los compiladores dan un valor
inicial por defecto, que en el caso de las variables numéricas será 0, las cadenas
serán vacías (“”) y los caracteres serán nulos (‘\0’).

Un ejemplo de inicialización:

int m = 25, n = 100;


float PI = 3.141592;

2.5.2. CONVERSIONES DE TIPO


El tipo de la expresión debe coincidir con el tipo de la variable en una asignación,
de lo contrario el sistema realiza una conversión implícita. En cuanto a los
operadores aritméticos, la regla es muy sencilla: si los dos operadores son enteros
entonces el resultado es entero; si al menos uno de los operadores es real (punto
flotante), el resultado es real. Otra clase de conversión implícita tiene lugar cuando
el resultado de una expresión es asignado a una variable, pues dicho resultado se
convierte al tipo de la variable. Observe que en el caso de la división esto es
significativo, pues si el resultado es entero y es asignado a una variable real, ese

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 22 -

valor es convertido a real con la parte fraccionaria en cero (0). Veamos los
siguientes ejemplos:

int a = 7, b = 2;
float x = 7.0, y = 2.0, m, n;

m = x / y; // n toma el valor de 3.5
n = a / b; // m toma el valor de 3.0

En C existe también la posibilidad de realizar conversiones explícitas de tipo


(casting). El casting es pues una conversión de tipo forzada por el programador.
Para ello basta preceder la constante, variable o expresión que se desea convertir
por el tipo al que se desea convertir, encerrado entre paréntesis. En el siguiente
ejemplo,

k = 1.7 + (int) masa;

la variable masa es convertida a tipo int. El casting se aplica con frecuencia a los
valores de retorno de las funciones.

2.5.3 CUALIFICADOR const


Se puede utilizar el cualificador const en la declaración de una variable para
indicar que esa variable no puede cambiar de valor. Por ejemplo:

const int K = 10;


const float T = 0.25;

De ordinario se obtendrá un mensaje de error en la compilación si una variable


const figura a la izquierda de un operador de asignación. Darle un nombre a una
constante tiene la ventaja de ser utilizado más de una vez en el programa con
menos posibilidades de errores de transcripción, y además cuando ese valor se
tenga que cambiar sólo se haría en la declaración. Por ejemplo, si un programa de
tipo financiero utiliza la tasa de interés como un elemento de varias fórmulas, lo
más adecuado sería declararla como una constante, de la siguiente manera:

const float TASA = 0.12;

Igualmente se podría hacer lo mismo con el valor de algunas constantes usadas


frecuentemente en la ciencia y la ingeniería, como:

const double PI = 3.1415926535, E = 2.71828182845;


const double GAMMA = 0.577215664; // Constante armónica
const float G = 9.8066; // Constante de la Gravedad

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 23 -

Obsérvese que es costumbre nombre a las constantes con mayúsculas, aunque


esto no es obligado ni mucho menos.

2.5.4. OPERADORES DE ASIGNACIÓN

El operador de asignación más utilizado es el operador de igualdad (=), que no


debe ser confundido con la igualdad matemática. Por ejemplo, en la siguiente
sentencia de asignación

k = k + 1;

desde el punto de vista matemático este ejemplo no tiene sentido, pues si


despejamos a k nos encontraríamos con que 0 = 1 (absurdo). Pero sí lo tiene
considerando que en realidad el operador de asignación (=) representa una
sustitución; en efecto, se toma el valor de k contenido en la memoria, se le suma
una unidad y el resultado vuelve a guardarse en memoria en la zona
correspondiente al identificador k, sustituyendo al valor que había anteriormente.
El resultado ha sido incrementar el valor de k en una unidad.

A la izquierda del operador de asignación (=) no puede haber nunca una


expresión, tiene que ser necesariamente el nombre de una variable. Es incorrecto,
por tanto, escribir algo así como:

a + b = c; // incorrecto

Otra forma de operador tiene la forma siguiente:

Variable op= expresión;

Donde op es un operador cualquiera, especialmente aritmético, como +=, -=, *= y


/=. Estos operadores simplifican algunas operaciones recurrentes sobre una
misma variable. Ejemplos:

n += 1; // Equivale a n = n + 1;
rango /= 2.0 // Equivale a rango = rango /2.0
x *= 3.0 * y - 1.0 // Equivale a x = x * (3.0 * y - 1.0)

Igualmente se pueden concatenar varias asignaciones para iniciar más de una


variable con un mismo valor, según la fórmula:

variable1 = variable2 = variable3 = … variablen = valor;

Ejemplo:

a = b = b = c = d = 1;

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 24 -

2.5.5. OPERADORES INCREMENTALES


Los operadores incrementales (++) y (--) son operadores unarios que
incrementan o disminuyen en una unidad el valor de la variable a la que afectan.
Estos operadores pueden ir inmediatamente delante o detrás de la variable. Si
preceden a la variable, ésta es incrementada antes de que el valor de dicha
variable sea utilizado en la expresión en la que aparece. Si es la variable la que
precede al operador, la variable es incrementada después de ser utilizada en la
expresión. A continuación se presenta un ejemplo de estos operadores:

a = 2; b = 3; c = 4;
b++: // b pasa a ser 4
--c; // c pasa a ser 3
m = a++; // al ejecutarse esta sentencia m = 2, a=3
n = ++a; // al ejecutarse esta sentencia n = 3, a=3

Hay que tener cuidado cuando utilicemos los operadores incrementales ya que al
efectuarse una asignación junto con un incremento, uno se efectúa primero que el
otro dependiendo de si usamos un preincremento (++variable) o un posincremento
(variable++), como vemos en las dos últimas operaciones del ejemplo anterior.

Veamos otro caso:

x = y = 5;
a = ++x;
b = y++;

Después de efectuadas estas sentencias la variable a vale 6, pero b vale 5. En


todo caso, tanto x como y valen 6.

2.5.6. EVALUACIÓN DE EXPRESIONES


Como ya hemos visto, una expresión es una combinación de variables y/o
constantes, y operadores. La expresión es equivalente al resultado que
proporciona al aplicar sus operadores a sus operandos. Una expresión puede
estar formada por otras expresiones más sencillas, y puede contener paréntesis
de varios niveles agrupando distintos términos.

En C existen distintos tipos de expresiones. Por ejemplo, la solución de la


ecuación de segundo grado:

-b +  b2 – 4ac
x=
2a

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 25 -

se escribe, en C en la forma:

x = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);

Con los operadores relacionales y lógicos se forman expresiones cuyos resultados


son de tipo lógico. Ejemplos:

int a = 10, b = 5, c = 2, m, n;

m = ( (a > 0) && (b < 10) ); // m vale 1
n = ( (a == b * 2) || (b != c) ); // n vale 1

Recuérdese que el resultado de una expresión lógica es siempre un valor


numérico (un 1 ó un 0); esto permite que cualquier expresión lógica pueda
aparecer como sub-expresión en una expresión aritmética. Recíprocamente,
cualquier valor numérico puede ser considerado como un valor lógico: verdadero
si es distinto de 0 y falso si es igual a 0. Esto permite introducir cualquier expresión
aritmética como sub-expresión de una expresión lógica. Por ejemplo:

(a - b * 2.0) && (c != d)

2.5.7. REGLAS DE PRIORIDAD DE OPERADORES


El resultado de una expresión depende del orden en que se ejecutan las
operaciones. El siguiente ejemplo ilustra claramente la importancia del orden.
Considérese la expresión:

3+4*2

Si se realiza primero la suma (3 + 4) y después el producto (7 * 2), el resultado es


14; si se realiza primero el producto (4 * 2) y luego la suma (3 + 8), el resultado es
11. Con objeto de que el resultado de cada expresión quede claro e inequívoco, es
necesario definir las reglas que definen el orden con el que se ejecutan las
expresiones de C.

Existe dos tipos de reglas para determinar este orden de evaluación: las reglas de
prioridad Además, el orden de evaluación puede modificarse por medio de
paréntesis, pues siempre se realizan primero las operaciones encerradas en los
paréntesis más interiores.

Los distintos operadores de C se ordenan según su distinta precedencia o


prioridad; para operadores de la misma precedencia o prioridad, en algunos el
orden de ejecución es de izquierda a derecha, y otros de derecha a izquierda (se

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 26 -

dice que se asocian de izquierda a derecha, o de derecha a izquierda). A este


orden se le llama asociatividad.

En la tabla de abajo se muestra la precedencia, disminuyendo de arriba abajo, y la


asociatividad de los operadores de C. En dicha tabla se incluyen también algunos
operadores que no han sido vistos hasta ahora.

Precedencia Asociatividad
( ) [ ] -> . Izquierda a Derecha
++ -- ! - y + unarios * y & Derecha a Izquierda
* / % Izquierda a Derecha
+ - Izquierda a Derecha
< <= > >= Izquierda a Derecha
== != Izquierda a Derecha
&& Izquierda a Derecha
|| Izquierda a Derecha
?: Derecha a Izquierda
= += -= *= /= Derecha a Izquierda
, (operador coma) Izquierda a Derecha
Tabla 6. Orden de Precedencia y Asociatividad

Eso quiere decir que la expresión

a – b + d * 5.0 + u / 2.0

equivale a

(((a - b) + (d * 5.0)) + (u / 2.0))

El orden de evaluación es el indicado por los paréntesis. Las últimas operaciones


en ejecutarse son las de los paréntesis más exteriores.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 27 -

2.6. FUNCIONES DE ENTRADA/SALIDA


Las funciones de entrada/salida son un conjunto de funciones, contenidas en la
biblioteca estándar, que permiten a un programa recibir y enviar datos al exterior.
Para su utilización es necesario incluir al comienzo del programa el archivo de
cabecera en el que están definidos sus prototipos, como stdio.h o conio.h.
Ejemplo: #include <stdio.h>

2.6.1. FUNCIÓN printf()


La función printf() escribe en la unidad de salida (el monitor, por defecto) el texto, y
las constantes y variables que se indiquen. La forma general de esta función se
puede estudiar viendo su prototipo:

int printf("cadena_de_control", tipo arg1, tipo arg2, ...)

La función printf(), definida en el archivo de cabecera stdio.h, escribe el texto


contenido en cadena_de_control junto con el valor de los otros argumentos, de
acuerdo con los formatos incluidos en cadena_de_control. Los puntos suspensivos
(...) indican que puede haber un número variable de argumentos. Cada formato
comienza con el carácter (%) y termina con un carácter de conversión.
Considérese el ejemplo siguiente:

double tiempo;
float masa;

printf("En el instante %lf la masa vale %f\n", tiempo, masa);

en el que se imprimen 2 variables (tiempo y masa) con los formatos (%lf y %f),
correspondientes a los tipos double y float, respectivamente. La cadena de control
se imprime con el valor de cada variable intercalado en el lugar del formato
correspondiente.

Carácter Tipo de dato Carácter Tipo de Dato


d, i int decimal 0 Octal sin signo
u unsigned int x, X Hexadecimal sin signo
c char s Cadena de caracteres
f float e, g float en notación científica
lf double p Apuntador
h short int ld long int

Tabla 7. Códigos de Formato de la función printf

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 28 -

Lo importante es considerar que debe haber correspondencia uno a uno (el 1º con
el 1º, el 2º con el 2º, etc.) entre los formatos que aparecen en la cadena de control
y los otros argumentos (constantes, variables o expresiones). Entre el carácter % y
el carácter de conversión puede haber, por el siguiente orden, uno o varios de los
elementos que a continuación se indican:

 Un número entero positivo, que indica la anchura mínima del campo en


caracteres.

 Un signo (-), que indica alineamiento por la izquierda (el defecto es por la
derecha).

 Un punto (.), que separa la anchura de la precisión.

 Un número entero positivo, la precisión, que es el número máximo de


caracteres a imprimir en una cadena, el número de decimales de un float o
double, o las cifras mínimas de un int o long.

 Un cualificador: una (h) para short o una (l) para long y double o una u para
unsigned.

A continuación se incluyen algunos ejemplos de uso de la función printf(). El


primer ejemplo contiene sólo texto, por lo que basta con considerar la cadena de
control.

printf("Yo solo se que no se C.\n Pero aprenderé");

El resultado serán dos líneas de texto. No es posible partir la cadena de control en


varias líneas, por lo que en este ejemplo podría haber problemas para añadir más
líneas. Una forma alternativa, muy sencilla, clara y ordenada, de escribir varias
líneas de texto sería la siguiente:

printf("%s\n%s\n%s\n%s\n", "A programar se aprende programando.",


“C es fácil.”, "Estudiar es la clave.", "Como en todo.");

En este caso se están escribiendo 4 cadenas constantes de caracteres que se


introducen como argumentos, con formato %s y con los correspondientes saltos
de línea. Un ejemplo que contiene una constante y una variable como argumentos
es el siguiente:

printf("El producto de código %d vale Bs. %8.2f\n", 2021, 15200);

donde el número 2021 se imprime como un entero (%d), mientras que 15200 se
imprime con formato float con 8 caracteres de los cuales 2 son para los decimales
(%8.2f). Es importante hacer corresponder bien los formatos con el tipo de los
argumentos, pues si no los resultados pueden ser muy diferentes de lo esperado.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 29 -

2.6.2. FUNCIÓN scanf()


La función scanf() es análoga en muchos aspectos a printf(), y se utiliza para leer
datos de la entrada estándar (que por defecto es el teclado). La forma general de
esta función es la siguiente:

int scanf("%x1%x2...", &arg1, &arg2, ...);

donde x1, x2, ... son los caracteres de formato, mostrados en la Tabla 7, que
representan los formatos con los que se espera encontrar los datos. La función
scanf() devuelve como valor de retorno el número de conversiones de formato
realizadas con éxito. La cadena de control de scanf() puede contener caracteres
además de formatos. Dichos caracteres se utilizan para tratar de detectar la
presencia de caracteres idénticos en la entrada por teclado. Si lo que se desea es
leer variables numéricas, esta posibilidad tiene escaso interés. A veces hay que
comenzar la cadena de control con un espacio en blanco para que la conversión
de formatos se realice correctamente.

En la función scanf() los argumentos que siguen a la cadena de control deben ser
pasados por referencia, ya que la función los lee y tiene que trasmitirlos al
programa que la ha llamado. Para ello, dichos argumentos deben estar
constituidos por las direcciones de las variables en las que hay que depositar los
datos, y no por las propias variables. Una excepción son las cadenas de
caracteres, cuyo nombre es ya de por sí una dirección (un puntero), y por tanto no
debe ir precedido por el operador (&) en la llamada. Ejemplos:

int cantidad;
float precio;
unsigned char edad;

printf(“Cantidad…..: “); scanf(“%d”, &cantidad);
printf(“Precio……...: “); scanf(“%f”, &precio);
printf(“Edad............: “); scanf(“%u”, &edad);

2.6.3. OTRAS FUNCIONES DE ENTRADA/SALIDA

 getch() y getche(): Leen un carácter del teclado sin necesidad de presionar la


tecla Enter. El valor leído puede ser asignado a una variable o simplemente
usarse para detener la ejecución del programa. La diferencia entre ellas es que
getche() muestra el carácter leído en la pantalla, mientras que getch() no lo
hace. Ambas pertenecen al archivo de la biblioteca conio.h. Ejemplos:

ch = getch(); // ch de tipo char


getch(); // espera a que el operador presione una tecla

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 30 -

 putch(): Escribe un carácter en la salida estándar, generalmente la pantalla.


Su prototipo está definido en stdio.h.

 gets(): Lee una cadena de caracteres del teclado. Esta función, a diferencia de
scanf, permite ingresar cadenas con espacios en blanco y otros delimitadores.
El argumento de la función gets es justamente la variable que recibe el valor
ingresado. Pertenece al archivo de cabecera stdio.h. Ejemplo:

char nombre[20];

printf(“Escribe el nombre: “);
gets(nombre);

 getchar() y putchar(): Son macros que permiten respectivamente leer e


imprimir un sólo carácter cada vez, en la entrada o en la salida estándar.
getchar() recoge un carácter introducido por teclado y lo deja disponible como
valor de retorno; putchar() escribe en la pantalla el carácter que se le pasa
como argumento. Ya casi no se usan porque se prefieren getch() y putch().
Ejemplos:

char ch;

putchar(ch); // Equivale a printf(“%c”, ch);

ch = getchar(); // Equivale a scanf("%c", &ch);

Como se ha dicho anteriormente, getchar() y putchar() son macros y no funciones,


aunque para casi todos los efectos se comportan como si fueran funciones. Una
macro representa una sustitución de texto que se realiza antes de la compilación
por medio del preprocesador. Estas macros están definidas en el archivo de la
biblioteca stdio.h.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 31 -

2.7.4. EL PREPROCESADOR
El preprocesador del lenguaje C permite indicar los archivos de la biblioteca a ser
incluidos en el programa, definir macros, realizar compilaciones condicionales,
entre otras cosas. El preprocesador de C reconoce los siguientes comandos:
#include, #define, #undef, #if, #ifdef, #ifndef, #else, #endif, #elif, #pragma, #error

 #include
Cuando en un archivo fuente (*.c, *.cpp) se encuentra una línea con #include
seguido del nombre de un archivo de la biblioteca, el preprocesador incluye su
contenido en ese archivo fuente.
La sintaxis de este comando es la siguiente:

#include "nombre_del_archivo"
o
#include <nombre_del_archivo>

La diferencia entre la primera forma y la segunda estriba en el directorio (carpeta)


de búsqueda de dichos archivos. En la forma con comillas se busca el archivo en
el directorio actual y posteriormente en el directorio estándar de librerías (definido
normalmente con una variable de entorno del MS-DOS llamada INCLUDE, en el
caso de los compiladores de Microsoft). En la forma que utiliza los símbolos <...>
se busca directamente en el directorio estándar de librerías.

En la práctica, los archivos del sistema (stdio.h, math.h, etc.) se incluyen con la
segunda forma, mientras que los archivos hechos por el propio programador se
incluyen con la primera. Este comando del preprocesador se utiliza normalmente
para incluir archivos con los prototipos (declaraciones) de las funciones de librería,
o con módulos de programación y prototipos de las funciones del propio usuario.

Estos archivos suelen tener la extensión *.h (de header = cabecera), aunque
puede incluirse cualquier tipo de archivo de texto.

 #define
El comando #define establece una macro en el código fuente. Existen dos
posibilidades de definición:

#define NOMBRE texto


#define NOMBRE(parámetros) texto incluyendo los parámetros

Antes de comenzar la compilación, el preprocesador analiza el programa y cada


vez que encuentra el identificador NOMBRE lo sustituye por el texto que se
especifica a continuación en el comando #define.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 32 -

Ejemplos:

#define E 2.718281828459
#define CUAD(x) ((x)*(x))

double a, b, c;

a = 2.5;
b = 7 / CUAD(a);
c = 3.1 + b / E;

El preprocesador realiza la sustitución de E por el valor indicado y los valores de


los argumentos de CUAD, quedando el código de la siguiente manera:

double a, b, c;

a = 2.5;
b = 7 / (a * a);
c = 3.1 + b / 2.718281828459;

Este mecanismo de sustitución permite definir constantes simbólicas o valores


numéricos (tales como E, PI, SIZE, etc.) y poder cambiarlas fácilmente, a la vez
que el programa se mantiene más legible.

Cuando se define una macro con argumentos conviene ser muy cuidadoso para
prever todos los posibles resultados que se pueden alcanzar, y garantizar que
todos son correctos. En la definición de una macro pueden utilizarse macros
definidas anteriormente. En muchas ocasiones, las macros son más eficientes que
las funciones, pues realizan una sustitución directa del código deseado, sin perder
tiempo en copiar y pasar los valores de los argumentos. Es recomendable tener
presente que el comando #define:

 No define variables.

 Sus parámetros no son variables.

 En el preprocesamiento no se realiza una revisión de tipos, ni de sintaxis.

 Sólo se realizan sustituciones de código.

 Por convención entre los programadores, los nombres de las macros se


escriben con mayúsculas.

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 33 -

EJERCICIOS DE LA UNIDAD 2.
1. Indique si las siguientes cadenas de caracteres son identificadores válidos del
lenguaje C. De no serlos, señale la causa.

a. PANORAMA k. double
b. Mi Dato l. n5jw26vss
c. aParTamEnto m. Kapital
d. 5veces n. Año
e. _POCO o. Fecha_de_Nacimiento
f. __MUCHO p. Sueldo Basico
g. Pago99 q. “Apodo”
h. Carátula r. _1_Grado
i. A1 s. Nº_de_Cedula
j. x+y t. Peso y Estatura

2. Qué tipo de datos usaría para representar los valores correspondientes a las
siguientes propiedades:

a. La edad de una persona


b. La temperatura en ºC de una persona
c. La temperatura en ºC de una ciudad de cualquier parte del mundo
d. El sueldo en bolívares de un empleado
e. La altura de una montaña en kilómetros
f. La altura sobre el nivel del mar de una ciudad en metros
g. El número de alumnos de un curso
h. El número de alumnos de una Universidad
i. La dirección o residencia de una persona
j. Las placas de un automóvil en Venezuela
k. La cédula de identidad de un ciudadano venezolano
l. El consumo de electricidad en kilovatios-horas de una residencia
m. El número de glóbulos rojos de una persona
n. El sexo de una persona
o. El capital de un banco en bolívares, bolívares fuertes y dólares
p. La sección de una materia en la Universidad
q. El número de habitantes de un país
r. El costo de un automóvil en bolívares y bolívares fuertes

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 34 -

3. Qué tipo de datos usaría para representar los siguientes valores:

a. 1 k. 1.123
b. 123 l. 999
c. 1234 m. -999
d. 123456 n. 9
e. 1234567890 o. -9
f. 9876543210 p. ‘9’
g. 1.23456789 q. “9”
h. 1234.5678 r. “999”
i. 12345678.9 s. “UNO”
j. 1.0 t. 12345.6000000

4. Dadas las declaraciones de variables y las sentencias de abajo, indique el


valor de esas variables al ejecutarse dichas sentencias:

a. int m, n; e. int p = 20, q = 3, r, s;


m = 4; n = 2; float v, w, x = 15, y = 4;
m++; r = p / q; s = p % q;
n += m; v = x / y; w = p / q;

b. int a, b, c; f. int i, j, k;
a = 1; i = j = k = 3;
b = a++; k += i++;
c = ++b; j = 2 + k++;

c. int x, y, z; g. int a, b, c;
x = 4; a = 4;
y = x; b = 3 + a * 2;
z = x == y; c = a - b % 3;

d. int p, q, r; h. int a, b, c;
p = 4; float w, x, y;
q = 2; a = 14; x = 22;
r = p % q; b = a / 3;
p *= 2; y = a / 3;
q = p && r; c = x / b;
w = a / b;

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I - 35 -

5. Dadas las declaraciones de variables de abajo, indique si las siguientes


sentencias son correctas o no.

int a, b, c;
float x, y, z;
int const k = 4;

a. x = a + b;
b. b = k;
c. printf(“%f”, a);
d. scanf(“%d”, &k);
e. y++;
f. c = k++;
g. a = b > 0;
h. z = x % y;
i. printf(“%d”, &a)
j. a + b = c + 1;
k. c += a + b;
l. x = y * a++;
m. b = 25000 * 2;
n. printf(“%d”, a + b);
o. z = k;
p. a = b = c = 0;
q. z = x == y;
r. y = x / a;
s. b += ++c;
t. ++a = b++;

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I 36

6. Dadas las declaraciones y asignaciones de variables de abajo, indique el


resultado de las siguientes expresiones:

int a, b, c, d;
a = 9; b = 3, c = 2, d = 12;

a. c + a / b
b. b * (d / b * 2) + c
c. (d > a + b) && ((b * c) == (d / 2))
d. (b * (a – b)) == d
e. b + (c + d * b) / b

7. Convierta las siguientes fórmulas físicas en expresiones del lenguaje C. Utilice


identificadores adecuados, asuma que todas las variables son de tipo double, y
defina constantes cuando sea necesario.

a. El área del triángulo cuyos lados son de longitud a, b, y c es

A =  s (s – a) (s – b) (s – c)

donde s = a + b + c
2

b. El perímetro p de un polígono de n lados que circunscribe a un círculo de


radio r se calcula así:

p = 2nr * tan(  )
2
c. La distancia s desde un punto (p, q) a la línea Ax + By + C = 0 viene dada
por
Ap + Bq + C
s=
A2 + B2

d. La potencia emisora E a la longitud de onda  de un radiador de cuerpo


negro a la temperatura absoluta T es
2ch-5
E =
ech/BT -1
Donde c = 2.997924x108 es la velocidad de la luz
e = 2.718281828... es base de los logaritmos neperianos
h = 6.6252x10-34 es la constante de Planck
B = 5.6687x10-8 es la constante de Boltzman

NERIO VILLALOBOS FINOL


APUNTES DE PROGRAMACIÓN I 37

e. El período T de un péndulo de longitud h viene dado por T = 2 h / g


donde g es la constante de gravitación (981 cm / seg2).

f. La fuerza de atracción F entre dos cuerpos de masas m1 y m2, separados


por una distancia r se define como:
G.m1 . m2
F =
r2
donde G = 6.673x10-8 cm3/g.seg2 es la constante gravitacional universal.

7. Indique la salida por pantalla de las variables a, b, c, m y n, al ejecutarse la


función printf, en las siguientes sentencias:

int a = 1, b = 12, c = 123;


float p = 123.4567, q = 1.234567;

printf(“a=%5d\nb=%-5dc=%05d\n”, a, b, c);
printf(“p=%8.2f\nq=%10.5f\n”, p, q);
printf(“\np vale %12.5f”, p);
printf(“ y q vale %12.5f\n”, q);
printf(“%6d%8d%4d”, a, b, c);

1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2
1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
_

NERIO VILLALOBOS FINOL

También podría gustarte