Sie sind auf Seite 1von 57

REPBLICA BOLIVARIANA DE VENEZUELA

INSTITUTO UNIVERSITARIO POLITCNICO


SANTIAGO MARIO
EXTENSIN-MATURN










GUA TERICO PRCTICA DE LENGUAJE C

Trabajo de Nivelacin de ndice



Autor: Luis Saavedra
Tutor: Merlin Villafranca








Maturn, julio de 2014

2



NDICE



Pp.
CAPTULO I . 3
Introduccin ... 3
Planteamiento del Problema ... 5
Objetivos de la Investigacin ..................................... 6
Objetivo General . 6
Objetivos Especficos .. 6

CAPTULO II ......................... 7
Desarrollo ........................ 7
Historia del Lenguaje C .. 7
Estructura Bsica de un Programa en C .. 9
Tipos Bsicos y Variables ... 11
Funciones 12
Expresiones y operadores 14
Conversin de Tipos ... 16
Control de flujo ... 17
Definicin y prototipos de funciones .. 21
mbito de funciones y variables . 27
Punteros ... 30
El preprocesador .. 34
Funciones de entrada y salida . 35
Resultados .. 38
CONCLUSIN.. 51
RECOMENDACIONES ... 52
REFERENCIAS..... 53







3



CAPTULO I


INTRODUCCIN


Un lenguaje de programacin es un lenguaje que puede ser utilizado para
controlar el comportamiento de una mquina, particularmente una computadora.
Consiste en un conjunto de reglas sintcticas y semnticas que definen su estructura y
el significado de sus elementos, respectivamente. Aunque muchas veces se usa
lenguaje de programacin y lenguaje informtico como si fuesen sinnimos, no tiene
por qu ser as, ya que los lenguajes informticos engloban a los lenguajes de
programacin y a otros ms, como, por ejemplo, HTML.
Naturalmente, un programa que se escribe en un lenguaje de alto nivel tambin
tiene que traducirse a un cdigo que pueda utilizar la mquina. Los programas
traductores que pueden realizar esta operacin se llaman compiladores. stos, como
los programas ensambladores avanzados, pueden generar muchas lneas de cdigo de
mquina por cada proposicin del programa fuente. Se requiere una corrida de
compilacin antes de procesar los datos de un problema. Los compiladores son
aquellos cuya funcin es traducir un programa escrito en un determinado lenguaje a
un idioma que la computadora entienda. Al usar un lenguaje compilado, el programa
desarrollado nunca se ejecuta mientras haya errores, sino hasta que luego de haber
compilado el programa, ya no aparecen errores en el cdigo.
Se refiere a un conjunto de tcnicas que han ido evolucionando. Estas tcnicas
aumentan considerablemente la productividad del programa reduciendo el tiempo
requerido para escribir, verificar, depurar y mantener los programas. La programacin
estructurada utiliza un nmero limitado de estructuras de control que minimizan la
complejidad de los problemas y que reducen los errores. sta incorpora entre otros
elementos: el diseo descendente, recursos abstractos y estructuras bsicas. La
programacin estructurada es una forma de escribir programacin de ordenador de
4
forma clara, para ello utiliza nicamente tres estructuras: secuencial, selectiva e
iterativa; siendo innecesario y no permitindose el uso de la instruccin o
instrucciones de transferencia incondicional (GOTO).
C es un lenguaje de programacin de propsito general que ofrece economa
sintctica, control de flujo y estructuras sencillas y un buen conjunto de operadores.
No es un lenguaje de muy alto nivel y ms bien un lenguaje pequeo, sencillo y no
est especializado en ningn tipo de aplicacin. Esto lo hace un lenguaje potente, con
un campo de aplicacin ilimitado y sobre todo, se aprende rpidamente. En
poco tiempo, un programador puede utilizar la totalidad del lenguaje.
Este lenguaje ha sido estrechamente ligado al sistema operativo UNIX, puesto
que fueron desarrollados conjuntamente. Sin embargo, este lenguaje no est ligado a
ningn sistema operativo ni a ninguna mquina concreta. Se le suele llamar lenguaje
de programacin de sistemas debido a su utilidad para escribir compiladores y
sistemas operativos, aunque de igual forma se puede desarrollar cualquier tipo de
aplicacin.
Tomando en cuenta lo descrito, se lleva a cabo la presente gua terico-prctica
de lenguaje C, con el propsito de ofrecer a los estudiantes de la carrera de Ingeniera
de Sistemas y afines, informacin relevante sobre la codificacin del lenguaje, las
instrucciones, estructuras de datos, entre otros aspectos, que ayuden al aprendizaje del
mismo.










5



PLANTEAMIENTO DEL PROBLEMA



Aprender el primer lenguaje de programacin es una labor engorrosa y con
frecuencia difcil. Requiere un alto nivel de estudio; pero especialmente exige, de
quien emprende esta tarea de aprendizaje, muchas horas de trabajo delante de un
ordenador. Y es que, aunque pueda parecer una obviedad, en realidad no hay otro
camino: para aprender a programar, hay que programar. sta es una recomendacin
clsica que se repite en el primer da de clase de cualquier asignatura relacionada con
la programacin y el desarrollo software. Ni mucho menos es suficiente con copiar y
entender el cdigo que el profesor explica en clase, el alumno debe llegar a ser capaz
de crear su propio cdigo.
A algunos alumnos les ocurre que con relativa facilidad comienzan a
comprender el cdigo propuesto por otros; pero eso no implica ni de lejos que ya
hayan aprendido a programar. Hay que empezar desarrollando programas muy cortos
y sencillos: nunca olvidar su primer programa llamado Hola Mundo. Para
implementar esos primeros programas nicamente deber copiar literalmente el
cdigo y compilar. Aunque eso pueda parecer una tarea fcil, en sus primeros pasos
se cometer una gran cantidad de errores sintcticos y surgen las tpicas preguntas del
tipo por slo un punto y coma ya no se puede compilar este cdigo?
Es el principio del camino en el mundo de la programacin. Para aprender a
programar hay que codificar. Tras muchas horas de trabajo intentando desarrollar los
programas que se plantean, donde incluso dan ganas de destrozar el ordenador, se
comienza a ver la luz al final de tnel: el alumno consigue entender perfectamente
esos programas de unas pocas lneas de cdigo que parecan indescifrables hace unos
das, e incluso puede proponer mejoras a dicho cdigo. A partir de ese momento
quiz comience ya a disfrutar programando. Este ciclo de aprendizaje lo han sufrido
todos y, de hecho, se sigue aprendiendo cada vez que se crea un nuevo cdigo.
6
El objetivo principal que se plante al preparar esta gua ha sido ofrecer al
alumno una gua para el aprendizaje de los fundamentos de la programacin en
lenguaje C a travs de prcticas. Al contrario que los clsicos boletines de prcticas
formados por una simple coleccin de ejercicios, se ha querido desarrollar los
aspectos que componen la programacin con lenguaje C, desde un punto de vista muy
didctico: explicando detalladamente los conceptos tericos a travs de ejemplos
prcticos resueltos, siguiendo cada uno de los pasos que el alumno da en su camino
de iniciacin en la programacin.

Objetivos de la Investigacin

Objetivo General

Desarrollar una gua terico-prctica de lenguaje C, con el objeto de ofrecer una
herramienta para el proceso de enseanza-aprendizaje del tema.

Objetivos Especficos

1. Identificar las partes que conforman un programa en lenguaje C, con el
propsito de establecer los pasos para su utilizacin.
2. Determinar las estructuras de datos que se manejan en lenguaje C. con la
finalidad de analizar su utilidad en el desarrollo de programas.
3. Exponer ejemplos de las distintas estructuras de datos que pueden utilizarse en
lenguaje C, que permitan al alumno comprender su utilidad.
4. Ofrecer una herramienta para el docente que le ayude a mejorar el nivel de
comprensin de los alumnos, en cuanto al conocimiento del lenguaje C.






7



CAPTULO II


DESARROLLO


Historia del Lenguaje C

C es un lenguaje de programacin de propsito general que ofrece economa
sintctica, control de flujo y estructuras sencillas y un buen conjunto de operadores.
No es un lenguaje de muy alto nivel y ms bien un lenguaje pequeo, sencillo y no
est especializado en ningn tipo de aplicacin. Para Sequera, R. (2005) Esto lo hace
un lenguaje potente, con un campo de aplicacin ilimitado y sobre todo, se aprende
rpidamente. En poco tiempo, un programador puede utilizar la totalidad del
lenguaje (p. 5).
Este lenguaje ha sido estrechamente ligado al sistema operativo UNIX, puesto
que fueron desarrollados conjuntamente. Sin embargo, este lenguaje no est ligado a
ningn sistema operativo ni a ninguna mquina concreta. Se le suele llamar lenguaje
de programacin de sistemas debido a su utilidad para escribir compiladores y
sistemas operativos, aunque de igual forma se puede desarrollar cualquier tipo de
aplicacin.
Sequera, R. (2005) describe que La base del C proviene del BCPL, escrito por
Martin Richards, y del B escrito por Ken Thompson en 1970 para el primer sistema
UNIX en un DEC PDP-7. Estos son lenguajes sin tipos, al contrario que el C que
proporciona varios tipos de datos (p. 6). Los tipos que ofrece son caracteres,
nmeros enteros y en coma flotante, de varios tamaos. Adems se pueden crear
tipos derivados mediante la utilizacin de punteros, vectores, registros y uniones. El
primer compilador de C fue escrito por Dennis Ritchie para un DEC PDP-11 y
escribi el propio sistema operativo en C.

8
Introduccin al Lenguaje C

La base del C proviene del BCPL, escrito por Martin Richards, y del B escrito
por Ken Thompson en 1970 para el primer sistema UNIX en un DEC PDP-7. Estos
son lenguajes sin tipos, al contrario que el C que proporciona varios tipos de datos.
Los tipos que ofrece son caracteres, nmeros enteros y en coma flotante, de varios
tamaos. Adems se pueden crear tipos derivados mediante la utilizacin de
punteros, vectores, registros y uniones. El primer compilador de C fue escrito por
Dennis Ritchie para un DEC PDP-11 y escribi el propio sistema operativo en C.
C trabaja con tipos de datos que son directamente tratables por el hardware de
la mayora de computadoras actuales, como son los caracteres, nmeros y
direcciones. Estos tipos de datos pueden ser manipulados por las operaciones
aritmticas que proporcionan las computadoras. Sobre esto, Sequera, R. (2005)
describe que
No proporciona mecanismos para tratar tipos de datos que no sean los
bsicos, debiendo ser el programador el que los desarrolle. Esto permite
que el cdigo generado sea muy eficiente y de ah el xito que ha tenido
como lenguaje de desarrollo de sistemas. No proporciona otros
mecanismos de almacenamiento de datos que no sea el esttico y no
proporciona mecanismos de entrada ni salida. Ello permite que el
lenguaje sea reducido y los compiladores de fcil implementacin en
distintos sistemas. Por contra, estas carencias se compensan mediante la
inclusin de funciones de librera para realizar todas estas tareas, que
normalmente dependen del sistema operativo. (p. 7)

Originariamente, el manual de referencia del lenguaje para el gran pblico fue
el libro de Kernighan y Ritchie, escrito en 1977. Es un libro que explica y justifica
totalmente el desarrollo de aplicaciones en C, aunque en l se utilizaban
construcciones, en la definicin de funciones, que podan provocar confusin y
errores de programacin que no eran detectados por el compilador. Como los
tiempos cambian y las necesidades tambin, en 1983 ANSI establece el comit
X3J11 para que desarrolle una definicin moderna y comprensible del C. El estndar
est basado en el manual de referencia original de 1972 y se desarrolla con el mismo
espritu de sus creadores originales.
9
La primera versin de estndar se public en 1988 y actualmente todos los
compiladores utilizan la nueva definicin. Sequera, R. (2005) expresa que Una
aportacin muy importante de ANSI consiste en la definicin de un conjunto de
libreras que acompaan al compilador y de las funciones contenidas en ellas (p. 8).
Muchas de las operaciones comunes con el sistema operativo se realizan a travs de
estas funciones. Una coleccin de ficheros de encabezamiento, headers, en los que se
definen los tipos de datos y funciones incluidas en cada librera. Los programas que
utilizan estas bibliotecas para interactuar con el sistema operativo obtendrn un
comportamiento equivalente en otro sistema.

Estructura Bsica de un Programa en C

La mejor forma de aprender un lenguaje es programando con l. El programa
ms sencillo que se puede escribir en C es el siguiente:

main( )
{
}

Como se puede observar, este programa no hace nada, pero contiene la parte
ms importante de cualquier programa C y adems, es el ms pequeo que se puede
escribir y que se compile correctamente. En l se define la funcin main, que es la
que ejecuta el sistema operativo al llamar a un programa C. Sequera, R. (2005)
expresa que El nombre de una funcin C siempre va seguida de parntesis, tanto si
tiene argumentos como si no. La definicin de la funcin est formada por un bloque
de sentencias, que est encerrado entre llaves {} (p. 10). Un programa algo ms
complicado es el siguiente:
#include <stdio.h>
main( )
{
10
printf("Hola amigos!\n");
}
Con el visualizamos el mensaje Hola amigos! en el terminal. En la primera
lnea indica que se tengan en cuenta las funciones y tipos definidos en la librera
stdio (standard input/output). Estas definiciones se encuentran en el fichero header
stdio.h. Ahora, en la funcin main se incluye una nica sentencia que llama a la
funcin printf. Esta toma como argumento una cadena de caracteres, que se imprimen
van encerradas entre dobles comillas " ". El smbolo \n indica un cambio de lnea.
Hay un grupo de smbolos, que son tratados como caracteres individuales, que
especifican algunos caracteres especiales del cdigo ASCII. Los ms importantes se
muestran en el cuadro 1.

Cuadro 1
Cdigo ASCII

Cdigo Descripcin
\a Alerta
\b Espacio atrs
\f Salto de pgina
\n Salto de lnea
\r Retorno de carro
\t Tabulacin horizontal
\v Tabulacin vertical
\\ Barra invertida
\' Comilla simple
\" Comillas dobles
\OOO Visualiza un carcter cuyo cdigo ASCII es OOO en octal
\xHHH Visualiza un carcter cuyo cdigo ASCII es HHH en hexadecimal
Fuente: Sequera, R. (2005)

Un programa C puede estar formado por diferentes mdulos o fuentes. Para
Sequera, R. (2005) Es conveniente mantener las fuentes de un tamao no muy
grande, para que la compilacin sea rpida (p. 11). Tambin, al dividirse un
programa en partes, puede facilitar la legibilidad del programa y su estructuracin.
11
Las diferentes fuentes son compilados de forma separada, nicamente los fuentes que
han sido modificados desde la ltima compilacin, y despus combinados con las
libreras necesarias para formar el programa en su versin ejecutable.

Tipos Bsicos y Variables

Los tipos de datos bsicos definidos por C son caracteres, nmeros enteros y
nmeros en coma flotante. Los caracteres son representados por char, los enteros por
short, int, long y los nmeros en coma flotante por float y double. Los tipos bsicos
disponibles y su tamao se muestran en el cuadro 2.

Cuadro 2
Tipos de datos y variables

Tipo Descripcin Tamao
Char Carcter (normalmente 8 bits)
Short Entero corto con signo (normalmente 16 bits)
Int Entero con signo (depende de la implementacin)
Unsigned Entero sin signo (depende de la implementacin)
Long Entero largo con signo (normalmente 32 bits)
Float Flotante simple (normalmente 32 bits)
Double Flotante doble (normalmente 64 bits)
Fuente: Sequera, R. (2005)

La palabra unsigned en realidad es un modificador aplicable a tipos enteros,
aunque si no se especifica un tipo se supone int. Sequera, R. (2005) describe que Un
modificador es una palabra clave de C que indica que una variable, o funcin, no se
comporta de la forma normal. Hay tambin un modificador signed, pero como los
tipos son por defecto con signo, casi no se utiliza (p. 14). Las variables son definidas
utilizando un identificador de tipo seguido del nombre de la variable. Veamos el
siguiente programa:
#include <stdio.h>
12
main()
{
float cels, farh;
farh = 35.0;
cels = 5.0 * ( farh - 32.0 ) / 9.0;
printf("-> %f F son %f C\n", farh, cels );
}

En el programa anterior se definen dos variables float, se asigna un valor a la
primera y se calcula la segunda mediante una expresin aritmtica. Las asignaciones
en C tambin son una expresin, por lo que se pueden utilizar como parte de otra
expresin, pero segn que prcticas de este tipo no son muy recomendables ya que
reducen la legibilidad del programa. En la instruccin printf, el smbolo %f indica
que se imprime un nmero en coma flotante.
Hay un tipo muy importante que se representa por void que puede significar dos
cosas distintas, segn su utilizacin. Puede significar nada, o sea que si una funcin
devuelve un valor de tipo void no devuelve ningn resultado, o puede significar
cualquier cosa, como puede ser un puntero a void es un puntero genrico a cualquier
tipo de dato.

Funciones

Sequera, R. (2005) manifiesta que Un programa C est formado por un
conjunto de funciones que al menos contiene la funcin main (p. 15). Una funcin se
declara con el nombre de la funcin precedido del tipo de valor que retorna y una lista
de argumentos encerrados entre parntesis. El cuerpo de la funcin est formado por
un conjunto de declaraciones y de sentencias comprendidas entre llaves. Veamos un
ejemplo de utilizacin de funciones:
#include <stdio.h>
#define VALOR 5
13
#define FACT 120
int fact_i ( int v )
{
int r = 1, i = 0;
while ( i <= v )
{
r = r * i;
i = i + 1;
}
return r;
}
int fact_r ( int v )
{
if ( v == 0 ) return 1;
else return v * fact_r(v-1);
}
main() {
int r, valor = VALOR;
if ( (r = fact_i(valor)) != fact_r(valor) ) printf("Codificacin errnea!!.\n");
else if ( r == FACT ) printf("Codificacin correcta.\n");
else printf("Algo falla!!.\n");
}

Se definen dos funciones, fact_i y fact_r, adems de la funcin main. Ambas
toman como parmetro un valor entero y devuelven otro entero. La primera calcula el
factorial de un nmero de forma iterativa, mientras que la segunda hace lo mismo de
forma recursiva. Todas las lneas que comienzan con el smbolo # indican una
directiva del precompilador. Antes de realizar la compilacin en C se llama a un
precompilador cuya misin es procesar el texto y realizar ciertas sustituciones
textuales. Hemos visto que la directiva #include incluye el texto contenido en un
14
fichero en el fuente que estamos compilando. De forma parecida, #define nombre
texto sustituye todas las apariciones de nombre por texto. As, en el fuente, la palabra
VALOR se sustituye por el nmero 5.
El valor que debe devolver una funcin se indica con la palabra return. Sequera,
R. (2005) explica que La evaluacin de la expresin debe dar un valor del mismo
tipo de dato que el que se ha definido como resultado. La declaracin de una variable
puede incluir una inicializacin en la misma declaracin (p. 16). Se debe tener muy
en cuenta que en C todos los argumentos son pasados 'por valor'. No existe el
concepto de paso de parmetros 'por variable' o 'por referencia'. A cntinuacin un
ejemplo:

int incr ( int v ) { return v + 1; }
main() {
int a, b;
b = 3;
a = incr(b);
/* a = 4 mientras que b = 3. No ha cambiado despus de la llamada. */
}

En el ejemplo anterior el valor del parmetro de la funcin incr, aunque se
modifique dentro de la funcin, no cambia el valor de la variable b de la funcin
main. Todo el texto comprendido entre los caracteres /* y */ son comentarios al
programa y son ignorados por el compilador. En una fuente C los comentarios no se
pueden anidar.

Expresiones y Operadores

Los distintos operadores permiten formar expresiones tanto aritmticas como
lgicas. Los operadores aritmticos y lgicos se muestran en el cuadro 3 (p. 15).

15
Cuadro 3
Operadores Aritmticos y Lgicos

Operador Descripcin
+, - suma, resta
++, -- incremento, decremento
*, /, % multiplicacin, divisin, mdulo
>>, << rotacin de bits a la derecha, izquierda.
& AND booleano
| OR booleano
^ EXOR booleano
~ complemento a 1
! complemento a 2, NOT lgico
==, != igualdad, desigualdad
&&, || AND, OR lgico
<, <= menor, menor o igual
>, >= mayor, mayor o igual
Fuente: Muoz, D. y Palacios, R. (2006).

En estos operadores deben tenerse en cuenta la precedencia de operadores y las
reglas de asociatividad, que son las normales en la mayora de lenguajes. Se debe
consultar el manual de referencia para obtener una explicacin detallada. Adems hay
toda una serie de operadores aritmticos con asignacin, como pueden ser += y ^=.
Muoz, D. y Palacios, R. (2006) exponen que:
En la evaluacin de expresiones lgicas, los compiladores normalmente
utilizan tcnicas de evaluacin rpida. Para decidir si una expresin
lgica es cierta o falsa muchas veces no es necesario evaluarla
completamente. Por ejemplo una expresin formada <exp1> || <exp2>, el
compilador evala primero <exp1> y si es cierta, no evala <exp2>. Por
ello se deben evitar construcciones en las que se modifiquen valores de
datos en la propia expresin, pues su comportamiento puede depender de
la implementacin del compilador o de la optimizacin utilizada en una
compilacin o en otra. Estos son errores que se pueden cometer
fcilmente en C ya que una asignacin es tambin una expresin.
Se debe evitar: if (( x++ > 3 ) || ( x < y ))
y escribir en su lugar: x++; if (( x > 3 ) || ( x < y ))
16
Hay un tipo especial de expresin en C que se denomina expresin condicional
y est representada por los operadores ? : . Su utilizacin es como sigue: <e> ? <x> :
<y>. Se evala si e entonces x; si no, y.

int mayor ( int a, int b ) {
return ( a > b ) ? TRUE : FALSE;
}
waste_time () {
float a, b = 0.0;
( b > 0.0 ) ? sin(M_PI / 8) : cos(M_PI / 4);
}

Conversin de Tipos

Cuando se escribe una expresin aritmtica a+b, en la cual hay variables o
valores de distintos tipos, el compilador realiza determinadas conversiones antes de
que evale la expresin. Estas conversiones pueden ser para 'aumentar' o 'disminuir'
la precisin del tipo al que se convierten los elementos de la expresin. Un ejemplo
claro, es la comparacin de una variable de tipo int con una variable de tipo double.
En este caso, la de tipo int es convertida a double para poder realizar la comparacin.
Para Muoz, D. y Palacios, R. (2006), los tipos pequeos son convertidos de la
forma siguiente: un tipo char se convierte a int, con el modificador signed si los
caracteres son con signo, o unsigned si los caracteres son sin signo (p. 10). Un
unsigned char es convertido a int con los bits ms altos puestos a cero. Un signed
char es convertido a int con los bits ms altos puestos a uno o cero, dependiendo del
valor de la variable. Para los tipos de mayor tamao:
1. Si un operando es de tipo double, el otro es convertido a double.
2. Si un operando es de tipo float, el otro es convertido a float.
3. Si un operando es de tipo unsigned long, el otro es convertido a unsigned long.
4. Si un operando es de tipo long, el otro es convertido a long.
17
5. Si un operando es de tipo unsigned, el otro es convertido a unsigned.
6. Si no, los operandos son de tipo int. (Muoz, D. y Palacios, R., 2006, p. 10).
Una variable o expresin de un tipo se puede convertir explcitamente a otro
tipo, anteponindole el tipo entre parntesis.
void cambio_tipo (void)
{
float a;
int b;
b = 10;
a = 0.5;
if ( a <=(float) b )
menor();
}

Control de Flujo

Sentencia if

La sentencia de control bsica es if (<e>) then <s> else <t>. En ella se evala
una expresin condicional y si se cumple, se ejecuta la sentencia s; si no, se ejecuta la
sentencia t. La segunda parte de la condicin, else <t>, es opcional.

int cero ( double a )
{
if ( a == 0.0 )
return (TRUE);
else
return (FALSE);
}

18
En el caso que <e> no sea una expresin condicional y sea aritmtica, se
considera falso si vale 0; y si no, verdadero. Hay casos en los que se deben evaluar
mltiples condiciones y nicamente se debe evaluar una de ellas.

Setencia switch

Se puede programar con un grupo de sentencias if then else anidadas, aunque
ello puede ser farragoso y de complicada lectura. Para evitarlo nos puede ayudar la
sentencia switch. Su utilizacin es:

switch (valor) {
case valor1: <sentencias>
case valor2: <sentencias>
...
default: <sentencias>
}

Cuando se encuentra una sentencia case que concuerda con el valor del switch
se ejecutan las sentencias que le siguen y todas las dems a partir de ah, a no ser que
se introduzca una sentencia break para salir de la sentencia switch. Por ejemplo:
ver_opcion ( char c )
{
switch(c){
case 'a': printf("Op A\n");
break;
case 'b': printf("Op B\n");
break;
case 'c':
case 'd': printf("Op C o D\n");
break;
19
default: printf("Op ?\n");
}
}

Setencia while

Otras sentencias de control de flujo son las que nos permiten realizar iteraciones
sobre un conjunto de sentencias. En C tenemos tres formas principales de realizar
iteraciones. La sentencia while (<e>) <s> es seguramente la ms utilizada. La
sentencia, o grupo de sentencias <s> se ejecuta mientras la evaluacin de la expresin
<e> sea verdadera.

long raiz ( long valor )
{
long r = 1;
while ( r * r <= valor )
r++;
return r;
}

Una variacin de la sentencia while es: do <s> while ( <e> ); En ella la
sentencia se ejecuta al menos una vez, antes de que se evale la expresin
condicional.

Setencia for

Otra sentencia iterativa, que permite inicializar los controles del bucle es la
sentencia for ( <i>; <e>; <p> ) <s>. La sentencia for se puede escribir tambin como:

<i>;
while ( <e> ) {
20
<s>;
<p>;
}

El ejemplo anterior se podra escribir como:

long raiz ( long valor )
{
long r;
for ( r = 1; r * r <= valor; r++ )
;
return r;
}

Break y Continue

Otras sentencias interesantes, aunque menos utilizadas son break y continue.
break provoca que se termine la ejecucin de una iteracin o para salir de la sentencia
switch, como ya hemos visto. En cambio, continue provoca que se comience una
nueva iteracin, evalundose la expresin de control. A continuacin dos ejemplos:

void final_countdown (void)
{
int count = 10;
while ( count--> 1 )
{
if ( count == 4 )
start_engines();
if ( status() == WARNING )
break;
21
printf("%d ", count );
}
if ( count == 0 ){
launch();
printf("Shuttle launched\n");
}
else
{
printf("WARNING condition received.\n");
printf("Count held at T - %d\n", count );
}
}
d2 ()
{
int f;
for ( f = 1; f <= 50; f++ ) {
if ( f % 2 == 0 )
continue;
printf("%d",f );
}
}

Definicin y Prototipos de Funciones

Los programas sencillos, como los ejemplo planteados hasta ahora,
normalmente no necesitan un nivel de estructuracin elevado. Pero cuando stos
crecen un poco necesitamos estructurarlos adecuadamente para mantenerlos legibles,
facilitar su mantenimiento y para poder reutilizar ciertas porciones de cdigo. Muoz,
D. y Palacios, R. (2006) exponen que El mecanismo C que nos permite esto son las
funciones. Con los compiladores, los fabricantes nos proporcionan un conjunto
22
importante de funciones de librera. A veces, nos puede interesar construir nuestras
propias libreras (p. 22). Ya se han utilizado funciones, pero se ver cmo deben ser
definidas. Los prototipos de funciones son una caracterstica clave de la
recomendacin ANSI del C. Un prototipo es una declaracin que toma la forma:
tipo_resultado nombre_funcin ( tipo_parmetro nombre_parmetro ... );

int fact_i ( int v );
int mayor ( int a, int b );
int cero ( double a );
long raiz ( long valor );
void final_countdown ( void );
int main ( int argc, char **argv );

Observando el prototipo de una funcin se puede decir exactamente qu tipo de
parmetros necesita y que resultado devuelve. Si una funcin tiene como argumento
void, quiere decir que no tiene argumentos, al igual que si el resultado es void, no
devuelve ningn valor. En la vieja definicin de Kernighan y Ritchie el tipo que
devolva una funcin se declaraba nicamente si era distinto de int. Similarmente, los
parmetros eran declarados en el cuerpo de la funcin, en lugar de utilizar la lista de
parmetros. Por ejemplo:

mayor ( a, b )
int a;
int b;
{
...
}

Las funciones al viejo estilo se compilan correctamente en muchos
compiladores actuales. Por contra, proporcionan menos informacin sobre sus
23
parmetros y errores que afecten al tipo de parmetros de llamada a las funciones no
pueden ser detectados automticamente. Por tanto, la declaracin de una funcin debe
escribirse igual que su prototipo pero sin el punto y coma final. El cuerpo de la
funcin le sigue encerrado entre llaves. Muoz, D. y Palacios, R. (2006) manifiestan
que
En un programa que est formado por distintas partes bien diferenciadas
es conveniente utilizar mltiples ficheros fuente. Cada fuente agrupa las
funciones semejantes, como por ejemplo en un compilador podramos
tener un fuente para el anlisis lxico, otro para el sintctico y otro para
la generacin de cdigo. Pero en un fuente necesitaremos funciones que
se han definido en otro. (p. 28)

Para ello, se escribe un fichero de cabecera (header), que contendr las
declaraciones que se pueden necesitar en otras fuentes. As, en el fuente que
implementa el analizador sintctico se pondr una lnea #include "lexic.h". De esta
forma al compilar el mdulo sintctico se tendr todos los prototipos de las funciones
del lxico y el compilador podr detectar malas utilizaciones de las funciones all
definidas.

Construccin de Tipos

Los datos del mundo real, normalmente no estn formados por variables
escalares de tipos los tipos bsicos. Por ejemplo, nos puede interesar saber cuntos
mdulos en C hemos escrito cada semana, a lo largo del ao. O tambin nos interesa
tener los datos de cada planeta del Sistema Solar, masa, posicin, velocidad y
aceleracin, para un programa de simulacin de la ley de gravitacin de Newton. Para
resolver el primer caso, C nos permite declarar una variable que sea de tipo vector.
Para el segundo, podemos definir un registro para cada elemento.
Un vector es una porcin de memoria que es utilizada para almacenar un grupo
de elementos del mismo tipo Un vector se declara: tipo nombre [tamao];. Por
ejemplo, int modulo[52];. Aqu 'modulo' es un vector de 52 elementos enteros.
main()
24
{
int f, modulo[52];
for ( f = 0; f< 52; f++ )
modulo[f] = 0;
...
}
Cada elemento de un vector es accedido mediante un nmero de ndice y se
comporta como una variable del tipo base del vector. Los elementos de un vector son
accedidos por ndices que van desde 0 hasta N-1 para un vector de N elementos. Los
elementos de un vector pueden ser inicializados en la misma declaracin:

char vocal[5] = {'a', 'e', 'i', 'o', 'u' };
float n_Bode[5] = { 0.4, 0.7, 1, 1.6, 2.8 };

Tambin podemos definir vectores multidimensionales. C no impone ninguna
limitacin al nmero de dimensiones de un vector. Existe, en cambio, la limitacin
del tamao de memoria que podamos utilizar en nuestro ordenador. Por ejemplo, para
la declaracin de un vector multidimensional podemos escribir:

int video[25][80][2];

El tamao de la variable video es proporcional al tamao del tipo int y al
tamao de cada dimensin. Existe un operador C que nos permite obtener el tamao
de un tipo o de una variable. Este es sizeof() y nos proporciona el tamao en bytes.

if ( sizeof(video) == 80 * 25 * 2 * sizeof(int) )
printf("OK!\n");
else
printf("Algo no funciona.\n");

25
Un tipo vector muy utilizado es la cadena de caracteres (string). Si queremos
asignar espacio para un string podemos hacer:

char nombre[60], direccion[80];

Es un vector C pero con la particularidad de que el propio lenguaje utiliza un
carcter especial como marca de final de string. As en un vector de caracteres de
tamao N podremos almacenar una cadena de N-1 caracteres, cuyo ltimo carcter
estar en la posicin N-2 y la marca de final de string en la N-1. Veamos un ejemplo:

char servei[6] = "SCI";

La posicin 0 contiene el carcter 'S'; la 1 el 'C'; la 2 el 'I'; la 3 el '\0', marca de
final de string. El resto de componentes no estn definidas. En la inicializacin de
strings no se debe indicar el final; ya lo hace el compilador. Para la manipulacin de
cadenas de caracteres ANSI proporciona el fichero string.h que contiene las
declaraciones de un conjunto de funciones proporcionadas con la librera del
compilador. Un registro agrupa distintos tipos de datos en una misma estructura. Los
registros son definidos de la forma:

struct nombre{ lista de declaraciones };

Los campos de cada registro pueden ser tipos bsicos u otros registros. Por
ejemplo:

struct planeta {
struct 3D r, v, a;
double masa;
char nom[10];
};
26
struct 3D {
double x,y,z;
};
Los campos de cada registro son accesibles mediante el nombre del registro
seguido de punto y el nombre del campo, como por ejemplo venus.r.x = 1.0;. Cada
campo se comporta como lo hace su tipo bsico. C no proporciona mecanismos de
inicializacin, ni copia de registros, por lo que debe ser el programador el que los
implemente.
A veces los datos se ajustan a series ordenadas en las cuales un elemento sigue,
o precede, a otro. Un caso tpico son los das de la semana. Si se desea realizar
iteraciones con los das de la semana una forma es, por ejemplo, asignar un nmero a
cada da con #define. C proporciona un mecanismo compacto para realizar esto; son
las enumeraciones. Una enumeracin toma la forma: enum nombre { lista de
elementos };. Veamos un ejemplo:

void planning ( void )
{
enum diasemana {lunes, martes, miercoles,
jueves, viernes, sabado, domingo };
int dia;
for ( dia = lunes; dia <= viernes; dia++ )
trabajar(dia);
if ( dia == sabado )
salir();
}

A cada elemento de la enumeracin se le asigna un valor consecutivo,
comenzando por 0. Si se desea que el valor asignado sea distinto se puede hacer de la
siguiente forma:

27
enum puntos { t_6_25 = 3, t_zona = 2, t_libre = 1 };

Muchas veces es conveniente renombrar tipos de datos para que la escritura del
programa se nos haga ms sencilla y la lectura tambin. Esto se puede conseguir con
la palabra typedef. Con ella damos un nombre a cierto tipo, o combinacin de ellos.

typedef struct planeta PLANETA;

PLANETA mercurio, venus, tierra, marte;

Al igual que podemos inicializar las variables de tipos bsicos en la misma
declaracin, tambin lo podemos hacer con los registros. Los valores de cada campo
de un registro van separados por comas y encerrados entre llaves.

PLANETA mercurio = {{ 0.350, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
100,"Mercurio" };

mbito de Funciones y Variables

El mbito, o visibilidad, de una variable nos indica en que lugares del programa
est activa esa variable. Hasta ahora, en los ejemplos que hemos visto, se han
utilizado variables definidas en el cuerpo de funciones. Estas variables se crean en la
memoria del ordenador cuando se llama a la funcin y se destruyen cuando la funcin
termina de ejecutarse. Es necesario a veces, que una variable tenga un valor que
pueda ser accesible desde todas las funciones de un mismo fuente, e incluso desde
otros fuentes.
En C, segn Muoz, D. y Palacios, R. (2006), el mbito de las variables
depende de dnde han sido declaradas y si se les ha aplicado algn modificador. Una
28
variable definida en una funcin es, por defecto, una variable local (p. 32). Esto es,
que slo existe y puede ser accedida dentro de la funcin. Para que una variable sea
visible desde una funcin cualquiera del mismo fuente debe declararse fuera de
cualquier funcin.
Esta variable slo ser visible en las funciones definidas despus de su
declaracin. Por esto, el lugar ms comn para definir las variables globales es antes
de la definicin de ninguna funcin. Por defecto, una variable global es visible desde
otra fuente. Para definir que existe una variable global que est definida en otra fuente
tenemos que anteponer la palabra extern a su declaracin. Esta declaracin
nicamente indica al compilador que se har referencia a una variable declarada en un
mdulo distinto al que se compila.
Las variables locales llevan implcito el modificador auto. Este indica que se
crean al inicio de la ejecucin de la funcin y se destruyen al final. En un programa
sera muy ineficiente en trminos de almacenamiento que se crearan todas las
variables al inicio de la ejecucin. Por contra, en algunos casos es deseable. Esto se
consigue anteponiendo el modificador static a una variable local. Si una funcin
necesita una variable que nicamente sea accedida por la misma funcin y que
conserve su valor a travs de sucesivas llamadas, es el caso adecuado para que sea
declarada local a la funcin con el modificador static.
El modificador static se puede aplicar tambin a variables globales. Una
variable global es por defecto accesible desde cualquier fuente del programa. Si, por
cualquier motivo, se desea que una de estas variables no se visible desde otro fuente
se le debe aplicar el modificador static. Lo mismo ocurre con las funciones. Las
funciones definidas en un fuente son utilizables desde cualquier otro. En este caso
conviene incluir los prototipos de las funciones del otro fuente. Si no se desea que
alguna funcin pueda ser llamada desde fuera del fuente en la que est definida se le
debe anteponer el modificador static.z
void contar ( void )
{
static long cuenta = 0;
29
cuenta++;
printf("Llamada%ld veces\n", cuenta );
}

Un modificador muy importante es const. Con l se pueden definir variables
cuyo valor debe permanecer constante durante toda la ejecucin del programa.
Tambin se puede utilizar con argumentos de funciones. En esta caso se indica que el
argumento en cuestin es un parmetro y su valor no debe ser modificado. Si al
programar la funcin, modificamos ese parmetro, el compilador nos indicar el
error.

#define EULER 2.71828
const double pi = 3.14159;
double lcercle (const double r )
{
return 2.0 * pi * r;
}
double EXP ( const double x )
{
return pow (EULER, x );
}
double sinh (const double x )
{
return (exp(x) - exp(-x)) / 2.0;
}

Debemos fijarnos que en el ejemplo anterior pi es una variable, la cual no
podemos modificar. Por ello pi slo puede aparecer en un nico fuente. Si la
definimos en varios, al linkar el programa se nos generar un error por tener una
30
variable duplicada. En el caso en que queramos acceder a ella desde otro fuente,
debemos declararla con el modificador extern.
Otro modificador utilizado algunas veces es el register. Este modificador es
aplicable nicamente a variables locales e indica al compilador que esta variable debe
ser almacenada permanentemente en un registro del procesador del ordenador. Este
modificador es herencia de los viejos tiempos, cuando las tecnologas de
optimizacin de cdigo no estaban muy desarrolladas y se deba indicar qu variable
era muy utilizada en la funcin.
Muoz, D. y Palacios, R. (2006), exponen que Hoy en da casi todos los
compiladores realizan un estudio de qu variables locales son las ms adecuadas para
ser almacenadas en registros, y las asignan automticamente (p. 33). Con los
compiladores modernos se puede dar el caso de que una declaracin register
inadecuada disminuya la velocidad de ejecucin de la funcin, en lugar de
aumentarla. Por ello, hoy en da, la utilizacin de este modificador est en desuso,
hasta el punto de que algunos compiladores lo ignoran. Se debe tener en cuenta que
de una variable declarada como register no se puede obtener su direccin, ya que est
almacenada en un registro y no en memoria.

Punteros

Cada variable de un programa tiene una direccin en la memoria del ordenador.
Esta direccin indica la posicin del primer byte que la variable ocupa. En el caso de
una estructura es la direccin del primer campo. En los ordenadores actuales la
direccin de inicio se considera la direccin baja de memoria. Como en cualquier
caso las variables son almacenadas ordenadamente y de una forma predecible, es
posible acceder a estas y manipularlas mediante otra variables que contenga su
direccin. A este tipo de variables se les denomina punteros.
Los punteros C son el tipo ms potente y seguramente la otra clave del xito del
lenguaje. La primera ventaja que obtenemos de los punteros es la posibilidad que nos
dan de poder tratar con datos de un tamao arbitrario sin tener que moverlos por la
31
memoria. Esto puede ahorrar un tiempo de computacin muy importante en algunos
tipos de aplicaciones. Tambin permiten que una funcin reciba y cambie el valor de
una variable. Recordemos que todas las funciones C nicamente aceptan parmetros
por valor. Mediante un puntero a una variable podemos modificarla indirectamente
desde una funcin cualquiera.
Un puntero se declara de la forma: tipo *nombre;

float *pf;
PLANETA *pp;
char *pc;

Para manipular un puntero, como variable que es, se utiliza su nombre; pero
para acceder a la variable a la que apunta se le debe preceder de *. A este proceso se
le llama indireccin. Accedemos indirectamente a una variable. Para trabajar con
punteros existe un operador, &, que indica 'direccin de'. Con l se puede asignar a un
puntero la direccin de una variable, o pasar como parmetro a una funcin.

void prueba_puntero ( void ) {
long edad;
long *p;
p = &edad;
edad = 50;
printf("La edad es %ld\n", edad );
*p = *p / 2;
printf("La edad es %ld\n", edad );
}

void imprimir_string ( char string[] ) {
char *p;
for ( p = string; *p != '\0'; p++ )
32
imprimir_char(*p);
}

Definimos un vector de N_PLA componentes de tipo PLANETA. Este tipo est
formado por un registro. Vemos que en la funcin de inicializacin del vector el
puntero a la primera componente se inicializa con el nombre del vector. Esto es una
caracterstica importante de C. La direccin de la primera componente de un vector se
puede direccionar con el nombre del vector. Esto es debido a que en la memoria del
ordenador, los distintos elementos estn ordenados de forma ascendente. As, SSolar
se puede utilizar como &SSolar[0]. A cada iteracin llamamos a una funcin que nos
inicializar los datos de cada planeta. A esta funcin le pasamos como argumento el
puntero a la componente en curso para que, utilizando la notacin ->, pueda asignar
los valores adecuados a cada campo del registro.
Debemos fijarnos en el incremento del puntero de control de la iteracin, p++.
Con los punteros se pueden realizar determinadas operaciones aritmticas aunque, a
parte del incremento y decremento, no son muy frecuentes. Cuando incrementamos
un puntero el compilador le suma la cantidad necesaria para que apunte al siguiente
elemento de la memoria. Debemos fijarnos que esto es aplicable slo siempre que
haya distintas variables o elementos situados consecutivamente en la memoria, como
ocurre con los vectores. De forma similar se pueden utilizar funciones que tengan
como parmetros punteros, para cambiar el valor de una variable. Veamos:

void intercambio ( void ) {
int a, b;
a = 1;
b = 2;
swap( &a, &b );
printf(" a = %d b = %d\n", a, b );
}

33
void swap ( int *x, int *y ) {
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}

La sintaxis de C puede, a veces, provocar confusin. Se debe distinguir lo que
es un prototipo de una funcin de lo que es una declaracin de una variable. As
mismo, un puntero a un vector de punteros, etc...
int f1(); funcin que devuelve un entero
int *p1; puntero a entero
int *f2(); funcin que devuelve un puntero a entero
int (*pf)(int); puntero a funcin que toma y devuelve un entero
int (*pf2)(int *pi); puntero a funcin que toma un puntero a entero y devuelve
un entero
int a[3]; vector de tres enteros
int *ap[3]; vector de tres punteros a entero
int *(ap[3]); vector de tres punteros a entero
int (*pa)[3]; puntero a vector de tres enteros
int (*apf[5])(int *pi); vector de 5 punteros a funcin que toman un puntero a
entero y devuelven un entero.
En los programas que se escriban se debe intentar evitar declaraciones
complejas que dificulten la legibilidad del programa. Una forma de conseguirlo es
utilizando typedef para redefinir/renombrar tipos.
typedef int *intptr;
typedef intptr (*fptr) ( intptr );
fptr f1, f2;

34
El Preprocesador

El preprocesador es una parte del compilador que se ejecuta en primer lugar,
cuando se compila un fuente C y que realiza unas determinadas operaciones,
independientes del propio lenguaje C. Estas operaciones se realizan a nivel lxico y
son la inclusin de otros textos en un punto del fuente, realizar sustituciones o
eliminar ciertas partes del fuente. Debemos tener en cuenta que el preprocesador
trabaja nicamente con el texto del fuente y no tiene en cuenta ningn aspecto
sintctico ni semntico del lenguaje.
El control del preprocesador se realiza mediante determinadas directivas
incluidas en el fuente. Una directiva es una palabra que interpreta el preprocesador,
que siempre va precedida por el smbolo # y que est situada a principio de lnea.
La directiva #define se utiliza para definir una macro. Las macros proporcionan
principalmente un mecanismo para la sustitucin lxica. Una macro se define de la
forma #define id secuencia. Cada ocurrencia de id en el fuente es sustituida por
secuencia. Puede definirse una macro sin una secuencia de caracteres. Una macro se
puede "indefinir" mediante la directiva #undef.

#define MSG01 "SCI-I-START: Starting system kernel\n"
#define MSG02 "SCI-I-STOP: Stopping system kernel\n"
void print_msg ( void ) {
if ( check_state() == START ) printf(MSG01);
else printf(MSG02);
}

El estado de una macro, si est definida o no, se puede comprobar mediante las
directivas #ifdef y #ifndef. Estas dos directivas se deben completar con una #endif y,
el texto comprendido entre ambas es procesado si la macro est definida. Todas las
directivas deben ser completadas en el mismo fuente y pueden ser anidadas.
#ifndef M_PI
35
#define M_PI 3.1415927
#endif

El preprocesador nos permite tambin incluir tambin otros ficheros en un
fuente C. Esto se consigue con la directiva #include. Esta puede tomar tres formas:
#include , #include "fichero" y #include macro. La diferencia entre la primera y la
segunda est en el lugar dnde se buscar el fichero en cuestin. Normalmente se
utiliza la primera para ficheros proporcionados por la librera del compilador y la
segunda para ficheros creados por el programador.

Funciones de Entrada/Salida

En este apartado y los siguientes vamos a ver algunas de las funciones ms
importantes que nos proporcionan las libreras definidas por ANSI y su utilizacin.
Como hemos visto hasta ahora, el lenguaje C no proporciona ningn mecanismo de
comunicacin ni con el usuario ni con el sistema operativo. Ello es realizado a travs
de las funciones de librera proporcionadas por el compilador. El fichero de
declaraciones que normalmente ms se utiliza es el stdio.h. Vamos a ver algunas
funciones definidas en l.
Una funcin que ya hemos utilizado y que, ella y sus variantes, es la ms
utilizadas para la salida de informacin es printf. Esta permite dar formato y enviar
datos a la salida estndar del sistema operativo.

#include <stdio.h>
int printf ( const char *format [, argumentos, ...] );

Acepta un string de formato y cualquier nmero de argumentos. Estos
argumentos se aplican a cada uno de los especificadores de formato contenidos en
format. Un especificador de formato toma la forma %[flags][width][.prec][h|l] type.
El tipo puede ser como se muestra en el cuadro 4 (p. 36).
36
Cuadro 4
Argumentos en Lenguaje C

Argumento Descripcin
d, i entero decimal con signo
o entero octal sin signo
u entero decimal sin signo
x entero hexadecimal sin signo (en minsculas)
X entero hexadecimal sin signo (en maysculas)
f coma flotante en la forma [-]dddd.dddd
e coma flotante en la forma [-]d.dddd e[+/-]ddd
g coma flotante segn el valor
E como e pero en maysculas
G como g pero en maysculas
c un carcter
s cadena de caracteres terminada en '\0'
% imprime el carcter %
p puntero

Cuadro 5
Flags en Lenguaje C

Flag Descripcin
+ Siempre se imprime el signo, tanto + como -
- Justifica a la izquierda el resultado, aadiendo espacios al
final
blank Si es positivo, imprime un espacio en lugar de un signo +
# Especifica la forma alternativa

En el campo width se especifica la anchura mnima de la forma:

n Se imprimen al menos n caracteres.
0n Se imprimen al menos n caracteres y si la salida es menor, se anteponen
ceros
* La lista de parmetros proporciona el valor

37
Hay dos modificadores de tamao, para los tipos enteros:

l Imprime un entero long
h Imprime un entero short

Otra funcin similar a printf pero para la entrada de datos es scanf. Esta toma
los datos de la entrada estndar del sistema operativo. En este caso, la lista de
argumentos debe estar formada por punteros, que indican dnde depositar los valores.

#include <stdio.h>
int scanf ( const char *format [, argumentos, ...] );

Hay dos funciones que trabajan con strings. La primera lee un string de la
entrada estndar y la segunda lo imprime en el dispositivo de salida estndar.

#include <stdio.h>
char *gets ( char *s );
int puts ( char *s );

Tambin hay funciones de lectura y escritura de caracteres individuales.

#include <stdio.h>
int getchar ( void );
int putchar ( int c );

Veamos, por ejemplo, un programa que copia la entrada estndar a la salida
estndar del sistema operativo, carcter a carcter.

#include <stdio.h>
main()
38
{
int c;
while ( (c = getchar()) != EOF )
putchar(c);
}


Resultados

Ejemplo 1

Programa que a partir del radio, calcula el rea de un circulo

#include <stdio.h>
#include <conio.h>
main()
{
float radio, area;
printf("Radio=\n");
scanf("%f", &radio);
area=3.14159*radio*radio;
printf("El Area es %f\n\n", area);
getch();
return 0;
}

Explicacin: Le indicamos al compilador, que usaremos las bibliotecas <stdio.h> y
<conio.h>, por qu <conio.h>?, porque esta biblioteca, contiene las funciones
getche(), getch(), etc, y de una de ellas hacemos uso en este pequeo ejemplo.
39
Luego, le indicamos a nuestro programa el inicio de nuestro programa (funcin
main() ). Se declara, como valores reales, las variables radio y rea (de esto se hablar
ms adelante). Luego, con la instruccin printf(), mostramos en pantalla el mensaje
(Radio=) y scanf se encarga de leer el valor digitado por el usuario. Posteriormente
area, es igual a la multiplicacin de pi (3.14159), el radio al cuadrado. Se muestra en
pantalla ese resultado, luego el programa espera que se presiones cualquier tecla
(getch() ) y no retorna ningn valor (return 0).

Ejemplo 2.4

Disee un programa que guarde y muestre la nota del examen final de 3 alumnos
#include <stdio.h>
#include <conio.h>
main()
{
float n1, n2, n3;
char nom1[10], nom2[10], nom3[10];
printf("Introduzca el Nombre del Primer alumno:\n");
scanf("%s", nom1);
printf("Introduzca la nota de este alumno:\n");
scanf("%f", &n1);
printf("Digite el nombre del segundo alumno:\n");
scanf("%s", nom2);
printf("Su nota es:\n");
scanf("%f", &n2);
printf("Finalmente el ultimo alumno es:\n");
scanf("%s", nom3);
printf("Y su nota es:\n");
scanf("%f", &n3);
getch();
40
return 0;
}

Explicacin: Primero, se inicia con las directivas del preprocesador:
#include <stdio.h>
#include <conio.h>
Con la cual se le indica al compilador, que de su librera aada al programa las
funciones estndar de entrada y salida; as como las entradas y salidas por consola
(stadio.h y conio.h, respectivamente). Luego se declaran las variables, que contendrn
las notas como reales (o de punto flotante):
float n1, n2, n3;
Ya que, las notas pueden ser decimales, por ejemplo 9.6, 8.5; etc.
Luego se declaran las variables, que contendrn las notas, cabe aclarar que al
momento de las declaraciones las podemos hacer en el orden que deseemos, pueden
ser primeros los tipo char y luego los float, o viceversa, pero teniendo el cuidado que
las variables que contendrn las nombres lleven la longitud mxima entre corchetes,
para nuestro caso, 10. ( [10] ).
Posteriormente, se muestra en pantalla, un mensaje con el cual le indicamos al
usuario que introduzca los datos respectivos:
printf("Introduzca el Nombre del Primer alumno:\n");
A continuacin, va la funcin scanf, primero y entre comillas el tipo de dato que va a
leer:
scanf("%s", nom1);
Como puede notarse, va a leer la cadena de texto que contendr la variable nom1.
Cabe aclarar, que cuando se van a leer cadenas de texto, no es necesario colocar la
direccin (&), lo cual no sucede con los otros tipos de datos:
scanf("%f", &n1);
Despus de haber ledo los datos, espera a que se presiones cualquier tecla para
finalizar la ejecucin del programa.

41
Ejemplo 3

Programa que imprime dos veces, la cadena de texto que se ha introducido:
#include <stdio.h>
#include <conio.h>
main()
{
char cadena[15];
printf("Digite la cadena:\n\n");
scanf("%s", cadena);
printf("\n\t LA CADENA ES LA SIGUIENTE:\n\n");
printf("***********************************************\n");
printf("%s\n", cadena);
printf("%s\n", cadena);
printf("***********************************************\n");
getch();
return 0;
}
Es importante, que el lector, intente correr, en su mquina estos ejemplos, para que
comprenda con mayor facilidad.
NOTA: Cuando la entrada, es una cadena de carcter, no es necesario el operador
direccional (&). El nombre de la cadena contiene la direccin.
Ejemplo:



scanf(), finaliza la captacin de la cadena al encontrar un espacio en blanco o fin de
lnea.

42
Ejemplo 4

Utilizando los operadores Unarios:
#include <stdio.h>
#include <conio.h>
main()
{
int x=5;
printf("\tPRIMERO OBSERVAREMOS EL RESULTADO DE ++X\n\n");
printf("%d\n", ++x);
printf("%d\n", ++x);
printf("%d\n", ++x);
printf("\tAHORA OBSERVAREMOS EL RESULTADO DE --X\n\n");
printf("%d\n", --x);
printf("%d\n", --x);
printf("%d\n", --x);
printf("\tEL RESULTADO DE X++ ES:\n\n");
printf("%d\n", x++);
printf("%d\n", x++);
printf("\tY EL DE X-- ES:\n\n");
printf("%d\n", x--);
printf("%d\n", x--);
getch();
return 0;
}

Ejemplo 5

Programa que calcula el valor de la expresin X^2+X+1
#include <stdio.h>
43
#include <conio.h>
main()
{
float x, y, z;
clrscr();
printf("\tPROGRAMA QUE CALCULA EL VALOR DE LA ECUACION
X^2+X+1\n\n");
printf("Introduzaca el valor de x:\n");
scanf("%f", &x);
y=x*x;
z=y+x+1;
printf("**************************************\n");
printf("**El valor de la expresin es: %.2f**\n", z);
printf("**************************************\n");
getch();
return 0;
}

Ejemplo 6

Disee un programa que calcula el cuadrado y el cubo de tres nmeros introducidos
por el usuario.
#include <stdio.h>
#include <conio.h>
main()
{
int x, x1, x2, y, y1, y2, z, z1, z2;
clrscr();
printf("\tPROGRAMA QUE CALCULA EL CUADRADO Y EL CUBO DE 3
NUMEROS\n\n");
44
printf("Introduzaca el primer nmero:\n");
scanf("%d", &x);
printf("Ahora ingrese el siguiente nmero:\n");
scanf("%d", &y);
printf("Y el tercer nmero es:\n");
scanf("%d", &z);
x1=x*x;
x2=x*x*x;
y1=y*y;
y2=y*y*y;
z1=z*z;
z2=z*z*z;
printf("*********************************\n");
printf("**Numero****Cuadrado*****Cubo****\n");
printf("**%d **** %d ***** %d ****\n", x, x1, x2);
printf("**%d **** %d ***** %d ****\n", y, y1, y2);
printf("**%d **** %d ***** %d ****\n", z, z1, z2);
printf("*********************************\n");
getch();
return 0;
}

Ejemplo 6

Una empresa necesita conocer el sueldo neto a pagar a un empleado. Teniendo como
entrada el salario produzca una salida de sueldo neto. Los descuentos a aplicar son:
ISSS 5%, AFP 7% y Renta 10%, estos descuentos son sobre el salario, y es sueldo
neto es la diferencia entre el salario y el total de las retenciones:
#include <stdio.h>
#include <conio.h>
45
main()
{
float sueldo, afp, isss, renta, sn;
char nombre[50];
clrscr();
printf("Introduzca el Nombre del empleado:\n");
scanf("%s", nombre);
printf("Su sueldo es:\n");
scanf("%f", &sueldo);
afp=sueldo*0.07;
isss=sueldo*0.05;
renta=sueldo*0.10;
sn=sueldo-(afp+isss+renta);
printf("El empleado %s\n", nombre);
printf("Posee un sueldo neto de %.2f\n", sn);
getch();
return 0;
}

Ejemplo 7

Disee un programa que calcule el promedio y la suma de tres nmeros ingresados
por el usuario:
#include <stdio.h>
#include <conio.h>
main()
{
float x, y, z, sum, prom;
clrscr();
printf("El Primer nmero es:\n");
46
scanf("%f", &x);
printf("Ahora el segundo nmero:\n");
scanf("%f", &y);
printf("El Ultimo numero es:\n");
scanf("%f", &z);
sum=x+y+z;
prom=sum/3;
printf("*****************************************\n");
printf("**La suma es %.2f y el promedio es %.2f*\n", sum, prom);
printf("*****************************************\n");
getch();
return 0;
}

Ejemplo 8

En una tienda se venden artculos de primera necesidad, a los cuales se les aplica un
descuento del 20%, de la compra total, si esta es igual o mayor a $50. Disee un
programa en C, que a partir del importe total de la compra muestre lo que debe pagar
el cliente.
#include <stdio.h>
#include <conio.h>
main()
{
float compra;
clrscr();
printf("Introduzca el valor de la compra:\n");
scanf("%f", &compra);
if(compra>=50)
compra=compra*0.8;
47
printf("El Importe de la compra es %.2f\n\n", compra);
getch();
return 0;
}

Ejemplo 9

Se desea saber si un nmero es par o impar. Disee un programa en el cual el usuario,
ingrese el nmero y el programa muestre con un mensaje, si ste es par o no.
#include <stdio.h>
#include <conio.h>
main()
{
int num;
printf("Ingrese el nmero:\n");
scanf("%d", &num);
if(num%2==0)
printf("ES PAR\n\n");
else
printf("ES IMPAR\n\n");
getch();
return 0;
}

Ejemplo 10

Disee un programa, que dada la nota de alumno, imprima en la pantalla un
comentario sobre esa nota. El criterio para los comentarios es el siguiente:
Si nota es mayor o igual a 9 "Excelente"
Si nota es mayor o igual a 8 "Muy Bueno"
48
Si nota es mayor o igual a 7 "Bueno"
Si nota es mayor o igual a 6 "Regular"
Si nota es menor que 6 "Necesita Mejorar"
#include <stdio.h>
#include <conio.h>
main()
{
float nota;
printf("Digite la nota, porfavor:\n");
scanf("%f", &nota);
if(nota >= 9.0)
printf("EXCELENTE\n\n");
else
if(nota >= 8.0)
printf("MUY BUENO\n\n");
else
if(nota >= 7.0)
printf("BUENO\n\n");
else
if(nota >=6.0)
printf("REGULAR\n\n");
else
printf("NECESITA MEJORAR\n\n");
getch();
return 0;
}
Este ejemplo, muestra que C, permite hacer anidamientos, es decir, una
seleccin dentro de otra, ya sea del lado del cierto, o del falso o de ambos.
El lector, puede tratar de hacer sus propias conclusiones, adems de buscar
otras posibles solucione para este mismo problema. Por ejemplo, que pasara si
49
iniciamos con la condicin del 6.0?. Qu pasara si el usuario digita una neta
negativa? Cmo podras darle solucin a este problema?. Como programadores,
debemos hacernos muchas preguntas al momento de disear nuestros programas, ya
que estos No sern usados por nosotros, sino por otras personas.

Ejemplo 10

Dada el peso, la altura y el sexo, de unos estudiantes. Determinar la cantidad
de vitaminas que deben consumir estos estudiantes, en base al siguiente criterio:
Si son varones, y su estatura es mayor a 1.60, y su peso es mayor o igual a 150
lb, su dosis, sern: 20% de la estatura y 80% de su peso. De lo contrario, la
dosis ser la siguiente: 30% de la estatura y 70% de su peso.
Si son mujeres, y su estatura es mayor de a 1.50 m y su peso es mayor o igual a
130 lb, su dosis ser: 25% de la estatura y 75% de su peso. De lo contrario, la
dosis ser: 35% de la estatura y 65% de su peso. La dosis debe ser expresada en
gramos.
#include <stdio.h>
#include <conio.h>
main()
{
float peso, estatura, dosis;
char sexo;
printf("Introduzca el sexo del alumno(a)<H/M>:\n");
scanf("%c", &sexo);
printf("Peso:\n");
scanf("%f", &peso);
printf("La estatura es de:\n");
scanf("%f", &estatura);
if(sexo=='H' || sexo=='h')
{
50
if(estatura>1.60 && peso >=150)
{
dosis=(0.20*estatura)+(0.8*peso);
printf("La dosis de este alumno ser : %.2f gramos\n\n", dosis);
}
else
{
dosis=(0.3*estatura)+(0.7*peso);
printf("La dosis de este alumno sera %.2f gramos\n\n", dosis);
}
}
else
{
if(estatura>1.50 && peso >=130)
{
dosis=(0.25*estatura)+(0.75*peso);
printf("La dosis de esta alumna debe ser de %.2f gramos\n\n", dosis);
}
else
{
dosis=(0.35*estatura)+(0.65*peso);
printf("La dosis de esta alumna debe ser de %.2f gramos\n\n", dosis);
}
}
getch();
return 0;
}




51
CONCLUSIONES



1. No es completamente estructurado en bloques porque no permite declarar
procedimientos o funciones dentro de otros procedimientos o funciones.
2. El lenguaje C est influenciado, diseado y probado por programadores
profesionales. Proporciona: Una visin prxima a la mquina, pocas
restricciones; pocas pegas; conjunto reducido de palabras clave; estructuracin
en bloques; funciones independientes y recursos para el encapsulamiento de
datos.
3. Las constantes, identificadores y palabras clave deben separarse; pero ello
puede hacerse con: espacios en blanco; marcas de tabulador; marcas de salto de
lnea y comentarios.

























52



RECOMENDACIONES



1. La necesidad de contar con programadores con talento no har ms que
incrementarse en el futuro. Incluso hoy en da los puestos en programacin
informtica son de los mejores pagados. Como se puede observar, si se quiere
contar un trabajo bien remunerado, ser mejor que adquirir algo de experiencia
en programacin.
2. Independientemente de qu carrera o grado se decida estudiar, tener
conocimientos de un lenguaje informtico o incluso conocimientos de
programacin bsicos harn que el curriculum vitae resalte sobre los dems.
3. Lo mejor de aprender programacin es poder crear algo nuevo, adems de la
libertad que ofrece para llevar las ideas a la prctica. Por otro lado, el
sentimiento de satisfaccin que se experimenta al resolver un problema o
finalizar un producto que se ha creado son nicos.


















53




REFERENCIAS


Muoz, D. y Palacios, R. (2006). Fundamentos de programacin utilizando lenguaje
C. Univ Pontifica Comillas. Asociacin Juan Carlos Lavalle
Sequera, R. (2005). Lenguaje C. Documento en lnea disponible en
http://www.monografias.com/trabajos4/lenguajec/lenguajec.shtml

















54




ANEXOS














55

Ejemplo No. 1 de Libro Auxiliar


Ejemplo No. 2 de Libro Diario
56

Ejemplo No. 3 de Libros Auxiliares



Ejemplo No. 4 de Libro Auxiliar


57

Ejemplo No. 5 de Libro Auxiliar