Está en la página 1de 67

Tutorial de C

FUNDAMENTOS C
Caractersticas de C:
El lenguaje C fue inventado e implementado por primera vez por Dennis Ritchie
en un DEC PDP-11 en Bell Laboratories.
Es el resultado de un proceso de desarrollo comenzado con un lenguaje
anterior denominado B, inventado por Ken Thompson. En los aos 70 el
lenguaje B lleva al desarrollo del C. En 1978, Brian Kernighan y Dennis Ritchie
publicaron el libro The C Programming Language que ha servido hasta la
actualidad como definicin eficiente de este lenguaje.
El lenguaje C se denomina como un lenguaje de nivel medio, puesto que
combina elementos de lenguajes de alto nivel (Fortran, Pascal, Basic, ) con el
funcionalismo del lenguaje ensamblador.
Una de las ventajas ms importantes es la portabilidad de los archivos fuente
resultantes. Quiere esto decir que un programa desarrollado en un PC podr
ser ejecutado en un Macintosh o en una mquina UNIX, con mnimas
modificaciones y una simple recompilacin. El lenguaje C, originalmente
desarrollado por D. Ritchie en los laboratorios Bell de la AT&T, fue
posteriormente estandarizado por un comit del ANSI (American National
Standard Institute) con objeto de garantizar su portabilidad entre las distintas
computadoras, dando lugar al ANSI C, que es la variante que actualmente se
utiliza casi universalmente.
C permite la manipulacin de bits, bytes y direcciones (los elementos bsicos
con que funciona la computadora).
C es un lenguaje de propsito general ampliamente utilizado.
+ Presenta caractersticas de bajo nivel, es decir C trabaja con la misma clase
de objetos que todas las computadoras sin importar el Sistema Operativo
que estn usando.
+ Esta estrechamente asociado con UNIX, UNIX y su software fueron
elaborados en C.
+ Es un lenguaje adecuado para la programacin de sistemas, por su utilidad
en la escritura de Sistemas Operativos, por ejemplo si quieres participar
enriqueciendo LINUX.
+ Tambin es adecuado para elaborar cualquier otro tipo de aplicaciones.
+ Es un lenguaje pequeo ya que slo ofrece instrucciones de control sencillas
y funciones.
+ No ofrece mecanismos de E/S (entrada/salida), todos los mecanismos de
alto nivel se encuentran fuera del lenguaje y se ofrecen como funciones de
biblioteca.
+ Su cdigo fuente es portable ya que puede compilarse y ejecutarse en
multitud de computadoras.
+ Permite la programacin estructurada y de diseo modular.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Los programas en C consisten en una o ms funciones. La nica funcin que
debe estar absolutamente presente es la denominada main, siendo la primera
funcin que es llamada cuando comienza la ejecucin del programa. Aunque
main no forma tcnicamente parte del lenguaje C, hay que tratarla como si loV
fuera, pues si se emplea para nombrar una variable, probablemente confundir
al compilador.
La forma general de un programa en C es:

instrucciones del preprocesador


declaraciones globales
tipo_devuelto main(lista de parmetros)
{
secuencia de instrucciones
}
tipo_devuelto funcin_1(lista de parmetros)
{
secuencia de instrucciones
}
tipo_devuelto funcin_2(lista de parmetros)
{
secuencia de instrucciones
}
...
...
tipo_devuelto funcin_n(lista de parmetros)
{
secuencia de instrucciones
}

El programa as escrito se denomina programa fuente y puede estar escrito en


uno o varios archivos. La magnitud del programa y su estructura interna
determina o aconseja sobre el nmero de archivos a utilizar. La divisin de un
programa en varios archivos es una forma de controlar su manejo y su
modularidad. Cuando los programas son pequeos (hasta 50100 lneas de
cdigo), un solo archivo suele bastar. Para programas ms grandes, y cuando
se quiere mantener ms independencia entre los distintos subprogramas, es
conveniente repartir el cdigo entre varios archivos.
Para que la computadora pueda ejecutarlos es necesario traducirlos a su
propio lenguaje de mquina. Esta es una tarea que realiza un programa
especial llamado compilador, que traduce el programa a lenguaje de mquina.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Esta tarea se suele descomponer en dos etapas, que se pueden realizar juntas
o por separado. El programa de alto nivel se suele almacenar en uno o ms
archivos llamados archivos fuente, que en casi todos los sistemas operativos
se caracterizan por una terminacin (tambin llamada extensin) especial. As,
todos los archivos fuente de C deben terminar por (.c); ejemplos de nombres de
estos archivos son calculos.c, derivada.c, etc. La primera tarea del compilador
es realizar una traduccin directa del programa a un lenguaje ms prximo al
de la computadora (llamado ensamblador), produciendo un archivo objeto con
el mismo nombre que el archivo original, pero con la extensin (.obj). En una
segunda etapa se realiza el proceso de montaje (link) del programa,
consistente en producir un programa ejecutable en lenguaje de mquina, en el
que estn ya incorporados todos los otros mdulos que aporta el sistema sin
intervencin explcita del programador (funciones de librera, recursos del
sistema operativo, etc.). En un PC con sistema operativo Windows el programa
ejecutable se guarda en un archivo con extensin (*.exe). Este archivo es
cargado por el sistema operativo en la memoria RAM cuando el programa va a
ser ejecutado.
Recurdese adems que cada vez que se introduce un cambio en el programa
hay que volver a compilarlo. La compilacin se realiza a nivel de archivo, por lo
que slo los archivos modificados deben ser compilados de nuevo. Si el
programa est repartido entre varios archivos pequeos esta operacin se
realiza mucho ms rpidamente.
Hace algn tiempo lo ms habitual era que el compilador de C se llamase
desde el entorno del sistema operativo MS-DOS, y no desde Windows. Ahora
los entornos de trabajo basados en Windows se han generalizado, y el MSDOS est en claro restroceso como entorno de de sarrollo. En cualquier caso,
la forma de llamar a un compilador vara de un compilador a otro, y es
necesario disponer de los manuales o al menos de cierta informacin relativa al
compilador concreto que se est utilizando.
De ordinario se comienza escribiendo el programa en el archivo fuente
correspondiente (extensin .c) por medio de un editor de texto. MS-DOS
dispone de un editor estndar llamado edit que puede ser utilizado con esta
finalidad. En Windows XP o Vista puede utilizarse Notepad.
Existen tambin entornos de programacin ms sofisticados que se pueden
utilizar desde Windows, como por ejemplo el Visual C++ de Microsoft, o el C++
de Borland, Dev C++. Estos programas ofrecen muchas ms posibilidades que
las de un simple compilador de ANSI C. En cualquier caso, lo que hay que
hacer siempre es consultar el manual correspondiente al compilador que se
vaya a utilizar. Estos sistemas disponen de editores propios con ayudas
suplementarias para la programacin, como por ejemplo criterios de color para
distinguir las palabras clave del lenguaje C.
Nota.- En este curso nos vamos a auxiliar del compilador Dev C ++ Aunque
es un compilador de C Orientado a Objetos este curso solo cubre la
parte de C estructurado. 01

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
El preprocesador es un componente caracterstico de C, que no existe en
otros lenguajes de programacin. El preprocesador acta sobre el programa
fuente, antes de que empiece la compilacin propiamente dicha, para realizar
ciertas operaciones. Una de estas operaciones es, por ejemplo, la sustitucin
de constantes simblicas. As, es posible que un programa haga uso repetidas
veces del valor 3.141592654, correspondiente al nmero . Es posible definir
una constante simblica llamada PI que se define como 3.141592654 al
comienzo del programa y se introduce luego en el cdigo cada vez que hace
falta. En realidad PI no es una variable con un determinado valor: el
preprocesador chequea todo el programa antes de comenzar la compilacin y
sustituye el texto PI por el texto 3.141592654 cada vez que lo encuentra. Las
constantes simblicas suelen escribirse completamente con maysculas, para
distinguirlas de las variables.
El preprocesador realiza muchas otras funciones que se irn viendo a medida
que se vaya explicando el lenguaje. Lo importante es recordar que acta
siempre por delante del compilador (de ah su nombre), facilitando su tarea y la
del programador.
Con objeto de mantener el lenguaje lo ms sencillo posible, muchas
instrucciones que existen en otros lenguajes, no tienen su correspondiente
contrapartida en C. Por ejemplo, en C no hay instrucciones para entrada y
salida de datos. Es evidente, sin embargo, que sta es una funcionalidad que
hay que cubrir de alguna manera. El lenguaje C lo hace por medio de funciones
preprogramadas que se venden o se entregan junto con el compilador. Estas
funciones estn agrupadas en un conjunto de libreras de cdigo objeto, que
constituyen la llamada librera estndar del lenguaje. La llamada a dichas
funciones se hace como a otras funciones cualesquiera, y deben ser
declaradas antes de ser llamadas por el programa (ms adelante se ver cmo
se hace esto por medio de la directiva del preprocesador #include).
Recurdese tambin que todos los archivos que contienen cdigo fuente en C
deben terminar con la extensin (.c), como por ejemplo: producto.c, solucion.c,
etc.
La lectura y escritura (o entrada y salida) de datos se realiza por medio de
llamadas a funciones de una librera que tiene el nombre de stdio (standard
input/output). Las declaraciones de las funciones de esta librera estn en un
archivo llamado stdio.h. Se utilizan funciones diferentes para leer datos desde
teclado o desde disco, y lo mismo para escribir resultados o texto en la
pantalla, en la impresora, en el disco, etc.
Es importante considerar que las funciones de entrada y salida de datos son
verdaderas funciones, con todas sus caractersticas: nombre, valor de retorno y
argumentos.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

CAPITULO 1 - Elementos
Comentarios
Comienzan con /* y finalizan con */ . No se pueden anidar. Dentro de un
comentario no puede aparecer el smbolo /*.

#include <stdio.h>
#include <windows.h>
main()
{
/*********************************/
/*
Esto es un comentario
/*********************************/
printf("Este programa contiene\n");
printf("un comentario. \n");
system(pause);

*/

}
Nota.- La funcin system() con el parmetro pause la usamos aqu para que
la ventana de Windows permanezca abierta y nos deje ver el resultado en Dev
C++. Para usarla se debe incluir la librera windows.h
Palabras reservadas
Otras caractersticas del C es que posee muy pocas palabras clave (32, donde
27 fueron definidas en la versin original y cinco aadidas por el comit del
ANSI, enum, const, signed, void y volatile). Todas las palabras clave de C
estn en minsculas (C distingue entre las maysculas y minsculas). En la
siguiente tabla se muestran las 32 palabras clave:
auto
break
case
char
const
continue
default

do
double
else
enum
extern
oat

for
goto
if
int
long
register

return
short
sizeof
static
struct
switch

typedef
union
unsigned
void
volatile
while

Tipos de datos elementales


Cuando en C, se dice que un objeto es de un tipo, se quiere decir que ese
objeto pertenece a un conjunto especfico de valores con los cuales se pueden
realizar un conjunto de operaciones tambin determinadas.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Existen cinco tipos bsicos: carcter, entero, coma flotante, coma flotante
de doble precisin y void.
Los dems tipos se basan en alguno de estos tipos bsicos. El tamao y el
rango de estos tipos de datos varan con cada tipo de procesador y con la
implementacin del compilador de C.
El tipo void, o bien declara explcitamente una funcin como que no devuelve
valor alguno, o bien crea punteros genricos.
La siguiente tabla muestra todas las combinaciones que se ajustan al estndar
ANSI junto con sus rangos mnimos y longitudes aproximadas en bits.
Tipo
char
unsigned char
signed char
int
unsigned int
signed int
short int
unsigned short int
signed short int
long int
signed long int
unsigned long int
float
double
long double

Significado
carcter
entero
sin signo
con signo
entero corto
entero largo
real

Tamao en bits
Rango
8
-127 a 127
8
0 a 255
8
-127 a 127
16
-32767 a 32767
16
0 a 65535
16
-32767 a 32767
16
-32767 a 32767
16
0 a 65535
16
-32767 a 32767
32
-2147483647 a 2147483647
32
-2147483647 a 2147483647
32
0 a 4294967295
32
seis dgitos de precisin
64
diez dgitos de precisin
64
diez dgitos de precisin

Constantes
Caracteres: 'a', 'b'
Valores enteros:
- Notacin decimal: 987
- Notacin hexadecimal: 0x25 _o 0X25
- Notacin octal: 034
- Enteros sin signo: 485U
- Enteros de tipo long: 485L
- Enteros sin signo de tipo long: 485UL
- Valores negativos (signo menos): -987
Valores reales (coma flotante):
- Ejemplos: 12, 14, 8., .34
- Notacin exponencial: .2e+9, 1.04E-12
- Valores negativos (signo menos): -12 -2e+9
02

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Operadores
Los operadores son palabras o smbolos que hacen que un programa acte
sobre las variables.
En C existen seis tipos de operadores. Aritmticos, relacionales, de asignacin,
lgicos, de direccin y de movimiento.
Instrucciones
Una instruccin es una expresin en C donde se esperan unas consecuencias,
normalmente son asignaciones, operaciones, llamadas a funciones, etc.
Macros del preprocesador
Una macro es una codificacin de instrucciones que implican una o varias
acciones. El preprocesador toma como entrada el programa fuente en C antes
que el compilador y ejecuta todas las macros que encuentra.

La funcin printf
Permite imprimir informacin por la salida estndar.
Formato:

printf(formato, argumentos);
Ejemplos:

printf("Hola mundo\n");
printf("El numero 28 es %d\n", 28);
printf("Imprimir %c %d %f\n", 'a', 28, 3.0e+8);
Especificadores de formato:
Carcter
Argumentos
d, i
entero
u
entero
o
entero
x,X
entero
f
real
e, E
real
g, G
c
carcter
s
cadena de caracteres
%
p
void
ld,lu,lx,lo
entero

Resultado
entero decimal con signo
entero decimal sin signo
entero octal sin signo
entero hexadecimal sin signo
real con punto y con signo
notacin exponencial con signo
un carcter
cadena de caracteres
imprime %
Dependiente implementacin
entero largo

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Especificadores de ancho de campo:

printf("Numero entero = %5d \n", 28);


Produce la salida:
Numero entero =

28

printf("Numero real = %5.4f \n", 28.2);


Produce la salida:
Numero entero = 28.2000
03
Secuencias de escape:
Secuencia Significado
\n
nueva lnea
\t
tabulador
\b
backspace
\r
retorno de carro
\"
comillas
\'
apstrofe
\\
backslash
\?
signo de interrogacin
04

Variables
Identificador utilizado para representar un cierto tipo de informacin. Una
variable es una posicin de memoria con nombre que se usa para mantener un
valor que puede ser modificado en el programa.
Una variable puede almacenar diferentes valores en distintas partes del
programa.
Debe comenzar con una letra o el carcter _
El resto slo puede contener letras, nmeros o _
Ejemplos de variables validas:

numero
_color
identificador_1
C es sensible a maysculas y minsculas. Las siguientes variables son todas
distintas:

pi PI Pi pI

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Declaracin de variables
Todas las variables deben ser declaradas antes de poder usarlas.
Una declaracin asocia un tipo de datos determinado a una o ms variables.
Cada variable es de un tipo de datos determinado.
El formato de una declaracin es:

tipo_de_datos var1, var2, ..., varN;


Ejemplos:

int a, b, c;
float numero_1, numero_2;
char letra;
unsigned long entero;
Deben asignarse a las variables nombres significativos.

int temperatura;
int k;
Una variable puede ser fijada a una constante con la sintaxis:
const tipo identificador = valor (por ejemplo const int a=10).
Expresiones e instrucciones
Una expresin representa una unidad de datos simple, tal como un nmero o
carcter.
Tambin puede estar formados por identificadores y operadores:

a+b
num1 * num2
Una instruccin controla el flujo de ejecucin de un programa.
Instruccin simple:

temperatura = 4 + 5;

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

Instruccin de asignacin
El operador de asignacin (=) asigna un valor a una variable.
Puede asignarse valor inicial a una variable en su declaracin.

#include <stdio.h>
include <windows.h>
main()
{
int a = 1;
float b = 4.0;
int c, d;
char letra;
c = 10;
letra = 'a';
d = a + c;
printf("a = %d \n", a);
printf("b = %f \n", b);
printf("c = %d \n", c);
printf("d = %d \n", d);
printf("La letra es %c \n", letra);
system(pause);
}
05

Funcin scanf()
Permite leer datos del usuario.
La funcin devuelve el nmero de datos que se han ledo correctamente.
Formato:

scanf(formato, argumentos);
Especificadores de formato igual que printf().
Ejemplos:
scanf("%f", &numero);
scanf("%c", &letra);
scanf("%f %d %c", &real, &entero, &letra);
scanf("%ld", &entero_largo);
* Importante el smbolo &.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Ejemplo
Programa que lee un nmero entero y lo eleva al cuadrado:

#include <stdio.h>
#include <windows.h>
main()
{
int numero;
int cuadrado;
printf("Introduzca un numero:");
scanf("%d", &numero);
cuadrado = numero * numero;
printf("El cuadrado de %d es %d\n", numero, cuadrado);
system(pause);
}
Introduccin a la directiva #define
Permite definir constantes simblicas en el programa.
#define nombre texto
Donde:
nombre representa un nombre simblico que suele escribirse en maysculas.
texto no acaba en ;
nombre es sustituido por texto en cualquier lugar del programa.
Ejemplos:
#define M_PI 3.141593
#define CIERTO 1
#define FALSO 0
#define AMIGA "Marta"
Ejemplo:
Programa que lee el radio de un crculo y calcula su rea.
#include <stdio.h>
#include <windows.h>
#define M_PI 3.141593

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
main()
{
float radio;
float area;
printf("Introduzca el radio: ");
scanf("%f", &radio);
area = M_PI * radio * radio;
printf("El area del circulo es %5.4f \n", area);
system(pause);
}
07
Errores de codificacin comunes
Problemas con las maysculas y minsculas.
Omisin del punto y coma.
Comentarios incompletos.
Comentarios anidados.
Uso de variables no declaradas.
Ejemplo: Corregir el siguiente programa
#include <stdio.h>
#define M_PI 3.141593
/* Programa que calcula el rea de un
Circulo*/
Main()
{
float radio;
printf("Introduzca el radio: ")
scanf("%f", &radio);
area = M_PI * radio * Radio;
printf("El area del circulo es %5.4f \n", area);
system(pause);
}

08
EJERCICIOS:09
Elaborar un programa en C para cada una de las siguientes opciones, que
calcule el rea de:
Un cuadrado
Un rectngulo
Un triangulo
El volumen de:
Una esfera
Una pirmide

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

Capitulo 2 - OPERADORES
C es un lenguaje muy rico en operadores. Se definen seis tipos de operadores
aritmticos, relacionales, de asignacin, lgicos, de direccin y de movimiento.

Operadores aritmticos de C:
__________________________________
Operador Funcin
+
Suma
Resta
*
Producto
/
Divisin
%
Operador mdulo
resto de la divisin entera
---------------------------------------------------------Divisin entera: divisin de una cantidad entera por otra =>se desprecia la
parte decimal del cociente.
El operador % requiere que los dos operandos sean enteros.
La mayora de las versiones de C asignan al resto el mismo signo del primer
operando.
Valores negativos con el signo -. Ejemplo: -4
Ejercicio: 10
Hacer un programa en C que realice las siguientes operaciones
ab
Donde es cada uno de los operadores, considerando los valores a=10 y b=3
Analice los resultados y posterior mente pruebe con a=11 y b=-3
Vuelva a analizar los resultados.

Conversin de tipos
+ En C un operador se puede aplicar a dos variables o expresiones distintas.
+ Los operandos que difieren en tipo pueden sufrir una conversin de tipo.
+ Norma general: El operando de menor precisin toma el tipo del operando
de mayor precisin.
Reglas de conversin de tipos:
1. Si un operando es long double el otro se convierte a long double.
2. En otro caso, si es double el otro se convierte a double.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
3. En otro caso, si es float el otro se convierte a float.
4. En otro caso, si es unsigned long int el otro se convierte a unsigned long
int.
5. Si un operando es long int y el otro es unsigned int, entonces:
5.1. Si el unsigned int puede convertirse a long int el operando unsigned int se
convertir en long int.
5.2. En otro caso, ambos operandos se convertiran a unsigned long int.
6. En otro caso, si un operando es long int el otro se convertira a long int.
7. En otro caso, si un operando es unsigned int el otro se convertira a unsigned
int.
8. En otro caso, ambos operandos seran convertidos a tipo int si es necesario.
Ejemplo:11
Programa que convierte grados Fahrenheit a grados Centgrados.
C = (5/9) * (F - 32)
#include <stdio.h>
main()
{
float centigrados;
float fahrenheit;
printf("Introduzca una temperatura en grados fahrenheit: ");
scanf("%f", &fahrenheit);
centigrados = 5.0/9 * (fahrenheit - 32);
printf("%f grados fahrenheit = %f grados centigrados \n", fahrenheit,
centigrados);
}
Ejercicios:
Introduzca una temperatura en grados fahrenheit: 96
96.0000 grados fahrenheit = 35.5557 grados centigrados
Qu ocurrira si se hubiera utilizado la siguiente instruccin? (Probar y escribir
reporte)
centigrados = 5/9 * (fahrenheit - 32);

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

Conversin de tipos
Existe otro tipo de operador denominado molde que su funcin es hacer posible
que una expresin sea de un tipo determinado utilizando la sintaxis
(tipo) expresin;
Siendo tipo uno de los tipos estndar de C.
Por ejemplo, si se quiere asegurar que la expresin x/2 se evale de tipo float,
se puede escribir: (float) x/2;.
Otro Ejemplo:

( (int) 5.5 % 4)

Prioridad de los operadores aritmticos


+ La prioridad indica el orden en el que se realizan las operaciones
aritmticas.
+ Las operaciones con mayor precedencia se realiza antes.
________________________________________
Prioridad
Operacin
Primero
()
Segundo
Negacin (signo menos)
Tercero
* / %
Cuarto
+ -------------------------------------------------------------------Dentro de cada grupo las operaciones se realizan de izquierda a
derecha.
Ejemplo:
a-b/c*d
es equivalente a
a - ((b/c) * d)
12
OPERADORES DE ASIGNACION
_______________________________________________________
OPERADOR
INSTRUCCION
INSTRUCCION NO
ABREVIADA
ABREVIADA
=
=
=
++
m++
m=m+1
-m-m=m-1
+=
m+=n
m=m+n
-=
m-=n
m=m-n
*=
m*=n
m=m*n
/=
m/=n
m=m/n
%=
m%=n
m=m%n
-----------------------------------------------------------------------------------------------

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Reglas de asignacin
Si los dos operandos en una instruccion de asignacin son de tipos distintos,
entonces el valor del operando de la derecha ser automticamente convertido
al tipo del operando de la izquierda.
Adems:
1. Un valor en coma flotante se puede truncar si se asigna a una variable de
tipo entero.
2. Un valor de doble precisin puede redondearse si se asigna a una variable
de coma flotante de simple precisin.
3. Una cantidad entera puede alterarse si se asigna a una variable de tipo
entero ms corto o a una variable de tipo carcter.
Es importante en C utilizar de forma correcta la conversin de tipos.
Los operadores de asignacin ++ y -- pueden ir antes o delante de una
expresin formando una nueva expresin. Estas expresiones se denominan
post-incrementos o pre-incrementos (decrementos si el operador es --) y son
expresiones compuestas, normalmente son del tipo y=x++; (y=++x;).

Operadores de incremento y decremento


Operador de incremento ++ incrementa en uno el operando.
Operador de decremento -- decrementa en uno el operando.
Variantes:
Postincremento => i + +
Preincremento => + + i
Postdecremento => i -Predecremento => -- i
Ejemplos:
La expresin i + +; => i = i + 1
La expresin + + i; => i = i + 1
La expresin i - - => i = i - 1
La expresin -- i; => i = i - 1
Si el operador precede al operando el valor del operando se modificara antes
de su utilizacin.
Si el operador sigue al operando el valor del operndose modificara despus
de su utilizacin.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Existen una diferencia entre el post-incremento y el pre-incremento. El postincremento primero suma uno a la variable (x en el ejemplo) y luego asigna ese
valor (y en el ejemplo), mientras con el pre-incremento, la asignacin es
anterior.
Por ejemplo:
int x=1, y;
y=x++; /* y es 1 y x vale 2 */
int x=1, y;
y=++x; /* x vale 2 e y tambin vale 2 */
Ejercicio:13
Probar los resultados que arrojaran las siguientes instrucciones si a a se le
asigna el valor de 1.
printf("a
printf("a
printf("a
printf("a

=
=
=
=

%d
%d
%d
%d

\n",
\n",
\n",
\n",

a);
++a);
a++);
a);

OPERADORES RELACIONALES
Se utilizan para formar expresiones lgicas.
El resultado es un valor entero que puede ser:
cierto se representa con un 1
falso se representa con un 0
____________________________________________________
OPERADOR
SIGNIFICADO
==
Igual a
!=
No igual a
>
Mayor que
<
Menor que
>=
Mayor o igual que
<=
Menor o igual que
----------------------------------------------------------------------------------------14

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

Capitulo 3 - INSTRUCCIONES
Una instruccin es cualquier expresin en C que se espera que tenga alguna
consecuencia.
Pueden ser asignaciones, operaciones, llamadas a funciones o combinaciones
de ellas. Toda instruccin termina con un ;.
Una instruccin simple consiste en una expresin acabada en un punto y coma
(;).
Instrucciones compuestas
Es un conjunto de instrucciones simples que se encierran entre los smbolos { }
para formar un bloque de cdigo.
Pueden aparecer en cualquier sitio en el que podra aparecer una instruccin
simple.
Pueden contener declaraciones de nuevos objetos (el alcance de la declaracin
afecta al bloque).
La sintaxis es:
{
instruccin;
instruccin;

instruccin;
}

Tipos de estructuras de programacin:


Secuencial: ejecucin sucesiva de dos o ms operaciones.
Seleccin: se realiza una u otra operacin, dependiendo de una condicin.
Iteracin: repeticin de una operacin mientras se cumpla una condicin.
Estructura Secuencial
Corresponde a la ejecucin de instrucciones en orden descendente, es tal cual
se han utilizado hasta este momento en los ejemplos de este documento.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Estructura Seleccin o Condicional
Es donde el flujo de ejecucin de las instrucciones depende del valor resultante
de una condicin. Por el momento vamos a enfocarnos en la instruccin if
(aunque existe otra).
Instruccin if
Forma general:
if (expresin)
instruccin
Se interpreta de la siguiente forma:
si expresin es verdadera (valor mayor que 0) =>se ejecuta
instruccin.
Ojo.- La expresin debe estar entre parntesis.
Si es la instruccin es compuesta:
if (expresin)
{
Instruccin 1
Instruccin 2
.
.
.
Instruccin n
}
Ejemplo:
Programa que lee un nmero e indica si es par.
#include <stdio.h>
main()
{
int numero;
/* leer el numero */
printf("Introduzca un numero: ");
scanf("%d", &numero);
if ((numero % 2) == 0)
printf("El numero %d es par.\n", numero);
}

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Otro ejemplo:
Programa que lee un nmero y lo eleva al cuadrado si es par.
#include <stdio.h>
main()
{
int numero;
int cuadrado;
/* leer el numero */
printf("Introduzca un numero: ");
scanf("%d", &numero);
if ((numero % 2) == 0)
{
cuadrado = numero * numero;
printf("El cuadrado de %d es %d.\n", numero, cuadrado);
}
}
15
Instruction if-else
Forma general:
if (expresin)
Instruccin 1
else
Instruccin 2
si expresin es:
verdadera (valor mayor que 0) =>se ejecuta la Instruccin 1.
falsa (valor igual a 0) =>se ejecuta Instruccin 2.
Si las Instrucciones son compuestas se encierran entre { }
Las Instrucciones pueden ser a su vez instrucciones if-else
if (expresin 1)
if (expresin 2)
Instrucciones 1
else
Instrucciones 2
else
Instrucciones 3

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Ejemplo:
Programa que lee un nmero y dice si es par o impar.
#include <stdio.h>
#include <windows.h>
main()
{
int numero;
/* Leer el numero */
printf("Introduzca un numero: ");
scanf("%d", &numero);
if ((numero % 2) == 0)
printf("El numero %d es par.\n", numero);
else
printf("El numero %d es impar.\n", numero);
system(pause);
}
16
Ejercicio:17
Escribir un programa en C que permita jugar el juego del seor que desea
cruzar el ro con su Lobo, Oveja y Alfalfa pudiendo cruzar solo el y alguno de
los elementos en la embarcacin. Considerando que no puede dejar solos a los
que se podran comer uno al otro.
Estructuras de iteracin o repeticin
Tambin denominadas bucles. Permiten realizar un conjunto de instrucciones
hasta que se alcance una cierta condicin.
La instruccin que nos enfocaremos inicialmente es la llamada while

while
Su forma general es:
while (condicin)
instruccin;
La condicin puede ser cualquier expresin condicional, cualquier valor distinto
de 0 es cierto. El bucle itera mientras la condicin sea cierta. Cuando la
condicin se hace falsa, el control del programa pasa a la lnea siguiente al
cdigo del bucle.
La instruccin, puede ser una instruccin compuesta.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
while (condicin)
{
instruccin 1
instruccin 2
.
.
instruccin n
}
Consideraciones:
- Primero se evala expresin.
- Lo normal es que la instruccion incluya algn elemento que altere el
valor de condicin, proporcionando as la condicin de salida del ciclo.
Ejemplos:
Programa que muestra los primeros 100 nmeros N
#include <stdio.h>
#include <windows.h>
main()
{
int N = 1;
while (N < 100)
{
N = N + 1;
printf("%d \t", N);
}
system(pause);

/* equivalente a N++ */

}
18
Programa que lee un nmero N y calcula 1 + 2 + 3 + . . . + N
#include <stdio.h>
#include <windows.h>
main()
{
int N;
int suma = 0;
/* leer el numero N */
printf("N: ");
scanf("%d", &N);

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
while (N > 0)
{
suma = suma + N;
N = N - 1;
/* equivalente a N-- */
}
printf("1 + 2 +...+ N = %d\n", suma);
system(pause);
}
19
Ejercicios:20
+ Hacer un programa en C que genere la siguiente secuencia 1, 4, 9, 16, 25,
36, hasta obtener 20 elementos
21
+ Hacer un programa en C que calcule el factorial de un nmero (el factorial de
un nmero es la multiplicacin de el nmero dado multiplicado por sus
anteriores) Ejemplo, el factorial de 5 es 5X4X3X2X1
22
+ Hacer un programa en C que genere la serie de FIBONACCI introduciendo
los primeros valores 0 y 1. De ah debe generar 1,2,3,5,8,13,21,34,55, etc.
Generar al menos los primeros 20 nmeros de la serie.
Otras estructuras de repeticin
do-while
Esta instruccin ejecutar las instrucciones que se indican mientras el
valor de condicin sea verdadero (distinto de 0).
Formal general:
do
instruccin
while (condicin);
A diferencia del ciclo while, que analizan la condicin del bucle al
principio del mismo, el bucle do-while analiza la condicin al final del
ciclo. Esto significa que el ciclo do-while siempre se ejecuta al menos
una vez. La forma general de mostrarse es:
do {
instruccin;
} while (condicin);
Aunque las llaves no son necesarias cuando slo hay una instruccin,
se utilizan normalmente para evitar confusiones al programador con
el while.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Lo normal es la que instruccin incluya algn elemento que altere el
valor de condicin, proporcionando as la condicin de salida del bucle.
Si la instruccion es compuesta se encierra entre { }
do
{
instruccin 1
instruccin 2
.
.
instruccin N
}while (condicin);
Para la mayora de las aplicaciones es mejor y ms natural comprobar
la condicin antes de ejecutar el ciclo (ciclo while)
Ejemplo:
Programa que lee de forma repetida un nmero e indica si es par o impar. El
programa se repite mientras el nmero sea distinto de cero.
#include <stdio.h>
#include <windows.h>
main()
{
int numero;
do
{
/* se lee el numero */
printf("Introduzca un numero: ");
scanf("%d", &numero);
if ((numero % 2) == 0)
printf("El numero %d es par.\n", numero);
else
printf("El numero %d es impar.\n", numero);
} while (numero != 0);
system(pause);
}
23

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

for
El formato general es:
for (inicializacin; condicin; incremento)
instruccin;
La inicializacin normalmente es una instruccin de asignacin que se utiliza
para iniciar la variable de control del ciclo.
La condicin es una expresin condicional que determina cuando finaliza el
ciclo.
El incremento define como cambia la variable de control cada vez que se
repite la instruccin.
Estas tres secciones principales deben ser separadas por punto y coma (;). El
ciclo for continua ejecutndose mientras que la condicin sea cierta. Una vez
que la condicin es falsa, la ejecucin del programa sigue por la instruccin
siguiente al for.
Si la instruccion es compuesta se encierra entre { }
No es obligatoria ninguna de las tres expresiones, si se omite la condicin se
asumir el valor permanente de 1 (cierto) y el ciclo se ejecutara de forma
indefinida, por ejemplo, se puede realizar un ciclo infinito de la forma:
for(;;) printf(este ciclo estar siempre ejecutndose.\n);
Si se omite el incremento este tomara un valor por emocin de 1, similarmente
el valor de inicializacin
Ejemplo:
Programa que imprime los 100 primeros nmeros usando for
#include <stdio.h>
#include <windows.h>
main()
{
int numero;
for (numero=0; numero <100; numero++)
printf("%d\n", numero);
system(pause);
}
24

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Ciclos anidados
+ Los ciclos se pueden anidar unos y otros.
+ Se pueden anidar diferentes tipos de ciclos.
+ Importante estructurarlos de forma correcta.
Ejemplo: Calcular 1 + 2 + : : :N mientras N sea distinto de 0.
#include <stdio.h>
#include <windows.h>
main()
{
int N;
int suma;
int j;
do
{
/* leer el numero N */
printf("Introduzca N: ");
scanf("%d", &N);
suma = 0;
for (j = 0; j <= N; j++) /* ciclo anidado */
suma = suma + j;
printf("1 + 2 + ... + N = %d\n", suma);
} while (N > 0); /* fin del ciclo do */
system(pause);
}
25

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

Otras estructuras condicionales


Estructura switch
Es una instruccin de seleccin mltiple, que compara sucesivamente el valor
de una expresin con una lista de constantes enteras o de caracteres. Cuando
se encuentra una correspondencia, se ejecutan las instrucciones asociadas con
la constante. l
Formal general:
switch (expresion)
{
case constante 1:
secuencia de instrucciones 1;
break;
case constante 2:
secuencia de instrucciones 2;
break;
case constante 3:
secuencia de instrucciones 3;
break;
.
.
.
default:
secuencia de instrucciones 1;
}
La expresin devuelve un valor entero (tambin puede ser de tipo char) y es la
que se compara con cada una de las constante, en caso de coincidir con una
realiza la secuencia de instrucciones correspondiente y en caso de no
corresponder con alguna ejecutara las de la opcin por default , la cual es
opcional.
El break indica que debe saltar a continuacin de la instruccin switch
La instruccin switch se diferencia de la instruccion if en que slo puede
comparar la igualdad, mientras que if puede evaluar expresiones relacionales o
lgicas.
No puede haber dos constantes case en el mismo switch que tengan los
mismos valores (por supuesto que una instruccin switch contenida en otra
instruccin switch pude tener constantes case que sean iguales).

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Si se utilizan constantes de tipo carcter en la instruccion switch, se convierten
automticamente a sus valores enteros.
Ejemplo
#include <stdio.h>
#include <windows.h>
main()
{
char letra;
printf("Introduzca una letra: ");
scanf("%c", &letra);
switch(letra)
{
case 'a':
case 'A':
printf("Vocal %c\n", letra);
break;
case 'e':
case 'E':
printf("Vocal %c\n", letra);
break;
case 'i':
case 'I':
printf("Vocal %c\n", letra);
break;
case 'o':
case 'O':
printf("Vocal %c\n", letra);
break;
case 'u':
case 'U':
printf("Vocal %c\n", letra);
break;
default:
printf("Consonante %c\n", letra);
}
system(pause);
}
26
Operador condicional ?
Forma general:
expresin_1 ? expresin _2 : expresin _3
Si expresin _1 es verdadero => devuelve expresin _2

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Si expresin _1 es falso => devuelve expresin _3
Su prioridad es justamente superior a los operadores de asignacin.
Se evala de derecha a izquierda.
Ejemplo:
Si a = 1 en la instruccin
k = (a < 0) ? 0 : 100;
Primero se evala (a < 0)
Como es falso el operador condicional devuelve 100. Este valor se asigna a k.
Es decir k toma el valor 100
Ejercicios:27
Hacer un programa en C que ejecute la instruccin ? anterior para ver que si
funciona asignndole distintos valores de a.
28
Elaborara un programa en C que calcule los primeros 100 nmeros primos.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

Capitulo 4 - FUNCIONES Y PROGRAMACION ESTRUCTURADA


Las aplicaciones informticas que habitualmente se utilizan, incluso a nivel de
informtica personal, suelen contener decenas y an cientos de miles de lneas
de cdigo fuente. A medida que los programas se van desarrollando y
aumentan de tamao, se convertiran rpidamente en sistemas poco
manejables si no fuera por la modularizacin, que es el proceso consistente en
dividir un programa muy grande en una serie de mdulos mucho ms
pequeos y manejables.
A estos mdulos se les ha denominado de distintas formas (subprogramas,
subrutinas, procedimientos, funciones, etc.) segn los distintos lenguajes. El
lenguaje C hace uso del concepto de funcin (function). Sea cual sea la
nomenclatura, la idea es sin embargo siempre la misma: dividir un programa
grande en un conjunto de subprogramas o funciones ms pequeas que son
llamadas por el programa principal; stas a su vez llaman a otras funciones
ms especficas y as sucesivamente.
La divisin de un programa en unidades ms pequeas o funciones presenta
(entre otras) las ventajas siguientes:
1. Modularizacin. Cada funcin tiene una misin muy concreta, de modo que
nunca tiene un nmero de lneas excesivo y siempre se mantiene dentro de un
tamao manejable.
Adems, una misma funcin (por ejemplo, un producto de matrices, una
resolucin de un sistema de ecuaciones lineales, ...) puede ser llamada
muchas veces en un mismo programa, e incluso puede ser reutilizada por otros
programas. Cada funcin puede ser desarrollada y comprobada por separado.
2. Ahorro de memoria y tiempo de desarrollo. En la medida en que una misma
funcin es utilizada muchas veces, el nmero total de lneas de cdigo del
programa disminuye, y tambin lo hace la probabilidad de introducir errores en
el programa.
3. Independencia de datos y ocultamiento de informacin. Una de las fuentes
ms comunes de errores en los programas de computadora son los efectos
colaterales o perturbaciones que se pueden producir entre distintas partes del
programa. Es muy frecuente que al hacer una modificacin para aadir una
funcionalidad o corregir un error, se introduzcan nuevos errores en partes del
programa que antes funcionaban correctamente. Una funcin es capaz de
mantener una gran independencia con el resto del programa, manteniendo sus
propios datos y definiendo muy claramente la interfaz o comunicacin con la
funcin que la ha llamado y con las funciones a las que llama, y no teniendo
ninguna posibilidad de acceso a la informacin que no le compete.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Todo programa C consta de una o mas funciones. La forma general de
definicin de una funcin es:
tipo nombre(lista de parmetros)
{
cuerpo de la funcin
}
El tipo especifica el tipo de valor que devuelve la instruccin return de la
funcin. El valor puede ser cualquier tipo vlido; si no se especifica ninguno, se
asume un resultado entero.
La lista de parmetros es la lista de nombres de variables separados por
comas con sus tipos asociados que reciben los valores de los argumentos
cuando se llama a la funcin.
Una funcin puede no tener parmetros, en cuyo caso la lista de parmetros
est vaca; sin embargo, los parntesis son necesarios.
Una de estas funciones se debe llamar main().
Todo programa comienza su ejecucin en la funcin main().
El uso de funciones permite la descomposicin y desarrollo modular. Permite
dividir un programa en componentes ms pequeos.
Declaracin
Cada funcin debe ser declarada. Su forma general es:
tipo nombre_funcin (lista de tipos (y nombres) de los argumentos);
Si una funcin va usar argumentos, debe declarar variables que acepten los
valores de los argumentos. Estas variables se llaman parmetros formales de
la funcin y se comportan como variables locales dentro de la funcin,
crendose al entrar en la funcin y destruyndose al salir. La declaracin de
parmetros aparece despus del nombre de la funcin al definirla.
Los parmetros formales tienen que ser del mismo tipo que los argumentos
usados al llamar una funcin (el compilador no dar error pero los resultados
sern inesperados).
Al igual que con variables locales, se pueden hacer asignaciones a los
parmetros de una funcin o usarlos en cualquier expresin vlida. Se pueden
usar como cualquier otra variable.
Una funcin es visible para ella misma y otras funciones desde el momento en
que se define. Es visible para el propio cuerpo de la funcin, es decir, la
recursividad esta permitida.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
El cdigo de una funcin es privado a esa funcin y slo se puede acceder a l
mediante una llamada a esa funcin. Las variables definidas dentro de una
funcin son locales (a no ser que las definamos globales) por lo que no
conservan su valor de una llamada a otra (excepto si se declaran como static,
entonces el compilador no las destruye y almacena su valor para la prxima
llamada, aunque la variable tiene limitado el mbito al interior de la funcin).
En C, todas las funciones estn al mismo nivel, es decir, no se puede definir
una funcin dentro de otra funcin. Esto es por lo que C no es tcnicamente un
lenguaje estructurado por bloques.
Llamadas a funciones
Las funciones son llamadas para su ejecucin desde cualquier parte del
cdigo, teniendo en cuenta que antes deben haber sido declaradas (y por
supuesto definidas).
La llamada de una funcin se produce mediante el uso de su nombre en una
instruccion, pasando una lista de argumentos que deben coincidir en nmero y
tipo con los especificados en la declaracin (en otro caso se producira una
conversin de tipos o resultados inesperados).
Llamadas por valor y por referencia
En general, se pueden pasar argumentos a las funciones de dos formas, por
valor y por referencia.
La llamada por valor copia el valor de un argumento en el parmetro formal de
la funcin. De esta forma, los cambios en los parmetros de la funcin no
afectan a las variables que se usan en la llamada (es la llamada ms usual, es
decir, en general no se pueden alterar las variables usadas para llamar a la
funcin).
La llamada por referencia copia la direccin del argumento en el parmetro.
Dentro de la funcin se usa la direccin para acceder al argumento usado,
significando que los cambios hechos a los parmetros afectan a la variable
usada en la llamada.
Es posible simular una llamada por referencia pasando un puntero al
argumento, entonces, al pasar la direccin, es posible cambiar el valor de la
variable usada en la llamada.
Ejemplo:
Programa que calcula el mximo de dos nmeros.
#include <stdio.h>
int maximo(int a, int b); /* prototipo de funcin */
main()
{
int x, y;
int max;
printf("Introduzca dos numeros: ");
scanf("%d %d", &x, &y);

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
max = maximo(x,y); /* llamada a la funcin */
printf("El maximo es %d\n", max);
}
int maximo(int a, int b) /* definicin de la funcin */
{
int max;
if (a > b)
max = a;
else
max = b;
return(max); /* devuelve el valor mximo */
}
29
Ejemplo:
Programa que dice si un nmero es un cuadrado perfecto.
#include <stdio.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
void explicacion(void);
int cuadrado_perfecto(int x);
main()
{
int n;
int perfecto;
explicacion();
scanf("%d", &n);
perfecto = cuadrado_perfecto(n);
if (perfecto)
printf("%d es cuadrado perfecto.\n", n);
else
printf("%d no es cuadrado perfecto.\n", n);
}
void explicacion(void)
{
printf("Este programa dice si un numero ");
printf("es cuadrado perfecto \n");
printf("Introduzca un numero: );
}
int cuadrado_perfecto(int x)
{
int raiz;

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
int perfecto;
raiz = (int) sqrt(x);
if (x == raiz * raiz)
perfecto = TRUE; /* cuadrado perfecto */
else
perfecto = FALSE; /* no es cuadrado perfecto */
return(perfecto);
}
30
Ejercicios: 31
Explicar donde se aplica la teora antes descrita en los programas anteriores,
es decir donde se declaran la funciones, cuales son sus parmetros, que
variables y de que tipo son, as como a que funcin pertenecen, etc.
32
+ Hacer un programa que calcule el factorial de un nmero usando funciones.
Recursividad
Una funcin se llama a s misma de forma repetida hasta que se cumpla alguna
condicin.
Ejemplo: El factorial de un nmero:
f(n) = 1 si n = 0
f(n) = n * f(n - 1) si n > 0
Funcin que calcula el factorial de forma recursiva:
long int factorial(int n)
{
if (n <= 1)
return(1);
else
return(n * factorial(n-1));
}
Ejercicio: 33
Elaborar un programa en C que invoque a la funcin anterior y calcule el
factorial de un nmero solicitado por el usuario.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

Macros
Una macro es una codificacin de instrucciones que implican una o varias
acciones. El preprocesador toma como entrada el programa fuente en C antes
que el compilador y ejecuta todas las macros que encuentra.
En la composicin de macros se pueden utilizar todos los elementos bsicos
del lenguaje. Las expresiones que se pueden poner en los comandos del
preprocesador cuando ponemos la frmula o expresin, debe ser una
expresin que diese los mismos resultados que si la escribisemos en una
lnea de C. El resultado debe ser una constante.
La instruccin #define se puede utilizar para definir macros.
Una macro es un identificador equivalente a una expresin, instruccin o grupo
de instruccin.
Ejemplo: programa que calcula el mximo de dos nmeros.
#include <stdio.h>
#define maximo(a,b) ((a > b) ? a : b) /* macro */
main()
{
int x, y;
int max;
printf("Introduzca dos numeros: ");
scanf("%d %d", &x, &y);
max = maximo(x,y); /* uso de la macro */
printf("El maximo es %d\n", max);
}
34
Consideraciones:
+ No puede haber blancos entre el identicador y el parntesis izquierdo.
+ Una macro no es una llamada a funcin.
+ El preprocesador sustituye todas las referencias a la macro que aparezcan
dentro de un programa antes de realizar la compilacin, como se observa:
main()
{
int x, y;
int max;
printf("Introduzca dos numeros: ");
scanf("%d %d", &x, &y);
max = ((x > y) ? x : y);

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
printf("El maximo es %d\n", max);
}
No se produce llamada a funcin por lo tanto se tiene mayor velocidad.
Se repite el cdigo en cada uso de la macro por lo tanto se tiene mayor cdigo
objeto.
Otro ejemplo de macros seria:
Dada la siguiente definicin de macro:
#define maximo (x,y,z) if (x > y) \
z = x; \
else \
z = y;
Cuando el preprocesador encuentra:
maximo(a, b, max);
Lo sustituir por:
if ( a > b ) max = a ; else max = b ; ;
Que es equivalente a:
if (a > b)
max = a;
else
max = b;
Ejercicio: 35
Escribir un programa en C que use la macro anterior y probar su
funcionamiento.

Programacin estructurada
Tiende a construir programas fcilmente comprensibles.
Se basa en la tcnica de diseo mediante refinamiento progresivo: las
operaciones se van descomponiendo poco a poco hasta llegar a operaciones
bsicas.
Construcciones bsicas de la programacin estructurada son las ya
mencionadas:
Secuencial: ejecucin sucesiva de dos o ms operaciones.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Seleccin: se realiza una u otra operacin, dependiendo de una condicin.
Iteracin: repeticin de una operacin mientras se cumpla una condicin.
Importante:
Todos los bloques y funciones tienen un nico punto de entrada.
Todos los bloques y funciones tienen un nico punto de salida.
Ejemplo:
Programa que calcula la hipotenusa de un tringulo rectngulo.

Pasos a seguir:
1. Leer a y b mediante la funcin scanf()
2. Calcular h segn la frmula dada definiendo una funcin hipotenusa().
3. Imprimir el valor de h usando la funcin printf().
#include <stdio.h>
#include <math.h>
float hipotenusa(float a, float b); /* prototipo */
main()
{
float a, b;
float h;
int error;
printf("Introduzca a y b: ");
error = scanf("%f %f", &a, &b);
if (error !=2)
printf("Error al leer a y b\n");
else
{
h = hipotenusa(a,b);
printf("La hipotenusa es %f\n", h);
}
}
float hipotenusa(float a, float b)
{
float h;
h = sqrt(pow(a,2) + pow(b, 2));
return(h);
}
36Nota.- Observe el uso de la variable error

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

Capitulo 5 - Arreglos o variables dimensionadas


Un arreglo es una coleccin de variables del mismo tipo que se referencian por
un nombre comn. A un elemento especfico de un arreglo se accede mediante
un ndice. En C todos los arreglos constan de posiciones de memoria
contiguas. La direccin ms baja corresponde al primer elemento y la ms alta
al ltimo. Los arreglos pueden tener una o varias dimensiones. El arreglo ms
comn en C es la cadena, que simplemente es un arreglo de caracteres
terminado por uno nulo.
Arreglos unidimensionales
Los arreglos unidimensionales o vectores son listas de informacin del mismo
tipo que se guardan en posiciones contiguas de memoria segn el orden del
ndice.
La forma general de declaracin es:
tipo nombre_variable [tamao];
Los arreglos tienen que declararse implcitamente para que el compilador
reserve espacio en memoria para ellos. El tipo declara el tipo de los elementos
del vector, en C los datos individuales de un vector pueden ser de cualquier
tipo (int, char, float, etc.)
El tamao indica cuntos elementos mantendr el vector.
Para declarar un vector de 10 elementos denominado p y de tipo carcter, se
escribe:
char p[10];
En este caso hemos declarado un array que tiene diez elementos, desde p[0]
hasta p[9].
En C todos los arreglos tienen el 0 como ndice de su primer elemento.
Ejemplos:
int v_numeros[20];
float n[12];
char vector_letras[5];
C no comprueba los lmites de los arreglos. Se puede pasar cualquier extremo
de un array y escribir en alguna otra variable de datos e incluso en el cdigo del
programa.
Slo se puede asignar valores iniciales a vectores estticos y globales. Por
ejemplo:
int n[5] = {1, 2, 18, 24, 3};

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
En C no se permiten operaciones que impliquen vectores completos
Es decir:
No se pueden asignar vectores completos.
No se pueden comparar vectores completos.
El procesamiento debe realizarse elemento a elemento. Por ejemplo:
#include <stdio.h>
#define TAM_VECTOR 10
main()
{
int vector_a[TAM_VECTOR];
int vector_b[TAM_VECTOR];
int j; /* variable utilizada como indice */
/* leer el vector a */
for (j = 0; j < TAM_VECTOR; j++)
{
printf("Elemento %d: ", j);
scanf("%d", &vector_a[j]);
}
/* copiar el vector */
for (j = 0; j < TAM_VECTOR; j++)
vector_b[j] = vector_a[j];
/* escribir el vector b */
for (j = 0; j < TAM_VECTOR; j++)
printf("El elemento %d es %d \n",j, vector_b[j]);
}
37
Paso de vectores a funciones
+ Un vector se pasa a una funcin especificando su nombre sin corchetes.
+ El nombre representa la direccin del primer elemento del vector por lo que
los vectores se pasan por referencia y se pueden modificar en las funciones.
+ El argumento formal correspondiente al vector se escribe con un par de
corchetes cuadrados vacos. El tamao no se especifica.
Ejemplo
Programa que calcula la media de los componentes de un vector.
#include <stdio.h>
#define MAX_TAM 4
void leer_vector(int vector[]);
int media_vector(int vector[]);

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
main()
{
int v_numeros[MAX_TAM];
int media;
leer_vector(v_numeros);
media = media_vector(v_numeros);
printf("La media es %d\n", media);
}
void leer_vector(int vector[])
{
int j;
for(j=0; j<MAX_TAM; j++)
{
printf("Elemento %d: ", j);
scanf("%d", &vector[j]);
}
return;
}
int media_vector(int vector[])
{
int j;
int media = 0;
for(j=0; j<MAX_TAM; j++)
media = media + vector[j];
return(media/MAX_TAM);
}
38
Cadenas de caracteres
El uso ms comn de los arreglos unidimensionales es como cadenas de
caracteres. En C una cadena se define como un arreglo o vector de caracteres.
Para declarar un arreglo de caracteres es necesario un carcter ms que la
cadena ms larga que pueda contener, para dejar sitio para el carcter nulo del
final de la cadena.
Una constante de cadena es una lista de caracteres encerrada entre dobles
comillas. Por ejemplo:
Hola
La cadena "Hola" se almacena en memoria:
H o l
a '\0'
Y su longitud es 4 (no se considera el carcter nulo).
Consideraciones:
'a' representa un carcter individual.
"Hola" representa una cadena de caracteres.
"a" representa una cadena de caracteres compuesta por un nico carcter.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Todas las cadenas de caracteres en C finalizan con el carcter nulo de C ('\0').
Este carcter indica el fin de una cadena de caracteres.
No es necesario aadir explcitamente el carcter nulo al final de las constantes
de cadena, el compilador lo hace automticamente.
Declaracin de cadenas de caracteres
char cadena[] = "Hola";
Declara una cadena denominada cadena y reserva espacio para almacenar los
siguientes caracteres:
'H' 'o' 'l' 'a' '\0'
Ejemplo:
#include <stdio.h>
main()
{
char cadena[] = "hola";
printf("La cadena es %s \n", cadena);
printf("Los caracteres son: \n");
printf("%c \n", cadena[0]);
printf("%c \n", cadena[1]);
printf("%c \n", cadena[2]);
printf("%c \n", cadena[3]);
printf("%c \n", cadena[4]);
}
39
cadena[i] representa el i-esimo carcter de la cadena.
Asignacin de valores a cadenas de caracteres
+ La asignacin de valores iniciales a una cadena se puede realizar en su
declaracin:
char cadena[5] = "Hola";
char cadena[10] = "Hola";
+ NO se puede asignar valores de la siguiente forma:
cadena = "Hola";
+ Una forma de asignar un valor a una cadena es la siguiente:
strcpy(cadena, "Hola");
+ La cadena debe tener suficiente espacio reservado.
strcpy(cadena1, cadena2); copia cadena1 en cadena2 incluyendo el
carcter nulo.
strcpy se encuentra en el archivo de cabecera string.h

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Lectura y escritura de cadenas de caracteres
#include <stdio.h>
#define TAM_CADENA 80
main()
{
char cadena[TAM_CADENA];
printf("Introduzca una cadena: ");
scanf("%s", cadena);
printf("La cadena es %s\n", cadena);
}
Nota.- scanf deja de buscar cuando encuentra un blanco, si se
introduce
Hola a todos
solo se leera Hola.
+ No es necesario el operador de direccin (&) ya que cadena
representa de forma automtica la direccin de comienzo.
La funcin gets lee una lnea completa hasta que encuentre el
retorno de carro incluyendo los blancos.
La funcin puts escribe una cadena de caracteres junto con un salto
de lnea.
#include <stdio.h>
#define TAM_LINEA 80
main()
{
char linea[TAM_LINEA];
printf("Introduzca una linea: \n");
gets(linea);
puts("La linea es");
puts(linea);
}
Nota.- puts("La linea es:"); es equivalente a: printf("La linea es: \n");
40
Ejemplo:
Programa que lee n lneas hasta dar una lnea en blanco de y cuenta
el nmero de caracteres de cada lnea:

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
#include <stdio.h>
#define TAM_LINEA 80
main()
{
char linea[TAM_LINEA];
int num_car;
int j;
while (gets(linea) != NULL)
{
num_car = 0;
j = 0;
while (linea[j] != '\0')
{
num_car ++;
j++;
}
printf("Esta linea tiene %d caracteres\n", num_car);
}
}
41
Paso de cadenas de caracteres a funciones
+ Cuando se pasa una cadena a una funcin se pasa la direccin de
comienzo de la misma por lo tanto la cadena se puede modificar en la
funcin.
Ejemplo:
#include <stdio.h>
#define TAM_LINEA 80
void leer_linea(char linea[]);
main()
{
char linea[TAM_LINEA];
leer_linea(linea);
puts("La linea es");
puts(linea);
}
void leer_linea(char linea[])
{
gets(linea);
return;
}

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Ejemplo:
Programa que lee n lneas hasta dar una lnea en blanco de y cuenta
el nmero de caracteres de cada lnea, usando funciones: (Comparar
con el ejemplo anterior que realiza la misma tarea)
#include <stdio.h>
#define TAM_LINEA 80
int longitud(char cadena[]);
main()
{
char linea[TAM_LINEA];
int num_car;
while (gets(linea) != NULL)
{
num_car = longitud(linea);
printf("Esta linea tiene %d caracteres\n", num_car);
}
}
int longitud(char cadena[])
{
int j = 0;
while (cadena[j] != '\0')
j++;
return(j);
}
Ejemplo
Programa que lee una lnea en minsculas y la convierte a
maysculas.
#include <stdio.h>
#include <ctype.h>
#define TAM_LINEA 80
void Convertir_may(char min[], char may[]);
main()
{
char linea_min[TAM_LINEA];
char linea_may[TAM_LINEA];
while (gets(linea_min) != NULL)
{
Convertir_may(linea_min, linea_may);
puts(linea_may);

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
}
}
void Convertir_may(char min[], char may[])
{
int j = 0;
while (min[j] != '\0')
{
may[j] = toupper(min[j]);
j++;
}
may[j] = '\0';
return;
}
Ejercicio: 42 Documentar cada uno de los ejemplos anteriores, esto implica
ademas hacer su prueba de escritorio.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Funciones de biblioteca para manejar cadenas
<string.h>
Funcin
Significado
Strcpy
Copia una cadena en otra
Strlen
Longitud de la cadena
Strcat
Concatenacin de cadenas
Strcmp
Comparacin de dos cadenas
Strchr
Buscar un carcter dentro de una cadena
Strstr
Buscar una cadena dentro de otra

Funcin
Atoi
Atol
Atof

<stdlib.h>
Significado
Convierte una cadena a un entero (int)
Convierte una cadena a un entero largo
(long)
Convierte una cadena a un real (double)

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

Arreglos multidimensionales
C permite arreglos de ms de una dimensin. La forma general de declaracin
de un arreglo multidimensional es:
Tipo nombre [a] [b] [c] .. [z];
Los arreglos de tres o ms dimensiones no se utilizan a menudo por la cantidad
de memoria que se requiere para almacenarlos, ya que el almacenamiento
requerido aumenta exponencialmente con el nmero de dimensiones.
Inicializacin de arreglos
C permite la inicializacin de arreglos en el momento de declararlos, como en
cualquier variable. La forma general es:
tipo nombre [tamao1], , [tamao n]={lista de valores};
la lista de valores es una lista de constantes separadas por comas cuyo tipo es
compatible con el tipo especificado en la declaracin del array. Por ejemplo:
int i[10] = {1,2,3,4,5,6,7,8,9,10};
Con las cadenas o arreglos de caracteres se hace igual, aunque permite una
inicializacin abreviada. Estas dos instrucciones producen el mismo resultado:
char cad[11] = Me gusta C;
char cad[11] = {M,e, ,g,u,s,t,a, ,C,\0};
Los arreglos multidimensionales se inicializan del mismo modo que los
unidimensionales.
Matrices o vectores de 2 dimensiones:
int matriz[20][30];
define una matriz de 20 por 30 columnas.
El elemento del rengln i columna j es matriz[i][j]
Ejemplo
Funcin que calcula el producto de dos matrices cuadradas.
void multiplicar(float a[][DIMENSION],
float b[][DIMENSION],
float c[][DIMENSION])
{
int i, j, k;
for(i = 0; i < DIMENSION; i++)
for(j = 0; j < DIMENSION; j++)

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
{
c[i][j] = 0.0;
for(k = 0; k < DIMENSION; k++)
c[i][j] += a[i][k] * b[k][j];
}
return;
}
Ejercicio: 43
Elaborar un programa en C que lea dos matrices e invoque a la funcin anterior
multiplicar para multiplicar ambas matrices y obtener la matriz resultante.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

Capitulo 6.-Ambito de las variables y tipos de


almacenamiento
Existen dos formas de caracterizar una variable:
+ Por su tipo de datos.
Se refiere al tipo de informacin que representa la variable (int,
char, ... ).
+ Por su tipo de almacenamiento.
Se refiere a su permanencia y a su mbito.
El mbito de una variable es la porcin del programa en la cual
se reconoce la variable.
Segn el mbito, las variables pueden ser:
- Variables locales.
- Variables globales.
Segn el tipo, las variables pueden ser:
- Variables automticas.
- Variables estticas.
- Variables externas.
- Variables de tipo registro.
Variables locales
Slo se reconocen dentro de la funcin donde se definen. Son
invisibles al resto.
Una variable local normalmente no conserva su valor una vez que el
control del programa se transfiere fuera de la funcin.
#include <stdio.h>
void funcion1(void);
main()
{
int a = 1; /* variable local */
int b = 2; /* variable local */
funcion1();
printf("a = %d, b = %d \n", a, b);
}
void funcion1(void)
{
int a = 3; /* variable local */
int c = 4; /* variable local */
printf("a = %d, c = %d \n", a, c);

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
return;
}
Ejercicio: Analizar y describir como funciona el ejemplo anterior
Variables globales
Se declaran fuera de las funciones y antes de su uso.
Pueden ser accedidas desde cualquier funcin.
#include <stdio.h>
void funcion1(void);
int a = 1000; /* variable global */
main()
{
int b = 2; /* variable local */
funcion1();
printf("a = %d, b = %d \n", a, b);
}
void funcion1(void)
{
int c = 4; /* variable local */
printf("a = %d, c = %d \n", a, c);
return;
}
Mantienen los valores que se les asignan en las funciones.
Es mejor hacer uso de variables locales para evitar efectos
secundarios o laterales.
#include <stdio.h>
void funcion1(void);
int a; /* variable global */
main()
{
printf("Antes a = %d\n", a);
funcion1();
printf("Despues a = %d\n", a);
}
void funcion1(void)
{

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
a = 1000;
return;
}
Precaucin con el uso de variables globales
+ El uso de variables globales puede causar errores inesperados.
+ Cualquier funcin puede cambiar el valor de una variable global,
esto implica que puede haber efectos secundarios o laterales.
Recomendaciones:
+ Evitar el uso de variables globales.
+ Mantener las variables lo ms locales que se pueda.
+ Cuando se precise hacer accesible el valor de una variable a una
funcin se pasara como argumento.
Variables automticas (auto)
Es la opcin por defecto para las variables que se declaran dentro de
un bloque {...}, incluido el bloque que contiene el cdigo de las
funciones. En C la declaracin debe estar siempre al comienzo del
bloque. En C++ la declaracin puede estar en cualquier lugar y hay
autores que aconsejan ponerla justo antes del primer uso de la
variable. No es necesario poner la palabra auto. Cada variable auto
es creada al comenzar a ejecutarse el bloque y deja de existir cuando
el bloque se termina de ejecutar. Cada vez que se ejecuta el bloque,
las variables auto se crean y se destruyen de nuevo. Las variables
auto son variables locales, es decir, slo son visibles en el bloque en
el que estn definidas y en otros bloques anidados en l, aunque
pueden ser
ocultadas por una nueva declaracin de una nueva variable con el
mismo nombre en un bloque anidado. No son inicializadas por default,
y antes de que el programa les asigne un valor pueden contener
basura informtica (conjuntos aleatorios de unos y ceros,
consecuencia de un uso anterior de esa zona de la memoria).
A continuacin se muestra un ejemplo y analisis del uso de variables
de modo auto.
{
int i=1, j=2;
/* se declaran e inicializan i y j */
...
{
float a=7., j=3.; /* se declara una nueva variable j
*/

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
...
j=j+a;
/* aqui j es float */
...
/* la variable int j es invisible */
...
/* la variable i=1 es visible */
}

/* fuera del bloque, a ya no existe */

...
/* la variable j=2 existe y es entera
*/
Ejemplo:
#include <stdio.h>
main()
{
auto int valor; /* equivalente a int valor */
valor = 5;
printf("El valor es %d\n", valor);
}
Variables externas (extern)
Son variables globales, que se definen fuera de cualquier bloque o
funcin, por ejemplo antes de definir la funcin main(). Estas
variables existen durante toda la ejecucin del programa. Las
variables extern son visibles por todas las funciones que estn entre
la definicin y el fin del archivo. Para verlas desde otras funciones
definidas anteriormente o desde otros archivos, deben ser declaradas
en ellos como variables extern. Por defecto, son inicializadas a cero.
Una variable extern es definida o creada (una variable se crea en el
momento en el que se le reserva memoria y se le asigna un valor)
una sola vez, pero puede ser declarada (es decir, reconocida para
poder ser utilizada) varias veces, con objeto de hacerla accesible
desde diversas funciones o orchivos. Tambin estas variables pueden
ocultarse mediante la declaracin de otra variable con el mismo
nombre en el interior de un bloque. La variables extern permiten
transmitir valores entre distintas funciones, pero sta es una prctica
considerada como peligrosa. A continuacin se presenta un ejemplo y
analisis del uso de variables extern.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

int i=1, j, k;
/* se declaran antes de main() */
main()
{
int i=3;
/* i=1 se hace invisible */
int func1(int, int);
...
/* j, k son visibles
*/
}
- Se emplean cuando un programa consta de varios mdulos.
- En uno de ellos se define la variable.
- En los dems se declara (extern).
Ejercicio: 44Crear dos archivos como se describe a continuacin y
analizar
Modulo principal (main.c)
#include <stdio.h>
extern int valor; /* se declara */
void funcion(void);
main()
{
funcion();
printf("Valor = %d\n", valor);
}
Modulo auxiliar (aux.c)
int valor; /* se define la variable */
void funcion(void)
{
valor = 10;
}

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Variables estticas
Cuando ciertas variables son declaradas como static dentro de un
bloque, estas
variables conservan su valor entre distintas ejecuciones de ese
bloque. Dicho de otra
forma, las variables static se declaran dentro de un bloque como las
auto, pero permanecen en memoria durante toda la ejecucin del
programa como las extern.
Cuando se llama varias veces sucesivas a una funcin (o se ejecuta
varias veces un
bloque) que tiene declaradas variables static, los valores de dichas
variables se
conservan entre dichas llamadas. La inicializacin slo se realiza la
primera vez. Por
default, son inicializadas a cero.
Las variables definidas como static extern son visibles slo para las
funciones y bloques
comprendidos desde su definicin hasta el fin del archivo. No son
visibles desde otras
funciones ni aunque se declaren como extern. sta es una forma de
restringir la
visibilidad de las variables.
Por default, y por lo que respecta a su visibilidad, las funciones tienen
modo extern.
Una funcin puede tambin ser definida como static, y entonces slo
es visible para las
funciones que estn definidas despus de dicha funcin y en el
mismo fichero. Con estos
modos se puede controlar la visibilidad de una funcin, es decir,
desde qu otras funciones puede ser llamada
.

Ejemplo:
#include <stdio.h>
void funcion(void);
main()
{
funcion();
funcion();
funcion();

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
}
void funcion(void)
{
static int veces = 0;
veces = veces + 1;
printf("Se ha llamado %d veces a funcion\n", veces);
}
Ejercicio: Probar, analizar y describir como conservan o cambian el
valor de las variable, en los ejemplos anteriores
Variables de tipo registro (register)
Informan al compilador que el programador desea que la variable se
almacene en un lugar de rpido acceso, generalmente en registros
del CPU y los clculos con
ellas sean ms rpidos. No existen los modos auto y register para las
funciones.
- Si no existen registros disponibles se almacenara en memoria.
Ejemplo:
#include <stdio.h>
main()
{
register int j;
for (j = 0; j < 10; j++)
printf("Contador = %d\n", j);
}
45

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C

Capitulo 7 - PUNTEROS
Introduccin

+ La memoria de la computadora se encuentra organizada en grupos


de bytes que se denominan palabras.
+ Dentro de la memoria cada dato ocupa un nmero determinado de
bytes:
Por ejemplo, recordemos que:
Un char =>1 byte.
Un int =>4 bytes.
+ A cada byte o palabra se accede por su direccin.
+ Si x es una variable que representa un determinado dato el
compilador reservar los bytes necesarios para representar por
ejemplo a la variable x (4 bytes si es de tipo int).
Podemos pensar en la memoria como una serie de casilleros identificados por
su direccin en donde se almacenan los valores a usar.
Direccin Contenido
0
1
2
.
.
.
N
Un puntero es una variable que contiene una direccin de memoria.
Normalmente, esa direccin es la posicin de otra variable de memoria. Si una
variable contiene la direccin de otra variable, entonces se dice que la primera
variable apunta a la segunda. Si una variable va a contener un puntero,
entonces tiene que declararse como tal.
Una declaracin de un puntero consiste en un tipo base, un * y el nombre de la
variable. La forma general es:
tipo *nombre;
Donde tipo es cualquier tipo vlido y nombre es el nombre de la variable
puntero. El tipo base del puntero define el tipo de variables a las que puede
apuntar. Tcnicamente, cualquier tipo de puntero puede apuntar a cualquier
direccin de la memoria, sin embargo, toda la aritmtica de punteros esta
hecha en relacin a sus tipos base, por lo que es importante declarar
correctamente el puntero.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Ejemplos:
int *numero;
float *p;
char *letra;
Existen dos operadores especiales de punteros: & y *. El operador de direccin
& devuelve la direccin de memoria de su operando. El operador de indireccin
* devuelve el contenido de la direccin apuntada por el operando.
Si x es una variable entonces &x representa la direccin de memoria
de x.
+ Un puntero es una variable que almacena la direccin de otro
objeto (variable, funcin, . . . ).
Ejemplo:
#include <stdio.h>
main()
{
int x; /* variable de tipo entero */
int y; /* variable de tipo entero */
int *px; /* variable de tipo puntero a entero */
x = 5;
px = &x; /* asigna a px la direccin de x */
y = *px; /* asigna a y el contenido de la direccin almacenada en px
*/
printf("x = %d\n", x);
printf("y = %d\n", y);
printf("*px = %d\n", *px);
}
*px representa el contenido almacenado en la direccin a la que
apunta px.
* es el operador de indireccin y opera sobre una variable de tipo
puntero.
46
Un puntero representa la direccin de memoria del objeto al que
apunta, NO su valor.

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Considerando del ejemplo anterior:
int x;
int y;
int *px;
X=5 ; a x se le
asigna el valor de 5
y supongamos que
este valor se asigna
en la direccin
1000
px= &x; Aqu px
almacena el valor
de la diseccin
donde se almaceno
el valor de x

Y=*px; Esta
instruccin indica que
y va a tomar el valor
que esta en la
direccin de memoria
px

(&x)100
0

(&x)150
0

(&px)30
00

1000

Despus de declarar un puntero, pero antes de asignarle un valor, ste


contiene un valor desconocido; si en ese instante lo intenta utilizar,
probablemente se estrellar, no slo el programa sino tambin el sistema
operativo. Por convenio, se debe asignar el valor nulo a un puntero que no este
apuntando a ningn sitio, aunque esto tampoco es seguro.
Para usar un puntero se debe estar seguro de que apunta a una
direccin de memoria correcta.
Asignacin de punteros
Como en el caso de cualquier otra variable, un puntero puede utilizarse a la
derecha de una declaracin de asignacin para asignar su valor a otro puntero.
Por ejemplo:
int x;
int *p1,*p2;
p1=&x;
p2=p1;
Tanto p1 como p2 apuntan a x.
Un puntero no reserva memoria. El siguiente fragmento de programa
es incorrecto:
int *p;
*p = 5;
A que direccin de memoria apunta p?
Dnde se almacena el 5?

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Pueden asignarse punteros del mismo tipo entre s. Dado el siguiente
fragmento de cdigo:
float n1;
float n2;
float *p1;
float *p2;
n1 = 4.0;
p1 = &n1;
p2 = p1;
n2 = *p2;
n1 = *p1 + *p2;
Cunto vale n1 y n2?
47

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Paso de punteros a una funcin
Cuando se pasa un puntero a una funcin no se pasa una copia sino
la direccin del dato al que apunta.
+ El uso de punteros permite el paso de argumentos por referencia.
+ Cuando un argumento se pasa por valor, el dato se copia a la
funcin.
+ Un argumento pasado por valor no se puede modificar.
+ Cuando se pasa un argumento por referencia (cuando un puntero
se pasa a una funcin), se pasa la direccin del dato por lo tanto el
contenido de la direccin se puede modificar en la funcin.
+ Un argumento pasado por referencia si se puede modificar.
+ El uso de punteros como argumentos de funciones permite que el
dato sea alterado globalmente dentro de la funcin.
Ejemplos: 48
Ejecuta los siguientes ejemplos y haz una descripcin grafica de como
funciona el intercambio de valores de la funcin main y la funcin
que usa cada ejemplo.
Paso de parmetros por valor
#include <stdio.h>
void funcion(int a, int b); /* prototipo */
main()
{
int x = 2;
int y = 5;
printf("Antes x = %d, y = %d\n", x, y);
funcion(x, y);
printf("Despues x = %d, y = %d\n", x, y);
}
void funcion(int a, int b)
{
a = 0;
b = 0;
printf("Dentro a = %d, b = %d\n", a, b);
return;
}

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Paso de parmetros por referencia.
#include <stdio.h>
void funcion(int *a, int *b); /* prototipo */
main()
{
int x = 2;
int y = 5;
printf("Antes x = %d, y = %d\n", x, y);
funcion(&x, &y);
printf("Despues x = %d, y = %d\n", x, y);
}
void funcion(int *a, int *b)
{
*a = 0;
*b = 0;
printf("Dentro *a = %d, *b = %d\n", *a, *b);
return;
}
Funcin que intercambia el valor de dos variables.
#include <stdio.h>
void swap(int *a, int *b); /* prototipo */
main()
{
int x = 2;
int y = 5;
printf("Antes x = %d, y = %d\n", x, y);
swap(&x, &y);
printf("Despues x = %d, y = %d\n", x, y);
}
void swap(int *a, int *b)
{
int temp;
temp = *b;
*b = *a;
*a = temp;
return;
}

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
Puntero NULL
Cuando se asigna 0 a un puntero, este no apunta a ningn objeto o
funcin.
+ La constante simblica NULL definida en stdio.h tiene el valor 0 y
representa el puntero nulo.
+ Es una buena tcnica de programacin asegurarse de que todos los
punteros toman el valor NULL cuando no apuntan a ningn objeto o
funcin.
int *p = NULL;
Para ver si un puntero no apunta a ningn objeto o funcin:
if (p == NULL)
printf("El puntero es nulo\n");
else
printf("El contenido de *p es\n", *p);
El operador sizeof
Este es el operador de C con el nombre ms largo. Puede parecer una
funcin, pero en realidad es un operador. La finalidad del operador
sizeof() es devolver el tamao, en bytes, del tipo de variable
introducida entre los parntesis. Recurdese que este tamao
depende del compilador y del tipo de computadora que se est
utilizando, por lo que es necesario disponer de este operador para
producir cdigo portable. Por ejemplo:
var_1 = sizeof(double)
/* var_1 contiene el tamao
de una variable
*/
Ejemplo:

double

#include <stdio.h>
main()
{
float num;
printf(un int ocupa %d bytes\n", sizeof(int));
printf(un char ocupa %d bytes\n", sizeof(char));
printf(un float ocupa %d bytes\n", sizeof(float));
printf(un double ocupa %d bytes\n", sizeof(double));

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
printf("num ocupa %d bytes\n", sizeof(num));
}
49
Vectores y cadenas de caracteres
Una cadena de caracteres es un vector de caracteres, ya que, cada
elemento del vector almacena un carcter.
Ejemplo: Funcin que copia una cadena en otra:
void copiar(char *destino, char *fuente)
{
while (*fuente != '\0')
{
*destino = *fuente;
destino ++;
fuente++ ;
}
*destino = '\0';
return;
}
Punteros y vectores multidimensionales
Programa que define de forma dinmica una matriz (mediante
punteros).
#include <stdio.h>
#include <stdlib.h>
float **crear_matriz(int fil, int col);
void destruir_matriz(float **mat, int fil);
void leer_matriz(float **mat, int fil, int col);
void imprimir_matriz(float **mat, int fil, int col);
main()
{
float **matriz;
int fil, col;
printf("Numero de filas: ");
scanf("%d", &fil);
printf("Numero de columnas: ");
scanf("%d", &col);
matriz = crear_matriz(fil, col);
leer_matriz(matriz, fil, col);
imprimir_matriz(matriz, fil, col);
destruir_matriz(matriz, fil);
}

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
float **crear_matriz(int fil, int col)
{
int j;
float **mat;
mat = (float **) malloc(fil * sizeof(float *));
for (j = 0; j < fil; j++)
mat[j] = (float *) malloc(col * sizeof(float));
return(mat);
}
void destruir_matriz(float **mat, int fil)
{
int j;
for (j = 0; j < fil; j++)
free(mat[j]);
free(mat);
return;
}
void leer_matriz(float **mat, int fil, int col)
{
int i, j;
float dato;
for (i = 0; i < fil; i++)
for (j = 0; j < col; j++)
{
printf("Elemento %d %d: ", i,j);
scanf("%f", &dato);
*(*(mat + i) + j) = dato;
}
return;
}
void imprimir_matriz(float **mat, int fil, int col)
{
int i, j;
for (i = 0; i < fil; i++)
for (j = 0; j < col; j++)
printf("Elemento %d %d = %f\n",
i,j,mat[i][j]);
return;
}
50
LIBRERAS DEL LENGUAJE C

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
A continuacin se incluyen en forma de tabla algunas de las funciones de
librera ms
utilizadas en el lenguaje C.

Funcin

Tipo

Descripcin

Libreria

abs(i)

int

Devuelve el valor absoluto de i

stdlib.h

acos(d)

double Devuelve el arco coseno de d

math.h

asin(d)

double Devuelve el arco seno de d

math.h

atan(d)

double Devuelve el arco targente de d

math.h

atof(s)

double Convierte la cadena s en un nmero de doble


precisin

stdlib.h

atoi(s)

long

Convierte la cadena s en un nmero entero

stdlib.h

clock()

long

Devuelve la hora del reloj de la computadora.


Para pasar a segundos,
dividir por la constante CLOCKS_PER_SEC

time.h

cos(d)

double Devuelve el coseno de d

math.h

exit(u)

void

stdlib.h

exp(d)

double Elevar e a la potencia d (e=2.77182...)

math.h

fabs(d)

double Devuelve el valor absoluto de d

math.h

fclose(f)

int

Cierra el archivo f.

stdlib.h

feof(f)

int

Determina si se ha encontrado un fin de archivo. stdlib.h

fgetc(f)

int

Leer un carcter del archivo f.

fgets(s,i,f)

char * Leer una cadena s, con i caracteres, del archivo f stdlib.h

floor(d)

double Devuelve un valor redondeado por defecto al


entero ms
cercano a d.

fmod(d1,d2)

double Devuelve el resto de d1/d2 (con el mismo signo math.h


de d1)

fopen(s1,s2)

FILE * Abre un archivo llamado s1, para una operacin stdlib.h


del tipo s2.
Devuelve el puntero al archivo abierto.

fprintf(f,...)

int

Cerrar todos los archivos y buffers, terminando


el programa.

Escribe datos en el archivo f.

stdlib.h

math.h

stdlib.h

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
fputc(c,f)

int

Escribe un carcter en el archivo f.

stdlib.h

free(p)

void

Libera un bloque de memoria al que apunta p.

malloc.h

fscanf(f,...)

int

Lee datos del archivo f.

stdlib.h

getc(f)

int

Ler un carcter del archivo f.

stdlib.h

getchar()

int

Lee un carcter desde el dispositivo de entrada


estndar.

stdlib.h

log(d)

double Devuelve el logaritmo natural de d.

malloc(n)

void * Reserva n bytes de memoria.


Devuelve un puntero al principio del espacio
reservado.

pow(d1,d2)

double Devuelve d1 elevado a la potencia d2.

printf(...)

int

Escribe datos en el dispositivo de salida


estndar.

stdlib.h

rand(void)

int

Devuelve un valor aleatorio positivo.

stdlib.h

sin(d)

double Devuelve el seno de d.

math.h

sqrt(d)

double Devuelve la raz cuadrada de d.

math.h

strcmp(s1,s2)

int

Compara dos cadenas lexicogrficamente.

string.h

Compara dos cadenas lexicogrficamente, sin


considerar
maysculas o minsculas.

string.h

strcomp(s1,s2) int

Malloc.h o
stdlib.h

strcpy(s1,s2)

char * Copia la cadena s2 en la cadena s1

string.h

strlen(s)

int

Devuelve el nmero de caracteres en la cadena


s.

string.h

system()

int

Pasa la orden s al sistema operativo.

windows.h

tan(d)

double Devuelve la tangente de d.

math.h

time(p)

long
int

Devuelve el nmero de segundos transcurridos


desde de un tiempo base designado (1 de enero
de 1970).

time.h

toupper(c)

int

Convierte una letra a mayscula.

stdlib.h o
ctype.h

Nota: La columna tipo se refiere al tipo de la cantidad devuelta por la funcin.


Un asterisco
denota puntero, y los argumentos que aparecen en la tabla tienen el
significado siguiente:

Ing. Vctor Hugo Arroyo Hernndez

Tutorial de C
c denota un argumento de tipo carcter.
d denota un argumento de doble precisin.
f denota un argumento archivo.
i denota un argumento entero.
l denota un argumento entero largo.
p denota un argument puntero.
s denota un argumento cadena.
u denota un argumento entero sin signo.

Ing. Vctor Hugo Arroyo Hernndez

También podría gustarte