Академический Документы
Профессиональный Документы
Культура Документы
CONCEPTOS
PROGRAMACION: es una de las etapas ms importantes del ciclo de vida de un proyecto
informtico, y requiere un determinado mtodo de trabajo, las herramientas que utilizamos
para programar son los lenguajes de programacin a travs de los cuales codificaremos los
programas. La fase de programacin desarrolla el algoritmo del programa a partir de los
ordinogramas obtenidos en la fase de anlisis.
El algoritmo suele representarse grficamente mediante ordinogramas ms completos que
los obtenidos en el anlisis orgnico. Para el desarrollo de los algoritmos tambin se
emplean el pseudocodigo las cuales son representaciones estructuradas no grficas sino
escritos
PROGRAMAS: conjunto de instrucciones que representan las acciones que hemos hecho
en el algoritmo y los cuales son escritos en un lenguaje de programacin por ejemplo C
El conjunto de programas forman lo que se ha denominado el software de un sistema
informtico o lo que es lo mismo una aplicacin informtica la cual no se fabrica no se
desgasta sino que se desarrolla y se deteriora respectivamente y, adems, se construyen a
medida.
Ejemplos : Software de sistemas (WORD)
Software de gestin( utilizado por las industrias para las facturas por ejemplo)
En tiempo real (central nuclear)
Al hablar de programas nos referimos a su finalizacin como el progreso que tardamos en
hacerlo.
Son las fases por las que pasa el desarrollo de un sistema son 3 fases
Fase de definicin: estudiar lo que el cliente nos pide para saber lo que hay que hacer.
Fase de desarrollo: disear la solucin y hacer el algoritmo que nos resuelva lo que ha
pedido el cliente.
Fase de operacin: mantenimiento del programa.
Otra clasificacin ms explcita
Anlisis y definicin de las necesidades:
Establece los objetivos del sistema que queremos construir y los requisitos para su
elaboracin a partir de las indicaciones.
Diseo del sistema y del software:
Partiendo del punto anterior vamos a dividir las necesidades del problema en 2 tipos:
necesidades del software: miramos que equipo informtico hace falta.
necesidades del hardware: nos encargamos de determinar las funciones y el lenguaje de
programacin a usar.
Aplicaciones y pruebas de unidades:
Se implementa cada funcin por separado y se verifica si nos sirve para lo que le hemos
Explotacin
Una alternativa a este ciclo de vida es el modelo evolutivo en el cual el usuario nos manda
algo a nosotros le hacemos un prototipo y le vamos modificando hasta que lo que tenemos
coincide con lo que el usuario ha pedido.
prototipo
usuario
IMPLICACIONES :
Programa limpio: Es aquel cuyo diagrama de flujo de datos tiene solo un arco de entrada y
uno solo de salida y existe un camino desde la entrada a cualquier sitio y de cualquier
sitio a la salida.
SECUENCIA
SELECCION
ITERACION
ALGORITMOS
TEMA 2
VERIFICAR EL ALGORITMO
Bajo nivel:
Es el lenguaje maquina, es decir, esta muy relacionado con el hardware, el
programador debe conocer a fondo la arquitectura del ordenador que programa. Consiste
en conjunto de instrucciones en binario, es decir, en 0 y 1, por esto es un lenguaje muy
complicado y la posibilidad de cometer errores utilizando este tipo de lenguaje es muy alto
por eso ya no se utiliza
Para solucionar en parte este problema apareci el lenguaje ensamblador que consiste en
asignar una abreviatura a cada instruccin en binario
Este lenguaje presenta la mayora de los inconvenientes del lenguaje maquina.
El programador ha de conocer perfectamente el hardware del equipo
Las instrucciones son elementales bsicas
Las instrucciones del programa dependen del tipo de ordenador para el que se escribe
Pero a su vez destaca en:
Gozan de la ventaja de la mnima ocupacin de memoria(la cantidad de memoria que
necesitan los programas es menor que la utilizada por los lenguajes de alto nivel) y mnimo
tiempo de ejecucin en comparacin con el resultado de la compilacin del programa
equivalente escrito en otros lenguajes.
Los programas escritos en este lenguaje son ms eficientes que aquellos equivalentes
escritos en otros lenguajes.
Todos los lenguajes ensambladores tienen su correspondiente ENSAMBLADOR que es un
programa que traduce los programas escritos en lenguaje ensamblador a cdigo maquina
para que el ordenador pueda ejecutarlos. Al igual que el lenguaje ensamblador cada
ordenador tiene su propio ensamblador.
Utilizacin: en la programacin de microordenadores y para crear programas eficientes
(programas de sistema o software de sistemas)que sirvan de insfrastuctura a los lenguajes
de alto nivel
2. Alto nivel: son llamados as porque estn mas cerca del programador que del hardware
de la maquina
Caractersticas:
Son independientes del hardware, pudiendo utilizar un mismo programa en diferentes
equipos con la nica condicin de disponer de un programa traductor o compilador.
La estructura de los lenguajes de programacin de alto nivel tienden a semejarse lo
ms posible al lenguaje natural esto lleva consigo una mayor legibilidad de los programas y
un aprendizaje ms rpido del lenguaje.
Incluyen instrucciones de alto nivel con ello se intenta paliar el problema que plantean
los lenguajes ensambladores en los que las instrucciones eran muy bsicas.
La existencia de estas instrucciones tiene como consecuencia la obtencin de programas
ms cortos y por lo tanto ms legibles que sus equivalentes en lenguaje de bajo nivel.
Pero aun as tambin tienen defectos como que son ms lentos de ejecucin y disponen de la
memoria de forma menos eficaz que los lenguajes de bajo nivel.
El ordenador solo comprende el lenguaje maquina y no pude ejecutar programas
directamente que estn escritos en otros lenguajes por ello es necesario traducirlos
Hay 3 herramientas que realizan esta operacin:
El ensamblador el cual traduce un programa codificado en lenguaje ensamblador a
lenguaje binario
l interprete el cual toma el programa creado por el lenguaje de alto nivel llamado
programa fuente y lo va traduciendo y ejecutando instruccin a instruccin. La ventaja que
tiene es que si el programa tiene errores permitir al programador corregirlos sobre la
marcha y continuar la ejecucin, el inconveniente es que cada vez que se desea ejecutar el
programa es necesario traducirlo, es decir, que la ejecucin de un programa es ms lenta
con el uso de interpretes.
El compilador el cual primero traduce todas las instrucciones del programa fuente y
crea un programa traducido al lenguaje maquina llamado programa objeto. La ventaja que
tiene es que el programa objeto podr ser ejecutado todas las veces que se quiera sin
tener que ser traducido el programa.
Al contrario que los interpretes los compiladores nos permiten aprovechar mejor la
memoria y la ejecucin de un programa se realiza con rapidez.
LENGUAJE DE ALTO NIVEL
LENGUAJE DE BAJO NIVEL
TRADUCTOR
LENGUAJE MAQUINA
ALTO NIVEL
TRADUCTORES
VERIFICAR ERRORES
EJECUCION
VERIFICAR RESULTADOS
Objetivos de los lenguajes de alto nivel
Debe proporcionarnos una herramienta practica y til para poder representar y
expresar la solucin de un determinado problema
Debe buscar la simplicidad en la creacin de los programas.
Tiene que proporcionarnos programas eficientes, es decir, que el proceso de traduccin
de las instrucciones del programa a su cdigo maquina equivalente se haga de forma rpida
y sobre todo que el cdigo resultante sea lo ms eficaz posible. Hay dos formas de enfocar
la eficiencia del cdigo maquina: la velocidad y el tamao.
El cdigo maquina destinado a realizar una determinada operacin debe llevar al ordenador
a efectuarla de la forma ms rpida posible, hay muchos mtodos distintos para realizar
una misma operacin por eso se busca el mtodo ms rpido. Tambin ha de buscar el
mtodo que requiera menos cantidad de cdigo maquina para realizar una operacin
determinada.
Hemos de tener en cuenta que un cdigo maquina mas corto suele ser mas lento mientras
que uno largo suele ser ms rpido.
Obtencin de programas legibles para que sus ampliaciones o mejoras posibles sean
posibles de una forma eficaz
Ejemplos de lenguajes de alto nivel: C, PASCAL, COBOL, BASIC, FORTRAN, ADA
Herramientas y notaciones para el diseo de algoritmos
Diagramas de flujo.
Pseudocodigo.
1) Diagramas de flujo: representacin grfica del flujo de datos u operaciones de un
programa, un diagrama de flujo nos permite representar el circuito de informacin
desde su entrada como dato hasta su salida como resultado, esclareciendo la secuencia
de las operaciones.
Son considerados el lenguaje comn de todos los programadores y se utilizan en distintas
fases del ciclo de vida siendo distinto el nombre en cada etapa, en la etapa de anlisis
reciben el nombre de organigramas en cambio en la fase de programacin reciben el nombre
de ordinogramas teniendo en cuenta esto se puede decir que hay dos tipos de flujos de
datos:
Organigramas. Los organigramas reflejan grficamente la ubicacin de informacin en
los soportes perifricos de entrada y salida unida por el flujo de datos e informacin que
utiliza un programa de manera clara y sencilla; un organigrama debe dar una visin externa
e interna a travs de los siguientes elementos:
Los soportes (medio capaz de almacenar informacin) de los datos de entrada, los soportes
de los datos de salida, el nombre del programa y el flujo de datos
PERIFERICOS
DE ENTRADA
PROGRAMA
SOPORTE E/S
SOPORTE E/S
PERIFERICOS
DE SALIDA
Los smbolos utilizados para la entrada y salida de datos indican el tipo de soporte fsico. si
se utilizan archivos es conveniente poner su nombre
Los smbolos ms utilizados en los organigramas son:
teclado
Disco
magntico
Pantalla
Archivo en
CM
proceso
tarjeta
Archivo
ETC
Tomas de decisin
datos
terminador
1 INICIO
2 OPERACIONES
operacin
10
conector
3 SECUENCIA
DE OPERACIONES
4 FIN
4
2) Pseudocodigo: representaciones estructuradas escritas no grficas, es una notacin
Mediante la cual podemos escribir la solucin de un problema en forma de algoritmo
utilizando palabras y frases del lenguaje natural sujetos a unas determinadas reglas. Se
puede considerar un paso intermedio entre la solucin del problema y la codificacin en un
lenguaje.
Todo pseudocodigo debe posibilitar la descripcin de los siguientes elementos:
- Instrucciones de entrada/salida
- Instrucciones de proceso
- Sentencias de control de flujo de ejecucin.
- Acciones compuestas(subrogaras).
- Comentarios que comienzan**.
La estructura de los pseudocodigo es as:
La primera parte del pseudocodigo contiene el nombre que informtico asigna al programa.
La segunda parte es una descripcin de los elementos que forman el entorno del propio
programa, se incluye la declaracin de variables (numricas enteras, numricas reales,
alfanumricas, lgicas)
La tercera parte es el algoritmo que resuelve el problema.
Ejemplo:
Programa: NOMBRE rea
Entorno :
TODAS LAS VARIABLES QUE USAMOS Y DE QUE TIPO SON Base, rea, altura, son numricas enteras
Algoritmo:
Escribir introduzca la base y la altura
Leer base, altura
Calcular area=base *altura
Escribir el rea de rectngulo es:
Fin programa.
11
TEMA3
TECNICAS DE PROGRAMACION
CONCEPTOS:
1) OBJETOS DE UN PROGRAMA:
Qu son? Elementos a travs de los cuales almacenamos los datos y resultados de
operaciones con los que llegamos a la resolucin de un problema.
Ahora veremos elementos que nos ayudan a trabajar en la fcil comprensin de los
programas.
DATOS
SIMPLES
Numricos
Enteros
Reales
Lgicos
Carcter
12
13
Expresin primera
VERDADERO 1
VERDADERO 1
FALSO 0
FALSO 0
VERDADERO 1
VERDADERO 1
FALSO 0
FALSO 0
VERDADERO 1
FALSO O
Operador lgico
AND
OR
Expresin segunda
VERDADERO 1
FALSO 0
VERDADERO 1
FALSO 0
VERDADERO 1
FALSO 0
VERDADERO 1
FALSO 0
NOT
Resultado
VERDADERO
FALSO 0
FALSO 0
FALSO 0
VERDADERO
VERDADERO
VERDADERO
FALSO 0
FALSO 0
VERDADERO
final
1
1
1
1
7) INSTRUCCIONES DE ASIGNACION:
Son aquellos que permiten dar valor a una variable, es decir, poner un dato en la posicin de
memoria que habamos reservado para la variable
Ejemplo : suma = 0
ESTRUCTURA GENERAL DE UN PROGRAMA:
Teniendo en cuenta que un programa es un conjunto de instrucciones interrelacionadas
entre s que contribuyen a la resolucin de un programa, las partes que forman un programa
son:
Entradas de datos: . Acciones que obtienen la informacin de un dispositivo de entrada
como por ejemplo disquetes, teclado
Proceso: acciones que modifican los objetos desde un estado inicial hasta un estado
final dejando los resultados disponibles en la memoria.
Salida de datos: acciones que toman los resultados y los envan a dispositivos externos
como por ejemplo la pantalla, impresora
Los programas manejan objetos que modifican su estado dependiendo de la ejecucin de
instrucciones, las instrucciones se clasifican en:
Instrucciones primitivas:
S=S+5
- Asignacin.
-
Entrada
Salida
Escribir telfono
Leer telfono
14
TECNICAS DE PROGRAMACION:
1) PROGRAMACION CONVENCIONAL:
Ante cualquier problema debemos seguir los siguientes pasos: anlisis del problema, diseo
del algoritmo y resolucin a travs del computador. Estos tres pasos constituyen lo que se
llama la programacin convencional imprimiendo en ella objetivos tales como la concrecin,
la legibilidad, la depuracin de errores y la facilidad en la modificacin.
La dificultad de la etapa del mantenimiento en el ciclo de vida de un proyecto surge a la
hora de modificar y verificar el programa elaborado durante las anteriores etapas. Pero
esto todava se incrementa mas cuando la tcnica utilizada en la programacin es la
convencional.
La tcnica utilizada era la formacin de bucles y rutinas entremezcladas que se llamaban
unas a otras y conseguan el correcto funcionamiento a costa del consumo de recursos, la
escasez musicaletc
La programacin convencional lleva consigo poca claridad y como consecuencia falta de
fiabilidad, sobre todo cuando el algoritmo planteado es grande o complejo y, adems, con
esta tcnica es difcil saber donde ocurri un error.
2) PROGRAMACION MODULAR:
Tcnica basada en el desarrollo de programas de lo general a lo particular que consiste en
dividir un programa complejo en subprogramas sencillos e independientes llamados mdulos
los cuales tienen que poder ser analizados y programados por separados.
Los mdulos son un conjunto de instrucciones lgicamente enlazados que realizan una
funcin, a cada modulo se le asigna un nombre para que pueda ser identificado.
Caractersticas de los mdulos:
Un modulo solo puede tener una entrada y solo puede tener una nica salida, es decir,
tiene que ser un programa limpio.
l modulo principal debe indicar la solucin completa del problema.
Independencia total entre ellos, es decir, que no necesitan colaboracin de otros.
Un modulo debe representar por si mismo una estructura coherente y resolver una
parte bien definida del problema.
Estos mdulos deben estar previamente definidos
Debe existir conexin entre los mdulos.
Las funciones de estos mdulos, es decir, de estos programas sencillos e
independientes no interfieren en el funcionamiento de otros programas.
Estos mdulos pueden ejecutarse unos a continuacin de otros o pueden ser llamados en
momentos determinados para su ejecucin.
15
3) PROGRAMACION ESTRUCTURADA:
Como consecuencia de los problemas que aparecieron en la programacin utilizando la
programacin convencional aparece en los aos setenta un nuevo concepto de
programacin: la programacin estructurada creada por el profesor E.W DIJKSTRA.
Consiste una tcnica constructiva de programas basada en el conjunto de reglas que
persiguen coordinar las diferentes etapas de programacin, utilizando para ello estructuras
especificas y optimizando los recursos lgicos y fsicos de cada lenguaje de programacin.
Esta metodologa solventa los costes producidos y mejora la productividad del equipo de
proyecto.
Otra definicin puede ser la siguiente: es un criterio de programacin basado en el teorema
de la estructura de (BOHN y JACOPINI) el cual dice que todo programa limpio se puede
describir utilizando 3 estructuras: secuencia, seleccin, iteracin, es decir, que cualquier
programa se puede resolver anidando estas tres estructuras.
La programacin estructurada se utiliza para aumentar la eficacia del ordenador para ello
los programas tiene que tener una estructura fcil y comprensible, consiguiendo programas
fiables, fcilmente modificables, y manejables.
El mtodo de trabajo ms antiguo dentro de esta programacin es el mtodo de WARNIER,
basado en una organizacin lgica de conjuntos.
La programacin modular y la programacin estructurada son criterios de programacin
complementarias por que por la programacin modular descomponemos el programa en
partes ms pequeas y con la programacin estructurada desarrollamos estos mdulos.
Lo que se busca con la programacin modular y la programacin estructurada es:
Adaptarse fcilmente a las modificaciones.
Propiciar una puesta a punto ms rpida
Posibilitar una cmoda interpretacin de los programas por diferentes programadores.
4) DOCUMENTACION:
La documentacin nos da informacin sobre 3 cosas: que hace el programa, como se
construye, y como usar el programa.
La documentacin puede ser de dos tipos:
Interna : que consiste en poner comentarios
Externa : es el manual y puede ser de dos tipos:
De usuario: queremos tener una informacin precisa de lo que hace el programa, una
documentacin clara para manejar el programa sin saber usarlo demasiado y esta formado
por:
16
De sistema: esta documentacin nos muestra el camino que tenemos que seguir para el
desarrollo de un programa
- Definir los requisitos del problema
- Ver o describir generalmente el programa
- Descomponer el problema grande en mdulos(descripcin)
- Coger estos mdulos y hacer un pequeo programa
- Pruebo los modulos y los junto en la resolucin para dar lugar al programa grande
Diccionario de datos: documento que detalla todas las entidades relevantes del sistema
( estructuras de datos, archivos, procedimientos para tratar las estructuras)
Este tipo de documentacin sirve para:
- Por una parte para el usuario, para saber todo lo que utiliza el programa o el
sistema.
- Para el mantenimiento, por si se quiere hacer posibles modificaciones.
17
EJERCICIOS
ORDINOGRAMAS
Dan 3 nmeros tenemos que ver si la suma de 2 de ellos es igual a uno de ellos.
INICIO
INICIO
LEER A
LEER B
LEER C
LEER A
LEER B
LEER C
SI
A=B+C
D=A+B
E=A+C
F=B+C
NO
D=C
I
NO
SI
NO
E=B
NO
SI
B=A+C
SI
C=A+B
NO
DISTINTOS
SI
FIN
F=A
NO
Inicio
Leer A B C
Si A=B+C entonces
SI
18
FIN
Escribir iguales
Sino
Si B=C+A ents
Escribir iguales
Sino
Si C=A+B ents
Escribir iguales
Sino
Escribir distintos
Fin si
Fin si
Fin si
Fin
DISTINTOS
INICIO
Inicio
Leer N
R=O
C=O
Repetir
C=C+1
R=C+R
Hasta C=N
Escribir resultado
Fin
LEER N
C=O
R=O
C=C+1
R=C+R
C=N
NO
SI
R
FIN
PSEUDOCODIGO:
Utilizar palabras que utilizamos normalmente
1. operadores: suma resta producto, division, < >..
2. nombres
3. comentarios: indicar lo que se hace comentario
4. palabras reservadas: identifica una de las estructuras de los organigramas--- inicio, fin
ESTRUCTURA SELECCIN
19
Si A=B+C entonces
Escribir
Si no .
Fin si
NO
A=B+C
SI
INICIO
LEER A Y B
SI
NO
A>B
NO
A<B
ESCRIBIR A ,B
SON IGUALES
SI
ESCRIBIR B,A
FIN
ESTRUCTURAS REPETITIVAS
Pueden ser de 2 tipos :
Si sabemos las veces que queremos repetir la accion a realizar (PARA)
Si no lo sabemos (REPETIR o MIENTRAS)
Accion 1
Accion 2
Accion N
20
REPETIR:
Repetir
Accion 1
Accion 2
.
.
Accion N
Hasta condicion
NO
cond
SI
FIN
C=C+1
R=C+R
C=N
NO
SI
FIN
NO
cond
SI
Operacin
..
21
INICIO
Inicio
Leer n
Si n<1 ents
Escribir no vale
Sino
Cont=O
Fact=1
Repetir
C=C+1
F=F*C
Hasta C=N
Escribir factorial
Fin si
Fin
LEER N
NO
SI
N<1
NO VALE
CONT=O
FACT=1
C=C+1 F=F*C
C=N
FACTORIAL
NO
FIN
SI
Fact=1
Mientras n<>0 hacer
Fact=fact*N
N=N-1
Fin mientras
Escribir resultado
Fin
F=1
NO
N<>O
NO VALE
SI
F=F*N N=N-1
FIN
INICIO
A,B,C,D
LEER A B C D
SI
NO
A>o=B
MAXI =A
MAXI=
B
SI
NO
M<C
MAXIMO =C
22
NO
SI
M<C
SI
ESCRIBIR D
ESCRIBIR M
FIN
Otra forma:
Inicio
Leer A B C D
Si A >o=B ents
Ma=A
Sino
Ma=B
Fin si
Si C >o=D ents
M=C
Sino
M= D
Fin si
Si Ma>o=M
Escribir Ma
Sino
Escribir M
Fin si
Fin
AB C D
INICIO
LEER A B C D
A>o=B
SI
NO
MA =A
MA =B
SI
NO
C>o=D
M =C
M=
D
SI
SI
NO
MA>O=M
ESCR MA
ESCR M
FIN
Programa que pide nmeros y los vaya sumando, nos de la media hasta introducir un
numero negativo.
Inicio
Leer N
S=O
M=O
C=O
mientras N>o=O hacer
INICIO
S=O
M=O
C=O
NO
N>o=O
NO
C<>O
23
S=S+N
C=C+1
Leer N
Fin mientras
Si C=O ents
M=S/C
Escribir M
Escribir S
Fin si
Fin
SI
SI
SI
SI
S=S+N
C=C+1
LEER N
M=S/C
LEER N
ESCR M
ESCR S
FIN
INICIO
S=O
P=2
NO
P<50
ESCRI
BIR S
SI
SI
S=S+P
P=P+2
FIN
sumar los nmeros pares pasando x todos los nmeros indicando si es par o no
Inicio
S=O
N=2
Mientras n<50 hacer
Si n mod 2=0 entonces
Par
S=S+N
Sino
Impar
N=N+1
Fin si
Fin mientras
Escribir suma
Fin
INICIO
S=O
N=2
N<50
SI
SI
SI
SI
NO
ECRI
S
NO
NMOD2=0
PAR
IMPAR
FIN
S=S+N
24
N=N+1
INICIO
C=O
S=O
Leer D
LEER DURACION
NO
D< = O
SI
SI
LEER DURACION
NO
SI
D<=3
SI
S=10
C=4
C<=D
COSTE=10
NO
SI
SI
S=S+5
C=C+1
ESCRIBIR COSTE
FIN
Otra forma:
25
FIN
INICIO
C=O
S=O
SI
C<3
NO
SI
C=C-3
S=C*5+1O
S=10
1O
ESCRIB COSTE
Disear un algoritmo que dados 10 nmeros enteros, indique cuales son pares, nos los
muestre y calcule la media de los impares.
Inicio
S=O
C=O
I=O
P=O
Leer N
Repetir
Repetir leer N
Hasta n>O
Si Nmod2=O ents
Mostrar p
Cpar=cpar+1
Sino
Cimp=Cimp+1
S=S+N
Fin si
C=C+1
Hasta C=1O
M=O
Si contador par =O ents
M=S/Cimp
Escribir media
Fin si
Fin
INICIO
S=O
C=O
I=O
P=O
LEER N
SI
N< O
SI
SI
SI
NO
NMOD2=0
NO
CIMPAR=CI+1
S=S+N
MOSTRAR P
CPAR=CPAR+
1
C=C+1
NO
SI
C=1O
SI
NO
M=O
CPAR=O
M=S/Ci
SI
SI
ESCRIBIR MEDIA
FIN
26
ESTRUCTURAS REPETITIVAS
PARA : Si sabemos que las veces que tenemos que repetir algo podemos usar la
estructura para
Ventaja : si le dices los valores entre los que esta hace la operacin automaticamente.
Para variable desde inicio
hasta final hacer
fin para
Variable
Inicio,final,incr
INICIO
LEER N
CR=O
C=O
CU=O
NO
NO
C<>N
FIN
SI
SI
C=C+1
CR=C*C
CU=CR*C
ESCRIBIR
CUADRADO
Y CUBO
INICIO
DIAS =1
SUELDO=
O
DIAS < =5
SI
SI
27
NO
SUELDO
Leer horas
Leer turno
SI
SI
FIN
NO
T=M
NO
T=T
SI
SI
S=S+H*60
0
S=S+H*80
0
S=S+H*100
0
DIAS=DIAS
+1
INICIO
Dias=1
S=O
DIAS
1,5,1
SUELDO
LEER HORAS
LEER TURNO
FIN
SI
T=M
SI
S=S+H*60
0
NO
NO
T=T
S=S+H*100
0
SI
SI
S=S+H*800
D=D+1
SEGUN
28
=1 --------------=2---------------=N----------------Fin segun
=1
=2
= otros
Queremos que nos den nmeros por teclado hasta que nos den uno negativo
1, 2, 3, 4
INICIO
Inicio
C1=O C2=O C3=O C4=O
Leer n
Mientras n>O hacer
Si n>=1 y n<=4 entonces
Si n=1 entonces
C1=C1+1
Sino
Si n=2 entonces
C2=C2+1
Sino
Si n=3 ents
C3=C3+1
Sino
C4=C4+1
Fin si
Fin si
Fin si
Sino Escribir mensaje
Fin si
Leer n
Fin mientras
Escribir mensaje
fin
C1=0
C3=0
C4=0
LEER N
NO
N>O
MENSAJE
SI
SI
N=1
SI
FIN
NO
SI
N >=1
N<=4
MENSAJE
SI
SI
C1=C1+
1
NO
N=2
SI
SI
C2=C2+
1
NO
SI
N=3
SI
C3=C3+
1
NO
C4=C4+
1
Inicio
Leer n
C1=O
NO
SOLUCION
29
C2=O
C3=O
C4=O
Mientras N>O hacer
Segn N hacer
=1 C1=C1+1
=2 C2=C2+1
SI
SI
=1
FIN
=2
=3
=4
=otro
=3 C3=C3+1
=4 C4=C4+1
=1
=2
=3
=4
C4=C4+
M
C1=C1+
C2=C2+
C3=C3+
1
=otro escribir mensaje
1
1
1
fin segn
leer n
fin mientras
LEER N
escribir solucion
fin
Tenemos una carrera con 300 corredores vamos a pedir por teclado el tiempo en
minutos que han tardado el dorsal del ganador y con que tiempo y el tiempo medio
suponiendo que no hay empates
INICIO
Inicio
Ganador=O
Total=O
Tminimo=10000
Para dorsal desde1
Hasta 300 hacer
Leer tiempo
Total =total+tiempo
Si total<tm ents
Ganador = dorsal
Total=tm
Sino
Fin si
Fin para
Total=total/300
Escribir corredor
Escribir TM
Escribir total
Fin
GANADOR=
O
TOTAL=O
TM=O
DORSAL
1,300,1
TOTAL=TOTAL/3
00
LEER
TIEMPO
Total=total+tiempo
NO
T<TM
ESCRIBIR GANADOR
ESCRIBIR TM
ECRIBIR TOTAL
SI
SI
FIN
GANADOR =TM
INICIO
R=O A=O
S=O N=O
P=3,14
1---AREA
2---SUPERFICIE
LEER RY N
30
A=R*R*P
escribir A
=2 si R>0 entonces
S=2*P*R
escribir S
=otro escribir mensaje
Fin segn
Fin
FIN
=1
=2
N>O
N>O
SI
=OTROS
SI
MENSAJE
SI
SI
NO
S=R*R*P
NO
A=R*R*P
ESCRIBIR A
Algoritmo para sacar por pantalla todos los divisores de un numero mayor que 0
INICIO
Inicio
C=0
Repetir leer N hasta
n>o
contador =N
si N mod cont=O entonces
escribir contador
sino
fin si
C=C-1
Repetir si cont=O entonces
Escribir contador
Hasta C=O
Fin
LEER N
N>O
NO
SI
SI
CONTADOR=
N
SI
N MOD CONT=O
SI
ESCRIBIR
CONTADORR
NO
CONTADOR= CONTADOR-1
CONTADOR=O
SI
SI
FIN
NO
C=N
CONTADOR =CONTADOR+1
Inicio
Repetir leer N
hasta N>O
para I desde 1 hasta N
INICIO
LEER N
SI
N<=O
31
SI
hacer
si n mod I =O entonces
escribir I
fin si
fin para
Fin
NO
FIN
I
1,N,1
N MOD I=O
SI
SI
ESCRIBIR I
NO
INICIO
DIVISOR=O CONT=2
DAME NUMERO
LEER N
NO
N>O
SI
SI
NO
SI
SI
CONTADOR<N
D=O
N MOD CONT=O
SI
SI
SI
DIVISORES=DIVISORES+1
NO
C=C+1
NUMERO PRIMO
FIN
INICIO
LEER N
NO
N>0
SI
SI
32
NO
Fin
N MOD
10=A
ESCRIBIR A
NO
N=N/10
N=O
ESCRIBIR N
FIN
SI
SI
INICIO
POTENCIA
=1
LEER BASE
SI
SI
BASE<=O
NO
LEER EXP
SI
SI
EXP>=O
EXP=O
NO
NO
I
1, EXP, 1
SI
SI
P=P*BAS
E
ESCRBIR POTENCIA
FIN
POTENCIA=POTENCIA*BAS
E
CONTADOR=CONTADOR+
33
NO
SI
CONTADOR>=EXP
SI
ESCRIBIR POTENCIA
FIN
INICIO
SUMA=O
LEER N1
N2
N1 N2 <=O
NO
SI
SI
LEER N1 N2
NO
N1MOD2<>0
S=S+N
2
SI
SI
N1>1
NO
SI
SI
SI
SI
N1=N1/2
N2=N2*2
N1MOD2<>0
NO
S=S+N
2
FIN
INICIO
34
Leer A B C
D= Sqrt ( B*B- ( 4*A*C ) )
Hasta
D<O
D= Sqrt D
X1 = -B+D/2a
X2 = -B-D/2a
Escribir X1 X2
Fin
LEER A B C
D= SQRT(B*B-(4*A*C)
)
D= SQRT(D) , X1=
-B+D/2A
X2 =-B-D/2A
D<0
ESCRIBIR X1 X2
FIN
INICIO
LEER A
LEER C
LEER B
A=C
A=C
B=C
A<>B<>C
B=C
A=C
A=B=C
A=B
FIN
Algoritmo que nos muestre en pantalla un tringulo hecho con asteriscos dndote el
lado Ejemplo: lado 3 *
INICIO
35
**
***
LEER LADO
I
1,LADO,1
Inicio
Pedir Lado
Para I Desde 1 Hasta Lado Hacer
Para J Desde 1 Hasta I Hacer
Escribir*
Fin Para
Saltar Lnea
Fin Para
Fin
FIN
J
1, I,1
SALTAR LINEA
INICIO
PRECIO=0
LEER DIAS
LEER DISTANCIA
DIAS>0 DISTANCIA>0
PRECIO=
DISTANCIA*2*8
2DIST>1000
DIAS>7
PR=PR-PR*0,3
PRECIO
FIN
Inicio
P=0
C=O
S=0
Repetir
C=C+1
P=P+2
INICIO
P=0 S=0
C=0
C=C+1
P=P+2
S=S+P
FIN
C=N
36
S=S+P
Hasta C=N
Ecribir S
Fin
Inicio
Leer A
B=Amod2
Si B=O
Par
Sino Impar
Fin
INICIO
LEER A
B=MOD2
B=0
PAR
FIN
IMPAR
Inicio
Escribir Men
Leer Opcin
Mientras Opcin<>3 Hacer
Segn Opcin Hacer
=1 Leer N
Mientras N> =0 Hacer
Leer N
Fin Mientras
=2 Leer A B C D
Suma =A+B
F=C+A
Si Suma >Suma 2 Entonces
Escribir Suma1
Sino
Si Suma2>Suma1 Entonces
Escribir Suma 2
Sino
Escribir Igual
Fin Si
Fin Si
= Otros Escribir Error
Fin Segn
Escribir Menu
Leer Opcion
Fin Mientras
Fin
INICIO
1=1OPCIO
N
2=2OPCIO
N
LEER OPCION
FIN
OP<>3
OPC
LEER AB
LEER CD
LEER N
N>0
ERROR
E=A+B
F=C+D
E>F
E ES M
F>E
F ES M
37
F=E
Algoritmo que nos calcule el importe apagar por un vehculo en una carrera
Para bicis =100
Coches =30 pts por km
Motos= 40 pts por km
Camiones= 50 pts por Km + 10 por toneladas
Inicio
Total=0
Coches =1
Bicis=2
Motos=3
Camiones=4
Segn Opcion Hacer
=1 Repetir Leer Km
Hasta Km>0
T=Km*30
Leer Total
=2 Total 100
=3 Repetir Leer Km
Hasta Km>0
T=Km*40
Leer Total
=4 repetir leer km
hasta km>0
leer toneladas
si tonel>0 entonces
Total=10*tone
Fin si
T1= total+50*km
=otros error
Escribir importe
Fin
INICIO
1=COCHES
2=BICIS
3=MOTOS
4=CAMIONE
S
OPCION
T=100
LEER KM
LEER KM
LEER KM
KM>0
KM>0
KM>0
T=KM*40
LEER To
T=KM*30
LEER T
LEER T
To>0
T=10*To
T1=T+50*K
M
38
ERROR
IMPORTE
FIN
TEMA IV
INTRODUCCION A
1)
2)
3)
4)
5)
39
CARACTERISTICA S
Lenguaje complicado si no se tiene cierta experiencia a la hora de elaborar programas.
Suministra una visin de conjunto del problema que queremos resolver.
Es un lenguaje muy eficaz ya que ofrece soluciones que nos permiten resolver cualquier
problema que nos planteemos.
Ofrece libertad para organizar el trabajo es decir que las cosas se pueden hacer de
diferentes maneras pero siempre llegas a la misma solucin.
Es un lenguaje de alto nivel es decir que se asemeja con el lenguaje natural.
Portabilidad o flexibilidad; se puede utilizar en cualquier ordenador.
Permite programar como lenguaje de bajo nivel consiguiendo mayor eficacia, se puede
ver como un paso intermedio en el camino, en realidad no se puede encuadrar en ningn
sitio.
Es un lenguaje potente porque permite realizar multitud de tareas.
Es un lenguaje muy utilizado en distintos tipos de aplicacin.
Reutilizacion: aprovecha el uso de tareas ya implementadas.
No es un lenguaje muy estructurado como ocurre en lenguajes como el PASCAL
Un aspecto destacable del paso del tiempo en C es su control sobre aspectos del
computador a la manera de los lenguajes ensambladores.
Resumiendo C es un lenguaje de proposito general es decir que puede ser utilizado para
programar una gran variedad de aplicaciones .
Por su diseo original es un lenguaje facilmente transportable: como es posible utilizar las
bibliotecas para realizar tareas que dependan de la arquitectura del ordenador, se puede
compilar un programa en casi cualquier maquina.
Es un lenguaje de nivel medio. Tradicionalmente se divide a los lenguajes de programacion
en L de nivel alto y en L de nivel bajo por su permision a no utilizar los conceptos de
programacion estructurada.
El C es un lenguaje modular: los programas pueden escribirse en modulos que pueden ser
almacenados en distintos ficheros y luego compilados separadamente. Mas tarde, cada una
de estas unidades compilables pueden ser almacenadas en un mismo fichero . los modulos
mas utilizados pueden guardarse en bibliotecas para luego poder ser usadas en otros
programas.
40
41
ignorados por el computador y no los tome como sentencias a ejecutar; y suelen ser
utilizados para hacer mas claro el programa para posibles modificaciones
Una llave de apertura { la cual indica donde comienza la funcin.
El cuerpo: todas las sentencias de control, operaciones aritmticas
Una llave de cierre } la cual indica el fin de la funcin.
Otra manera de ver su estructura es la siguiente:
Una cabecera.
Declaracin de argumentos.
Declaracin de variables locales.
Sentencia compuesta.
Valor devuelto.
En todo programa hay una funcin que siempre tiene que aparecer que es aquella que todo
programa comienza siempre ejecutando: main ( ).
LA FUNCION MAIN( ): La funcin main( ) es una funcin particular. La primera
particularidad es que a esta funcin la invoca el sistema operativo y no otra funcin. De
esta forma cuando desde el S.O. ejecutamos nuestro programa ya compilado y enlazado, el
S.O. lo que hace es llamar a esa funcin. Por tanto, todo programa en C debe tener una
nica funcin main ( ) que ser la primera en ejecutarse y la que llame al resto de funciones
de nuestro programa, si las hubiera.
El ( ) sirve para indicar que hacemos referencia a una funcion.
Cuando utilizamos Void main( ): ni espera ni devuelve nada al sistema operativo, y cuando
utiliza int main( ) o main( ) : devuelve un entero al sistema operativo, si finaliza
normalmente devuelve un cero. Cualquier otro valor implica algn tipo de error.
COMPI LACION
La compilacin es una de las fases ms importantes en la elaboracin de un programa que
consiste en traducir un programa escrito en un lenguaje de alto nivel llamado programa
fuente en un programa llamado programa objeto escrito en un lenguaje de bajo nivel a
travs de un compilador y mediante la consulta de una serie de tablas.
Estas tablas funcionan como un diccionario. El compilador toma una instruccin y busca en
la tabla su cdigo binario correspondiente. A continuacin, sustituye la instruccin por su
42
cdigo binario en el programa objeto. Este proceso se repite para cada una de las
instrucciones que forman el programa.
Puesto que cada lenguaje de programacin utiliza instrucciones con formato diferente, cada lenguaje
de programacin tiene su propio compilador.
La compilacin permite la deteccin de todo tipo de errores para su posterior correccin por parte del
programador.
Los errores generados por el compilador se deben a la existencia de instrucciones que no conoce, es
decir, que no se encuentra en su tabla.
Si se detectan errores durante la compilacin, se genera igualmente un programa objeto por
supuesto inservible y adems una lista de errores que indica la lnea de cdigo fuente en que fue
detectado el error y el tipo.
Estos errores se llaman errores sintcticos.
Una vez que hemos escrito y compilado el programa, es decir, despus de la creacin de
los mdulos solo queda unirlos mediante un enlazador cuyas dos tareas son: enlazar los
mdulos en cdigo maquina y convertir esos mdulos en un programa ejecutable.
Y despus de la obtencin de un programa ejecutable, sin errores de compilacin ni de
enlazado viene la parte ms difcil: comprobar a travs de la depuracin que el programa
funciona bien; o sea, que no contiene errores lgicos, es decir, errores que se producen en
los ordinogramas y en la codificacin y tienen como resultado un funcionamiento incorrecto
del programa.
A travs de un depurador se obtiene un programa libre de errores, es decir, depurado.
Programa fuente
Compilador
Programa. objeto
Enlazador
Pr.ejecutable
43
TEMA V
PROGRAMACION EN C
1)
2)
3)
4)
5)
ELEMENTOS DE UN LENGUAJE
TIPO DE DATOS
FUNCIONES DE ENTRADA O SALIDA
ENTENCIA DE CONTROL
ESTRUCTURA DE UN PROGRAMA
ELEMENTOS DE UN LENGUAJE:
Palabras clave
Separadores
Operadores
Identificadores
Constantes
Cadenas de caracteres: string.
44
Palabras clave: son las que constituyen realmente el lenguaje, son un conjunto de
instrucciones equivalentes a las utilizadas en el pseudocodigo.
Todas las palabras reservadas se deben escribir en minscula
Las palabras clave no se pueden utilizar como identificadores,
Estas son:
PALABRAS CLAVE
BREAK
ELSE
SWITCH
CASE
FLOAT
UNSIGNED
CHAR
FOR
VOID
CONTINUE
IF
WHILE
DEFAULT
INT
SIGNED
DO
LONG
AUTO
DOUBLE
RETURN
RETURN
CONST
SHORT
SIZEOF
GOTO
TYPEDEF
VOLATILE
REGISTER
UNION
INTERRUP
ENUM
45
46
mayor =(A>B)?A:B
Aunque el operador es complejo practicamente equivale a una sentencia de control del flujo del
programa. Antes de ser utilizado debemos tener en cuenta que el codigo del programa debe ser legible
tanto para nosotros como para el resto de programadores.
- En C el operador de asignacion (=) no significa igual a. Es un operador de asignacion de
valores. Ejemplo
Suma = 1;
Lo que hay a la izquierda del signo igual es el nombre de la variable mientras que lo que hay
a la derecha es el valor de la misma.
Con el operador de asignacion, se puede asignar a varias variables a la vez un mismo valor
de la siguiente forma:
Chita= tarzan= jane =68;
Estas asignaciones se efectuan de derecha a izquierda es decir jane toma en primer lugar
el valor 68, a continuacion lo toma tarzan y por ultimo chita.
Cadena de caracteres.
En el lenguaje C es obligatorio que todas las variantes se declaren antes de ser utilizadas
47
OPERADORES
O. MONARIOS
(tambin llamados de incremento y decremento)
++i (La variable i se incrementa una unidad antes de
O. ARITMETICOS
SUMA = +
RESTA= ser utilizada, es el llamado modo prefijo.)
DIVISION = /
(si divido un numero real entre un i++ (la variable i se incrementa 1 unidad despus de ser
utilizada, es el llamado modo sufijo.)
n entero el resultado es un n
real)
MULTIPLICACION = *
RESTO DE LA DIVISION
ENTERA= % (modulo)
( Este operador no se puede
O. RELACIONALES
>
MENOR <
MAYOR
O.ASIGNACION
=
{ S=S+H }
+ = (i =i+d) (i+=d)
-= (i=i+d) (i-=d)
*= (i=i*d) (i*=d)
/= (i=i/d) (i/=d)
%= (i=i%d) (i%=d)
IGUAL ==
DISTINTO !=
>=
MENOR IGUAL < =
MAYOR IGUAL
O. DE DIRECCION:
* ( operador de contenido de
apuntado) *pun
&
--i
i--
Ejemplo:
Si f<g entonces
Min=f
Sino
Min =g
Fin si
(esto en C se escribe
asi):
min= (f<g)? f : g ;
O.LOGICOS
&& AND
| | OR
NOT
- NEGATIVO
(cambia el signo de la
variable)..
<<
>>
desplazamiento a la izq
desplazamiento a la
derecha
( ) [ ]
&
--,++,~,!
^
|
&&
||
?:
/=,*=,-=,+=,=
*,/,%
+,<<,>>
<,<=,>.>=
==,!=
OPERADOR
CONDICIONAL
Es un operador
ternario es decir con
tres operandos.
Representacion:
Expr1? expr2:epr3 ;
48
TIPO S DE DATOS
Los tipos de datos bsicos de C son:
INT : es un tipo de dato numerico que guarda numeros enteros positivos o negativos.
Utiliza 16 bits para su almacenamiento. Con las variables int pueden utilizarse los cualificadores
SIGNED, UNSIGNED, SHORT y LONG.
Ejemplos : Tipo identificador;
Int letra;
CHAR: se utiliza para variables de tipo carcter. Guardan caracteres del codigo ASCII. Necesitan 8
bits para su almacenamientos. Pueden utilizar los cualificadores SIGNED y UNSIGNED.
Ejemplos: Char identificador;
Char letra=a.otra=b;
FLOAT: sirven para representar numeros en coma flotante es decir reales con precision simple de 6
digitos (como parte decimal) ocupa normalmente 32 bits.
Pueden utilizarse el cualificador LONG(longfloat=double).
Ejemplos : Float identificador;
Float numero;
DOUBLE: representa un numero en coma flotante con doble precision tiene 14 digitos de precision
y ocupa 64 bits.. representa datos del mismo tipo que el float pero con mayor precision . el double se
emplea poco porque necesita el doble de memoria que un float. Por ejemplo una variable que
controla un bucle for es mejor definirla como int, por que las entera contienen pocos bits y se
procesan mas rapidamente que las float o doubles. Permite el cualificador LONG,
Ejemplo : Double identificador;
Double numero;
De los cuatro tipos de los anteriores se pueden derivar otros tipos de datos.
Esto se realiza por medio de calificadores o modificadores que se colocan antes del nombre tipo.
49
SHORT: acorta los rangos de los tipos de variables. Puede utilizarse con las variables de tipo INT,
pero con estas el resultado final seria el mismoque si no usaramos SHORT.
Es decir ocupa el mismo espacio que un int normal ,16 bits.
Ejemplo: modificador cualificador identificador;
Short int numero;
LONG : alarga los rangos de los tipos de las variables. Se puede emplear tanto en los numeros
enteros (long int) como en los numeros en coma flotante (long float) e incluso en los double. El
almacenamiento del long int es, normalmente, dos veces el de un entero, ocupa pues 32 bits y puede
tomar valores positivos y negativos.
Un long float ocupa el doble que un float e igual que un double. Por lo tanto no hay ninguna
diferencia entre double y long float.
Ejemplo : Long float identificador;
Long float numero;
SIGNED y UNSIGNED: los definidos como signed pueden ser positivos o negativos, mientras que
los unsigned no guardan valores negativos. El unsigned int puede tomar valores mayores que los int
porque no tiene signo. Ocupa 16 bits.
Ejemplo : Unsigned int variable;
Cuando hay que poner mas de un cualificador, estos se pueden colocar en cualquier orden. Si en una
definicion de variable no se escribe ni el tipo de dato ni el cualificador o simplemente se escribe el
cualificador se sobreentiende que el tipo de dato es INT. Los cualificadores INT y CHAR pueden
combinarse con los modificadores SIGNED y UNSIGNED.
La utilidad de SHORT y LONG es proporcionar diferentes tamaos de datos.
SHORT
LONG
CHAR
INT
FLOAT
DOUBLE
TIPO DE DATOS
Enteros
Enteros
Caracteres
Enteros
Reales
Reales
4 bytes
2 bytes
1 bytes
2 bytes
4 bytes
6 bytes
En una declaracin asociamos un tipo de datos a una variable, las variables hay que declararlas antes
de que se empiecen las sentencias ejecutables
50
51
2. Si se desea leer una variable de tipo carcter no se tiene que usar el aspersan &.
Ejemplos : Scanf (%d;&numero);
Scanf (%s %s,frase1,frase2);
Hasta que se explique mas detalladamente el paso de parmetros en las funciones diremos
que una variable se pasa por referencia cuando va precedida del operador & en la llamada a
una funcin.
Cada elemento de la lista de argumentos debe tener su especificacin en el formato.
La funcion Scanf devuelve el control cuando recibe un carcter nulo o de terminacion
(pulsar INTRO despues de leer el dato) o bien cuando se produce un error en la conversion.
GETS: Funcin que lee una cadena entera de caracteres hasta que se pulse intro.
Si utilizamos scanf para una leer una cadena de caracteres parara cuando encuentre un
espacio en blanco su sintaxis es as:
Gets (variable);
Ejemplo: Char lnea; [20] ( tengo una variable llamada lnea que como mucho tiene 20
caracteres)
Gets (lnea); ( con Scanf seria as: Scanf (%S, lnea); )
Otras funciones de entrada son getch( ) y getche ( ).
SALIDA:
PUTCHAR: Es una funcin simtrica a getchar que nos saca un carcter por pantalla sin
salto de linea
Sintaxis: Char letra;
Putchar (letra);
PRINTF: Es una funcin que bsicamente lo que hace es imprimir o sacar por pantalla
una cadena de caracteres. Esta definida en la biblioteca STDIO por lo que hay que incluir
el archivo Stdio.h (en el cual encontramos las principales funciones de entrada y salida)
mediante la directiva de precompilacion Include <stdio.h> si se desea utilizar en un
programa.
La funcin printf tiene dos argumentos el primero se denomina formato , es %letra e indica
a printf ( ) como debe de tratar el segundo argumento. l % indica a la funcin que el
carcter que le acompaa es un comando de control de formato que le indicara como debe
imprimir el pseudo argumento.
Sintaxis : Printf (formato de los argumentos,lista de argumentos);
Ejemplo : printf (%i,2);
En este caso la i significa que el segundo argumento es un numero entero
52
En la funcin la cadena con el formato de los argumentos contiene los comandos que le
indican a la funcin tanto como visualizar los argumentos sobre la pantalla, como el n de
dichos argumentos.
Los argumentos se separan por comas en la lista de argumentos.
COMANDO
%C
%D
%E
%F
%O
%S
%U
%H
%I
%ID
%p
%x
TIPO DE ARGUMENTO
Carcter.
Entero Decimal
Flotante en Notacin cientfica
Real decimal
Octal
Cadena de caracteres
Entero Decimal sin signo (unsigned)
Hexadecimal
Entero
Entero largo
Puntero
Entero hexadecimal sin signo
Lo que hace la funcin printf( ) cuando se la llama es analizar la cadena de formato. Todos
los caracteres imprimibles, los que no estn precedidos por un %, se muestran en la pantalla
como tales. Cuando encuentra un comando de formato, lo utiliza para saber como imprimir
el argumento correspondiente segn dicho formato. Los comandos de formato y los
argumentos debern coincidir de izquierda a derecha. La cantidad de comandos de la
cadena de formato le indica a la funcin cuantos argumentos debe esperar.
Esta funcin nos saca mensajes de informacin por ejemplo:
Printf(introduce dos valores/n);
Cuando utilizamos la contrabarra el cursor pasa lnea.
Secuencias de escape: estan formadas por la barra invertida \ seguida de uno o mas
caracteres permitidos . gracias a estas secuencias se pueden enviar ciertos caracteres
especiales al monitor, a la impresora.
Son:
\a (sonido),\n(salto de linea), \f(salto de hoja o barrido de pantalla);\\ (representacion de
la barra); \? (representacion de la interrogacion); \ (representacion de las comillas); \b
(espacio atrs); \r (retorno de carro); \t (avance de carro); \0(null);..
PUTS: Esta funcin escribe una cadena de caracteres por pantalla seguida por un salto
de linea es decir no es necesario aadir \n al final de la cadena , lo aade la misma funcion.
La rutina que implementa PUTS es mucho mas corta que la de printf .
Su sintaxis es: puts (cadena de caracteres);
Ejemplo: Char lnea [20];
Puts (lnea)
53
TIPOS:
SENTENCIAS DE SELECCIN: las instrucciones que se van analizar nos permiten elegir o una
sentencia o otra.
1) If- else: sirve para elegir si se ejecutara una sentencia u otra, en funcin del valor booleano
de una expresin.
Su sintaxis es:
If (condicin)
{
sentencia1;
}
else
{
sentencia 2;
}
2) Switch: corresponde con la estructura segn del pseudo cdigo que permite la
eleccin de uno o varios casos. Es llamada la funcion de la selecion multiple.
El switch evala la expresin que debe ser obligatoriamente entera, que se
proporciona entre parntesis y compara su valor con todos los casos.
54
SENTENCIAS DE ITERACIN:
sent 1;
sent n;
}
while (condicion);
2) While: Permite repetir una sentencia mientras una determinada expresin sea
cierta. Si la condicion es falsa, no se entra enel bucle y no se ejecutan las
sentencias controladas por el while. La sentencia debera modificar alguna de las
variables de la expresion para que en algun momento la condicion sea falsa; si
esto no ocurre asi se producira un bucle infinito. Como en las demas sentencias
de control, si escribimos dos o mas acciones deberemos incluir llaves que
indiquen el inicio y el final de la estructura. Por lo tanto se pueden anidar
bucles while. Los bucles while son los menos apropiados en las situaciones en las
que ya se conoce el numero de iteraciones exacto que va a realizar el bucle.
Su utilizacion se reserva a casos inesperados de finalizacion del bucle.
Corresponde con la estructura mientras del pseudo cdigo
Su sintaxis es:
55
While (expresin)
{
Sentencia:
}
La primera parte del bucle for, usa una expresion de asignacion para una o mas
variables. Si se inicializa mas de una variable se deberia separar por comas. La
segunda parte, condicion , consta de una comparacion logica que utiliza los
operadores logicos de relacion. La tercera parte, incremento, consiste
normalmente en incrementar una o mas variables.
La condicion podra ser simple o compuesta pero tiene siempre el sentido de un
while (MIENTRAS SE CUMPLA LA CONDICION).
Cuando un bucle esta formado por varias sentencias se tiene que utilizar las
llaves en el caso de que solo haya una sentencia no es necesario utilizarlas.
Las tres partes del for se separan por (;) y cualquier otro argumento adicional
que se incluya en el bucle se separa por comas.
En C se pueden omitir las tres partes del for. En este caso la condicion
siempre sera verdadera y sera un bucle infinito FOR(;;) el cual se ejecuta
hasta que alguna de las sentencias que esten dentro del bucle pase el control
al exterior.
SENTENCIAS DE SALTO:
1) Break:
El bucle examina una serie de datos hasta que un valor dado de una de ellas
asigne la salida del bucle. La sentencia break nos permite salir de los bucles for
while y do-while, antes de alcanzar el valor terminal que determina la salida de
los mismos.
En caso de estar en sentencias anidadas lo que hace es salir incondicionalmente
de las mas interna.
Es sintacticamente correcta usarla en cualquier bucle, pero atenta contra la
programacion estructurada y hace dificil mantener y leer los programas puesto
que se esta aadiendo otro punto de salida en los bucles. La unica situacion en la
que esta justificada su utilizacion es para separar los casos de una sentencia
SWITCH.
Sintaxis: break;
2)
Continue:
56
Include <Stdio.h>
Include: Es una sentencia de inclusin de archivos que permiten incluir otros ficheros tanto
del usuario como del fabricante. Estos archivos contienen la declaracin de funciones,
variables, y constantes utilizadas por el programador.
Cuando el ordenador encuentra un comando (#include) , busca el fichero que corresponde
al nombre que le sigue y lo incluye en el fichero actual.
Es conveniente que los archivos include figuren al principio.
Stdio.h: es un archivo que contiene informacion relacionada con la entrada y salida de los
datos. Proviene de STANDARS INPUT/OUTPUT HEADER. Este archivo contiene
informacin de utilidad para el programa.
Ejemplo :
#include <stdio.h>
#include stdio.h
#include a:stdio.h busca en el disco a:
incluimos ficheros porque estos contienen la informacion necesaria . por ejemplo el
stido.h contiene tipos y macros necesarias para la entrada/salida standard.
math.h declara prototipos para funciones matematicas. Etc
#
57
Permite definir opciones y variables. Es decir identificar los datos utilizados en las
operaciones realizadas en el programa esto no es obligatorio depende del programa.
Esta directriz sirve para definir constantes simbolicas que se utilizaran a lo largo de todo
el programa.
Al compilar el programa el valor sera sustituido en cualquier lugar donde aparezca el
nombre referido. Este proceso se llama sustitucion en tiempo de compilacion.
El nombre de la constante (identificador) y el valor son introducidos por el usuario.
La sentencia #define se puede utilizar para constantes de tipo carcter y cadenas,
empleando apostrofes para los primeros y comillas para los segundos.
La expresion situada detrs de #define que se utilizara en todo el listado se denomina
identificador.la expresion que lo sigue es el valor que sustituira al identificador durante la
ejecucion del programa y se le denomina texto. El identificador esta separado del texro
mediante un espacio en blanco. Por convenio el identificador se escribe en mayusculas.
Ejemplos :
#define PI 3,14;
#define ESS S
Otra utilidad seria; supongamos que en un programa se necesita imprimir un mensaje error,
en varios lugares de un programa. Se puede crear la diractiva:
#define ERROR printf (\n *** ERROR***\n)
si en el programa aparece: if (estado>dato)
error;
ahora error se sustituiria por printf(\n***ERROR***\n)
Void main ( )
La funcion main es la funcion principal que aparece en la cabecera de un programa. Es el
punto de entrada al programa y el punto de salida. Solo se puede utilizar una unica vez en
cada programa, ya que si se usa mas veces el compilador no reconoce cual es el que indica el
comienzo. Los parentesis indican que hacemos referencia a una funcion.
Segn como sea el programa puede estar escrita de las siguientes maneras:
VOID MAIN ( ).
INT MAIN o MAIN ( )
Del dato VOID ya se hablado.
{
Una lista de declaraciones de argumentos: es decir de variables ya declaradas
al principio.
Sentencias y operaciones:
En un programa se deben especificar paso a paso las instrucciones para la
resolucion del problema en forma de sentencias. Cada sentencia deber terminar
en punto y coma que indica el final de la instruccin.
}
TEMA VI
58
LAS FUNCIONES
INTRODUCION
Una funcion es una unidad de codigo de programa auto contenida diseada para realizar
una determinada tarea.
Las funciones de biblioteca vistas hasta ahora sirven para realizar operaciones o calculos
de uso comun.
Sin embargo podemos definir nuestras propias funciones para que realicen determinadas
tareas.
El uso de estas funciones permite dividir un programa grande o complejo en un cierto
numero de componentes mas pequeos cada una con un proposito unico e identificable.
Esta tecnica se llama TOP DOWN o modularizar y presenta unas ventajas :
59
una funcion sigue las mismas reglas que los nombres de las variables:
- debe comenzar por una letra.
- Se permiten digitos despues de la primera letra.
- Solo son significativos los ocho primeros.
Cuando se define una funcion,. No se debe poner el; despues del nombre de la
funcion. Si se omite el ; se esta diciendo el compilador que se esta definiendo y no
usando la funcion.
Argumentos : son los argumentos necesarios para que la funcion realice su tarea van entre
parentesis y separados por comas.
Si la funcion no lleva argumentos simplemente se ponen los ( ).
Los argumentos formales son los que permiten que se transmita informacion
desde el punto del programa desde donde se la llama.
Los identificadores que tomamos como argumentos son locales a la funcion es
decir que no son reconocidos fuera de la funcion donde se tienen definidas.
60
#include <stdio.h>
#include <stdio.h>
int suma (a , b)
int a , b;
{
int res =0;
res=a+b;
return(res);
}
void suma (a , b)
int a , b;
{
int res =0;
res=a+b;
printf(%d,res);
return;
}
void main( )
{
int n1, n2 , resultado=0
printf (dame dos numeros);
scanf (%d %d ,&n1, &n2);
resultado=suma(n1,n2);
printf (el resultado es %d,resultado);
}
61
void main( )
{
int n1, n2 ,
printf (dame 2 numeros);
scanf (%d %d ,&n1, &n2);
suma(n1,n2);
}
Programa que lea un dato por teclado y diga si el dato >5(mensaje) y si el dato es<5 que
calcule la distancia.
#include <stdio.h>
Void maximo(x,5)
Int x;
Int y;
{
int d=0;
int max
if (x>5)
{
max=x;
printf(el maximo es %d,max);
return;
}
else
{
max=5
d=5-n;
pintf(la distancia es %d, d);
return;
}
}
void main ()
{
int n1;
printf(dame un numero);
scanf(%d,&n1);
void maximo(n1);
}
62
#include <stdio.h>
void main ( )
{
63
# include <stdio.h>
void main()
{
float a,b,c,d,maximo1,maximo2;
printf("dame cuatro numeros\n");
scanf ("%f %f %f %f", &a, &b, &c, &d);
if (a>=b)
{
maximo1=a;
}
else
{
maximo1=b;
}
if(c>=d)
{
maximo2=c;
}
else
{
maximo2=d;
}
if (maximo1>=maximo2)
{
printf("el maximo es %f\n",maximo1);
}
else
{
printf("el maximo es %f\n", maximo2);
}
}
Programa que nos pida numeros y los vaya sumando , nos de la media, hasta que
introduzcamos un numero negativo.
#include <stdio.h>
void main ()
64
{
/* declaracion de variables*/
float n,suma=0,media=0,introducidos=0;
printf ("dame un numero\n");
scanf ("%f", &n);
while (n>=0)
{
suma=suma+n;
introducidos=introducidos+1;
printf ("dame un numero\n");
scanf ("%f", &n);
}
if (introducidos!=0)
{
media=suma/introducidos;
printf ("la media es %f y la suma es %f\n", media, suma);
}
}
Programa que determine la cantidad a pagar por una llamada telefonica dependiendo de:
toda llamada que dura de 3 minutos tiene un coste de 10 pts, cada minuto mas es un paso
de contador y cuesta 5 pts mas.
#include<stdio.h>
void main ()
{
float tiempo,dinero=0,contador=0;
do
{
printf ("dame el tiempo\n");
scanf("%f",&tiempo);
}
while (tiempo<=0);
if (tiempo <=3)
{
dinero=10;
}
else
{
contador=4;
dinero=10;
while (contador<=tiempo)
{
dinero=dinero+5;
contador=contador+1;
}
}
printf ("el coste es %f\n",dinero)
}
Programa que permita dar elegir al usuario la opcion de calcular el area o la longitud de una
circunferencia.
#include <stdio.h>
#define PI 3.1416
65
void main ()
{
float superficie=0, area=0, radio;
int n;
printf ( " si quiere hacer el area pulse 1, si quiere hacer la
superficie
pulse 2");
scanf ( "%d", &n);
switch
{
(n)
case 1:
do {
printf ("dame el puto radio");
scanf ("%f",&radio);
if (radio<=0)
printf("Radio no vale");
}
while (radio<=0);
area=PI*radio*radio;
printf("el resultado es %f",area);
break;
case 2:
do {
printf ("dame el radio");
scanf ( "%f", &radio);
if (radio<=0)
printf (" radio no vale");
}
while (radio<=0);
superficie = 2*PI*radio;
printf ("el resultado es %f",superficie);
break;
default:
printf (" pedazo de gilipollas, te hemos dicho que metas el
1 o el 2 este numero te lo puedes meter por el culo");
break;
}
}
Disear un programa que nos indique dados 10 numeros cuales de ellos son pares y nos
los muestre y haga la media de los posibles numeros impares que haya en esos 10
numeros.
66
#include <stdio.h>
void main()
{
int suma=0,n,leidos=0,impares=0,pares=0;
float media=0;
do
{
printf("dame un numero\n");
scanf("%d",&n);
}
while(n<0);
while (leidos!=10)
{
leidos=leidos+1;
if(n%2==0)
{
printf ("este numero es par \n");
pares=pares+1;
}
else
{
suma=suma+n;
impares=impares+1;
}
do
{
printf("dame un numero\n");
scanf("%d",&n);
}
while(n<0);
}
printf("%d\n",pares);
if (impares!=0)
{
media=suma/impares;
printf ("la media es %f\n",media);
}
}
Programa que nos muestre el salario de un trabajador teniendo en cuenta que trabajan 5
dias a la semana y los turnos se pagan asi:
Turno maana=600 pts por hora.,Turno de tarde= 800pts por hora.,Turno de noche =1000 pts
por hora.
67
#include <stdio.h>
void main()
{
int dias=1, sueldo=0,turno,horas;
while (dias<=5)
{
printf ("dame las horas\n");
scanf ("%d", &horas);
printf("si el turno que usted tiene es de maana pulse 1 , si es de
tarde
pulse 2, y si es de noche pulse cualquier otro valor\n");
scanf("%d", &turno);
if (turno==1)
{
sueldo=sueldo+horas*600;
}
else
{
if (turno==2)
{
sueldo=sueldo+horas*800;
}
else
{
sueldo=sueldo +horas*1000;
}
}
dias=dias+1;
}
printf("el sueldo es %d",sueldo);
}
#include <stdio.h>
void main()
{
int dias=1, sueldo=0,turno,horas;
for (dias=1;dias<=5;dias++)
{
printf ("dame las horas\n");
scanf ("%d", &horas);
printf("si el turno que usted tiene es de maana pulse 1 , si es
de tarde pulse 2, y si es de noche pulse cualquier otro valor\n");
scanf("%d", &turno);
if (turno==1)
{
sueldo=sueldo+horas*600;
}
else
{
if (turno==2){
sueldo=sueldo+horas*800;
}
else
{
sueldo=sueldo +horas*1000;
}
}
}
printf("el sueldo es %d",sueldo);
}
Programa que nos pida que escribamos numeros que comprenden del 1 al 4 inclusives
que introduzcamos uno negativo y nos diga cuantas veces hemos escrito cada numero.
#include <stdio.h>
68
hasta
void main ()
{
int numero,cont1=0,cont2=0,cont3=0,cont4=0;
printf("Dame el numero 1,2,3 o 4\n");
scanf("%d",&numero);
while (numero>0)
{
switch (numero)
{
case 1:cont1=cont1+1;
break;
case 2:cont2=cont2+1;
break;
case 3:cont3=cont3+1;
break;
case 4:cont4=cont4+1;
break;
default: printf("El numero introducido no es
valido\n");
break;
}
printf ("Dame el numero 1,2,3 o 4\n");
scanf("%d",&numero);
}
printf("Has
printf("Has
printf("Has
printf("Has
introducido
introducido
introducido
introducido
el
el
el
el
1
2
3
4
%d
%d
%d
%d
veces\n",cont1);
veces\n",cont2);
veces\n",cont3);
veces\n",cont4);
69
Programa que teniendo en cuenta el suceso de que ha habido una carrera en la que
participaban 10 corredores, te diga quien ha sido el ganador y que tiempo ha recorrido
y diga cual es la media del tiempo total corrido por los 10 corredores.
#include
#include
#include
#include
<stdio.h>
<dos.h>
<conio.h>
<process.h>
void main()
{
int ganador=0, total=0, tiempo_minimo=10000,tiempo,dorsal=1;
do
{
printf ("dime el tiempo del corredor\n");
scanf ("%d",&tiempo);
total=total+tiempo;
if (tiempo<tiempo_minimo)
{
ganador=dorsal;
tiempo_minimo=tiempo;
}
dorsal=dorsal+1;
}
while (dorsal<=10);
total=total/10;
printf ("el ganador es el dorsal %d\n", ganador);
printf("el tiempo minimo recorrido es %d minutos\n",tiempo_minimo);
printf("el tiempo medio total es %d minutos\n", total);
sound (200);delay(500);nosound();delay(50);
sound (290);delay(500);nosound();delay(70);
sound (200);delay(520);nosound();delay(89);
sound (200);delay(500);nosound();delay(50);
sound (200);delay(500);nosound();delay(50);
sound (200);delay(500);nosound();delay(50);
sound (200);delay(500);nosound();delay(50);
sound (100);delay(3000);nosound();delay(50);
gotoxy (29,3);
textcolor (YELLOW+BLINK);
cprintf ("\n\n\n
-craked by abel - \n\n\n");
}
EUROCALCULADORA
#include <stdio.h>
70
#include <math.h>
#include <conio.h>
#include <dos.h>
#include <process.h>
#define euro 166.386
void main ()
{
float
num,suma=0,resta=0,multip=1,division=0,raiz=0,div1,div2,r1,minuendo,sustra
endo,euros,ptas,total;
int
menu,c=1,sumandos,menu2,menu3,menu4;
char
nombre[10];
textcolor(GREEN);
clrscr ();
sound(170);delay(500);nosound();delay(50);//EL PRIMER DELAY ES LA
DURACION
DEL SONIDO, Y EL SEGUNDO LA DURACION DEL SILENCIO ENTRE
SONIDO Y
SONIDO sound(170);delay(100);nosound();delay(50);
sound(170);delay(100);nosound();delay(50);
sound(340);delay(1000);nosound();
gotoxy(29,3);
printf("SOY DORA LA EUROCALCULADORA");
gotoxy(25,7);
printf("\n");delay (150);gotoxy(25,8);
printf("
\n");delay (150);gotoxy(25,9);
printf("
\n");delay (150);gotoxy(25,10);
printf("\n");delay (150);gotoxy(25,11);
printf(" 7 8 9 ( ) \n");delay (150);gotoxy(25,12);
printf("\n");delay (150);gotoxy(25,13);
printf(" 4 5 6 x / \n");delay (150);gotoxy(25,14);
printf("\n");delay (150);gotoxy(25,15);
printf(" 1 2 3 + - \n");delay (150);gotoxy(25,16);
printf("\n");delay (150);gotoxy(25,17);
printf(" . +/- 9 = C \n");delay (150);gotoxy(25,18);
printf("\n");delay (150);gotoxy(25,19);
printf("");
textcolor(RED+BLINK);
cprintf(" EUROCALCULADORA DORA ");
textcolor(GREEN);
cprintf("\n");delay (50);gotoxy(25,20);
printf("\n");
gotoxy(30,23);
textcolor(WHITE+BLINK);
cprintf("Cracked by ABEL
-");
getch();
textcolor(LIGHTGRAY);
clrscr ();
printf("\n - DIME TU NOMBRE: ");
scanf("%s",&nombre);
clrscr ();
printf("\n\n HOLA %s, YO SOY DORA LA EUROCALCULADORA",nombre);
printf("\n\n
Cracked by ABEL
-");
printf("\n\n\n\n\nSupongo que has entrado en este programa para algo asi
que
elige una opcion:");
printf("\n\n\n - Pulsa 1
para hacer una SUMA.\n - Pulsa 2
para hacer
una RESTA.\n - Pulsa 3
para hacer una MULTIPLICACION.\n Pulsa 4
para hacer una DIVISION.\n - Pulsa 5
para
hacer una RAIZ CUADRADA.\n - .
Pulsa 6 para realizar un CAMBIO DE MONEDA.\n - Pulsa 7
para
realizar operaciones
TRIGONOMTRICAS.\n - Pulsa 8
Para
realizar LOGARITMOS.\n - Pulsa 9
Para SALIR del
programa.\n\n\n\n\n");
scanf("%d",&menu);
printf("\n\n\n\n");
71
switch (menu) {
case 1: printf("Has elegido realizar una SUMA");
do {
printf("\n\nCuantos sumandos vas a introducir?: ");
scanf("%d",&sumandos);
}while(sumandos<2);
printf("\n\nA tus rdenes, %s\n",nombre);
do {
printf("\nIntroduce el %d sumando: ",c);
scanf("%f",&num);
suma=suma+num;
++c;
}while(c<=sumandos);
printf("El resultado se la suma es: %f , verdad?\nToma
ya!!",suma);
break;
case 2: printf("Has elegido realizar una RESTA");
printf("\n\nComo tu quieras %s\n",nombre);
printf("\n\nIntroduce el minuendo: ");
scanf("%f",&minuendo);
printf("\nIntroduce el sustraendo: ");
scanf("%f",&sustraendo);
resta=minuendo-sustraendo;
printf("El resultado se la resta es:%f ,verdad?\nToma
ya!!",resta);
break;
case 3: printf("Has elegido realizar una MULTIPLICACION");
do {
printf("\n\nCuantos multiplicadores vas a
introducir? ");
scanf("%d",&sumandos);
}while(sumandos<2);
printf("\n\nA tus rdenes, %s\n",nombre);
do {
printf("\nIntroduce el %d multiplicador: ",c);
scanf("%f",&num);
multip=multip*num;
++c;
}while(c<=sumandos);
printf("El resultado se la multiplicacion es:%f
,verdad?\nToma
ya!!",multip);
break;
case 4: printf("Has elegido realizar una DIVISION. OK
%s",nombre);
printf("\n\nIntroduce el dividendo: ");
scanf("%f",&div1);
do {
printf("\nIntroduce el divisor (distinto de 0): ");
scanf("%f",&div2);
if (div2==0) {
sound(120);delay(100);nosound();
}
else{
}
}while(div2==0);
division=div1/div2;
printf("El resultado se la division es: %f , verdad?\nToma ya!!",division);
break;
case 5: printf("Has elegido realizar una RAIZ CUADRADA");
do {
printf("\n\nDime el numero del que quieres calcular
la
raiz: ");
scanf("%f",&r1);
if (r1<0) {
72
sound(120);delay(100);nosound();
}
else{
}
}while(r1<0);
printf("\n\nA tus rdenes, %s\n",nombre);
raiz=sqrt(r1);
printf("El resultado se la raiz cuadrada es: %f ,
verdad?\nToma ya!!",raiz);
break;
case 6:printf("Has elegido realizar una CAMBIO DE MONEDA");
printf("\n\n - Pulsa 1
Si quieres pasar de euros a
pesetas.\n Pulsa 2
Si quieres pasar de pesetas a
euros.\n\n ");
scanf("%d",&menu2);
printf("\n\nA tus rdenes, %s\n",nombre);
switch (menu2) {
case 1: do{
printf("\nIntroduce el valor en EUROS:
",euros);
scanf("%f",&euros);
if (euros<0) {
sound(120);delay(100);nosound();
}
else{
}
}while(euros<0);
total=euros*euro;
printf("\n\nResultado: %f euros son %f ptas,
verdad?\nToma ya!!",euros,total);
break;
case 2: do{
printf("\nIntroduce el valor en
PESETAS: ",ptas);
scanf("%f",&ptas);
if (ptas<0) {
sound(120);delay(100);nosound();
}
else{
}
}while(ptas<0);
total=ptas/euro;
printf("\n\nResultado: %f ptas son %f euros,
verdad?\nToma ya!!",ptas,total);
break;
default:printf("\n\n\n\n\n\n\n\n\n
Has introducido una opcion no valida.\n\n\n\n
ERROR\n\n\n\n");
sound(170);delay(50);sound(160);delay(50);sou
nd(150);delay(50);sound(140);delay(50);sound(
130);delay(50);sound(120);delay(500);nosound(
);
break; }
break;
case 7: clrscr ();
printf(" - DORA LA CALCULADORA Cracked by
ABEL\n\n\n\n\n");
printf("\n\n - Pulsa 1
Si quieres hacer la operacion
SENO.\n Pulsa 2
Si quieres realizar la
operacion ARCO SENO.\n - Pulsa 3
Si quieres realizar la
operacion COSENO.\n - Pulsa 4
Si quieres realizar la
operacion ARCO COSENO.\n - Pulsa 5
Si quieres realizar la
operacion TANGENTE.\n - Pulsa 6
Si quieres realizar la
operacion ARCO TANGENTE.\n - Pulsa 7
Si quieres realizar
la operacion SECANTE.\n - Pulsa 8
Si quieres realizar la
73
radianes,
74
scanf("%f",&num);
}while(num==90 || num==270);
total=tan(num);
printf("El resultado de la tangente de %f es:
%f radianes , verdad?\nToma
ya!!",num,total);
break;
case 6: printf("Has elegido realizar la operacion
ARCO TANGENTE\n\n");
printf("\n\nOK. Alla voy, %s",nombre);
printf("\n\nIntroduce el numero para calcular
la arco tangente: ");
scanf("%f",&num);
total=atan(num);
printf("El resultado de la arco tangente de
%f es: %f
radianes , verdad?\nToma
ya!!",num,total);
break;
case 7: printf("Has elegido realizar la operacion
SECANTE\n\n");
printf("\n\nOK. Alla voy, %s",nombre);
printf("\n\nIntroduce el numero para calcular
el secante: ");
scanf("%f",&num);
total=cos(num);
total=1/total;
printf("El resultado del secante de %f es:
%f radianes, verdad?\nToma
ya!!",num,total);
break;
case 8: printf("Has elegido realizar la operacion
COSECANTE\n\n");
printf("\n\nOK. Alla voy, %s",nombre);
printf("\n\nIntroduce el numero para calcular
la cosecante: ");
scanf("%f",&num);
total=sin(num);
total=1/total;
printf("El resultado de la cosecante de %f
es: %f radianes , verdad?\nToma
ya!!",num,total);
break;
case 9: printf("
Nooooo!!!! No comprendo por qu
me abandonas sin utilizarme pero...\n\n\n\n\n\n\n");
break;
default:printf("\n\n\n\n\n\n\n\n\n
Has introducido una opcion no valida.\n\n\n\n
ERROR\n\n\n\n");
sound(170);delay(50);sound(160);delay(50);sound(150);delay(50);sound(140
);delay(50);sound(130);delay(50);sound(120);delay(500);nosound();
break;
}
break;
case 8: clrscr ();
printf("\n - DORA LA EUROCALCULADORA Cracked by
ABEL\n\");
printf("Has elegido realizar un LOGARITMO");
printf("\n\n - Pulsa 1
Si quieres hacer la operacion
LOGARITMO.\n - Pulsa 2
Si quieres realizar la operacion
LOGARITMO NEPERIANO.\n\n");
scanf("%d",&menu4);
switch (menu4) {
case 1: printf("\n\n\nHas elegido hacer la operacion
LOGARITMO");
printf("\n\nComo tu quieras, %s",nombre);
75
Programa que nos diga que un numero mayor que 0 es primo o no.
#include <stdio.h>
void main ()
{
int divisores=0,cont=2,n;
printf("Dame un numero para calcular si es primo\n");
scanf("%d",&n);
76
while (n<=0)
{
printf("Numero incorrecto\n""Introduce un numero mayor que
cero\n");
scanf("%d",&n);
}
while (cont<n)
{
if(n%cont==0)
{
divisores++;
cont++;
}
else
{
cont++;
}
}
if(divisores==0)
{
printf ("El numero introducido %d es primo\n",n);
}
else
{
printf ("El numero introducido %d NO es primo\n",n);
}
#include <stdio.h>
void main ()
{
int cont=0,pot=1,n,exponente;
printf ("Introduce la base\n");
scanf("%d",&n);
while (n<=0)
{
printf("La base introducida no es valida\n" "Introduce un numero
mayor que
cero\n");
scanf("%d",&n);
}
printf ("Introduce el exponente\n");
scanf ("%d",&exponente);
while (exponente<0)
{
printf("El exponente introducido no e valido\n" "Introduce un
numero mayor
que cero\n");
scanf("%d",&exponente);
}
if (exponente==0)
{
printf ("el resultado es 1\n");
}
else{
77
do
{
pot=pot*n;
cont++;
}
while (cont!=exponente);
printf("El resultado es %d\n",pot);
}
}
Programa que nos saque por pantalla los divisores de un numero >0
#include <stdio.h>
void main ()
{
int n,variable;
printf ("Introduce un numero para calcular sus divisores\n");
scanf("%d",&n);
while (n<=0)
{
printf ("Numero incorrecto\n""Introduce un numero mayor que
cero\n");
scanf("%d",&n);
}
for (variable=1;variable<=n;variable++)
{
if (n%variable==0)
{
printf("Divisor= %d\n",variable);
}
}
}
Programa que teniendo en cuenta el suceso de que ha habido una carrera en la que
participaban 10 corredores, te diga quien ha sido el ganador y que tiempo ha recorrido
y diga cual es la media del tiempo total corrido por los 10 corredores. Pero con un for.
#include <stdio.h>
void main()
{
int ganador=0, total=0, tiempo_minimo=10000,tiempo,dorsal;
for (dorsal=1 ;dorsal<=10;dorsal++)
{
printf ("dime el tiempo del corredor\n");
scanf ("%d",&tiempo);
total=total+tiempo;
if (tiempo<tiempo_minimo)
{
ganador=dorsal;
tiempo_minimo=tiempo;
}
}
total=total/10;
printf ("el ganador es el dorsal %d\n", ganador);
printf("el tiempo minimo recorrido es %d minutos\n",tiempo_minimo);
printf("el tiempo medio total es %d minutos\n", total);
}
Programa que nos haga el potencial de un numero teniendo en cuenta que su exponente
puede ser positivo o negativo.
#include <stdio.h>
void main ()
{
int n,exponente,exp;
78
float pot=1;
printf ("Introduce la base\n");
scanf("%d",&n);
while (n<=0)
{
printf("La base introducida no es valida\n" "Introduce un numero
mayor que cero\n");
scanf("%d",&n);
}
printf ("Introduce el exponente\n");
scanf ("%d",&exponente);
if (exponente==0)
{
printf ("el resultado es %d\n",pot);
}
else
{
if(exponente<0)
{
for (exp=-1;exp>=exponente;exp=exp-1)
{
pot=pot*n;
}
pot=1/pot;
printf ("El resultado es %f",pot);
}
else
{
for (exp=1;exp<=exponente;exp++)
{
pot=pot*n;
}
printf("El resultado es %f\n",pot);
}
}
#include <stdio.h>
#define PI 3.1416 //DECLARO COMO CONSTANTE EL NUMERO PI
void area(rad) //DECLARO COMO ARGUMENTO EL RADIO
int rad;
{
float resultado=0;
resultado = PI *rad*rad;
printf ("el area de la circunferencia de radio %d cm es:
%f\n",rad,resultado);
return;
}
void longitud (rad)
int rad;
{
float resultado=0;
resultado=PI*2*rad;
printf ("la longitud de la circunferencia de radio %d cm es
%f\n",rad,resultado);
return;
}
79
void main ()
{
int radio;
int n;
clrscr();
printf ( " si quiere hacer el area pulse 1, si quiere hacer la longitud
pulse 2\n");
scanf ( "%d", &n);
switch (n)
{
case 1:
do {
printf ("dame el puto radio\n");
scanf ("%d",&radio);
if (radio<=0)
printf("Radio no vale");
}
while (radio<=0);
area(radio); //SE INVOCA A LA FUNCION AREA
break;
case 2: do {
printf ("dame el radio\n");
scanf ( "%d", &radio);
if (radio<=0)
printf (" radio no vale\n");
}
while ( radio<=0);
longitud (radio); // SE INVOCA A LA FUNCION LONGITUD
break;
default:
printf ("\a pedazo de gilipollas, te hemos dicho que metas el 1 o
el 2 este numero te lo puedes meter por el culo");
break;
}
}
Programa que nos haga el cuadrado y el cubo de un numero y de sus antecesores.
utilizando funciones.
#include <stdio.h>
// cuerpo de la funcion.
int resultado=0;
resultado = a*a;
printf ("el cuadrado de %d es:%d\n",a,resultado);
return (resultado); //te devuelve el valor de resultado.
}
void cubo (b,x)
int b,x;
//
{
int resultado=0;
resultado = x*b ; //aqui multiplico el cuadrado del numero por el
mismo ,se podia
haber puesto
b*b*b
printf ("el cubo de %d es:%d\n",b,resultado);
80
//funcion principal
int numero1,contador=0,x;
clrscr();
printf("dame un numero\n");
scanf ("%d",&numero1);
while (contador<numero1)
/*bucle que te hace el cudrado y el cubo de
un numero y
de sus antedecedores*/
{
contador ++;
--cont=cont+1
x=cuadrado(contador); /*le doy un identificador a la funcion del
cuadrado
que es x*/
cubo (contador,x); /*se llama a la funcion cubo*/ /*aqui cuando
se invoca a la funcion cubo, b es sustituido por contador y
ademas hay que tener en cuenta que x equivale al
resultado de
la funcion cuadrado*/
}
81
Cuando se le pasa un valor a una funcin mediante un argumento actual, se copia el valor del
argumento actual al argumento formal de la funcin (el formal es el que ponemos en la
declaracin de la funcin) por lo tanto se puede modificar el valor del argumento formal
dentro de la funcin , pero el valor del argumento actual en el punto de la llamada a la
funcin no cambiara. (A esto se le llama paso por valor)
Ejemplo:
#include <stdio.h>
void modificar(a)
int a;
//variable local, solamente reconocida por la funcion. Declarada dentro de la funcion
{
a=a*3;
printf("%d",a);
return;
//no devuelve ningun valor por que el valor de 'a' en el programa principal no se
modifica. Si la funcion devolviera el valor de 'a' y lo guardaramos en a=modificar(a)
(linea 14), el valor de 'a' quedara modificado tambien en el programa principal
void main()
{
//main, al fin y al cabo es otra funcion
int a=2; //variable local
clrscr();
printf("%d",a);
modificar (a);
printf("%d",a);
}
resultado=262.
Con este ejemplo vemos que aunque demos el mismo nombre a los argumentos, no va a dar
ningn problema (usamos el argumento a en ambas funciones).
Ventaja : Permite proporcionar una expresin ( a*2+4....)como argumento actual
Problema : Impide que se transfiera informacin desde la funcin hacia el punto de llamada
mediante los argumentos, por lo tanto al transferencia de informacin slo se realiza en un
sentido, desde el punto de la llamada hacia la funcin.
N - LA FORMA DE PASAR INFORMACIN A LAS FUNCIONES , SON LOS
ARGUMENTOS, ESTOS SON LOS FORMALES (LOS VALORES QUE LE PASAS A LA
FUNCION), EN EL PUNTO DE LLAMADA A LA FUNCION (DENTRO DEL PRINCIPAL)
SON LOS ACTUALES, QUE ME SIRVEN PARA PASAR A LA FUNCIN UN VALOR
DETERMINADO CON EL QUE TRABAJAMOS EN ESE MOMENTO.
la hora de pasar parmetros a la funcin en c hay que tener en cuenta que todos se
pasan por valor, es decir, se pasa una copia temporal del parmetro, no el parmetro en si.
Esto significa que la funcin no puede modificar las variables externas a ella, ya que le ha
sido pasada una copia y no el valor original. Un parmetro por valor se pude entender como
una variable local, de modo que dentro de la funcin puede cambiar su valor pero los
cambios no tienen efecto fuera de ella.
82
Sin embargo, en la mayora de las ocasiones, lo que queremos es que los parmetros que
pasamos a la funcin cambien de valor. Para conseguir eso, lo que debemos de usar es el
paso de parmetros por referencia. Quiere esto decir que lo que se pasa a la funcin no
es una copia del parmetro sino el argumento.
El paso de parmetros por referencia es sinnimo en C de paso de direcciones de memoria,
es decir la funcin conoce la direccin de memoria donde estn almacenados los parmetros
que se la pasan. La forma de hacer esto en C es utilizando punteros, de modo que lo que
pasamos es un puntero a los parmetros a modificar.
#include <stdio.h>
void modificar ( *a )
int a;
{
*a= *a * 3;
printf("%d", *a);
return;
}
void main ()
{
int a=2;
printf ( "%d", a);
modificar (&a) ;
printf ( "%d", a);
}
Resultado=266.
Qu ha ocurrido? .En primer lugar, sigue siendo cierto que en C todos los parmetros se
pasan por valor. Pero en este caso lo que se ha pasado a la funcin no ha sido el contenido
de las variables, lo que se ha pasado ha sido la direccin de memoria de la variable a .
Dichas direcciones se no varan al salir de la funcin sino lo que se ha modificado ha sido el
contenido de esa direccin de memoria. Dentro de la funcin se trabaja con las direcciones
como punteros.
Un aspecto muy importante relacionado con el paso de parmetros por referencia es el
retorno de valores por parte de una funcin. Sabemos que en C una funcin solo puede
devolver un valor, por este motivo es aconsejable utilizar el paso por referencia para
retornar mas valores.
Otro motivo para usar el paso por referencia es el ahorro de espacio y tiempo ya que si
queremos pasar a la funcin algo que ocupe mucho en memoria, es conveniente hacerlo por
referencia. Si lo hacemos por valor, perdemos mucho tiempo y espacio; ya que tiene que
hacer una copia y colocarla en la pila.
83
Variables locales:
Son aquellas declaradas en el cuerpo principal de un programa, es decir en el cuerpo de la
funcin MAIN , son privadas a esa funcin, es decir, son variables locales de funcin main.
Esto implica que ninguna otra funcin puede tener acceso a ellas.
Lo anterior es valido para las variables de otras funciones. Esto hace que en distintas
funciones pueda haber variables con el mismo nombre sin ningn problema. (Ejemplo: los
contadores i,j).
Las variables locales empiezan a existir cuando se llama a la funcin y desaparecen cuando
acaba la funcin. Por esta razn reciben el nombre de variables automticas las cuales
aparecen y desaparecen con cada invocacin de la funcin en las que estn declaradas. para
garantizar su contenido se han de inicializar al entrar a la funcin. en caso contrario
tendrn un valor indeterminado.
Variables globales o externas:
Como alternativa a las variables automticas es posible definir variables externas a
todas las funciones.
A estas variables se las califica de globales. Cualquier funcin puede utilizarlas sin mas que
usar su nombre.
Las variables globales pueden utilizarse en lugar de los argumentos de las funciones para
comunicar datos entre las mismas. Adems mantienen sus valores, ya que existen
permanentemente, incluso despus de finalizar las funciones que las modifican, sin embargo
el uso excesivo de este tipo de variables atenta contra la programacin estructurada.
Este tipo de variables, al contrario que las automticas, no estn confinadas a funciones
simples. Su mbito se extiende desde el punto de definicin hasta el resto del programa,
por lo tanto, sern reconocidas por ms de una funcin y a menudo por todo el programa.
Como las variables externas se reconocen globalmente pueden accederse desde
cualquier funcin que caiga dentro de su mbito, y mantendrn los valores asignados dentro
de ste mbito, por lo tanto, a una variable de ste tipo de le puede asignar un valor dentro
de una funcin y este valor se puede usar accediendo a la variable en otra funcin distinta.
El uso de ste tipo de variables permite transmitir informacin entre funciones sin el uso
de argumentos, lo que es especialmente til cuando una funcin requiere muchos datos de
entrada o queremos proporcionar muchos datos de salida.
#include <stdio.h>
int a=0; //declaramos la variable global, que va a ser reconocida por todo el programa (esta
se
arriba
declarada fuera del programa (antes de main)). Se reconocen a partir del punto en que
declaran hacia abajo, asi que en este caso si lo ponemos justo antes de main dejando
la funcion nos va a dar un error porque la funcion no reconoce la variable
void funcion()
{
a=a*3;
printf("%d",a);
return;
}
void main()
{
84
a=2;
clrscr();
printf("%d",a);
funcion();
printf("%d",a);
}
resultados =2 6 6
#include <stdio.h>
void funcion() {
a=a*3;
printf ("%d", a);
return;
}
int a=0;
void main () {
a=2;
printf ( "%d", a);
funcion ();
printf("%d", a);
}
resultado = error porque hay que declarar la variable antes de
una
funcion si se utiliza en esta
#include <stdio.h>
void funcion ( int a ) {
a=a*3;
printf ("%d", a);
return;
}
int a=0;
void main () {
a=2;
printf ( "%d", a);
funcion ();
printf("%d", a);
}
resultado = 2 6 2
#include <stdio.h>
int funcion() {
a=a*3;
printf ("%d", a);
return(a);
}
int a=0;
void main () {
a=2;
printf ( "%d", a);
a= funcion ( a );
printf("%d", a);
}
resultado = 2 6 6
85
#include <stdio.h>
int a,b,c;
void mezcla (int y,int z)
{
int x;
x=y;
//x=1
y=z;
//y=2
z=c;
//z=3
c=x;
//c=1
return;
}
void lanza (int a, int b)
x=1
y=3
z=3
c es variable global y ese cambio se mantiene.
c=1
como
{
int x;
x=c;
c=b;
b=a;
a=x;
return;
}
void main(){
a=1; b=2; c=3;
clrscr();
printf("%d%d%d\n",a,b,c);
mezcla (a,b);
printf("%d%d%d\n",a,b,c);
lanza (a,b);
printf("%d%d%d\n",a,b,c);
a=1; b=2; c=3;
mezcla (a,b+1);
valiendo 2
printf("%d%d%d\n",a,b,c);
lanza (a-b,b);
//van a llegar a la funcion con a=-1 y b=2 aunque a sigue valiendo 1.
Ahora a y b
son variables locales y la funcion no devuelve nada por lo que los valores de a y b
no van a variar
printf("%d%d%d\n",a,b,c);
}
resultado= 123,121,122,121,122;
#include <stdio.h>
int a,b,c,d;
void cambia (int a, int g, int y)
devolver ningun
principal
{
int b,c;
b=a+g-y;
puede
g=b+d;
c=1;
86
a=a+b+d-c;
y=c+g-a;
return;
}
void main(){
a=1; b=2; c=3; d=4;
clrscr();
cambia(b,c,d);
printf("%d%d%d%d\n",a,b,c,d);
cambia(b,a,c);
printf("%d%d%d%d\n",a,b,c,d);
getch();
}
resultado=1234 1234
#include<stdio.h>
int a,b,c;
void uno(int a,int x, int y)
{
int b,d;
b=x+y-a;
d=(a*y)-(a*b);
c=a*y-d;
x=a*c-d;
a=b+d+x-y;
y=y+a+b+c+d+x;
return;}
void main()
{
a=1;
b=2;
c=3;
printf("%d%d%d",a,b,c);
uno(b,c,a);
printf ("%d%d%d",a,b,c);
}
resultado= 123,124.
#include <stdio.h>
int a,b,c;
void uno(int d, int x, int y)
{
b=x+y-a;
d=(a*y)-(a*b);
c=a*y-d;
x=a*c-b;
a=b+d+x-y;
y=y+a+b+c+d+x;
return;
}
void main()
{
87
a=1;
b=2;
c=3;
printf("%d%d%d\n",a,b,c);
uno (a,b,c);
printf("%d%d%d\n",a,b,c);
uno (b,c,a);
printf("%d%d%d\n",a,b,c);
}
resultado: 123,044,040
RECURSIVIDAD:
Se llama as al proceso mediante el cual una funcin se llama as misma repetidas veces
hasta que se satisface una condicin, este proceso se utiliza para clculos repetitivos en los
que cada resultado se determina en funcin del anterior. Se pueden escribir de esta forma
muchos problemas interactivos.
Se tienen que satisfacer dos condiciones para resolver un problema recursivamente:
Que el problema se pueda escribir de forma recursiva
Que contenga una condicin de fin para terminar con el problema.
A veces una funcin recursiva es conceptualmente mas clara que una iterativa. si utilizas
funciones recursivas lo que nunca se debe olvidar es colocar alguna sentencia de tipo IF,
que permita que exista una situacin en que se ejecute la funcin sin volver a llamarse a si
misma. Si no haces esto, la funcin se llamara a si misma infinitamente, hasta que el
contenido de la pila desborde la capacidad de la memoria del computador provocando un
error y finalizando la ejecucin.
Ejemplos :
Factorial. 4! = 4 * 3!--- 3*2!.... 2*1!..... se incluye una condicin de fin cuando se llegue a
1
#include <stdio.h>
int facto (int a)
{
if (a ==1 )
{
return (1);
}
else
return (a*facto(a-1));
void main ( )
{
int n;
scanf ( %d",&n);
printf ( %d", facto (n));
}
Potencia.
88
#include<stdio.h>
int potencia (int base,int exponente)
{
int resul;
if (exponente==0)
{
resul=1;
}
else
{
resul=base*potencia(base,exponente-1);
}
return(resul);
}
void main ()
{
int base,exponente,pot;
scanf("%d",&base);
scanf ("%d",&exponente);
pot=potencia (base,exponente);
printf("%d", pot);
}
TEMA 7
ARRAYS
1.DEFINICION DE ARRAY
89
Un array es una estructura de datos formada por un bloque de n elementos todos del
mismo tipo y numerados del o al n-1.
Cada uno de los elementos del vector se trata como si fuese una variable independiente del
mismo tipo que el del vector.
2. DECLARACIN DE UN ARRAY
Los arrays se definen en gran parte como las variables ordinarias, excepto que cada array
debe acompaarse de una especificacin de su tamao. Para un array unidimensional el
tamao se especifica con una expresin entera positiva encerrada entre corchetes
(ejemplo: int x[10]; Este es un array que se llama x y en el que se pueden guardar 10
nmeros enteros.).
Otra forma de definirlo es usando constantes simblicas.
Ejemplo
#include <stdio.h>
#define tam 5
void main ()
{
int x[tam];
..
}
}
Esto significa que el array llamado x tiene 5 posiciones y los nmeros entre
parntesis son el valor inicial que toma cada posicin del array.
Declaracion de un array: TIPO NOMBRE [TAMAO]
INT TABLA[5]
N=5
--------------------------------------------0
1
2
3
4
Se debe tener en cuenta que la declaracin de un array no conlleva necesariamente su
inicializacin, es decir, nadie nos asegura que al declarar el vector todos los elementos
valgan 0
Para ello utilizamos un FOR. sin embargo tambin se pude inicializar un vector al mismo
tiempo que se declara(int das[12]={31,28,31,30,31,30,31,31,30,31,30,31})
Una vez definido el array es necesario tener un sistema para referirnos a los elementos
individualmente. Esto se realiza mediante ndices. As para referirnos al elemento 4 del
array anterior teclearamos: tabla[4];
Hay que tener presente que debido a que la enumeracin empieza por cero, este no es el
cuarto elemento sino el quinto.
Ejercicios.
Definir un array de 10 posiciones y haremos:
90
-Inicializarlo a 0.
-Llenarlo con valores introducidos por teclado.
-Mostrar los valores que se han introducido.
#include<stdio.h>
void main()
{
int x[10],i,n;
for (i=0; i<10;i++)
{
x[i]=0;
}
for(i=0;i<10;i++)
{
printf(dame un numero por favor);
scanf(%d,&n);
x[i]=n;
for(i=0;i<10;i++)
{
printf(el
%d,i+1,x[i]);
}
}
elemento
de
la
posicin
%d
91
%d ",b,x[b]);
fueron");
= %d ",b, x[b]);
es
}
ahora utilizando un array de tipo char
#include <stdio.h>
void main () {
char x[5];
int a=0,b=0;
clrscr();
for(a=0;a<5;a++)
{
x[a]='0';
}
a=0;
do {
",a);
x[a]=getchar();
a=a+1;
}while (a<5);
printf("\nLos valores introducidos fueron");
b=0;
do {
printf("\n\nPosicion X[ %d ] = %c ",b, x[b]);
b=b+1;
}while (b<5);
getch();
92
EJERCICIOS:
Tenemos que leer una lista de n nmeros flotantes y calcular la media y
escribir la desviacin de cada elemento respecto a la media.
#include <stdio.h>
#define max 100
void main ()
{
float x[max],media,desviacion,suma=0;
int n,cont;
clrscr();
printf("Introduce la cantidad de numeros que vas a introducir");
scanf("%d",&n);
for (cont=0;cont<n;cont++)
{
printf("Dame un numero\n");
scanf ("%f",&x[cont]);
suma=suma+x[cont];
}
media=suma/n;
printf("La media es %f\n",media);
for (cont=0;cont<n;cont++)
{
desviacion=x[cont]-media;
printf("posicion=%d valor=%f
desviacion=%f\n",cont+1,x[cont],desviacion);
}
getch;
}
Programa anterior pero con modificaciones.
#include <stdio.h>
#define MAX 100
void main()
{
float numeros[MAX],suma=0,media=0,desviacion=0;
int usados,ordinal=1,a=0;
clrscr();
printf("Cuantos numeros vas a introducuir? ");
scanf("%d",&usados);
do{
printf("\nDame el %d numero: ",ordinal);
scanf("%f",&numeros[a]);
suma=suma+numeros[a];
93
++a;
++ordinal;
}while(ordinal<=usados);
media=suma/usados;
printf("\n\nLa media es: %5.2f",media);
flotante de
a=0;
ordinal=1;
do
{
desviacion=numeros[a]-media;
printf("\n La posicion %d del array tiene una desviacion de
%5.2f",ordinal,desviacion);
++a;
++ordinal;
}while(ordinal<=usados);
getch();
}
Programa que cambie los elementos de un array por los introducidos por el usuario.
#include <stdio.h>
void main()
{
char x[5]={'a','b','c','d','e'};
int i;
char n;
for (i=0;i<5;i++)
{
printf("%c",x[i]);
}
for (i=0;i<5;i++)
{
printf ("letra");
scanf ("%c",&n); /*se puede sustituir por
x[i]=n;
x[i]=getchar();
pero es solo para caracteres*/
}
for (i=0;i<5;i++)
{
printf ("%c",x[i]);
}
}
Programa que me diga si dos secuencias introducidas por teclado son iguales.
#include <stdio.h>
#define max 100
void main()
{
int longitud,x[max],y[max],i,iguales=1;
do
{
94
if (x[i]!=y[i])
{
iguales=0;
}
if (iguales==1)
{
printf("\n Iguales");
}
else
{
printf("\n distintos");
}
95
do{
if (secuencia1[a]==secuencia2[b])
{
signo=0;
}
if (secuencia1[a]!=secuencia2[b])
{
signo=1;
}
++a;
++b;
++ordinal;
}while(signo==0 && ordinal<=usados);
if (signo==0)
{
printf("\n\nLas secuencias son iguales");
}
if (signo==1)
{
printf("\n\nLas secuencias son diferentes");
}
getch();
}
programa que haga una secuencia de numeros enteros, determine si esta
secuencia es creciente,decreciente, o ninguna de las dos
#include <stdio.h>
#define MAX 100
void main ()
{
int n,x[MAX],i,mayor=0,menor=0;
do
{
printf("Introduce la longitud de la secuencia\n");
scanf("%d",&n);
}
while (n<=0);
for (i=0;i<n;i++)
{
printf("Elemento %d\n",i+1);
scanf("%d",&x[i]);
}
96
for (i=0;i<n-1;i++)
{
if (x[i]>x[i+1])
{
mayor++;
}
else
{
menor++;
}
}
if (mayor==0&&menor!=0)
{
printf("La serie es ascendente\n");
}
else
{
if(mayor!=0&&menor==0)
{
printf("La serie es descendente\n");
}
else
{
printf("La serie no es ascendente ni descendente\n");
}
}
97
if (x[i]<x[i+1])
{
creciente=creciente+1;
}
if (x[i]>x[i+1])
{
decreciente=decreciente+1;
}
}
if (creciente==sec-1)
{
printf("\nCreciente");
}
else {
nada=nada+1;
}
if (decreciente==sec-1)
{
printf("\nDecreciente");
}
else
{
nada=nada+1;
}
if (nada==2)
{
printf("\nSecuencia Indeterminada");
}
getch();
}
Programa que dadas dos secuencias nos diga si existen dos nmeros "f" y "g"
que cumplan que |f-g|<9 La funcin que hace el valor absoluto es "abs(numero)"
y la biblioteca es #include <stdlib.h>
#include <stdio.h>
#define MAX 100
#include <stdlib.h>
void main()
{
int n,i,x[MAX],y[MAX],j;
do
{
printf ("Introduce la longitud de la secuencia\n");
scanf("%d",&n);
}
while(n<=0);
98
for(i=0;i<n;i++)
{
printf("Primera secuencia.\nElemento %d\n",i+1);
scanf("%d",&x[i]);
}
for(j=0;j<n;j++)
{
printf("Segunda secuencia.\nElemento %d\n",j+1);
scanf("%d",&y[j]);
}
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
if (abs(x[i]-y[j])<9)
{
printf("Los numeros %d %d cumplen la
funcion\n",x[i],y[j]);
}
}
}
}
meto dos secuencias y busca combinaciones que cumplan |f-g|<9
#include <stdlib.h>
#include <stdio.h>
#define MAX 100
void main ()
{
int x[MAX],x2[MAX], numero,sec2=0, sec=0,i=0,
u=0,combinaciones=0;
do
{
printf("\nDime cuantos numeros tiene el vector1 : ");
scanf("%d", &sec);
}while (sec<=0);
do
{
printf("\nDime cuantos numeros tiene el vector2 : ");
scanf("%d", &sec2 );
} while (sec<=0);
printf("\nPRIMERA SECUENCIA");
for (i=0;i<sec;i++)
{
printf("\nDime el numero de la posicion x [ %d ] : ", i);
scanf("%d",&x[i]);
}
printf("\nSEGUNDA SECUENCIA");
for (i=0;i<sec2;i++)
{
printf("\nDime el numero de la posicion x2 [ %d ] : ", i);
scanf("%d",&x2[i]);
99
}
for (i=0;i<sec;i++)
{
for (u=0;u<sec2;u++)
{
if ( (abs(x[i])-(x2[u])) < (9) )
{
combinaciones=combinaciones+1;
printf("\nCombinacion %d, %d - %d = %d ",
combinaciones, x[i], x2[u], abs(x[i]x2[u]));
}
}
}
if (combinaciones>0)
{
printf("\nHay %d combinaciones", combinaciones);
}
getch();
}
Igual que el ejercicio anterior pero de forma que cada vector pueda tener
distinta longitud.
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
void main()
{
int n,i,x[MAX],y[MAX],j,m;
do
{
printf ("Introduce la longitud de la primera secuencia\n");
scanf("%d",&n);
}
while(n<=0);
do
{
printf ("Introduce la longitud de la seguda secuencia\n");
scanf("%d",&m);
}
while (m<=0);
for(i=0;i<n;i++)
{
printf("Primera secuencia.\nElemento %d\n",i+1);
scanf("%d",&x[i]);
}
for(j=0;j<m;j++)
{
printf("Segunda secuencia.\nElemento %d\n",j+1);
scanf("%d",&y[j]);
}
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
100
if (abs(x[i]-y[j])<9)
{
printf("Los numeros %d %d cumplen la
funcion\n",x[i],y[j]);
}
}
}
Programa que me diga si dos secuencias crecientes tienen algn elemento
en comn.
#include <stdio.h>
#define MAX 100
void main()
{
int n,x[MAX],y[MAX],m,i,j,mayor=0,menor=0,mayor2=0,menor2=0,a,b;
do
{
printf ("Introduce la longitud de la primera secuencia\n");
scanf("%d",&n);
}while(n<=0);
do
{
printf ("Introduce la longitud de la seguda secuencia\n");
scanf("%d",&m);
}while (m<=0);
for(i=0;i<n;i++)
{
printf("Primera secuencia.\nElemento %d\n",i+1);
scanf("%d",&x[i]);
}
for(j=0;j<m;j++)
{
printf("Segunda secuencia.\nElemento %d\n",j+1);
scanf("%d",&y[j]);
}
for (i=0;i<n-1;i++)
{
if (x[i]>x[i+1])
else
mayor++;
menor++;
}
if (mayor==0&&menor!=0)
{
printf("La primera serie es creciente\n");
}
else
{
if(mayor!=0&&menor==0)
{
printf("La primera serie es decreciente\n");
}
else
{
printf("La primera serie no es creciente ni
decreciente\n");
101
}
}
for (j=0;j<m-1;j++)
{
if (y[j]>y[j+1])
{
mayor2++;
}
else
{
menor2++;
}
}
if (mayor2==0&&menor2!=0)
{
printf("La segunda serie es creciente\n");
}
else
{
if(mayor2!=0&&menor2==0)
{
printf("La segunda serie es decreciente\n");
}
else
{
printf("La segunda serie no es creciente ni
decreciente\n");
}
}
if((mayor==0)&&(mayor2==0))
{
for (a=0;a<n;a++)
{
for (b=0;b<m;b++)
{
if(x[a]==y[b])
{
printf("Entre la primera serie y la segunda
es comun el valor %d",x[a]);
}
}
}
}
else
{
printf("Las dos series no tienen ningun valor en
comun.\n");
}
}
Dos secuencias crecientes , ver si tienen algun elemento en comun.
#include <stdio.h>
#define MAX 100
void main ()
{
int x[MAX],x2[MAX], i=0, sec, creciente=1, decreciente=1,
salida=0;
int u=0, sec2, creciente2=1,combinaciones=0;
clrscr();
102
do
{
printf("\nDime cuantos numeros va a tener la
");
secuencia1:
scanf("%d", &sec);
}while (sec<=0);
for (i=0;i<sec;i++)
{
printf("\nDime un valor para la posicion x [ %d ] : ",i);
scanf("%d", &x[i]);
if (i==10||i==20||i==30)
{
printf("Pulsa cualquier tecla para continuar...");
clrscr();
}
}
for (i=0;i<sec-1;i++)
{
if (x[i]<x[i+1])
else
{
creciente=0;
i=sec-1;
}
}
if (creciente==1)
{
printf("\nLa secuencia 1 es Creciente\n\n");
}
else
{
for (i=0;i<sec-1;i++)
{
if (x[i]>x[i+1])
{
}
else
{
decreciente=0;
i=sec-1;
}
if (decreciente==1)
{
printf("\nLa secuencia 1 es Decreciente");
}
else
{
printf("\nLa secuencia 1 es indefinida");
}
}
decreciente=1;
getch();
clrscr();
103
do {
");
scanf("%d", &sec2);
}while (sec2<=0);
for (i=0;i<sec2;i++)
{
printf("\nDime un valor para la opsicin x2 [ %d ] : ",i);
scanf("%d", &x2[i]);
if (i==10||i==22||i==33)
{
printf("\nPulsa cualquier tecla para continuar");
clrscr();
}
}
for (i=0;i<sec2-1;i++)
{
if (x2[i]<x2[i+1])
{
}
else
{
}
creciente2=0;
i=sec2-1;
}
if (creciente2==1)
{
printf("\nLa secuencia 2 es Creciente\n\n");
}
else
{
for (i=0;i<sec2-1;i++)
{
if (x2[i]>x2[i+1])
{
}
else
{
}
decreciente=0;
i=sec2-1;
if (decreciente==1)
{
printf("\nLa secuencia 2 es Decreciente\n");
}
else {
printf("\nLa secuencia 2 es indefinida\n");
}
104
if (creciente==1&&creciente2==1)
{
clrscr();
printf("\n
*******: COMBINACIONES :***** \n");
for (i=0; i<sec; i++)
{
for (u=0;u<sec2;u++)
{
if (x2[i]==x2[u])
{
printf("\nLa posicin X [ %d ] de la
secuencia 1 vale %d \n\ry la posicin x2
[
%d ] de la secuencia 2 vale %d\n\n\n",
i,x2[i],u, x2[u]);
combinaciones=combinaciones+1;
if(combinaciones==4||combinaciones==8
||combinaciones==12)
{
printf("Pulse cualquier tecla para
continuar....");
getch();
clrscr();
}
}
}
}
if (combinaciones==0)
{
printf("\nNo hay combinaciones");
}
}
else
{
}
if (combinaciones>0)
{
printf("\n\nEL NUMERO TOTAL DE COMBINACIONES ES %d",
combinaciones);
}
getch();
}
3. PROCESAMIENTO DE UN ARRAY
No se puede asignar un vector a otro
105
Tabla1=tabla2
Tabla1[1]=tabla2[1]
En C no se permiten operaciones que impliquen arrays completos. Si a y b son dos arrays
similares (guardan el mismo tipo de datos y con el mismo tamao) las operaciones de
asignacin, de comparacin deben realizarse elemento por elemento. Esto se hace en un
bucle donde en cada paso del bucle comparamos un elemento. Tenemos que repetir este
bucle tantas veces como el tamao del array.
}
2.-SELECCIN DIRECTA
#include <stdio.h>
#define MAX 4
int tabla [MAX]= { 4,3,5,2 } ;
void main ()
{
int i,j,k,temp;
for ( k = 0 , k < MAX - 1 ; k ++ )
{
i = k ;
temp = tabla [ k ];
for ( j = k+1 ; j < MAX ; j++ )
{
if ( tabla [ j ] < temp )
{
i = j ;
temp = tabla [ i ] ;
}
}
tabla [ i ] = tabla [ k ] ;
tabla [ k ] = temp ;
}
printf ( " \n Ordenado ");
for (j = 0 ; j < MAX ; j ++ )
{
printf ( " \n Elemnto %d ; %d ", j + 1 , tabla [ j ] );
}
}
3.-INSERCCIN DIRECTA
#include <stdio.h>
#define MAX 4
int tabla[MAX] = { 4,3,5,2};
void main ( ) {
int j,k,temp;
for (j=1; j < MAX ; j++ ) {
temap = tabla [ j ] ;
k = k - 1;
while (tabla [ k ] > temp && k > 0 )
{
tabla [k+1] = tabla [k];
k = k-1 ;
}
if ( tabla [k] > temp ) {
tabla [ k+1] = tabla [ k ] ;
k = k-1;
}
else {
tabla [k+1] = temp;}
printf (" \n Ordenado ");
for ( j =0; j< MAX; j++) {
printf("\n Elemento %d ; %d ", j + 1, tabla [ j ] );
}
}
5. PASO DE ARRAYS A FUNCIONES
107
El nombre de un Array se puede usar como argumento de una funcin permitiendo que el
array completo sea pasado a la funcin.
Para pasar un Array, su nombre debe aparecer solo, sin corchetes ni ndices, como un
argumento actual dentro de la llamada a la funcin. El correspondiente argumento formal se
pone: el nombre del Array con dos corchetes vacos.
El tamao no se especifica dentro de la declaracin formal.
para pasar un array a una funcin se le pasa el nombre del array, es decir se pasa la
direccin del comienzo del array. Esto significa que todas las operaciones que se realizan
sobre el array mientras esta dentro de la funcin afectan al array fuera de la funcin.
Vamos a declarar un array de cinco posiciones enteras y los vamos a llenar con
valores a travs de una funcin e imprimirles a travs de otra funcin.
#include <stdio.h>
void llena( int x[])
{
int i;
for(i=0;i<5;i++)
}
printf("elemento;");
scanf("%d",&x[i]);
}
return;
}
void imprime(int x[])
{
int i;
printf("elemento%d valor%d\n",i+1,x[i]);
}
return;
}
void main()
{
int x[5];
llena(x);
imprime(x);}
108
void main ()
{
llena ( x,numero );
imprime ( x,numero );
getch();
}
Elavorar un programa, que dada una secuencia de numeros enteros determine
si esta secuencia es creciente, decreciente, o ninguna de las dos.El main solo imprime
los resultados y tiene que haber:
funcion para llenar el array
funcion para ver si es creciente
funcion para ver si es decreciente
#include <stdio.h>
#define MAX 100
int llenar ( int x[] )
{
int sec, i=0;
do
{
printf("\nDime cuantos numeros va a tener la secuencia: ");
scanf("%d", &sec);
}while (sec<=0);
for (i=0;i<sec;i++)
{
printf("Dime un valor para la posicion x [ %d ] : ",i);
scanf("%d", &x[i]);
}
return(sec);
}
int creciente (int x[],int sec)
{
int i=0,signo=1;
109
for (i=0;i<sec-1;i++)
{
if (x[i]<x[i+1])
{
}
else
{
signo=0;
}
}
return(signo);
}
int decreciente (int x[], int sec )
{
int i=0, signo=1;
for (i=0;i<sec-1;i++)
{
if (x[i]>x[i+1])
{
}
else
{
}
signo=0;
return(signo);
}
void main ()
{
int x[MAX], tamano, nada=0,cre=0,dec=0;
tamano=llenar(x);
cre=creciente(x,tamano);
if (cre==1)
{
printf("\nLa secuencia es creciente");
}
else
{
nada=nada+1;
}
dec=decreciente(x,tamano);
if (dec==1)
{
printf("\nLa secuencia es decreciente");
}
else
{
nada=nada+1;
}
if (nada==2)
{
110
111
do
{
Programa que me diga si dos secuencias introducidas por teclado son iguales.
#include <stdio.h>
#define max 100
int longi ()
{
int longitud;
do
{
printf("Introduce la longitud de las secuencias\n");
scanf("%d",&longitud);
}while (longitud<=0);
return (longitud);
}
void secuencias (int x[],int y[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("Primera secuencia.Elemento %d",i+1);
scanf("%d",&x[i]);
}
for(i=0;i<n;i++)
{
printf("Segunda secuencia.Elemento %d",i+1);
scanf("%d",&y[i]);
}
return;
}
void igual_distinto (int x[],int y[],int n)
{
int i,iguales=1;
for (i=0;i<n;i++)
{
if (x[i]!=y[i])
{
iguales=0;
}
}
if (iguales==1)
{
printf("\n Iguales");
}
112
else
{
printf("\n distintos");
}
return;
}
void main()
{
int x[max],y[max],tamano;
tamano=longi();
secuencias(x,y,tamano);
igual_distinto(x,y,tamano);
}
programa que diga si dos secuencias introducidas por teclado son iguales, pedimos
la primera, luego la segunda y luego comparamos uno a uno.(son enteros)
#include <stdio.h>
#define MAX 100
void main ()
{
int x[MAX], x2[MAX],cont1,cont2,i,signo=0;
do
{
printf("\nDime cuantos numeros tienen las secuencias: ");
scanf("%d",&cont1);
}while (cont1<=0);
printf("\nPRIMERA SECUENCIA");
for (i=0;i<cont1;i++)
{
printf("\nDime el valor: ");
scanf("%d",&x[i]);
}
printf("\nSEGUNDA SECUENCIA");
for (i=0;i<cont1;i++)
{
printf("\nDime el valor: ");
scanf("%d",&x2[i]);
}
for (i=0;i<cont1;i++)
{
if (x[i]==x2[i])
{
signo=signo+1;
}
}
if (signo==cont1)
{
printf("\nIGUALES");
}
else
113
printf("\nDISTINTAS");
}
getch();
114
return (3);
/*Nada*/
}
}
void comparar(int x[],int y[],int n,int m)
{
int a,b;
for (a=0;a<n;a++)
{
for (b=0;b<m;b++)
{
if(x[a]==y[b])
{
printf("Entre la primera serie y la segunda es
comun el valor %d\n",x[a]);
}
}
}
return;
}
void main()
{
int longitud1,longitud2,x[MAX],y[MAX],resultado1=0,resultado2=0;
longitud1=secuencia();
longitud2=secuencia();
elementos (x,longitud1);
elementos (y,longitud2);
resultado1=crec_decrec(x,longitud1);
resultado2=crec_decrec(y,longitud2);
if (resultado1==1&&resultado2==1)
{
comparar (x,y,longitud1,longitud2);
}
}
115
printf("elemento %d\n",i+1);
scanf("%d",&h[i]);
}
return;
6.ARRAYS MULTIDIMENSIONALES
hasta ahora hemos visto los arrays de una sola dimension, es decir con un solo indice, pero
los arrays pueden tener dos o mas dimensiones. Para recorrer arrays de mas de dos
dimensiones es necesario anidar bucles tantos como dimensiones tenga el array. Los arrays
de mas de dos dimensiones no se utilizan mucho debido a la cantidad de memoria que es
necesaria para mantenerlos
Se definen de la misma forma que los Arrays unidimensionales, excepto que se requiere un
par separado de corchetes para cada ndice.
Ejemplo: INT X[M][N];
0
0
1
2
m=filas n=columnas
1
3
int tabla [3][4];
116
Cuando utilizamos los arrays mutidimensionales como argumentos formales en una funcin,
el nmero de filas no se pasa. Ejemplo: int funcin (int x[ ][n] ) y en el punto de llamada a la
funcion no varia nada, sigue siendo asi: NOMBRE DE LA FUNCION (NOBRE DEL ARRAY)
.
EJERCICIOS:
Declarar dos matrices de 5 filas y 4 columnas. Llenarlas de elementos
enteros y sacar por pantalla el resultado de sumar las dos matrices.
#include <stdio.h>
void main()
{
int x[5][4],y[5][4],z[5][4],i,j,cont=0,cont2=0;
for (i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
cont++;
printf ("Primera matriz.Valor %d\n",cont);
scanf ("%d",&x[i][j]);
}
}
for (i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
cont2++;
printf ("Segunda matriz.Valor %d\n",cont2);
scanf ("%d",&y[i][j]);
}
}
for (i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
z[i][j]=x[i][j]+y[i][j];
printf(" %d ",z[i][j]);
}
printf("\n");
}
}
Ejercicio anterior pero realizado con funciones.
#include<stdio.h>
void llena (int x[][4])
{
117
int i,j;
for (i=0;i<5;i++)
{
for(j=0;j<4;j++)
{
printf("Introduce valores");
scanf("%d",&x[i][j]);
}
}
return;
}
void suma (int a[][4],int b[][4],int c[][4])
{
int i,j;
for (i=0;i<5;i++)
{
for (j=0;j<4;j++)
{
c[i][j]=a[i][j]+b[i][j];
}
}
return;
}
void imprime (int h[][4])
{
int i,j;
for(i=0;i<5;i++)
{
for (j=0;j<4;j++)
{
printf("%d",h[i][j]);
}
}
return;
}
void main()
{
int n1[5][4],n2[5][4],res[5][4];
llena(n1);
llena(n2);
suma(n1,n2,res);
imprime(res);
}
Programa que lea una matriz de "M" filas y "N" columnas y escriba el resultado de
118
}
getch ();
119
}
}
120
}
}
leer una matriz de f filas y c columnas, y que escriba el resultado de
restar a cada elemento la media aritmetica de la media de su fila y su
columna (otra forma)
#include <stdio.h>
#define FIL 100
#define COL 100
void llenar (float x[][COL],int col ,int fila)
{
int i,u;
for (i=0;i<fila;i++)
{
for (u=0;u<col;u++)
{
printf("\nDime un numero para la %d fila %d columna:
",
i,u);
scanf("%f", &x[i][u]);
}
}
return;
}
void mediafil (float x[][COL], int col, int fila, float
mediafila[FIL])
{
int i,u;
float suma=0;
for (i=0;i<fila;i++)
{
for (u=0;u<col;u++)
{
suma=suma+x[i][u];
//calcular la media fila
}
mediafila[i]=suma/col;
// printf(" %f",mediafila[i]);
suma=0;
}
return;
}
void mediacol (float x[][COL], int col, int fila, float
mediacolum[COL]) {
int i,u;
float suma=0;
for (i=0;i<col;i++)
{
for (u=0;u<fila;u++)
{
suma=suma+x[u][i];
}
mediacolum[i]=suma/fila;
//
printf("%f",mediacolum);
suma=0;
}
121
return;
}
void res (float x[][COL], int col, int fil, float mediaf[], float
mediac[], float resu[][COL])
{
int i,u;
float medias=0;
for (i=0;i<fil;i++)
{
for (u=0;u<col;u++)
{
medias=(mediaf[i]+mediac[u])/2;
resu[i][u]=x[i][u]-medias;
//printf(" %f", resu[i][u]);
medias=0;
}
printf("\n");
}
return;
}
} while (filas<=0);
do {
} while (columnas<=0);
llenar (x,columnas,filas);
mediafil (x,columnas,filas,mediafila);
122
mediacol (x,columnas,filas,mediacolum);
res (x,columnas,filas,mediafila,mediacolum,resultado);
imprime (resultado, filas, columnas);
getch();
123
}
printf("Introduce un nmero aleatorio.\n");
scanf("%d",&num);
for(i=0;i<longitud;i++)
{
if (x[i]==num)
{
cont1 ++;
}
}
if (cont1==0)
{
printf("El numero introducido NO esta en el vector.\n");
}
else
{
printf("El nmero introducido SI esta en el vector.\n");
}
124
for (i=0;i<n+1;i++)
{
printf(" %d", array[i]);
}
getch();
125
principio=i+1;
}
cont++;
}
printf("En el texto hay %d palabras que terminan en
s\n",contador);
}
programa que te pasa los numeros romanos a numeros actuales.
#include<stdio.h>
#include<conio.h>
void main()
{
int i,x,c,cont,f;
char linea[100];
clrscr();
printf("\n Escribeme un numero romano:");
i=0;
do{
linea[i]=toupper(getchar());
i++;
}while(linea[i-1]!='\n' && i<100);
for(c=0;c<i;c++)
{
printf("\n %c",linea[c]);
f=c;
}
cont=0;
for(c=0;c<f;c++)
{
switch(linea[c])
{
case 'M':
cont=cont+1000;
if(linea[c-1]=='C')
{
cont=cont-200;
}
break;
case 'D':
cont=cont+500;
if(linea[c-1]=='C')
{
cont=cont-200;
}
break;
case 'C':
cont=cont+100;
if(linea[c-1]=='X')
{
cont=cont-20;
}
break;
case 'L':
cont=cont+50;
if(linea[c-1]=='X')
{
cont=cont-20;
126
}
break;
case 'X':
cont=cont+10;
if(linea[c-1]=='I')
{
cont=cont-2;
}
break;
case 'V':
cont=cont+5;
if(linea[c-1]=='I')
{
cont=cont-2;
}
break;
case 'I':
cont=cont+1;
break;
}//fin swith
}//fin for
printf("\n el numero es %i",cont);
}
Un programa que le quite los espacios al texto que introduzcamos por teclado
#include <stdio.h>
#include <string.h>
#define MAX 1000
void main ()
{
char conespacios[MAX], sinespacios[MAX];
int caracteres=0,i,u=0;
printf("\n Escribe un texto : \n");
gets (conespacios);
caracteres=strlen(conespacios);
conespacios[caracteres]='\0';
for (i=0;i<caracteres;i++)
{
if (conespacios[i]!=' ')
{
sinespacios[u]=conespacios[i];
u=u+1;
}
sinespacios[u]='\0';
printf("\n%s\n",sinespacios);
printf("\n%s\n",conespacios);
getch();
}
127
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
void main ()
{
char array[MAX],resultado[MAX];
int
i,caracteres=0;
printf("\nDime una frase en minusculas: \n\n
gets(array);
caracteres=strlen(array);
array[caracteres]='\0';
");
for (i=0;i<caracteres;i++) {
resultado[i]=toupper(array[i]);
//
}
resultado[caracteres]='\0';
for (i=0;i<caracteres;i++) {
printf("%c", resultado[i]);
}
getch();
}
programa en el que se pida una secuencia de numeros enteros , y se calcule la
media despues pedimos un elemento y miramos a ver si esta en el vector, si esta
tenemos
que decir en que posicion esta , y sino esta lo insertamos en la posicion
que le corresponda
#include <stdio.h>
#define MAX 100
void llenar (int array[], int numero )
{
int i;
for (i=0;i<numero;i++)
{
printf("\nDime un numero para la posicin Array [ %d ] ; ",
i);
}
scanf("%d",&array[i]);
return;
}
128
float media=0,acumulador=0;
for (i=0;i<numero;i++)
{
acumulador=acumulador+array[i];
contador=contador+1;
}
media=acumulador/contador;
return(media);
}
buscar, i+1);
signo=0;
}
}
if (signo==1) printf("\n\nEl numero no esta ");
return(signo);
}
void ordenar (int array[], int numero)
{
int j,k=0,temp;
for (j=1;j<numero;j++)
{
temp = array[j] ;
k=j-1;
while (array[ k ] > temp && k > 0 )
{
array[k+1] = array[k];
k=k-1;
}
if ( array[k] > temp )
{
array[k+1] = array[k] ;
array[k]=temp;
}
else
{
}
array[k+1] = temp;
}
printf (" \n Ordenado ");
for ( j=0; j<numero; j++)
{
printf("\n Elemento %d ; %d ", j+1,array[j] );
}
129
return;
}
void insertar ( int array[], int numero, int inst )
{
int i,x;
for (i=0;i<numero;i++)
{
if (inst<=array[i])
{
for (x=numero+1;x>=i;x--)
{
array[x]=array[x-1];
}
array[i]=inst;
i=numero;
}
}
return;
}
void main ()
{
int sec[MAX], nsec=0,numero=0,signo=0;
float media=0;
do
{
printf("\nDime cuantos nmeros tiene la secuencia : ");
scanf("%d", &nsec);
} while ( nsec <= 0 );
llenar(sec,nsec);
media=suma(sec,nsec);
printf("\nLa Media es %f ", media);
printf("\n\nDime el numero que quieres buscar en el array :
scanf("%d", &numero);
ordenar (sec,nsec);
signo=buscar ( sec,nsec,numero);
if (signo==1)
{
insertar(sec,nsec,numero);
}
ordenar (sec,nsec+1);
");
getch();
}
130
{
inti,matriz[FIL][COL],fila,columna,j,maxf[FIL],minc[COL],maximo=0;
int minimo=0;
clrscr();
printf("tamao?:");
scanf("%d %d",&fila,&columna);
for(i=0;i<fila;i++)
{
for(j=0;j<columna;j++)
{
printf("valor %d:\n",j+1);
scanf("%d",&matriz[i][j]);
}
}
for (i=0;i<fila;i++)
{
maximo=0;
for(j=0;j<columna;j++)
{
if (matriz[i][j]>=maximo)
{
maximo=matriz[i][j];
}
maxf[i]=maximo;
}
for(i=0;i<columna;i++)
{
minimo=10000;
for(j=0;j<fila;j++)
{
if(matriz[j][i]<=minimo)
minimo=matriz[j][i];
}
minc[i]=minimo;
}
for(i=0;i<fila;i++)
{
for(j=0;j<columna;j++)
{
if(matriz[i][j]==minc[j]&&matriz[i]
[j]==minc[j])
printf("El n %d de la fila %dy la columna %d
es
un punto de silla",matriz[i]
[j],i+1,j+1);
}
}
}
}
TEMA 8
PUNTEROS
131
I.
PUNTEROS.CONCEPTOS BSICOS
DEFINICION: Una variable de tipo puntero es un tipo de dato cuyo valor es la direccin de
almacenamiento de otro tipo de dato(variable) dentro de la memoria del ordenador, es
decir una variable que contiene la direccin de otra variable.
Dentro de la memoria, cada dato ocupa una o ms celdas contiguas. El nmero de celdas
requeridas para almacenar un dato depender del tipo de dato con el que tratamos. (ya que
no ocupa lo mismo un entero que un carcter)
Supongamos que V es una variable que representa un determinado dato. Cuando lo
declaramos el compilador reserva memoria para ese dato. El dato puede ser accedido si
conocemos la direccin de la primera celda de memoria que ocupa.(Para acceder al
contenido de una casilla de memoria se puede hacer de dos formas, o conociendo el nombre
de la variable, o la posicin que ocupa).
Esa direccin puede ser determinada mediante la expresin &V, donde & es un operador
de direccin que proporciona la direccin del operante. Esa direccin se le puede asignar a
otra variable de la siguiente forma: pv=&V
Ahora la variable pv contiene la direccin de V, no su valor, y es una variable de tipo
puntero.
Ahora el dato que contiene V puede ser accedido de dos formas:
La primera es la utilizada hasta ahora: utilizando el nombre de la variable.
Accediendo al contenido de la direccin que guarda el puntero: *variable. El * se
llama operador indireccin.
Por lo tanto *variable y variable es lo mismo es decir, v=*pv.
En definitiva esto se resume en dos cosas:
"Pv" por si slo almacena una direccin (pv=&v),
"v" tambin puede ser accedida como el contenido que guardo en esa direccin
( v contiene lo mismo que *pv ).
EJEMPLOS:
#include <stdio.h>
void main ()
{
int u=3;
int v;
int *pu; //puntero que apunta a u
int *pv; //puntero que apunta a v
pu= &u;
v=*pu;
pv=&v;
printf("\n u=%d &u=%X pu=%X *pu=%d", u, &u,pu,*pu);
printf("\n \n v=%d &v=%X pv=%X *pv=%d ", v,&v,pv,*pv);
}
solucion u=3
v=3
#include <stdio.h>
void main ()
{
int u1,u2;
int v=3;
int *pv;
132
u1=2*(v+5);
pv=&v;
u2=2*(*pv+5);
printf("\nu1=%d u2=%d", u1,u2);
}
solucion
u1=16
u2=16
#include <stdio.h>
void main()
{
int v=3;
int *pv;
pv=&v;
printf("\n *pv=%d v=%d ",*pv,v);
*pv=0;
printf("\n *pv=%d v=%d",*pv,v);
}
solucion
*pv=3 v=3
*pv=0 v=0
#include <stdio.h>
void main()
{
int x[10]={10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
int i;
for(i=0;i<10;i++) {
printf("\ni=%d x[i]=%d *(x+i)=%d &x[i]=%X x+i=
%X",i,x[i],*(x+i),&x[i],x+i);
}
return;
}
solucion: i=0
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
x[i]=10
x[i]=11
x[i]=12
x[i]=13
x[i]=14
x[i]=15
x[i]=16
x[i]=17
x[i]=18
x[i]=19
&x[i]=FFE2 x+i=FFE2
&x[i]=FFE4 x+i=FFE4
&x[i]=FFE6 x+i=FFE6
&x[i]=FFE8 x+i=FFE8
&x[i]=FFEA x+i=FFEA
&x[i]=FFEC x+i=FFEC
&x[i]=FFEE x+i=FFEE
&x[i]=FFE0 x+i=FFE0
&x[i]=FFE2 x+i=FFE2
&x[i]=FFE4 x+i=FFE4
*pv=v+1;
u=*pv+1;
pu=&u;
133
solucion= Valores de: &v=F8D pv=F8D *pv=B u=C &u=FBC pu=FBC *pu=C
*pj=j+5;
i=*pj+5;
pi=pj;
*pi=i+j;
/*Direccin de i=F9C*/
/*Direccin de j=FE9*/
solucion= Valores de: &i=F9C &j=FE9 *pj=FE9 i=35 pi=FE9 *pi=65 *pi+2=67
Calcular los valores de &a ,&b, &c, pa, pb, pa, &(*pa), *pb, c.
#include <stdio.h>
void main ()
{
float a=0.001
float b=0.003
float c,*pa,*pb;
pa=&a;
*pa=2*a;
pb=&b;
c=3*(*pb-*pa);
}
/* direccin a: 1130
direccin b: 1134
direccin c: 1138 */
solucion
134
return;
}
void main ()
{
int a[5]= {10, 20, 30, 40, 50};
funcion (a+3);
}
solucion: puntero,ninguna,punteros,para ir sumando,90.
Operador (&):El operador & devuelve la direccin en la cual se ha almacenado una variable.
DECLARACIN DE PUNTEROS
Los punteros, como cualquier otra variable, tienen que ser declarados antes de su uso en un
programa. Cuando una variable puntero es definida, su nombre debe ir precedido por un *.
Declaracin: TIPO DE DATO * NOMBRE DEL PUNTERO.
El tipo de dato que aparece en la declaracin se refiere al tipo de dato que se almacena en
la direccin representada por el puntero y no al puntero en si mismo.
Ejemplos: int *p;
float *p=&v;
En definitiva la declaracin de una variable puntero informa al compilador de 3 cosas:
El numero de bytes del dato que se apunta, dependiendo del dato al que se
apunta.
135
III.
La forma que habamos visto de pasar argumentos a la funcin era por valor, pasabas
variables pero no cambiaban, la forma de hacer que estos cambios permanezcan, es
inicializando variables globales. Otra forma de hacer que los cambios realizados en la
funcin se mantengan es usando los punteros.
A menudo los punteros se pasan a las funciones como argumentos. Esto permite que datos
de la porcin del programa en la que se llama a la funcin sean accedidos por esta,
modificados dentro ella y luego devueltos al programa de forma que se mantengan los
cambios realizados. Esta forma de pasar los argumentos se denomina paso por referencia.
Cuando un argumento es pasado por valor, el dato se copia a la funcin, por lo que cualquier
modificacin de este dato dentro de la funcin no es devuelta al punto en el que se llam a
la misma, sin embargo en el paso por referencia, lo que se le pasa a la funcin es la
direccin del dato. El contenido de esta direccin puede ser accedido dentro de la funcin
y modificado conservndose estos cambios cuando la funcin devuelve el control al punto
donde fue llamada.
EJEMPLOS:
#include <stdio.h>
void funcion1(int u, int v)
{
u=0;
v=0;
printf("\n En funcion1: u%d v=%d", u,v);
return;
}
void funcion2(int *pu, int *pv)
{
*pu=0;
*pv=0;
printf("\n En funcion2: *pu=%d *pv=%d", *pu, *pv);
direcciones.
void main ()
{
int u=1,v=3;
printf("\n Antes de f1 u=%d, v=%d", u,v);
funcion1 (u,v);
printf("\n Despues de f1 u=%d, v=%d", u,v);
printf("\n Antes de f2
u=%d, v=%d", u,v);
funcion2 (&u,&v);
printf("\n Despues de f2 u=%d, v=%d", u,v);
}
solucion: u=1 v=3
136
//le paso 2
u=0
u=1
u=1
u=0
u=0
v=0
v=3
v=3
v=0
v=0
#include <stdio.h>
int func1 (char c1,char c2)
{
c1='P';
c2='Q';
return( (c1<c2)?c1:c2);
}
j=func2(&a,&b);
printf("a=%c b=%c \n",a,b);
printf("j=%d\n",j);
solucion
a=x
b=y
i=80
a=p
b=q
j=81
Programa que te calcula tanto las consonantes y vocales de un texto como los
caracteres especiales.
#include <stdio.h>
#include <ctype.h>
void analiza_linea(char linea[],int *pv, int *pc, int *pd, int *pw,
int *po)
{
char c;
int cont=0;
while ( (c=toupper(linea[cont])) != '\0' ) {
if (c=='A' || c=='E' || c=='I' || c=='O' || c=='U')
*pv+=1;
137
else
if (c>='A' && c<='Z') *pc+=1;
else
if (c>='0' && c<='9') *pd+=1;
else
if (c==' ' || c=='\t') *pw+=1;
else *po+=1;
cont+=1;
return;
}
void main()
{
char linea[80];
int vocales=0, consonan=0, digitos=0, blancos=0, otros=0;
float tvocales=0, tlineas=0, tconso=0, tdigitos=0, tblancos=0,
totros=0;
char seguir;
do {
&blancos,
&otros);
printf("\nNumero de vocales : %d", vocales);
printf("\nNumero de consonantes : %d", consonan);
printf("\nNumero de digitos : %d", digitos);
printf("\nNumero de blancos : %d", blancos);
printf("\nOtros : %d", otros);
tvocales+=vocales;
tconso+=consonan;
tdigitos+=digitos;
tblancos+=blancos;
totros+=otros;
printf("\nENTER para seguir");
scanf("%c",&seguir);
}while (seguir=='\n');
printf("\nMedia
printf("\nMedia
printf("\nMedia
printf("\nMedia
printf("\nMedia
de
de
de
de
de
138
IV.
&X [0]
X
Si por ejemplo queremos acceder a la posicin 3 del array se puede poner :
&X[3]
X+3.
Del mismo modo, para referirnos al contenido de una posicin se ponia
X[3],
Int x[10]
139
tabla=(int *)malloc(n*sizeof(int));
//ahora hay que inidicar que apunte a la primera posicin.
//lleno el array
for (i=0;i<n;i++)
{
printf("\nElemento %d : ", i);
scanf("%d", tabla+i); //tabla sin & ya que de por si nos da una direccion.
}
//imprimo el array
for (i=0;i<n;i++)
{
printf("Elemento %d: %d", i,*(tabla+i);
}
}
140
for (i=0;i<tamano;i++)
{
printf("Valor %d = %d ",i,*(array+i));
}
return;
}
void ordenar (int *array, int tamano)
{
int i,k,temp;
for (i=1;i<tamano;i++)
{
temp=*(array+i);
k=i-1;
while (*(array+k)>temp&&k>0) {
*(array+k+1)=*(array+k);
k=k-1;
}
if (*(array+k)>temp)
{
*(array+k+1)=*(array+k);
*(array+k)=temp;
}
else
{
*(array+k+1)=temp;
}
}
return;
}
void main ()
{
int *array,tamano=0;
printf("\n Dime el tamao del array");
scanf("%d", &tamano);
array=(int *)malloc(tamano * sizeof(int));
llenar (array,tamano);
mostrar (array,tamano);
ordenar (array,tamano);
mostrar (array,tamano);
getch();
}
141
{
int i=0;
for (i=0;i<tamano;i++)
{
printf("\nDime un valor: ");
scanf("%d", array+i);
}
return;
}
void mostrar (int *array, int tamano )
{
int i=0;
for (i=0;i<tamano;i++)
{
printf("Valor %d = %d ",i,*(array+i));
}
return;
}
void ordenar (int *array, int tamano)
{
int i,k,temp;
for (i=1;i<tamano;i++)
{
temp=*(array+i);
k=i-1;
while (*(array+k)>temp&&k>0) {
*(array+k+1)=*(array+k);
k=k-1;
}
if (*(array+k)>temp)
{
*(array+k+1)=*(array+k);
*(array+k)=temp;
}
else
{
*(array+k+1)=temp;
}
}
return;
}
void suma(int *array, int *array1,int *array2,int a)
{
int i,j;
printf("tabla ordenada");
for(i=0;i<a;i++)
{
(array3+i)=(array1+i)+(array2+i);
142
}
void main ()
{
int *array,*array1,*array2,tamano=0;
printf("\n Dime el tamao del array");
scanf("%d", &tamano);
array=(int *)malloc(tamano * sizeof(int));
array2=(int *)malloc(tamano * sizeof(int));
array3=(int *)malloc(tamano * sizeof(int));
llenar (array,tamano);
mostrar (array,tamano);
ordenar (array,tamano);
mostrar (array,tamano);
llenar (array2,tamano);
mostrar (array2,tamano);
ordenar (array2,tamano);
mostrar (array2,tamano);
sumar(array1,array2,array3,tamano);
mostrar(array3);
getch();
}
V.
Hasta ahora lo que hemos estado viendo es que un array es un puntero a la primera posicin
de un array. Para declarar una tabla en la funcion principalse hace int (*x)[]
Para el array multidimensional tenamos que pedir el tamao de sus filas y columnas ahora
tambin:
int filas, columnas.
Printf(dame las filas y las columnas);
Scanf(%d %d,filas,columnas);
Tambin hay que declararle el tamao:
X=(int*)malloc(filas columnas*sizeof(int));
*(*(x+i)+j)
*(x+i)+j
EJEMPLO :
vamos a declarar una matriz llenarla e imprimirla
#include<stdio.h>
#include<malloc.h>
void main()
{
int i,j,filas,columnas,(*x)[];
decir el valor
de las columnas
143
scanf(%d %d,&filas,&columnas);
x=(int*)malloc(filas*columnas*sizeof(int));
for(i=0,i<filas;i++)
{
for(j=0;j<columnas;j++)
{
printf (dame un valor);
scanf(%d,*(x+i)+j);
}
}
for(i=0,i<filas;i++)
{
for(j=0;j<columnas;j++)
{
printf (%d,*(*(x+i)+j));
}
}
}
para pasar a una funcion no cambia = llena (x,filas,columnas);
pero a la hora de recibir es void llena (int (*x)[])
Ejercicio anterior pero con funciones
#include<stdio.h>
#include<malloc.h>
#define max 100
void llena(int (*x)[max],int filas, int columnas)
{
int i,j;
for(i=0,i<filas;i++)
{
for(j=0;j<columnas;j++)
{
printf (dame un valor);
scanf(%d,*(x+i)+j);
}
}
return;
}
void imprime(int (*x)[max],int filas,int columnas)
{
int i,j;
for(i=0,i<filas;i++)
{
for(j=0;j<columnas;j++)
{
printf (%d,*(*(p+i)+j));
}
}
return;
}
void main()
144
{
int i,j,filas,columnas ,(*x)[max];
printf(dame la longitud de las filas y las columnas);
scanf(%d %d,&filas,&columnas);
x=(int*)malloc(filas*columnas*sizeof(int));
llena(x,filas,columnas);
imprime(x,filas,columnas);
}
dependiendo de los compiladores para evitar problemas primero:
se pone:
Pedir 2 tablas, y obtener uno nuevo que sea la suma de los 2 que nos han
Introducido
#include <stdio.h>
#include <malloc.h>
#define MAXCOL 100
void llena(int (*x)[MAXCOL], int f, int c)
{
int i, j;
for(i=0;i<f;i++) {
for(j=0;j<c;j++) {
printf("\nIntroduce el elemento %d,%d: ",i,j);
scanf("%d", *(x+i)+j);
}
}
return;
}
for(i=0;i<f;i++)
{
for(j=0;j<c;j++)
{
printf("\nElemento %d,%d: %d",i,j, *(*(x+i)+j));
}
}
return;
145
for(i=0;i<f;i++)
{
for(j=0;j<c;j++)
{
(*(*(z+i)+j)) = (*(*(x+i)+j))+(*(*(y+i)+j));
}
}
return;
void main()
{
int filas, columnas;
int (*x)[MAXCOL], (*y)[MAXCOL], (*z)[MAXCOL];
do {
Cuestion
Float tabla [2][3]={ {1.1, 1.2, 1.3},{2.1,2.2,2.3} }
constestar a: tabla= la posicion del puntero del primer elemento del array
(tabla+1)=la direccion del segunda fila
*(tabla+1)=la direccion del elemento 2.1
(*(tabla+1)+1)= la direccion del elemento 2.2
(*(tabla)+1)= la direccion del elemento 1.2
*(*(tabla+1)+1) es igual al elemento 2.2
*(*(tabla+1))= es igual al elemento 2.1
*(*(tabla)+1)+1= es igual al elemento 2.2
VI.
ARRAYS DE PUNTEROS:
146
INT *NOMBRE[MAXFILAS]
Como anteriormente hay que asignar el tamao :
scanf(%d %d,&fila,&columna);
For (i=0;i<filas;i++)
{
Nombre[i]=(int*)malloc(columnas*sizeof(int))
}
para acceder a una posicin de la tabla seria:
X[FILA]+COLUMNA
y para el contenido :
*(X[FILA]+COLUMNA)
vamos a tener una tabla la cual se puede tratar como un puntero o como una array de
punteros
en el segundo caso no solamente se tiene la primera direccion sino las siguientes las cuales se
guardan en un vector
EJEMPLOS :
}
}
for(i=0;i<fil;i++) {
printf("\nValores para la fila %d", i);
for(j=0;j<col;j++) {
printf("\nIntroduce el elemento %d",j);
scanf("%d", x[i]+j);
}
}
return;
for(i=0;i<fil;i++) {
printf("\nValores para la fila %d", i);
for(j=0;j<col;j++) {
printf("%d", *(x[i]+j));
}
printf("\n");
}
return;
void main(void) {
int *x[MAXFILA], i, filas, columnas;
printf("\nNumero de filas y de columnas: ");
scanf("%d %d", &filas, &columnas);
for(i=0;i<filas;i++) {
x[i]=(int *)malloc(columnas*sizeof(int));
148
}
llena(x, filas, columnas);
saca(x, filas, columnas);
}
149
{
for(j=0;j<b;j++)
{
*(p3[i]+j)=*(p1[i]+j)+ *(p2[i]+j);
}
}
return;
}
void main()
{
int *x[max],fila,columna,*y[max],*z[max],i;
printf("dame el tamao\n");
scanf("%d %d",&fila,&columna);
for(i=0;i<fila;i++)
{
x[i]=(int *)malloc(columna*sizeof(int));
y[i]=(int *)malloc(columna*sizeof(int));
z[i]=(int *)malloc(columna*sizeof(int));
}
llena(x,fila,columna);
llena (y,fila,columna);
printf("tabla 1");
imprime(x,fila,columna);
printf("tabla 2");
imprime(y,fila,columna);
suma (x,y,z,fila,columna);
printf("tabla 3");
imprime(z,fila,columna);
}
150
151
return;
}
//arrays de punteros
void llena1( int *p[max], int filas, int columnas)
{
int i,j;
for(i=0;i<filas;i++)
{
for(j=0;j<columnas;j++)
{
scanf("%d",p[i]+j);
}
}
return;
}
//punteros
void llena2 ( int (*p)[max],int filas,int columnas)
{
int i,j;
for(i=0;i<filas;i++)
{
for (j=0;j<columnas;j++)
{
scanf(" %d", *(p+i)+j);
}
}
return;
}
//arrays mutidimensional
void llena3(int p[][max], int filas, int columnas)
{
int i, j;
for (i=0;i<filas;i++)
{
for (j=0;j<columnas;j++)
{
scanf(" %d", &p[i][j]);
}
}
return;
}
//arrays de punteros
void imprime1 (int *p[max],int filas,int columnas)
{
int i,j;
for(i=0;i<filas;i++)
{
for(j=0;j<columnas;j++)
{
printf(" %d", *(p[i]+j));
}
printf("\n");
}
return;
}
// punteros
152
153
printf("\n\n\n\n");
imprime2(y,filas,columnas);
printf("\n\n\n\n");
imprime3(x,filas,columnas);
imprime4(a,filas,columnas);
}
TEMA 9
ESTRUCTURAS Y UNIONES
1.
INTRODUCCION
En muchas aplicaciones es necesario la creacin de nuevos tipos de datos que permitan agrupar
informacin de distintos tipos.
La combinacin de muchas variables es una variable, unificando el uso de todas ellas, se denomina
estructura.
En una estructura cada variable definida internamente ocupa el tamao correspondiente al tipo al que
pertenece. Existe tambin la posibilidad de que muchas variables compartan la misma memoria utilizando
una unin. En este caso solo se podr almacenar un dato en esa porcin de memoria, siendo referenciado
el contenido segn al tipo que pertenezca.
Anteriormente hemos estudiado los arrays que es una estructura de datos cuyos elementos son todos
del mismo tipo , es decir en un array solamente poda haber o elementos enteros o caracteres etc.
Una estructura tambin nos va a servir para guardar elementos pero con la diferencia que en una
estructura se pueden guardar elementos de distinto tipo.
Por lo tanto una estructura puede contener elementos enteros, flotantes y caracteres e incluso
podemos incluir punteros y arrays como elementos dentro de la estructura,.
cada elemento individual dentro de la estructura se llama miembro
Definicin: una estructura organiza distintos tipos de datos, de manera que se puede hacer referencia
a ellos como si fuera una sola unidad.
154
Una estructura es un conjunto de variables referenciadas bajo un nombre nico que ser el nombre
de un nuevo tipo de dato.
Las estructuras se utilizan para definir nuevos tipos de datos que son conocidos por datos definidos
por el usuario.
2.
DECLARACION
STRUCT NOMBRE
{
TIPO MIENBRO 1;
TIPO MIENBRO 2;
TIPO MIENBRO N;
};
Ejemplo :Tenemos una cuenta de la que nos interesa guardar los siguientes datos:.
El numero de cuenta
Saldo
El tipo de cuenta
Nombre del propietario.
#include <stdio.h>
srtruct cuenta
{
int numero de cuenta;
char tipo de cuenta;
155
char cliente[2];
float saldo;
};
Esta definicion describe una estructura formada por un array de caracteres y por dos variables una de
tipo char y otra de tipo int.
En primer lugar aparece la palabra clave struct,esta palabra identifica como una estructura a lo que
viene es decir al rotulo o etiqueta.(cuenta)
Es necesario recordar dos aspectos:
La definicin de una estructura es una sentencia, y por tanto, se termina con un punto y coma
Se ha definido una etiqueta(cuenta) para identificar una estructura, que representa un tipo de datos
abstracto, pero aun no
struct
nombre_estructura variable;
Siguiendo el ejemplo podria ser struct cuenta cliente
Hay otra forma de declarar una estructura :
TYPEDEF STRUCT
{
TIPO MIENBRO 1;
TIPO MIENBRO 2;
TIPO MIENBRO N;
}
NOMBRE_ESTRUCTURA;
Se utiliza el typedef ya que lo que estamos haciendo es crear un nuevo tipo de datos otorgado por el
usuario.
Ejemplo:
156
#include <stdio.h>
typedef srtruct
{
int numero de cuenta;
char tipo de cuenta;
char cliente[2];
float saldo;
}cuenta;
A partir de ahora se puede definir declarar cualquier variable del nuevo dato que se ha creado para
ello habra que poner:
tipos de dato(es decir nombre de la estructura) variable;
siguiendo el ejemplo: cuenta datos;
nota: la estructura se declara debajo de las funciones de biblioteca
3.
PROCESAMIENTO DE LA ESTRUCTURA
Podemos referirnos a un miembro en particular de la estructura utilizando la notacion
NOMBRE DE LA VARIABLE
Ejemplo:
scanf(" %[^\n]",&datos.saldo);
4.
// equivale a gets(datos.saldo)
ESTRUCTURAS ANIDADAS.
Una estructura esta compuesta por campos de distintos tipos, siendo una estructura un nuevo tipos de
157
Por ejemplo
typedef struct
{
int dia;
int mes;
int ao;
}
fecha;
srtruct cuenta
{
int numero de cuenta;
char tipo de cuenta;
char cliente[2];
float saldo;
fecha apertura;};
158
void main()
{
cliente datos;
// declaracion de una variable (datos) de tipo
cliente
clrscr();
printf("dame tu nombre\n");
scanf(" %[^\n]",&datos.nombre); // equivale a gets(datos.nombre)
printf("dame tu dni\n");
scanf("%ld",&datos.dni);
printf("dame la direccion\n");
scanf(" %[^\n]",&datos.direccion);
printf("\n\n\nlos datos del primer cliente\n");
printf("nombre:%s\n",datos.nombre);
printf("dni:%8.0ld\n",datos.dni);
printf("direccion:%s\n",datos.direccion);
}
Los datos que nos interesa guardar para varios clientes son: (con arrays.)
- El nombre.
- DNI.
- La direccin.
#include<stdio.h>
#define MAX 100
typedef struct
{
char nombre[20];
long int dni;
char direccion[20];
} cliente;
159
void main ()
{
cliente datos[MAX];
int lista, i;
clrscr ();
do
{
printf (" Cuantos clientes vas a introducir:\n");
scanf (" %d", &lista);
} while (lista<=0);
for (i=0; i<lista; i++)
{
printf ("Introduzca el nombre del cliente.\n");
scanf (" %[^\n]", &datos[i].nombre);
printf ("Introduzca el DNI del cliente.\n");
scanf (" %ld", &datos[i].dni); /*%ld es por el long int*/
printf ("Introduzca la direccin del cliente.\n");
scanf (" %[^\n]", &datos[i].direccion);
printf (" \n");
}
aadir cliente
ver clientes
buscar clientes
borrar cliente
salir
#include<stdio.h>
#define max 100
#include <string.h>
typedef struct
{
char nombre[20];
long int dni;
char direccion[20];
}
cliente;
void main()
{
cliente datos;
cliente array[max];
int i=0,opcion,j,contador=0,k=0;
char nombre[20],eliminar[20];
160
clrscr();
do{
printf(" opcion 1: aadir cliente\n");
printf(" opcion 2: ver clientes\n");
printf(" opcion 3: buscar cliente\n");
printf(" opcion 4: eliminar cliente\n");
printf(" opcion 5: salir \n\n\n");
scanf("%d", &opcion);
switch(opcion)
{
case 1:
printf(" nombre\n");
scanf(" %[^\n]",&array[i].nombre);
printf(" dni\n");
scanf("%ld",&array[i].dni);
printf(" direccion\n");
scanf(" %[^\n]",&array[i].direccion);
i++;
break;
case 2:
if (i==0)
{
printf("\nno hay ningun cliente\n");
}
else
{
for(j=0;j<i;j++)
{
printf("\n\nlos datos del cliente %d\n",j+1);
printf("
nombre:%s\n",array[j].nombre);
printf("
dni:%8.ld\n",array[j].dni);
printf("
direccion:%s\n",array[j].direccion);
}
}
break;
case 3:
printf("\n\ndame el nombre del cliente que quieres
buscar\n");
scanf (" %[^\n]",&nombre);
clrscr();
for(j=0;j<i;j++)
{
if(strcmp(array[j].nombre,nombre)==0)
{
printf("el cliente %d\n",j+1);
printf("nombre:%s\n",array[j].nombre);
printf("dni:%8.ld\n",array[j].dni);
printf("direccion:%s\n",array[j].direccion);
contador=1;
}
161
if(contador==0)
{
printf("\nel cliente que busca no se encuentra\n");
}
break;
case 4:
printf("dame el cliente a eliminar");
scanf(" %[^\n]",eliminar);
for(j=0;j<i;j++)
{
if(strcmp(eliminar,array[j].nombre)==0)
{
for(k=j+1;k<i;k++)
{
array[j]=array[k];
j++;
}
i--;
}
}
break;
default:
break;
}
}while(opcion!=5);
}
162
int i;
if (contador==0)
{
printf("\nno hay ningun cliente\n");
}
else
{
for(i=0;i<contador;i++)
{
printf("\n\nlos datos del cliente %d\n",i+1);
printf("
nombre:%s\n",array[i].nombre);
printf("
dni:%8.ld\n",array[i].dni);
printf("
direccion:%s\n",array[i].direccion);
}
}
getch();
return;
}
printf("direccion:%s\n",array[i].direccion);
}
if(contador==0)
{
printf("\nel cliente que busca no se encuentra\n");
}
}
return;
}
void eliminar(cliente array[])
{
int i,j;
char eliminar[20];
printf("dame el cliente a eliminar");
163
scanf(" %[^\n]",eliminar);
for(i=0;i<contador;i++)
{
if(strcmp(eliminar,array[i].nombre)==0)
{
for(j=i+1;j<contador;j++)
{
array[i]=array[j];
i++;
}
contador--;
}
}
return;
}
void main()
{
cliente datos[MAX];
int opcion;
clrscr();
do
{
printf(" opcion 1: aadir cliente\n");
printf(" opcion 2: ver clientes\n");
printf(" opcion 3: buscar cliente\n");
printf(" opcion 4: eliminar cliente\n");
printf(" opcion 5: salir \n\n\n");
scanf("%d", &opcion);
switch(opcion)
{
case 1:
introducir( datos);
break;
case 2:
ver( datos);
break;
case 3:
buscar(datos);
break;
case 4:
eliminar(datos);
break;
default: break;
}
}while(opcion!=5);
}
164
typedef struct
{
char nombre[20];
long int dni;
char direccion[20];
}cliente;
void inserta(cliente datos[])
{
printf("\nIntroduzca datos del cliente %d", num+1);
printf("\nNombre: ");
scanf(" %[^\n]", &datos[num].nombre);
printf("\nDNI: ");
scanf(" %ld", &datos[num].dni);
printf("\nDireccion: ");
scanf(" %[^\n]", &datos[num].direccion);
num+=1;
return;
}
void muestra(cliente registro, int num_cliente)
{
printf("\n\n----Datos del cliente %d----", num_cliente+1);
printf("\nNombre: %s", registro.nombre);
printf("\nDNI: %ld", registro.dni);
printf("\nDireccion: %s\n", registro.direccion);
return;
}
int busca_posicion(cliente datos[])
{
int i=0, encontrado=-1;
char nombre[20];
printf("\nIntroduce el nombre del cliente a tratar: ");
scanf(" %[^\n]", &nombre);
while ( (i<num)&&(encontrado==-1) ) {
if (strcmp(datos[i].nombre, nombre)==0) encontrado=i;
else i+=1;
}
return(encontrado);
165
return(encontrado);
}
void busca(cliente datos[])
{
int posicion, opcion;
printf("\n\n1.Busqueda por nombre");
printf("\n2.Busqueda por DNI");
scanf("%d", &opcion);
switch (opcion) {
case 1:
posicion=busca_posicion(datos);
if (posicion>=0) {
muestra(datos[posicion], posicion);
}
else {
printf("\nEl cliente no se encuentra en la lista\n");
}
break;
case 2:
posicion=busca_dni(datos);
if (posicion>=0) {
muestra(datos[posicion], posicion);
}
else {
printf("\nEl cliente no se encuentra en la lista\n");
}
break;
default:
printf("\nOpcion introducida no valida");
break;
}
return;
166
}
return;
void main(void)
{
cliente datos[MAX];
int i, opcion;
do {
elimina(datos);
}
break;
case 5:
printf("\n---FIN DEL PROGRAMA---\n");
break;
default:
167
}
}while(opcion!=5);
getch();
}
Programa anterior teniendo en cuenta que puede haber mas de un cliente con el
mismo nombre cuando se quiera eliminar un cliente
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAX 100
int num=0;
typedef struct {
char nombre[20];
long int dni;
char direccion[20];
}cliente;
void inserta(cliente datos[])
{
printf("\nIntroduzca datos del cliente %d", num+1);
printf("\nNombre: ");
scanf(" %[^\n]", &datos[num].nombre);
printf("\nDNI: ");
scanf(" %ld", &datos[num].dni);
printf("\nDireccion: ");
scanf(" %[^\n]", &datos[num].direccion);
num+=1;
return;
}
void muestra(cliente registro, int num_cliente)
{
printf("\n\n----Datos del cliente %d----", num_cliente+1);
printf("\nNombre: %s", registro.nombre);
printf("\nDNI: %ld", registro.dni);
printf("\nDireccion: %s\n", registro.direccion);
return;
}
/*Devuelve ctos clientes hay con el mismo nombre*/
int busca_posicion(cliente datos[], int *sitio)
{
int i=0, encontrado=0;
char nombre[20];
printf("\nIntroduce el nombre del cliente a tratar: ");
scanf(" %[^\n]", &nombre);
for (i=0;i<num;i++) {
if (strcmp(datos[i].nombre, nombre)==0) {
muestra(datos[i], i);
(*sitio)=i;
printf("\n");
encontrado+=1;
}
168
}
return(encontrado);
while ( (i<num)&&(encontrado==-1) ) {
if (datos[i].dni==dni) encontrado=i;
else i+=1;
}
return(encontrado);
switch (opcion) {
case 1:
posicion=busca_posicion(datos, &lugar);
if (posicion==0)
printf("\nEl cliente no se encuentra en la lista\n");
break;
case 2:
posicion=busca_dni(datos);
if ( (posicion)>=0) {
muestra(datos[posicion], posicion);
}
else
{
printf("\nEl cliente no se encuentra en la lista\n");
}
break;
default:
printf("\nOpcion introducida no valida");
break;
}
return;
}
void quita(cliente datos[], int lugar)
{
int i;
for(i=lugar;i<num;i++) {
datos[i]=datos[i+1];
169
}
num-=1;
printf("\nEl cliente ha quedado eliminado.\n");
return;
170
case 3:
if (num==0)
printf("\nNo hay ningun cliente en la
lista\n");
else {
busca(datos);
}
break;
case 4:
if (num==0)
printf("\nNo hay ningun cliente en la
lista\n");
else {
elimina(datos);
}
break;
case 5:
printf("\n---FIN DEL PROGRAMA---\n");
break;
default:
printf("\nOpcion introducida no valida\n");
break;
}
}while(opcion!=5);
getch();}
PUNTEROVARIABLE= &VARIABLE
Typedef struct
{
Char nombre[20];
Long int dni;
Char direccion[20];
}cliente;
cliente datos;
cliente *pdatos;
pdatos=&datos
para acceder a los campos poniamos
datos.nombre
ahora
(*PDATOS).NOMBRE;
hay otra forma de acceder al valor de los campos: PDATOS->NOMBRE
EJEMPLO:
171
#include<stdio.h>
#define max 100
typedef struct
{
char nombre[20];
long int dni;
char direccion[20];
}cliente;
void main()
{
cliente datos;
cliente *pdatos;
pdatos=&datos;
printf("dame el nombre\n");
scanf ( " %[^\n]",&datos.nombre);
printf("dame la direccion\n");
scanf ( " %[^\n]",&datos.direccion);
printf("dame el dni\n");
scanf("%ld",&datos.dni);
printf("el
printf("el
printf("el
printf("el
printf("el
printf("el
printf("la
printf("la
printf("la
}
172
scanf("%ld",&datos[i].dni);
printf("\n
DIRECCIN: ");
scanf(" %[^\n]",datos[i].direccion);
}
pdatos=&datos;
clrscr ();
printf ("\n\nLos datos se van a imprimir tres veces.");
printf ("\n\nPrimera forma: ");
for (i=0; i<lista; i++) {
printf ("El nombre es: %s.\n", datos[i].nombre);
printf ("El DNI es: %d.\n", datos[i].dni);
printf ("La direccin es: %s.\n", datos[i].direccion);
}
printf ("\n\nSegunda forma: ");
173
}
6. LISTAS ENLAZADAS
Struct cliente{
Char nombre[20];
Longint dni;
Char direccion[20];
Struct cliente nombre*siguiente;
};
typedef struct cliente nodo;
EJEMPLOS :
Programa que te crea un nodo
174
#include <stdio.h>
#include <stdlib.h>
#define null 0
struct lista{
char nombre[20];
long int dni;
int numero;
struct lista*siguiente;
};
typedef struct lista nodo;
void main(){
//intoducir un cliente.
nodo *inicio=null;
inicio=(nodo*)malloc(sizeof (nodo)); //reservar espacio
printf("\n nombre");
scanf(" %[^\n]",inicio->nombre);
printf("dni\n");
scanf("%ld",&inicio->dni);
printf("\n numero");
scanf("%d",&inicio->numero);
inicio-> siguiente= NULL;
printf("\n nombre: %s",inicio->nombre");
printf("\n DNI: %ld",inicio->dni);
printf("\n numero:%d",inicio->numero);
}
inicio=(nodo*)malloc(sizeof (nodo));
//reservar espacio/
175
este
while(temporal!=null)
{
printf("\n nombre: %s",temporal->nombre);
printf("\n DNI: %ld",temporal->dni);
printf("\n numero:%d",temporal->numero);
temporal=temporal->siguiente;
}
Programa que te permita hacer las siguientes operaciones con una lista:
Crear lista.
Anadir nodo tanto al principio como al final.
Buscar nodo
Eliminar nodo
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define NULL 0
struct lista_elem{
char nombre[20];
int num_cliente;
long int dni;
char direccion[20];
struct lista_elem *siguiente;
};
typedef struct lista_elem nodo;
void pide_datos(nodo *p) {
printf("\n\nNombre: ");
//Pedimos los datos
scanf(" %[^\n]",p->nombre);
printf("\nNumero de cliente: ");
scanf("%d", &p->num_cliente);
printf("\nDNI: ");
scanf("%ld", &p->dni);
printf("\nDireccion: ");
scanf(" %[^\n]", p->direccion);
176
p->siguiente=NULL;
return;
}
//Inserta el primer elememto de la lista
auxiliar=principio;
while (auxiliar->siguiente!=NULL) {
auxiliar=auxiliar->siguiente;
}
auxiliar->siguiente=(nodo *)malloc(sizeof(nodo));
pide_datos(auxiliar->siguiente);
return(principio);
registro=puntero;
while(registro!=NULL) {
printf("\n\n\nEl nombre es : %s", registro->nombre);
printf("\nEl numero es : %d", registro->num_cliente);
printf("\nEl dni es : %ld", registro->dni);
printf("\nLa direccion es : %s", registro->direccion);
registro=registro->siguiente;
}
return;
int menu(void)
{
int opci;
printf("\n\n1.CREAR lista enlazada");
printf("\n2.AADIR nuevo elemento al final de la lista");
printf("\n3.AADIR nuevo elemento al principio de la lista");
printf("\n4.MOSTRAR lista enlazada");
printf("\n5.BUSCAR un elemento de la lista enlazada");
printf("\n6.ELIMINAR un elemento de la lista enlazada");
printf("\n7.SALIR del programa");
printf("\nIntroduce una opcion: ");
177
scanf("%d", &opci);
return(opci);
178
case 2: if (principio==NULL)
printf("\n\nNo hay clientes");
else
principio=anadir_final(principio);
break;
case 3:
if (principio==NULL)
printf("\n\nNo hay clientes");
else
principio=anadir_primero(principio);
break;
case 4:
if (principio==NULL)
printf("\n\nNo hay clientes");
else
mostrar(principio);
break;
case 5:
if (principio==NULL)
printf("\n\nNo hay clientes");
else
{
temp=buscar(principio);
if (temp==NULL)
printf("\n\nEl cliente no esta en
la
lista");
else
{
printf("\n\nNombre: %s", temp->nombre);
printf("\nNumero cliente: %d", temp>num_cliente);
printf("\nDNI: %ld", temp->dni);
printf("\nDireccion: %s", temp-
>direccion);
}
break;
case 6: if (principio==NULL)
printf("\n\nNo hay clientes");
else
{
temp=buscar(principio);
if (temp==NULL)
printf("\n\nEl cliente no
esta
en la lista");
else
principio=elimina(principio,
temp);
}
break;
case 7: printf("\n\nFin del programa");
break;
default:printf("\n\nOpcion no valida");
break;
}
opcion=menu();
}
}
179
TEMA 10
FICHEROS
INTRODUCCION
En la mayora de las aplicaciones es necesario guardar informacin de forma permanente.
Hasta ahora todos los mecanismos de almacenamiento de
informacin(constantes,variables,estructuras,vectores,tablas,punteros..etc)enumerados en
unidades anteriores eran voltiles. Es decir cuando el programa que los ejecutaba termina
su ejecucin desaparecen y la informacin contenida en ellos se pierde.
Para resolver este problema se necesitan estructuras de datos externas al programa.
Al ser externas no desaparecen con el programa a terminar su ejecucin.
En C la estructura de datos externa bsica es el fichero o archivo.
Un archivo se puede definir como una estructura de datos consistente en una secuencia de
componentes del mismo tipo, almacenados de forma externa al programa, generalmente en
dispositivos de almacenamiento auxiliar.
A cada uno de los componentes de un fichero se llama registro .
A su vez un registro esta formado por un conjunto de informaciones de distintos tipo que
hacen referencia al mismo registro y que se denominan campos
Antes de que le programa pueda acceder a un fichero, debe de haber alguna informacin
especifica al conjunto del mismo.
Esta informacin se almacena en una estructura.
APERTURA Y CIERRE DE UN FICHERO:
El primer paso cuando se trabaja con un fichero consiste en establecer un rea de buffer
en el cuales e va almacenar temporalmente la informacin mientras se transmite entre la
memoria y el archivo de datos ,por lo tanto lo primero que hay que hacer es declarar ese
rea:
FILE * NOMBRE;
Los siguiente que queremos hacer es abrir ese archivo, esto se realiza a travs de una
funcin llamada FOPEN( ).
Esta funcin es una funcin controlada por tres parmetros.
El primero es el nombre de l fichero que se va a abrir.
El segundo parmetro describe el uso que se va a destinar a este fichero. Existen varios
usos entre los cuales estn:
r: le abrimos solamente para lectura
w: le abrimos solamente para escritura.
a: abre un archivo existente para aadir informacin al final del fichero.
r+: abre un fichero existente y es de lectura y escritura
w+: abre un fichero nuevo para escritura y lectura
El tercer parmetro es un puntero al fichero: su valor se devuelve en la funcin, es decir,
la funcin FOPEN devuelve un puntero al principio del buffer que hibamos a asociar al
fichero.
FILE *NOMBRE;
NOMBRE=FOPEN(NOMBRE DEL FICHERO.EXTENSION,MODO CON
EL QUE QUEREMOS ABRIR EL FICHERO);
180
Nombre es un puntero que tiene dos valores: NULL cuando FOPEN no ha podido abrir el
fichero que le hemos indicado y distinto de NULL cuando si se ha podido abrir.
Los casos de que la funcin no pueda abrir el fichero van desde que puede que ese archivo
no exista hasta que sea por ejemplo de lectura y le queramos acceder a el como de
escritura
IF ( (FICHERO=FOPEN("EJEMPLO.DAT","W"))==NULL)
PRINTF("\NERROR EN LA APERTURA DEL FICHERO");
ELSE {
Despues de haber realizado las operciones de escritura y/o lectura dependiendo del tipo
de fichero que sea nada mas terminar, lo que hay que hacer es cerrar dicho fichero.
La funcion que se encarga de realizar esto es FCLOSE( ).
El argumento de dicha funcion es el puntero al fichero y no el nombre de dicho fichero:
FCLOSE (NOMBRE);
Ejercicios:
Programa gracias a cual se escriban cuatro pares de numeros en un fichero
#Include<stdio.h>
Void main()
{
file*fichero
int n1,n2,i;
fichero=fopen(ejemplo2.dat,w);
if(fichero==null)
{
printf(\nerror en la apertura);
}
else
{
for(i=0;i<4;i++)
{
printf(valores);
scanf( %d %d,&n1,&n2);
fprintf(fichero,%d %d\n,n1,n2); // escribe en el fichero
}
}
Fclose(fichero);
}
Programa gracias al cual te imprima por pantalla los valores de un fichero
#Include <stdio.h>
Void main()
{
File * fich;
Int a,b;
If ( ( fich=fopen(ejemplo2.dat,r))==null)
printf(error);
Else{
fscanf(fich,%d %d,&a,&b);
while( feof(fich))
{
printf(%d %d,a,b);
fscanf(fich, %d %d, &a, &b);
}
}
Fclose(fich)}
Programa que te escriba en un fichero cuatro pares de numeros y caracteres.
181
main()
file * fich;
int i, num;
Char nombre[20];
If ( ( fich=fopen(ejemplo2.dat,w))==null)
printf(error);
Else
{
for(i=0;i<4;i++)
{
printf(valores);
scanf( %d %[ ^\n],&num,nombre);
fprintf(fichero,%d %[^\n]\n,num,nombre);
}
}
Fclose(fichero);
}
Programa que te escriba los datos de un cliente en un fichero mediante una estructura
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define NULL 0
typedef struct{
char nombre[20];
int num;
}cliente;
void main(void) {
FILE *fichero;
cliente aux;
int i;
if ( (fichero=fopen("ejemplo.dat","w"))==NULL)
printf("\nError en la apertura del fichero");
else {
for(i=0;i<4;i++) {
printf("\nNombre: ");
scanf(" %[^\n]", &aux.nombre);
printf("\nNumero: ");
scanf("%d", &aux.num);
fwrite(&aux, sizeof(cliente), 1, fichero);
}
}
fclose(fichero);
Programa que acceda aun fichero para mostrar por pantalla los caracteres y numeros
escritos en el programa anterior.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define NULL 0
182
typedef struct{
char nombre[20];
int num;
}cliente;
void main(void) {
FILE *fichero;
cliente aux;
if ( (fichero=fopen("ejemplo.dat","r"))==NULL)
printf("\nError en la apertura del fichero");
else {
fread(&aux, sizeof(cliente), 1, fichero);
while(!feof(fichero)) {
printf("\n\nEl nombre es: %s", aux.nombre);
printf("\nEl numero es: %d", aux.num);
fread(&aux, sizeof(cliente), 1, fichero);
}
}
fclose(fichero);
CLIEN
TES
BONIFICACIO
NES
C1
C2
C3
183
Si (num_cliente_cliente==mnimo)
Tratamineto C2
Leer registro clientes
Leer registro bonificaciones
Sino
Tratamiento C3
Leer registro bonificaciones
Fin si
Fin si
Calrcular nmero_cliente mnimo
Fin mientras
El MAX se utiliza para cuando lleguemos a final de fichero le asignemos ese mximo
al nmero de cliente.
Programa que te actualice un fichero;
#include <stdio.h>
#define MAX 10000
typedef struct
{
int ncliente;
int saldo;
}cliente;
typedef struct
{
int ncliente;
int bonificacion;
}bonif;
int calcular_minimo (int aux.ncliente,int temp.ncliente)
{
int minimo;
if( (aux.ncliente==temp.ncliente) ||
(aux.ncliente<temp.ncliente) )
{
minimo=aux.ncliente;
}
else
{
minimo=temp.ncliente;
}
return(minimo);
}
void main()
{
cliente aux;
bonif temp;
FILE *cli;
FILE *bon;
FILE *nuevo;
cli=fopen("clientes.dat","r");
184
bon=fopen("bonificaciones.dat","r");
nuevo=fopen("salida.dat","w");
if(cli==NULL || bon==NULL || nuevo==NULL);
{
printf("\nERROR");
}
else
{
fread(&aux,sizeof(cliente),1,cli);
if( feof(cli) )
{
aux.ncliente=MAX;
}
fread(&temp,sizeof(bonif),1,bon);
if( feof(bon) )
{
temp.ncliente=MAX;
}
minimo=calcular_minimo(aux.ncliente,temp.ncliente);
while(aux.ncliente!=MAX || temp.ncliente!=MAX)
{
if(aux.ncliente==minimo && temp.ncliente==minimo)
{
aux.saldo=aux.saldo+temp.bonificacion;
fwrite(&aux,sizeof(cliente),1,nuevo);
fread(&aux,sizeof(cliente),1,cli);
if( feof(cli) )
{
aux.ncliente=MAX;
}
fread(&temp,sizeof(bonif),1,bon);
}
else
{
if( feof(bon) )
{
temp.ncliente=MAX;
}
if(aux.ncliente==min)
{
printf("El cliente %d ha causado
baja.\n",aux.ncliente);
fread(&aux,sizeof(cliente),1,cli);
//funcin
}
else
{
if( feof(cli) )
{
aux.ncliente=MAX;
}
fwrite(&aux,sizeof(cliente),1,nuevo);
fread(&temp,sizeof(bonif),1,bon);
if( feof(bon) )
{
185
temp.ncliente=MAX;
}
}
}
minimo=calcular_minimo(aux.ncliente,temp.ncliente);
}
}
fclose(nuevo);
fclose(bon);
fclose(cli);
186
nuevo=fopen("nuevo.dat","w");
if (viejo==NULL || modif==NULL || nuevo==NULL)
printf("\nError en la apertura de los ficheros");
else
{
aux=lee_viejo(viejo);
aux1=lee_datos(modif);
minimo=calc_minimo(aux.num_cliente, aux1.num_cliente);
while (aux.num_cliente!=MAX || aux1.num_cliente!=MAX)
{
if((aux.num_cliente==minimo)&&(aux1.num_cliente==minimo))
{
aux.saldo=aux.saldo+aux1.bonificacion;
fwrite(&aux, sizeof(cliente), 1, nuevo);
aux=lee_viejo(viejo);
aux1=lee_datos(modif);
}
else
{
if (aux.num_cliente==minimo)
{
printf("\nEl cliente %d ha causado
baja.",
}
else
{
aux.num_cliente);
aux=lee_viejo(viejo);
}
fclose(fichero);
la funcion fread() devuelve el numero de bytes leidos, por lo que se puede utilizar el valor
esperado para saber si ha existido algun error(si se ha producido algun error, el numero
sera menor de lo esperado.
El tamao de los elementos del fichero sera lo que se pase en la variable en SIZE OF., y la
variable numero inidicara el numero de registros del fichero
Por su parte
en la funcion FWRITE( )
dado un registro indicado por el
puntero(&PUNTERO), escribe todos los bytes de sus elementos en el fichero indicado
inidicado por FILE* NOMBRE DEL FICHERO.
El numero total de bytes escritos en el archivo sera igual al tamao de cada elemento
(SIZE OF (TIPO DE DATO)) por el numero de elementos(NUMERO)
La funcion FWRITE( ) devuelve el numero de elementos ecritos en el fichero.
De nuevo esto se puede utilizar para saber si ha habido un error.
Ejemplo:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define NULL 0
188
typedef struct{
char nombre[20];
int num;
}cliente;
void main(void) {
FILE *fichero;
cliente aux;
int i;
if ( (fichero=fopen("ejemplo.dat","w"))==NULL)
printf("\nError en la apertura del fichero");
else {
for(i=0;i<4;i++) {
printf("\nNombre: ");
scanf(" %[^\n]", &aux.nombre);
printf("\nNumero: ");
scanf("%d", &aux.num);
fwrite(&aux, sizeof(cliente), 1, fichero);
}
}
fclose(fichero);
PRACTICAS DE PROGRAMACION
#include<stdio.h>
#define max 100
#include<string.h>
#include<ctype.h>// biblioteca de toascii
void suma(int ascii[],int numero[], int metidos, int longitud, int
resto[])
{
int i,suma,j=0;
for(i=0;i<longitud;i++)
{
189
suma=ascii[i]+numero[j];
resto[i]=suma%256;
printf("el resultado es %d\n",resto[i]);
if(j==metidos-1)
{
j=0;
}
else
{
j++;
}
}
return;
}
void main()
{
char linea[max];//array que contiene el texto metido.
int numero[max];//array que contiene la clave
int ascii[max];
int i=0,longitud=0,variable,resultado,caracter[max]; //caracter es el
nuevo numero
int metidos=0;
printf("dime el texto a inroducir\n");
gets(linea);
longitud=strlen(linea);
linea[longitud]='\0';
do
{
printf("dame un numero\n");
scanf("%d",&variable);
if (variable!=0)
{
numero[i]=variable;
metidos=metidos+1;
i=i+1;
}
}while(variable!=0);
for(i=0;i<metidos;i++)
{
printf("%d",numero[i]);
}
for(i=0;i<longitud;i++)
{
resultado=toascii(linea[i]);
ascii[i]=resultado;
printf("el numero ascii correspondiente a %c:
%d\n",linea[i],ascii[i]);
}
suma(ascii,numero,metidos,longitud,caracter);
for(i=0;i<longitud;i++)
{
printf("%c",caracter[i]);
}
190
#include <stdio.h>
#define LADO 10
void rellenar (int (*foto)[LADO], int a, int b, int nuevo)
{
int antiguo;
antiguo=*(*(foto+a)+b);
*(*(foto+a)+b)=nuevo;
if (b+1<LADO && nuevo!=antiguo)
{
if (*(*(foto+a)+(b+1))==antiguo)
{
rellenar (foto, a, b+1, nuevo);
*(*(foto+a)+(b+1))=nuevo;
}
}
191
{
int i, j;
for (i=0; i<LADO; i++)
{
for (j=0; j<LADO; j++)
{
printf ("%d ", *(*(foto+i)+j)
}
printf ("\n\n");
}
return;
);
}
void llena (int (*foto)[LADO])
{
int i, j;
printf ("VAMOS A INTRODUCIR LOS VALORES ...\n\n");
for (i=0; i<LADO; i++)
{
for (j=0; j<LADO; j++)
{
printf ("VALOR (%d,%d): ", i+1, j+1);
scanf ("%d", *(foto+i)+j);
}
}
return;
void main ()
{
int (*foto)[LADO];
int nuevo, a, b;
clrscr ();
foto=(int*) malloc (LADO*LADO*sizeof(int));
llena (foto);
clrscr ();
printf ("INTRODUCE EL NUEVO VALOR: ");
scanf ("%d", &nuevo);
do
{
printf ("INTRODUCE LA POSICIN A CAMBIAR: ");
scanf ("%d %d", &a, &b);
a-=1;
b-=1;
} while (a<0 || b<0 || a>9 || b>9);
rellenar (foto, a, b, nuevo);
imprime (foto);
getch ();
}
Programa anterior pero en color
#include <stdio.h>
#define LADO 10
void rellenar (int (*foto)[LADO], int a, int b, int nuevo)
{
int antiguo;
antiguo=*(*(foto+a)+b);
*(*(foto+a)+b)=nuevo;
if (b+1<LADO && nuevo!=antiguo)
192
{
if (*(*(foto+a)+(b+1))==antiguo)
{
rellenar (foto, a, b+1, nuevo);
*(*(foto+a)+(b+1))=nuevo;
}
}
if (a+1<LADO && nuevo!=antiguo)
{
if (*(*(foto+a+1)+b)==antiguo)
{
rellenar (foto, a+1, b, nuevo);
*(*(foto+a+1)+b)=nuevo;
}
}
if (b-1>=0 && nuevo!=antiguo)
{
if (*(*(foto+a)+(b-1))==antiguo)
{
rellenar (foto, a, b-1, nuevo);
*(*(foto+a)+(b-1))=nuevo;
}
}
if (a-1>=0 && nuevo!=antiguo)
{
if (*(*(foto+a-1)+b)==antiguo)
{
rellenar (foto, a-1, b, nuevo);
*(*(foto+a-1)+b)=nuevo;
}
}
return;
}
void imprime (int (*foto)[LADO])
{
int i, j;
for (i=0; i<LADO; i++)
{
for (j=0; j<LADO; j++)
{
if ( *(*(foto+i)+j)==1 )
{
textcolor (1);
cprintf ("");
}
else if (*(*(foto+i)+j)==2 )
{
textcolor (2);
cprintf ("");
}
else if (*(*(foto+i)+j)==3 )
{
textcolor (3);
cprintf ("");
}
else if (*(*(foto+i)+j)==4 )
{
193
textcolor (4);
cprintf ("");
} else if (*(*(foto+i)+j)==5
textcolor (5);
cprintf ("");
} else if (*(*(foto+i)+j)==6
textcolor (6);
cprintf ("");
} else if (*(*(foto+i)+j)==7
textcolor (7);
cprintf ("");
}
) {
) {
) {
else if (*(*(foto+i)+j)==8 ) {
textcolor (8);
cprintf ("");
} else if (*(*(foto+i)+j)==9 ) {
textcolor (9);
cprintf ("");
} else if (*(*(foto+i)+j)==10 ) {
textcolor (10);
cprintf ("");
} else if (*(*(foto+i)+j)==11 ) {
textcolor (11);
cprintf ("");
} else if (*(*(foto+i)+j)==12 ) {
textcolor (12);
cprintf ("");
} else if (*(*(foto+i)+j)==13 ) {
textcolor (13);
cprintf ("");
} else if (*(*(foto+i)+j)==14 ) {
textcolor (14);
cprintf ("");
} else if (*(*(foto+i)+j)==15 ) {
textcolor (15);
cprintf ("");
} else if (*(*(foto+i)+j)==0 ) {
textcolor (0);
cprintf ("");
}
}
printf ("\n\r");
}
return;
}
void llena (int (*foto)[LADO])
{
int i, j;
printf ("VAMOS A INTRODUCIR LOS VALORES ...\n\n");
for (i=0; i<LADO; i++)
{
for (j=0; j<LADO; j++)
{
do {
printf ("VALOR (%d,%d): ", i+1, j+1);
scanf ("%d", *(foto+i)+j);
} while (*(*(foto+i)+j)>15 || *(*(foto+i)+j)<0);
194
}
}
return;
}
void main ()
{
int (*foto)[LADO];
int nuevo, a, b;
clrscr ();
foto=(int*) malloc (10*10*sizeof(int));
llena (foto);
clrscr ();
do {
printf ("INTRODUCE EL NUEVO VALOR: ");
scanf ("%d", &nuevo);
} while (nuevo<0 || nuevo>15);
do {
#include <stdio.h>
#include <malloc.h>
void rellenar(int (*foto)[10], int c, int f, int nuevo_color)
{
int actual;
actual= *(*(foto+f)+c);
*(*(foto+f)+c)=nuevo_color;
if (f!=1) {
if ( *(*(foto+f-1)+c)==actual )
rellenar(foto, c, f-1, nuevo_color);
}
if (f!=10) {
if ( *(*(foto+f+1)+c)==actual )
rellenar(foto, c, f+1, nuevo_color);
}
if (c!=1) {
if ( *(*(foto+f)+c-1)==actual )
195
if (c!=1) {
if ( *(*(foto+f)+c+1)==actual )
rellenar(foto, c+1, f, nuevo_color);
}
return;
196
#include <stdio.h>
#include <ctype.h>
#define MAX 100
char trata(char origen, int clave)
{
int suma, resto;
void main(void)
{
char linea[100];
int clave[MAX], i=0, j=0, leido, introducidos=0;
printf("\Introduce la linea a tratar:\n");
scanf(" %[^\n]", &linea);
do {
printf("\nIntroduce el valor %d de la clave: ",
introducidos);
scanf("%d", &leido);
if (leido!=0) {
clave[introducidos]=leido;
introducidos+=1;
}
}while (leido!=0);
while (linea[i]!='\0') {
linea[i]=trata(linea[i], clave[j]);
if (j+1==introducidos) j=0;
else j+=1;
i+=1;
}
printf("\nLinea codificada:\n");
printf("%s", linea);
}
197
#include<stdio.h>
#define max 100
#include<string.h>
#include<ctype.h>// biblioteca de toascii
void suma(int ascii[],int numero[], int metidos, int longitud, int
resto[])
{
int i,suma,j=0;
for(i=0;i<longitud;i++)
{
suma=ascii[i]+numero[j];
resto[i]=suma%256;
printf("\nel codigo nuevo es: %d",resto[i]);
if(j==metidos-1)
{
j=0;
}
else
{
j++;
}
}
return;
}
void main()
{
char linea[max];//array que contiene el texto metido.
int numero[max];//array que contiene la clave
int ascii[max];
int i=0,longitud=0,variable,resultado,caracter[max];//caracter es el
nuevo numero
int metidos=0;
printf("dime el texto a inroducir\n");
gets(linea);
longitud=strlen(linea);
linea[longitud]='\0';
do
{
printf("dame un numero\n");
scanf("%d",&variable);
if (variable!=0)
{
numero[i]=variable;
metidos=metidos+1;
i=i+1;
}
}while(variable!=0);
198
}
for(i=0;i<longitud;i++)
{
resultado=toascii(linea[i]);
ascii[i]=resultado;
printf("\nel numero ascii correspondiente a %c:
%d",linea[i],ascii[i]);
}
suma(ascii,numero,metidos,longitud,caracter);
printf(" \nel nuevo texto es:");
for(i=0;i<longitud;i++)
{
printf("%c",caracter[i]);
}
}
199