Está en la página 1de 37

Apuntes de

Lenguaje C



Ing. Juan Carlos Antn Soto


UNIVERSIDAD NACIONAL AUTONOMA DE
NICARAGUA, UNAN LEON
DEPARTAMENTO DE COMPUTACION
INGENIERIA EN SISTEMA / TELEMATICA
1

INTRODUCCION

C es un lenguaje de programacin estructurado de propsito general. Sus
instrucciones constan de trminos que se parecen a expresiones
algebraicas, adems de ciertas palabras clave inglesas como if, else, for,
do y while.

C tiene tambin algunas caractersticas adicionales que permiten su uso a
un nivel ms bajo, cubriendo as el vaco entre el lenguaje mquina y los
lenguajes de alto nivel ms convencionales. Esta flexibilidad permite el
uso de C en la programacin de sistemas (por ejemplo, para el diseo
sistemas operativos) as como en la programacin de aplicaciones (por
ejemplo, para redactar un programa que resuelva un complicado sistema de
ecuaciones matemticas o un programa que escriba las facturas para los
clientes).
C se caracteriza por hacer posible la redaccin de programas fuente muy
concisos, debido en parte al gran nmero de operadores que incluye el
lenguaje. Tiene un repertorio de instrucciones relativamente pequeo,
aunque las implementaciones actuales incluyen numerosas funciones de
biblioteca que mejoran las instrucciones bsicas. Es ms, el lenguaje
permite a los usuarios escribir funciones de biblioteca adicionales para
su propio uso. De esta forma, las caractersticas y capacidades del
lenguaje pueden ser ampliadas fcilmente por el usuario.

Otra caracterstica importante de C es que los programas son muy
portables, ms que los escritos en otros lenguajes de alto nivel. La razn
de esto es que C deja en manos de las funciones de biblioteca la mayora
de las caractersticas dependientes de la computadora.


Estructura de un programa en C

Todo programa en C consta de uno o ms mdulos llamados funciones. Una de
las funciones se llama main. El programa siempre comenzar por la
ejecucin de la funcin main, la cual puede acceder a las dems funciones.

Las definiciones de las funciones adicionales se deben realizar aparte,
bien precediendo o siguiendo a main.

Cada funcin debe contener:

1. Una cabecera de la funcin, que consta del nombre de la funcin,
seguido de una lista opcional de argumentos encerrados entre parntesis.
2. Una lista de declaracin de argumentos, si se incluyen stos en la
cabecera.
3. Una instruccin compuesta, que contiene el resto de la funcin.
2



Los argumentos son smbolos que representan informacin que se le pasa a
la funcin desde otra parte del programa. (Tambin se llama parmetros a
los argumentos.)
Cada instruccin compuesta se encierra con un par de llaves, { }. Las
llaves pueden contener combinaciones de instrucciones elementales
(denominadas instrucciones de expresin) y otras instrucciones compuestas.

Cada instruccin de expresin debe acabar en punto y coma (;).

Los comentarios pueden aparecer en cualquier parte del programa, mientras
estn situados entre los delimitadores /* y */.
Por ejemplo:
/*Esto es un comentario */.

Los comentarios son tiles para identificar los elementos principales de
un programa o para explicar la lgica subyacente de stos.


CONCEPTOS BASICOS DE C

EL CONJUNTO DE CARACTERES DE C

Para formar los elementos bsicos del programa (constantes, variables,
operadores, expresiones, etc.), C utiliza como bloques de construccin las
letras maysculas de la A a la Z, las minsculas de la a a la z, los
dgitos del O al 9 y ciertos caracteres especiales. Se presenta a
continuacin una lista de estos caracteres especiales:




C utiliza ciertas combinaciones de estos caracteres, como \b, \n y \t,
para representar elementos especiales como el retroceso de un espacio,
nueva lnea y un tabulador, respectivamente.
Estas combinaciones de caracteres se conocen como secuencias de escape.






3


IDENTIFICADORES Y PALABRAS RESERVADAS

Los identificadores son nombres que se les da a varios elementos de un
programa, como variables, funciones. Un identificador est formado por
letras y dgitos, en cualquier orden, excepto el primer carcter, que debe
ser una letra. Se pueden utilizar maysculas y minsculas, aunque es
costumbre utilizar minsculas para la mayora de los identificadores. No
se pueden intercambiar maysculas y minsculas (esto es, una letra
mayscula no es equivalente a la correspondiente minscula.) El carcter
de subrayado (_) se puede incluir tambin, y es considerado como una
letra. Se suele utilizar este carcter en medio de los identificadores. Un
identificador tambin puede comenzar con un carcter de subrayado, aunque
en la prctica no se suele hacer.

Los siguientes nombres son identificadores vlidos.



Los siguientes nombres no son identificadores vlidos por las razones
sealadas.

4num el primer carcter debe ser una letra
a caracteres ilegales ()
orden-no carcter ilegal (-)
indicador error carcter ilegal (espacio en blanco)

NO hay lmite para la longitud de los identificadores, pero dependiendo
del compilador que se utilice solamente los n caracteres primeros son
significativos.

Hay ciertas palabras reservadas que tienen un significado predefinido
estndar. Las palabras reservadas slo se pueden utilizar para su
propsito ya establecido; no se pueden utilizar como identificadores
definidos por el programador.

Las palabras reservadas son:

4



Observe que todas las palabras reservadas estn en minsculas. Como los
caracteres en minsculas y maysculas no son equivalentes, se puede
utilizar una palabra reservada escrita en maysculas como un
identificador. Esto no se suele hacer normalmente, y se considera propio
de un estilo de programacin pobre.

TIPOS DE DATOS

En C, toda variable, antes de poder ser usada, debe ser declarada,
especificando con ello el tipo de dato que almacenar. Toda variable en C
se declara de la forma:

<tipo de dato><nombre de variable> [, nombre de variable];
En C existen cinco tipos de datos segn puede verse en la tabla siguiente:



Algunos ejemplos de variables de C seran:

float a;
int b, c;
char caracter, otro_caracter;


Cada tipo entero puede ser calificado por las palabras clave signed o
unsigned. Un entero calificado signed es un entero con signo; esto es, un
valor entero positivo o negativo. Un valor entero calificado unsigned es
5

un valor entero sin signo, el cual es manipulado como un valor entero
positivo. Esta calificacin da lugar a los siguientes tipos extra:
signed short, unsigned short
signed int, unsigned int
signed long, unsigned long

Si los calificadores signed y unsigned se utilizan sin un tipo entero
especfico, se asume el tipo int. Por este motivo, las siguientes
declaraciones son equivalentes:
signed x; /* es equivalente a */
signed int x;


Tipo enumerado

Crear una enumeracin es definir un nuevo tipo de datos, denominado tipo
enumerado y declarar una variable de este tipo. La sintaxis es la
siguiente:

enum tipo_enumerado
{
/* definicin de nombres de constantes enteras */
};

donde tipo_enumerado es un identificador que nombra al nuevo tipo
definido.

Despus de definir un tipo enumerado, podemos declarar una o ms variables
de este tipo, de la forma:

enum tipo_enumerado [variable [,variable] ... ] ;

El siguiente ejemplo declara una variable llamada color del tipo enumerado
arcoiris, la cual puede tomar cualquier valor de los especificados en la
lista.

enum arcoiris
{
rojo, amarillo, verde, azul, blanco
};

enum arcoiris color;
color = azul;


6

Cada identificador de la lista de constantes en una enumeracin, tiene
asociado un valor. Por defecto, el primer identificador tiene asociado el
valor 0, el siguiente el valor 1 y as sucesivamente. Segn esto:

color = azul; es equivalente a: color = 3;

A cualquier identificador de la lista se le puede asignar un valor
inicial entero por medio de una expresin constante. Los identificadores
sucesivos tomarn valores correlativos a partir de ste, por ejemplo:

enum arcoiris
{
rojo, amarillo, verde = 0, azul, blanco
} color;

Este ejemplo define un tipo enumerado llamado arcoiris y declara una
variable color de ese tipo. Los valores asociados a los identificadores
son los siguientes:
rojo = 0 , amarillo = 1, verde = 0, azul =1, blanco =2


Otro ejemplo:
enum moneda
{
penique, niquel, diez_centavos, cuarto=100, medio_dolar, dolar
}moneda_actual;


Los valores son: penique 0, niquel 1, diez_centavos 2, cuarto 100,
medio_dolar 101, dolar 102.


CONSTANTES

Una constante es, en principio, una variable cuyo valor no puede ser
modificado.
Las constantes se definen con la directiva #define. As:

#define CONSTANTE valor

Cada lnea #define slo puede contener el valor de una constante.
Por ejemplo, podemos definir los valores aproximados de PI y del nmero E
as:

#define PI 3.1415926535897931159979634685442
#define E 2.7182818284590450907955982984276

7

Intentar asignar un valor a PI o a E en el programa produce un error que
detecta el compilador.


No hay operador de asignacin entre el nombre de la constante y su valor y
la lnea no acaba con punto y coma. No es obligatorio que el nombre de la
constante se escriba en maysculas, pero si un convenio ampliamente
adoptado.

De forma alternativa se puede definir constantes mediante una nueva
palabra reservada: const. Puedes usar const delante del tipo de una
variable inicializada en la declaracin para indicar que su valor no se
modificar nunca.

Ejemplo con la palabra reservada const

#include <stdio.h>
int main(void)
{
const float pi = 3.14;
float r, a;

printf ("Radio: ");
scanf ("%f", &r);

a = pi * r * r;

printf("Area: %f\n", a);

return 0;
}

Ejemplo con la directriz #define

#include <stdio.h>
#define pi 3.14

int main(void)
{
float r, a;

printf ("Radio: ");
scanf ("%f", &r);

a = pi * r * r;

printf("Area: %f\n", a);

8

return 0;
}


Secuencias de escape

Ciertos caracteres no imprimibles, as como la barra inclinada hacia atrs
(\) y la comilla simple ('), se pueden expresar en trminos de secuencias
de escape. Una secuencia de escape siempre comienza con una barra
inclinada hacia atrs y es seguida por uno o ms caracteres especiales.

Por ejemplo, un salto de lnea (LF), que se denomina carcter de nueva
lnea en C, se puede representar como \n. Una secuencia de escape siempre
representa un solo carcter, aun cuando se escriba con dos o ms
caracteres.

A continuacin se listan las secuencias de escape utilizadas con mayor
frecuencia.


La secuencia de escape \0 es de especial inters. Representa el carcter
nulo, que se utiliza para indicar el final de una cadena de caracteres.
La constante de carcter nulo '\0' no es equivalente a la constante de
carcter '0'.


Constantes de cadena de caracteres

Una constante de cadena de caracteres consta de cualquier nmero de
caracteres consecutivos(o ninguno), encerrados entre comillas (dobles).



9


Ejemplo:
A continuacin se muestran varias constantes de cadena de caracteres.

verde Washinton D.C. 2005 270-34-3256
$19.95 La respuesta correcta es: 2* (1+3) /J

La siguiente constante de cadena de caracteres incluye tres caracteres
especiales que se representan por sus correspondientes secuencias de
escape.

"\tPara continuar, pulsar la tecla \"RETURN\"\n"

Los caracteres especiales son \t (tabulador horizontal), \" (comillas, que
aparece dos veces) y \n (nueva lnea).

Expresiones numricas
Una expresin es una secuencia de operadores y operandos que especifican
una operacin determinada. Por ejemplo:
a++
suma + = c
cantidad * precio

Operadores
Los operadores son smbolos que indican cmo son manipulados los datos.
Se clasifican en los siguientes grupos: aritmticos, lgicos,
relacionales, de asignacin, operador condicional y otros.

Operadores aritmticos
Se utilizan para realizar operaciones matemticas y son los siguientes:



10


Operador Operacin
+ Suma. Los operandos pueden ser enteros o reales.
- Resta. Los operandos pueden ser enteros o reales.
* Multiplicacin. Los operandos pueden ser enteros o
reales.
/ Divisin. Los operandos pueden ser enteros o
reales. Si ambos operandos son enteros, el
resultado es entero. En el resto de los casos el
resultado es real.
% Mdulo o resto de una divisin entera. Los
operandos tienen que ser enteros.


Ejemplo:

void main(void )
{
int a = 10, b = 3, c;
float x = 2.0, y;

y = x + a; /* el resultado es 12.0 de tipo float */
c = a / b; /* el resultado es 3 de tipo int */
c = a % b; /* el resultado es 1 de tipo int */
y = a / b; /* el resultado es 3 de tipo int. Se convierte a
float para asignarlo a y */
c = x / y; /* el resultado es 0.666667 de tipo float. Se
convierte a int para asignarlo a c ( c = 0)*/
}

Cuando en una operacin aritmtica los operandos son de diferentes tipos,
ambos son convertidos al tipo del operando de precisin ms alta; por
ejemplo, para realizar la suma x+a el valor del entero a es convertido a
float, tipo de x. No se modifica a, sino que su valor es convertido a
float slo para realizar la suma.
El resultado obtenido en una operacin aritmtica es convertido al tipo de
la variable que almacena dicho resultado. Por ejemplo, del resultado de
x/y slo la parte entera es asignada a c, ya que c es de tipo int. Esto
11

indica que los reales son convertidos a enteros, truncando la parte
fraccionaria.

Un resultado real es redondeado. Observe la operacin x/y para x igual a
2 e y igual a 3. El resultado es 0.666667 en lugar de 0.666666 porque la
primera cifra decimal suprimida es 6. Cuando la primera cifra decimal
suprimida es 5 mayor de 5, la ltima cifra decimal conservada se
incrementa en una unidad.

Operadores lgicos

El resultado de una operacin lgica (AND, OR y NOT) es un valor verdadero
o falso(1 0). Por definicin, un valor distinto de cero es siempre
verdadero y un valor cero es siempre falso. Los operadores lgicos de C
son los siguientes:

Operador Operacin
&& AND. Da como resultado el valor lgico 1 si ambos
operandos son distintos de cero. Si uno de ellos es
cero el resultado es el valor lgico 0.
|| OR. El resultado es 0 si ambos operandos son 0. Si
uno de los operandos tiene un valor distinto de
cero, el resultado es 1.
! NOT. El resultado es 0 si el operando tiene un
valor distinto de cero, y 1 en caso contrario.

El resultado de una operacin lgica es de tipo int. Los operandos
pueden ser enteros o reales. Por ejemplo:

void main(void )
{
int p = 10, q = 0, r = 0;
r = p && q; /* da como resultado 0 */
r = p || q; /* da como resultado 1 */
r = !p ; /* da como resultado 0 */

}
12


Operadores de relacin

El resultado de una operacin de relacin es un valor verdadero o falso (1
0). Los operadores de relacin son los siguientes:
Operador Operacin
< Primer operando menor que el segundo.
> Primer operando mayor que el segundo.
<= Primer operando menor o igual que el
segundo.
>= Primer operando mayor o igual que el segundo
!= Primer operando distinto que el segundo
= = Primer operando igual que el segundo

Los operandos pueden ser de tipo entero o real. Por ejemplo:
void main(void)
{
int x = 10, y = 0, r = 0;
r = x = = y; /* da como resultado 0 */
r = x > y; /* da como resultado 1 */
r = x != y ; /* da como resultado 1 */

}

Expresiones de Boole

Una expresin de Boole da como resultado 1 (verdadero) 0 (falso). El
resultado de una comparacin puede utilizarse como operando en una
expresin de Boole. Los operadores que intervienen en una expresin de
Boole pueden ser de relacin y lgicos.


13


Ejemplo:
void main(void )
{
int r = 0, s = 0;
float x = 15, y = 18, z = 20;
r = (x < y) && (y <= z) || s; /* resultado r = 1 */
}

Operadores de asignacin

El resultado de una operacin de asignacin es el valor almacenado en el
operando izquierdo, despus que la asignacin se ha realizado. El valor
que se asigna es convertido al tipo del operando de la izquierda.

Operador Operacin
++ Incremento.
-- Decremento.
= Asignacin simple.
*= Multiplicacin ms asignacin.
/= Divisin ms asignacin.
%= Mdulo ms asignacin.
+= Suma ms asignacin.
-= Resta ms asignacin.

A continuacin se muestran algunos ejemplos con estos operadores:
void main(void )
{
int x = 0, n = 10, i = 1;
x++; /* incrementa el valor de x en 1 */
++x; /* incrementa el valor de x en 1 */
x = --n; /* decremento n en 1 y asigna el resultado a x */
x = n--; /* asigna el valor de n a x y despus decrementa n
en 1 */
14

i += 2; /* realiza la operacin i = i +2;
x *= n - 3; /* realiza la operacin x = x * ( n - 3) y no
x = x * n - 3 */
}


Operador condicional

C tiene un operador ternario ( ?: ) que se utiliza en expresiones
condicionales, las cuales tienen la forma:
operando1 ? operando2 : operando3
El valor resultante de la expresin operando1 debe ser de tipo entero o
real. La ejecucin 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.

El siguiente ejemplo asigna a mayor el resultado (a > b) ? a : b, que ser
a si a es mayor que b y b si a no es mayor que b.
void main(void)
{
float a = 10.2, b = 20.5, mayor = 0;
mayor = (a > b) ? a : b; /* mayor de a y b */
}

Operador sizeof

El operador sizeof da como resultado el tamao en bytes de su operando.
El operando puede ser el identificador de un objeto o el tipo del objeto.
Por ejemplo:

//tamanostipos.c
#include <stdio.h>
void main(void)
{
//Declarar las variables
char c;
int i,tam;
long l;

tam = sizeof(c);

15

//Mostrar los tamaos de las tipos de datos
printf("El tamano del char c es %d byte\n",tam);
printf("El tamano del int i es %d bytes\n",sizeof(i));

tam = sizeof(l);

printf("El tamano del long l es %d bytes\n",tam);
printf("El tamano del float es %d bytes\n",sizeof(float));
printf("El tamano del double es %d bytes\n",sizeof(double));
}



Los parntesis son opcionales, excepto cuando el operando se corresponde
con un tipo de datos.
Prioridad y orden de evaluacin

La tabla que se presenta a continuacin, resume las reglas de prioridad y
asociatividad de todos los operadores. Los operadores escritos sobre una
misma lnea tienen la misma prioridad. Las lneas se han colocado de
mayor a menor prioridad.
Una expresin entre parntesis, siempre se evala primero. Los parntesis
tienen mayor prioridad y son evaluados de ms internos a ms externos.

Operador Asociatividad
( ) [ ] . -> sizeof Izquierda a derecha
- ~ ! * & ++ -- (tipo) Derecha a izquierda
* / % Izquierda a derecha
+ - Izquierda a derecha
<< >> Izquierda a derecha
< <= > >= Izquierda a derecha
16

== != Izquierda a derecha
& Izquierda a derecha
^ Izquierda a derecha
| Izquierda a derecha
&& Izquierda a derecha
|| Izquierda a derecha
?: Derecha a izquierda
= *= /= %= += -= <<=
>>= &= |= ^=
Derecha a izquierda
, Izquierda a derecha



En el siguiente ejemplo, primero se asigna z a y, a continuacin y a x.
Esto es as porque la asociatividad para este operador es de derecha a
izquierda.
void main(void )
{
int x = 0, y = 0, z = 15;
x = y = z; /* resultado x = y = z = 15 */
}


Conversin de tipos

Cuando los operandos que intervienen en una operacin son de tipos
diferentes, antes de realizar la operacin especificada, se convierten a
un tipo comn, de acuerdo con las reglas que se exponen a continuacin,
las cuales se aplican en el orden indicado y adems, siguiendo el orden de
evaluacin:

1. Si un operando es de tipo long double, el otro operando es convertido
a tipo long double.
2. Si un operando es de tipo double, el otro operando es convertido a
tipo double.
3. Si un operando es de tipo float, el otro operando es convertido a tipo
float.
17

4. Un char se convertir a un int, si el tipo int puede representar todos
los valores del tipo original.
5. Si un operando es de tipo long, el otro operando es convertido a tipo
long.

Por ejemplo:

long a;
char b;
int c;
float d;
int f;
f = a + b * c / d;

En la expresin anterior se realiza primero la multiplicacin, despus la
divisin y por ltimo la suma. Segn esto, el proceso de evaluacin ser
de la forma siguiente:
1. b es convertido a int (paso 4).
2. b y c son de tipo int. Se ejecuta la multiplicacin y se obtiene un
resultado de tipo int.
3. Como d es de tipo float, el resultado de b * c, es convertido a float
(paso 3). Se ejecuta la divisin y se obtiene el resultado de tipo
float.
4. a es convertido a float(paso 3). Se ejecuta la suma y se obtiene un
resultado de tipo float.
5. El resultado de a + b * c / d, para ser asignado a f, es pasado a
entero por truncamiento, esto, es, eliminando la parte fraccionaria.



Conversin explcita del tipo de una expresin

En C, est permitida una conversin explcita del tipo de una expresin
mediante una construccin denominada cast, que tiene la forma:
(nombre-de-tipo)expresin
La expresin es convertida al tipo especificado si esa conversin est
permitida; en otro caso, se obtendr un error. La conversin cast,
siempre que se pueda, es mejor evitarla ya que suprime la verificacin de
tipo proporcionada por el compilador y puede conducir a resultados
inesperados.
18

Por ejemplo, la funcin raz cuadrada (sqrt), espera como argumento un
tipo double. Para evitar resultados inesperados en el caso de pasar un
argumento de otro tipo, podemos escribir:
sqrt((double) (n+2))

Su utilidad queda claramente expresada en el ejemplo siguiente:

int a=3,b=2;
float c;
c=a/b;

La operacin asigna a c el valor 1.0 en vez del valor 1.5, ello se debe a
que alser a y b variables de tipo entero, se realiza una divisin entre
enteros, y el resultado de3/2 es 1. A continuacin ese valor 1 se
convierte a un valor en coma flotante para realizar la asignacin (valor
1.0), y se asigna a c. Si lo que se desea es que la divisin se realice en
punto flotante, debe escribirse la operacin de la siguiente forma:

c = (float)a/b;

Esta conversin forzada obliga a convertir la variable a en float, y
entonces, aplicando las reglas de conversin automtica de tipos, se
realiza la divisin en coma flotante. Este proceso da lugar a que el
resultado de la operacin sea 1.5, y dicho valor sea el asignado a la
variable c.


DECLARACIONES

Una declaracin asocia un tipo de dato especificado a un grupo de
variables. Se deben declarar todas las variables antes de que aparezcan en
las instrucciones ejecutables.

Una declaracin consta de un tipo de datos, seguido de uno o ms nombres
de variables, finalizando con un punto y coma.


Ejemplo:
Un programa en e contiene las siguientes declaraciones de tipos:

int a, b, c;
float raizl, raiz2;
char indicador, texto[80];

19

De esta forma se declaran a, b y c como variables enteras, raiz1 y raiz2
son variables en coma flotante, indicador una variable de tipo carcter y
texto un array de tipo carcter de 80 elementos.

Se puede asignar valores iniciales a las variables dentro de la
declaracin de tipo. Para hacer esto, la declaracin debe consistir en un
tipo de dato, seguido por un nombre de variable, un signo igual (=) y una
constante del tipo apropiado. Al final se debe poner, como de costumbre,
un punto y coma (;).

Ejemplo:

int c = 12;
char estrella = *;
float suma = 0.0;
double factor = 0.21023e-6;


FUNCIONES DE BIBLIOTECA


El lenguaje C se acompaa de un cierto nmero de funciones de biblioteca
que realizan varias operaciones y clculos de uso frecuente. Estas
funciones de biblioteca no son parte del lenguaje en s, pero las incluyen
todas las implementaciones del lenguaje C. Algunas funciones devuelven un
dato en su llamada; otras indican cundo una determinada condicin es
verdadera o falsa, devolviendo un valor de 1 0 respectivamente; y otras
efectan operaciones especficas sobre los datos y no devuelven nada.

Suelen existir funciones de biblioteca para efectuar las operaciones que
son dependientes de la computadora.
Por ejemplo, hay funciones de biblioteca que efectan las operaciones
estndar de entrada y salida (leer y escribir caracteres, leer y escribir
nmeros, abrir y cerrar archivos, comprobar la condicin de fin de
archivo, etc.), funciones que realizan operaciones sobre caracteres
(convertir minsculas en maysculas, determinar si un carcter es una
letra mayscula, etc.), funciones que realizan operaciones en cadenas de
caracteres (copiar una cadena de caracteres en otra, comparar dos cadenas,
concatenar dos cadenas, etc.), y funciones que realizan diversos clculos
matemticos (evaluacin de funciones trigonomtricas, logartmica y
exponencial, clculo de valores absolutos, races cuadradas, etc.).







20



Algunas funciones de biblioteca de uso comn




Se muestra a continuacin un fragmento de un programa en el que calcula
las races de la ecuacin cuadrtica

ax
2
+ bx + c = O






21


Utilizando la frmula



Este programa utiliza la funcin de biblioteca sqrt para evaluar la raz
cuadrada.


void main() /* solucin de una ecuacin cuadrtica */












Para utilizar una funcin de biblioteca puede ser necesario incluir cierta
informacin dentro de la parte principal del programa. Por ejemplo, las
declaraciones de funciones y definiciones de constantes simblicas suelen
necesitarse cuando se utilizan funciones de biblioteca. Esta informacin
suele encontrarse almacenada en ciertos archivos que se proporcionan con
el compilador. Por tanto, la informacin requerida se puede obtener
simplemente accediendo a estos archivos. Esto se lleva a cabo mediante la
instruccin del preprocesador #include, que es

#include<nombre-archivo>

nombre_archivo representa el nombre de un determinado archivo.

Los nombres de estos archivos especiales son especficos de cada
implementacin de C, aunque hay ciertos nombres de archivos comnmente
usados, como stdio.h y math.h. El sufijo h generalmente designa un
archivo de cabecera, que indica que se debe incluir al comienzo del
programa.






22


ENTRADA Y SALIDA DE DATOS

La mayora de las versiones de C incluyen una coleccin de archivos de
cabecera que proporcionan la informacin necesaria para las distintas
funciones de biblioteca. Cada archivo contiene generalmente la informacin
necesaria para la utilizacin de un determinado grupo de funciones de
biblioteca. Estos archivos se incluyen en un programa mediante la
instruccin #include al comienzo del programa. Como norma general, el
archivo de cabecera requerido para la entrada/salida estndar se llama
stdio.h

Ejemplo:
El siguiente esquema representa un programa en C tpico que hace uso de
varias rutinas de entrada/salida de la biblioteca estndar de C.


/* ejemplo del uso de funciones de biblioteca de entrada/salida */
#include <stdio.h>
void main()
{
char c, d; /*declaraciones*/
float x, y;
int i, j, k;
c = getchar(); /*entrada de un caracter*/
scanf(%f,&x); /*entrada de numero en coma flotante*/
scanf(%d %d,&i, &j); /*entrada de enteros*/
...
putchar(d); /*salida de un carcter*/
printf(%3d %7.4f, k, y); /*salida de nmeros*/
}

El programa comienza con la instruccin del preprocesador #include <stdio.
h>. Esta instruccin hace que se incluya en el programa el contenido del
archivo de cabecera stdio.h. Este archivo proporciona la informacin
referente a las funciones de biblioteca scanf y printf.

A continuacin de la instruccin del preprocesador se encuentra el
encabezamiento del programa main() y algunas declaraciones de variables.
Aparecen varias instrucciones de entrada/salida en las lneas que siguen a
las declaraciones. En concreto, la instruccin de asignacin c=getchar();
hace que se lea un solo carcter del teclado y se le asigne a la variable
c. La primera referencia a scanf hace que se lea por teclado un valor en
coma flotante y se le asigne a la variable x, mientras que la segunda
llamada a scanf hace que se lean del teclado dos cantidades enteras y se
les asignen a las variables i y j, respectivamente.

23

Las instrucciones de salida se comportan de forma anloga. La llamada a
putchar hace que se visualice el valor de la variable de carcter d.
Anlogamente, la referencia a printf hace que se visualicen el valor de la
variable, entera k y el de la variable en coma flotante y.

ENTRADA DE UN CARCTER, LA FUNCION getchar()

La funcin getchar es parte de la biblioteca de C de entrada/salida
estndar. Devuelve un carcter ledo del dispositivo de entrada estndar
(tpicamente un teclado). La funcin no requiere argumentos, aunque es
necesario que un par de parntesis vacos sigan a la palabra getchar.


En forma general, una referencia a la funcin getchar se escribe as:

Variable de carcter = getchar();

Donde variable de carcter es alguna variable de carcter previamente
declarada.

Ejemplo:
Un programa en C contiene las siguientes instrucciones:

char C;
...
C = getchar();

En la primera instruccin se declara la variable C de tipo carcter. La
segunda instruccin hace que se lea del dispositivo de entrada estndar un
carcter y entonces se le asigne a C.


Ejemplo:

//getchar.c
#include <stdio.h>
void main(void)
{
char car;
printf("Introducir un caracter: ");
car = getchar(); //lee un caracter y lo almacena en la variable car
printf("Caracter: %c, valor ASCII: %d\n\n",car, car);
}

24





La funcin getchar() tambin se puede utilizar para leer cadenas de varios
caracteres, leyendo en un bucle la cadena carcter a carcter.


SALIDA DE UN CARCTER, LA FUNCION putchar

Se puede visualizar un carcter utilizando la funcin de biblioteca
putchar. Esta funcin es complementaria a la de entrada de un carcter
getchar(). La funcin putchar, as como getchar(), es parte de la
biblioteca de entrada/salida estndar. Transmite un carcter al
dispositivo de salida estndar (tpicamente un monitor). El carcter que
se transmite estar representado normalmente por una variable de tipo
carcter. Se debe proporcionar como argumento de la funcin, encerrado
entre parntesis, siguiendo a la palabra putchar.


En general, una referencia a la funcin putchar se escribe como sigue:

putchar(variable de carcter)

Donde variable de carcter hace referencia a una variable de tipo carcter
previamente declarada.

Ejemplo:
Un programa en C contiene las siguientes instrucciones:


//putchar.c
#include <stdio.h>
void main(void)
{
char car;
printf("Introducir un caracter: ");
car = getchar(); //lee un caracter y lo almacena en la variable car
printf("El caracter leido es:");
putchar(car);
printf("\n\n");
}


25




En la primera instruccin se declara la variable car de tipo carcter. La
quinta instruccin hace que se transmita el valor actual de car al
dispositivo de salida estndar (por ejemplo un monitor) en donde se
visualizar.


INTRODUCCION DE DATOS, LA FUNCION SCANF

Se pueden introducir datos en la computadora procedentes del dispositivo
de entrada estndar mediante la funcin de la biblioteca de C scanf. Esta
funcin se puede utilizar para introducir cualquier combinacin de valores
numricos, caracteres individuales y cadenas de caracteres.
La funcin devuelve el nmero de datos que se han conseguido introducir
correctamente.

En trminos generales, la funcin scanf se escribe:

scanf(cadena de control, argl, arg2, ... , argn)

Donde cadena de control hace referencia a una cadena de caracteres que
contiene cierta informacin sobre el formato de los datos y argl,arg2,...,
argn son argumentos que representan los datos.

En la cadena de control se incluyen grupos individuales de caracteres, con
un grupo de caracteres por cada dato de entrada. Cada grupo de caracteres
debe comenzar con el signo de porcentaje (%). En su forma ms sencilla, un
grupo de caracteres estar formado por el signo de porcentaje, seguido de
un carcter de conversin que indica el tipo de dato correspondiente.

Caracteres de conversin de los datos de entrada de uso comn


26



Ejemplo:
La siguiente es una aplicacin tpica de la funcin scanf.

#include <stdio.h>
void main()
{
char concepto[20];
int num_partida;
float coste;

...
scanf(%s %d %f,concepto, &num_partida, &coste);
...
}

Dentro de la funcin scanf(), la cadena de control es "%s %d %f". Contiene
tres grupos de caracteres. El primer grupo de caracteres, %s, indica que
el primer argumento (concepto) representa a una cadena de caracteres. El
segundo grupo de caracteres, %d, indica que el segundo argumento
&num_partida) representa un valor entero decimal, y el tercer grupo de
caracteres, %f, indica que el tercer argumento(&coste) representa un valor
en coma flotante.

Observe que las variable numricas num_partida y coste van precedidas por
ampersands dentro de la funcin scanf. Sin embargo, delante de concepto no
hay ampersand, ya que concepto es el nombre de un array.



ESCRITURA DE DATOS, LA FUNCION printf

Se pueden escribir datos en el dispositivo de salida estndar utilizando
la funcin de biblioteca printf(). Se puede utilizar esta funcin para
escribir cualquier combinacin de valores numricos, caracteres sueltos y
cadenas de caracteres. Es anloga a la funcin de entrada scanf, con la
diferencia de que su propsito es visualizar datos en lugar de
introducirlos en la computadora.

Esto es, la funcin printf se ocupa de transferir datos de la memoria de
la computadora al dispositivo de salida estndar, mientras que la funcin
scanf introduce datos del dispositivo de entrada estndar y los almacena
en la memoria de la computadora.

En trminos generales, la funcin printf se escribe

printf(cadena de control, argl, arg2,. argn)
27


En donde cadena de control hace referencia a una cadena de caracteres que
contiene informacin sobre el formato de la salida y argl, arg2,..., argn
son argumentos que representan los datos de salida. Los argumentos pueden
ser constantes, variables simples o nombres de arrays o expresiones ms
complicadas.

En contraste con la funcin scanf tratada en la seccin anterior, los
argumentos de la funcin printf no representan direcciones de memoria y
por tanto no son precedidos de ampersands.

La cadena de control est compuesta por grupos de caracteres, con un grupo
de caracteres por cada dato de salida. Cada grupo de caracteres debe
comenzar por un signo de porcentaje(%). En su forma ms sencilla, un grupo
de caracteres consistir en el signo de porcentaje seguido de un carcter
de conversin que indica el tipo del dato correspondiente.

Ejemplo:
Se presenta un programa sencillo en el que se utiliza la funcin printf.

#include<stdio.h>
#include<math.h>

void main()
{
float i = 2.0, j = 3.0;
printf(%f %f %f %f, i, j, i+j, sqrt(i+j));
}

Observe que los dos primeros argumentos dentro de la funcin printf son
variables simples, el tercer argumento es una expresin aritmtica y el
ltimo argumento una referencia a una funcin que tiene una expresin
numrica como argumento.

La ejecucin del programa produce la siguiente salida:

2.000000 3.000000 5.000000 2.236068


LAS FUNCIONES gets Y puts

Facilitan la transferencia de cadenas de caracteres entre la computadora y
los dispositivos de entrada/salida estndar.

Cada una de estas funciones acepta un solo argumento. El argumento debe
ser un dato que represente una cadena de caracteres (una formacin de
caracteres). La cadena de caracteres puede incluir caracteres de
espaciado. En el caso de gets, la cadena se introducir por el teclado y
28

terminar con un carcter de nueva lnea (por ejemplo la cadena terminar
cuando el usuario pulse la tecla Intro).

Las funciones gets y puts ofrecen alternativas sencillas al uso de scanf y
printf para la lectura y escritura de cadenas de caracteres, como se
muestra en el siguiente ejemplo.

Ejemplo:
Lectura y escritura de una lnea de texto.

#include <stdio.h>

int main(int argc, char *argv[]) {
char linea[80];
printf("Escriba una oracion cualquiera:");
gets(linea);
puts(linea);
return 0;
}






Este programa utiliza gets y puts en lugar de scanf y printf para
transferir texto hacia dentro y hacia fuera de la computadora.


CARCTER NUEVA LINEA

Cuando introducimos datos por el teclado, y pulsamos la tecla ENTER, se
introduce tambin el carcter \n, lo que podra ocasionar problemas si a
continuacin ejecutamos una sentencia que admita un carcter, ya que el
carcter nueva lnea es considerado como tal.

Otro problema se crea cuando tenemos dos sentencias consecutivas que leen
datos de tipos diferentes.

Para evitar estos errores se aconseja, limpiar el buffer asociado con la
entrada estndar (stdin), usando la funcin de biblioteca fflush()
29

Sintaxis:

#include<stdio.h>
int fflush(FILE *flujo);
La funcin retorna un cero si se ejecuta satisfactoriamente o EOF si
ocurre un error.


Ejemplo:

//nuevalinea.c
#include <stdio.h>
void main(void)
{
float precio = 0;
char car = 0;
printf("Precio: ");
scanf("%g",&precio);

printf("Pulse <Entrar> para continuar ");
scanf("%c",&car);

printf("Precio = %g\n\n",precio);

}





Solucin:

Limpiar el buffer.

//nuevalinea.c
#include <stdio.h>
void main(void)
{
float precio = 0;
char car = 0;
printf("Precio: ");
scanf("%g",&precio);
fflush(stdin);

30

printf("Pulse <Entrar> para continuar ");
scanf("%c",&car);

printf("Precio = %g\n\n",precio);

}








CARCTER DE FIN DE FICHERO

Un dispositivo de entrada o de salida estndar en C es manipulado como si
se tratara de un fichero de datos.

Un fichero de datos, es una coleccin de informacin.

Los datos introducidos por el teclado y los datos visualizados, son una
coleccin de informacin.

Todo fichero tiene un principio y un final. La marca fin de fichero se
consigue presionando ctrl + z, lo que genera la constante EOF definida en
el fichero stdio.h. EOF tiene asignado el valor -1. En algunos programas
se utiliza la marca fin de fichero para indicar la finalizacin de la
entrada de datos.

Ejemplo:

//eof.c
#include <stdio.h>
void main(void)
{
int r = 0;
float precio = 0;

printf("Precio: ");
r = scanf("%g",&precio);

31

(r == EOF) ? printf("Fin de la entrada de
datos\n\n"):printf("%g\n\n",precio);
}










EJERCICIOS RESUELTOS

1. Dada las horas trabajadas de una persona y el valor por hora.
Calcular su salario e imprimirlo.

#include <stdio.h>

int main(int argc, char *argv[]) {

int horas, valor, salario;
printf("\nIngrese las horas trabajadas y el valor por hora: ");
scanf("%d %d", &horas, &valor);
salario = horas * valor;
printf("Salario de la persona: C$ %d\n", salario);

return 0;
}










32



2. Una tienda ofrece un descuento del 15% sobre el total de la compra y
un cliente desea saber cunto deber pagar finalmente por su compra.

#include <stdio.h>

int main(int argc, char *argv[]) {

float totalc, descuento, totalpagar;
printf("Ingrese el total de la compra de la persona: ");
scanf("%f", &totalc);
descuento = totalc * 0.15;
totalpagar = totalc - descuento;
printf("Total de la compra despues del descuento: C$
%.2f\n",totalpagar);

return 0;
}


3. Escriba un programa que, dados los dos lados diferentes de un
rectngulo, encuentre el permetro y el rea del mismo.

Perimetro = 2L1 + 2L2
Area = L1 * L2

#include <stdio.h>

int main(int argc, char *argv[]) {

double L1, L2, per, area;
printf("Ingrese la base y la altura del rectangulo: ");
scanf("%lf %lf",&L1,&L2);
per = 2*L1 + 2*L2;
area = L1 * L2;
printf("\nPerimetro = %g\n", per);
printf("Area = %g\n", area);

return 0;
}







33



4. Realice un programa que, lea las variables Ay B y pase el valor de A
a B y de B a A.

#include<stdio.h>
void man()
{
int A, B, aux;
printf(\nValor de A: );
scanf(%d, &A);
printf(\nValor de B: );
scanf(%d, &B);
aux = A;
A = B;
B = aux;
printf(\n\nvalores Intercambiados\n);
printf(A = %d\n, A);
printf(B = %d\n, B);
}

5. Un vendedor recibe un sueldo base ms un 10% extra por comisin de
sus ventas, el vendedor desea saber cunto dinero obtendr por
concepto de comisiones por las tres ventas que realiza en el mes y el
total que recibir en el mes tomando en cuenta su sueldo base y
comisiones.

#include <stdio.h>

int main(int argc, char *argv[]) {

float sueldob, v1, v2, v3, totvta, com, tpag;
printf("\nIntroduzca el sueldo base y las 3 ventas del mes:\n");
scanf("%f %f %f %f", &sueldob, &v1, &v2, &v3);
totvta = v1 + v2 + v3;
com = totvta * 0.10;
tpag = sueldob + com;
printf("\nPago total: %.2f\n", tpag);
printf("\nComision: %.2f\n", com);

return 0;
}

34

6. A la mam de Juan le preguntan su edad, y contesta: tengo 3 hijos,
pregntele a Juan su edad. Alberto tiene 2/3 de la edad de Juan, Ana
tiene 4/3 de la edad de Juan y mi edad es la suma de las tres. Hacer
un programa que muestre la edad de los cuatro.

#include <stdio.h>

int main(int argc, char *argv[]) {

int EdadJ, EdadAl, EdadA, Edadm;
printf("\nIngrese la edad de Juan: ");
scanf("%d", &EdadJ);
EdadAl = 2*EdadJ/3;
EdadA = 4*EdadJ/3;
Edadm = EdadJ + EdadAl + EdadA;
printf("Las edades son:\n");
printf("Alberto: %d\n", EdadAl);
printf("Juan: %d\n", EdadJ);
printf("Ana: %d\n", EdadA);
printf("Madre: %d\n", Edadm);

return 0;
}


7. Elabore un programa que lea un nmero entero negativo e imprima el
nmero y el positivo del mismo.

#include <stdio.h>

int main(int argc, char *argv[]) {

int numero, npos;
printf("\nIngrese el numero negativo: ");
scanf("%d", &numero);
npos = -1 * numero;
printf("\n\nNumero ingresado es: %d", numero);
printf("\nEl numero positivo es: %d\n\n", npos);

return 0;
}







35

8. Elabore un algoritmo que lea un nmero y obtenga su cuadrado, su cubo
y su raz cuadrada.

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[]) {
int num, cuad, cubo;
double raiz;
printf("\n\nIngrese un numero: ");
scanf("%d",&num);
cuad = pow (num,2);
cubo = pow (num,3);
raiz = sqrt(num);
printf("El cuadrado de %d es: %d\n", num, cuad);
printf("El cubo de %d es: %d\n", num, cubo);
printf("La raiz cuadrada de %d es: %g\n", num, raiz);

return 0;
}




EJERCICIOS PROPUESTOS

1. Dada una cantidad en pesos, obtener la equivalencia en dlares,
asumiendo quela unidad cambiara es un dato desconocido.


2. Calcular el nuevo salario de un obrero si obtuvo un incremento del
25% sobre su salario anterior.

3. El dueo de una tienda compra un artculo a un precio determinado.
Obtener el precio en que lo debe vender para obtener una ganancia del
30%.

4. Construya un programa tal, que dados los datos enteros A, B, escriba
el resultado de la siguiente expresin:



5. Un alumno desea saber cul ser su calificacin final en la materia
de Programacin Estructurada.
36

Dicha calificacin se compone de los siguientes porcentajes:
55% del promedio de sus tres calificaciones parciales.
30% de la calificacin del examen final.
15% de la calificacin de un trabajo final.

6. Realice un programa tal que, pida el nombre completo del usuario y su
ao de nacimiento y que visualice el nombre y la edad del usuario.


7. Se desea convertir un nmero dado por el usuario de nickels y dimes a
una nica cantidad de centavos de dlar. Un nickel es una moneda de 5
centavos dlar y un dimes es una moneda de 10 centavos dlar.

8. Se tiene la siguiente informacin de un empleado:
Cdigo del empleado, nombres, nmero de horas trabajadas al mes,
valor hora trabajada, porcentaje de retencin en la fuente.
Haga un programa que muestre: cdigo, nombres, salario bruto y
salario neto.




Bibliografa

Programacin en C. Byron Gottfried. 2da Edicin Revisada.
Editorial McGraw Hill.

Introduccin a la programacin con C. Andrs Marzal, Isabel
Gracia. Edicin Internet. 2003

También podría gustarte