Sei sulla pagina 1di 160

Lenguaje de

Programacin
C
Generalidades
Lenguajes de Programacin
Alto Nivel
Estructurados
Fortran
Basic
C
Pascal
Orientados a Objetos
Java
C++
Bajo Nivel
Orgenes del lenguaje C
Dennis Ritchie (Laboratorios Bell) en
1972, cuando trabajaba en el
diseo del sistema operativo UNIX,
como evolucin del anterior
lenguaje B.
El C se cre como herramienta
para programadores, en
consecuencia su principal objetivo
es ser un lenguaje til.
1
El desarrollo de C fue el resultado del deseo de los programadores de
jugar con Space Travel en el GE 635.
Thompson y Ritchie no tenan suficiente control sobre la nave para
evitar colisiones con los asteroides y lo intentaron portar para PDP-7
Orgenes del lenguaje C (2)
Evolucin del lenguaje C (2)
Caractersticas
Se ha usado en contextos tan dispares
como el desarrollo de sistemas
operativos, procesadores de texto,
grficos, bases de datos,
compiladores de otros lenguajes, etc.
P
o
t
e
n
c
i
a

y

f
l
e
x
i
b
i
l
i
d
a
d
:

Existe una gran variedad de
compiladores, libreras, herramientas de
apoyo a la programacin, etc.
Es el lenguaje predominante en el
entorno UNIX.
P
o
p
u
l
a
r
i
d
a
d
:

Caractersticas
Es un lenguaje compilado.
PROGRAMA EJECUTABLE: es el programa objeto ms las
libreras del C, se graba con la extensin .EXE o .OUT.
CDIGO OBJETO: es el programa fuente pero traducido a
lenguaje mquina (sucesin de ceros y unos), se graba
con la extensin .O
CDIGO FUENTE: Archivo de texto que contiene las
instrucciones , se graba con la extensin .C
Estructura General de un programa
INICIO
FIN
Declaracin de variables
Acciones del Algoritmo
Directivas de Preprocesamiento
Plantilla bsica de un programa en C
VARIABLES
Ejemplo: definicin de variables
int num_x = -9, num_y, num_z;
float c = -9, d, e = 1.5e-15;
double f = 4.03e19, g =.03;
char grado = A, caracter = 64;
Modificadores del tamao de las
variables
Modificador long: Se utiliza para incrementar la cantidad de Bits
que puede utilizar una variable tipo int o tipo double
int x; //x es una variable tipo entera y ocupara 16 o 32 bits
long int x; // x es una variable tipo entera y ocupara 32 o 64 bits
double y; // y es una variable tipo real y ocupara 64 bits
long double y; // y es una variable tipo real y ocupara 80 bits
Modificador short: Se utiliza para decrementar la cantidad de
Bits que puede utilizar una variable tipo int
int x; //x es una variable tipo entera
short int x; // x es una variable tipo entera y ocupara 16 bits
Modificadores de signo de las
variable
Modificador signed: Define que una variable manejar tanto
valores positivos como negativos, se utiliza con variables tipo
char, int, long, short. Cuando se define una variable, por
defecto es signed
int x; //x es una variable tipo entera para valores positivos y negativos
signed int x; // x es una variable tipo entera para valores positivos y negativos
short int y; // y es una variable para valores negativas y positivas
signed short int y; // y es una variable para valores negativas y positivas
unsigned int x; //x es una variable tipo entera solo manejar valores positivos
Modificador unsigned: Define que una variable manejar solo
valores positivos, se utiliza con variables tipo char, int, long,
short.
Resumen declaracin de variables
tipo nom_var1,nom_var2, nom_var3 = valor_inicial, nom_varN;
Tipo Ejemplo Tamao en
bytes
Rango
char C 1 0 a 255
unsigned short int -15 2 0 a 65535
unsigned int 1024 4 0 a 4,294,967,295
float 10.5 4 1.18x10-38 a 3.4x1038
Precisin cientfica ( 7-dgitos)
double 0.00045 8 2.23x10
-308
a 1.79x10
308
Precisin cientfica 15-dgitos
long double 1e-8 10 3.37x10
-4932
a 1.18x10
4932
Precisin cientfica 15-dgitos
Constantes
Constantes enteras: Sucesin de dgitos precedidas por +
dentro de un rango determinado (-345, 234, etc)
Constantes reales: Nmeros reales (82.347, .63, 6e+4)
Constantes carcter (char): Carcter del cdigo ASCII
encerrado entre apstrofes (a, B)
Constantes cadena: Hola, Informtica I, Esto es una
cadena de caracteres. En memoria, las cadenas se
representan por una serie de caracteres ASCII ms un 0 o
nulo que es definido en C mediante la constante NULL
Constantes
Definicin de constantes
Constantes definidas (simblicas)
#define PI 3.1415929
Constantes declaradas const
const int c = 30;
Una constante es un valor que no puede cambiar su
valor a lo largo de la ejecucin de un programa
Operadores
OPERACIN OPERADOR EJEMPLO SIGNIFICADO
Mdulo %= g %=9 g = g % 9
Preincremento ++ ++a
1. Se incrementa
2. Se utiliza el valor
Predecremento -- --a
1. Se decrementa
2. Se utiliza el valor
Postincremento ++ b++
1. Se utiliza el valor
2. Se incrementa
Postdecremento -- b--
1. Se utiliza el valor
2. Se decrementa
Expresiones y operadores
Relacionales
Operadores Relacionales
Sintaxis:
operando_1 operador_relacional operando_2
Operadores
OPERACIN OPERADOR EJEMPLO SIGNIFICADO
Igualdad == x == y x es igual a y ?
Diferente != x != y x no es igual a y?
Menor < x < y x es menor que y ?
Mayor > x > y x es mayor que y?
Menor Igual <= x <= y x es menor o igual que y?
Mayor Igual >= x >= y x es mayor o igual que y?
Lgicos
Operadores Lgicos
OPERACIN OPERADOR EJEMPLO SIGNIFICADO
Negacin ! !m No m (inverso de m)
Y && m && n m Y n
O || m || n m n
DIRECTIVAS DEL
PREPROCESADOR
Directivas del preprocesador
El preprocesador consta de directivas que son
instrucciones al compilador
Comienzan con el smbolo (#)
No son instrucciones de lenguaje C
#include
#define
#include
Directivas
#include Indica al preprocesador que lea un archivo
fuente (de cabecera o de inclusin).
Estos archivos se suelen llamar "de cabecera.
#include <libreriaSistema.h>
#include libreriaUsuario.h
Libreras de sistema
Directivas
Librera Descripcion
assert.h macros para el diagnstico dentro de los programas
ctype.h
funciones para comprobacin de tipos y transformacin de
caracteres
errno.h macros usadas para informar de errores
limits.h macros que definen constantes para el tamao de tipo enteros
float.h macros que definen constantes para el tamao de tipo flotante
math.h macros y varias funciones matemticas
stddef.h
tipos y macros que tambin estn definidas en otras libreras, como
size_t
stdio.h tipos, macros y funciones para la realizacin de tareas de E/S
stdlib.h
tipos, macros y funciones para la conversin numrica, generacin
de nmeros aleatorios, bsquedas y ordenacin, gestin de
memoria y tareas similares
string.h
tipos, macros y funciones para la manipulacin de cadenas de
caracteres
time.h
tipos, macros y funciones para la manipulacin de informacin
sobre fechas y horas
#define
Directivas
La directiva #define define una macro.
Las macros proporcionan un mecanismo de
reemplazo directo, alias. Se utilizan para definir constantes
o mensajes que se utilizarn mucho en el programa.
#define PI 3.1416
#define mensaje "Bienvenidos"
ENTRADAS Y
SALIDAS
ESTANDARES
SALIDA DE INFORMACIN
printf("cadena De Caracteres y formatos",variables);
Entrada
Descripcin: Permite mostrar en pantalla un
texto (cadena), y variables con formato.
Sintaxis:
Cadena de control: Contiene los datos y la forma de
mostrarlos. Es lo que va entre comillas, los formatos los
identificamos porque van precedidos de un %.
La cadena de Control es todo el mensaje a mostrar y en el
lugar en donde se vaya a mostrar el valor de una variable
se coloca solo el formato de la variable.
Datos (dato1, dato2,,datoN): Son los nombres de las
Variables que se referenciaron en la cadena de control.
printf
Entrada
printf("cadena, control Y formatos",dato1,,datoN);
Entrada
printf
printf("Var1 es Var2 es Var N es ",dato1,dato2,datoN);
Especificadores
printf("El estudiante %s tiene La nota1 en %d y la nota 2 en %d"
,nombre,not1,not2);
Especificadores de conversin con printf()
%c Carcter sencillo
%d Entero decimal con signo (int)
%e Valor flotante con signo en notacin cientfica (E)
%f Valor flotante con signo (float)
%g
Valor flotante con signo en notacin %e o %f,
dependiendo de la representacin mas corta
%i Entero decimal sin signo (int)
%o Entero octal (en base 8) sin signo (int)
%s Cadena de caracteres
%u Decimal entero sin signo (int)
%x Entero hexadecimal (base 16) sin signo
Entrada
printf
Directivas
Directivas
#include <stdio.h>
#define PI 3.1416
int main(void){
int a, b, c = 0;
printf(Digite el primer numero: );
scanf(%d,&a);
printf(Digite el segundo numero: );
scanf(%d,&b);
c = a + b + PI;
printf(El resultado es: %d\n,c);
return 0;
}
Directivas(uso de directivas
del preprocesador):
Libreras y MACROS
Son las lneas que
comienzan por el
carcter #
Entrada de informacin
scanf("%formato1%formato2,", &var1,&var2,);
Entrada
Descripcin: Permite ingresar los datos
mediante el teclado.
Sintaxis:
formatos: Indican que tipo de datos deben ser
ingresados por el usuario.
&: indica la direccin de la variable. Siempre debe ir
(excepto con cadena de caracteres y matrices)
Datos (dato1, dato2,,datoN): Nombre de las
Variables.
scanf
Entrada
scanf("%formato1%formato2,", &var1,&var2,);
#include <stdio.h>
int main (void)
{
char nombre[10];
int edad;
printf(Ingrese su nombre: ");
scanf("%s",nombre);
printf(Ingrese su edad: ");
scanf("%d",&edad);
printf(Su nombre es: %s y tienes %d aos",nombre,edad);
return 0;
}
ESTRUCTURAS DE
CONTROL
Introduccin
Las estructuras de control, son aquellas que
permiten controlar el flujo de ejecucin de
un programa
Estructuras de Control
Tres tipos de Estructuras:
Secuencial
De seleccin
Cclicas o de repeticin
Sentencia
If: anidados
if (condicion1) {
Instrucciones1;
}
else if (condicion2){
Instrucciones2;
}
.
.
.
else if (condicionN){
InstruccionesN;
}
else{
InstruccionesDefecto;
}
Sentencia switch
Seleccin de una entre mltiples alternativas.
la seleccin se basa en el valor de una variable
simple o de una expresin simple denominada
expresin de control o selector.
El valor de esta expresin puede ser de tipo int
o char, pero no de tipo float ni double
Sintaxis
switch (selector)
{
case val1:
Instrucciones1;
break;
case val2:
Instrucciones2;
break;

case valN:
InstruccionesN;
break;
.
default:
InstruccionesDefault;
}
Sentencia switch
Es una alternativa para los IF anidados. Cuando se quiere
evaluar una variable para mas de dos valores(No recomendado
para intervalos).
switch Variable
{
case Val1:
Instrucciones1
break;
case Val2:
Instrucciones2
break;
.
case ValN:
InstruccionesN
break;
default:
InstruccionesDefault
}
if (condicion1)
{
Instrucciones1
}
else if (condicion2)
{
Instrucciones2
}
..
else if (condicionN)
{
InstruccionesN
}
else
{
InstruccionesE
}
Ejemplo
if ((car == 'a') || (car == 'A'))
printf ( "%c es una vocal\n",car) ;
else if ((car == 'e') || (car == 'E'))
printf ( "%c es una vocal\n",car);
else if ((car == 'i') || (car == '1'))
printf ( "%c es una vocal\n",car
else if ((car == 'o') || (car == 'O'))
printf ( "%c es una vocal\n", car) ;
else if ((car == 'u') || (car == 'U'))
printf ( "%c es una vocal\n", car) ;
else
printf ( "%c no es una vocal\n",car);
Ejemplo
switch (car)
{
case a: case A:
case e: case E:
case i: case I:
case o: case O:
case u: case U:
printf (La letra %c es una vocal\n,car);
break;
default:
printf(La letra %c NO es una vocal\n,car);
}
if vs switch
Cualquier cdigo con estructura switch se
puede reemplazar con una estructura if y
sus variantes (Lo contrario a veces es
impractico).
La ventaja del Switch es que es ms claro.
til para la implementacin de Menus.
SENTENCIA DO
Comparacin while, for
for( VC; condicin; INC)
{
instrucciones;
}
InicializacinVC;
while (condicin)
{
InstruccionesX;
INC;
}
while
for
Ejemplo2
Realizar un programa que pida que se ingresen
notas de los estudiantes, y que cuando haya una
nota menor que 3, muestre un mensaje que diga
El estudiante perdi. Realice esta operacin
hasta que el usuario d la orden de terminar
salir=1;
while (salir==1) {
printf("Ingrese la nota del estudiante:");
scanf("%f",&nota);
if (nota < MIN_NOTA){
printf("El estudiante perdio\n");
}
printf("Ingrese 1 para continuar, 0 para salir: ");
scanf("%d",&salir);
}
SENTENCIA WHILE Y FOR
Bucles infinitos
Aplicaciones en los que el nmero de repeticiones
no se pueden determinar por anticipado. Interesa
que comiencen pero eventualmente que no
terminen.
for ( ; ; )
{
Instrucciones;
if(condicinTerminacin)
break;
}
while(1)
{
Instrucciones;
if (condicinTerminacin)
break;
}
SENTENCIA DO
DO - WHILE
do {
Instrucciones;
} while (expresin);
INTRUCCIONES ESPECIALES
Instruccin break
La sentencia break es utilizada como
mtodo de terminacin TEMPRANA del
bucle (Estructura de control) a la que
pertenece.
Si mientras se ejecuta el cuerpo del bucle,
se encuentra con la instruccin break, se
terminar inmediatamente el ciclo.
INTRUCCIONES ESPECIALES
Ejemplo
Realizar un programa que pida que se ingresen
notas de N estudiantes, y que cuando halla una
nota menor que 3, muestre un mensaje que diga
Hay alguien que perdi, y termine el programa
inmediatamente.
#include <stdio.h>
#define NOTA_LIM 3
int main(void){
int n,i;
float nota;
printf(Programa que halla si un estudiante perdi la materia\n);
printf (Por favor ingrese el numero de estudiantes\n);
scanf(%d,&n);
for(i=1;i<=n;i++){
printf(\n Por favor ingrese la nota numero %d :,i);
scanf(%f,&nota);
if(nota<NOTA_LIM){
printf(Hay un estudiante que perdi\n);
printf(El programa terminar);
break;
}
}
printf(Fin del programa);
return 0;
}
INTRUCCIONES ESPECIALES
Instruccin continue
La sentencia continue hace que la ejecucin de
un bucle vuelva inmediatamente a la cabecera
del bucle.
Ejplo: Programa que cuenta hasta 10, se
muestra el valor del conteo actual solo si se le
ingresa el carcter m
INTRUCCIONES ESPECIALES
Instruccin continue
#include <stdio.h>
#define MAX_CONT 10
#define CAR_ESPECIAL m
int main(void)
{
int i, equiv=0;
int mostrar;
for (i = 1; i <= MAX_CONT; i++) {
printf("Ingrese 0 si quiere ver el conteo:");
scanf("%d", &mostrar);
if (mostrar!= CAR_ESPECIAL){
continue;
}
printf("El valor del conteo es: %d\n", i);
}
return 0;
}
VC CONDICIN
EJECUTA
msj
read
No se ingres m
Volver al ciclo
INC
Se ingres m
msj conteo=2
1<=10 ?
i=i+1
i=1+1
i=2 2<=10 ?

11<=10 ?
Fin del ciclo
FUNCIONES
Funciones
Conjunto de instrucciones que realizan una accin
especifica y que tienen un nombre que las
representa.
Una funcin sirve para facilitar la programacin,
ahorrar espacio, tiempo y para facilitar la portabilidad
de los programas.
53
printf(la vble es: %d, vble);
potencia=pow(base,exp);
raiz=sqrt(vble);
INTROD. FUNCIONES
Generalidades
TODO programa en C tiene al menos una funcin:
PROGRAMA
main()
F1 F2 F3
F4 F5
PROGRAMA
main()
Desde la funcion main() se puede estructurar todo el programa por medio
de llamados a las Funciones
54
int main(void){
.
}
FUNCIONES EN C
__
__
__
return
int Main()
{
int a, b;
Func1();
--------
--------
Func2();
--------
--------
return 0;
}
----
Func3()
----
return
__
__
__
return
Func3
Func1
Func2
Programa
55
INTRODUCCIN FUNCIONES
Llamados a Funciones
Creacion Func.
Creacin de Funciones
En el momento de crear mi_funcin debo
seguir tres pasos fundamentales:
56
Declaracin del Prototipo de la funcin
Consiste en informarle al Compilador el tipo de datos que se le enviarn
a la funcin y el tipo de datos que ella retornar al programa invocante.
Se hace de la siguiente forma:
tipoDatoRetorno nomb_funcion(TipoDatosParametros);
El tipo de dato de retorno es UN TIPO de dato de los que maneja C (int, float, char,..).
Si la funcin no retorna nada, en ese lugar se utiliza la palabra reservada void.
Nombre de la funcion es el nombre que le damos al conjunto de instrucciones que ella
representa.
Los tipos de dato de los parametros son todos aquellos tipos de los parametros que
la funcin necesita para su funcionamiento. Si la funcin no necesita parametros se
escribe la palabra void.
57
Convencionalmente se escribe al principio del programa
Creacion Func.
tipoDatoRetorno nomb_funcion(TipoDatosParametros);
Nota: En el prototipo no es necesario indicar el nombre de las variables. Slo el
tipo de dato.
Si se indican variables el compilador no las toma en cuenta
58
Ejemplos:
float mi_funcion(int i, double j );
double otra_funcion(void) ;
otra_mas(long p) ;
void la_ultima(long double z, char y, unsigned long w) ;
float suma(float num1, float num2);
Ejemplo prototipo de funcion suma de dos numeros
flotantes
Creacion Func.
Declaracin del Prototipo de la funcin(2)
Definicin de la funcin
La definicin de la funcin consiste en expresar COMO la funcion va a realizar su tarea.
float suma(float num1, float num2){
float res;
res = num1 + num2;
return res;
}
Cuerpo de la
funcin
Nombre de la funcin
Argumentos a la
funcin.
Variable retornada por la funcin
Tipo de dato
retornado por la
funcin
Compare esta funcion con la funcion main() !!!!
Se comienza poniendo el prototipo de la funcin y entre { } se expresan las
instrucciones de la funcion
En el campo de los parametros, se estan declarando variables.
En el cuerpo de la funcion:
*Se pueden declarar todas las variables necesarias.
*Se utiliza la palabra return para expresar cual va a ser el valor que la funcion va
a devolver!!!
Creacion Func.
TipoRet nomb_funcion(Tipos de parametros)
Instrucciones
}
Tipo de dato
devuelto por la
funcin
Nombre de la funcin
Parmetros que
recibe
Procesos que realiza
la funcin
La forma general de definicin de una funcin es:
60
Creacion Func.
Definicin de la funcin(2)
La definicin de una funcin puede
ubicarse en cualquier lugar del programa,
con slo dos restricciones:
Debe hallarse luego de su prototipo.
No puede estar dentro de la definicin
de otra funcin ( incluida main() ).
La definicin debe comenzar con un encabezamiento, que
debe coincidir totalmente con el prototipo de la
funcin(Exceptuando si se quiere el nombre de las
variables), y a continuacin del mismo, encerradas por
llaves se escribirn las instrucciones que la componen
61
Definicin de la funcin (3)
Creacion Func.
void saludar(void) {
printf(Hola
parce!!\n);
}
void re_saludar(int N){
int i;
for(i=0;i<N;i++) {
printf(Hola !!\n);
}
}
int ver_algo(void){
return algo;
}
Para indicar no retorno de
datos se usa la palabra clave
void, hay tres casos
bsicamente:
1. Cuando una funcin no
tiene argumentos de
entrada ni retorna nada.
2. Cuando una funcin tiene
argumentos de entrada pero
no devuelve nada.
3. Cuando una funcion no pide
argumentos de entrada pero
devuelve algo.
Definicin de funcin(4)
Creacion Func.
Llamado a la funcin
Una vez se ha declarado y definido la funcin, podemos pasar a la fase en el que
la funcion ya se puede utilizar.
Convencionalmente en C los nombres de las funciones se escriben en minscula y
siguen las reglas de las variables, se distinguen de las variables porque van seguidas de
parentesis.
varRetorno = nomb_funcion(TipoDatosParametros);
Para hacer que las instrucciones contenidas en una funcin, se ejecuten en
determinado momento, no es necesario ms que escribir su nombre como una lnea
de sentencia en el programa.
Dentro de esos parntesis estn ubicados los datos que se les pasan a las funciones.
Est permitido pasarles uno, ninguno una lista de parametros separados por comas,
por ejemplo:
63
raiz=sqrt(a);
printf(el valor es: %d, val );
Creacion Func.
#include <stdio.h>
float suma(float,float);
int main() {
int a = 3, b = 2, c = 0, d = 3;
int e, f, g, h, i, k;
d = suma(2,-4);
c = suma(a,b);
f = suma(2,c++);
g = suma(++c,d++);
h = suma(suma(1,a),d);
return 0;
}
float suma(float num1, float num2)
{
float res;
res = num1 + num2;
return res;
}
Una funcin se puede invocar
las veces que se desee.
Llamado a la funcin(3)
Creacion Func.
EJEMPLOS
int doble(int);
Prototipo
Definicin
Llamado
#include <stdio.h>
void main(){
int x,resul;
scanf(%d,&x);
resul=doble(x);
printf(El doble de %d es %d,x,resul);
}
int doble(int n){
return 2*n;
}
65
Creacion Func.
Realice el prototipo y la definicin de la funcion invocada en el main()
Realice programa que sume dos numeros. Hgalo
utilizando una funcion que se llame suma()
Definicin
Llamado
66
Prototipo
EJEMPLOS(2)
Creacion Func.
Realizar programa que pida dos nmeros y que encuentre el mayor,
realice una funcin mayor() que sea la que encuentre el mayor entre
dos #s.
Definicin
llamado
Prototipo
67
EJEMPLOS(3)
Creacion Func.
Paso de parmetros a Funciones
Cuando se hace un llamado a una
funcin, si la funcin tiene lista de
parmetros, estos parmetros pueden
ser pasados a la funcin para que los
procese de la siguiente manera:
1. Por valor.
2. Por referencia(Apuntadores).
68
Param. por valor
Paso de parmetros a Funciones
Por Valor: El dato se le pasa a la funcin,
realizndole una copia en memoria al valor de la
variable y NO se le pasa la variables en s.
Se garantiza que dicha variable no sea afectada de ninguna
manera por la funcin invocada.
69
Param. por valor
Ejemplo
70
#include <stdio.h>
void doble(int); //prototipo Func doble
int main(void){
int cont;
for(cont=0; cont<5; cont++){
printf(cont en main es: %d,cont);
doble(cont);
printf(cont en main es: %d,cont);
}
return 0;
}
void doble(int cont){
printf(cont en doble es: %d,cont);
cont=2*cont;
printf(cont en doble es: %d,cont);
}
Escribir que valores de la variable cont son impresos en pantalla por el siguiente
programa.
Param. por valor
Visibilidad y duracin de las variables
71
La visibilidad o Scope de una variable es la parte del programa
en la que esa variable est definida y puede ser utilizada.
La duracin o Lifetime hace referencia al tiempo que transcurre
entre la creacin de una variable y el instante en que es
destruida.
Visibilidad y Duracin
De acuerdo a la visibilidad se dividen en dos las variables:
Locales-
Automaticas
Una variable local se declara
dentro de una funcin, son
visibles solo dentro de la
funcion
Ocultan a las variables
globales con el mismo
nombre.
Nacen y mueren con
la funcin. A no ser que
se declaren (static)
Globales
Una variable global se
declara fuera de todas las
funciones. Es visible en
todo el programa
Se le puede cambiar el valor
en cualquier parte del
programa y lo mantiene.
Se recomienda usar pocas o
ninguna variable global.
Visibilidad de las variables
Visibilidad y Duracin
Duracin de las variables
Si es una variable local automtica(por defecto), la
variable se crea y se destruye cada vez que pasa por
el bloque o funcin.
Si es una variable local static, la duracin de dicha
variable es hasta que finalice el programa.
Las Variables Globales existen durante todo el
programa.
Visibilidad y Duracin
Ejemplo variables locales
Analice el siguiente programa: Prueba de escritorio
#include <stdio.h>
void contCinco(void); //prototipo Func.
int main(void){
int cont;
for(cont=0; cont<5; cont++){
printf("cont en main es: %d \n",cont);
contCinco ();
}
return 0;
}
void contCinco(void){
static int contStatic=1;
int cont;
for(cont=contStatic;cont<contStatic+5;cont++){
printf("cont en funcion es: %d \n",cont);
}
contStatic=cont;
}
74
Visibilidad y Duracin
Ejemplo variables Globales
#include <stdio.h>
void contCinco(void); //prototipo Func.
int cont=0;
int main(void){
while(cont<10){
printf("cont en main es: %d \n",cont);
contCinco ();
cont++;
}
return 0;
}
void contCinco(void){
static int contStatic=1;
for(cont=contStatic;cont<contStatic+2;cont++){
printf("cont en funcion es: %d \n",cont);
}
contStatic=cont;
}
75
Analice el siguiente programa: Prueba de escritorio
Visibilidad y Duracin
Creacin de libreras
Hasta ahora todos los programa se han escrito en un solo
archivo (.c), solo se ha hecho uso de la inclusin de algunas
librerias (archivos .h) del sistema.
Los programas grandes son ms fciles de gestionar si se
dividen en varios archivos fuente, tambin llamados mdulos,
cada uno de los cuales puede contener una o ms funciones.
Al tener estructurado nuestras funciones en archivos
independientes al archivo en donde est alojado el main(), trae
grandes ventajas en cuanto a portabilidad de cdigo, facilidad de
reso, mantenimiento y depuracin de los programas, .
Creacin de Libreras
Creacin de Libreras
Archivos .c y .h
Se puede decir que, convencionalmente :
Los archivos .c contienen:
Las definiciones de las funciones,
Declaracin de variables globales y locales,
Inclusin de archivos de cabecera, .
Los archivos .h contienen:
La declaracin de los prototipos de las
funciones,
Definicin de Macros,
Definicin de nuevos tipos de datos, .
Creacin de Libreras
Archivos .c y .h (2)
No existe una nica forma de dividir los
archivos, ni el contenido de cada uno de
ellos, ni cuantos archivos se deben crear (La
mejor forma de hacerlo se aprende con la
experiencia).
Una opcin puede ser: Crear un archivo .c que contenga
todas las definiciones de las funciones creadas y un archivo .h
que contenga todos los prototipos y todas las macros. Mtodo
facilista, pero no independiza las funciones entre si.
Creacin de Libreras
Archivos .c y .h (3)
Otra opcin mas puede ser: crear por cada funcin un
archivo .c y otro archivo .h que contenga todos los prototipos
y todas las macros. Otro .h que contenga informacin comn
entre todas las funciones, como macros comunes. Es el que da
mas independencia y portabilidad a las funciones, pero se
requiere de mayor atencin a las hora de incluir librerias
comunes.
Es normal utilizar la directiva de preprocesamiento:
Otra opcin puede ser: crear por cada funcin un archivo .c y
solo un archivo .h que contenga todos los prototipos y todas
las macros(RECOMENDADO).
#ifndef FLAG
#define FLAG
.
#endif
Creacin de Libreras
Archivos .c y .h (4)
A la hora de crear sus archivos tenga en cuenta
que:
Cuando se compila un archivo .c, el compilador
debe conocer los prototipos de las funciones que
son llamadas o que son definidas dentro del
archivo.
Los archivos .c son compilados por separado y el
enlazador es el encargado de reunir cada uno de
los archivos compilados y de obtener el
EJECUTABLE.
#include < libreriaX.h>
#include "archivo.h"
int varGlobal;
int main(void){
..
}
program.c
#include < libreriaX.h>
#include "archivo.h"
extern int varGlobal;
int funcion1(void){
int varLocal;
printf("%d",CONST1);
..
}
int funcion2(int x){
int varLocal= CONST1;
..
}
int funcion3(float x){
int varLocal;
varLocal=2*CONST1;
.
}
archivo.c
archivo.h
#include < libreriaX.h>
#define CONST1 10
int funcion1(void);
int funcion2(int);
int funcion3(float);
int varGlobal;
int main(void){
{
..
}
int funcion1(void){
int varLocal;
printf("%d",CONST1);
..
}
int funcion2(int x){
int varLocal= CONST1;
..
}
int funcion3(float x){
int varLocal;
varLocal=2*CONST1;
.
}
program.c
#include < libreriaX.h>
#include "archivo.h "
extern int varGlobal;
int funcion1(void){
int varLocal;
printf("%d",CONST1);
..
}
funcion1.c
funcion2.c
funcion3.c
#include < libreriaX.h>
#include "archivo.h "
extern int varGlobal;
int funcion2(int x){
int varLocal=CONST1;
..
}
#include < libreriaX.h>
#include "archivo.h "
extern int varGlobal;
int funcion3(float x){
int varLocal;
varLocal=2*CONST1;
.
}
Creacin de Libreras
#define CONST1 10
int funcion1(void);
int funcion2(int);
int funcion3(float);
Ejemplo
Archivo
Fuente 1
Archivo
Fuente 2
Archivo
Fuente 3
Archivo
Fuente n
Archivo
objeto 1
Archivo
objeto 2
Archivo
objeto 3
Archivo
objeto n
COMPILADOR
Librerias
internas
ENLAZADOR
Compilando y Enlazando libreras
Creacin de Libreras
Revisar Makefile. Forma de realizar
todo este proceso de una manera
Automtica e Inteligente
Definicin:
Un array es una coleccin de
variables del mismo tipo de
datos con un mismo nombre.
En los arrays:
Hay un nmero de piezas
de datos contenidos en el
mismo nombre.
Hay un mtodo ordenado
para la extraccin de
datos individuales del
array
Definicin
El arreglo edad tiene 10 elementos (edades), los
indice van desde 0 hasta 9. Cada elemento se
accede con el nombre del arreglo y con el indice al
que corresponda.
El elemento 0 del vector Edad vale 24
El elemento 5 del vector Edad vale 17
Edad
0 1 2 3 4 5 6 7 8 9
24 17 31 16 21 17 26 26 18 23
Nmero de elementos = 10
Subndices
Valores
Nombre
Introduccin
Declaracin de Arreglos
Un arreglo es una coleccin de variables (espacio
en memoria) al cual hay que reservarle ese
espacio. Al igual que con una variable los arreglos
hay que declararlos antes de utilizarlos, y se
pueden inicializar o no.
La declaracin de los arreglos tiene la misma
connotacin de la Vbles.
DECLARACIN
tipoDatos nombreArreglo[#deElementos];
int, float,char,
Nombre que
Representa al
arreglo
Entero Positivo
Inicializacin de Arreglos
INICIALIZACIN
En el momento de declarar el arreglo, se puede
inicializar. Se utiliza las {} para inicializar un arreglo.
edad
0 1 2 3 4 5 6 7 8 9
Se crea el
arreglo y se
inicializa
int edad[10]={16,22,19,21,21,18,19,15,32,28};
temp
0 1 2 3
Se crea el
arreglo y se
inicializa
float temp[4]={21.3, 23.5, 27.5, 26.4};
16 22 19 21 21 18 19 15 32 28
21.3 23.5
27.5
26.4
Asignacin de valores al Arreglo
Una vez declarado el arreglo se puede escribir o leer
cualquier posicin del arreglo
int edad[9]; //Declaracin
edad[2]=21;
edad[5]=17;
edad[9]=2*edad[5];
INICIALIZACIN
edad
0 1 2 3 4 5 6 7 8 9
21 17
34
Solo se crea el arreglo Asignando valor a un elemento
Ejemplo 1
EJEMPLOS
#include <stdio.h>
#include TAM7
int main (void){
int num[TAM]={12, 4, 65, 21, 4, 6, 25};
int i, promedio, suma;
for (i=0; i< TAM; i++){
suma= suma + num[i];
}
promedio = suma / TAM;
printf(El prom. del vector es: %d\n,promedio);
return 0;
}
CADENA DE CARACTERES
Un tipo de arreglo muy til es el arreglo que
maneja elementos tipo caracter. Sirve para
manejar mensajes.
RECUERDE: Un caracter Ascii se maneja entre
comillas simples
Se declara e inicializa arreglo de caracteres:
CADENAS DE CARACTERES
char marca[4]= {F,I,A,T};
char nombre[5]= {L,U,I,S};
char apellido[10]= {S,U,A,R, E, Z, \0};
CADENA DE CARACTERES(2)
Es muy comn y muy til marcar con un caracter
especial el final de un arreglo de caracteres (\0).Un
arreglo de caracteres que tenga el caracter de
finalizacin lo llamamos cadena de caracteres
(string).
Un mensaje entre comillas dobles es un string
char nombre[5]= {L,U,I,S,\0};
char nombre[10]= ANA;
char nombre[]= ANA;
char nombre[]= {L,U,I,S,\0};
CADENAS DE CARACTERES
Si un vector no se le
indica el tamao, este
se define
automticamente de
acuerdo a la
inicializacin
Tamao 4
Ejemplo
Almacenar la palabra pereira en una cadena que se
llame ciudad.
Almacenar la palabra manzana en una cadena llamada
frutas
CADENAS DE CARACTERES
char ciudad[30] = pereira;
char ciudad[] = pereira;
char ciudad[30] = {p, e, r, e, i, r, a, \0};
char ciudad[] = {p, e, r, e, i, r, a, \0};
char frutas[30] = manzana;
char frutas[] = manzana;
char frutas[30] = {m, a, n, z, a, n, a, \0};
char frutas[] = {m, a, n, z, a, n, a, \0};
Lectura y Escritura de Cadenas
Leer una cadena introducida por teclado:
letra=getchar; //igual que scanf (%c,&letra);
gets(linea); // cadena completa hasta '\n'
scanf(%s, palabra); // 1 palabra Sin espacios
Escribir una cadena en la pantalla:
putchar(letra); //Igual que printf(%c,letra);
puts(palabra);
printf(%s,palabra);
CADENAS DE CARACTERES
#include <stdio.h>
#define MAXCAR 60
void main() {
char LIN[MAXCAR], LOUT [MAXCAR];
int i;
puts("INGRESE TEXTO A CODIFICAR: \n");
gets(LIN);
puts("EL TEXTO CODIFICADO ES: \n");
for (i= 0; LIN[i] != '\0'; i++){
if (((LIN[i] >='0')&&(LIN[i] < '9'))||((LIN[i] >='A)&&(LIN[i] < 'Z'))||((LIN[i] >='a') && (LIN[i] < 'z')))
{
LIN[i]= LIN[i] + 1;
}
else if (LIN[i] == '9') LOUT[i]='0';
else if (LIN[i] == 'Z') LOUT[i]='A';
else if (LIN[i] == 'z') LOUT[i]='a';
else LOUT[i]='.';
putchar(LOUT[i]);
}
putchar('\n');
}
FUNCIONES PARA MANIPULAR CADENAS
CADENAS DE CARACTERES
FUNCIN DESCRIPCIN EJEMPLO
#include <string.h> Librera necesaria -
strlen Devuelve longitud Longit=strlen(cad);
strcpy Copia la cad1 a la cad2 strcpy(cad1, cad2);
strcmp
Compara la cad1 y la
cad2
strcmp(cad1,cad2);
strcat
Copia la cad2 al final de
la cad1
strcat(cad1,cad2);
Ejemplo 3
Crear un programa que invierta un nombre.
EJEMPLOS
EJEMPLOS
#include <stdio.h>
//#include <string.h>
int main (void){
char nombre[20];
char invertido[20];
int i, j, largo=0;
printf(Ingrese su nombre: );
scanf(%s,nombre);
//largo=strlen(nombre);
for (i=0; nombre[i]!=\0; i++){
largo++;
}
for (i=0,j=largo-1; j>=0; j--, i++){
invertido[i]= nombre[j];
}
printf(El nombre invertido es: %s\n)
return 0;
}
Inicializaci
n
ARREGLOS MULTIDIMENSIONALES
matrizA
A[0][0] A[0][1] A[0][2]
A[1][0] A[1][1] A[1][2]
int matrizA [2] [3] = { {3,5,7} , {8,6,4} };
Fila 0 Fila 1
3 5 7
8 6 4
int matrizA [2] [3] = { {3,5,7} ,
{8,6,4} };
int matrizA [2] [3] = { 3,5,7,8,6,4 };
int matrizA [2] [3] [3]={ {{1,3,5}, {7,9,11}},
{{2,4,6}, {8,10,12}},
{{3,7,11}, {15,19,23}}
};
Arreglos de 3 Dimensiones
Fila 0 Fila 1
1 3 5
7 9 11
Plano 0
Plano 1
Plano 2
2 4 6
8
10
12
3 7 11
15 19 23
F0
F1
C0
C1 C2 C0
C1 C2
C0
C1 C2
Plano 0 Plano 1 Plano 2
ARREGLOS MULTIDIMENSIONALES
#include <stdio.h>
#define FILAS 5
#define COLUMNAS 5
int main (void){
int matriz [FILAS][COLMUNAS];
int i, j, indent = 1;
for(i=0; i < FILAS; i++){
for(j=0; j < COLUMNAS; i++){
printf(Ingrese el valor: (%d,%d), i, j);
scanf(%d,&matriz [i][j]);
}
}
for(i=0; i < FILAS, ident == 1; i++){
for(j=0; j < COLUMNAS, ident == 1; i++){
if(i==j){
if(matriz [i][j]==1) { indent = 1; }
else{ indent = 0;}
}else{
if(matriz [i][j]==0) { indent = 1; }
else{ indent = 0; }
}
}
}
if(ident==1) { printf(La matriz SI es la Identidad); }
else { printf(La matriz NO es la Identidad); }
return 0;
}
Para recorrer la matriz es necesario
utilizar dos ciclos.
1. Recorre las filas (externo)
2.Recorre las columnas (interno)
Arreglos como Parmetros a Funciones
Los parmetros se le pasan a una funcin:
El paso de parmetros por valor significa que la funcin solo
esta recibiendo el valor de la variable. Se le realiza una copia
en otro lugar de memoria.
En el paso de parmetros por referencia, se le pasa la
direccin de la variable, esto significa que la funcin tiene
acceso a la variable original.
FUNCIONES Y ARREGLOS
Arreglos como Parmetros a Funciones
En C todos los arrays se pasan por REFERENCIA
(direccin). Esto significa que cuando se llama a
una funcin y se utiliza un array como
parmetro la funcin accede a los valores del
arreglo original.
FUNCIONES Y ARREGLOS
tipoRetorno funcion (tipoDato vector[]);
tipoRetorno funcion (tipoDato matriz[][SIZE]);
Arreglos como Parmetros a Funciones
Siempre que tengamos un array como
parmetro a una funcin, sta debe saber
hasta donde va el arreglo, ya que se le est
pasando el inicio del arreglo. Generalmente se
envia el tamao del arreglo.
FUNCIONES Y ARREGLOS
tipoRetorno funcion(tipoDato vector[], int fila);
tipoRetorno funcion(tipoDato matriz[][colum] , int fila);
Arrays como Parmetros a Funciones
1.Situar un valor de seal al final del array, que
indique a la funcin hasta donde va el arreglo;
2.Pasarle un segundo argumento que indica el
nmero de elementos del array.
FUNCIONES Y ARREGLOS
tipoRetorno funcion (tipoDato vector[]);
funcion (nombreVector);
tipoRetorno funcion (tipoDato vector[], int size);
funcion (nombreVector, tamao);
Ejemplo
FUNCIONES Y ARREGLOS
Programa que sume los elementos de un
arreglo. Utlice una Funcin que lleve a
cabo la suma
#include <stdio.h>
void leerDatos (int vect [], int size);
int sumarDatos (int vect [], int size);
int main (void){
int datos [5];
int suma;
leerDatos (datos, 5);
suma = sumarDatos (datos, 5);
printf(La suma de los datos es: %d\n, suma);
return 0;
}
void leerDatos (int vect[ ], int size) {
int i;
for(i=0; i < size; i++){
printf(Ingrese el valor: (%d), i);
scanf(%d, &vect [i]);
}
}
int sumarDatos (int vect[ ], int size) {
int i, acum=0;
for(i=0; i < size; i++){
acum= acum+ vect [i];
}
return acum;
}
FUNCIONES Y ARREGLOS
Prototipo
Main
Funcin 1
Funcin 2
Ordenacin de Vectores
Una tarea muy importante en los sistemas
de computo es la ordenacin de datos -
Numericos, caracteres. (BASES DE DATOS).
Arreglos
12
6
5
17
90
34
5
6
12
17
34
90
90
34
17
12
6
5
APUNTADORES
DIRECCIONES DE MEMORIA
La declaracin de una variable involucra
necesariamente 4 cosas:
1000
1001
1002
1003
1004
1005
1000
1001
1002
y
1003
1004
1005
int y;
int y=25;
int z=77;
77
1000
1001
1002
y
1003
1004
z
1005
1. El nombre,
2. El tipo de Datos,
3. Su valor y
4. Su Direccin en memoria.
25
Se supone int
2 bytes
DIRECCIONES DE MEMORIA II
Al valor o contenido de una variable se accede
por medio de su nombre.
MEMORIA
Si quiero imprimir el valor de una variable y debo
utilizar simplemente su nombre:
printf("%d", y);
El operador &antepuesto al nombre de una variable da la
direccin de memoria de la variable
/*Imprime la direccin de memoria de la variable y NO SU
CONTENIDO*/
printf("%d", &y);
printf ( y = %d\n" , y) ; / * visualiza el valor de y * /
1000
1001
1002
1003
1004
1005
printf ("&y = %p\n",&y) ; / * visualiza direccin de y * /
printf ( y = %d\n" , y) ; / * visualiza el valor de y * /
printf ("&y = %p\n",&y) ; / * visualiza direccin de y * /
DIRECCIONES DE MEMORIA III
MEMORIA
25
77
1000
1001
1002
y
1003
1004
z
1005
#include <stdio.h>
void main()
{
}
int y = 25;
int z=77;
int y = 25;
int z=77;
PANTALLA
y = 25
&y = 1002
APUNTADORES-Punteros-pointers
INTRODUCCIN
Utilizando variables punteros un
programa puede realizar
muchas tareas que no sera
posible solo utilizando tipos de
datos estndar.
Las variables vistas hasta este momento contienen
valores cualquiera de datos cualquiera.
Por el contrario las variables punteros contienen
valores que son direcciones de memoria
donde se almacenan otras variables.
Concepto Apuntador
Apuntadores
El tipo de variable que almacena una
direccin se denomina puntero.
Caractersticas de un Apuntador:
Un puntero es una variable como cualquier otra
EXCEPTO QUE SOLO PUEDE ALMACENAR DIRECCIONES
DE MEMORIA
DE OTRAS VARIABLES COMN Y CORRIENTES.
Un puntero APUNTA a otra variable en memoria.
Concepto Apuntador
Apuntadores
Cuando se declara una variable en C, se establece un rea
de memoria para almacenar el contenido de la variable.
Esa variable se sita en una posicin especfica de la
memoria, conocida como direccin de memoria.
Un puntero en C es una
Variable que SOLO guarda
la direccin de memoria de
otra variable.
Se utilizan los apuntadores
para optimizar el acceso a
esas variables.
1000
1001
1002
1003
1004
1005
1000
1001
1002
y
1003
1004
1005
25 25
77
1000
1001
1002
y
1003
1004
z
1005
int y=25;
int z=77;
Declaracin de Apuntadores
Apuntadores
Como cualquier variable, las variables punteros han de
ser declaradas antes de utilizarlas.
Se utiliza asterisco "*" para indicar que la variable es
variable apuntador.
SIEMPRE que aparezca un asterisco ( * ) en una
declaracin de una variable, sta es una variable
puntero.
tipoDatoApuntado *nombreVbleApuntador;
Ejemplos:
int *ptr1;
float *f;
char *ptr2;
// Puntero (ptr) a un tipo de dato entero (int)
/* Puntero (ptr2) a un tipo de dato char */
/ * Puntero (f) a un tipo de dato float * /
Inicializacin de Apuntadores
Apuntadores
Una variable apuntador contiene ..
Como se obtiene la direccin de una variable ???
LA DIRECCIN DE UNA VARIABLE
Con el operador &
Ejemplo: &y
53
5010
5011
5012
y
5013
5014
5015
printf( y = %d\n" , y); ????
printf( &y = %d\n" , &y); ????
y = 53
&y = 5012
Inicializacin de Apuntadores
Apuntadores
int i; /* Define una variable i */
int *ptr; /* Define un puntero a un entero ptr*/
/* Almacene la direccin de i en ptr, como???? */
..
5022
5020
5021
5022
i
5023
5024
ptr
ptr = &i ;
MAPA DE MEMORIA ?????
Indireccin
Apuntadores
Se puede acceder al valor de una variable apuntada
utilizando el nombre del apuntador.
.
5020
5021
5022
i
5024
var1
ptr
//Ejemplo
void main(void) {
int var1;
int i=3;
int *ptr;
ptr = &i;
var1=*ptr;
var1++;
*ptr=var1;
}
MAPA DE MEMORIA ?????
En el procedimiento del algoritmo simplemente se le
antepone " * " al nombre del apuntador y se accede al
valor de la variable de una forma comn y corriente
Ejemplo
EJEMPLO
Programa que declare una variable tipo carcter y la inicialice con la
letra O. Cree un apuntador a esta letra e imprimala utilizando el
apuntador(indireccin)
O

5020
5020
letra
5021
5022
5023
5024
ptrLet
Operadores Esenciales
OPERADORES
Operadores Vistos
&
*
*
Obtiene la direccin de una variable.
Define una variable como puntero (DECLARACIN).
Accede al contenido apuntado (PROCEDIMIENTO).
C requiere que las variables puntero direccionen
realmente variables del mismo tipo de dato que est
ligado a los punteros en sus declaraciones.
Apuntadores NULL
Tipos Especiales
La macro NULL es una macro que representa un valor de CERO
Alguna libreras la definen: STDEF. H, STDIO.H, STDLIB.H, STRING.H
Cuando se declara y no se inicializa un apuntador a donde est apuntando????
La podemos definir
#define NULL 0
Muchas veces se hace necesario expresar explicitamente que un apuntador
declarado no este apuntando a "NINGN" lugar (En apuntadores quiere
decir que el apuntador apunta a la direccin CERO )
char *ptr;
char *ptr = NULL;
Apuntadores VOID
Tipos Especiales
Se utiliza la palabra reservada void en la declaracin de apuntadores,
cuando se quiere que el puntero pueda apuntar a cualquier tipo de
variables, int , char, float,.
void *ptr; / * declara un puntero void. Puntero genrico * /
char cadena;
int numero;
ptr=&cadena;
ptr=&numero;
int main(){
return 0;
}
PUNTEROS A PUNTEROS
Como un puntero es una variable ms, podemos
tener otro apuntador apuntando a ste.
Un apuntador es una variable ms.
Como cualquier otra variable tiene:
Un espacio en memoria,
Tiene un nombre,
Tiene un valor.
(Direccin de otro espacio en memoria)
PUNTEROS A PUNTEROS
PUNTEROS A PUNTEROS
El concepto de apuntar a otro apuntador se utiliza con mucha frecuencia
en programas complejos de C, en el manejo de gran cantidad de
informacin.
Se hace uso del operador * 2 veces
char letra = A;
char *ptr1 = &letra;
Ejemplo: Declaremos una variable tipo carcter, tambin un apuntador a esta variable. Y
luego declaremos un puntero que apunte a este ultimo puntero.
char **ptr2 = &ptr1;
Para acceder al contenido de letra se puede hacer por medio de:
La misma variable
El apuntador ptr1
El apuntador ptr2
Ejemplo Apuntador a puntero
Ejemplo: Suponga que declara tres variables tipo
enteras y las inicializa, suponga que se tienen dos
apuntadores y un tercer apuntador a apuntadores.
x
y
temp
ptr1
ptr2
ptr3
void main(void){
int x=23,y=45,temp=12;
int *ptr1=&x,*ptr2=&y;
int **ptr3=&ptr1;
printf(el contenido de *ptr1 es: %d, *ptr1);
printf(el contenido de *ptr2 es: %d, *ptr2);
printf(el contenido de *ptr3 es: %p, *ptr3);
printf(el contenido de **ptr3 es: %d, **ptr3);
ptr2=&temp;
printf(el contenido de *ptr2 es: %d, *ptr2);
ptr3=&ptr2;
printf(el contenido de *ptr3 es: %p, *ptr3);
printf(el contenido de **ptr3 es: %d, **ptr3);
}
23
45
12
&x
&y
&ptr1
Aritmtica de punteros
ARITMETICA DE PUNTEROS
Es muy til hacer que un puntero apunte a un
elemento en memoria que este antes o despus del
dato originalmente apuntado.
dato1
dato2
dato3
ptr
34
21
18
.
int dato1=34,dato2=21,dato3=18;
int *ptr=&dato1;
Si dato1,2 y 3 estan en posiciones contiguas de
memoria, se puede recorrer todas estas posiciones
con un apuntador, incrementando o
decrementando ese puntero.
ptr=ptr+1; //Queda apuntando a dato2
ptr--; //Apunta de nuevo a dato2
ptr++; //Queda apuntando a dato3
6050
6052
6054
6056
6058
6050
arreglo[0]
6052
arreglo[1]
6054
arreglo[2]
6056
arreglo[3
6058
Apuntadores y arreglos
PUNTEROS Y ARREGLOS
En C, los punteros permiten manejar arreglos de una
manera muy flexible.
int arreglo[4] = {2, 3, 10, 8};
2
3
10
8

int *ptrArr;

6050
ptrArr=&arreglo[0]; //Se apunta al vector
ptrArr
ptrArr+1
ptrArr+2
ptrArr+3
*ptrArr
*(ptrArr+1)
*(ptrArr+2)
*(ptrArr+3)
6050
arreglo[0]
6052
arreglo[1]
6054
arreglo[2]
6056
arreglo[3
6058
6050
arreglo[0]
6052
arreglo[1]
6054
arreglo[2]
6056
arreglo[3
6058
ptrArr
El nombre del arreglo representa la direccin en
donde comienza el arreglo
arreglo corresponde a &arreglo[0]
ptrArr=arreglo; //Se apunta al vector
Apuntadores y arreglos (2)
PUNTEROS Y ARREGLOS
Ejemplo: Imprimir arreglo de caracteres utilizando 4 formas diferentes
#include <stdio.h>
int main(void){
char arreglo[5] = {'A','B','C','D','\0'};
char *ptrArr;
int i=0;
printf(Se recorre cadena usando el indice i\n");
while(arreglo[i]!='\0'){
printf("%c",arreglo[i]);
i++;
}
printf(Se recorre cadena usando Apuntador \n");
ptrArr=arreglo; //Es lo mismo que ptrArr=&arreglo[0];
while(*ptrArr!='\0'){
printf("%c",*ptrArr);
ptrArr++;
}
printf(Se imprime cadena con opcion s printf \n");
printf("%s",arreglo);
printf(" Se imprime cadena con opcion s printf \n");
ptrArr=arreglo; //Es lo mismo que ptrArr=&arreglo[0];
printf("%s",ptrArr);
return 0;
}
//Incluya la librera de entrada y salida de datos
//Encabezado de la definicin de la Funcin Main
//Declare cadena de caracteres de 5 posiciones e inicialicela.
//Declare apuntador a caracteres
//Declare variable entera e inicialcela en cero.
//Mensaje Forma1
//Realice un ciclo que recorra la CADENA e imprima
//carcter a carcter, utilice la vble i como indice del arreglo.
//Preferiblemente utilice chequeo de carcter de finalizacin
//para saber hasta donde imprimir.
//Mensaje Forma2
//Apunte hacia la cadena de caracteres
//Realice el ciclo de impresin anterior, pero utilice el apuntador
// para acceder a los elementos
//Mensaje Forma3
//Imprima la cadena utilizando la opcion s en la funcion printf
//Mensaje Forma4
//Apunte a la cadena con el apuntador.
//Imprima la cadena utilizando la opcion s en la funcion printf
//Valor de retorno de la funcion Main
//Cierre de la definicin del Main.
Cdigo
Comentarios
Arreglo de punteros
PUNTEROS Y ARREGLOS
Un arreglo de caracteres es una coleccin de variables
tipo carcter
Un arreglo de punteros es .
12
32
7
.
&var1
&var2
&var1
&var3
arrEnt[0]
arrEnt[1]
arrEnt[2]
arrPtr[0]
arrPtr[1]
arrPtr[2]
arrPtr[3]
int *arrPtr[7];
arrPtr[0]
arrPtr[1]
arrPtr[2]
arrPtr[3]
arrPtr[4]
arrPtr[5]
arrPtr[6]
&var1
&var2
&var1
&var3
&varX
NULL
&varX
Arreglo de punteros 2
PUNTEROS Y ARREGLOS
Ejemplo: Declare tres cadenas de caracteres e inicialcelas, declare
un arreglo de punteros, y apunte con cada puntero a cada una de
las cadenas.
char cad1[10]={'C', 'A', 'R', 'L', 'O', 'S', '\0'};
arrPtr[0]
arrPtr[1]
arrPtr[2]
arrPtr[3]
&cad1[0]
&cad2[0]
&cad3[0]
NULL
char cad2[10] = "MARIA";
char cad3[] = {' L', 'U', 'I', 'S', 'A', '\0'};
char *arrPtr[4];
arrPtr[0]=cad1; //Es lo mismo que &cad1[0]
arrPtr[1]=&cad2 [0]; //Es lo mismo que cad2
arrPtr[2]=cad3; //Es lo mismo que &cad3[0]
arrPtr[3]=NULL;
while (arrPtr[i] != NULL){
printf("%s",arrPtr[i]);
i++;
}
Apuntadores como parmetros a
funciones
Con frecuencia se desea que una funcin calcule
y devuelva ms de un valor.
Se desea que una funcin modifique las
variables que se le pasan como argumentos.
Un apuntador que se le pasa como parametro a
una funcion, sera pasada como parametro por
referencia.
Si una variable es local y quiere que sea vista por
alguna funcin entonces se utiliza apuntadores
para que sea visible en la funcion.
PUNTEROS COMO PARAMETROS
Funciones que reciben Apuntadores
Prototipo:
int funcionApunt(int *ptr1, int *ptr2); //La funcin recibir 2 apuntadores
Definicin:
int funcionApunt(int *ptr1, int *ptr2){
ptr1=ptr2;
printf("%d", *ptr1);
return *ptr1 + *ptr2;
}
Llamado a la funcin:
void main(void){
int *apuntA, *apuntB;
..
a=funcionApunt(apuntA, apuntB);
}
PUNTEROS COMO PARAMETROS
EJEMPLO:
#include <stdio.h>
void funcion1(int *ptrInt, char *ptrCh);
int main(void){
int *ptrInt;
int num=5;
char *ptrCh;
char cad[10] = { 'M', 'A', 'N', 'G', 'O', '\0'};
ptrInt=&num;
ptrCh=cad;
funcion1(ptrInt,ptrCh);
return 0;
}
void funcion1(int *ptrInt, char *ptrCh){
int i;
for(i=0; i < *ptrInt; i++){
printf("%c", *ptrCh);
ptrCh=ptrCh+1;
}
}
PUNTEROS COMO PARAMETROS
//Incluya libreria para manejo de teclado y de pantalla
//Prototipo de funcion1 que reciba puntero a entero y
//puntero a caracter, que no retorne nada
//Cuerpo del main, retorna un cero.
//Declare ptrInt como un puntero a entero.
//Declare numcomo entero e inicialicelo con 5.
//Declare ptrCh como un puntero a caracter.
//Declare cad cadena de caract. e inicie con palabra MANGO
//Apunte ptrInt a la variable.
//Apunte ptrCh a la cadena cad.
//Llame a la funcion1 con parametros ptrInt y ptrCh
//Retorna la funcion main.
//Definicion funcion1
//Declare variable entera i
//Ciclo for, i desde 0 hasta <= valor apuntado por ptrInt, increm. i
//Imprima caracter apuntado por ptrCh
//Apunte ptrCh al siguiente caracter.
//Fin Ciclo for
//Fin funcion1
Ejercicio
PUNTEROS COMO PARAMETROS
Programa que imprime una cadena de caracteres por
medio de una funcin que recibe un apuntador a la
cadena.
Programa que compara dos cadenas de caracteres por
medio de una funcin que recibe los apuntadores a
cada una de las cadenas. La funcin retorna 1 si son
iguales y 0 si son diferentes
ESTRUCTURAS DE DATOS
Introduccin a Estructuras (2)
Una lista de informacin, por ejemplo, de estudiantes contiene
elementos tales como:
El nombre,la edad, las notas, semestre, etc.,
Para esto los arreglos NO son adecuados.
INTRODUCCIN
Nomb= LUIS
Apell= LOPEZ
Edad= 17
NotaInf1= 4.5
NotaCalc1= 4.4
Sem= 1
ESTUDIANTE:
Nomb
Apell
Sem
NotaInf1
NotaCalc1
Luis Lopez 17 4.5
Nombre Apellido Edad NotaInf1
4.4
NotaCalc1
1
Semestre
ESTUDIANTE
Componentes de una Estructura
Una estructura es una coleccin de uno o mas tipos denominados
miembros o campos, cada uno de los cuales puede ser de un tipo de
datos diferente.
Ejemplo: Estructura estudiante
INTRODUCCIN
TIPOS DE DATOS
Cadena de Caracteres max 50
Cadena de Caracteres max 15
Numerico Entero
Numerico Entero
Numerico Flotante
Numerico Flotante
CAMPOS
Nombre
Apellido
edad
Semestre
NotaInf1
NotaCalc1
Luis Lopez 17 4.5
Nombre Apellido Edad NotaInf1
4.4
NotaCalc1
1
Semestre
ESTUDIANTE
Componentes de una Estructura
Ejemplo: Estructura CD de musica
INTRODUCCIN
TIPOS DE DATOS
Cadena de Caracteres max 40
Cadena de Caracteres max 40
Cadena de Caracteres max 15
Numerico entero
Numerico entero
Numerico entero
CAMPOS
Titulo
Artista
Gnero
Nmero Canciones
Ao de lanzamiento
Precio
ESTRUCTURAS EN C
ESTRUCT. Y C
En C existe un tipo de dato, llamado
Luis Lopez 17 4.5
Nombre Apellido Edad NotaInf1
4.4
NotaCalc1
1
Semestre
ESTUDIANTE
Se puede utilizar una estructura para almacenar diferentes tipos
de informacin sobre una persona, tal como nombre, estado civil,
edad, fecha de nacimiento,
Declaracin de una Estructura
struct nombreDeLaEstructura
{
tipoDeDatoCampo1 nombreMiembro1;
tipoDeDatoCampo2 nombreMiembro2;
...
tipoDeDatoCampoN nombreMiembroN;
} ;
Con la declaracin de un estructura estamos creando un
tipo de datos NUEVO y PERSONALIZADO.
Se utiliza la palabra clave struct
ESTRUCT. Y C
Ejemplo Declaracin de Estructura
Estudiante Informatica1
DECLARACIN
struct nombreDeLaEstructura
{
tipoDeDatoCampo1 nombreCampo1;
tipoDeDatoCampo2 nombreCampo2;
...
tipoDeDatoCampoN nombreCampoN;
} ;
struct estudianteInform1
{
char nombre[50];
char cedula[15];
char email[50];
float notaTeorica;
float notaLab;
int faltas;
} ;
CAMPOS
Nombre
Cedula
Correo Electrnico
Nota Teria
Nota Laboratorio
Faltas
TIPOS DE DATOS
Cadena de Caracteres max 50
Cadena de Caracteres max 15
Cadena de Caracteres max 50
Numerico flotante
Numerico flotante
Numerico entero.
Ejemplo 2: Declaracin de
Estructura CD de Musica
DECLARACIN
struct cdsMusica
{
char titulo[40];
char artista[40];
char genero[15];
int numCanciones;
int lanzamiento;
int precio;
} ;
MIEMBROS
Titulo
Artista
Gnero
Nmero Canciones
Ao de lanzamiento
Precio
TIPOS DE DATOS
Cadena de Caracteres max 40
Cadena de Caracteres max 40
Cadena de Caracteres max 15
Numerico entero
Numerico entero
Numerico entero
struct nombreDeLaEstructura
{
tipoDeDatoMiembro1 nombreMiembro1;
tipoDeDatoMiembro2 nombreMiembro2;
...
tipoDeDatoMiembroN
nombreMiembroN;
} ;
Ejemplo3: Declaracin de
Estructura numero complejo
DECLARACIN
struct complejo
{
float parte-real;
float parte-imaginaria;
};
struct complejo
{
float parte-real, parte-imaginaria;
};
MIEMBROS
Parte_Real
Parte_Imaginaria
TIPOS DE DATOS
Numerico Flotante
Numerico Flotante
Declarando VARIABLES tipo
estructura
Variables tipo Estructura
Cuando declaramos una estructura solo se est diciendo que
forma tendr, SE CREA UN NUEVO TIPO DE DATOS.
struct cdsMusica
{
char titulo[40];
char artista[40];
char genero[15];
int numCanciones;
int lanzamiento;
int precio;
};
struct cdsMusica cd1, cd2, cd3;
struct cdsMusica
{
char titulo[40];
char artista[40];
char genero[15];
int numCanciones;
int lanzamiento;
int precio;
} cd1,cd2,cd3; //Se delaran 3 Vbles
Falta instanciar la estructura o simplemente reservarle un
espacio en memoria con un nombre especifico,
Se declara una Variable de este nuevo tipo.
Declarando variables tipo
estructura
Variables tipo Estructura
La declaracin de las estructuras se realiza por fuera de las
definiciones de cualquier funcin.
struct cdsMusica
{
char titulo[40];
char artista[40];
char genero[15];
int numCanciones;
int lanzamiento;
int precio;
};
struct cdsMusica cd1,cd2,cd3; //3 vbles tipo globales
int main(void){
struct cdsMusica cd4,cd5,cd6; //3 Vbles locales
.
}
La declaracin de Variables tipo Estructura, mantiene las
normas de la declaracin de cualquier otra variable.
struct cdsMusica
{
char titulo[40];
char artista[40];
char genero[15];
int numCanciones;
int lanzamiento;
int precio;
} cd1,cd2,cd3;
int main(void){
struct cdsMusica cd4,cd5,cd6;
.
}
Inicializacin de Variables
tipo estructura
Variables tipo Estructura
struct cdsMusica
{
char titulo[40];
char artista[40];
char genero[15];
int numCanciones;
int lanzamiento;
int precio;
};
struct cdsMusica cd1= {
The Best Of 1980-1990",
U2",
Rock ,
15,
1998,
50000
};
Cuando se declara una variable, se reserva espacio en memoria.
struct cdsMusica cd1;

cd1
titulo
artista
genero
Num
Canc.
ao
Lanza.
precio
Declaracin de Estructura
Estudiante Informatica1
REPASO
struct nombreDeLaEstructura
{
tipoDeDatoMiembro1 nombreMiembro1;
tipoDeDatoMiembro2 nombreMiembro2;
...
tipoDeDatoMiembroN nombreMiembroN;
} ;
struct estudianteInform1
{
char nombre[50];
char cedula[15];
char email[50];
float notaTeorica;
float notaLab;
int faltas;
} ;
Inicializacin de Variables
tipo estructura
Variables tipo Estructura
struct cdsMusica
{
char titulo[40];
char artista[40];
char genero[15];
int numCanciones;
int lanzamiento;
int precio;
};
struct cdsMusica cd1= {
The Best Of 1980-1990",
U2",
Rock ,
15,
1998,
30000
};
Cuando se declara una variable, se reserva espacio en memoria.
struct cdsMusica cd1;

cd1
titulo
artista
genero
Num
Canc.
ao
Lanza.
precio
ACCESO A ESTRUCTURAS
Variables tipo Estructura
Una Variable tipo estructura, as tenga internamente
otros tipos de datos(No importa cuantos ni cuales), se
sigue considerando como UNA SOLA VARIABLE.
Se puede copiar todo el contenido de variable tipo
estructura a otra que tenga el mismo tipo de estructura
cd1=cd2; //Todo el contenido de cd2 se copia en cd1
ACCESO A ESTRUCTURAS
Variables tipo Estructura
cd2=cd1;

cd1
titulo
artista
genero
Num
Canc.
ao
Lanza.
precio

cd2
titulo
artista
Num
Canc.
ao
Lanza.
struct cdsMusica cd2,cd1= {
The Best Of 1980-1990",
U2",
Rock ,
15,
1998,
50000
};
ACCESO A ESTRUCTURAS
Variables tipo Estructura
cd1=cd2; //Todo el contenido de cd2 se copia en cd1
Un elemento especifico dentro de una variable estructura se puede
accesar por medio del operador . -> (Con apuntadores).
nombreVarEstructura.nombreMiembro = dato;
Cada miembro de una variable estructura se maneja como si
fuera otra variable comn y corriente.
ACCESO A ESTRUCTURAS
Variables tipo Estructura
Como copia una cadena de caracteres a
un miembro de un estructura que es tipo
cadena de caracteres? Ejemplo a titulo

cd1 struct cdsMusica


{
char titulo[40];
char artista[40];
char genero[15];
int numCanciones;
int lanzamiento;
int precio;
};
int main(void){
struct cdsMusica cd1;
..
cd1.numCanciones=10;
cd1.precio=30000;
printf(%d, cd1.precio);
.
strcpy(cd1.titulo, "The Best");
}
titulo
artista
genero
Num
Canc.
ao
Lanza.
precio
10
30000
RECUERDE
Un arreglo es ..
La direccin de un arreglo se obtiene .
Una estructura es
Una coleccin de varios datos bajo un nombre general.
La instanciacin de una estructura es una VARIABLE.
La direccin de una variab. estructura se obtiene.
RESUMEN
TAMAO DE UNA ESTRUCTURA
TAMAO
struct cdsMusica cd1;
tam=sizeof(cd1);
printf ("El tamao en Bytes de cd1 es: %d \n",tam) ;
El operador sizeof se puede aplicar para determinar el tamao en
bytes que ocupa en memoria una estructura, o cualquier otra
variable
Tipo de Datos Tamao Bytes
char 1
booleano 2
int 4
float 4
ARREGLOS DE ESTRUCTURAS
Se define un arreglo de variables del tipo struct cdsMus:
struct cdsMus cds[10];
Se Accede a la variable estructura dentro del arreglo:
cds[0]=cds[1]; //Se copia toda la informacin
Se puede acceder a cualquier miembro de cualquiera de las
variables estructura del arreglo
cds[0].numCanc=10;
cds[3].titulo="Los caonazos";
struct cdsMus{
char titulo[20];
char autor[20];
int numCanc;
int lanz;
};
ERROR!!!
#include <stdio.h>
struct cdsMus{
char titulo[20];
char autor[20];
int numCanc;
int lanz;
char flag;
};
int main(void){
struct cdsMus cds[10];
int opc;
printf("\n PROGRAMA PARA MANEJAR COLECCION DE CDS (Max10) \n");
while(1){
printf("\n1. para modificar 2.para consultar\n");
scanf("%d",&opc);
if(opc==1){
printf("\nIngrese el # del CD a modificar:\n");
scanf("%d",&opc);
printf("-----------------------------\n");
printf("Ingrese el titulo del CD%d: ",opc);
scanf("%s",cds[opc].titulo);
printf("Ingrese el autor del CD%d: ",opc);
scanf("%s",cds[opc].autor);
printf("Ingrese el NumCanciones del CD%d: ",opc);
scanf("%d",&cds[opc].numCanc);
printf("Ingrese el agno de lanzamiento del CD%d: ",opc);
scanf("%d",&cds[opc].lanz);
printf("-----------------------------\n");
cds[opc+1]=cds[opc]; //Se copia el cd[i] a cd[i+1]
}
else if(opc==2){
printf("\nIngrese el # del CD a visualizar\n");
scanf("%d",&opc);
printf("-----------------------------\n");
printf("El titulo del CD%d es: %s\n",opc,cds[opc].titulo);
printf("El autor del CD%d es: %s\n",opc,cds[opc].autor);
printf("El #canciones del CD%d es: %d\n",opc,cds[opc].numCanc);
printf("El lanzamiento del CD%d fue %d\n",opc,cds[opc].lanz);
printf("-----------------------------\n");
}
else{}
}
return 0;
}
APUNTADORES A ESTRUCTURAS
Se define una variable estud1 del tipo struct estudiante:
struct estudiante estud1={"Jose" , 4 , 2009 , 4.5};
Se define una variable puntero para apuntar a variables del tipo struct estudiante:
struct estudiante *ptrEstruct;
Apunte con ptrEstruct a la variable estud1:
ptrEstruct=&estud1;
El operador puntero, ->, sirve para acceder a los datos de la
estructura a partir de un apuntador.
printf("La nota de estud1 es %d", ptrEstruct->nota);
//Es lo mismo que printf("La nota de estud1 es %d", estud1.nota);
struct estudiante{
char Nombre[40];
int numEstudiante;
int agnoMatricula;
float nota;
};
#include <stdio.h>
struct estudiante{
char Nombre[40];
int numEstudiante;
int agnoMatricula;
float nota;
};
int main(void){
struct estudiante estud1={"Jose" , 4 , 2009 , 4.5};
struct estudiante *ptrEstruct;
ptrEstruct=&estud1;
printf("La nota de estud1 es %.2f (Con Apuntador)\n", ptrEstruct->nota); //Metodo1
printf("La nota de estud1 es %.2f (Sin Apuntador)\n", estud1.nota); //Metodo2
getchar();
return 0;
}
APUNTADORES A ESTRUCTURAS
Ejemplo:
Estructuras anidadas
Cliente
Direccin
Cll Num Ciu
Nombre Saldo
Estudiante
Notas
N1 N2 N3
Nombre Cdigo
Los campos de las estructuras puede ser la combinacin de los
siguientes datos:
Variables: char, int, double,.
Apuntadores
Arreglos de variable
OTRA ESTRUCTURA
struct cliente{
char nombre[20];
struct direccion direc;
int saldo;
};
struct estudiante{
char nombre[20];
int codigo;
struct notas notaEst;
};
Estructuras anidadas(2)
Cliente
Direccin
Cll Num Ciu
Nombre Saldo
struct cliente{
char nombre[20];
struct direccion direc;
int saldo;
};
struct cliente{
char nombre[20];
struct direccion{
char cll[5];
char num[5];
char ciud[15];
} direc;
int saldo;
};
struct direccion{
char cll[5];
char num[5];
char ciu[15];
} ;
struct cliente{
char nombre[20];
struct direccion direc;
int saldo;
};

Potrebbero piacerti anche