Curso C - Seminario

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 189

1

1
Lenguaje de
programacin C
2
Objetivos
General:
Programar un computador utilizando un lenguaje de
programacin estructurada, lenguaje C.
Especficos:
Utilizar las instrucciones bsicas de un lenguaje de
programacin estructurada: secuencia, seleccin y
repeticin.
Utilizar las capacidades de manejo de estructuras de datos
simples y compuestas.
Disear programas modulares mediante subrutinas.
Desarrollar programas para la manipulacin de archivos de
datos.
2
3
Planificacin (1)
Secuencia, accin simple, acciones
compuestas; seleccin, sentencias if, if
else, switch; repeticin, sentencias
while, do-while, for.
Estructuras de control
Asignacin, entrada de datos, salida de
datos
Sentencias bsicas
Tipos estndares, compatibilidad y
conversin de tipos, reglas de
precedencia de operadores, tipos
definidos por el usuario, tipo enumerado
Tipos de datos simples
Identificadores, comentarios, definicin
de constantes, declaracin de variables.
Declaraciones
Encabezado, declaraciones, cuerpo del
programa
Estructura de un programa C
Anlisis y resolucin de problemas,
pseudo cdigo
Algoritmos
4
Planificacin (2)
Arreglos, manejo de strings (strcpy,
strcat, strcmp, strlen, y otros)
algoritmos de bsqueda, algoritmos
de ordenacin.
Tipos de datos estructurados
Diseo y estructura de programas,
funciones (con y sin retorno de
valores) , parmetros por valor,
variables locales y variables globales.
Subprogramas
3
5
Planificacin (3)
archivos de caracteres (texto)
archivos de enteros/reales
archivos de registros
Manejo de archivos
Struct Tipos de datos estructurados
6
Bibliografa
Libros:
Brian C. Kernighan and Dennis M. Ritchie. El
lenguaje de programacin C. Prentice Hall, 1988.
4
7
Enlaces Interesantes
C GNU http://gcc.gnu.org
C Programming Notes. Steve Summit.
http://www.eskimo.com/~scs/cclass/notes/top.html
Programming in C: A Tutorial. Brian W. Kernighan.
http://www.lysator.liu.se/c/bwk-tutor.html
Programming in C. Unix SystemCalls and Subroutines using C.
A.D. Marshall http://www.cs.cf.ac.uk/Dave/C/CE.html
C Programming. Steve Holmes.
http://www.strath.ac.uk/IT/Docs/Ccourse/
Programming in C. Geocities.
http://www.geocities.com/SiliconValley/Software/5562/
C Language Tutorial.
http://www.physics.drexel.edu/courses/Comp_Phys/General/C_b
asics/c_tutorial.html
8
Algoritmos
5
9
Que es un Computador?
Un computador es una maquina de entradas y
salidas
Entiende trminos de tipo
101011110001010001000101111010010101010
En cambio nosotros
Sumar gastos de hoy a gastos semanales
10
Modelo Bsico de un Computador
Pentium
Atlhon
Cyrix .
Almacenamiento
Secundario
Procesador Central
Salida
Ram
Memoria Principal
Entrada Disco
Duro
6
11
Que es un algoritmo?
Un procedimiento efectivo para resolver un
problema en un numero finito de pasos.
Niklaus Wirth estableci que:
Programas = Algoritmos + Datos
12
Algoritmos vs. Programa
Un algoritmo es una secuencia de pasos finitos,
no ambiguos necesarios para resolver un
problema.
La realizacin de un algoritmo que puede correr
en un computador es llamado programa
Sistemas Operativos, Netscape, juegos, ... son
ejemplos de programas.
7
13
Que es programar?
Mecanismo artificial necesario para decirle al
computador qu hacer.
La programacin no requiere talento inherente
Pre-requisitos:
Atencin a detalle: los detalles cuentan en programacin. No se
puede ser vago.
Manejo de Estupidez: ellos hacen exactamente lo que les dices,
ni ms ni menos. El nivel de especificacin depende del tipo de
lenguaje de programacin.
Buena Memoria: sintaxis del lenguaje, conjunto de funciones
prescritas disponibles para ser llamadas, parmetros a ser
aceptados, las variables y funciones definidas, y la experiencia
del pasado para ser aplicada cuando se reconocen los
sntomas.
Habilidad de pensar abstractamente: Slo si es posible pensar
en pequeas piezas aisladas ser posible trabajar con un gran
programa.
14
Resolucin de un Problema
Respuesta =
2
Problema a
Resolver
Ordenamiento
de las Ideas
Creacin del
Algoritmo
Codificacin
Compilacin
Ejecucin y
obtencin de
resultados
Anlisis
Test
Correcciones
Fin
8
15
Resolucin de un Problema
Start with problem
statement
Analyze problem &
develop algorithm
Write source code
Run & test program
Is there more
problem solving to
be done?
End
yes
no
Use program
16
Anlisis del
problema
Diseo del
Algoritmo
Codificacin
(Programacin)
Ejecucin y
Validacin
Resolucin de un problema
Para resolver un problema se debe seguir los
siguientes pasos:
9
17
Algoritmo
Definiciones:
son mtodos para resolver problemas, posibles de
implementar en un computador.
Es el proceso de descomponer una TAREA, en forma
secuencial y ordenada, en un conjunto de acciones
elementales que manipulan y transforman los datos
de entrada y, por medio de algunas secuencias
bsicas de control, se obtiene una salida que es el
objetivo de la tarea.
Acciones <--->Sentencias
Datos <--->Declaraciones y delimitaciones.
Las sentencias se componen de instrucciones que son acciones
concretas que deben realizar la mquina.
18
Algoritmo
Caractersticas:
Debe ser preciso e indicar un orden de realizacin de
cada paso.
Debe ser definido, es decir, si se repite varias veces,
debe de dar el mismo resultado.
Debe ser finito, es decir, debe terminar en algn
momento.
10
19
Cmo generar un Algoritmo?
Los pasos que se deben seguir para la obtencin de un algoritmo a
partir del problema en estudio son los siguientes:
1. Determinacin del Objetivo del problema.
2. Estipulacin escrita del problema
3. Identificacin de los datos de entrada y salida.
4. Determinacin del proceso y de los datos integrantes del algoritmo.
5. Identificacin de las variables interna.
6. Dividir el proceso en acciones atmicas
7. Determinacin de los cursos de accin
8. Determinacin de la secuencialidad de las acciones en cada uno de los cursos de
accin.
9. Incorporacin de estructuras de control para la unificacin de los cursos de accin.
10. Generacin del algoritmo
20
Datos
Existen datos simples y compuestos.
Simples: Carcter, entero, real, letras, nmeros,
smbolos, datos lgicos.
Compuestos: Matrices, Registros.
Existen datos que son constantes o variables.
Constantes: Son aquellos datos cuyos valores no
cambian durante la ejecucin de un programa.
Variables: Son datos que cambian durante la
ejecucin.
11
21
Pseudo cdigo
Lenguaje informal que ayuda a desarrollar
algoritmos.
No es ejecutado en computadores, similar al
lenguaje hablado.
Nos ayuda a pensar un programa antes de
escribirlo:
Fcil de convertirlo al programa correspondiente
en C
Consiste slo de sentencias ejecutables.
22
Ejemplo
Escribir programa para determinar la velocidad
de un auto
Cules son las entradas?
Cules son las salidas?
Cul es el algoritmo?
12
23
Desarrollo
Cules son las entradas?
Punto de Partida
Punto de llegada
Tiempo transcurrido en horas, minutos y segundos
Cules son las salidas?
Velocidad del auto
Que debe calcular el algoritmo?
Distancia total recorrida DT=PLL-PP
Tiempo transcurrido TT=HoraF+(MinF/60)+(SegF/3600)
Velocidad V=DT/TT
24
Estructuras de Control
13
25
Programacin Estructurada
Definicin:
Conjunto de tcnicas que incorpora un diseo
descendente (top-down), recursos abstractos y
estructuras bsicas.
Recursos Abstractos: Consiste en descomponer
acciones en forma cada vez ms simples.
Estructuras Bsicas : Consiste en ir refinando los
niveles.
Un programa puede ser escrito utilizando 3 estructuras de
control: Secuenciales, selectivas y repetitivas.
26
Es aquella en la cual una accin sigue a otra en forma
secuencial.
Estructuras de Control Secuencial
I ni ci o
acci n 1;
acci n 2;
.
acci n n;
Fi n
Diagrama de
Flujo
Diagrama NASSI-
SCHNEIDERMANN
accin 1
accin n
accin 2
.
accin 2
accin 1
accin n
14
27
Estructuras de Control Secuencial
Ejemplo:
Calcular la suma y el producto de 2 nmeros.
28
Estructuras de Control Selectivas
Selectivas:
Permiten realizar bifurcacin del programa a travs
de una toma de decisin. Pueden ser simples, dobles
o mltiples.
15
29
Simple (si/entonces)
Estructuras de Control Selectivas
SI condi ci n ENTONCES
acci n;
FI N SI
SI condi ci n ENTONCES
acci n_1;
.
acci n_n;
FI N SI
Diagrama de
Flujo
Diagrama NASSI-
SCHNEIDERMANN
accin
condicin
s
no
condicin
V F
accin
30
Estructuras de Control Selectivas
Ejemplo:
Mostrar los nmero positivos que se introducen por
teclado.
16
31
SI condi ci n ENTONCES
acci n_1;
SI NO acci n_2;
FI N SI
Diagrama de
Flujo
Diagrama NASSI-
SCHNEIDERMANN
accin 1
condicin
s no
condicin
V F
accin 1 accin 2
accin 2
Estructuras de Control Selectivas
Doble (si/entonces/sino)
32
Estructuras de Control Selectivas
Ejemplo:
- Determinar si un nmero entero es par o impar
- Buscar el mnimo de 3 nmeros enteros introducidos
por teclado.
17
33
Estructuras de Control Selectivas
Mltiple: Cuando se desea que existan ms de
dos decisiones (segn sea).
SEGUN SEA expr esi n HACER
CASO al t er nat i va_1:
<acci n 1; >
CASO al t er nat i va_2:
<acci n 2; >
.
CASO al t er nat i va_n:
<acci n n; >
FI N SEGUN
Diagrama de Flujo
accin 1
expresin
accin 2 accin n
1
2
n
34
Estructuras de Control Selectivas
Diagrama NASSI-
SCHNEIDERMANN
alternativa
1 2 . n
a
c
c
i

n
1
a
c
c
i

n
n
a
c
c
i

n
2
a
c
c
i

n
p
SEGUN SEA expr esi n HACER
CASO al t er nat i va_1:
<acci n 1; >
CASO al t er nat i va_2:
<acci n 2; >
.
CASO al t er nat i va_n:
<acci n n; >
FI N SEGUN
18
35
Estructuras de Control Selectivas
Ejemplo:
- Resolver ecuacin de 2 grado:
- Realizar un Men.
0
2
= + + c bx ax
36
Estructuras de Control Repetitivas
Repiten la ejecucin de un grupo de acciones
una cierta cantidad de veces.
19
37
Estructuras de Control Repetitivas
Mientras
MI ENTRAS condi ci n HACER
acci n
FI N MI ENTRAS
MI ENTRAS condi ci n HACER
acci n_1;

acci n_n;
FI N MI ENTRAS
Diagrama de
Flujo
Diagrama NASSI-
SCHNEIDERMANN
accin
condicin
s
no
accin
mientras condicin
38
Estructuras de Control Repetitivas
Ejemplo:
- Calcular la potencia de un nmero
- Calcular el sumatorio de los primeros 20 naturales.
- Contar los nmeros positivos introducidos por teclado.
20
39
Estructuras de Control Repetitivas
Repetir: Permite repetir una accin o un bloque
de acciones mientras la condicin sea
verdadera.
REPETI R
acci n;
HASTA condi ci n;
Diagrama de
Flujo
Diagrama NASSI-
SCHNEIDERMANN
accin
condicin
s
no
accin
mientras condicin Repetir condicin
40
Repeticin
Ejemplo:
- Calcular n!
- Determinar si un nmero es perfecto (la suma de sus
divisores es igual a l mismo):
6 =3+2+1
28 =1+2+4+7+14
21
41
Estructuras de Control Repetitivas
Desde/Para: Cuando se conoce de antemano el
nmero de veces que se quiere repetir el ciclo.
DESDE variable=inicio
HASTA valor_final
HACER
accin;
FIN DESDE
Diagrama de
Flujo
Diagrama NASSI-
SCHNEIDERMANN
accin
accin
mientras condicin
Variable:=
inicio,condicin,incremento
Variable:=inicio,
condicin,incremento
42
Repeticin
Ejemplo:
- Calcular la suma de los primero 20 naturales.
- Calcular la siguiente serie:

=
n
i
i
1
1
22
43
Lenguaje de
Programacin C
44
Acerca de C
C fue desarrollado por Brian Kernighan y Dennis Ritchie
en los laboratorios Bell.
Valores son guardados en variables
Programas son estructurados por funciones.
Flujo de Control es controlado usando bucles,
sentencias y llamadas a funciones.
Entrada y Salida son dirigidas a archivos o al terminal.
Datos son almacenados juntos en arreglos o
estructuras.
C permite un control ms preciso de entradas y salidas
Programas pequeos mas eficientes
C es un lenguaje amigable
ANSI C es proclamado la versin estndar del lenguaje.
23
45
Historia
1967, Martin Richard crea el lenguaje BCPL
1970, Ken Thompson crea el lenguaje B.
Transportable.
Lenguaje evolucionado e independiente de la mquina.
1972, Dennis Ritchie y Brian Kernighan en los Laboratorios Bell de
AT&T creanel lenguaje C modicando el lenguaje B. Reescriben
Unix en C.
Se disean tipos y estructuras de datos.
Incluye punteros y funciones.
Riqueza de operadores.
1983, el instituto de estndares americano (ANSI) crea un estndar
que definiera el lenguaje C.
1990, el estndar es adoptado.
46
UNIX
Sistema UNIX fue escrito en C.
C fue inventado especficamente para
implementar UNIX.
Todos los comandos de UNIX mas todas las
facilidades tales como revision de password,
colas de impresin, o controladores de
dispositivos son escritos en C.
Poderosos sistemas pueden ser creados al
escribir en C y utilizando las bibliotecas del
sistema UNIX.
24
47
Usando C y UNIX
Conocimiento previo.
Ciclo:
Escribir el programa en un archivo
Compilar el programa
Ejecutar el programa
Durante el desarrollo del programa, el
programador puede repetir el ciclo muchas
veces, refinando, probando, y depurando hasta
alcanzar el comportamiento deseado.
48
Escribir, Compilar, ejecutar el Programa
UNIX espera que su programa sea guardado en
un archivo cuyo nombre finaliza en .c
Para editar, utilizar un editor como jed, joe
emacs, o vi
>>vi prueba.c
Para Compilar se utiliza un compilador de la
forma:
>>cc prueba.c o prueba
Para ejecutar bajo UNIX se debe escribir:
>>prueba o >>./prueba
Compilador de UNIX
25
49
Traductores
Traducen el lenguaje de alto nivel a lenguaje de
mquina.
Se refieren a la forma en que se ejecuta el
programa
Interpretes: lee el cdigo de un programa lnea a
lnea realizando las instrucciones.
Compiladores: lee el programa entero y lo convierte
en cdigo objeto que puede ser ejecutado por la
maquina directamente.
50
Ejemplo
/* Programa Hola Mundo*/
#include <stdio.h>
int main( )
{
printf(Hola Mundo!!!");
return ( ) ;
}
mipc>>gcc hello.c
mipc>> ./a.out
a.out
Compilar
Compilador
(gcc)
Programa
hola.o
Cdigo
Objeto
Enlace
Enlazador
hola.c
Ejecutable
26
51
Programa ejecutable
Hay que seguir los siguientes pasos para
obtener un programa ejecutable:
Programa
Fuente
Compilador
Programa
Objeto
Enlace Libreras
Programa
Ejecutable
52
Compiladores C
Para el sistema operativo Linux:
lcc
gcc
Para el sistema operativo Windows:
Turbo C/C++
Borland C/C++
Visual C++
Editores de texto para Linux:
jed, emacs, joe, vi.
27
53
Decl ar aci ones gl obal es
f 1( )
{
var i abl es l ocal es
secuenci a de sent enci as
}
.
.
.
f N( )
{
var i abl es l ocal es
secuenci a de sent enci as
}
mai n( ) {
var i abl es l ocal es
secuenci a de sent enci as
}
Estructura de un programa
54
Estructura de un programa
Todos los programas en C consisten en una o
ms funciones.
La nica funcin que debe estar absolutamente
presente es la denominada main() , siendo la
primera funcin que es llamada cuando
comienza la ejecucin del programa.
28
55
Tipos, Operadores y
Expresiones.
56
Introduccin
Variables y Constantes son los objetos de datos
bsicos manipulados en un programa.
Las declaraciones establecen las variables a ser
usadas, su tipo y su valor inicial.
Operadores especifican que se hace con las
variables.
Expresiones combinan variables y constantes
para producir nuevos resultados.
29
57
Nombres de Variables
Nombres son hechos de letras y dgitos.
El smbolo _cuenta como letra.
Letras maysculas y minsculas son diferentes.
Tradicionalmente se utiliza letras minsculas
para nombres de variables y letras maysculas
para nombres de constantes.
Nombres de palabras reservadas no pueden ser
utilizadas:
if, else, int, float, char, switch, case, while, do,
58
auto break case char const continue default
do double else enum extern float for
goto if int long register return short
signed sizeof static struct switch typedef union
unsigned void volatile while
Palabras reservadas
Es un identificador reservado para propsito especfico. No pueden
cambiarse. Siempre debe estar en minscula.
C tiene 32 palabras claves, 27 del estndar de Ritchie y Kernighan
y 5 aadidas por ANSI.
La lista completa de palabras reservadas de C estndar de ANSI:
30
59
Tipos de Variables
En C una variable debe ser declarada antes de
ser usada.
Pueden ser declaradas al comienzo de
cualquier bloque de cdigo, pero la mayora son
encontradas al comienzo de la funcin.
Una declaracin comienza con un tipo, seguido
por el nombre de una o mas variables.
int num=4, cel[20];/*Ver Tipos*/
Tipo Tipo Nombre Nombre
Asignaci Asignaci n n Comentario Comentario
60
Tipos de Variables
double i; Numero de punto flotante de
doble precisin
double
unsigned
int i;
Entero sin rango negativo,
mayor rango positivo
unsigned
long int i; Entero de tamao aumentado long
short int i; Entero de tamao reducido short
char a; Un byte de memoria suficiente
para guardar un caracter
char
float a=4.3; Numero Punto Flotante float
int a=3; Numero Entero int
31
61
Constantes
Son valores fijos que no pueden ser alterados por el
programa. Pueden ser de cualquier tipo de datos.
Una constante en C es slo la versin escrita de un
numero.
Ejemplo: 4, 3e5
Un carcter constante usualmente es solo un carcter
encerrado entre comillas simples a
Valor de un carcter constante es el valor numrico en
el conjunto de caracteres de la maquina.
backslash
\\
Null
\0
Tab
\t
Single quote \
Newline
\n
62
Constantes
Expresin Constante es una expresin que
involucra solo constantes
Son evaluadas en tiempo de compilacin
Ejemplo: #define MAX 1000
String constante es una secuencia de cero o
mas caracteres encerrado entre comillas tal
como Lenguaje de Programacion en C
Las comillas son delimitadores.
El carcter nulo \0 es automaticamente
colocado al final del string
32
63
Declaracin de constantes
Son valores fijos que no pueden ser alterados
por el programa. Pueden ser de cualquier tipo
de datos.
Ejemplo a \n 9 1 123 35000 123.23
Para declarar constantes se puede utilizar la
directiva #define.
Ejemplo
#define Maximo 1000
64
Tipo lista_de_variables;
Declaracin de variables
Todas las variables han de ser declaradas antes
de ser usadas y pueden cambiar su valor
durante la ejecucin del programa.
Forma:
tipo: debe ser un tipo de datos vlido de C-
lista_de_variables : puede consistir en uno o ms
identificadores separados por comas.
33
65
Declaraciones
Todas las variables deben ser declaradas antes
de ser usadas.
Una declaracin especifica un tipo y lista una o
mas variables de ese tipo.
int int a,b,c a,b,c; ;
int int a; a;
int int b; b;
int int c; c;
66
Variables Locales vs. Globales
Variables locales son declaradas dentro del
cuerpo de una funcin y slo pueden ser usadas
dentro de esa funcin.
Estar disponible para otras funciones slo si al
ser llamadas desde la funcin actual, son
pasados los valores de las variables.
Una variable global estar disponible para
todas las funciones.
Prcticas modernas de programacin
recomiendan no abusar del uso de estas
variables.
34
67
Nombre_de_variable = constante;
Inicializacin de variables
La asignacin se realiza usando el signo =,
donde la constante del lado derecho se asigna
al lado izquierdo.
68
Comentarios
Los comentarios en C va entre los smbolos /* y
*/.
Pueden ir ubicados en cualquier parte del
programa.
Ejemplo:

/* Este es un comentario */
...
35
69
Variables Externas
Cuando se utiliza desde una funcin en un archivo A
una variable declarada en un archivo B, debe declararse
en la funcin del archivo A como variable externa.
Archi vo A Archi vo A
Archi vo B Archi vo B
f0(){ f0(){
extern extern int int a; a;
...} ...}
f1(){ f1(){ } }
int int main main(){ (){ } }
int int a; a;
g1(){ g1(){
a=4 a=4; ;
... ...
} }
g2(){ g2(){

} }
int int main main(){ (){ } }
70
Variables Estticas
Son declaradas como Variables locales, pero su
declaracin es precedida por la palabra static
Puede ser accedida slo desde la funcin en
que fue declarada.
Inicializada slo una vez. No es destruida a la
salida de la funcin, sino su valor es
preservado, y estar disponible en la prxima
llamada a la funcin
int int f1(){ f1(){
static static int int a; a;
} }
int int main main(){ (){
f1(); f1();
} }
36
71
Arreglos
72
Arreglos
Los arreglos son una coleccin de variables del
mismo tipo.
Los elementos individuales son identificados por
un ndice entero.
En C el ndice comienza en cero y siempre es
escrito dentro de corchetes
Pueden ser de distintas dimensiones
37
73

Tipos de arreglos
Unidimensional Unidimensional
int int a[20]; a[20];
Bidimensional Bidimensional
Int Int a[6][7]; a[6][7];
Tridimensional Tridimensional
float float a[7][7][4]; a[7][7][4];
74
Arreglos
Si un arreglo es declarado en la funcin
principal main()tendra las dimensiones
incluidas.
Si no se desea tamao fijo se pueden utilizar
punteros.
Cuando se pasa un arreglo a una funcin, esta
ltima no necesita saber el tamao.
38
75
Operadores y Expresiones
76
Operaciones y Expresiones
Una de las Potencias de C es su amplio rango de
operadores necesarios.
Un operador es una funcin que es aplicada a valores
para dar un resultado.
Existen operadores aritmticos, comparacin de valores,
combinacin de estados lgicos y manipulacin de
dgitos individuales unitarios.
Los operadores y valores son combinados para formar
expresiones.
Sentencia de Asignacin:
Una expresin es evaluada y el resultado es guardado en una
variable y=a*x+b
39
77
Operadores Aritmticos
Acci n Oper ador
Rest o de di vi si n
ent er a
%
I ncr ement o ++
Decr ement o - -
Di vi si n /
Mul t i pl i caci n *
Subst r acci n -
Adi ci n +
78
Operadores Relacionales
Accin Operador
I gual ==
No i gual ! =
Menor que o i gual <=
Menor que <
Mayor que o i gual >=
Mayor que >
40
79
Operadores Lgicos
Accin Operador
Y &&
NO !
O ||
Y &&
0 1 0 0 1
0 1 1 1 1
1 1 0 1 0
1 0 0 0 0
!p p||q p&&q q p
Tabla de Verdad Tabla de Verdad
80
Valores booleanos?
Los valores lgicos o booleanos no tienen un
tipo especial.
Se puede utilizar cualquier tipo integral que
tenga un valor 0 representando falso y cualquier
otro valor representando el verdadero.
41
81
Precedencias
Si existen ms de un operador
perteneciente a un mismo
nivel, la prioridad va de
izquierda a derecha.
,
=, +=, -=, *=, /=
||
&&
==, !=
<, <=, >, >=
+, -
*, /, %
!, ++, --, -, (tipo)
()
(x>=10 && x<20) || x<5
If(!NULL) printf( );
82
Datos definidos por
usuario
42
83
Tipos de Datos Simples
Estndar:
char , i nt f l oat , doubl e, voi d.
Definido por usuario:
enum, st r uct .
84
Tipos de Datos Simples
Estndar
char
es un carcter (alfanumrico), ocupa 1 byte.
int
es un numero entero, ocupa 2 bytes.
[-32 768 , 32 767]
float
son nmeros con decimales y/o exponentes, ocupa 4 bytes.
[3.4e-38 , 3.4e38]
double
son nmeros con decimales y/o exponentes, ocupa 8 bytes.
[1.7e-308 , 1.7e308]
void
no posee valor, ocupa 0 bytes.
43
85
signed
unsigned
long
short
Modificadores de tipo
Se utiliza para alterar el significado del tipo base
para que se ajuste ms precisamente a las
necesidades de cada momento.
Predecede al tipo simple.
Modificadores:
86
Se usan para controlar las formas en que se
acceden o modifican las variables.
Las variables de tipo const no pueden ser
cambiadas durante la ejecucin del programa.
Ejemplo:
const
const int cuenta = 100;
Modificadores de acceso
44
87
Tipos de Datos Simples Estndar
Ejemplo:
void main(){
/*Declaracin de las variables*/
int n1,n2;
float r;
char ch;
unsigned int a;
const char p=a;
/*Realizar algo con la variables*/
}
88
Conversin de tipos
Cuando en una expresin se mezclan
constantes y variables de un mismo tipo y
variables de distinto tipos, se convierten a un
tipo nico.
El compilador C convierte todos los operandos
al tipo del mayor operando.
45
89
Conversin de tipos
Se pueden mezclar los tipos de valores en expresiones
aritmticas
Valores pasados a funciones como argumentos debe
ser del tipo correcto
Si los tamaos son diferentes:
El resultante adoptara el tamao mayor
No hay problema en asignar un valor a una variable de
diferente tamao.
Excepciones:
La variable es demasiado pequea para sostener el valor.
CORRUPTO
Si la variable es tipo entera y se le asigna un valor real, el valor
es redondeado.
90
Conversin de tipos
Regla:
Cualquier char y long int es convertido a int. Cualquier float es
convertido a double.
Para todos los pares de operandos, si uno de los operandos es
long double, el otro operando se convierte a long double.
Si no, si un operando es double, entonces el otro se convierte a
double.
Si no, si un operando es long, entonces el otro se convierte a
long.
Si no, si un operando es unsigned, entonces el otro se convierte
a unsigned.
46
91
Conversin de tipos, Ejemplo
char ch;
i nt i ;
f l oat f ;
doubl e d;
r esul t = ( ch / i ) + ( f * d) - ( f + i ) ;
i nt doubl e doubl e
i nt doubl e doubl e
doubl e
doubl e
92
Sirven para forzar que una variable sea de un
cierto tipo.
Forma general:
Ejemplo:
(tipo)expresin
int i;
float x;

x=(float) i/1;
Cast (forzado de tipos)
47
93
struct
union
enum
Tipos definidos por el usuario
El usuario puede definir sus propio tipos de
datos, para ello puede utilizar:
94
Una enumeracin es un conjunto de constantes enteras
con nombres que especifica todos los valores vlidos
que una variable de ese tipo puede tener.
Declaracin:
Ejemplo:
enum etiqueta {lista_de_enumeraciones} lista_de_variables;
enum moneda {penique, niquel, dime, cuarto, medio_dlar, dolar };
enum moneda dinero; /*declara la variable dinero de tipo moneda*/

dinero=dime; /*Asigna el valor dime a dinero*/


dinero=3; /*Asigna el valor cuarto a dinero*/
Enumeraciones
48
95
Shorthand
i=i%10 i%=10
i=i/10 i/=10
i=i*10 i*=10
i=i+10 i+=10
i=i-1 i-- o --i
i=i+1 i++o ++i
Equivalente Shorthand
96
I/O
49
97
Es importante tener en cuanta que el signo =
es utilizado para asignar un valor a la variable y
== es utilizado para comparar dos variables.
Modo de uso:
Variable_destino=var_1 operador var_2 operador var_3 ..
Asignaciones
98
Entrada/Salida
Para utilizar la entrada y salida de datos por teclado y pantalla
respectivamente se debe incorporar la librera:
Las instrucciones utilizadas para la salida de datos por pantalla
es:
Las instrucciones utilizadas para la entrada de datos por el
teclado es:
#include <stdio.h>
printf()
scanf()
50
99
printf()
Uso:
printf(const char *cadena, {lista de_variables};
Cdigo Formato
%c Un ni co car ct er
%d Deci mal
%i Deci mal
%e Not aci n ci ent f i ca
%f Deci mal en punt o f l ot ant e
%g Usar el %eo %f , el ms cor t o.
%o Oct al
%s Cadena de car act er es.
%u Deci mal es si n si gno
%x Hexadeci mal es
%% I mpr i me %
%p Muest r a un punt er o
100
printf()
Cdigo Significado
\ b Espaci o at r s
\ f Sal t o de pgi na
\ n Sal t o de l nea
\ r Ret or no de car r o
\ t Tabul aci n hor i zont al
\ " Comi l l as dobl es
\ ' Comi l l a si mpl e
\ 0 Nul o
\ \ Bar r a i nver t i da
\ v Tabul aci n ver t i cal
\ a Al er t a
\ o Const ant e oct al
\ x Const ant e hexadeci mal
51
101
scanf()
Uso:
scanf(const char *cadena, {&lista de_variables};
Cdigo Formato
%c Un ni co car ct er
%d Deci mal
%i Deci mal
%e Not aci n ci ent f i ca
%f Deci mal en punt o f l ot ant e
%g Usar el %eo %f , el ms cor t o.
%o Oct al
%s Cadena de car act er es.
%u Deci mal es si n si gno
%x Hexadeci mal es
%% I mpr i me %
%p Muest r a un punt er o
102
Ejemplo
#include <stdio.h>
void main(){
int entero;
float real;
char ch;
printf (Ingrese los siguientes datos: \n);
printf (Ingrese un entero:\t);
scanf (%d,&entero);
printf (\nIngrese un real y un carcter:\t);
scanf (%f %c,&real, &ch);
printf (\nLos valores ingresados son: %d %f %c, entero,
real, ch);
}
52
103
Arreglos
104
Arreglos
Es posible declarar un arreglo de varios
elementos.
La declaracin int a[10]; declara un arreglo
llamado a, de 10 elementos de tipo entero.
Un arreglo es una variable que puede sostener
ms de un valor.
Para referirse a uno de los elementos se utiliza
un subndice.
Los arreglos son similares a las matrices en
matemticas.
53
105
Representacin
En C, los arreglos tienen base 0, los diez
elementos de un arreglo son numerados desde
el 0 al 9.
El primer elemento de un arreglo es a[0], el
segundo es a[1],
a[0] =10; a[1] =20; a[2] =a[0] +a[1];
106
Asignacion de Valores
Para inicializar los elementos de un arreglo a algn
valor, debe hacerse uno a uno.
Para copiar el contenido de un arreglo a otro debe
copiarse cada elemento uno a uno.
Recordar que en a[10] no existe el elemento a[10] sino
hasta a[9].
int b[10];
for(i =0; i <10; i =i +1)
b[i] =a[i];
int b[10];
b =a;
54
107
Problema
Queremos investigar el comportamiento de
lanzar dos dados. El valor estar entre el rango
2 a 12, y queremos contar cuan a menudo cada
valor sale. Utilizar arreglo.
La funcin rand() es un generador de numeros
aleatorios. Se necesita la librera stdlib.h.
La expresin rand()%6 +1 retornar valores
entre 1 y 6.
108
Posible Solucin
#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>
mai n( ) {
i nt i ;
i nt d1, d2;
i nt a[ 13] ;
f or ( i = 2; i <= 12; i = i + 1)
a[ i ] = 0;
f or ( i = 0; i < 100; i = i + 1) {
d1 = r and( ) %6 + 1;
d2 = r and( ) %6 + 1;
a[ d1 + d2] = a[ d1 + d2] + 1;
}
f or ( i = 2; i <= 12; i = i + 1)
pr i nt f ( "%d: %d\ n" , i , a[ i ] ) ;
r et ur n 0;
}
55
109
Comandos de Control
de Flujo
110
Introduccin
Control de flujo de un lenguaje especifica el orden en que se
ejecutan los cmputos.
Bsicamente son los pasos de un programa.
La mayora de las sentencias calculan y asignan valores o llaman
funciones.
Por defecto una sentencia es ejecutada una despus de otra.
Sin embargo se puede modificar la secuencia por usar flujos de
control donde un grupo de sentencias son ejecutadas solo si alguna
condicin es verdadera. O ejecutada una y otra vez en un bucle.
Otro tipo de control de flujo ocurre cuando se llama una funcin; el
llamador es suspendido mientras la funcin llamada procede.
Una sentencia es un elemento dentro de un programa que puede
aplicrsele control de flujo.
Controlar el flujo significa especificar el orden de las sentencias.
56
111
Sentencias y Bloques
Una expresi expresi n n tal como tal como a=9 o printf()
es una sentencia sentencia cuando es seguida por un
punto y coma ;.
En C, el punto y coma es un terminador de
sentencias.
Las llaves {}son usadas para agrupar
declaraciones y sentencias juntas en un bloque.
a=9;
pr i nt f ( \ n %d, 3) ;
f ( ) {
a=9;
pr i nt f ( \ n %d, 3) ;
}
112
Estructuras de Control
(E.C.)
57
113
Es aquella en la cual una accin sigue a otra en forma
secuencial.
E.C. Secuencial
Diagrama de
Flujo
Diagrama NASSI-
SCHNEIDERMANN
accin 1
accin n
accin 2
.
accin 2
accin 1
accin n
void main(){
accin 1;
accin 2;
.
accin n;
}
114
Sentencias para Decisin y Control
Condicionales y Seleccin
if
If-else
Switch
bucles:
for
while
do while
continue y break
goto
58
115
Es aquella en la cual una accin sigue a otra en forma
secuencial.
E.C. Secuencial
Diagrama de
Flujo
Diagrama NASSI-
SCHNEIDERMANN
accin 1
accin n
accin 2
.
accin 2
accin 1
accin n
void main(){
accin 1;
accin 2;
.
accin n;
}
116
Simple (if)
E.C. Selectivas
Diagrama NASSI-
SCHNEIDERMANN
Diagrama de
Flujo
accin
condicin
si
no
condicin
V F
accin
if (condicin)
accin;
if (condicin){
accin_1;
.
accin_n;
};
59
117
Diagrama de
Flujo
Diagrama NASSI-
SCHNEIDERMANN
accin 1
condicin
s no
condicin
V F
accin 1 accin 2
accin 2
E.C. Selectivas Dobles
Doble (si/entonces/sino)
if (condicin)
accin_1;
else accin_2;
118
if - else
La sentencia if else es utilizada para tomar
decisiones.
if(expresion)
sentencia_1;
else
senencia_2;
Parte
opcional
Expresin
es evaluada
Si la evaluacin es
verdadera (distinta de
cero), sentencia_1 es
ejecutada, si es falsa
(expresin es 0) entonces
la sentencia_2 es hecha.
if if prueba el valor numrico
de una expresin
60
119
Condicionales
Sentencia if, if else
if (expresion_condicional) sentencia
if (expresion_condicional) sentencia
else sentencia
Condicional Binaria con una secuencia de sentencias:
if(expresion_condicional){
secuencia_de_sentencia
}
if(expresion_condicional){
secuencia_de_sentencia
}
else{
secuencia_de_sentencias
}
120
Ejemplo
/ *Di vi di r el pr i mer numer o por el
segundo*/
#i ncl ude <st di o. h>
voi d mai n( ) {
i nt a, b;
pr i nt f ( I nt r oduce dos numer os) ;
scanf ( %f %f , &a, &b) ;
i f ( b! =0) pr i nt f ( z/ b=%d, a/ b) ;
el se pr i nt f ( di vi si on por cer o) ;
}
61
121
/ *Di vi di r el pr i mer numer o por el
segundo*/
#i ncl ude <st di o. h>
voi d mai n( ) {
i nt a, b;
pr i nt f ( I nt r oduce dos numer os) ;
scanf ( %f %f , &a, &b) ;
i f ( b) pr i nt f ( z/ b=%d, a/ b) ;
el se pr i nt f ( di vi si on por cer o) ;
}
122
If acepta cualquier expresin
i nt k=1;
i f ( k=0)
pr i nt f ( es un cer o) ;
el se
pr i nt f ( es %d, k) ;
62
123
E.C. Selectivas Anidadas
IF anidados:
if (condicin_1)
if (condicin_2)
accin_1;
else
accin 2;
else
if (condicin_3)
accin_3;
else
accin_4;
Diagrama de
Flujo
condicin
1
s no
accin 3
condicin
3
s
no
accin 4
accin 1
condicin
2
s
no
accin 2
124
Anidamiento if-else
if(n>0)
if(a>b)
z=a;
else
z=b;
...
elsese asocia con el if
precedente (ms interno).
Si no se desea lo anterior,
se deben usar llaves
if(n>0){
if(a>b)
z=a;
}
else
z=b;
...
? ?
if(n>0)
for(i=0;i<n;i++)
if(a>b){
z=a;
...
}
else
printf(n es negativo);
...
??? Cual es el error ??? Cual es el error
bug bug
Que supuso el Que supuso el
programador? programador?
63
125
Anidamiento
i f ( c1) {
i f ( c2) sent enci a_1; / / c1 y c2
i f ( c3) sent enci a_2; / / c1 y c3
el se sent enci a_3; / / c1 y no c3
}
el se sent enci a_4; / / no c1
126
Ejemplo: identificar el valor rango numero
i f ( x>=0) { / / x es no- negat i vo
i f ( x<10) / / y x<10
pr i nt f ( 0<=%d<10, x) ;
el se{
i f ( x>15) / / ent r e 10 y 15
pr i nt f ( 10<=%d<15, x) ;
}
}
el se{
pr i nt f ( x es negat i vo) ; }
64
127
Diagrama Comportamiento
128
Evaluacin de Circuitos
Tan pronto como una expresin compuesta
determine completamente el valor de la
expresin total, la evaluacin se detendr.
Ejemplo:
i f ( n! =0)
i f ( 0<x&&x<1/ n) sent enci a
Mas eficiente
i f ( ( n! =0) && 0<x && x<1/ n)
sent enci a
65
129
if else if
i f ( condi ci on)
sent enci a;
el se
i f ( condi ci on)
sent enci a;
el se
i f ( condi ci on)
sent enci a;
. . .
el se sent enci a;
Una est r uct ur a i f el se ani dados
130
Estructura if else con nica sentencia
i f ( condi ci on)
sent enci a;
el se i f ( condi ci on)
sent enci a;
el se i f ( condi ci on)
sent enci a;

el se
sent enci a;
66
131
Ejemplo
if(x<0)
//xes negativo
else if(x>0)
//x es positivo
else //x es cero
132
if else con secuencia de sentencias
i f ( condi ci on) {
secuenci a_sent enci as;
}el se{i f ( condi ci on) {
secuenci a_sent enci as;
}
. . .
el se{
secuenci a_sent enci as;
}
67
133
E.C. Selectivas
Mltiple: Cuando se desea que existan ms de
dos decisiones (segn sea).
Diagrama de Flujo
CASE:
switch (alternativa) {
case alternativa_1:
<accin 1;>
case alternativa_2:
<accin 2;>
break;
.
case alternativa_p:
<accin p;>
default:
accin_n;
};
accin 1
expresin
accin 2 accin n
1
2
n
134
Switch
La sentencia switch es una multimanera especial de
tomar decisiones que prueba si una expresin toma
alguno de los valores constantes.
switch evala la expresin entera (integer) en
parntesis.
Cada caso debe ser etiquetado por un entero o carcter
constante o expresin constante.
El caso etiquetado por default (OPCIONAL) es
ejecutado si ninguno de los otros casos son satisfechos.
Los casos deben ser todos diferentes.
68
135
Sentencia Switch
switch ( )
Expresin
seleccion
{
}
constante
sentencia
default ;
sentencia
case
:
136
Estructura Switch
swi t ch( expr esi on_sel ecci on) {
case const ant e1:
secuenci a_sent enci a
br eak;
case const ant e2:
secuenci a_sent enci a
br eak;

def aul t :
secuenci a_sent enci a
}
69
137
Ejemplo
Contar dgitos, espacios en blancos y otros
caracteres.
138
Comparacin if-else vs. Switch-case
mai n( ) {
i nt c, i , n_bl anco, n_ot r o, n_di gi t ;
n_bl anco=n_ot r o=0;
f or ( i =0; i <10; ++i ) n_di gi t [ i ] =0;
whi l e( ( c=get char ( ) ) ! =EOF)
i f ( c>= 0 && c<= 9 )
++n_di gi t [ c- 0 ] ;
el se i f ( c== | | c== \ n | | c== \ t )
++ n_bl anco;
el se
++n_ot r o;
whi l e( ( c=get char ( ) ) ! =EOF)
swi t ch( c) {
case 0 : case 1 : case
2 : case 3 : case
4 : case 5 : case
6 : case 7 : case
8 : case 9 :
n_di gi t [ c- 0 ] ++;
br eak;
case :
case \ n :
case \ t :
n_bl anco++;
br eak;
def aul t :
n_ot r o++;
br eak;
}
printf(digitos=);
for(i=0;i<10;i++)printf(%d,n_digit[i]);
70
139
Switch - Case
break causa una salida inmediata del switch.
140
Ciclos
71
141
Ciclos Haciendo cosas una y otra vez
Ciclos son estructuras de control que repiten
una serie de sentencias sin tener que reescribir
Ciclos son usados comunmente para:
Contar
Sumar
Repetir multiplicaciones, incrementar, decrementar
Mantener un registro de los valores
Mantener una secuencia de comandos o acciones
142
Definiciones
Entrada ciclo: sentencia antes de entrar al ciclo
Cuerpo del ciclo: sentencias que son repetidas
Condicin del ciclo: expresin a ser evaluada en
orden de decidir si es que una nueva repeticin
debera ser ejecutada.
Salida del ciclo: fin del ciclo, donde el flujo de
control deja el ciclo
72
143
Vista Abstracta
Cuando se escribe una instruccin de
repeticin se debera tener en consideracin:
Entrada: las condiciones bajo las cuales se
entra al ciclo
Continuar: condiciones para las cuales se
debera continuar en el ciclo
Exit: las condiciones bajo las cuales se quiere
salir del ciclo
144
Estructura General del Ciclo
Prueba 1
Antes
Prueba 2
Despus
Cuerpo
Ciclo
si
no
si
no
73
145
Las tres condiciones de ciclo
Para entender como construir un ciclo
correctamente, con la condicin relacionada al
cuerpo del ciclo se debe considerar:
Condicin de Entrada: debe cumplirse para que el
cuerpo sea ejecutado
Despus de entrar al ciclo y ejecutar las
sentencias pertenecientes al cuerpo, como
saber si se sigue o no?
Condicin de Repetir o continuar. Si es verdadera la
evaluacin se queda en el ciclo
Condicin de termino o salida: sale si la evaluacin
de la condicin es verdadera.
146
Patrones de Ciclos
74
147
Ciclo Pre- Test (con condicin de entrada)
f or ( n=0; n<10; n++)
{ . . . }
n=0;
whi l e( n<10)
{. . . n++; . . . }
Pre-Prueba
Entrada/repetir?
Cuerpo
Ciclo
si
no
148
Ciclo Post- Test (con condicin de salida)
n=0;
do{
. . . n++; . . .
} whi l e( n<10) ;
no
Repetir?
Cuerpo
Ciclo
si
75
149
E.C. Repetitivas
Repiten la ejecucin de un grupo de acciones
una cierta cantidad de veces.
150
E.C. Repetitivas
Diagrama de
Flujo
accin
Variable:=
inicio,condicin,incremento
FOR
for (inicializacin; condicin;
incremento )
accin;
for (inicializacin; condicin;
incremento ){
acciones;
}
FOR: Cuando se conoce de antemano el nmero de veces que se
quiere repetir el ciclo.
76
151
FOR: Cuando se conoce de antemano el nmero de veces que se
quiere repetir el ciclo.
Diagrama NASSI-
SCHNEIDERMANN
accin
mientras condicin
Variable:=inicio,
condicin,incremento
FOR
for (inicializacin; condicin;
incremento )
accin;
for (inicializacin; condicin;
incremento ){
acciones;
}
E.C. Repetitivas
152
for
f or ( expr 1; expr 2; expr 3)
sent enci a
expr1 y expr 3 son
asignaciones o llamadas a
funciones.
Expr2 es una expresin
relacional.
expr 1;
whi l e( expr 2) {
sent enci a
expr 3;
}
77
153
for (continuacin)
f or ( ; ; ) {
. . .
}
Si expr2 no esta presente
se considera siempre
verdadero bucle
infinito, unica salida break
o return
154
Ciclo for (Repeticin Fija)
Repitiendo una nica sentencia
f or ( ent r ada; pr ueba_sal i da; i n_de_cr ement o)
sent enci a;
Repitiendo secuencias de sentencias
f or ( ent r ada; pr ueba_sal i da; i n_de_cr ement o) {
secuenci a_sent enci a;
} Pre-Prueba
Cuerpo
Ciclo
si
no
Generalmente, ciclos for son
controlados por contador
78
155
Calcular los nmeros fibonacci
f 0=0
f 1=1
f n=f n- 1+f n- 2
f 2=f 1+f 0=1+0=1
f 3=f 2+f 1=1+1=2
f 4=f 3+f 2=2+1=3
f 5=f 4+f 3=3+2=5
f 6=f 5+f 4=5+3=8
f 7=f 6+f 5=8+5=13
156
Desarrollo
/ *Cal cul ar el n- esi mo numer o
f i bonacci */
i nt pr ev_f i b=0; / / =f n- 2
i nt act ual _f i b=1; / / =f n- 1
i nt pr ox_f i b; / / =f n
i nt n, i ;
mai n( ) {
pr i nt f ( Numer os Fi bonacci \ n) ;
pr i nt f ( I nt r oduce numer o n >=0: ) ;
scanf ( %d, n) ;
79
157
Dearrollo(2)
f or ( i =0; i <n; i ++) {
pr ox_f i b=act ual _f i b+pr ev_f i b;
pr ev_f i b=act ual _f i b;
act ual _f i b=pr ox_f i b;
}
pr i nt f ( el %d- esi mo f i bonacci es
%d, n, pr ev_f i b) ;
r et ur n 0;
}
158
Variaciones en el ciclo for
Distintas expresiones de inicializaciones e
incrementos
f or ( x=0, y=0; x<=10; ++x, - - y)
pr i nt f ( x=%d, y=%d\ n, x, y) ;
Sal i endo del ci cl o cuando se
pr esi one una t ecl a ( f unci on kbhi t ( ) )
kbhi t ( ) r et or na ver dader o ( es deci r
di st i nt o de cer o) si una t ecl a es
pr esi onada, si no r et or na 0, es deci r
f al so
80
159
Ejemplo
i nt mai n( ) {
i nt i ;
/ *i mpr i mi r numer os hast a que se
pr esi one l a t ecl a*/
f or ( i =0; ! kbhi t ( ) ; i ++)
pr i nt f ( %d , i ) ;
r et ur n 0;
}
160
Repeticin
Tarea:
Calcular la suma de los primero 20 naturales.
Calcular la siguiente serie:

=
n
i
i
1
1
81
161
E. C. Repetitivas
Mientras
Diagrama de
Flujo
Diagrama NASSI-
SCHNEIDERMANN
accin
condicin
s
no
accin
mientras condicin
WHILE
while (<condicin>)
accin;
while (<condicin>){
accin_1;

accin_n;
}
162
Ciclo While
Simple sentencia a repetir
whi l e( expr esi on) sent enci a;
Secuencia de sentencias a repetir
whi l e( expr esi on) {
secuenci a_sent enci a
}
Generalmente, ciclo while son
controlados por eventos.
Pre-Prueba
Cuerpo
Ciclo
si
no
82
163
While
while(expresion)
sentencia
Expresin es evaluada
Si es no-cero
sentencia es ejecutada.
Este ciclo continua hasta
que la expresin se hace
cero.
164
Fibonacci con Ciclos While
i nt pr ev_f i b=0; / / =f n- 2
i nt act ual _f i b=1; / / =f n- 1
i nt pr ox_f i b; / / =f n
i nt n, i ;
mai n( ) {
pr i nt f ( Numer os Fi bonacci \ n) ;
pr i nt f ( I ngr ese numer o n >=0: ) ;
scanf ( %d, n) ;
83
165
whi l e( i <n) {
pr ox_f i b=act ual _f i b+pr ev_f i b;
pr ev_f i b=act ual _f i b;
act ual _f i b=pr ox_f i b;
i ++;
}
pr i nt f ( el %d- esi mo f i bonacci es
%d, n, pr ev_f i b) ;
r et ur n 0;
}
166
Cdigo mas eficiente
whi l e( i ++<n) {
pr ox_f i b=act ual _f i b+pr ev_f i b;
pr ev_f i b=act ual _f i b;
act ual _f i b=pr ox_f i b;
}
Precauciones
mai n( ) {
i f ( n==0 | | n==1) {
pr i nt f ( f i bonacci de %d es %d, n, n) ;
r et ur n 0;
}whi l e( ) {}r et ur n 0; }
84
167
Ms Precauciones
mai n( ) {
i f ( n<=1) {/ / casos especi al es
pr i nt f ( f i bonacci de %d es
%d, n, n) ;
}
el se{
whi l e( ) {}
}
r et ur n 0;
}
168
E.C. Repetitivas
Repetir: Permite repetir una accin o un bloque de acciones hasta
que la condicin sea verdadera.
Diagrama de
Flujo
Diagrama NASSI-
SCHNEIDERMANN
accin
condicin
s
no
accin
mientras condicin Repetir condicin
DO/WHILE
do{
accin;
}while (condicin);
85
169
do while
nica sentencia
do sent enci a; whi l e( expr esi on) ;
Secuencia de Sentencias a repetir
do{
sent enci as
}whi l e( expr esi on) ;
Un ciclo do-while siempre completa una iteracin
Repetir?
Cuerpo
Ciclo
si
170
do - while
do{
sent enci a
. . .
}whi l e( expr esi on) ;
cuer po
La condicin de
finalizacin est al final
del bucle.
El cuerpo es ejecutado al
menos una vez.
Primero la sentencia es
ejecutada y luego la
expresin evaluada.
86
171
Ejemplo
/ / i ni ci al i zaci on
voi d mai n( ) {
pr i nt f ( I ngr ese numer o n >0: ) ;
scanf ( %d, n) ;
do{
pr ox_f i b=act ual _f i b+pr ev_f i b;
pr ev_f i b=act ual _f i b;
act ual _f i b=pr ox_f i b;
} whi l e( i ++<n)
pr i nt f ( el %d- esi mo f i bonacci es %d, n,
( n==0) ?0: pr ev_f i b) ;
}
172
Ciclo Infinito
Usando for
f or ( ; ; ) {}
Usando while
whi l e( 1) {}
87
173
Entrada de Teclado
whi l e( 1) {
pr i nt f ( cont i nua( s/ n) \ n) ;
scanf ( %c, &r espuest a) ;
swi t ch( r espuest a) {
case s : case S : br eak;
case n : case N :
pr i nt f ( Pr ogr ama t er mi na\ n) ;
r et ur n 0;
def aul t :
pr i nt f ( I ngr ese sol o y o n \ n) ;
}
}
174
break vs. continue
break:
Permite controlar las salidas de los bucles.
Provee una salida temprana para for, while, do,
switch.
continue:
Es utilizada cuando la parte del bucle que sigue es
complicada.
Provoca la prxima iteracin del bucle cerrado a ser
ejecutado inmediatamente.
88
175
Break
f or ( i =0; i <1000; i ++) {
/ / hacer al go
i f ( kbhi t ( ) ) br eak;
}
176
Alternativa con bucle infinito
f or ( ; ; ) {
/ / hacer al go
i f ( kbhi t ( ) ) br eak;
}
whi l e( 1) {
/ / hacer al go
i f ( kbhi t ( ) ) br eak;
}
Repetir?
Cuerpo
Ciclo
si
89
177
Usando break para salir de ciclos
i nt mai n( ) {
i nt t , cont ;
f or ( t =0; t <100; t ++) {
cont =1;
f or ( ; ; ) {
pr i nt f ( cont ador =%d, cont ) ;
cont ++;
i f ( cont ==10) br eak;
}
pr i nt ( \ n) ;
r et ur n 0;
}
178
Usando continue
Continue es usado para saltar un ciclo
i nt mai n( ) {
i nt x;
f or ( x=0; x<=100; x++) {
i f ( x%2) cont i nue;
pr i nt f ( x=%d, x) ;
}
r et ur n 0;
}
90
179
Ejemplo continue
Sumar valores positivos.
Valores negativos
saltarlos.
#def i ne N 10;
. . .
i nt a[ N] , S;
. . .
f or ( i =0; i <N; i ++) {
i f ( a[ i ] <0)
cont i nue;
S+=a[ i ] ;
. . .
}
180
goto
Requi er e una et i quet a par a l a
oper aci on
x=1;
st ar t :
x++;
secuenci a_sent enci as
i f ( x<100) got o st ar t ;

f or ( x=1; x<100; x++) {secuenci a de


sent enci as}
91
181
Guas para construir bucles
Como disear ciclos
Proceso
Cual es el proceso a repetir
Como debera inicializarse
Como debera actualizarse
Condicin
Como debera inicializarse
Como debera actualizarse
Cual es la condicin de termino
Despus del Ciclo
Cual es el estado del programa al salir del ciclo
182
Guas para escoger bucles
Si el proceso es repeticin, se necesita un
simple contador de ciclos
For(cont=1;cont<=10;cont++)
//sentencias;
Es equivalente a
cont=1;
while)(cont<=10){
//sentencias;
cont++;
}
92
183
Otros
184
if else ()? :
Otra manera de escribir if
else para ejecuciones
simples es :
l ong i nt absol ut o( l ong i nt a) {
i f ( a<0) r et ur n - a;
r et ur n a;
}
l ong i nt absol ut o( l ong i nt a) {
a=( a<0) ?- a: a;
r et ur n a;
}
93
185
Imprimir nmeros primos entre 1 y 100
#i ncl ude <st di o. h>
#i ncl ude <mat h. h>
mai n( ) {
i nt i , j ;
pr i nt f ( " %d\ n" , 2) ;
f or ( i = 3; i <= 100; i = i + 1) {
f or ( j = 2; j < i ; j = j + 1) {
i f ( i %j == 0) br eak;
i f ( j > sqr t ( i ) ) {
pr i nt f ( " %d\ n" , i ) ;
br eak;
}
}
} r et ur n 0;
}
186
Problema
El gerente de Ventas de una cadena de supermercados tiene que
realizar un estudio respecto al volumen de ventas de 20 productos.
Estos productos son vendidos en cada uno de los 10 locales que
posee la cadena. Para cada local se requiere registrar el total de
unidades vendidas de cada uno de los 20 productos durante el mes.
Utilizando un arreglo ventas ventas de 10x20 elementos que contenga las
unidades vendidas en cada uno de los 10 locales de cada uno de los
20 productos, desarrolle un programa en C que permita:
Registrar/ingresar el nmero de unidades vendidas de cada
producto en cada uno de los locales.
Determinar el producto ms vendido y su volumen de ventas.
94
187
Posible Solucin
#i ncl ude<st di o. h>
mai n( ) {
i nt suma, max, i , j ,
mas_vendi do;
i nt vent as[ 10] [ 20] ;
f or ( i = 0; i < 10; i ++) {
f or ( j = 0; j < 10;
j ++) {
pr i nt f ( "I ngr ese
vent as del pr oduct o %d en
l ocal %d" , j , i ) ;
scanf ( " %d", &vent as[ i ] [ j
] ) ;
}
}
max = 0;
f or ( j = 0; j < 20; j ++) {
suma = 0;
f or ( i = 0; i < 10; i ++) {
suma += vent as[ i ] [ j ] ;
i f ( suma > max) {
max = suma;
mas_vendi do =
j ;
}
}
}
pr i nt f ( "El pr oduct o m as
vendi do es el %d con %d
uni dades" , mas_vendi do,
max) ;
}
188
Funciones
95
189
Funciones
Definicin:
Las funciones son los bloques constructores de C y el
lugar donde se da toda la actividad del programa.
Cundo se Utilizan?
La idea es Dividir y Conquistar, es decir, particionar
el problema en pequeas subtareas las cuales son
ms fciles de abordar.
Todo problema se puede resolver con funciones o sin
ellas, pero la aplicacin de stas hace el programa
ms eficiente, fcil de analizar y testear.
190
Funciones
Ventajas:
1.- Facilita el diseo descendente.
2.- Los procedimientos se ejecutan ms de una vez.
3.- Facilita la divisin de tareas.
4.- Se pueden comprobar(testear) individualmente
96
191
Prototipos de Funcin
Todas las funciones deben ser declaradas antes
de ser usadas.
Este requisito se cumple mediante la utilizacin
del prototipo
Prototipo especifica la interfaz de datos interfaz de datos de una
funcin por:
Tipo que retorna
El tipo de sus parmetros
El numero de sus parmetros
Ejemplo:
int cuadrado(int i); int cuadrado(int);
192
Uso de Prototipos
Objetivo:
Identificar el tipo de vuelta de la funcin.
Especificar el tipo y el nmero de argumentos que
utiliza la funcin.
El prototipo va cerca del principio del programa,
debiendo aparecer antes de que se haga
cualquier llamada a la funcin.
No es necesario incluir los nombres reales de
los parmetros.
97
193
Ejemplo 1, con Prototipo
#include <stdio.h>
int cuadrado(int x); /*Prototipo*/
main(){
int i,resultado;
for (i=0;i<10;i++){
resultado = cuadrado (i);
printf("\nEl cuadrado de %d es %d ",i,resultado);
}
return 0;
}
int cuadrado(int x){
int a;
a=x*x;
return a;
}
194
Ejemplo 2, con Prototipo
#include <stdio.h>
void intercambio(int *, int *) /*Prototipo*/
main(){
int a=5,b=3;
printf("\na=%d b=%d",a,b);
intercambio (&a,&b);
printf("\na=%d b=%d",a,b);
return 0;
}
void intercambio(int *x, int *y){
int temp;
temp=*x;
*x=*y;
*y=temp;
}
98
195
Forma General de la definicin de Prototipo
Definicin de Prototipos aparece antes que la
funcin es usada por el programa.
El prototipo es lo mismo que la funcin en s,
excepto que el cuerpo no est presente:
tipo tipo nombre_funcion nombre_funcion( ( tipo tipo nombre_ parametro1 nombre_ parametro1, ,
tipo tipo nombre_ parametro2 nombre_ parametro2, ,

tipo tipo nombre_ nombre_ parametroN parametroN); );
196
Compilador
El prototipo le provee informacin al Compilador
El compilador podr realizar las siguientes
operaciones:
Detectar diferencias entre el numero de argumentos numero de argumentos
usados para llamar una funcin y numero de
parmetros en la funcin
Encontrar y reportar cualquier conversin de tipo
ilegal entre el tipo de argumentos usados para llamar
una funcin y el tipo de definicin de sus parmetros
Que tipo de cdigo generar cuando una funcin es
llamada. Los tipos que retorna la funcin define un
manejo distinto por el Compilador.
99
197
Definiciones Funciones
tipo : especifica el tipo de valor que
devuelve la funcin. Si no se especifica tipo,
se asume que se devuelve un entero.
Nombre_parmetros : nombres de
variables separados por comas con sus tipos
asociados que reciben los valores de los
argumentos cuando se llama a la funcin.
tipo tipo nombre_funcion nombre_funcion( tipo ( tipo nombre_ parametro1 nombre_ parametro1, , ,tipo ,tipo nombre_ parametroN nombre_ parametroN){ ){
Cuerpo Cuerpo
} }
198
Ejemplo
f l oat cuadr ado( i nt i ) ;
voi d mai n( ) {
i nt i , x=10;
f or ( i =0; i <x; i ++) {
pr i nt f ( cuadr ado de
i =%f , cuadr ado( i ) ) ;
}
f l oat cuadr ado( i nt i ) {
r et ur n ( f l oat ( i *i ) ) ;
}
100
199
Reglamento de mbito para Funciones
Reglas de mbito del Lenguaje de
Programacin gobiernan cmo un objeto una
variable, una funcin , puede ser accesado
por varias partes de un pograma.
Reglas de mbito determinan:
Qu cdigo tiene acceso a una variable y
Lapso de vida de la variable
Hay tres tipos de variables:
Variables locales
Variables Globales
Parmetros Formales
200
Variables locales y globales
Variables Locales:
Est declarada dentro de la funcin y slo est
disponible durante su ejecucin.
Se crean cuando se entra a una funcin y se
destruyen cuando se sale.
Variables globales:
Se declaran en el programa principal. Pueden ser
utilizados por el programa y los subprogramas
(funciones).
Existen durante toda la vida del programa.
101
201
Variables Locales
Variables que son declaradas dentro de una
funcin son llamadas variables locales
int int f(){ f(){
int int a,b a,b; ;
... ...
} }
a y b son variables locales
de la funcin f(), es decir
el cuerpo de la funcin es
el mbito de las variables
a,b.
202
Ejemplo: Variables Locales
i nt f ( ) {
i nt a=1, b=2, c;
pr i nt f ( c=%d, c=a*b) ;
{
i nt a=11, b=12, c=13;
pr i nt f ( c=%d, a*b) ;
}
pr i nt f ( c=%d, a*b) ;
}
Locales
al bloque
102
203
Ejemplos de Bloques
Un bloque es una seccin de cdigo delimitada
por dos llaves, una abierta y otra cerrada
{}
If(cond){}
switch(cond){}
while(cond){}
do{}while(cond);
for(init;cond;inc_dec){}
Tipo funcion(argumentos){}
204
Variables Locales
Son creadas en la entrada de un bloque
Son locales a ese bloque
Son destruidas a la salida de ese bloque
Aqu, las variables locales existen solo mientras
el bloque de cdigo en el cual son declaradas
se esta ejecutando.
103
205
Y funciones
Cada funcin define su propio mbito
Todas las variables necesarias dentro de una
funcin deberan ser declaradas al comienzo de
ese bloque de cdigo de la funcin.
Las variables declaradas dentro de una funcin
no tienen efectos sobre las declaradas en otra,
incluso aunque compartan el mismo nombre.
206
Parmetros Formales y Variables Locales
Si una funcin usa argumentos, deben ser
declaradas variables que aceptaran los valores
de esos argumentos.
Esas variables son llamadas los parmetros
formales de la funcin.
Un parmetro formal se comporta como otra
variable local dentro de la funcin.
El mbito de un parmetro formal es local a su
funcin.
Ejemplo: int f(int a,float b,double c):
Esta funcin tiene tres parmetros de distintos
tipos.
104
207
Ejemplo
float f1(int a,int b){
float c=a+b;
return c;
}
float f2(int a, int b){
c=a+b;
return 2*c;
}
void main(){
float a=1,b=2,c=5;
printf(%d,%f,f1(a,b),f2(a,c)+c);}
208
Variables Globales
Son conocidas por el programa entero
Pueden ser usadas por cualquier pieza de
cdigo
Mantienen su valor durante la ejecucin entera
del programa
El mbito se extiende al programa entero
Son declaradas fuera de funciones
Cuando una variable local y global comparten el
mismo nombre, entonces la local tiene mayor
precedencia.
105
209
La sentencia: return
Es una sentencia que tiene los siguientes usos:
Fuerza la salida inmediata de la funcin en que se
encuentra.
Se puede utilizar para devolver un valor.
210
Retornando de una funcin
Una funcin retorna a la rutina que lo llamo
cuando:
Se encuentra la llave que cierra la funcin
O cuando la sentencia de return es ejecutada
Puede ser usada con o sin un valor asociado
Sin embargo, si la funcin fue declarada como
aquella que retorna un valor de un cierto tipo,
entonces debe retornar un valor.
Solo funciones declaradas con tipo void pueden
usar el return sin valor
106
211
Funcion que retorna void
Return es usado principalmente como una
estructura de control del programa, para
prevenir que parte de una funcin se ejecute
void power(int base,int exp) {
int i=1;
if(exp<0) return;
for(;exp;exp--)
i=base*i;
printf(%d^%d,base,exp);
}
212
Retornando Valores
Toda funcin con tipo no void retorna un valor
Estos valores de retorno pueden ser utilizados como un
operando en una expresin.
void power(int base,int exp) {
int i=1;
if(exp<0) return(0);
for(;exp;exp--)
i=base*i;
return(i);
}
void main(){
int z; z=power(2,3); }
107
213
Funciones y Paso de
Parmetros
214
Tipos de Funciones
1.- Funciones diseadas para realizar operaciones
con sus argumentos y devolver un valor basado
en sus clculos.
2.- Funciones que manipulan informacin y
devuelven un valor que indica simplemente el
xito o el fallo de esa manipulacin.
3.- Funciones que no tienen valor de vuelta
explcito, es decir, es de tipo procedimiento y no
genera un valor.
108
215
Funcin main()
Como ya se seal, es la funcin principal en un
programa.
Cuando se utiliza return, el programa devuelve
un cdigo de terminacin al proceso de llamada
(Sistema Operativo).
El valor devuelto puede ser 0 que indica
terminacin normal o cualquier otro valor
cuando se produce un error.
216
Argumentos de funciones
Son variables conocidas como parmetros
formales y son utilizadas como un medio de
entregarle informacin a la funcin.
Se comportan como las variable locales.
109
217
Mecanismo de Paso de Parmetros
Mecanismo General de Paso de Parmetros
Llamada por Valor
Valor de un argumento es copiado en el parmetro
formal de la subrutina
Cambios hecho a los parmetros no afectaran los
argumentos pasados para llamarlos.
Llamada por Nombre
El parmetro formal es textualmente reemplazado por
el argumento llamando
Llamada por Referencia
La direccin de un argumento es copiado en los
parmetros.
Cambios hecho a los parmetros afectaran los
argumentos usados para llamar la subrutina
218
Transferencia de Informacin
Las llamadas a una funcin puede ser por valor
o referencia (variable).
Llamadas por valor: copia el valor de un argumento
en el parmetro formal de la subrutina. De esta
forma, los cambios en los parmetros de la subrutina
no afectan a las variables que se usan en la llamada.
Llamadas por referencia: se copia la direccin del
argumento en el parmetro. Los cambios hechos a
los parmetros afectan a las variables usadas en la
llamada de la subrutina.
110
219
Ejemplos
Desarrolle un programa en el cual se calcule el
cuadrado de los 10 primeros nmeros.
220
Ejemplo 1
#include <stdio.h>
int cuadrado(int x){
int a;
a=x*x;
return a;
}
main(){
int i,resultado;
for (i=0;i<10;i++){
resultado = cuadrado (i);
printf("\nEl cuadrado de %d es %d ",i,resultado);
}
return 0;
}
111
221
Ejemplos
Desarrolle una funcin que realiza un intercambio
entre 2 valores.
222
Ejemplo : una Mala Solucion
#include <stdio.h>
void intercambio(int x, int y){
int temp;
temp=x; /*4*/
x=y; /*5*/
y=temp; /*6*/
printf(\n x=%d y=%d temp=%d ,x,y,temp); /*7*/
}
main(){
int a=1,b=2; /*1*/
printf("\na=%d b=%d",a,b); /*2*/
intercambio (a,b); /*3*/
printf("\na=%d b=%d",a,b); /*8*/
return 0;
}
112
223
Qu son los punteros?
Un puntero es una variable que contiene una
direccin de memoria.
La forma general es:
tipo *nombre_var;
* retorna el valor de la variable localizada en
la direccin especificada por el operando.
Ejemplos:
int *a; //puntero a un entero
float *a;//puntero a un flotante
224
Operadores en Punteros
Existen dos operadores especiales que se usan
con punteros:
& operador direccin de
operador unario que retorna la direccin
de memoria del operando
* operador valor en la direccin
operador unario que retorna el valor de la
variable localizada en la direccin
especificada por ese operando
113
225
Ejemplo
100
-
-
.
.
.
12 b_punt er o
100 a
130 val or
int a;
int *b_puntero;
b_puntero=&a;
226
Asignando Valores a travs de Punteros
Los punteros pueden ser usados al lado
izquierdo de las sentencias de asignacin
Ejemplo:
Asignar un valor a la ubicacin apuntada por el
puntero
int *ptr;
*ptr=101;
Incrementar y decrementar en Punteros
(*ptr)++;
Recordar utilizar parntesis alrededor de las
expresiones punteros.
114
227
Ejemplo 2
#include <stdio.h>
void intercambio(int *x, int *y){
int temp;
temp=*x; /*4 Salvar el valor de la direccion x*/
*x=*y; /*5 Poner y en x*/
*y=temp; /*6 Poner temp, i.e., x en y*/
printf(\n x=%d y=%d temp=%d ,*x,*y,temp); /*7*/
}
main(){
int a=1,b=2; /*1*/
printf("\na=%d b=%d",a,b); /*2*/
intercambio (&a,&b); /*3*/
printf("\na=%d b=%d",a,b); /*8*/
return 0;
}
228
Paso 0
115
229
Paso 1
230
Paso 2
116
231
Paso 3
232
Ejemplos
Realizar una funcin, en la cual se introduce un
nmero y una posicin y se retorna el dgito de
dicha posicin.
Ejemplo:
Entrada: 465 2
Salida : 6
117
233
Ejemplo
#include <stdio.h>
int buscar(int x,int k){
int i,n;
if (k<=0 || x<0) return -1;
for (i=0;i<k-1;i++)
x=x/10;
return (x%10);
}
void main(){
int n,k,digito;
printf("\nIngrese numero y posicion:");
scanf("%d %d",&n,&k);
digito=buscar(n,k);
if (digito<0) printf("\nNo encontrado:");
else printf("\nEl digito encontrado es: %d ",digito);
return 0;
}
234
Argumentos de main()
El estndar ANSI define dos argumentos de
main(): argc y argv.
Permite pasar informacin al programa de C
mediante argumentos de lnea de rdenes.
argc : contiene el nmero de argumentos, y es
entero.
argv : es un puntero a un arreglo de caracteres.
pr ogr ama ar gument o1 ar gument o2 .
Lnea de rdenes
118
235
Ejemplo
#include <stdio.h>
main(int argc, char *argv[]){
if(argc!=2){
printf(Ha olvidado escribir su nombre\n);
return 1;
}
printf(Hola %s,argv[1]);
return 0;
}
>>programa Alumno
Hola Alumno
>>programa
Ha olvidado escribir su nombre
236
Pasando Punteros
C permite pasar un puntero a una funcin.
void f(int *j) {*j =100; }
int main(){
int i;int *p;
p = &i; // p apunta a i
f(p);
printf(%d,i);
return 0;
}
119
237
Pasando Arreglos
Cuando un arreglo es un argumento a una
funcin, solo la direccin del primer elemento
del arreglo es pasado, no una copia del arreglo
entero.
En C el nombre del arreglo sin ndice es un
puntero al primer elemento.
Existen tres maneras de declarar un parmetro
que sea recibido como un puntero arreglo:
Arreglo del mismo tipo y tamao como se usa para
llamar a la funcin
Un puntero
Arreglo sin tamao
238
Ejemplo
voi d di spl ay(int n[10]);
i nt mai n( ) {
i nt t [ 10] , i ;
f or ( i =0; i <10; ++i ) t[i]=i;
di spl ay( t ) ; / / pasar ar r ay t a f unci on
r et ur n 0;
}
voi d di spl ay(int n[10]) {
i nt i ;
f or ( i =0; i <10; i ++) pr i nt f ( " %d" , n[ i ] ) ;
}
120
239
Ejemplo
voi d di spl ay( int *n) ;
i nt mai n( ) {
i nt t [ 10] , i ;
f or ( i =0; i <10; ++i ) t[i]=i;
di spl ay( t) ; / / pasar ar r ay t a f unci on
r et ur n 0;
}
voi d di spl ay( int *n) {
i nt i ;
f or ( i =0; i <10; i ++) pr i nt f ( " %d" , n[i]) ;
}
240
Ejemplo
voi d di spl ay( int n[]) ;
i nt mai n( ) {
i nt t [ 10] , i ;
f or ( i =0; i <10; ++i ) t[i]=i;
di spl ay( t) ; / / pasar ar r ay t a f unci on
r et ur n 0;
}
voi d di spl ay( int n[]) {
i nt i ;
f or ( i =0; i <10; i ++) pr i nt f ( " %d" , n[i]) ;
}
121
241
Funciones Recursivas
242
Recursividad
Son funciones que se llaman a s mismas.
Requisitos de las funciones recursivas:
Deben retornar un valor.
Tiene expresiones en la que se llama a s misma.
Debe tener alguna sentencia if, en la cual no se llame
a s misma, sino que termine la ejecucin de la
funcin.
Ejemplo:
5.- Realice un programa en el cual se calcule el factorial
de un nmero.
122
243
Iterativo vs. Recursivo
Definicin de Funcin Factorial
f act or i al ( n) : =n!
: =n*( n- 1) **2*1
: =

=
n
i
i
1
244
Implementacin iterativa
f act or i al ( n) : =
i nt f act or i al _i t er ( i nt n) {
i nt i , f =1;
f or ( i =0; i <=n; i ++) f =f *i ;
r et ur n f ;

=
n
i
i
1
123
245
Hacia una definicin recursiva
246
Definicin Recursiva
i nt f act or i al _r ec( i nt n) {
i f ( n==1) r et ur n 1;
r et ur n n*f act or i al _r ec( n- 1) ;
}

>
=
=
1 si ) 1 ( *
1 si 1
: ) (
n n factorial n
n
n factorial
124
247
Ejemplo
#include <stdio.h>
int factorial(int n){
if (n<0) return 0;
if (n==0) return 1;
else if (n==1) return 1;
else return n*factorial(n-1);
}
int main(){
int x,resultado;
printf("\nIngrese un nmero al cul le desea calcular el
factorial = );
scanf("%d",&x);
resultado=factorial(x);
printf("\n %d!=%d",x,resultado);
return 0;
}
248
Las Torres de Hanoi
Definicin del Problema
125
249
Paso 0
Inicializacin: Torre A contiene n discos de diferentes tamaos
Discos pueden solo ir sobre uno de tamao mas pequeo
Objetivo: Movimiento de todos los discos desde la torre A a la torre B
Movimientos: Tomar el disco del tope de una torre y mover el disco a otra
torre.
250
Paso 1 y 2
126
251
Paso 3 y 4
252
Paso 5 y 6
127
253
Paso 7 y 8
254
Paso 9 y 10
128
255
Paso 11 y 12
256
Paso 13 y 14
129
257
Paso 15
258
Ideas para una Solucin Recursiva
Con n discos
Mover torres
Mover torres
Mover torres
Con n-1 discos
Con n-1 discos
es equivalente a
130
259
Algoritmo Recursivo
El Algoritmo Principal
i nt mai n( ) {
i nt n;
pr i nt f ( cuant os di scos) ;
scanf ( %d, &n) ;
i f ( n>0)
mover _t or r e( n, A , B , C ) ;
r et ur n 0;
}
Problema exponencial n discos 2
n
-1
movimientos
260
Continuacin
voi d mover _t or r e( i nt n, char or i gen, char dest i no,
char t emp)
{
i f ( n==1)
mover _di sco( or i gen, dest i no) ;
el se{
mover _t or r e( n- 1, or i gen, t emp, dest i no) ;
mover _di sco( n- 1, or i gen, dest i no) ;
mover _t or r e( n- 1, t emp, dest i no, or i gen) ;
}
}
voi d mover _di sco( char desde, char a) {
pr i nt f ( mover di sco desde t or r e %c a t or r e %c. ,
or i gen, dest i no) ;
}
131
261
Arreglos
262
Arreglos
Un arreglo es una coleccin del mismo tipo que
son referidos por un nombre comn
Los arreglos ofrecen un medio conveniente por
el cual agrupar distintas variables relacionadas,
en una dimensin o ms
A un elemento especfico de un arreglo se
accede mediante un ndice.
Todos los arreglos en C constan de posiciones
de memoria contiguas.
Pueden ser de 1 o ms dimensiones.
132
263
Ejemplos
int numeros[]={1,3,34,54};
char alfabeto[5]={A,B,C,D,E};
Char nombres[][40]={pedro, pablo, luis,
karina, lisa};
Coordenadas[2][2]=
{
{0,0},{1,1}
};
264

Tipos de arreglos
Unidimensional Unidimensional
int int a[20]; a[20];
Bidimensional Bidimensional
Int Int a[6][7]; a[6][7];
Tridimensional Tridimensional
float float a[7][7][4]; a[7][7][4];
133
265
Arreglos
Si un arreglo es declarado en la funcin
principal main()tendra las dimensiones
incluidas.
Si no se desea tamao fijo se pueden utilizar
punteros.
Cuando se pasa un arreglo a una funcin, esta
ultima no necesita saber el tamao.
266
Arreglo Unidimensional
Un arreglo unidimensional es una lista de
variables relacionadas. La forma general de una
declaracin de arreglo 1-dimes
tipo nombre_var[ tamao]
tipo: tipo base del arreglo, determina el tipo de
dato de cada elemento en el arreglo
tamao: Cuntos elementos el arreglo tendr
Ejemplos:
int muestras[10];
char apellido[40];
134
267
Accediendo a elementos del Arreglo
Un elemento individual dentro de un arreglo es
accedido por el uso de un ndice.
Un ndice describe la posicin de un elemento
dentro de un arreglo.
En C/C++el primer elemento tiene el ndice
cero!
268
Ejemplo
#i ncl ude <st di o. h>
i nt mai n( ) {
i nt muest r a[ 10] , t ;
f or ( t =0; t <10; t ++)
muest r a[ t ] =t *t ;
f or ( t =0; t <10; t ++)
pr i nt f ( muest r a[ %d] =%d, t , muest r a
[ t ] ) ;
r et ur n 0;
}
135
269
Representacin de un arreglo en Memoria
En C, un arreglo es mapeado a localizaciones
de memoria continua
Todos los elementos de memoria residen uno al
lado del otro
La direccin ms baja corresponde al primer
elemento, y la ms alta al ltimo elemento
270
Ejemplo
i nt a[ 8] ;
i nt j ;
f or ( j =0; j <8; j ++) a[ j ] =7- j ;
Entonces la representacin de la memoria luce como:
136
271
Encontrar mximo
#i ncl ude<st di o. h>
i nt mai n( ) {
i nt i , max=0;
i nt l i st [ 100] ;
f or ( i =0; i <100; i ++) l i st [ i ] =r and( ) ;
f or ( i =0; i <100; i ++)
i f ( max<l i st [ i ] ) max=l i st [ i ] ;
pr i nt f ( max=%d, max) ;
r et ur n 0;
}
272
Asignaciones ilegales
No se puede asignar un arreglo a otro
Lo siguiente es ilegal:
i nt a[ 10] , b[ 10] ;
/ / hacer al go
a=b; / / error ilegal
En vez, se debe hacer asignaciones por cada
elemento:
i nt i ;
f or ( i =0; i <10; i ++) a[ i ] =b[ i ] ;
137
273
Arreglos Unidimensionales
Caractersticas:
1.- Almacenamiento de los elementos del arreglo en
posiciones contiguas.
2.- Tener un nico nombre de variable que representa a
los elementos y stos se diferencian por un
subndice.
3.- Acceso directo a los elementos.
274
Arreglos Unidimensionales
La forma general de declaracin de un arreglo
unidimensional es:
La cantidad de memoria en bytes viene dada
por:
Todo arreglo tiene el 0 como ndice del primer
elemento.
tipo nombre_de_variable[tamao];
bytes_totales = sizeof(tipo)*tamao;
138
275
Arreglos Unidimensionales.
dato0 dato1
daton-1
tipo nombre_de_variable[tamao];
Ejemplo:
1.- Realizar un programa en el que se ingresen 10
enteros, y luego se sumen sus elementos. Mostrar el
resultado.
276
Ejemplo
#include <stdio.h>
int main(){
int x[10];
int i,suma;
printf ("\n Ingrese 10 nmeros:\n");
for (i=0;i<10;i++)
scanf("%d",&x[i]);//lleva & pq es componente a componente
suma=0;
for (i=0;i<10;i++)
suma+=x[i];
printf("\n El resultado de la suma es = %d ",suma);
return 0;
}
139
277
Paso de Arreglos unidimensionales a
funciones
Forma 1: Arreglo delimitado
#include <stdio.h>
func1(int x[10]){ /*Arreglo delimitado*/
...
}
int main(){
int a[10];
..
func1(a);
...
return 0;
}
Se pasa la direccin del primer
elemento del arreglo a la
funcin
Se debe especificar el tamao
del arreglo
278
Paso de Arreglos unidimensionales a
funciones
Forma 2: Arreglo no delimitado
#include <stdio.h>
func1(int x[]){ /*Arreglo no delimitado*/
...
}
int main(){
int a[10];
..
func1(a);
...
return 0;
}
No se especifica el tamao del
arreglo
140
279
Paso de Arreglos unidimensionales a
funciones
Nota:
Al llamar una funcin pasndole un arreglo como
parmetro, como se le entrega la direccin del primer
elemento, entonces si los valores del arreglo son
modificados dentro de la funcin, tambin son
modificados en la funcin que llama.
280
String
Cadena de Caracteres.
141
281
String
El uso ms comn para un arreglo
unidimensional es guardar un arreglo de
caracteres
Un string esta definido como un arreglo de
caracteres terminado por un smbolo null (\0)
Para que un arreglo sostenga un string de 10
caracteres, char str[11], ya que 11 hace lugar
para el null al final del string.
\ \0 0 a a l l o o h h
282
Leyendo un string desde un teclado
#i ncl ude<st di o. h>
i nt mai n( ) {
char st r [ 80] ;
pr i nt f ( escr i bi r st r i ng) ;
scanf( %s, st r ) ; / / no l l eva &
r et ur n 0;
}
Problema: se detiene cuando lee un espacio
en blanco
142
283
Leyendo un string desde un teclado
#i ncl ude<st di o. h>
i nt mai n( ) {
char st r [ 80] ;
pr i nt f ( escr i bi r st r i ng) ;
gets( st r ) ; / / consi der a espaci o bl anco
r et ur n 0;
}
284
String
Es el uso ms comn de arreglo
unidimensionales.
En C un string es un arreglo de caracteres que
terminan en un caracter nulo: \0.
143
285
String
Constante de cadenas:
Es una sucesin de uno o ms caracteres encerrado
entre comillas.
Ejm: computador
286
String
Declaracin:
Se declaran como arreglos unidimensionales.
Debe contener 1 carcter ms que la cadena ms
larga ms larga que pueda contener.
char cadena[6];
Puede contener hasta
5 caracteres
0 1 2 3 4 5
\0
Caracter quemarcael fin del string
144
287
Librera para Strings
string.h
strcpy() : copia caracteres de un string a otro
strcat() : concatenacin de string
strlen() : largo del string
strcmp() : comparacin de string
288
Funciones de
Manejo de cadenas
Funcin Prototipo Accin Retorna
st r cpy( ) char *st r cpy( char *s1, const char *s2) ; Copi a s2 en s1. s1
st r cat ( ) char *st r cat ( char *s1, const char *s2) ; Concat ena s2 en s1. s1
st r l en( ) i nt st r l en( const char *s1) ; Longi t ud de s1
st r cmp( ) i nt st r cmp( const char *s1, const char *s2) ; Compar a s2 con s1 0 si son i gual es
>0 si s1>s2
<0 si s1<s2
Biblioteca: string.h
145
289
Arreglo 2-dimensional
Un arreglo bidimensional es una lista de arreglos
unidimensional
Para declarar un arreglo bidimensional de enteros
i nt mat r i z[ 3] [ 4] ;
290
#i ncl ude<st di o. h>
i nt mai n( ) {
i nt f i l a, col , mat r i z[ 3] [ 4] ;
f or ( f i l a=0; f i l a<3; f i l a++)
f or ( col =0; col <4; col ++)
mat r i z[ f i l a] [ col ] =f i l a*col ;
r et ur n 0;
}
146
291
Memoria para arreglos bidimensionales
El almacenamiento de los elementos del arreglo
es determinado en el tiempo de compilacin
La memoria usada se requiere mientras el
arreglo exista
La siguiente formula determina el numero de
bytes que necesita ser asignada
Bytes=fila*col*numero_bytes_tipo;
292
Ejemplo
#include <string.h>
#include <stdio.h>
int main(void){
char c1[80],c2[80];
printf("\n Ingrese una cadena de caracteres:");
scanf("%s",c1);
printf("\n Ingrese una cadena de caracteres:");
scanf("%s",c2);
printf("\n Longitudes: %d %d ",strlen(c1),strlen(c2));
if(!strcmp(c1,c2)) printf("\nLas cadenas son iguales");
strcat(c1,c2);
printf("\n %s",c1);
return 0;
}
147
293
Arreglos Multidimensionales
C permite arreglos con mas de dos dimensiones
La forma general de una declaracin de arreglo es
tipo nombre_var[tamao1] [tamao2][tamaoN]
294
Algoritmos de Bsqueda
148
295
Algoritmos de Bsqueda
Definicin:
Muchas veces es necesario encontrar un dato dentro
de un arreglo, para ello se crearon algoritmos que
varan en complejidad, eficiencia, tamao del dominio
de bsqueda.
296
Algoritmos de Bsqueda
Tipos de Bsqueda:
1.- Bsqueda Secuencial.
2.- Bsqueda Binaria.
149
297
Bsqueda Secuencial
Consiste en ir comparando el elemento que se
busca con cada elemento del arreglo hasta
cuando se encuentra.
C o m p u t a c i o n
u u u u u
0 1 2 3 4 5 6 7 8 9 10
Resultado =4
298
Bsqueda Secuencial
Algoritmo:
for (i=0;i<Largo;i++)
if (A[i]==Elemento)
printf(\nElemento Encontrado!!!);
150
299
Bsqueda Binaria
Los elementos del arreglo se encuentran ordenados y
no estn repetidos. En cada iteracin el dominio de
bsqueda se divide en 2.
3 5 8 20 32 45 60 73
32 32
0 1 2 3 4 5 6 7
Resultado =4
32
300
Bsqueda Binaria
Algoritmo
tipo A[Largo]
Max=Largo-1;
min=0;
Encontrado=0;
while(min+1<max && !Encontrado){
Medio=(Max+min)/2;
if (A[Medio]==Elemento){
printf(\nElemento Encontrado!!!);
Encontrado=1; /*Fuerza la salida del ciclo*/
}
if (A[Medio]<Elemento) Max=Medio;
if (A[Medio]>Elemento) min=Medio;
}
151
301
Algoritmos de
Ordenacin
302
Algoritmos de Ordenacin
Definicin:
Son algoritmos que fueron realizados para ordenar
un conjunto de datos. Los algoritmos varan segn su
facilidad de entendimiento, su eficiencia, cantidad de
cdigo necesario para implementarlos, complejidad,
requisitos necesarios de los datos.
152
303
Algoritmos de Ordenacin.
Tipos de Algoritmos:
1.- Ordenamiento Burbuja.
2.- Quick-Sort
304
Ordenacin Burbuja
El algoritmo consiste en que los elementos ms
pesados se hundan y los ms livianos salgan a
flote.
25
25
32
15
1 1
32
15
32
1
15
25
32
1
25
15
32
25
1
15
32
25
15
1
32
25
15
1
153
305
Ordenacin Burbuja
Algoritmo
for (i=Largo-1;i>0;i--)
for (j=0;j<i;j++)
if (A[j]>A[j+1])
Intercambiar(A[j],A[j+1]);
306
Arreglos
Bidimensionales
154
307
Arreglos Bidimensionales.
Definicin:
Es un arreglo de dos dimensiones el cual est
indexado por medio de 2 ndices.
A[i][j]
Declaracin:
tipo nombre_de_variable[tamao_1][tamao_2];
308
Una matriz bidimensional tiene la siguiente
forma:
Para acceder al dato a
ij
se hace de la siguiente
manera:
c=A[i][j];
mxn
mn m m
n
n
a a a
a a a
a a a
A

=
. ..........
....... .......... ..........
. ..........
.........
2 1
2 22 21
1 12 11
Arreglos Bidimensionales
155
309
Bsqueda en Arreglos Bidimensionales
Al igual que en un arreglo unidimensional, se
puede necesitar encontrar un elemento en un
arreglo bidimensional para lo cual se necesita
algn algoritmo de bsqueda.
Veamos la Bsqueda Secuencial.
310
Bsqueda Secuencial
Bsqueda Secuencial:
Consiste en ir comparando el elemento que se busca
con cada elemento del arreglo hasta cuando se
encuentra, el recorrido se puede hacer por filas o por
columnas.
156
311
Algoritmo: Bsqueda por filas
tipo A[filas][columnas]
for (i=0;i<filas;i++)
for (j=0;j<columnas;j++)
if (A[i][j]==elemento)
printf(\nElemento encontrado!!!);
h d k s a
l e v d g
r t k j h
m n w q t
v
v
Posicin:
Fila: 1
Columna: 2
Bsqueda Secuencial
312
Bsqueda Secuencial
Algoritmo: Bsqueda por columnas
tipo A[filas][columnas]
for (j=0;j<columnas;j++)
for (i=0;i<filas;i++)
if (A[i][j]==elemento)
printf(\nElemento encontrado!!!);
h d k s a
l e v d g
r t k j h
m n w q t
v
v
Posicin:
Fila: 1
Columna: 2
157
313
Arreglos
Multidimensionales
314
Arreglos Multidimensionales.
Definicin:
Es un arreglo con k-dimensiones, el cual est
indexado por medio de k ndices.
A[m].[n]
Declaracin:
tipo nombre_de_variable[tamao_1]...[tamao_k];
k
158
315
Estructura de datos
usando Arreglos
316
Stack o Pila
Definicin:
Una pila es una estructura de datos, consistente en un
arreglo al que se le puede insertar o sacar elementos por un
solo lado. Tambin se conoce como LIFO (Last In First Out).
1
Largo
159
317
Stack o Pila
Posee cuatro operaciones bsicas:
Insertar: inserta un elemento en el tope de la pila.
Sacar: Saca un elemento del tope de la pila.
Tope: Muestra el elemento ubicado en el tope de
la pila.
Vaca: Retorna verdadero si la pila est vaca.
318
Estructuras
160
319
Creacin de
Tipos de datos propios.
El lenguaje C proporciona 5 formas diferentes de tipos de datos
propios:
1.- Estructura: es una agrupacin de variables bajo un nombre y
se llama, a veces, un tipo de datos conglomerado.
2.- Campo bits: es una variacin de la estructura y permite un fcil
acceso a los bits dentro de una palabra.
3.- Unin: permite que la misma parte de memoria sea definida
como dos o ms tipos diferentes de variables.
4.- Enumeracin: es una lista de smbolos.
5.- typedef: crea un nuevo nombre para un tipo ya existente.
320
Estructuras
Una estructura es una coleccin de variables
que se denomina bajo un nico nombre,
proporcionando un medio eficaz de mantener
junta la informacin relacionada.
Una declaracin de estructura forma una
plantilla que puede utilizarse para crear
variables de estructuras.
Las variables que componen la estructura se
llaman elementos de la estructura o campo.
161
321
Declaracin de una Estructura.
La palabra clave struct indica al compilador que
se est declarando una estructura.
struct nombre_estructura{
tipo_dato_1 campo_1;
tipo_dato_2 campo_2;
.
tipo_dato_n campo_n;
};
322
Declaracin de Variables
Una vez declarada la estructura se debe
declarar variables con esta estructura:
Cuando se declara una estructura, se est
definiendo, esencialmente un tipo complejo de
variable compuesto por los elementos de la
estructura.
struct nombre_estructura variable_1,variable_2,.;
162
323
Otra forma de Declaracin
struct nombre_estructura{
tipo_dato_1 campo_1;
tipo_dato_2 campo_2;
.
tipo_dato_n campo_n;
}variable_1,variable_2,...;
324
Referencia a los
elementos de una Estructura
A los elementos individuales de una estructura
se hace referencia utilizando el operador .:
variable_1.campo_i;
163
325
Ejemplo
#include <stdio.h>
struct datos{
char nombre[30];
char direccion[30];
int n_empleado,edad;
float sueldo;
}
void main(){
struct datos persona;
printf(\n Ingrese nmero de empleado:);
scanf(%d,&persona.n_empleado);
printf(\n Ingrese nombre:);
scanf(%s,persona.nombre);
printf(\n Ingrese edad:);
scanf(%d,&persona.edad);
printf(\n Ingrese direccin:);
scanf(%s,persona.direccion);
printf(\n Ingrese sueldo:);
scanf(%f,&persona.sueldo);
}
326
Arreglos de Estructuras
Para declarar un arreglo de estructuras, se debe
definir primero la estructura y luego declarar un
variable arreglo de dicho tipo.
struct nombre_estructura variable[Tamao];
164
327
Ejemplo
#include <stdio.h>
struct datos{
char nombre[30];
char direccion[30];
int n_empleado,edad;
float sueldo;
}
void main(){
struct datos persona[10];
for (int i=0;i<10;i++){
printf(\n Ingrese nmero de empleado:);
scanf(%d,&persona[i].n_empleado);
printf(\n Ingrese nombre:);
scanf(%s,persona[i].nombre);
printf(\n Ingrese edad:);
scanf(%d,&persona[i].edad);
printf(\n Ingrese direccin:);
scanf(%s,persona[i].direccion);
printf(\n Ingrese sueldo:);
scanf(%f,&persona[i].sueldo);
}
}
328
Paso de Estructuras a Funciones
Se puede pasar un elemento o la estructura
completa a una funcin.
Paso de un elemento:
struct nombre_estructura{
tipo_dato_1 campo_1;
tipo_dato_2 campo_2;
.
tipo_dato_n campo_n;
}variable_1;
int funcion(tipo_dato_i VARIABLE);
.
funcion(variable_1.campo_i);
165
329
Ejemplo
#include <stdio.h>
struct datos{
char nombre[30];
char direccion[30];
int n_empleado,edad;
float sueldo;
}
float funcion(float *a,int t){
*a=(float) (t*1.015);
return *a;
}
void main(){
float f;
struct datos persona[10];
f=funcion(&persona.sueldo,10);
}
330
Paso de Estructuras a Funciones
Paso de una estructura completa por valor:
struct nombre_estructura{
tipo_dato_1 campo_1;
tipo_dato_2 campo_2;
.
tipo_dato_n campo_n;
}variable_1;
int funcion(struct nombre_estructura VARIABLE);
.
funcion(variable_1);
166
331
Ejemplo
#include <stdio.h>
struct datos{
char nombre[30];
char direccion[30];
int n_empleado,edad;
float sueldo;
}
void mostrar(struct datos A){
printf(\n Nmero de empleado: %d, A.n_empleado);
printf(\n nombre: %s, A.nombre);
printf(\n edad: %d, A.edad);
printf(\n direccin: %s, A.direccion);
printf(\n sueldo: %f, A.sueldo);
}
}
void main(){
struct datos persona;
...
mostrar(persona);

}
332
Paso de Estructuras a Funciones
Paso de una estructura completa por referencia:
struct nombre_estructura{
tipo_dato_1 campo_1;
tipo_dato_2 campo_2;
.
tipo_dato_n campo_n;
};
int funcion(struct nombre_estructura *VARIABLE){
. . .
VARIABLE->campo_1;
. . .
};
. . .
funcion(&variable_1);
167
333
Ejemplo
void modificar(struct datos *A){;
printf(\n Ingrese nmero de empleado:);
scanf(%d,&A->n_empleado);
printf(\n Ingrese nombre:);
scanf(%s,A->nombre);
printf(\n Ingrese edad:);
scanf(%d,&A->edad);
printf(\n Ingrese direccin:);
scanf(%s,A->direccion);
printf(\n Ingrese sueldo:);
scanf(%f,&A->sueldo);
}
void main(){
struct datos persona;
modificar(&persona);
}
#include <stdio.h>
struct datos{
char nombre[30];
char direccion[30];
int n_empleado,edad;
float sueldo;
}
334
Archivos
168
335
Archivos v/s Memoria
Memoria Archivo
Voltil Almacenamiento
Fijo
Limitada y
pequea.
Limitada, pero
con una mayor
capacidad de
almacenamiento
Rpida Lenta
336
Observacin
La Memoria tambin se conoce como
Memoria Principal o Primaria.
Los archivos tambin se conocen como
memoria Secundaria.
Los datos de la memoria secundaria deben
ser transferidos a la memoria principal antes
de ser accedidos por un proceso.
169
337
Flujos y Archivos
El sistema de E/S de C:
Suministra al programador de C un interfaz
consistente e independiente del dispositivo al que se
est accediendo.
Proporciona un nivel de abstraccin entre el
programador y el dispositivo que se est usando.
A la abstraccin se denomina flujo; al dispositivo real
se le denomina archivo.
338
Flujos
Permite trabajar con una amplia variedad de
dispositivos.
El sistema de archivos con buffer transforma cada
dispositivo en un dispositivo lgico llamado flujo.
Todo flujo se comporta de manera similar.
Existen dos tipos de flujos: de texto y binarios.
170
339
Flujos de Texto
Es una secuencia de caracteres.
En un flujo de texto, pueden ocurrir ciertas
conversiones de caracteres si el entorno del
sistema lo requiere.
El nmero de bytes escritos y ledos puede no
ser iguales.
340
Flujos Binarios
Es una secuencia de bytes con una
correspondencia de uno a uno con los
dispositivos externos.
No se realizan conversiones de caracteres.
El nmero de bytes escritos y ledos es el
mismo.
171
341
Archivos
Es un concepto lgico que puede ser aplicado a
cualquier cosa, desde un archivo de disco a un terminal.
Se asocia un flujo con un archivo especfico realizando
una operacin de apertura.
Una vez el archivo abierto se puede intercambiar la
informacin entre el archivo y el programa.
Si el archivo permite acceso directo (poder posicionarse
en algn lugar), al abrir el archivo, el indicador de
posicin se ubica al comienzo.
342
Archivos
Se puede desasociar un archivo de un flujo especfico
con una operacin de cierre.
Cuando se cierra un flujo, se escribe el contenido de su
buffer asociado en el dispositivo externo
172
343
Flujo
Flujos y Archivos
Archivo
0101110
Memoria
Buffer
100101101
CPU
0101110 0101110 100101101 100101101
100101101 0101110
344
Flujos y Archivos
Archivo
Memoria
Buffer
CPU
173
345
Sistema de Archivos ANSI C
Nombre Funci n
fopen() Abre un flujo
fclose() Cierra un flujo
fputc() Escribe un carcter en un flujo
fgetc() Lee un carcter de un flujo
fseek() Busca un Byte especfico de un flujo
fprintf() Equivalente a printf()
fscanf() Equivalente a scanf()
feof() Devuelve Verdadero si llego al final del flujo
ferror() Devuelve Verdadero si se produjo un error.
rewind() Se ubica en el comienzo del archivo
remove() Elimina un archivo
Se requiere incluir la biblioteca stdio.h
346
El puntero a Archivo
Es el hilo comn que unifica el sistema de E/S con
buffer.
Un puntero a un archivo es un puntero a una
informacin que define varias cosas sobre l, incluyendo
su nombre, su estado y su posicin actual.
Es un puntero a una variable de tipo puntero a FILE
Prototipo:
FI LE *ar chi vo;
174
347
fopen()
Abre un flujo para que pueda ser utilizado, lo
asocia a un archivo y despus, devuelve el
puntero a FILE de es flujo.
Prototipo:
modo: apunta a una cadena que contiene el estado
de apertura deseado.
nombre_archivo: cadena de caracteres que
representa un nombre vlido de archivo
FI LE *f open( const char *nombr e_ar chi vo, const char *modo)
348
Valores vlidos de modo
Modo Significado
" r" Abre archivo de texto para lectura
" w" Crea archivo de texto para escritura
" a" Abre archivo de texto para aadir
" rb" Abre archivo binario para lectura
" wb" Crea archivo binario para escritura
" ab" Abre archivo binario para aadir
" r+" Abre archivo de texto para lectura/escritura
" w+" Crea archivo de texto para lectura/escritura
" a+" Abre o crea archivo de texto para lectura/escritura
" r+b" Abre archivo binario para lectura/escritura
" w+b" Crea archivo binario para lectura/escritura
" a+b" Abre o crea archivo binario para lectura/escritura
" rt" Abre archivo de texto para lectura
" wt" Crea archivo de texto para escritura
" at" Abre archivo de texto para aadir
" r+t" Abre archivo de texto para lectura/escritura
" w+t" Crea archivo de texto para lectura/escritura
" a+t" Abre o crea archivo de texto para lectura/escritura
175
349
Deteccin de error de apertura
FI LE *Ar chi vo;
i f ( ( Ar chi vo=f open( nombr e_ar chi vo, modo) ) ==NULL) {
pr i nt f ( \ n Pr obl emas al abr i r el ar chi vo) ;
exi t ( 1) ;
}
350
fclose()
Cierra un flujo que fue abierto por fopen().
Escribe toda la informacin que todava se
encuentre en el buffer del disco al archivo y
cierra el archivo.
Prototipo:
Devuleve 0 si no ocurre ERROR, EOF en caso
de que ocurra un error.
int fclose(FILE *Archivo)
176
351
fputc()
Escribe caracteres en un flujo que haya sido
abierto para escritura.
Prototipo:
c es el carcter que se va a escribir.
Devuelve el carcter escrito si no ocurre
ERROR, EOF en caso de que ocurra un error.
int fputc(int c,FILE *Archivo)
352
fgetc()
Lee caracteres en un flujo que haya sido abierto
para lectura.
Prototipo:
c es el carcter que se va a escribir.
Devuelve el carcter escrito.
EOF en caso de se acabe el archivo.
int fgetc(FILE *Archivo)
177
353
Ejemplo
Realizar un programa en el cual guarde en un
archivo la informacin introducida por el usuario
a travs del teclado. Se termina la introduccin
por el teclado con el carcter $.
Realizar un programa que lea lo introducido.
354
Ejemplo
#include <stdio.h>
int main(){
FILE *Archivo;
char c;
if ((Archivo=fopen("datos.dat","w"))==NULL){
printf("No se puede abrir el archivo");
return 1;
}
do{
c=getchar();
putc(c,Archivo);
}while(c!='$');
fclose(Archivo);
return 0;
}
178
355
fprintf() y fscanf()
Se comportan de manera parecida a printf() y
scanf(), pero se le debe entregar un argumento
ms que corresponde a la variable de flujo con
la que se desea trabajar.
Prototipo:
int fprintf(FILE *Archivo, const char *cadena,...);
int fscanf(FILE *Archivo, const char *cadena,...);
356
fprintf()
Prototipo:
int fprintf(FILE *Archivo,const char *cadena,);
Cdigo Formato
%c Un ni co car ct er
%d Deci mal
%i Deci mal
%e Not aci n ci ent f i ca
%f Deci mal en punt o f l ot ant e
%g Usar el %eo %f , el ms cor t o.
%o Oct al
%s Cadena de car act er es.
%u Deci mal es si n si gno
%x Hexadeci mal es
%% I mpr i me %
%p Muest r a un punt er o
179
357
Ejemplo
#include <stdio.h>
int main(void)
{
FILE *fp;
int i = 100;
char c = 'C';
float f = 1.234;
/* Abrir archivo para actualizacion */
fp = fopen(ARCH.TXT", "w+");
/* Se escribe algo en el archivo */
fprintf(fp, "%d %c %f", i, c, f);
/* Cerrar el archivo */
fclose(fp);
return 0;
}
358
fprintf()
Cdigo Significado
\ b Espaci o at r s
\ f Sal t o de pgi na
\ n Sal t o de l nea
\ r Ret or no de car r o
\ t Tabul aci n hor i zont al
\ " Comi l l as dobl es
\ ' Comi l l a si mpl e
\ 0 Nul o
\ \ Bar r a i nver t i da
\ v Tabul aci n ver t i cal
\ a Al er t a
\ o Const ant e oct al
\ x Const ant e hexadeci mal
180
359
fscanf()
Prototipo:
int fscanf(FILE *Archivo,const char *cadena,.);
Cdigo Formato
%c Un ni co car ct er
%d Deci mal
%i Deci mal
%e Not aci n ci ent f i ca
%f Deci mal en punt o f l ot ant e
%g Usar el %eo %f , el ms cor t o.
%o Oct al
%s Cadena de car act er es.
%u Deci mal es si n si gno
%x Hexadeci mal es
%% I mpr i me %
%p Muest r a un punt er o
360
Ejemplo
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
FILE *fp;
int i;
printf(\n Ingrese un entero: ");
fp=fopen(arch.dat,r+);
/* Se lee un entero del archivo */
if (fscanf(fp, "%d", &i))
printf(El entero leido fue: %i\n", i);
else
{
fprintf(fp, "Error al leer un entero.\n");
exit(1);
}
return 0;
}
181
361
rewind()
Prototipo:
Posiciona el puntero de flujo al comienzo del archivo.
int rewind(FILE *Archivo);
362
ftell
Prototipo:
Retorna la posicin actual del puntero del flujo.
Est medido en Bytes desde el comienzo del archivo.
Si retorna -1L si hubo errores.
long ftell(FILE *Archivo);
182
363
Ejemplo
#include <stdio.h>
int main(void)
{
FILE *Archivo;
Archivo = fopen("MIARCH.TXT", "w+");
fprintf(Archivo, Esta es una prueba");
printf(El puntero al archivo esta en el Byte %ld\n", ftell(Archivo));
fclose(Archivo);
return 0;
}
364
fseek()
Prototipo:
Ubica el puntero de archivo asociado con el flujo a
una nueva posicin, la cual se encuentra a desp
bytes de desde.
desde puede ser:
SEEK_SET Comienzo del archivo.
SEEK_CUR Ubicacin actual.
SEEK_END Fin del archivo.
Retorna 0 si el movimiento fue exitoso.
int fseek(FILE *Archivo, long desp, int desde);
183
365
Ejemplo
#include <stdio.h>
long tamano(FILE *Arch); /*Prototipo de la funcion*/
int main(void)
{
FILE *fp;
fp = fopen(MIARCH.TXT", "w+");
fprintf(fp, Esta es una prueba");
printf(Tamano del archivo MIARCH.TXT es %ld bytes\n", filesize(fp));
fclose(fp);
return 0;
}
long tamano(FILE *Arch)
{
long pos_actual, longitud;
pos_actual = ftell(Arch);
fseek(Arch, 0L, SEEK_END); /* 0L equivale a una longitud de 0*/
longitud = ftell(Arch);
fseek(Arch,pos_actual, SEEK_SET);
return longitud;
}
366
Prototipo:
Elimina un archivo dado por filename.
int remove(const char *filename);
remove
184
367
Ejemplo
#include <stdio.h>
int main(void)
{
char nombre[80];
printf(Archivo a eliminar: ");
scanf("%s",nombre);
/* Borrar el archivo */
if (remove(nombre) == 0)
printf("Archivo Borrado %s.\n",nombre);
else{
printf("Problemas al borrar el archivo");
return 1;
}
return 0;
}
368
feof()
Prototipo:
Retorna 0 si el fin de archivo no se ha alcanzado.
Retorna 1 si es fin de archivo.
int feof(FILE *archivo);
185
369
Ejemplo
#include <stdio.h>
int main(void)
{
FILE *fp;
/* Abrir el archivo para lectura */
fp = fopen(Arch.txt", "r");
/* Lee un caracter del archivo */
fgetc(fp);
/* Revisa EOF */
if (feof(fp))
printf(Se ha llegado al fin de archivo(end-of-file)\n");
/* Cerrar el archivo */
fclose(fp);
return 0;
}
370
Archivos Estructurados
186
371
Archivos Estructurados
Cuando se trabaja con estructuras, por lo
general es necesario transferir la informacin a
un archivo, y as tener la informacin
almacenada en algn medio fsico para su
posterior uso.
Para ello es necesario conocer algunas
funciones para facilitar el traspaso de los datos
de una estructura a un archivo.
372
Archivos Estructurados
Consiste en un tipo especial de Archivo de
Texto en el cual a cada campo de una
estructura se le asigna un espacio equivalente
en el archivo, por lo tanto, se realiza un mapeo
de la estructura al archivo y viceversa.
187
373
fread()
Lee los datos de un flujo.
Prototipo:
Lee n itemes de datos, cada uno con una longitud de
size bytes, de un flujo de entrada dado por el bloque
apuntado por ptr.
El nmero total de bytes ledos es n*size
Valores de Retorno:
Si la tarea se completa exitosamente, se retorna el nmero
de temes que se leyeron.
Retorna 0 al final del archivo o error.
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
374
Ejemplo
#include <string.h>
#include <stdio.h>
int main(void) {
FILE *stream;
char msg[] = Esta es una prueba";
char buf[20];
if ((stream = fopen(PRUEBA.TXT", "w+"))== NULL){
fprintf(stderr, No se puede abrir archivo.\n");
return 1;
}
/* Se escribe algunos datos al archivo */
fwrite(msg, strlen(msg)+1, 1, stream);
/* Busca el comienzo del archivo */
fseek(stream, SEEK_SET, 0);
/* Lee el dato y lo muestra */
fread(buf, strlen(msg)+1, 1, stream);
printf("%s\n", buf);
fclose(stream);
return 0;
}
188
375
fwrite()
Escribe un flujo
Prototipo:
Adiciona n temes de datos , cada uno con un tamao
de size bytes, al archivo de salida.
El dato escrito comienza en ptr.
El nmero total de bytes escrito es n*size.
Valores Retornados:
Si la tarea se completa exitosamente se retorna el nmero
de temes escritos.
En caso contrario retorna 0 o error.
size_t fwrite(const void *ptr,size_t size, size_t n, FILE* stream);
376
Ejemplo
#include <stdio.h>
struct mi_estructura{
int i;
char ch;
};
int main(void){
FILE *stream;
struct mi_estructura s;
if ((stream = fopen(Archivo.txt", "wb"))== NULL){
fprintf(stderr, No se puede abrir el archivo.\n");
return 1;
}
s.i = 0; s.ch = 'A';
fwrite(&s, sizeof(s), 1, stream); /* escribe la estructura s en el
archivo */
fclose(stream); /* cierra el archivo */
return 0;
}
189
377
Lenguaje de
programacin C

También podría gustarte