Sie sind auf Seite 1von 20

Introduccin.

El lenguaje C se define como un lenguaje de programacin de alto nivel,


desarrollado a principios de los aos 70 por Dennis Ritchie, e implementado
por primera vez en un
DEC PDP-11, bajo el sistema operativo UNIX. El siguiente trabajo de
investigacin estudia los orgenes, caractersticas, desarrollo e importancia del
lenguaje C adems de su estrecha relacin con el sistema UNIX. Primero que
nada, es vital comentar una breve resea histrica del lenguaje C, desde su
diseo a creacin para luego llegar a su consolidacin como uno de los
lenguajes favoritos de programadores alrededor de todo el mundo. Luego, de
manera sistemtica y objetiva, se definen los tipos de datos existentes en el
lenguaje C para despus estudiar las principales caractersticas y
procedimientos que se deben seguir al programar en esta poderosa
herramienta. Es decir, el saber como compilar, depurar, ejecutar, editar y
enlazar un programa. De manera anexada se incluyen ejemplos bsicos de
estas rutinas, los que facilitan la comprensin y estudio de este lenguaje.
Dentro de las caractersticas de este lenguaje, se describe la inmensa gama de
operadores y sentencias, adems de los tipos de datos, con lo que se hace un
detallado anlisis de C, su relacin con UNIX y las razones de su permanencia
en el tiempo.
Historia y caractersticas principales.
En un principio, C naci en los laboratorios Bell de AT&Tcomo un lenguaje de
programacin de sistemas, y ms especficamente de sistemas operativos. En
efecto, las primeras versiones de UNIX se implementaron en ensamblador, pero
Dennis Ritchie reescribi el cdigo de UNIX ya existente en C, para facilitar su
mantenimiento y transportabilidad. Hoy en da slo una pequea parte del
ncleo de UNIX se sigue escribiendo en ensamblador, estas son, las partes que
se comunican ntimamente con el hardware. Este lenguaje est inspirado en el
lenguaje B escrito por Ken Thompson en 1970 con intencin de decodificar el
UNIX, que en la fase de arranque esta escrito en ensamblador, en vistas a su
transportabilidad a otras mquinas. B era un lenguaje evolucionado e
independiente de la mquina, inspirado en el lenguaje BCPL concedido por
Martin Richard en 1967. Luego, en 1972, Dennis Ritchie toma el relevo y
modifica el lenguaje B, creando el lenguaje C y reescribiendo el UNIX
basndose en dicho lenguaje. La novedad y ventaja comparativa que
proporcion el lenguaje C sobre B en el momento de su creacin y desarrollo
fue el diseo de tipos y estructuras de datos. Los tipos bsicos de datos
eran char (carcter), int(entero), float (reales en simple precisin)
y double (reales en doble precisin). Posteriormente se le aadieron los
tipos short (enteros de longitud menor a la del int), long(enteros de longitud
mayor a la del int) y enumeraciones. Los tipos estructurados bsicos de C son
las estructuras, las uniones y los arrays. Estos permiten la definicin y
declaracin de tipos derivados de mayor complejidad.

Las instrucciones de control de flujo de C son las habituales de la programacin


estructurada: if, for, while, swith-case, todas incluidas en su predecesor BCPL.
El lenguaje C incluye tambin punteros y funciones. Los argumentos de las
funciones se pasan por valor, esto es copiando su valor, lo cual hace que no se
modifiquen los valores de los argumentos en la llamada.
Cuando se desea modificar los argumentos en la llamada, stos se pasan por
referencia, es decir, se pasan las direcciones de los argumentos. Por otra parte,
cualquier funcin puede ser llamada recursivamente.
Una de las peculiaridades y ms grandes ventajas de C es su riqueza de
operadores. Puede decirse que prcticamente dispone de un operador para
cada una de las posibles operaciones en cdigo mquina. Sin embargo, hay
adems toda una serie de operaciones posibles de realizar con el lenguaje C
pero que no estn incluidas en el compilador propiamente dicho, si no que C
las realiza a travs de un preprocesador el cual acta justo antes de cada
compilacin. Las dos operaciones ms importantes en este mbito
son #define (directriz de sustitucin simblica o de definicin)
e #include (directriz de inclusin en el fichero fuente).
Sin embargo, el lenguaje C, que ha sido pensado para ser altamente
transportable y para programar lo improgramable, presenta inconvenientes al
igual que todos los otros lenguajes:
Carece de instrucciones de entrada/salida de instrucciones para manejo de
cadenas de caracteres, con lo que este trabajo queda para la librera de
rutinas, con la consiguiente prdida de transportabilidad.
La excesiva libertad en la escritura de los programas puede llevar a errores en
la programacin que, por ser correctos sintcticamente no se detectan a
simple vista.
Por otra parte, las precedencias de los operadores convierten a veces las
expresiones en pequeos rompecabezas.
Los detractores de C resaltan que este lenguaje es de nivel medio. Esto no
significa que sea ms complejo que uno de bajo nivel como el ensamblador, ni
tampoco menos evolucionado y en definitiva peor diseado que uno de alto
nivel, como Pascal o su derivado Ada. El nivel de un lenguaje no viene dado
por su dificultad o su utilidad, si no que por las operaciones que se puedan
especificar en l. Se dice que C es un lenguaje de nivel medio porque ana
elementos de los lenguajes de alto nivel con las posibilidades que ofrece el
lenguaje ensamblador.
En estos lenguajes de alto nivel tiene especial importancia el concepto de tipo
de dato, que define el conjunto de valores que puede tomar una variable, y el
conjunto de operaciones que se pueden efectuar sobre ella. Algunos tipos son
fcilmente comprensibles intuitivamente, como los enteros o los reales, pero
otros son ms oscuros, como el tipo de datos vaco (void) de C. Todos los
lenguajes de alto nivel controlan el uso de los distintos tipos de datos; o sea,

ciertas operaciones slo se pueden realizar sobre ciertos tipos; esto se


denomina tipificacin. Sin embargo, este control puede efectuarse rgidamente,
como en Pascal o Ada, o ser aplicado menos estrictamente, como en C; por
esto, se dice que C es un lenguaje dbilmente tipificado. Esto conlleva que en
C se pueda realizar cualquier transformacin de datos, la mayora incluso de
forma implcita. Por ejemplo, el paso del tipo carcter al tipo entero se realiza
implcitamente en cualquier expresin de C. Otra caracterstica que C comparte
con los otros lenguajes de alto nivel es la posibilidad de crear nuevos tipos de
datos a partir de los ya existentes.
Por otro lado, C hereda capacidades del lenguaje ensamblador como la
manipulacin directa de mapas de bits, punteros, y otros tipos que usa el
hardware internamente. Es por este motivo que C est particularmente bien
adaptado a la programacin de sistemas.
Sin embargo, a pesar de combinar muchas de las ventajas de los lenguajes de
alto y bajo nivel, C hereda tambin algunos de sus problemas. La mayora de
estas dificultades provienen del hecho de que C es un lenguaje pensado por y
para programadores; su diseo considera la eficiencia del programa final ms
que la facilidad de desarrollo. De hecho, es un lenguaje que se lee difcilmente,
al permitir expresiones idiomticas particulares, que fomentan la escritura de
cdigo difcilmente comprensible para los dems. Adems, este lenguaje no
implementa ningn tipo de comprobacin de errores en tiempo de ejecucin; o
sea, el compilador asume que aquello que se le pide, aunque parezca extrao,
procede de un programador experimentado, que sabe exactamente lo que
quiere; esto conlleva que ciertas tareas que en otros lenguajes de ms alto
nivel son largas se puedan realizar rpidamente en C, pero tambin que ciertos
errores comunes que son localizados en otros lenguajes en tiempo de
compilacin puedan quedar ocultos durante mucho tiempo en programa en C.
En definitiva, se puede decir que C proporciona un gran control al desarrollador
sobre cada aspecto de su programa, pero ste debe ser manejado
cuidadosamente.
Un lenguaje estructurado
En un lenguaje estructurado como C, el programa se organiza en una serie
de bloques de cdigo independientes que se llaman los unos a los otros. Este
mtodo de programacin soluciona algunos de los problemas ms recurrentes
que se le pueden plantear al programador: en vez de tener que seguir
atentamente el flujo de ejecucin a lo largo de un inmenso programa, se puede
controlar la ejecucin en el bloque principal, que va llamando a los otros
bloques para tareas secundarias o repetitivas. En este aspecto, C es similar a
otros muchos lenguajes como Pascal, Ada, Modula, etc. sin embargo,
estrictamente hablando, C no es un lenguaje estructurado en bloques. El
motivo es que no se puede declarar una funcin local a otra funcin, es decir
que no se puede definir una funcin que slo se pueda llamar desde el interior
de otra. Por otro lado, los lenguajes de alto nivel ofrecen un gran nmero de
construcciones condicionales y bucles. En estos lenguajes se limita o se elimina

el uso de goto y de las etiquetas correspondientes, lo que era posible en


programas anteriores, como por ejemplo, en Pascal. De hecho, en aquellos
lenguajes que lo permiten, como C, el uso de goto est muy mal visto; ste es
uno de los criterios que se usan habitualmente para juzgar si un cdigo est
bien estructurado o no. En efecto, el uso de saltos con goto tiene tendencia a
producir un cdigo espaghetti, que es difcil de leer y de mantener. Por el
contrario, en los lenguajes estructurados se usan construcciones ms
funcionales comoif y bucles for y while, que clarifican la estructura del
programa.
El Lenguaje C y el Sistema UNIX.
Como fue mencionado al principio, el lenguaje C se desarroll para tener un
lenguaje de alto nivel en el que se pudiera programar el Sistema Operativo
UNIX. Por lo mismo, los programas en C constan de uno o ms ficheros con
procedimientos y declaraciones. Estos ficheros se pueden compilar por
separado, generndose ficheros objeto independientes, que el montador (o
linker) de enlaces ha de combinar para generar el programa ejecutable. La
automatizacin de este proceso se realiza mediante una herramienta que
depender del sistema en el que se realice la aplicacin.
En UNIX, esta herramienta es (make). Los ficheros de las aplicaciones
codificadas en C se dividen en dos tipos, segn su nombre acabe en: co en .h.
Los ficheros .c contienen la implementacin del mdulo y los .h (cabeceras o
header) contienen la informacin sintctica y semntica sobre el uso de la
interfase del mdulo. Los ficheros .h pueden ser dependientes de la aplicacin
o propios del sistema operativo. Contienen un bloque de comentarios,
sentencias de inclusin de otros ficheros .h, definiciones de constantes y tipos,
y declaraciones de funciones. Debe recordarse eso si de que no se permite
declarar variables en un fichero .h.
En toda aplicacin existe adems un mdulo principal, que es el que define la
funcin main. En este sistema existen varias funciones main, debido a que
cada una se corresponde con la ejecucin de un programa, es decir, un proceso
del sistema. Ligado a lo anterior, se corresponder ahora a explicar el
funcionamiento del compilador de C en UNIX, el cual es utilizado para la
obtencin de los ficheros ejecutables necesarios para el funcionamiento de la
parte prctica del sistema. La funcin de este compilador no es slo traducir
programas en lenguajes de alto nivel a cdigo mquina para que sean
ejecutados en una computadora especfica. Este compilador adems
proporciona un entorno de ejecucin adecuado en el que se pueden llevar
acabo operaciones de entrada/salida, acceso a ficheros y a otras interfaces del
sistema operativo. En el sistema operativo UNIX, el comando utilizado para
compilar programas en C es cc. Este proceso de compilacin consta de 5 fases:
1)Preprocesamiento: es realizado por el programa cpp (preprocesador de C).
Maneja definiciones de constantes, inclusin de ficheros, gestin de macros,
compilacin condicional, etc.

2)Compilacin: tomando como entrada los resultados de la fase anterior, el


programa ccom realiza chequeos sintcticos, el parsing, y la generacin del
cdigo ensamblador.
3)Optimizacin: es opcional. Proporciona al generador de cdigo una mayor
velocidad.
4)Ensamblado: el programa ensamblador asm se utiliza para crear un fichero
objeto que contiene cdigo binario y genera la informacin que va a ser
utilizada por el linker/cargador.
5)Cargado: el programa de cargado constituye un linker/cargador. Combina
todos los ficheros objetos y enlaza (o linca) ste a todas las subrutinas de
libreras necesarias para producir un programa ejecutable.
El comando cc se encarga de tomar un fichero .c como entrada, generando el
correspondiente fichero .o (objeto). A partir de un fichero .s o ensamblado, se
produce este fichero .o. luego, este fichero .o se convierte en un fichero
ejecutable. Si esta compilacin se realiza en un solo paso, entonces el
fichero .o se borra automticamente.
Tipos de Datos.
En C hay dos clases de tipos de datos:
1)Tipos de Datos Bsicos.
Hay varios tipos bsicos de datos. Los ficheros de
cabeceras limits.h y float.h especifican los valores mximos y mnimos para
cada tipo. Se pueden clasificar en:
Tipos Enteros:
char, short, int, long y enum.
Tipos Reales:
float, double y long double
Otros:
void
El tipo booleano no existe, para representarlo se utilizan los enteros,
asignndole 0 a falso y cualquier otro valor a verdadero.
(a)El Tipo Entero
Cada tipo int pude ser calificado por las palabras claves signed o unsigned, lo
que da lugar a tener disponibles los siguientes tipos extras:
signed char, unsigned char
signed short, unsigned short

signed int, unsigned int


signed long, unsigned long
Un entero calificado signed es un entero con signo, esto es, un nmero entero
positivo o negativo. Un nmero entero calificado unsigned es un nmero entero
sin signo, el cual es manipulado como un nmero entero positivo. Si los
calificadores signed y unsigned se utilizan sin un tipo especfico, se asume el
tipo int. Por este motivo son equivalentes son:
signed x; y signed int x;
unsigned x; y unsigned int x;
Tipo char
El tipo char se define generalmente en unidades de memoria de 1 byte (8 bits),
que resultan ms que suficiente para trabajar con el cdigo ASCII estndar. El
tipo char es utilizado para almacenar un valor entero en el rango -128 a 127,
correspondiente a un carcter del cdigo ASCII. Solamente los valores 0 a 127
son equivalentes a un carcter. De forma similar el tipo unsigned char puede
almacenar valores en el rango de 0 a 255. Valores correspondientes a los
nmeros ordinales de los 256 caracteres ASCII.
Ejemplo:
char letra; /* Declara una variable de tipo char*/
letra = A; /* Asigna el valor A a la variable letra */
letra = 65; /* Cdigo correspondiente al caracter '*/
letra = A; /* Error. Piensa que A es una variable */
letra = "A "; /* Error. Piensa que "A " es una tira de caracteres */
Tipo int
El tipo int puede calificarse con los adjetivos:
int = 2 bytes. Su rango es de -32768 a + 32767.
unsigned int = Los enteros sin signo van de 0 a 65535.
short int = 2 bytes. Rango es de -32768 a 32767.
unsigned short = Rango es de 0 a 65535.
long int = 4 bytes. Rango es de -2147483648 a 2147483647.
unsigned long = Rango es de 0 a 4294967295.
Tipo enum
Crear una enumeracin es definir un nuevo tipo de dato, denominado tipo
enumerado y declarar una variable de este tipo. La sintaxis es la siguiente:
enum tipo_enumerado
{

definicin de nombres de constantes enteras


};
tipo_enumerado es un identificador que nombra al nmero tipo definido.
Despus de definir un tipo enumerado, se puede declarar una o ms variables
de ese tipo, de la forma: enum tipo_enumerado [variable[, variable]...];
Ejemplo:
enum colores;
{
azul, amarillo, rojo, verde, blanco, negro;
};
enum colores color;
Este ejemplo declara una variable color del tipo enumerado colores, la cual
puede tomar cualquier valor de los especificados en la lista. Por ejemplo: color
= azul;
Cada identificador, de la lista de constantes enteras en una enumeracin, tiene
un valor. Por defecto, el primer identificador tiene asociado el valor 0, el
siguiente es el valor 1, y as sucesivamente. color= verde; es equivalente a
color = 3. A cualquier identificador de la lista, se le puede asignar un valor
inicial por medio de una expresin constante. Los identificadores sucesivos
tomarn valores correlativos a partir de ste. Por ejemplo:
enum colores
{ azul, amarillo, rojo, verde = 0, blanco, negro
} color;
Este ejemplo define un tipo enumerado llamado colores y declara una
variable color de ese tipo. Los valores asociados a los identificadores son los
siguientes:
azul = 0, amarillo = 1, rojo = 2, verde = 0, blanco = 1 y negro = 2.
A los miembros de una enumeracin se les aplica las siguientes reglas:
Dos o ms miembros pueden tener un mismo valor.
Un identificador no puede tener ms de un tipo.
Desafortunadamente, no es posible leer o escribir directamente un valor de
un tipo enumerado.
(b)Tipo Real
Las variables de tipo real son diferentes de las variables de tipo entero ya que
se almacenan en memoria divididas en dos partes, en lugar de una. Las dos
partes son:
mantisa : la mantisa es el valor del nmero.

exponente : la potencia a la que est elevado el nmero real en cuestin.


Tipo float
El tipo float necesita 4 bytes para ser almacenado: uno para el exponente y
tres para el valor del nmero. Un real en simple precisin es un nmero que
puede tener un punto decimal y que puede estar comprendido en el rango de:
-3.402823E+38 a -1.175494E-38 para nmeros negativos.
1.175494E-38 a 3.402823E+38 para nmeros positivos.
Un nmero real en simple precisin no tiene ms de 7 dgitos significativos.
Ejemplo:
float a = 3.14159;
Tipo double
El tipo double utiliza 32 bytes para almacenar un nmero en punto flotante. De
ellos, se usan 8 bits para expresar el valor del exponente y su signo, y 24 bits
para representar la parte no exponencial.
Un real en doble precisin es un nmero que puede tener un punto decimal y
que puede estar comprendido en el rango de:
-1.79769E+308 a -2.22507E-308 para nmeros negativos
2.22507E-308 a 1.79769E+308 para nmeros positivos
Un nmero real en double precisin tiene hasta 16 dgitos significativos. Esto
da lugar a clculos ms exactos que en simple precisin.
Ejemplo:
double a = 3.1415926;
Tipo long double
El tipo long double utiliza 10 bytes para almacenar un nmero en punto
flotante.
Los valores para este tipo estn comprendidos en el rango de:
-1.189731E+4932 a -3.362103E-4932 para nmeros negativos
3.362103E-4932 a 1.189731E+4932 para nmeros positivos
Un nmero real en double precisin formato largo no tiene ms 19 dgitos
significativos. Esto da lugar a clculos ms exactos que en double precisin.
Ejemplo:
double a = 3.17e+425;
(c)Tipo void

El tipo void se utiliza para declarar funciones que no retornan un valor o para
declarar un puntero a un tipo no especificado. Si void aparece entre parntesis
a continuacin del nombre de una funcin, no es interpretado como un tipo. En
este caso indica que la funcin no acepta argumentos.
Ejemplo:
double fx(void);
void fy(void);
*p;
Este ejemplo declara la funcin denominada fx como una funcin sin
argumentos que devuelve un valor de tipo real de doble precisin; la funcin fy,
como una funcin sin argumentos que no devuelve valor alguno; y un
puntero p a un objeto de un tipo no especificado.
2)Tipo de Datos Compuestos
Este apartado describe los mecanismos de formacin de tipos de datos ms
complejos: vectores, registros (struct), registros variantes (union) y punteros.
(a)Vectores
Los vectores son conjuntos de elementos del mismo tipo. En C, todos los
vectores empiezan en el elemento 0. La declaracin:
int vt[MAX_PROCESS];
Declara un vector, vt, de enteros, con MAX_PROCESS (constante) posiciones. A
estas posiciones se hace referencia como vt[0] avt[MAX_PROCESS-1]. Existen
vectores de dos, tres y ms dimensiones. Adems pueden ser de cualquier tipo.
(b)Registros
Los registros son conjuntos de variables, generalmente de tipos diferentes. La
declaracin:
typedef struct
{
char hostname[LONG_HOST];
int port;
} type_address;
Declara a type_address como un registro con dos campos, el vector de
caracteres hostname y el entero port.
Para asignar el valor 1001 al campo port, se indica:
type_address.port = 1001;
Donde el operador "." indica que se ha seleccionado un miembro del registro.
(c)Registros Variantes (unin)

Los registros variantes estn formados tambin por varios miembros, pero slo
pueden contener el valor de uno de ellos en cada momento. La declaracin:
union type_mess
{
int m3;
int m4[MAX_PROCESS];
};
Indica que type_mess puede contener un entero o un vector de enteros, pero
no ambos. Los compiladores deben reservar espacio suficiente para que los
registros variantes puedan contener la variante que ocupe ms espacio en
memoria.
(d)Punteros
En C, los punteros se utilizan para almacenar direcciones de mquina. Su uso
es muy frecuente. La declaracin:
int i, *pi, a[10], *b[10], **ppi;
Declara un entero i; un puntero a un entero, pi; un vector de 10 elementos, a;
un vector de 10 punteros a enteros, b; y un puntero a un puntero a un
entero, ppi. Las reglas exactas de sintaxis de declaraciones complejas que
combinen vectores, punteros y otros tipos son bastante complicadas.
Por ejemplo, la declaracin:
typedef struct ptr_group
{
int group;
int components;
int view;
struct ptr_group *p_group;
ptr_process *p_process;
} ptr_group;
Las siguientes expresiones: ptr_group *p;ptr_group g; declaran que p es un
puntero a un registro de tipo ptr_group, y que g es un registro de ese tipo. Para
hacer que p apunte a g, se hara: p = & g; donde el smbolo "\&" representa el
operador unario que hace referencia a la direccin de la variable que le sigue.
Para copiar la variable entera group_num, el valor del miembro group, se
escribe:
group_num = p-group;
Ntese el empleo de la flecha para acceder a los miembros de un registro por
medio de un puntero. Una forma equivalente es la siguiente:

group_num = *(p.group);
Donde "*" es el operador unario de indireccin, mediante el cual se accede al
contenido de la direccin que se pone a continuacin.
Conversin de Tipos.
En C se pueden realizar variadas conversiones entre tipos. En muchas
ocasiones es necesario forzar explcitamente el tipo resultante de la
conversin. Esto puede conseguirse especificando el tipo deseado entre
parntesis delante de la expresin que se ha de convertir, por ejemplo:
marshall_long(packet, (long)i);
Convertira el entero i a tipo long antes de pasarlo como parmetro al
procedimiento marshall_long, que esperar a su entrada una variable de
tipo long.
Sentencias de Control.
En C los procedimientos contienen declaraciones e instrucciones. Ya hemos
examinado las declaraciones, as que es el momento de centrar la atencin en
las instrucciones. Las instrucciones if, while y las de asignacin son igual de
importantes que las de otros lenguajes.Lo nico que vale la pena destacar es
que se utilizan llaves para agrupar instrucciones compuestas, y que la
instruccin while tiene dos formas, la normal, y el do while, equivalente
al repeat de Pascal.
1)Sentencia if
Toma una decisin referente a la accin a ejecutar en un programa, basndose
en el resultado (verdadero o falso) de una expresin.
if (expresin)
sentencia1;
[ else
sentencia2];
expresin:debe ser una expresin numrica, relacional o lgica. El resultado
que se obtiene al evaluar la expresin es verdadero (no cero) ofalso (cero).
sentencia1/2: Representan una sentencia simple o compuesta. Cada sentencia
simple debe estar separada de la anterior por un punto y coma.
La ejecucin de la sentencia if sucede as:
Si el resultado de la expresin es verdadero, se ejecutar lo indicado por
la sentencia1.
Si el resultado de la expresin es falso, se ejecutar lo indicado por
la sentencia2.

Si el resultado de la expresin es falso, y la clusula else se ha omitido,


la sentencia1 se ignora.
2)Sentencia while
Ejecuta una sentencia, simple o compuesta, cero o ms veces, dependiendo
del valor de una expresin.
while (expresin)
sentencia;
Expresin: es cualquier expresin numrica, relacional o lgica.
Sentencia: es una sentencia simple o compuesta.
La ejecucin de la sentencia while sucede as:
Se evala la expresin.
Si el resultado de la expresin es cero (falso), la sentencia no se ejecuta y
se pasa a ejecutar la siguiente sentencia en el programa.
Si el resultado de la expresin es distinto de cero (verdadero), se ejecuta
la sentencia y el proceso se repite comenzando en el punto 1.
3)Sentencia do-while
Ejecuta una sentencia, simple o compuesta, una o ms veces, dependiendo del
valor de una expresin.
do
sentencia;
while (expresin);
Expresin: es cualquier expresin numrica, relacional o lgica.
Sentencia: es una sentencia simple o compuesta.
La ejecucin de la sentencia do-while sucede de la siguiente forma:
Se ejecuta la sentencia o cuerpo de la sentencia do.
Se evala la expresin.
Si el resultado de la expresin es cero (falso), se pasa a ejecutar la siguiente
sentencia en el programa.
Si el resultado de la expresin es distinto de cero (verdadero), el proceso se
repite comenzando en el punto 1.
4)Sentencia for

Cuando se desea ejecutar una sentencia simple o compuesta, repetidamente


un nmero de veces conocido, la construccin adecuada es la sentencia for. Su
forma es la siguiente:
for (inicializador; condicin; progresin)
sentencia;
Inicializador: representa la variable o las variables que sern inicializadas a un
valor determinado.
Condicin: es una expresin Boole (operados unidos por operadores
relacionales y/o lgicos). Si se omite, se supone siempre que esverdadera.
Progresin: es una expresin cuyo valor evoluciona en el sentido de que se d
la condicin para finalizar la ejecucin de la sentencia for.
Sentencia: es una sentencia simple o compuesta.
La ejecucin de la sentencia for sucede de la siguiente forma:
Se inicializan la o las variables de inicializacin.
Se evala la condicin.
Si el resultado es distinto de cero (verdadero), se ejecuta la sentencia, se
evala la expresin que da lugar a la progresin de la condicin y se vuelve al
punto 2.
Si el resultado de 2 es cero (falso), la ejecucin de la sentencia for se da por
finalizada y se contina en la siguiente sentencia del programa.
5)Sentencia switch
La sentencia switch permite ejecutar una de varias acciones, en funcin del
valor de una expresin.
La ejecucin de la sentencia switch sucede de la siguiente forma:
La sentencia switch evala la expresin entre parntesis y compara su valor
con las constantes de cada case.
La ejecucin de las sentencias del cuerpo de la sentencia switch, comienza
en el case cuya constante coincida con el valor de la expr-test y contina hasta
el final del cuerpo o hasta una sentencia que transfiera el control fuera del
cuerpo (por ejemplo break).
Si no existe un valor igual al valor de la expr-test, entonces se ejecutan las
sentencias a continuacin de default, si esta clusula ha sido especificada. La
clusula puede colocarse en cualquier parte del cuerpo y no necesariamente al
final.
6)Sentencia break

La sentencia break finaliza la ejecucin de una sentencia do, for, switch,


o while en la cual aparece. Cuando estas sentencias estn anidadas, la
sentencia break solamente finaliza la ejecucin de la sentencia donde est
incluida.
Expresiones.
1)Expresiones Numricas
Las expresiones son secuencias de operandos y operadores. Los
operadores ms comunes son:
Operado
r
Funcin
()

llamada a funcin

[]

Subndice de un arreglo

Punto . acceso a miembro de una


estructura.

->

Flecha. Apunta a miembro " " "

Inversor Lgico

Resta

--

Decrementar en uno

++

Incrementar en uno

&

Obtener la direccin de memoria

Obtiene la indireccin (contenido de)

Divisin

modulo (resto de la divisin)

suma

<

menor que

>

mayor que

<=

menor igual

>=

mayor igual

==

igualdad de comparacin

!=

desigualdad

&&

operador lgico AND

||

operador lgico OR

?:

condicional evala dos expresiones

asignacin simple

separador de variables, constantes y


expresiones dentro de funciones,
estructuras de control, etc.

sizeof

Determina el tamao de una variable o


una estructura.

Operadores de Asignacin:
Operad
or

Significado

*=

multiplicado
por

/=

dividido por

%=

modulo de

+=

aadir a

-=

sustraer
desde

2)Expresiones Condicionales
C Tiene un operador ternario (?:), que se utiliza en expresiones condicionales,
las cuales tienen la forma: operando 1 ? operando2 : operando3

La expresin operando1 debe ser de tipo entero, real o puntero. La evaluacin


se realiza de la siguiente forma:
Si el resultado de la evaluacin de operando1 es distinta de 0, el resultado de
la expresin condicional es operando2.
Si el resultado de la evaluacin de operando1 es 0, el resultado de la expresin
condicional es operando3.
Realizacin de un programa en C.
Un programa en C est compuesto por un conjunto de procedimientos (que
aunque no devuelvan un valor suelen denominarse funciones). Estos
procedimientos contienen declaraciones, instrucciones y otros elementos que
indican al ordenador sobre el que se trabaja, que es lo que tiene que hacer.
Los pasos a seguir en la realizacin de un programa en lenguaje C son:
Se editan los ficheros fuentes ( fichero1.c, fichero2.c).
Se compilan los ficheros fuentes obtenindose los ficheros
objeto (fichero1.obj, fichero2.obj.)
Los ficheros objeto son enlazados entre ellos y adems con otros ficheros
objetos ( fichero.obj) , con librera propias ( fichero4.lib) y del sistema ( .lib)
dando lugar a un nico fichero ejecutable ( fichero.exe).
Para ejecutar el fichero ( fichero.exe) resultante, se escribe el nombre de dicho
fichero (fichero), y se debe pulsar ENTER: fichero
Archivos.
Muchas aplicaciones requieren leer informacin de un perifrico auxiliar de
almace-namiento. Tal informacin se almacena en el perifrico en la forma de
un archivo de datos. Por lo tanto, los archivos de datos permiten almacenar
informacin de modo permanente, para ser accedida o alterada cuando sea
necesario.
En C existe existen un conjunto extenso de funciones de biblioteca para crear y
procesar archivos de datos. A diferencia de otros lenguajes de programacin,
en C no se distingue entre archivos secuenciales y de acceso directo (acceso
aleatorio). Pero existen dos tipos distintos de archivos de datos, llamados
archivos secuenciales de datos (o estndar) y archivos orientados a sistema (o
de bajo nivel). Generalmente es ms fcil trabajar con archivos de datos
secuenciales que con los orientados a sistema.
Apertura y Cierre de un archivo:
Cuando se trabaja con archivos secuenciales de datos, el primer paso es
establecer un rea de buffer, donde la informacin se almacena
temporalmente mientras se est transfiriendo entre la memoria de la
computadora y el archivo de datos. Este buffer permite leer y escribir

informacin del archivo ms rpidamente de lo que sera posible de otra


manera. El rea de buffer se establece escribiendo:
FILE *ptvar; donde FILE (se requieren letras maysculas) es un tipo especial de
estructura que establece el rea de buffer y ptvar la variable puntero indica el
inicio de esta rea. El tipo de estructura de FILE est definido en el sistema de
archivos include, tpicamente en stdio.h. El puntero ptvar se refiere a menudo a
un archivo secuencial.
Para abrir un archivo se utiliza la funcin de biblioteca fopen. Se escribe como:
ptvar = fopen(nombre_archivo, tipo_archivo);
donde nombre_archivo y tipo_archivo son cadenas que presentan,
respectivamente, el nombre del archivo y la manera en la que el archivo ser
utilizado. El nombre_archivo debe ser consistente con la manera en que se
nombran los archivos en el sistema operativo utilizado, y tipo_archivo est
compuesto por una o varias de las cadenas que aparecen en la siguiente tabla:
Tipo_Archivo

Significado

"r"

Abrir un archivo existente solo para lectura.

"w"

Abrir un nuevo solo para escritura. Si existe un


archivo con el nombre_archivo especificado, ser
destruido y creado uno nuevo en su lugar.

"a"

Abrir un archivo existente para aadir (aadir


informacin nueva al final del archivo). Se crear un
archivo nuevo si no existe un archivo con el
nombre nombre_archivo especificado.

"r+"

Abre un archivo existente para lectura y escritura.

"w+"

Abre un archivo nuevo para lectura y escritura. Si


existe un archivo con el nombre_archivo especificado,
ser destruido y creado uno nuevo en su lugar.

"a+"

Abrir un archivo existente para leer y aadir. Se


crear un archivo nuevo si no existe un archivo con el
nombre nombre_archivo especificado.

Se retorna un valor NULL si no se puede abrir el archivo, por ejemplo si un


archivo existente no se encuentra.
Finalmente un archivo de datos debe cerrarse al final del programa. Esto puede
realizarse con la funcin de biblioteca fclose, aunque la mayora de los
compiladores de C cerrarn automticamente todos los archivos de una sesin.

Edicin de un Programa
Para editar un programa, primeramente se debe llamar, para su ejecucin, al
programa editor o procesador de textos que se vaya a utilizar. Se puede utilizar
el procesador de textos suministrado con el compilador o un propio procesador.
El nombre del fichero para salvar el programa en el disco, debe tener como
extensin .c. El paso siguiente es escribir el texto correspondiente al programa
fuente. Cada sentencia del lenguaje C finaliza con un punto y coma y cada
lnea del programa se finaliza pulsando la tecla Enter. Los comentarios
comienzan con el smbolo /* y acaban con */, y pueden extenderse a varias
lneas. A continuacin se presenta el siguiente ejemplo con lo dicho hasta
ahora.
/*********************Saludo*********************/
# include stdio.h
# include stdlib.h
main()
{
char *mensaje1 = "Bienvenido a C ";
char *mensaje2 = "esto es un ejemplo ";
system("cls ");
printf(" Escriba su nombre: ");
gets(nombre);
printf(" n%s %s n%s n ",mensaje1, nombre, mensaje2);
}
Las dos primeras lneas incluyen las declaraciones necesarias para las
funciones que aparecen en el programa. Estas funciones
son:system(), printf() y gets(). En la funcin main() lo que se hace es definir las
cadenas de caracteres mensaje1 y mensaje2 y tomar del teclado la
variable nombre. El despliegue en pantalla ser algo como esto:
Bienvenido a C, <nombre que se haya elegido>, esto es un ejemplo.
Compilar un Programa
El siguiente paso es compilar el programa, esto es, transformar la versin del
programa comprensible para el ser humano en la versin comprensible para el
ordenador. Utilizando un procesador de textos o un editor, se escriben las
lneas del programa, creando el fichero fuente. El compilador entonces utiliza
este fichero para generar otro fichero pero escrito ahora en lenguaje mquina.
Al compilar un programa, se pueden presentar errores de compilacin, debidos
a que el programa escrito no se adapte a la sintaxis y reglas del compilador;
pero es posible ir corrigiendo estos errores hasta obtener una compilacin
limpia.
Enlazar un Programa

Enlazar es necesario ya que quiz no se desee compilar todo el programa al


mismo tiempo. Por ejemplo, se puede escribir un programa largo, ste puede
contener partes ya depuradas y otras pueden estar todava en desarrollo, luego
slo se tendr que compilar la o las partes que estn en desarrollo. En base a
esto, es necesario enlazar ficheros y libreras de programa que estn
previamente compiladas. Este es el trabajo del linker. El linker combina
todos los ficheros objeto necesarios, libreras y programas escritos por el
usuario, para producir un programa final que sea ejecutable.
Ejecutar un Programa
Cada vez que se realiza el proceso de compilacin y enlace del programa, C
genera automticamente sobre el disco un fichero con extensin.exe. Este
fichero puede ser ejecutado directamente desde el DOS, sin el soporte de C,
escribiendo el nombre del fichero.exedespus del prompt del DOS y
pulsando Enter a continuacin. Al ejecutar el programa, pueden ocurrir errores
durante la ejecucin. Por ejemplo, puede darse una divisin por cero. Estos
errores solamente pueden ser detectados por C cuando se ejecuta el programa,
pero son notificados con el correspondiente mensaje de error.
Hay otro tipo de errores que no dan lugar a mensaje alguno. Por ejemplo: un
programa que no termine nunca de ejecutarse, debido a que presenta un bucle
o loop, donde no se llega a dar la condicin de termino. Para detener la
ejecucin se tienen que pulsar las teclas Ctrl + C.
Depurar un Programa
Un programa una vez ejecutado puede dar lugar a una solucin incorrecta. Este
caso exige un anlisis minucioso de cmo se desarrolla el programa en su
ejecucin; esto es, entrar en la fase de depuracin del programa. La forma ms
sencilla y eficaz para realizar este proceso, es utilizar un programa depurador.
Funciones.
En el lenguaje C, una funcin es el equivalente a un procedimiento en Pascal o
a una subrutina en Fortran. Una funcin proporciona una forma conveniente de
encapsular algunos clculos, que se pueden emplear despus sin preocuparse
de su implantacin.
Con funciones diseadas adecuadamente, es posible ignorar cmo se realiza
un trabajo; es suficiente saber qu se hace. El C hace que el uso de funciones
sea fcil, conveniente y eficiente; es comn ver una funcin corta definida y
empleada una sola vez, nicamente porque eso esclarece alguna parte del
cdigo. Una definicin de funcin tiene la forma siguiente:
tipo_de_retorno nombre_de_funcin ([parmetros])
{
declaraciones;
instrucciones;

}
Las definiciones de funcin pueden aparecer en cualquier orden y en uno o
varios ficheros fuente, pero una funcin no puede separarse en archivos
diferentes. Para devolver valores, las funciones ejecutan la instruccin return,
que puede tener una expresin que se devuelve como el valor de la funcin.
Cuando una funcin devuelve un valor, el tipo del mismo viene especificado
antes del nombre de la funcin. Una funcin no tiene necesariamente que
regresar un valor.

Das könnte Ihnen auch gefallen