Está en la página 1de 38

Lenguajes de Programacin

Ing. Csar Aldo Canelo Sotelo

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS
AREA DE SISTEMAS, COMPUTACION E INFORMATICA

CICLO: 2013-III

Curso
: LENGUAJES DE PROGRAMACIN
Cdigo
: ST222V
Profesor: Ing. Csar Aldo Canelo Sotelo
FUNCIONES
Las funciones son los bloques constructores de C y el lugar donde se da toda la actividad del programa. La forma general de una
funcin es:
especificador_de_ tipo nombre_de_la_funcin(lista de parmetros)
{
definicin de variables;
// variables locales
cuerpo de la funcin;
return (valor devuelto);
}
Especificador de tipo: especifica el tipo de datos que devuelve la sentencia return de la funcin. El valor puede ser cualquier tipo vlido
de C. Si no se especifica tipo, el compilador asume que la funcin devuelve un resultado entero.
Nombre de la funcin: se usa para llamar a la funcin dentro del programa. Est permitido el uso de letras, nmeros y el smbolo _ para
dar nombre a la funcin. No se puede empezar con un nmero. El nombre no puede contener espacios ni signos de puntuacin.
Lista de parmetros: lista de nombre 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 contiene solo la
palabra clave void.
SENTENCIA RETURN
Tiene dos usos importantes:
1) Fuerza una salida inmediata de la funcin en que se encuentra. O sea, hace que la ejecucin del programa vuelva al cdigo que
llam a la funcin.
2) Se puede utilizar para devolver un valor.
VUELTA DE UNA FUNCIN
Hay dos formas en que una funcin puede terminar su ejecucin y volver al lugar en que se le llam:
1) Cuando se ha ejecutado la ltima sentencia de la funcin y conceptualmente se encuentra la llave } del final de la funcin.
2) Cuando se emplea la sentencia return para terminar la ejecucin, bien porque se tiene que devolver un valor o bien para
simplificar el cdigo y hacerlo ms eficiente permitiendo mltiples puntos de salida. Una funcin puede tener varias
sentencias return.
VALORES DEVUELTOS
Todas las funciones, excepto aquellas de tipo void devuelven un valor. Este valor se especifica explcitamente en la sentencia return. Si
una funcin no es especificada como void y si tampoco se especifica un valor de vuelta, entonces el valor devuelto por la funcin queda
tcnicamente indefinido. Mientras una funcin no se declare como void, puede ser usada como operando en cualquier expresin vlida en
C.
Las siguientes son expresiones vlidas en C:
x = potencia (y);
if (max (a, b) > 100) printf (mayor);
Sin embargo, una funcin no puede ser el destino de una asignacin. La siguiente expresin es incorrecta:
intercambio( x, y) = 100;

Lenguajes de Programacin

Ing. Csar Aldo Canelo Sotelo

Si se declara una funcin como void no puede ser usada en ninguna expresin. Por ejemplo, suponga que funcion se ha definido como
void. Las siguientes expresiones son incorrectas:
int num;
num= funcion( );
// No hay valor que asignar a num
LO QUE DEVUELVE main( )
Cuando se usa una sentencia return en main( ), devuelve un cdigo de terminacin al proceso de llamada (que generalmente es el
S.O.). El valor devuelto debe ser un entero. Para muchos sistema operativos, el valor 0 indica que el programa ha terminado normalmente.
Si no se especifica un valor con return, entonces el compilador devuelve un valor desconocido al S.O. Es una buena regla usar
explcitamente una sentencia return.
./* Ejemplo 1 */
# include <stdio.h>
# include <conio.h>
void limpia_pantalla(void);
int main( )
{ limpia_pantalla();
// Se llama a la funcin limpia_pantalla.
return 0;
}
void limpia_pantalla( )
{ clrscr();
printf(" La pantalla est limpia\n ");
return;
// return aqu es opcional, no hace falta devolver ningn valor.
}
Este programa llama a la funcin limpia_pantalla que borra la pantalla y muestra el mensaje La pantalla est limpia.
/* Ejemplo 2. Programa que utiliza funciones sin argumentos */
# include <stdio.h>
# include <conio.h>
cls();
// Declaracin de funciones
ingreso();
suma();
escribe();
int num1, num2, resultado;
// Variables globales
void main( )
{ cls();
ingreso();
suma();
escribe();
getch();
}
cls()
{ clrscr();
}
ingreso()
{ printf("Ingrese dos numeros enteros: ");
scanf("%d%d", &num1, &num2);
}
suma()
{ resultado=num1+num2;
}
escribe()
{ cls();
printf("La suma es = %d\n", resultado);
}
/* Ejemplo 3. Halla el mayor de dos enteros ingresados por el teclado */
# include <stdio.h>
# include <conio.h>

Lenguajes de Programacin

Ing. Csar Aldo Canelo Sotelo

void compara(int a, int b)


// Bloque de la funcin en lugar de la declaracin.
{ if(a>b) printf("%d es mayor que %d\n", a, b);
else printf("%d es mayor que %d\n",b, a);
return;
}
main()
{ int num1, num2;
printf("Ingrese dos nmeros enteros:\n");
scanf("%d %d", &num1, &num2);
compara(num1, num2);
// Se llama a la funcin con sus 2 argumentos
}
DONDE SE DEFINEN LAS FUNCIONES

Las funciones deben definirse antes de ser usadas.


Es aconsejable definir las funciones en la cabecera del programa. Esto no permite luego usar las funciones en cualquier orden. A
esto se llama prototipo de funcin.

// Ejemplo 4. Uso de la funcin compara para hallar el mayor de 2 nmeros enteros


# include <stdio.h>
# include <conio.h>
int compara(int a, int b);
// Definicin de prototipo de funcin
int main()
{ int num1, num2, resultado;
printf("Ingrese dos nmeros enteros:\n");
scanf("%d %d", &num1, &num2);
resultado=compara(num1, num2);
// Se llama a la funcin con sus 2 argumentos
printf("El mayor de los dos nmeros es: %d\n", resultado);
return 0;
}
int compara(int a, int b)
{ int mayor;
if(a>b) mayor=a;
else mayor=b;
return mayor;
}
En esta forma de programa se usan prototipo de funciones en la cabecera del programa, y luego los bloques de las funciones se colocan en
cualquier orden. La funcin en ambos lugares debe tener el mismo nombre, mismo nmero y tipo de parmetros y mismo tipo de valor
devuelto.
AMBITO DE LAS FUNCIONES
El cdigo de una funcin es privado a esa funcin y se accede a l slo a travs de una llamada a esa funcin. El cdigo y los datos que
estn definidos dentro de una funcin no pueden interactuar con el cdigo o los datos definidos dentro de otra funcin, porque las dos
funciones tienen un mbito diferente.
Las variables que estn definidas dentro de una funcin se llaman variables locales. Una variable local comienza a existir cuando se entra
en una funcin y se destruye al salir de ella. As, las variables locales no pueden conservar sus valores entre distintas llamadas a la
funcin.
ARGUMENTOS DE FUNCIONES
Si una funcin va a usar argumentos, se debe declarar variables que acepten los valores de los argumentos. Estas variables se llaman
parmetros formales de la funcin. Se comportan como variables locales dentro de la funcin, crendose al entrar en la funcin y
destruyndose al salir de ella. Los argumentos correspondientes en el punto de llamada a la funcin se llaman parmetros reales. As:

Lenguajes de Programacin

Ing. Csar Aldo Canelo Sotelo

funcion_escribe( char c, char d)


{
cuerpo de la funcin
}
La declaracin de parmetros aparece entre parntesis.
DECLARACIONES DE FUNCIONES PROTOTIPO
Si se quiere utilizar un funcin es suficiente con definirla para que pueda ser invocada desde cualquier punto del programa. Para poder
utilizar una funcin el compilador necesita conocer el tipo de valor que devuelve la funcin y los parmetros que acepta, de forma que
pueda comprobar que los tipos de parmetros reales coinciden con los tipos de parmetros formales. Cuando una funcin llama a otra
definida anteriormente, el compilador ya lo sabe, pero qu ocurre cuando se llama a una funcin que no ha sido definida previamente ?
El compilador asumir que la funcin devuelve int y que todos los parmetros son de tipo int, lo cual puede que no se corresponda con la
definicin posterior de la llamada.
Para que el compilador pueda conocer el tipo y los parmetros de las funciones antes de su uso se utilizan prototipo de funciones.
El formato de un prototipo de funcin es:
especificador_de_ tipo nombre_de_la_funcin(lista de parmetros);
Un prototipo lo que hace es declarar una funcin, es decir, indicar al compilador que existe una funcin con un nombre, tipo y
parmetros concretos. La definicin lo que incluye es el cdigo de la funcin.
/* Ejemplo 5. Prototipo de funcin que no tiene parmetros */
#include <stdio.h>
void mostrar(void);
main()
{ mostrar();
return 0;
}
void mostrar(void)
{ int i;
for(i=0; i<10; i++)
printf(%d, i);
}
LLAMADA A UNA FUNCIN
En general, se pueden pasar argumentos a las funciones de dos formas: Llamada por valor y llamada por referencia.
a) LLAMADA POR VALOR
En la llamada por valor, se 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. Lo que se pasa a la funcin es una copia del valor del
argumento. Lo que ocurra dentro de la funcin no tiene efecto sobre la variable utilizada en la llamada.
/* Ejemplo 6 */
# include <stdio.h>
# include <conio.h>
int cuadrado(int x);
int main()
{ int y =10;
printf(%d %d, cuadrado(y), y );
return 0;
}
cuadrado(int x)
{ x = x*x;
return(x);

Lenguajes de Programacin

Ing. Csar Aldo Canelo Sotelo

}
En este ejemplo se copia el valor del argumento de cuadrado( ), es decir 10, en el parmetro x. Cuando se ejecuta la asignacin x = x*x,
el nico elemento que se modifica es la variable local x. La variable y, usada para llamar a cuadrado( ), todava tiene el valor de 10. De
esta forma, la salida del programa es 100 10.
/* Ejemplo 7. Llamada a una funcin con paso por valor */
# include <stdio.h>
# include <conio.h>
void intercambio(int, int);
main()
{ int a=1, b=2;
printf("Los valores iniciales son a=%d y b=%d\n", a,b);
intercambio(a,b);
printf("\nLuego del intercambio los valores son a=%d y b=%d", a,b);
printf("\nLos valores iniciales en la funcin que invoc, no han cambiado");
}
void intercambio(int x, int y)
{ int aux;
aux=x;
x=y;
y=aux;
printf("\nLos valores intercambiados seran: a=%d y b=%d", x, y);
printf("\nDentro de la funcion intercambio los valores cambiaron");
}
b) LLAMADA POR REFERENCIA
En este mtodo, se copia la direccin del argumento en el parmetro. Dentro de la funcin se usa la direccin para acceder al
argumento usado en la llamada. Esto significa que los cambios hechos a los parmetros afectan a la variable usada en la llamada a la
funcin. Para hacer una llamada por referencia a una funcin, se pasa un puntero al argumento. Como esto hace que se pase la direccin
del argumento a la funcin, es posible cambiar el valor del argumento exterior de la funcin.
Los punteros se pasan a las funciones como cualquier otro valor. Previamente, es necesario declarar los parmetros como tipo
puntero.
Para pasar un valor por referencia, se utiliza el operador direccin & delante de la variable enviada. Esto le indica al compilador
que la funcin que se ejecutar tendr que obtener la direccin de memoria en que se encuentra dicha variable.
/* Ejemplo 8. Llamada a una funcin con paso por referencia */
# include <stdio.h>
# include <conio.h>
void intercambio(int *, int *);
main()
{
int a=1, b=2;
printf("Los valores iniciales son a=%d y b=%d\n", a,b);
intercambio(&a,&b);
printf("Luego del intercambio los valores son a=%d y b=%d", a,b);
printf("\nLos valores iniciales en la funcin que invoc, han cambiado");
}
void intercambio(int *x, int *y)
{
int aux;
aux=*x;
*x=*y;
*y=aux;
printf("Los valores intercambiados seran: a=%d y b=%d\n",*x,*y);

Lenguajes de Programacin

Ing. Csar Aldo Canelo Sotelo

printf("Son los valores dentro de la funcion intercambio\n\n");


}
/* Ejemplo 9. Programa que dado un nmero, usa una funcin para imprimir una por una sus cifras */
#include <stdio.h>
#include <conio.h>
void cifras(int);
main()
{
cifras(19872);
getch();
}
void cifras(int num)
{ while(num!=0)
{ printf("%d", num%10);
num=num/10;
}
}
Ejemplo: Prog que calcula el cociente y el resto de una divisin entera.
#include <stdio.h>
#include <conio.h>
void calculo(int a, int b);
main()
{int div, divis;
printf("Ingrese el dividendo y el divisor: ");
scanf("%d%d",&div, &divis);
calculo(div, divis);
getch();
}
void calculo(int a, int b)
{ int cociente, resto;
cociente= a/b;
resto = a%b;
printf("cociente= %d, resto = %d", cociente, resto);
return;
}
SOBRECARGA DE FUNCIONES
Por lo general es recomendable dar nombres distintos a funciones diferentes, pero, cuando algunas funciones ejecutan la misma tarea con
objetos de distinto tipo, puede ser ms conveniente darles el mismo nombre. El empleo del mismo nombre para diferentes operaciones con
tipos de datos distintos se denomina sobrecarga. Por ejemplo:
float suma ( float a, flota b);
int suma ( int a, int b);

// sumar dos valores reales


// sumar dos valores enteros

Para el compilador lo nico comn entre dos funciones con el mismo nombre, es el nombre.
RECURSIVIDAD
Se llama recursividad a un proceso mediante el que una funcin se llama a s misma de forma repetida, hasta que se satisfaga
alguna determinada condicin. Las funciones en C pueden emplearse recursivamente, es decir, una funcin puede llamarse a s misma ya
sea directa o indirectamente. El proceso se utiliza para computaciones repetitivas en las que cada accin se determina en funcin de un
resultado anterior.
Para resolver un problema recursivamente se deben satisfacer dos condiciones:

Lenguajes de Programacin

Ing. Csar Aldo Canelo Sotelo

1) El problema se debe escribir en forma recursiva.


2) El programa debe incluir una sentencia de condicin de fin.
Por ejemplo, para calcular el factorial de un nmero entero positivo, el problema se expresara as:
n! = 1 x 2 x 3 x . . . . x n
Sin embargo podemos expresar la solucin del problema de otra forma, escribiendo
n! = n x (n1)!
Esta es la forma recursiva, en la que la accin deseada (el clculo de n!) se expresa en trminos de un resultado anterior [ el valor de (n
1)! , que se supone conocido ]. Tambin sabemos que 1!=1 por definicin. Esto ltimo proporciona una condicin de fin para el proceso
recursivo.
/* Ejemplo10. Clculo del factorial de un nmero empleando
una funcin */
#include <stdio.h>
#include <conio.h>
long int factorial(int n);
main()
{ int numero;
printf("Ingrese un entero positivo: ");
scanf("%d", &numero);
printf("\nEl factorial es: %ld", factorial(numero));
getch();
}
long int factorial(int n)
{
int i;
long int producto= 1;
if(n>1)
for(i=2; i<=n; i++)
producto*=i;
return(producto);
}
/* Ejemplo 11. Factorial de un nmero empleando una funcin
recursiva */
#include <stdio.h>
#include <conio.h>
long int factorial(int n);
main()
{
int numero;
printf("Ingrese un entero positivo: ");
scanf("%d", &numero);
printf("\nEl factorial es: %ld", factorial(numero));
getch();
}
long int factorial(int n)
{
if(n<=1)
return(1);
else
return(n*factorial(n-1));
}

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

PASO DE ARRAYS UNIDIMENSIONALES A FUNCIONES


Los arrays unidimensionales nicamente pueden ser enviados a una funcin por referencia. En la llamada
a la funcin se pone el nombre del array sin ndice. Esto pasa la direccin del primer elemento del array a
la funcin. No se puede pasar un array completo como argumento a una funcin, en su lugar se pasa un
puntero.
/* Ejemplo. Paso de un array como argumento de una funcin */
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
void visualizar(int[ ]);

/* prototipo de funcin */

main()
{ int arreglo[10], i;
cout<<Generar un arreglo de 10 elementos numricos: \n";
for(i=0; i<10;i++)
{ cout<<"Elemento nro. %d: "<< i+1;
cin>> arreglo[i];
}
visualizar( arreglo);
}
void visualizar( int arreglo[])
{ int i;
for (i=0; i<10; i++)
cout<< arreglo[i];
}
En este ejemplo se aprecia como se enva un array a una funcin por referencia. Tambin se podra haber
declarado de otra forma con igual resultado:
Declaracin de prototipo: void visualizar(int *);
Cabecera de la funcin : void visualizar(int *arreglo)
ORDENAMIENTO DE VECTORES (mtodo de burbuja)
Ejemplo: Programa que ordena una lista usando funciones, arrays y punteros.
#include <stdio.h>
#include <conio.h>
void ordenar(int lista[], int size);
main()
{int vector[20],i, n;
cout<<Cuantos elementos leera ? ";
cin>>n;
for(i=0; i<n; i++)
{ cout<<"\nIngrese elemento: "<< i+1<< ;
cin>>vector[i];
}
for(i=0; i<n; i++)
cout<<"\nElemento : "<< i+1<< vector[i];
ordenar(vector, n);
cout<<"\nElementos ordenados:\n ";
for(i=0; i<n; i++)
cout<<"\nElemento: "<< i+1<<vector[i];
getch();
}

Lenguajes de Programacin
Sotelo
void ordenar(int lista[], int size)
{int i, j, aux;
for(i=0; i<size-1; i++)
for(j=0; j<size-1; j++)
{ if(lista[j]>=lista[j+1])
{ aux=lista[j];
lista[j]=lista[j+1];
lista[j+1]=aux;
}
}
}

Ing. Csar Aldo Canelo


// Ordenamiento con ndices

INSERCIN DE UN ELEMENTO EN UN VECTOR


Prog que lee un vector y luego inserta X en la K-esima posicin del vector.
#include <stdio.h>
#include <conio.h>
main()
{int vector[80], x, k, p, q, n, i;
cout<<"Ingrese numero de elementos: ";
for(i=0; i<n; i++)
{cout<<"\nIngrese elemento: << i+1<< ;
cin>>vector[i];
}
cout<<"Ingrese valor a insertar ";
cin>>x;
cout<<"Ingrese posicion a insertar ";
cin>>k;
for(i=n; i>=k; i--)
{ vector[i+1]=vector[i];
}
vector[k]=x;
cout<<"\El nuevo vector es: ";
for(i=0; i<n+1; i++)
cout<< vector[i];
getch();

cin>>n;

CADENAS
El uso ms comn de los arrays unidimensionales en C, es como una cadena de caracteres. C incluye
algunas funciones potentes de manejo de cadenas. En C una cadena se define como un array de caracteres
de cualquier longitud que termina en un carcter nulo. Un carcter nulo se especifica como \0 y es un
cero. Por esta razn, para declarar arrays de caracteres es necesario que sean de un carcter ms que la
cadena ms larga que pudiera contener. As, para declarar un array cadena que contenga una cadena de
10 caracteres, se declarar:
char cadena[11];
Esto dejar sitio para el carcter nulo del final de la cadena.
En C una cadena de caracteres es una lista de caracteres encerrada entre doble comillas. As:
Hola, buenos das
No es necesario aadir explcitamente el carcter nulo al final de la cadena, el compilador de C lo hace
automticamente (con la tecla enter).
FUNCIONES PARA EL MANEJO DE CADENAS

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

El C soporta una gran variedad de funciones de manejo de cadenas. Algunas de las ms comunes son:
strcpy(), strcat(), strlen() y strcmp(), que se usan respectivamente para copiar, concatenar, hallar longitud
y comparar respectivamente. Estas funciones se encuentran en la librera <string.h>. Los prototipos de
estas funciones son:
strcpy(s1, s2)
Esta funcin copia la cadena s2 en la cadena s1. Devuelve s1.
strcat(s1, s2)
Esta funcin concatena la cadena s2 en la cadena s1. Devuelve s1.
strlen(s1)
Esta funcin devuelve la longitud de la cadena s1.
strcmp(s1, s2)
Esta funcin compara las cadenas s1 y s2. Devuelve cero si las dos cadenas son iguales, mayor que cero
si la cadena s1 es mayor que s2, y menor que cero si la cadena s1 es menor que s2. Todas las
comparaciones se hacen alfabticamente.
En la librera <stdio.h> se tiene otras funciones para la entrada y salida de cadenas:
Funcin
puts
gets
putchar
getchar

Significado
Escribe una cadena seguida de un retorno de carro.
Lee una cadena terminada en un retorno de carro (el cual se sustituye
por \0).
Escribe un nico carcter.
Lee un nico carcter.

/* Ejemplo. Programa que ilustra el uso de funciones de manejo de cadenas */


#include <stdio.h>
#include <conio.h>
#include <string.h>
main( )
{ char c1[80], c2[80];
cout<<"ingrese la 1ra cadena: "; gets(c1),
//cin>>c1;
cout<<"Ingrese la 2da cadena: "; gets(c2); //cin>>c2;
cout<<"longitudes: "<<strlen(c1)<<" "<<strlen(c2);
if(!strcmp(c1, c2))
cout<<"Las cadenas son iguales\n";
else
cout<<"Las cadenas son diferentes\n";
strcat(c1, c2);
/* Se concatenan las cadenas */
cout<<c1;
/* Se imprime la cadena concatenada: c1 */
getch(); }
La funcin strcmp( ), devuelve falso (es decir cero) si las cadenas son iguales, por lo que si se est
probando la igualdad, el operador lgico ! lo que hace es invertir la condicin.
/* Ejemplo. Programa que lee una cadena de caracteres y calcula su longitud */
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define max_cadena 100
main( )
{ char cadena[max_cadena];
int longitud = 0;
cout<<Ingrese una cadena de caracteres: ";
gets( cadena);
while(cadena[longitud]!='\0')

10

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

longitud++;
cout<<La longitud de la cadena <<cadena<< es "<< longitud;
getch();
}
Ejemplo. Programa que calcula longitud de una cadena usando una funcin.
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define max_cadena 100
int longitudes(char cad[]);
main( )
{ char cadena[max_cadena];
int i;
cout<<"Ingrese una cadena de caracteres: ";
gets(cadena);
i=longitudes(cadena);
cout<<"La longitud de la cadena "<<cadena<<" es "<<i;
getch();
}
int longitudes(char cad[])
{ int longitud=0;
while(cad[longitud]!='\0')
longitud++;
return longitud;
}
Dado que una cadena puede contener una frase, en este programa se usa la funcin GETS para leer la
cadena, debido a que la funcin scanf y el stream cin slo captura palabras, no frases.
//Ejemplo. Prog que compara si dos cadenas son iguales (STRCMP).
#include <stdio.h>
#include <conio.h>
#include <string.h>
int compara(char s[], char t[]);
main()
{ char cad1[20], cad2[20];
int i;
cout<<"Ingrese la cadena1: ";
gets(cad1);
cout<<Ingrese la cadena2: ");
gets(cad2);
i= compara(cad1, cad2);
if(i==0) cout<<" Las cadenas son iguales";
else cout<<"Las cadenas NO son iguales";
getch();
}
int compara(char s[], char t[])
{ int i;
for(i=0; s[i]==t[i]; i++)
if(s[i]=='\0')
return 0;
return(s[i]-t[i]);
}

11

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

// Ejemplo. Programa que lee los elementos de un vector y luego los ordena y visualiza.
#include <stdio.h>
#include <conio.h>
#define size 5
void mostrar(int b[]);
void ordenar(int b[]);
main()
{ int a[size], i;
cout<<"\t\tIngreso de elementos del arreglo:";
for(i=0; i<=size-1; i++)
{ cout<<"\nElemento: "<< i+1<< ;
cin>>a[i];
}
mostrar(a);
ordenar(a);
printf("\n");
mostrar(a);
getch();
}
void mostrar(int b[])
{ int i;
for(i=0; i<=size-1; i++)
cout<<"\nElemento "<<i+1<< <<b[i];
}
void ordenar(int b[])
{ int i, j, aux;
for(i=1; i<=size-1; i++)
{ for(j=0; j<=size-i; j++)
if(b[j]>=b[j+1])
{ aux=b[j];
b[j]=b[j+1];
b[j+1]=aux;
}
}
}
ARRAYS BIDIMENSIONALES
Es un arrays de dos dimensiones.
Declaracin:
tipo_dato nombre_array[ ][ ];
PASO DE ARRAYS BIDIMENSIONALES A FUNCIONES
Cuando se utiliza un array bidimensional como argumento de una funcin, realmente slo se pasa un
puntero al primer elemento. Sin embargo, la funcin que recibe un array bidimensional como parmetro
tiene que definir al menos la segunda dimensin, ya que el compilador necesita saber la longitud de cada
fila para indexar el array correctamente. Por ejemplo, una funcin recibe un array de enteros
bidimensional 5,10 se declara as:
func1( int tabla[ ][10])
{ ...
}
Se puede especificar la primera dimensin tambin, pero no es necesario. Si la longitud de las filas est
sin definir, entonces sera imposible saber dnde empieza la siguiente fila.
// Ejemplo 8. Programa que lee y muestra un array bidimensional usando funciones.

12

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define fil 10
#define col 10
void lee_A(int arreglo[fil][col], int fila, int columna);
void muestra_A(int arreglo[fil][col], int fila, int columna);
main()
{ int array[fil][col], m, n;
srand(time(NULL));
cout<<"Ingrese nro de filas: ";
cin>>m;
cout<<"Ingrese nro de columnas: ";
cin>>n;
lee_A(array, m, n);
muestra_A(array, m, n);
getch();
return 0;
}
void lee_A(int arreglo[fil][col], int fila, int columna)
{ int i, j;
for(i=0; i<=fila-1; i++)
for(j=0; j<=columna-1; j++)
arreglo[i][j]=1+(rand()%100);
//Genera nmeros aleatorios entre 0 y 99
}
void muestra_A(int arreglo[fil][col], int fila, int columna)
{ int i, j;
for(i=0; i<=fila-1; i++)
{ for(j=0; j<=columna-1; j++)
cout<<"\t "<<arreglo[i][j];
cout<<"\n";
}
return;
}
PUNTEROS
Un puntero es una variable que contiene la direccin de memoria de otra variable. Los punteros se
usan en C, en parte debido a que ellos son en ocasiones la nica forma de expresar una operacin. El
valor de cada variable est almacenado en un lugar determinado de la memoria, caracterizado por una
direccin. La computadora mantiene una tabla de direcciones que relaciona el nombre de cada
variable con su direccin en memoria. Ejemplo:
Variable
Direccin
p1
00FA:000A
p2
00FA:000E
Variables Puntero
-

Contiene la direccin de memoria de las variables.


Las variables normales contienen un valor especfico (referencia directa).
cont

Los punteros contienen la direccin de una variable, que a su vez contienen un valor
especfico (referencia indirecta).
Ptrcont
cont

13

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

Declaracin de punteros
tipo_de_dato * nombre_variable_puntero;
Donde:
tipo_de_dato, es el tipo de objeto apuntado.
* es el operador de indireccin (significa puntero a).
nombre_variable puntero, es el nombre de la variable puntero.
Operadores
Para trabajar con punteros se usan los operadores monarios:
* Operador de indireccin .- Permite referenciar el contenido de la direccin de memoria almacenada
por el puntero. Toma a su operando como una direccin, y devuelve como resultado su contenido.
& Operador de direccin .- Devuelve como resultado la direccin de memoria de su operando.
Supongamos que v es una variable que representa un determinado dato. El dato puede ser accedido si
conocemos su direccin. La direccin de memoria de v puede ser determinada mediante la expresin
&v. As podemos asignar la direccin de v a otra variable pv.
pv
v

Relacin entre pv y v , donde pv = &v y v = *pv.


Ejemplo: Programa que ilustra la relacin entre dos variables enteras, sus correspondientes
direcciones y sus punteros asociados.
# include <stdio.h>
main()
{ int u = 3;
int v;
int *pu;
// Puntero a entero
int *pv;
pu = &u;
// Asigna la direccin de u a pu
v = *pu;
// Asigna el valor de u a v
pv = &v;
// Asigna la direccin de v a pv
printf( \n u = %d &u = %x pu = %x *pu = %d, u, &u, pu, *pu);
printf( \n v = %d &v= %x pv = %x *pv = %d, v, &v, pv, *pv);
}
La ejecucin del programa dar un resultado as:
u=3
v=3

&u = F8E
&v = F8C

pu = F8E
pu = F8C

*pu = 3
*pu = 3

pu

pv

- Los operadores & y * son opuestos, por lo tanto se cancelan mutuamente.


- Las constantes y las expresiones no tienen direccin, por lo que no se les puede aplicar el operador
&.

14

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

- No pueden cambiarse las direcciones de las variables.


- Los valores posibles para un puntero son las direcciones posibles de memoria.
- Un puntero puede tener valor 0 (Null), es decir apunta a nada.
Paso de Punteros a una Funcin
Los punteros se usan para pasar argumentos por referencia (o por direccin), en contraste con pasar
argumentos por valor. Cuando un argumento es pasado por referencia, la direccin del dato es
pasada a la funcin. Cualquier cambio que se realiza al dato ser reconocida tanto en la funcin que
llama como en la funcin invocada. As, el uso de punteros como argumentos de funciones permite
que el dato sea alterado globalmente dentro de las funciones.
En las llamadas por referencia con argumentos tipo puntero:
-

Se pasa la direccin del argumento usando el operador &.


Nos permite cambiar el contenido de una direccin de memoria determinada.
Los arrays no se pasan con & porque el nombre del array ya es un puntero.

Ejemplo. Programa que ilustra la diferencia entre argumentos ordinarios, pasados por valor, y
argumentos puntero, que son pasados por referencia.
# include <stdio.h>
# include <iostream.h>
# include <conio.h>
void funcion1(int u, int v);
void funcion2(int *pu, int *pv);

// Declaracin de funciones

main()
{ int u = 3;
int v = 3;
cout<<"\n Antes de la llamada a funcion1: u = "<< u<<" v = "<<v;
funcion1(u, v);
cout<<"\n Despues de la llamada a funcion1: u = "<<u<<" v = "<< v;
cout<<"\n Antes de la llamada a funcion2: u = "<<u<<" v = "<< v ;
funcion2(&u, &v);
cout<<"\n Despues de la llamada a funcion2: u = "<<u<<" v = "<<v;
getch();
}
void funcion1(int u, int v)
{ u = 0;
v = 0;
cout<< "\n Dentro de funcion1: u = "<<u<<" v = "<< v ;
return;
}
void funcion2(int *pu, int *pv)
{ *pu = 0;
*pv = 0;
cout<< "\n Dentro de funcion2: *pu = "<<*pu<<" *pv = "<< *pv;
return;
}
Este programa tendr la siguiente salida:
Antes de la llamada a funcion1:
u=3
v=3
Dentro de funcion1:
u=0
v=0
Despus de la llamada a funcion1:
u =3
Antes de la llamada a funcion2:
u=3
v=3
Dentro de funcion2:
*pu = 0
*pv = 0
Despus de la llamada a funcion1:
u =0
v=0

15

v=3

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

Note que u y v quedan inalterados dentro de main () despus de la llamada a funcion1, mientras que
los valores de esas variables cambian dentro de main() despus de la llamada a funcion2.
Ejemplo. Llamada a una funcin con paso por referencia.
# include <stdio.h>
# include <conio.h>
void intercambio(int *, int *);
main()
{ int a=1, b=2;
cout<<"Los valores iniciales son a = <<a<< b = "<< b;
intercambio(&a,&b);
cout<<"Luego del intercambio los valores son a= <<a<< b= "b;
printf("\nLos valores iniciales en la funcin que invoco, han cambiado");
}
void intercambio(int *x, int *y)
{ int aux;
aux=*x;
*x=*y;
*y=aux;
cout<<("\nValores intercambiados dentro de la funcin: a= <<*x<< b= "<<*y;
}
ARITMETICA DE PUNTEROS
Si p es un puntero a algn elemento de un array, entonces p++ incrementa p para apuntar
al siguiente elemento, y p + = i la incrementa para apuntar i elementos adelante de donde
actualmente lo hace. Esta y otras construcciones semejantes son las formas ms simples de aritmtica
de punteros.
45
73
28
32
int *px;
*px = 45;
*(px+1) = 73;
*(px+2) = 28;
*(px1)=32; px1

px
px+1
px+2

PUNTEROS Y ARRAYS
En C existe una estrecha relacin entre arrays y punteros, por lo que cualquier operacin
que pueda realizarse mediante la indexacin de un array, tambin se puede realizar con punteros.
Hay dos formas de referirnos al contenido de un elemento de un array:
*(array + ndice); o array[ndice];
Por ejemplo:
int lista[ 5 ], ind;
Puesto que *(lista + 0) es igual que lista[ 0 ], la asignacin: p = &lista[ 0 ] es la misma que la
asignacin p = lista, donde p es una variable de tipo puntero. Esto indica que la direccin de
comienzo de un array es la misma que la del primer elemento. Por otra parte, despus de haber
efectuado la asignacin p = lista, las siguientes expresiones dan lugar a idnticos resultados:

16

Lenguajes de Programacin
Sotelo
p[ind],

*(p + ind),

Ing. Csar Aldo Canelo

lista[ind],

*(lista + ind)

Sin embargo, hay una diferencia entre el nombre de un array y el nombre de un puntero. El nombre
de un array es una constante y el nombre de un puntero es una variable. Esto quiere decir que las
operaciones:
lista = p
p = lista

o
o

lista ++
p++

no son correctas, y las operaciones:


s son correctas.

EQUIVALENCIAS ARRAYS / PUNTEROS


Memoria
A[0] = *A
A[1] = *(A+1)
A[2] = *(A+2)
. . .
A[9] = *(A+9)
A
A+1
A+2
...
A+9

0
1
2
9

ARRAYS DE PUNTEROS
Se puede definir un array, para que sus elementos, en lugar de contener un dato, contengan una
direccin o sea un puntero.
Ejemplo:
int *a[ 10 ], v;
a[ 0 ]= &v;
printf( %d, *a[0] );
La salida ser el valor de la variable v.
Cuando cada elemento de un array es un puntero a otro array, estamos en el caso de una doble
indireccin, es decir punteros a punteros.
Para especificar que una variable es un puntero a puntero, la declaracin es la siguiente:
tipo_de_dato **variable;
Ejemplo:
int **p;

/* p es un puntero a puntero */

// Programa que ordena un vector usando funciones, arrays y punteros.


# include <stdio.h>
# include <iostream.h>
# include <conio.h>
void ordenar(int *lista, int size);
main()
{int vector[20],i, n;
cout<<"Cuantos elementos leera ? ";
cin>>n;

17

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

for(i=0; i<n; i++)


{ cout<<"\nIngrese elemento: "<<i+1<<" ";
cin>>vector[i];
}
for(i=0; i<n; i++)
cout<<"\nElemento "<<i+1<<" "<<vector[i];
ordenar(vector, n);
cout<<"\nElementos ordenados: ";
for(i=0; i<n; i++)
cout<<"\nElemento "<<i+1<<" "<<vector[i];
getch();
}
/* void ordenar(int *lista, int size) // Ordenamiento con ndices
{int i, j, aux;
for(i=0; i<size-1; i++)
for(j=0; j<size-1; j++)
{ if(lista[j]>=lista[j+1])
{ aux=lista[j];
lista[j]=lista[j+1];
lista[j+1]=aux;
}
}
}
*/
void ordenar(int *lista, int size) //Ordenamiento con punteros
{int i, j, aux;
for(i=0; i<size-1; i++)
for(j=0; j<size-1; j++)
{ if(*(lista+j)>=*(lista+j+1))
{ aux=*(lista+j);
*(lista+j)=*(lista+j+1);
*(lista+j+1)=aux;
}
}
}
/* Programa que multiplica los elementos de un arrays de dos dimensiones por una constante y luego
escribe el contenido de dicho array, usando punteros */
#include <stdio.h>
#include <conio.h>
#define F 4
/* Numero de filas */
#define C 5
/* Numero de columnas */
main()
{ int tabla[F][C]= {{10, 12, 15, 17, 14},
{22, 20, 23, 25, 21},
{38, 30, 34, 36, 35},
{45, 41, 44, 48, 49}};
const k=10;
int f, c;
/* Multiplicar cada elemento por una constante k */
for(f=0; f<F; f++)
for(c=0; c<C; c++)
tabla[f][c]*=k;
// tabla[f][c]= tabla[f][c]*k;
/* Escribir el array */
for(f=0; f<F; f++)
{ for(c=0; c<C; c++)
printf("%5d", *(*(tabla+f)+c));
putchar('\n');
}

18

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

/* Escritura de la tabla usando notacin de array */


for(f=0; f<F; f++)
{ for(c=0; c<C; c++)
printf( " %5d ", tabla[f ][c]);
putchar( ' \n ' );
}
getch();
}
Para usar la versin de punteros se debe plantear la cuestin de cmo escribir la expresin tabla[ f ]
[ c ]utilizando la notacin de punteros. Se puede pensar que un array de dos dimensiones es un array
de una dimensin, donde cada elemento es a su vez un array de una dimensin.
En el ejemplo, la direccin de todo el array es tabla. Este array tiene 4 elementos (filas), desde
tabla[ 0 ] a tabla[ 3 ]. La direccin de cada elemento fila (array de 5 elementos) es:
tabla + 0, tabla + 1, tabla + 2, tabla + 3
Si elegimos una fila, por ejemplo tabla[ 1 ], o en notacin puntero tabla+1, interpretamos esta
expresin como un puntero a un array de 5 elementos; esto quiere decir que tabla + 1 es un puntero
a un puntero, o que el contenido de tabla + 1, esto es *(tabla + 1) , es la direccin del primer elemento
de esa fila, tabla[ 1 ][ 0 ], o en notacin puntero *(tabla + 1) + 0. Las direcciones tabla + 1 y *(tabla
+ 1) coinciden, pero ambas expresiones tienen diferente significado. Por ejemplo:
tabla + 1 + 2
se refiere a la fila tabla[ 3 ]
*( tabla + 1) + 2 se refiere al elemento tabla[ 1 ][ 2 ]
*( *(tabla + 1) + 2)
es el contenido del elemento tabla [ 1 ][ 2 ]
Ejemplo: Prg que determina la longitud de una cadena usando punteros.
#include <stdio.h>
#include<conio.h>
int longitud(char *);
main()
{char cad[80];
int i;
cout<<"Ingrese la cadena: ";
gets(cad);
cout<<"\nLa cadena tiene "<< longitud(cad)<< caracteres;
getch();
}
int longitud(char *p)
{int i=0;
while( *p++ )
i++;
return i;
}
/* Otra versin del programa longitud de cadena.
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
int longitud(char *);
main()
{char cad[80];
int i;
cout<<"Ingrese la cadena: ";
gets(cad);
cout<<"\nLa cadena tiene "<< longitud(cad)<<" caracteres";
getch();
}

19

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

int longitud(char *p)


{int i=0;
for(i=0; *p!='\0';p++)
i++;
return i;
}
/* PROGRAMA QUE COPIA UNA CADENA EN OTRA
#include <stdio.h>
#include <conio.h>
#include <iostream.h> // PROGRAMA QUE COPIA UNA CADENA EN OTRA, CON PUNTEROS
void copiar(char *p, char *q);
main()
{char cad01[80], cad02[80];
cout<<"Ingrese la cadena 1: ";
gets(cad01);
copiar(cad02, cad01);
cout<<"\nLa cadena copiada "<<cad02;
getch();
}
void copiar(char *p, char *q) // Una version
{while(*p=*q)!=\0)
{ p++;
q++;
}
}
void copiar(char *p, char *q) // Otra version
{while(*p++=*q++)!=\0)
}
void copiar(char *p, char *q)
{while(*p++=*q++);
}

//otra version

ESTRUCTURAS
Una estructura es una coleccin de variables que se identifican bajo un nico nombre,
proporcionando un medio eficaz para mantener junta informacin que est relacionada. La declaracin de
una estructura forma una plantilla que puede utilizarse para crear variables de tipo estructura, por lo que
una estructura se considera como un tipo de dato definido por el usuario. Las variables que componen la
estructura se llaman elementos de la estructura.
La forma general de una definicin de estructura es:
struct nombre_estructura{
tipo nombre_de_variable1;
tipo nombre_de_variable2;
tipo nombre_de_variable3;

} variables_de_estructura;
Donde struct es la palabra clave que indica al compilador que se est declarando una estructura,
nombre_estructura es el nombre de la estructura que se ha creado no es nombre de variable -. Las
variables de estructura son una lista de nombres de las variables separados por coma.
Al definir una estructura se puede omitir o bien el nombre_estructura (etiqueta), o bien las
variables_de_estructura, pero no ambas. Si slo se necesita una variable de estructura, entonces no se
necesita el nombre de la estructura. Ejemplos:

20

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

struct trabajador{
char nombre[20];
char apellido[20];
int edad;
char categora;
};
struct trabajador fijo, temporal;
En este caso, se declara la estructura, y cuando se necesitan las variables fijo y temporal, se
declaran.
struct trabajador{
char nombre[20];
char apellido[20];
int edad;
char categora;
} fijo, temporal;
En este caso las variables se declaran al mismo tiempo que la estructura.
struct{
char nombre[20];
char apellido[20];
int edad;
char categora;
} empleado;
Aqu se declara una variable de estructura, porque slo se necesita la variable de estructura
empleado.
REFERENCIA A LOS ELEMENTOS DE UNA ESTRUCTURA
Para hacer referencia a los elementos individuales de una estructura, se utiliza el operador .
(operador punto). Por ejemplo, la siguiente sentencia asigna la edad 30 al campo edad de la variable de
estructura empleado:
empleado.edad = 30;
El nombre de la variable estructura seguido de un punto y del nombre del elemento hace referencia a ese
elemento individual de la estructura. La forma general de acceso es:
variable_estructura.nombre_de_elemento;
As, para imprimir la edad del empleado, la sentencia es:
cout<<empleado.edad;
De igual forma, se puede usar la funcin gets() para ingresar el array de caracteres empleado.nombre, as:
gets(empleado.nombre);
Esta sentencia pasa un puntero al primer carcter del elemento nombre de la estructura. Para acceder a
caracteres individuales de empleado.nombre, se puede indexar nombre. Por ejemplo, se puede imprimir el
contenido de empleado.nombre, carcter a carcter utilizando el siguiente cdigo:
for ( i=0; empleado.nombre[i]; i++)
putch(empleado.nombre[i]);
ARRAY DE ESTRUCTURAS
Los arrays de estructura tienen un uso frecuente. Para declarar un array de estructuras, se debe definir
primero la estructura y luego declarar una variable array de dicho tipo. Por ejemplo, para declarar un
array de estructuras de 100 elementos del tipo trabajador, se escribira as:

21

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo


struct trabajador fijo[100];

Esto crea 100 conjuntos de variables organizados como se haya definido en la estructura trabajador.
Para acceder a una determinada estructura, se indexa el nombre de la estructura. Por ejemplo, para
imprimir la edad de la tercera estructura, se escribira:
cout<<fijo[2].edad;
Como todas las variables array, los arrays de estructuras comienzan con el ndice 0.
PASO DE ESTRUCTURAS A FUNCIONES
Cuando se pasa un elemento de una variable estructura a una funcin, realmente lo que se est
pasando es el valor de ese elemento a la funcin. Por lo tanto, se est pasando una variable simple.
Cuando el elemento pasado sea un array, en ese caso se pasa una direccin. Ejemplo:
struct personal{
char x;
int y;
float z;
char s[20];
} empleado;
Segn la estructura y la variable declaradas, a continuacin se indican ejemplos de cada
elemento que es pasado a una funcin:
func1(empleado.x);
func2(empleado.y);
func3(empleado.z);
func4(empleado.s);
func5(empleado.s[2]);

/* pasa el valor del carcter x */


/* pasa el valor del entero y */
/* pasa el valor del real z */
/* pasa la direccin de la cadena s */
/* pasa el valor del carcter de s[2] */

Si se requiere pasar la direccin de elementos individuales de la estructura para conseguir un


paso de parmetro en llamada por referencia, deber colocarse el operador & antes del nombre de la
estructura. As, para pasar las direcciones de los elementos de la estructura empleado, se escribir:
func1(&empleado.x);
/* pasa la direccin del carcter x */
func2(&empleado.y);
/* pasa la direccin del entero y */
func3(&empleado.z);
/* pasa la direccin del real z */
func4(empleado.s);
/* pasa la direccin de la cadena s */
func5(&empleado.s[2]); /* pasa la direccin del carcter de s[2] */
OPERADOR SIZEOF
Este operador se usa para determinar el nmero de bytes requeridos por un array o una
estructura. As, el tamao de la estructura puede determinarse escribiendo:
sizeof variable

sizeof(struct nombre_de_estructura)

/** Programa que determina el tamao de una estructura **/


#include<stdio.h>
#include<iostream.h>
#include <conio.h>
main()
{
struct fecha{
int dia;
int mes;
int anio;

22

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

};
struct cuenta{
int nro_cta;
char tipo_cta;
char nombre[40];
float saldo;
struct fecha ultimo_pago;
} cliente;
cout<<sizeof(cliente);
cout<<sizeof(struct cuenta);
getch();
}
La variable estructura cliente es equivalente a la estructura cuenta.
DATOS DEFINIDOS POR EL USUARIO
La caracterstica typedef permite a los usuarios definir nuevos tipos de datos que sern equivalentes a los
datos existentes. Una vez que el tipo de dato definido por el usuario ha sido declarado, entonces las
nuevas variables, arrays, estructuras, etc., pueden ser declaradas en trminos de ese nuevo tipo de dato.
El formato es el siguiente:
typedef tipo nuevo_tipo;
Donde tipo se refiere a un tipo de dato existente, y nuevo_tipo es el nuevo tipo definido por el usuario. El
nuevo tipo lo ser slo en el nombre, porque en realidad no ser diferente a los tipos de datos estndar.
Ejemplo:
typedef float estatura[100];
estatura hombre, mujer;
Define estatura como un array de 100 elementos de coma flotante; hombre, mujer se consideran variables
de tipo estatura, pero son realmente variables de tipo float.
ESTRUCTURAS Y PUNTEROS
La direccin de comienzo de una estructura puede accederse de la misma manera que cualquier
otra direccin, mediante el uso del operador direccin (&). As si variable representa un tipo de variable
de estructura, entonces &variable representa la direccin de comienzo de esa variable. La declaracin de
una nueva variable puntero a estructura es:
tipo *ptvar;
Donde tipo es el tipo de dato que identifica la composicin de la estructura y ptvar representa el nombre
de la variable puntero. Para asignar la direccin de comienzo de la variable estructura a este puntero, se
escribir:
ptvar = &variable;
Pueden combinarse la declaracin de la variable y del puntero en la declaracin de la estructura. El
formato es:
typedef struct {
miembro 1;
miembro 2;

miembro m;
} variable, *ptvar;
Ejemplo:
typedef struct {
int nro_cta;
char tipo_cta;

23

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo


char nombre[80];
float saldo;
} cliente, *pc;

La direccin de comienzo de la estructura cliente puede asignarse a pc escribiendo:


pc=&cliente;
Un miembro de una estructura puede accederse en trminos de su correspondiente variable puntero,
escribiendo:
ptvar miembro;
Donde ptvar refiere a una variable puntero a estructura y el operador es comparable al operador punto
(.). As la expresin:
ptvarmiembro es equivalente a variable.miembro
El operador puede combinarse con el operador punto para acceder a un submiembro dentro de una
estructura, as:
ptvar miembro.submiembro;
Similarmente, el operador puede usarse para acceder a un elemento de un array que es miembro de una
estructura, as:
ptvar miembro[expresin];
Donde expresin es un elemento no negativo que indica el elemento del array. Ejemplo:

typedef struct {
int da;
int mes;
int anio;
} fecha;
struct {
int nro_cta;
char tipo_cta;
char nombre[80];
float saldo;
fecha ultimopago;
} cliente, *pc = &cliente;
La variable puntero pc se inicializa asignndole la direccin de comienzo de la variable estructura
cliente. Es decir, pc apuntar al cliente.
Si queremos acceder al nmero de cuenta del cliente, se puede escribir cualquiera de las siguientes
expresiones:
cliente.nro_cta; pc nro_cta;
(*pc).nro_cta;
La ltima expresin requiere parntesis porque el operador punto tiene mayor precedencia que el
operador indireccin (*).
Se puede acceder al mes del ltimo pago escribiendo cualquiera de las siguientes expresiones:
cliente.ultimopago.mes; pcultimopago.mes;
(*pc).ultimopago.mes;
Para acceder al tercer carcter del nombre del cliente, se puede usar cualquiera de las siguientes
expresiones:
cliente.nombre[2];
pc nombre[2];
(*pc).nombre[2];
*(cliente.nombre+2);
pc (nombre+2);
*((*pc).nombre+2);
Programa ejemplo de estructuras y punteros:
#include<stdio.h>

24

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

#include<conio.h>
main()
{ int n=3333;
char t=C;
float b=99.99;
typedef struct {
int dia;
int mes;
int anio;
} fecha;
struct cuenta {
int *nro_cta;
char *tipo_cta;
char *nombre;
float *saldo;
fecha ultimopago;
} cliente, *pc=&cliente;
cliente.nro_cta=&n;
cliente.tipo_cta=&t;
cliente.nombre=Ruiz;
cliente.saldo=&b;
cout<<*cliente.nro_cta<<*cliente.tipo_cta<<cliente.nombre<<*cliente.saldo;
cout<<**pcnro_cta<<*pctipo_cta<<pcnombre<<*pcsaldo;
getch();
}
ESTRUCTURAS Y FUNCIONES
Se puede pasar una estructura a una funcin de las dos maneras conocidas:
1) Paso por valor.El prototipo de funcin sera:
tipo_dato funcion(struct nombre_de_estructura);
La llamada a la funcin sera:
funcion(variable_de_estructura);
La cabecera de la funcin sera:
tipo_dato funcion(struct nombre_de_estructura variable_de_estructura)
/**Ejemplo**/
#include<stdio.h>
#include<conio.h>
struct trabajador{char nombre[20];
int edad;
char puesto[10];
};
void visualizar(struct trabajador);
main()
{
struct trabajador fijo;
cout<<Ingreso de datos:<<\n;
cout<<Nombre: ;
cin>> fijo.nombre;
cout<<\nEdad: ;
cin>>fijo.edad;
cout<<\n<<Puesto: );
cin>>fijo.puesto;
visualizar(fijo);

25

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

getch();
}
void visualizar(struct trabajador datos)
{
cout<<\nDatos de la estructura\n;
cout<<Nombre: << datos.nombre;
cout<<\nEdad: <<datos.edad;
cout<<\nPuesto << datos.puesto;
}
/** Ejemplo: Programa que pasa por valor una estructura completa a una funcin */
#include<stdio.h>
#include<conio.h>
struct tipo
{ char ape[30];
char nom[30];
long sueldo;
int hr_extras;
float precio_he;
};
void planilla(struct tipo m);
main()
{struct tipo q;
puts("Apellidos: "); gets(q.ape);
puts("Nombres: "); gets(q.nom) ;
puts("Sueldo: ");
cin>>q.sueldo;
puts("Horas Extras: ");
cin>>q.hr_extras;
puts("Precio Hora Extra: "); cin>>q.precio_he;
planilla(q);
}
void planilla(struct tipo m)
{float total;
total = m.sueldo + (m.hr_extras*m.precio_he);
cout<<\nEmpleado: <<m.ape<< <<m.nom<< Mensualidad: <<total;
getch();
}
2) Paso por referencia
El prototipo de funcin sera:
tipo_dato funcion(struct nombre_de_estructura *);
Despus de declarar una variable_estructura, la llamada a la funcin sera:
funcion(&variable_de_estructura);
La cabecera de la funcin sera:
tipo_dato funcion(struct nombre_de_estructura *variable_de_estructura)

/*Ejemplo: Paso de una estructura por referencia*/


#include<stdio.h>

26

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

#include<conio.h>
struct trabajador{
char nombre[20];
char apellidos[20];
int sueldo;
};
void visualizar(struct trabajador *);
main()
{
struct trabajador fijo;
cout<<Nombre: ;
cin>>fijo.nombre;
cout<<\nApellidos: ;
cin>>fijo.apellidos;
cout<<\nSueldo base: ;
cin>>fijo.sueldo;
visualizar(&fijo);
/*se referencia la direccin*/
getch();
}
void visualizar(struct trabajador *datos)
{
cout<<Nombre: <<datos->nombre;
cout<<\nApellidos: <<datos->apellidos;
cout<<\nSueldo base: <<datos->sueldo;
}
/** Ejemplo: Paso por referencia de una estructura completa a una funcin
#include<stdio.h>
#include<conio.h>
struct tipo
{ char ape[30];
char nom[30];
long sueldo;
int hr_extras;
float precio_he;
};
void planilla(struct tipo *m);
main()
{struct tipo q;
puts("Apellidos: "); gets(q.ape);
puts("Nombres: "); gets(q.nom) ;
puts("Sueldo: "); cin>>q.sueldo;
puts("Horas Extras: "); cin>>q.hr_extras;
puts("Precio Hora Extra: "); cin>>q.precio_he;
planilla(&q);
}
void planilla(struct tipo *m)
{float total;
total = m->sueldo + (m->hr_extras*m->precio_he);
cout<<"\nEmpleado: <<m->ape<< <<m->nom<< Mensualidad: "<<total;
getch();
}
En la funcin visualizar, el acceso a los campos de la variable de datos se realiza mediante el operador
fecha (), debido al uso de punteros.
/*Ejemplo: Prog. con funcin que devuelve valor y tiene como argumento una estructura.
#include<iostream.h>
#include<stdio.h>

27

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

#include<conio.h>
struct tipo
{ char ape[30];
char nom[30];
long sueldo;
int hr_extras;
float precio_he;
};
float planilla(struct tipo *m);
main()
{struct tipo q;
float pago;
puts("Apellidos: "); gets(q.ape);
puts("Nombres: "); gets(q.nom) ;
puts("Sueldo: "); cin>>q.sueldo;
puts("Horas Extras: "); cin>>q.hr_extras;
puts("Precio Hora Extra: "); cin>>q.precio_he;
pago=planilla(&q);
cout<<"\nEmpleado: "<<q.ape<<" "<<q.nom<<" Mensualidad: "<<pago;
getch();
}
float planilla(struct tipo *m)
{float total;
total = m->sueldo + (m->hr_extras*m->precio_he);
return total;
getch();
}
ARRAYS DE ESTRUCTURAS
Cuando los elementos de un array son de tipo estructura, el array recibe el nombre de array de
estructuras o array de registros. Esta es una construccin muy til y potente.
Ejemplo: Programa que lee una lista de alumnos y sus correspondientes notas al final de curso, dando
como resultado el porcentaje de alumnos aprobados y desaprobados.
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define NA 5

/*nmero mximo de alumnos*/

main()
{
struct ficha
{
char nombre[60];
float nota;
};
struct ficha alumnos[NA];
/*array de estructuras o registros*/
int n=0, i;
char *fin;
/*puntero al nombre leido*/
float aprobados = 0, desaprobados = 0;
cout<<"Finalizar la entrada de datos con Enter\n\n";
/*Entrada de datos*/
cout<<Nombre";
fin = gets(alumnos[n].nombre);
while(n<NA&&fin!=NULL)
{
cout<<"Nota:
";

28

Lenguajes de Programacin
Sotelo
cin>>alumnos[n++].nota;
fflush(stdin);
cout<<"Nombre ";
fin = gets(alumnos[n].nombre);

Ing. Csar Aldo Canelo

/*eliminar el retorno de carro*/

}
/*Escribir resultados*/
for(i=0; i<n; i++)
if(alumnos[i].nota>=10)
aprobados++;
else
desaprobados++;
cout<<"\nAprobados: "<<aprobados/n*100;
cout<<"\nDesaprobados: "<<desaprobados/n*100;
getch();
}
UNIONES
Una unin es similar a una estructura, sin embargo, los elementos que forman la unin comparten la
misma zona de memoria. Esto quiere decir que slo tiene validez en un momento dado uno de los
miembros de la unin.

Declaracin de la unin:
union nombre_union
{ tipodato_1 miembro_1;
tipodato_2 miembro_2;
...
tipodato_n miembro_n;
};
Cuando se define una unin, el compilador reserva en memoria espacio para el miembro de la unin que
ms espacio de memoria ocupa.
Ejemplo: Programa que define una unin con los siguientes miembros:
int entero;
double real;
char string[16];
#include <stdio.h>
#include <string.h>
#include <conio.h>
union numero {
int entero;
double real;
char string[16];
};
main()
{union numero dato;
cout<<El tamao de un int es: <<sizeof(int);
cout<<\nEl tamao de un double es: <<sizeof(double);
cout<<\nEl tamao de un char[16] es: <<sizeof(char[16]);
cout<<\nEl tamao de la unin es: <<sizeof(union numero);
dato.entero = 8;
cout<<\nEl valor entero de la union es: <<dato.entero;

29

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

dato.real = 8.24;
cout<<\nEl valor real de la union es: << dato.real;
strcpy(dato.string, PROGRAMA);
cout<<\nEl valor string de la union es: << dato.string;
getch();
}
Como se puede observar, el tamao de la unin coincide con el tamao del miembro ms grande de la
estructura, que en este caso es el array de 16 caracteres. Cuando se utiliza el miembro entero de la unin,
se accede a la unin y se interpreta el dato almacenado en la misma con un valor de tipo int. Sin
embargo, cuando se utiliza el miembro real, el valor almacenado en la unin se interpreta como un valor
de tipo double.

/* Ejemplo uso de unin.


#include <stdio.h>
#include <conio.h>
main()
{
union id {
char color;
int talla;
};
struct ropa{
char fabricante[20];
float costo;
union id descripcion;
} camisa;
cout<<"La union se almacena en: "<<sizeof( union id)<<bytes;
camisa.descripcion.color='W';
cout<<"Color: "<<camisa.descripcion.color<< Talla: << camisa.descripcion.talla;
camisa.descripcion.talla=15;
cout<<"Color: <<camisa.descripcion.color<< Talla: <<camisa.descripcion.talla;
getch();
}
ARCHIVOS
Los archivos o ficheros son estructuras de datos almacenados en memoria secundaria, por lo
tanto permiten almacenar informacin de modo permanente, para ser accedida o modificada cuando sea
necesario.
En C existe un conjunto extenso de funciones de biblioteca para crear y procesar archivos de
datos. A diferencia de otros lenguajes de programacin, en C no se distinguen entre archivos secuenciales
y acceso directo.
El formato de declaracin de un archivo es:
FILE *variable_archivo;
Esta declaracin establece un rea de buffer donde se almacena temporalmente la informacin
mientras se est transfiriendo entre la memoria de la computadora y el archivo de datos. FILE (en
mayscula) es un tipo especial de estructura que establece el rea de buffer y variable_archivo es la
variable puntero que indica el comienzo de sta rea.
En otros lenguajes la declaracin del archivo determina el tipo de datos que se van a almacenar
en l. En C, todos los ficheros almacenan bytes, y cuando se realiza la apertura y la escritura es cuando se
decide cmo y qu se almacena en el mismo. Durante la declaracin del archivo no se hace ninguna
distincin sobre el tipo mismo.

30

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

Un archivo de datos debe ser abierto antes de ser creado o procesado. En la operacin de
apertura se puede decidir si el archivo va a ser de texto o binario. Los primeros sirven para almacenar
caracteres, los segundos para almacenar cualquier tipo de datos. Si deseamos leer un archivo como el
autoexec.bat utilizaremos un archivo de texto, si queremos leer y escribir registros (struct) usaremos un
archivo binario.
CAMBIO DE NOMBRE Y BORRADO DE ARCHIVOS
Se puede cambiar el nombre de un archivo, de forma que se pueda acceder al mismo mediante
un nombre nuevo y que ya no est accesible mediante su nombre antiguo. El cambio de nombre de un
archivo se lleva a cabo en C mediante la funcin:
resultado = rename(nombre_antiguo, nombre_nuevo);
donde resultado es un nmero entero igual a 0 si el archivo se renombro bien y distinto de cero si hubo
algn error.
El borrado de un archivo se lleva a cabo mediante la funcin:
resultado = remove(nombre_archivo);
donde resultado es un nmero entero igual a 0 si el archivo se borr bien y distinto de cero si hubo algn
error
APERTURA Y CIERRE DE ARCHIVOS
Antes de usar un archivo es necesario realizar una operacin de apertura del mismo,
posteriormente, si se desea almacenar datos en l hay que realizar una operacin de escritura. Cuando ya
no se quiere utilizar el archivo se realiza una operacin de cierre del mismo para liberar parte de la
memoria principal que pueda estar ocupando (aunque el archivo en s est almacenado en memoria
secundaria, mientras est abierto ocupa tambin memoria principal).
La instruccin para abrir un archivo es:
file *variable_archivo;
variable_archivo=fopen(nombre_archivo,modo);
La funcin fopen devuelve un puntero a un archivo que se asigna a una variable de tipo archivo.
Si existe algn tipo de error al realizar la operacin, por ejemplo, que se desee abrir para leerlo y ste no
exista, devuelve NULL.
El nombre_archivo ser una cadena de caracteres que contenga el nombre (y en su caso la ruta de
acceso) del archivo tal y como aparece para el sistema operativo.
El modo es una cadena de caracteres que indica el tipo de archivo (texto o binario) y el uso que
se va a hacer de l, lectura, escritura, aadir datos al final, etc. Los modos disponibles son:
r : Abre un archivo para lectura. Si el archivo no existe devuelve error.
w : Abre un archivo para escritura. Si no existe, se crea, si el archivo existe, se destruye y se crea uno
nuevo en su lugar.
a : Abre un archivo para aadir datos al final del mismo. Si no existe se crea.
b : El archivo es de tipo binario.
t : El archivo es de tipo texto. Si no se pone ni b ni t, el archivo es de texto.
Los modos anteriores se combinan para conseguir abrir el archivo en el modo adecuado. Por
ejemplo, para abrir un archivo ya existente para lectura y escritura el modo ser rb+; si el archivo no
existe, o an existiendo se desea crear, el modo ser wb+. Si deseamos aadir datos al final de un
archivo de texto bastar con poner a, etc.
Un programa en C que procesa archivos, contiene las siguientes sentencias:

31

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

#include<stdio.h>
FILE *fpt;
fpt = fopen(muestra.dat, w);
...
fclose(fpt);
La primera sentencia define un puntero llamado fpt que apuntar a la estructura del tipo FILE,
indicando el principio del rea de buffer del archivo. FILE est definido en stdio.h.
La segunda sentencia abre un archivo llamado muestra.dat como un archivo de solo escritura.
Adems la funcin fopen retorna un puntero al principio del rea de buffer y lo asigna a la variable
puntero fpt. As fpt apunta al rea de buffer asociada con el archivo de datos muestra.dat Todas las
subsiguientes sentencias de proceso (que no se muestran) accedern al archivo mediante el puntero fpt en
vez de mediante el nombre del archivo.
Finalmente, la ltima sentencia cierra el archivo de datos. Ntese que el argumento es la variable
puntero fpt, no el nombre muestra.dat.
El valor retornado por la funcin fopen puede usarse para generar un mensaje de error si el
archivo de datos no puede abrirse, como en el siguiente ejemplo:
#include<stdio.h>
#include<conio.h>
#define NULL 0
main()
{
FILE *fpt;
fpt = fopen(G:\muestra.dat, r+);
if(fpt == NULL)
cout<<\nError No se puede abrir el archivo indicado\n;
else{

}
fclose(fpt);
getch();
}
Este programa trata de abrir para lectura y escritura un archivo de datos previamente existente llamado
muestra.dat. Se generar un mensaje de error si no se encuentra este archivo. En caso contrario, el archivo
de datos se abrir y se procesar.
Las sentencias fopen e if se combinan frecuentemente como sigue:
if((fpt = fopen(muestra.dat,r+)) == NULL)
printf(\nERROR . . . ! No se puede abrir el archivo indicado);
Cualquiera de los dos mtodos es aceptable.
Ejemplo:
El modo r abre un archivo para lectura. Verifica si el archivo Ventas 2013 existe. Si el archivo no existe
devuelve error.
#include<stdio.h>
#include<conio.h>
#include <iostream.h>
main()
{
FILE *pf;
pf=fopen(G:\ventas2013.txt,r);
if(pf==NULL)
cout<<Imposible abrir el archivo Ventas 2013\n;

32

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

else
cout<<Archivo Ventas 2013 existe\n;
fclose(pf);
}
Ejemplo:
El modo w abre un archivo para escritura. Si el archivo no existe, se crea. Si el archivo ya existe, se
destruye y se crea uno nuevo.
#include<stdio.h>
#include<conio.h>
int main(void)
{
FILE *pf;
pf=fopen(Ventas2013.txt,w);
if(pf==NULL)
printf(Imposible abrir el archivo Ventas 2013\n);
else
printf(Archivo Ventas 2013 existe \n);
fclose(pf);
}
CREACION DE UN ARCHIVO
Un archivo debe cerrarse antes de ser procesado. Un archivo secuencial de datos puede crearse
de dos formas distintas. Una es crear el archivo directamente, usando un procesador de texto o un editor.
La otra es escribir un programa que introduzca informacin en la computadora y la escriba en un archivo,
estos son los denominados archivos sin formato, que slo pueden crearse con programas especialmente
escritos para tal fin.
Ejemplo:
Programa que lee una lnea en minsculas y la escribe en maysculas. En este ejemplo se lee el texto
carcter a carcter usando la funcin getchar y despus se escribe en un archivo usando putc. La funcin
de biblioteca toupper realiza la conversin de minscula a mayscula.
/* Leer una lnea de texto en minsculas y almacenarla en maysculas en un archivo de datos*/

#include<stdio.h>
#include<ctype.h>
#include<conio.h>
#include <iostream.h>
main()
{ FILE *fpt;
/*Define un puntero al tipo de estructura predefinida FILE*/
char c;
fpt=fopen(Muestra.dat,w);
do
putc(toupper(c=getchar()),fpt);
while(c!=\n);
/*cerrar el archivo de datos*/
fclose(fpt);
getch();
}

33

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

En este programa se abre el archivo muestra.dat slo para escritura. A continuacin, el bucle do
while lee una serie de caracteres desde el teclado y escribe las maysculas equivalentes en el archivo. La
funcin putc se usa para escribir cada carcter en el archivo. La funcin putc requiere que el puntero del
archivo secuencial fpt sea especificado como argumento. El bucle contina hasta que se introduce un
carcter de nueva lnea (\n) desde el teclado. Cuando se detecta el carcter de nueva lnea, se sale del
bucle y se cierra el archivo.
Un archivo creado de esta manera puede ser visualizado de distintas formas. Por ejemplo, el
archivo puede ser visualizado directamente, usando una orden del sistema operativo tal como type.
Tambin se puede visualizar utilizando un editor o un procesador de texto.
Otra posibilidad es escribir un programa que lea el contenido del archivo y lo muestre.
El siguiente programa lee una lnea de texto de un archivo de datos, carcter a carcter, y
muestra el texto en la pantalla. El programa hace uso de las funciones de biblioteca getc para leer los
caracteres individuales del archivo de datos y putchar para mostrar los datos en la pantalla. Este programa
complementa el ejemplo anterior.
#include<stdio.h>
#include<ctype.h>
#include<conio.h>
#define NULL 0
main()
{
FILE *fpt;
char c;
if((fpt=fopen(Muestra.dat,r))==NULL)
cout<<\n ERROR . . . No se puede abrir el archivo indicado\n;

else

/*Leer y mostrar cada carcter del archivo*/


do

putchar(c=getc(fpt));
while(c!=\n);
fclose(fpt);
getch();
}

/*cerrar el archivo de datos*/

La lgica es la misma que la del programa anterior. En este programa se abre el archivo muestra.dat solo
para lectura. Ntese tambin que la funcin getc requiere que el puntero al archivo secuencial fpt sea
especificado como argumento.
LECTURA Y ESCRITURA EN ARCHIVOS
Los archivos de datos que contienen slo cadenas de caracteres pueden crearse y leerse ms
fcilmente con programas que utilizan funciones de biblioteca especialmente orientadas para cadenas.
Algunas funciones de este tipo comnmente usadas son gets, puts, fgets y fputs. Las funciones gets y puts
leen o escriben cadenas a o desde los perifricos estndar de salida, mientras que fgets y fputs
intercambian cadenas con archivos.
Muchos archivos de datos contienen estructuras de datos ms complicadas, como registros que
incluyen combinaciones de informacin, caracteres y nmeros. Tales archivos se pueden procesar usando
las funciones de biblioteca fscanf y fprintf, que son anlogas a las funciones conocidas scanf y printf. As
la funcin fscanf permite leer un dato con formato desde un archivo de datos asociado con un archivo
secuencial, y fprintf permite escribir datos con formato en el archivo de datos. Las especificaciones de
formato son las mismas que se usan con las funciones printf y scanf.

34

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

Si deseamos leer datos de un archivo, utilizamos la instruccin fscanf en la forma:


fscanf(variable_archivo, cadena de control, direcciones de variables);
Lo nico diferente es el parmetro adicional variable_archivo.
Si deseamos leer datos de un archivo y desconocemos el nmero de datos que ste contiene, necesitamos
verificar si hemos alcanzado el fin de archivo, en ese caso se utiliza la funcin feof en la forma:
feof(variable_archivo);
Esta funcin devuelve 0 si hemos alcanzado el fin del archivo y <> 0 en caso contrario.
Para utilizar las instrucciones de manejo de archivos, es necesario incluir la librera <stdio.h>
Ejemplo: Prog de lectura de enteros desde el teclado y grabado en un archivo.
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include <ctype.h>
#define MAX_CAR_ARCHIVO 81
FILE *fd;
int n=0;
int si_no(void);
main()
{ char narch[MAX_CAR_ARCHIVO];
int num, i;
clrscr();
cout<<"Programa lee enteros, los almacena y luego los muestra \n\n";
do{
cout<<"Archivo de escritura, ingrese nombre de archivo: ";
cin>>narch;
//scanf("%s",narch);
}while((fd=fopen(narch,"w"))==NULL);
do{
cout<<"\nNumero: ";
cin>>num;
//scanf("%d",&num);
fprintf(fd,"%d ", num);
n++ ;
cout<<"Otro numero? (s/n): ";
}while(si_no());
fclose(fd);
clrscr();
do{
cout<<"\nArchivo de lectura: ";
cin>>narch;
//scanf("%s",narch);
}while((fd=fopen(narch,"r"))==NULL);
for(i=0;i<n;i++)
{ fscanf(fd,"%d",&num);
cout<<num;
}
fclose(fd);
getch();
}
int si_no()
{ char c;

35

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

do{
c=getch();
c=toupper(c);
}while(!((c=='S')||(c=='N')));
return((c=='S')?1:0);
}
ARCHIVOS DE ACCESO DIRECTO (RANDOM)
En los archivos secuenciales el acceso a cada registro del archivo es uno a uno. As, si se quisiera
acceder al registro 2044 de un archivo, tendramos que acceder previamente a 2043 registros antes de
llegar al registro que nos interesa.
Para tener acceso directo en un archivo, se requiere cambiar a voluntad y en cualquier momento
la posicin actual del puntero del archivo. Este tipo de acceso se conoce como acceso aleatorio. La
funcin que se encarga de cambiar la posicin del puntero de archivo es la funcin fseek, en la forma:
fseek(FILE *variable_archivo, desplazamiento, int punto_partida);
donde:
desplazamiento: longitud del desplazamiento (en bytes) desde el origen a movilizar el puntero de
archivo.
punto_partida: constante que indica la posicin a partir de la cual se desplazar el puntero de archivo.
Puede tomar alguno de los siguientes valores:
SEEK_SET
SEEK_CUR
SEEK_END

: indica el inicio del archivo.


: indica la posicin actual del archivo.
: indica el fin de archivo.

Ejemplo: Prog con archivo que calcula los cubos del 1 al 10 y permite la consulta.
#include<stdio.h>
#include<conio.h>
FILE *fd;
char narch[81];
main()
{ int i, error, fl;
float x;
cout<<"Programa que almacena cubos de los 10 primeros nros en un archivo\n";
cout<<"\nArchivo de salida: ";
cin>>narch;
//scanf("%s", narch);
fd=fopen(narch, "w");
for(i=0; i<11; i++)
{ x=i*i*i;
fwrite(&x, sizeof(float), 1, fd);
};
fclose(fd);
clrscr();
cout<<"Los valores han sido calculados. Ahora se puede consultar\n\n";
fd=fopen(narch, "r+");
do{
cout<<"Digite un numero ";
cin>>i;
//scanf("%d", &i);
error=fseek(fd, sizeof(float)*i, SEEK_SET);
if((fl=fread(&x, sizeof(float), 1, fd))>0)
cout<<"El cubo de <<i<< es <<x;
else
cout<<"Argumento fuera de rango\n";
getch();

36

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

}while(fl);
}

// Programa que crea un archivo, escribe un entero,


// luego accede al archivo y muestra su contenido.
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
main()
{FILE *descriptor;
int num=1000;
descriptor=fopen("ejemplo.txt","w");
if(descriptor==NULL)
cout<<"ERROR ";
else
{fprintf(descriptor,"%d",num);
fclose(descriptor);
}
descriptor=fopen("ejemplo.txt","r+");
fscanf(descriptor,"%d",&num);
cout<< << num;
getch();
}
Prg. que calcula los cuadrados de n nmeros, los graba en un archivo y luego los muestra.
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include <iostream.h>
#define MAX_ARCHIVO 100
int si_no(void);
main()
//....................DEFINICION DEL ARCHIVO..................
{ FILE *fd;
char narch[MAX_ARCHIVO];
int num, i, n=0, k;
clrscr();
cout<<"Programa lee enteros, los almacena y luego muestra sus cuadrados: \n;
do{
cout<<"Archivo de escritura, ingrese nombre de archivo: ";
cin>>narch;
}while((fd=fopen(narch,"w"))==NULL);
//....................GUARDAR DATOS EN EL ARCHIVO..................
do{
cout<<"\nNumero: ";
cin>>num;
fprintf(fd,"%d ", num);
n++ ;
cout<<"Otro numero? (s/n): ";
}while(si_no());
fclose(fd);
clrscr();
do{

37

Lenguajes de Programacin
Sotelo

Ing. Csar Aldo Canelo

cout<<"\nArchivo de lectura: ";


cin>>narch;
//....................SALIDA DE DATOS..................
}while((fd=fopen(narch,"r"))==NULL);
for(i=0;i<n;i++)
{ fscanf(fd,"%d",&num);
k=num*num;
cout<<"\nEl cuadrado del numero <<num<< es <<k;
}
fclose(fd);
getch();
}
int si_no()
{ char c;
do{
c=getch();
c=toupper(c);
}while(!((c=='S')||(c=='N')));
return((c=='S')?1:0);
}

38

También podría gustarte