Вы находитесь на странице: 1из 327

Tema1

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.
CICLO DE VIDA DEL SOFTWARE:
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.

1
Aplicaciones y pruebas de unidades: Se implementa cada funcin por separado y se verifica si nos
sirve para lo que le hemos programado, implementar significa dividir todo en cachos pequeos, ir
codificando y probando poco a poco.

Fase de prueba: Juntamos las partes obtenidas en el proceso anterior y vemos si funciona en conjunto.
Operacin y mantenimiento:
S esta al tanto si surge algn imprevisto y se recogen las modificaciones que quiera el usuario, propuestas
sobre modificaciones o ampliaciones.
Esta clasificacin se corresponde con la anterior de la siguiente manera:
La fase de anlisis y definicin de necesidades corresponde con la fase de definicin, las 3 fases siguientes
corresponden con la fase de desarrollo y la fase de operacin y mantenimiento se corresponde con la ultima
fase, la fase de operacin.
Los problemas que pueden surgir se deben a que no se puede empezar con una fase hasta que no se termine
con la anterior, la solucin a los posibles errores es ms costoso si se ha cometido algn error desde el
principio.
Para intentar resolver esto utilizamos la realimentacion, es decir, se establece una comunicacin entre las fases
Codificacin 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.
LEYES OBSERVADAS EN LA EVOLUCION DE LOS PROGRAMAS:
Ley de cambio continuo: aplicaciones segn necesidades.
Ley de complejidad creciente: las ampliaciones son cada vez ms complejas.
Ley de conservacin de la estabilidad organizativa: Durante la vida til de un programa su rapidez y
desarrollo va a ser casi constante e independiente de los recursos del sistema.

Ley de conservacin de la familiaridad: en el tiempo de vida del desarrollo de un sistema la evolucin
de su cambio en cada versin es casi constante

IMPLICACIONES :
Coste de mantenimiento porque siempre hay modificaciones.
Entre versiones de un programa hay que hacer modificaciones graduales.
Dedicar al desarrollo de un programa la menor cantidad de gente posible por que as hay menos
posibilidades de conflictos de pensamientos

FACTORES QUE HACEN QUE LA CALIDAD DE UN PROGRAMA AUMENTE:
CALIDAD DEL SOFTWARE:
De lo que se trata es de que la implementacion no tenga fallos y que se refleje lo que el usuario quiere.
No hay un criterio para cuantificarlo pero ms o menos los factores que hacen que se aumente la calidad del
software son :
2
Ausencia de errores.
Fcil de usar y que se refleje lo que el usuario a pedido.
Programa eficiente, es decir, que use los recursos del sistema de forma optima.
Que sea robusto, es decir, que responda bien a situaciones no determinadas
Adaptabilidad, es decir, que las ampliaciones sean fciles de hacer.
Flexibilidad, es decir, que el programa sea compatible en cualquier tipo de ordenador.
Principios de, la calidad:
Prevenir posibles errores antes de introducirlos.
Asegurar que los errores son detectados y corregidos lo antes posible.
Eliminar las causas en vez de eliminar solamente los sntomas del error.
Usar los estndares recomendados, es decir, seguir los pasos que sabes que no conducen al error.
INGENIERA DEL SOFTWARE:
Se quieren establecer unos principios a seguir para obtener programas fiables y que funcionen eficazmente y
que lleve todo esto el menor gasto posible
Objetivos: aumentar la calidad de los programas
aumentar la productividad
bajar los costes de elaboracin de los programas
aumentar la fiabilidad
reutilizacion
PROGRAMACION ESTRUCTURADA:
Forma de organizarse cuando queremos resolver el problema de forma que lleguemos a la solucin del mismo
en un tiempo razonable.
Bases : Forma de programar usando el diseo descendente (ciclo de vida).
Organizar y codificar programas que se entienden fcilmente y pueden ser modificados.
Construir programas donde este presente una estructura y se puedan corregir errores.
Objetivos:
Reducir la complejidad de la tarea de la programacin e intentar que se puedan verificar los
programas en el momento de ser construidas.

Consecuencias:
aparecen nuevos lenguajes de programacin
aparecen mtodos para disear programas
verificar la validez de los programas
obtener programas claros legibles y elegantes
3
la enseanza de la programacin
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.
Un programa esta estructurado cuando todas las componentes de los algoritmos pertenecen a una de las 3
siguientes estructuras:
SECUENCIA SELECCION
ITERACION
TEMA 2
ALGORITMOS
DEFINICION: Es una secuencia de acciones y operaciones detalladas necesarias que nos van a llevar a la
resolucin del problema que tengamos
Un algoritmo debe ser:
Preciso: en cuanto al orden de las operaciones, es decir, que en cada paso que demos sepamos lo que s esta
haciendo y lo que vamos a hacer en los pasos siguientes.

Finito : en cuanto al numero de operaciones, es decir, que puedo determinar el final del algoritmo.
Definido: a partir de unas entradas y salidas determinadas obtengamos los mismos resultados. Es decir, que
un problema puede ser resuelto por mas de un algoritmo diferente.

Correcto: debe conducir a la solucin del problema.
Para elaborar un ALGORITMO es necesario seguir unos pasos:
Resolucin de un programa:
Anlisis del problema: ver las entradas, salidas y el procedimiento de un sistema
Definicin del algoritmo: el problema inicial se va dividiendo en subproblemas con el fin que cada
vez que hagamos esto nos encontremos con un problema ms simple, es decir, hasta llegar a acciones
que podemos realizar directamente; esta tecnica se llama TOPDOWN.

Verificar el algoritmo
Trabajando de esta forma facilitamos la modificacin, la verificacin y la comprensin del programa.
ANALISIS DEL PROBLEMA DEFINICION DEL ALGORITMO
VERIFICAR EL ALGORITMO
Implementaron del algoritmo:
Codificamos el programa segn el algoritmo que hemos obtenido.
Ejecutar el programa.
4
El concepto de algoritmo procede de algoritmo que es el proceso de hacer aritmtica haciendo uso de las
herramientas necesarias. Cuando creamos un algoritmo debemos especificar las acciones a realizar pudiendo
utilizar los lenguajes de programacin
Antes de pasar a la codificacin de un algoritmo mediante un lenguaje de programacin utilizaremos un
lenguaje natural para crear el pseudocodigo de cada problema planteado.
Podemos definir lenguaje de programacin como un conjunto de instrucciones y unas reglas para combinarlas
cuyo objetivo es controlar el hardware para que lleve a cabo un determinado proceso, es decir, indican como
hacer los programas.
TIPOS DE LENGUAJES DE PROGRAMACION:
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
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

5
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.
TRADUCTOR
TRADUCTORES
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.
6
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.
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
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:
Ordinogramas: son diagramas de flujo que representan la secuencia lgica de las operaciones que se
han de efectuar para llevar a cabo un proceso o subsistema determinado, es decir, los ordinogramas
representan grficamente paso a paso todas las

instrucciones del programa, reflejando la secuencia lgica de las operaciones necesarias para la resolucin de
un problema
El ordinograma detalla paso a paso el proceso que debemos seguir en la etapa de programacin, todo
ordinograma debe plasmar un inicio, un fin y una secuencia de operaciones. En la representacin de los
ordinogramas es conveniente seguir unas reglas:
Utilizar lneas rectas.
debe haber un solo comienzo y un solo fin
se evitara los cruces de lneas de flujo
Las instrucciones deben ser mnimas.
No hacer uso excesivo de comentarios.
Las expresiones utilizadas dentro de los smbolos deben ser independientes del lenguaje de
programacin.

Etc. ..
7
Como con los organigramas los ordinogramas poseen sus smbolos:
ETC
Tomas de decisin datos terminador operacin conector
1 INICIO 1
2 OPERACIONES
3 SECUENCIA 2
DE OPERACIONES
4 FIN
3
4
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:
8
Escribir introduzca la base y la altura
Leer base, altura
Calcular area=base *altura
Escribir el rea de rectngulo es:
Fin programa.
TEMA3
TECNICAS DE PROGRAMACION
CONCEPTOS:
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
DEFINIDAS POR EL USUARIO
ESTRUCTURADAS
NUMERICOS: Contienen datos formados exclusivamente por nmeros
que pueden ser de dos tipos:
Enteros : son datos numricos llamados tambin de coma o punto fijo. Su rango depende del
computador y del lenguaje de programacin, se representan en decimal por dgitos (1 2 3 4 5 6 7 8 9)
formando cantidades enteras, es decir, sin parte fraccionaria positivas o negativas.

Reales :son datos numricos tambin llamados de coma o punto flotante. Su rango depende del
computador y del lenguaje de programacin, se representan por dgitos formando cantidades positivas
o negativas que pueden tener cifras fraccionarias

LOGICOS: Datos que toman exclusivamente dos valores (0,1) (verdadero,falso), el uno corresponde con
verdadero y el cero con falso. Se almacenan en memoria mediante un solo bit y se utilizan para elegir entre 2
alternativas diversas o como resultado de una comparacin.
9
CARCTER: Aquellos que representan un solo elemento alfanumrico, va entre comillas
Cuando es un solo carcter va entre ` ` y cuando es una cadena va entre la caracterstica ms principal del
carcter es la longitud el espacio tambin es considerado un carcter.
Cada carcter de tipo alfanumrico suele almacenarse en un byte
ESTRUCTURADAS: Para agrupar distintos datos de los vistos en los simples.
Ejemplos: registros, ficheros,conjuntos, listas, arrays.
DEFINIDOS POR EL USARIO: El propio programador define un tipo de datos al principio del programa ya
que los va a necesitar para la resolucin del mismo.
IDENTIFICADORES Y PALABRAS RESERVADAS.
A toda variable se le debe dar un nombre o identificador. Este nombre sirve para que el sistema identifique el
lugar de la memoria donde esta almacenado el valor de la variable, dicho nombre debe empezar siempre por
una letra no se pueden usar las palabras clave del lenguaje como identificadores de las variables. l numero
mximo de sus caracteres difieren segn los lenguajes
Los identificadores son nombres que nos van a servir para nombrar algo, hay que definirlos de la forma ms
explcita posible ejemplo S=S+P
Las palabras reservadas son las que forman el lenguaje de programacin y no se usan para nombrar cosas
porque tienen su propio significado.
Ejemplo: si entonces repetir inicio.
COSTANTES: son datos cuyo valor no varia durante la ejecucin de un programa, es decir, es un objeto
cuyo valor almacenado en una zona de la memoria permanece inalterado.

Una constante puede ser del tipo de las que hemos visto en el apartado 1
Cuando me quiero referir a la constante la llamo identificador. Para que se usan? Pues se van a proclamar al
principio del programa para que sea ms comprensible el programa y para facilitar las modificaciones en el
programa.
VARIABLES : Representan datos que pueden modificar su valor, se caracterizan por el nombre que le
damos y por el tipo. El sistema debe conocer el tipo de datos de cada variable para poder almacenar en
memoria dichos valores, el modo de declarar varia segn el lenguaje.

El nombre sirve para poder acceder al valor de la variable y el tipo determina la clase de dato que podemos
almacenar en la variable, tambin se declaran al principio del programa.
Tipos de variables auxiliares:
Contadores: . Son unas variables que se utilizan para contar. Normalmente s inicializan a 0 y cada vez que
ocurre el suceso a contar, se incrementan en una unidad.
Acumuladores:. Son unas variables que se utilizan para realizar sumatorios o productos de distintas
cantidades. Para el sumatorio s inicializan en 0 para el producto s inicializan en 1. Es un elemento cuyo
10
valor se incrementa varias veces en cantidades variables.
OPERACIONES ARITMETICAS: estn formadas por un operador y una serie de datos permiten elaborar
expresiones estos operadores aritmticos son: + * / etc.

En el caso de que se den varias a la vez se opera segn esta prioridad
Potencias multiplicaciones divisiones y por ultimo sumas y restas.
OPERACIONES LOGICAS o BOOLEANAS: Estan formados por una constante o variable, operador
lgico seguido de una constante o variable.

Solo pueden expresar dos valores verdadero o falso, las operaciones booleanas actan sobre una o ms
variables obteniendo otra variable booleana, cada operacin lgica se rige por su tabla de verdad,
Se utilizan para evaluar las condiciones a travs de los operadores relacionales como por ejemplo ( = <> < >
>= <=) y a travs de los operadores lgicos combinan expresiones lgicas
Y son el AND NOT OR
Expresin primera Operador lgico Expresin segunda Resultado final
VERDADERO 1
VERDADERO 1
FALSO 0
FALSO 0
AND
VERDADERO 1
FALSO 0
VERDADERO 1
FALSO 0
VERDADERO 1
FALSO 0
FALSO 0
FALSO 0
VERDADERO 1
VERDADERO 1
FALSO 0
FALSO 0
OR
VERDADERO 1
FALSO 0
VERDADERO 1
FALSO 0
VERDADERO 1
VERDADERO 1
VERDADERO 1
FALSO 0
VERDADERO 1
FALSO O
NOT
FALSO 0
VERDADERO 1
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:
11
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:
Asignacin.
Entrada
Salida
Instrucciones de declaracin: simples. Indican el tipo, las caractersticas y la identificacin de los
objetos que componen un programa. Por ejemplo si es numrico, alfanumrico.el numero de
caracteres que tiene

Instrucciones de control
Secuencia
Seleccin
Repeticin o iteracin.
Evalan las expresiones lgicas con el objetivo de controlar la ejecucin de otras instrucciones o alterar el
orden de ejecucin normal de las instrucciones de un programa
Tambin esta formado por variables auxiliares
TECNICAS DE PROGRAMACION:
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
12
ocurri un error.
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.

Frente a la programacin convencional la programacin modular presenta unas ventajas:
Los programas hechos con esta tcnica de programacin son ms sencillos de escribir y de depurar
por que se pueden hacer pruebas parciales con cada modulo por separado.

La modificacin de un modulo se hace mas cmoda y en general no tiene que afectar al resto de los
mdulos.

Un programa se puede ampliar fcilmente diseando nuevos mdulos.
Un mismo modulo escrito una sola vez puede ser referenciado desde varios puntos del programa
evitando la repeticin de instrucciones ya escritas.

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.
13
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.
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:

Documento de descripcin funcional: documentacin que trata de los requisitos y propsitos del
programa ofrece ejemplos sencillos de lo que hace el programa para saber si es lo que busca el
usuario.

Documento de instalacin y documentacin: el cual detalla la instalacin y los requisitos del hardware
y cuales son los archivos de configuracin.

Manual introductorio: documentacion que ofrece ejemplos de usos iniciales sencillos para ver si
funciona bien el sistema y en este tipo de documentacion se habla de los primeros problemas que
pueda tener el sistema.

Manual de referencia: en esta documentacin se puede observar una descripcin total y formal del
programa.

Gua del operador: en ella s ofrecen respuestas rpidas a problemas inesperadas.
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
14
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.
EJERCICIOS
ORDINOGRAMAS
Dan 3 nmeros tenemos que ver si la suma de 2 de ellos es igual a uno de ellos.
Inicio
Leer A B C
Si A=B+C entonces
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
Suma de los n numeros naturales
Inicio
Leer N
15
R=O
C=O
Repetir
C=C+1
R=C+R
Hasta C=N
Escribir resultado
Fin
PSEUDOCODIGO:
Utilizar palabras que utilizamos normalmente
operadores: suma resta producto, division, < >..
nombres
comentarios: indicar lo que se hace comentario
palabras reservadas: identifica una de las estructuras de los organigramas inicio, fin
ESTRUCTURA SELECCIN
Si A=B+C entonces
Escribir
Si no .
Fin si
algoritmo que lea 2 valores y les ponga en orden
Inicio
Leer A
Leer B
Si A>B ents
Escribir valor de A
Escribir valor de B
Sino
Si A<B ents
16
Escribir valor de B
Escribir valor de A
Sino
Escribir iguales
Fin si
Fin si
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)
REPETIR: Repetir
Accion 1
Accion 2
.
.
Accion N
Hasta condicion
suma de los n nmeros naturales (repetido)
Inicio
Leer N
R=O
C=O
Repetir
C=C+1
R=C+R
17
Hasta C=N
Escribir resultado
Fin
ESTRUCTURAS REPETITIVAS
MIENTRAS: Mientras Condicion hacer
Operaciones
Fin mientras
calcular el factorial de un n que sea mayor que 1
ejemplo 4!: 4x3x2x1
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
Otra manera: 4!= N(N1)(N2)(N3)
Fact=1
Mientras n<>0 hacer
18
Fact=fact*N
N=N1
Fin mientras
Escribir resultado
Fin
tenemos 4 nmeros determinar cual es el mayor
Inicio
Leer A B C D A,B,C,D
Si A >o= B ents
Maxi =A
Sino
Maxi =B
Fin si
Si maxi <C ents
Escribir maximo =C
Fin si
Si maximo >o=D ents
Escribir MAXIMO
Si no
Escribir d
Fin si
Fin
Otra forma: A B C D
Inicio
Leer A B C D
Si A >o=B ents
19
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
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
S=S+N
C=C+1
Leer N
Fin mientras
Si C=O ents
M=S/C
20
Escribir M
Escribir S
Fin si
Fin
sumar los n pares entre 1 y 50
Inicio
S=O
P=2
Mientras P<50 hacer
S=S+P
P=P+2
Fin mientras
Escribir s
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
21
Escribir suma
Fin
Determina la cantidad total a pagar por una llamada telefnica dependiendo.
Toda llamada que dura menos de tres minutos tiene un coste de 10 pts cada minuto mas es un paso de
contador y cuestan 5 pts ms. C= contador, D= duracin, S= coste.
Inicio
C=O
S=O
leer D
mientras D<=O hacer
Leer D
Fin mientras
Si D<=3 entonces
S=10
Sino
C=4
S=10
Mientras C< =D Hacer
S=S+5
C=C+1
Fin mientras
Escribir coste
Fin si
Fin
Otra forma:
Disear un algoritmo que dados 10 nmeros enteros, indique cuales son pares, nos los muestre y
calcule la media de los impares.

Inicio
22
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
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
23
fin para
Algoritmo que nos escriba el cuadrado y el cubo de un numero
Inicio
Leer n
Cr =O
C=O
Cu=O
Mientras C=N hacer
C=C+1
CR=C*C
CU=CR*C
Ecribir cuadrado
Escribir cubo
Fin
Tambien se puede hacer con un repetir
Los trabajadores de una fabrica de coches tienen 3 turnos maana tarde y noche
Algoritmo que nos muestre el sueldo teniendo en cuenta que trabajan 5 dias a la semana y los turnos se pagan
asi : maana600 pts por hora
Tarde800
Noche 1000
Inicio
Dias =1
Sueldo=O
Mientras D< = 5 hacer
Leer horas
Leer turno
Si turno =maana entonces
24
S=S+H*600
Sino
Si turno =tarde entonces
S=S+H*8OO
Sino
S=S+H*1000
Fin si
Fin si
Dias =dias +1
Fin mientras
escribir sueldo
fin
Ejemplo anterior pero con la estructura para.
Inicio
Dias=O
Sueldo=O
Para dias desde 1 hasta 5 hacer
Leer horas
Leer turno
Si T=M ents
S=S+H*600
Sino
Si T=T ents
S=S+H*800
Sino
S=S+H*1000
25
Fin si
Dias=Dias+1
Fin si
Fin para
Escribir sueldo
Fin
ESTRUCTURA CONDICIONAL MULTIPLE
Segn variable hacer
=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
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
26
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
Ejercicio anterior pero con la estructura segn
Inicio
Leer n
C1=O
C2=O
C3=O
C4=O
Mientras N>O hacer
Segn N hacer
=1 C1=C1+1
=2 C2=C2+1 =1 =2 =3 =4 =otro
=3 C3=C3+1
=4 C4=C4+1 =1 =2 =3 =4
27
=otro escribir mensaje
fin segn
leer n
fin mientras
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
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
28
Algoritmo que permite elegir la opcin de calcular el rea de un circulo o su longitud
Inicio
R=O
A=O
S=O
N=O
P=3,14
Menu
Leer N
Leer R
Segn N hacer
=1 si R>0 entonces
A=R*R*P
escribir A
=2 si R>0 entonces
S=2*P*R
escribir S =1 =2 =OTROS
=otro escribir mensaje
Fin segn
Fin
Algoritmo para sacar por pantalla todos los divisores de un numero mayor que 0
Inicio
C=0
Repetir leer N hasta
n>o
contador =N
si N mod cont=O entonces
escribir contador
29
sino
fin si
C=C1
Repetir si cont=O entonces
Escribir contador
Hasta C=O
Fin
Tambin se puede hacer si pones el contador en 1 y en la ultima decisin C=N y cambias el repetir por un
mientras
Inicio
Repetir leer N
hasta N>O
para I desde 1 hasta N
hacer
si n mod I =O entonces
escribir I
fin si
fin para
Fin
Algoritmo que nos diga si un numero mayor que o es primo
Inicio
Divisor=O
Contador=2
Escribir dame numero
Repetir
Leer N
Hasta N>O
30
Mientras contador<N hacer
Si n mod cont=O entonces
Divisores=divisores+1
C=C+1
Fin mientras
Si D=O ents
Escribir numero par
Fin si
Fin
Dado un numero>O escribir un algoritmo que lo imprima en orden descendente.
Inicio
Leer N
repetir
Hasta N>O
Repetir
N mod 10=A
Escribir A
N=N/10
Hasta N=O
Fin
Algoritmo que nos calcule la potencia de un numero mayor que O
Inicio
Potencia=1
Repetir
leer BASE
Hasta base >=O
31
Repetir
Leer exp
Hasta que exp>=o
Si exp=o ents
Escribir potencia
Si no
Para I desde 1 hasta exp
Hacer
Potencia = potencia *base
Fin para
Escribir potencia
Fin si
Fin
Otra forma de hacerlo es:
Haz un algoritmo que haga la multiplicacin rusa 22x64
Inicio
Suma=O
Leer n1 n2
Mientras n1 n2<=O hacer
Leer n1 n2
Fin mientras
Si n1 mod2<>O ,ents
S=s+n2
Fin si
Mientras n1>1 hacer
N1=n1/2
32
N2=n2*2
Si n1 mod2<>O ents
S=S+N2
Fin si
Fin mientras
Escribir suma
Fin
Algoritmo que nos de la solucin de una ecuacin de segundo grado.
Inicio
Repetir
Leer A B C
D= Sqrt ( B*B ( 4*A*C ) )
Hasta
D<O
D= Sqrt D
X1 = B+D/2a
X2 = BD/2a
Escribir X1 X2
Fin
Algoritmo que lea 3 nmeros >O y diga si son iguales o no
Inicio
Repetir
Leer A
Leer B
Leer C
Hasta
33
A>O
B>0
C>0
Si A=B Entonces
Si A=C Ents
A=B=C
Sino
A=B
Fin Si
Sino
Si A=C Entonces
A=C
Sino
Si B=C Entonces B=C
Sino A<>B<>C
Fin Si
Fin Si
Fin Si
Fin
Algoritmo que nos muestre en pantalla un tringulo hecho con asteriscos dndote el lado Ejemplo:
lado 3

*
* *
* * *
Inicio
Pedir Lado
Para I Desde 1 Hasta Lado Hacer
34
Para J Desde 1 Hasta I Hacer
Escribir*
Fin Para
Saltar Lnea
Fin Para
Fin
Algoritmo para determinar el Precio de un billete de ida y vuelta conociendo la distancia, los das de
la estancia y sabiendo si la distancia es superior a 1000km y la estancia superior a 7 das hay un
descuento del 30%, el precio por km. es de 8 pesetillas.

Inicio
Precio=0
Repetir
Leer Distancia Dias
Hasta Dias Distancia>0
P=2distancia*8
Si 2Distancia>1000 Dias>7 Entonces
Precio=PrecioPr *0,3
Escribir Precio
Fin
Algoritmo que sume los n nmeros pares
Algoritmo que diga si un numero es par o impar
Inicio
P=0
C=O
S=0
Repetir
C=C+1
35
P=P+2
S=S+P
Hasta C=N
Ecribir S
Fin
Inicio
Leer A
B=Amod2
Si B=O
Par
Sino Impar
Fin
Algoritmo que nos muestre un men con 3 opciones:
Pide nmeros hasta introducir uno negativo Pide 2 pares de nmeros y decir que par es mayor, salir
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
36
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
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
37
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
TEMA IV
INTRODUCCION A C
HISTORIA DEL LENGUAJE C
CARACTERISTICAS
ESTRUCTURA GENERAL DE UN PROGRAMA HECHO EN C
CARACTERISITACAS DESEABLES DE UN PROGRAMA HECHO EN C
COMPILACION
HISTORIA DEL LENGUAJE C
38
En un principio los computadores necesitan que los usuarios les demos las ordenes correspondientes para
trabajar con unos datos. El conjunto de esas ordenes e instrucciones forman los llamados programas. Estos
programas deben ser escritos en un lenguaje que interprete el propio computador.
C es un lenguaje de programacin de propsito general que combina las caractersticas de un lenguaje de alto
nivel con ciertas caractersticas que solo se encuentran en los de mas bajo nivel y que ha sido asociado
estrechamente con el sistema operativo UNIX ya que naci durante el desarrollo de este sistema operativo en
el ao 1972 y creado por Dennis Ritchie en los laboratorios Bell Telephone Laboratories y tanto este sistema
operativo como los programas que se ejecutan en l estn escritos en C.
C es el resultado de la a unin de 2 lenguajes anteriores BCPL y el B los cuales fueron desarrollados en los
mismos laboratorios.
Durante mucho tiempo se uso exclusivamente en estos laboratorios hasta que en 1978 ritchie y kernigan
publicaron un manual que impresiono a los profesionales de las computadoras por la cantidad de
caractersticas que posea el lenguaje este manual se llamaba THE C PROGRAMMING LANGUAJE; de
forma que s promovi su uso para desarrollar programas en distintos entornos.
En la dcada de los ochenta el C alcanza su auge de popularidad contando con compiladores de C elaborados
para todo tipo de ordenadores e incluso programas codificados en otros lenguajes pasados al lenguaje C.
El objetivo principal de C es actuar como un lenguaje de programacin potente que genere un modulo objeto
eficiente. Aunque fue diseado inicialmente para la programacin de sistemas, posteriormente su uso se ha
extendido a aplicaciones tcnico cientficas, de bases de datos, de proceso de textos etc.
A pesar de que es un lenguaje que se desarrollo junto con el sistema operativo UNIX no esta ligado a ningn
sistema operativo en concreto, de forma que se obtiene una gran portabilidad de los programas escritos en este
lenguaje.
Esta portabilidad y su gran aceptacin provocaron la aparicin de multitud de versiones comerciales, cada una
de ellas con sus caractersticas propias.
Este echo trajo consigo algunas incompatibilidades entre las versiones del lenguaje de forma que se hizo
necesaria una estandarizacin del mismo que corri a cargo de ANSI, es decir el AMERICAN NATIONAL
STANDARS INSTITUTE elaboro una definicin normalizada del lenguaje de programacin C.
CARACTERISTICAS
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
39
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.
El C es un lenguaje conciso que ahorra espacio en disco, tiempo de compilacion y tiempo que el
programador debe invertir en escribir un programa ,ademas de ser flexible y potente.
La principal desventaja reside en la dificultad de aprendizaje, ya que es un lenguaje fuertemente tipeado
(debe definirse todo);
ESTRUCTURA GENERAL DE UN PROGRAMA EN C
La Tcnica para resolver un programa cualquiera: .
Leer el enunciado y una vez entendido elaborar una solucin mental del mismo.
Elaborar un algoritmo.
Asegurarnos de que el algoritmo resuelve el problema inicial.
Codificar el programa a travs del algoritmo.
Editar el programa en el ordenador.
Compilar y enlazar.
Ejecutar y comprobar resultados.
Todo programa en C consta de una o ms funciones.
Una funcin es un conjunto de sentencias, es decir, de datos e instrucciones que realizan una tarea
determinada.
En el lenguaje C podemos hacer una distincin entre las funciones que creamos los usuarios ( las cuales
establece el propio programador creando su propia biblioteca de funciones) y entre las que nos ofrece el
lenguaje C, tambin llamadas funciones de biblioteca, las cuales se guardan en ficheros, cada fichero
contendr las funciones.
Estas funciones se declaran al principio del programa.
La tendencia de la programacin es la utilizacin de mdulos, es decir, una programacin dividida en partes
diferenciadas que contengan las instrucciones.
Un programa esta formado por instrucciones que realizan las operaciones a lo largo del mismo. Estas
40
instrucciones se pueden agrupar en las llamadas funciones, evitando la repeticin innecesaria de una parte del
programa y dotndolo de una gran independencia.
Esto confiere una claridad a la programacin permitiendo a simple vista una composicin mental de la
solucin del problema.
El funcionamiento de un programa compuesto por varias funciones es el siguiente:
El programa se ejecuta secuencialmente.
Detecta la funcion. Ejecuta dicha funcin.
Continua con el programa secuencialmente donde lo dejo.
Una de las ventajas que tiene esta forma de trabajo es la confeccin de nuestra propia biblioteca de funciones(
una biblioteca de funciones o librera es un conjunto de funciones compiladas que pueden ser invocadas
desde cualquier programa que permita hacer uso de ellas. Ejemplos: STDIO.H ;CONIO.H) en vez de tener
que disear las mismas funciones cada vez que sean necesarias.
La estructura de una funcin es la siguiente:
Cabecera: nombre con que identificamos a una funcin seguida de los argumentos entre parntesis y
separados por comas en caso de existir; estos comentarios suelen ser el nombre del programa, autor.
etc. y suelen ir as: /*comentario*/, para que estos sean 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.
41
CARACTERISITICAS DESEABLES DE UN PROGRAMA EN C
INTEGRIDAD: se refiere a la correccin de los clculos que hacemos en el programa.
CLARIDAD: se refiere a la facilidad de lectura del programa en conjunto y esto lo conseguimos a
travs de los comentarios y sobre todo facilidad para el propio programador y para otros.

SENCILLEZ: hacer las cosas lo ms fciles posibles.
EFICIENCIA: usar adecuadamente los recursos del sistema; Hay que buscar la armona entre la
sencillez y la eficiencia.

MODULARIDEZ: consiste en coger el programa grande y dividirlo en programas ms pequeos, es
decir, en mdulos, es decir, en funciones; Usando las funciones aumenta la claridad y a la vez facilita
futuras codificaciones del programa.

GENERALIDAD: hacer las cosas lo mas general posible.
COMPILACION
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 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.
42
El compilador interpreta el programa dando lugar a un archivo de cdigo objeto del programa inicial. A
continuacin se enlaza para producir un archivo ejecutable.
Este enlazador tiene como misin unir los mdulos del programa que han sido compilados anteriormente y las
funciones de la biblioteca del compilador C.
Una funcin biblioteca es una funcin ya hecha , estas funciones se guardan con ficheros, cada fichero
contendr las funciones. Este tipo de funciones se declaran al principio del programa. Ejemplo: include
<stdio.h>
TEMA V
PROGRAMACION EN C
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.
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:
43
PALABRAS CLAVE
BREAK
CASE
CHAR
CONTINUE
DEFAULT
DO
DOUBLE
CONST
GOTO
REGISTER
ELSE
FLOAT
FOR
IF
INT
LONG
RETURN
SHORT
TYPEDEF
UNION
ENUM
SWITCH
UNSIGNED
VOID
WHILE
SIGNED
AUTO
RETURN
SIZEOF
VOLATILE
INTERRUP
Identificadores: un identificador es el nombre de un puntero, de un array, de una etiqueta de las variables y
constantes que el usuario puede definir.
Un identificador consiste en una secuencia continua (sin espacios en blanco)de letras ,carcter de subrayado y
digitos, si bien el primer carcter debe ser una letra o un subrayado nunca un digito.
Es importante saber que en C las minsculas y las maysculas son diferentes.
Conviene elegir nombres cuyo significado se identifique fcilmente con el propsito del identificador. Por
consiguiente, suelen ser ms recomendables los nombres largos para los identificadores.
Habitualmente se utilizan las maysculas para los nombres de las constantes y las minsculas para los
nombres de las variables.
Separadores: En C se consideran separadores los espacios en blanco, los tabuladores, los cambios de lnea y
los comentarios.
Los espacios en blanco pueden aparecer practicamente en cualquier lugar del codigo fuente C. Los
comentarios son una clase de espacios en blanco que se representan asi:
/*nombre del programa*/
Constantes: el concepto de constantes en un lenguaje de programacin se aplica a los valores usados en un
programa y que se pueden calcular en tiempo de compilacin.
Las constantes no solo son numricas (enteras, fraccionarias) tambin pueden existir constantes que sean
caracteres (letras) o palabras.
44
Las llamadas constantes simblicas son un nombre que sustituye una secuencia de caracteres la cual puede ser
representada por:
Una constante numrica
Una constante de caracteres
Una constante de cadena de caracteres
Cuando se compila un programa cada aparicin de la constante simblica se sustituye por la secuencia de
caracteres.
Las constantes tienen que declararse al principio y se escriben en maysculas para diferenciarlas de las
variables
Representacin:
Define nombre texto
Define PI 3,1416
Define LETRA `A'
Define MENSAJE ha ocurrido un error
Define : Es una directiva del compilador la cual permite definir constantes y variables es decir
identificar los datos utilizados en las operaciones realizadas en el programa. Debe estar colocada
totalmente en la izquierda seguida del nombre y del valor de la constante. Las constantes y variables
definidas en la cabecera son elementos comunes a todo el programa.

Operadores: en C se utilizan los operadores para representar operaciones aritmeticas. Caracterisitcas a tener
en cuenta de alguno de ellos:
En la division en C el valor de la izquierda de la barra se divide por el que se encuentra a su derecha.
Ejemplo :
A=B/C;
la division (\) funciona de manera distinta con valores de tipo INT y FLOAT. La division en coma flotante da
como resultado una division en coma flotante. Sin embargo la division entre enteros produce un entero.
Tambien se puede realizar una division mixta en la que se divida un flotante entre un entero cuyo resultado
final es un FLOAT porque el menor tipo se transforma el de mayor tipo al realizarse una operacin (segn las
conversiones de tipos). La division entera no redondea al entero mas proximo sino que lo hace por defecto.
El operador de adicion (+) hace que los dos valores situados a su derecha e izquierda se sumen. Los
operandos pueden ser de tanto constantes como variables. Ejemplo :
Ganancia=salario+ sisa;
Hace que el ordenador consulte los valores de las variables de la derecha, los suma y asigna el total a la
variable de la izquierda.
El operador de sustracion ()hace que se reste el numero situado a su derecha del situado a su izquierda.
Ejemplo :
45
total=22423;
El operador modulo (%) se emplea en aritmetica de numeros enteros. Proporciona el resto de la division
entera(es decir sin decimales)del numero entero situado a su izquierda entre el situado a su derecha. Ejemplo :
resto=variable1%variable2;
este operador no funciona en un numero de punto flotante.
El operador condicional(?:) es un operador terciario es decir que usa tres operadores.
Sintaxis EXPRESION 1? EXPRESION2: EXPRESION 3
Este operador evalua la expresion1. Si el resultado es distinto de 0 es decir verdadero evalua la expresion2. El
resultado de esta evaluacion sera el resultado del operador. Si por el contrario el resultado de la primera es
igual a 0 , es decir, es falso, el resultado sera el que se obtenga de la evaluacion de la expresion 3.
Ejemplo : 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.
Una cadena de caracteres consiste en una serie de caracteres que van entre
Es decir son ARRAYS de caracteres es decir de tipo char
En el lenguaje C es obligatorio que todas las variantes se declaren antes de ser utilizadas
OPERADORES
O. ARITMETICOS
SUMA = +
RESTA=
O. MONARIOS
(tambin llamados de incremento y decremento)
OPERADOR
CONDICIONAL
Es un operador ternario
es decir con tres
46
DIVISION = /
(si divido un numero real entre
un n entero el resultado es un
n real)
MULTIPLICACION = *
RESTO DE LA DIVISION
ENTERA= % (modulo)
( Este operador no se puede
utilizar con operandos del tipo
float o double; solo esta
definido para los enteros, el
segundo operando tiene que
ser = 0)
O. RELACIONALES
MAYOR >
MENOR <
IGUAL ==
DISTINTO !=
MAYOR IGUAL > =
MENOR IGUAL < =
O. DE DIRECCION:
* ( operador de contenido de
apuntado) *pun
& (operador de direccion) & a
++i (La variable i se incrementa una unidad antes
de ser utilizada, es el llamado modo prefijo.)
i++ (la variable i se incrementa 1 unidad despus
de ser utilizada, es el llamado modo sufijo.)
i
i
(cont=cont1 : cont : cont
cont=cont+1 : cont++ : ++cont)
ejemplo=
printf (i=%d,i)1
printf (i=%d,++ i)2
printf (i=%d,i)2
printf (i=%d,i)1
printf (i=%d,i++)1
printf (i=%d,i)2
( estos operadores solo se pueden aplicar a
variables)
nunca a expresiones para hacer algo similar con
expresiones se utilizan los operadores de
asignacin.)
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)
operandos.
Representacion:
Expr1? expr2:epr3 ;
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
& and para bits
| or para bits
^ or exclusivo (bits)
PRECEDENCIA Y ORDEN DE LOS OPERADORES:
( ) [ ] &
47
,++,~,! ^
*,/,% |
+, &&
<<,>> ||
<,<=,>.>= ?:
==,!= /=,*=,=,+=,=
TIPOS 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;
EXTENSION DE LOS TIPOS DE DATOS:
48
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.
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.
TIPO DE DATOS
SHORT Enteros 4 bytes
LONG Enteros 2 bytes
CHAR Caracteres 1 bytes
INT Enteros 2 bytes
FLOAT Reales 4 bytes
DOUBLE Reales 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
Otro tipo de datos son
49
VOID :
Es un dato muy especial que se utiliza en estos casos:
para indicar que una funcion no tiene parametros o argumentos.
Para indicar que una funcion no devuelve ningun valor
Para crear punteros genericos.
Sintaxis: void main se coloca cuando la funcion no devuelve parametros
Main (void) se coloca cuando la funcion no recibe parametros.
Void main (void) cuando ni devuelve ni recibe parametros
Cuando una funcion recibe y devuelve parametros se escribe MAIN( ).
Para definir un puntero se utiliza la sintaxis siguiente: void*P
PUNTERO:
Una variable de tipo puntero es un tipo de dato cuyo valor es la direccion de almacenamiento de otro tipo de
dato(variable)dentro de la memoria del ordenador, es decir una variable contiene la direccion de otra variable.
Con estos tipos de datos se definen dos nuevas variables:
&(direccion) y *(contenido).
En la declaracion de un tipo de dato puntero debemos indicarel tipo de dato al que se apuntara dicho puntero.
Sintaxis: tipo dato*P
Char*p
ENTRADA O SALIDA DE DATOS
ENTRADA:
SCANF :. Es una funcin permite leer datos de la entrada estndar, es decir, el teclado y almacenar el
resultado de la lectura en las variables que recibe como argumento.

Se utiliza para introducir cualquier combinacin de valores numricos, caracteres sueltos o cadenas de
caracteres. Segn el formato especificado en el primer argumento almacena elresultado de la lectura en las
variables que recibe como argumentos.
La sintaxis de scanf es: Scanf ( formato, lista de argumentos);
Scanf (%d %d, & n1 & n2);
En FORMATO debemos especificar el formato de los datos que se van a leer
Para ello se utilizan las mismas especificaciones que len la funcion PRINTF mas otra especificaion que se
utiliza para leer un entero corto (%h)
50
Las funcion Scanf recibe los argumentos por referencia para almacenar el valor leido;
Esto significa que tras la cadena de formato debe especificarse la direccion de la variable donde se almacena
el valor, codificado segn el descriptor de la cadena de formato.
Hay que tener en cuenta dos reglas para su utilizacion:
Si se desea leer un valor perteneciente a cualquiera de los tipos de datos hay que colocar el nombre de la
variable precedido de un aspersan &.

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.
GETCHAR: esta funcin mucho ms sencilla que la anterior no tiene argumentos y simplemente
devuelve el carcter leido en forma de entero sin signo.

Es una funcin que lee un carcter del dispositivo de entrada estndar, es decir, el teclado.
Se declara antes la variable donde lo vamos a guardar y luego coge su contenido
El prototipo de esta funcin es: Variable getchar (argumentos);
Char x;
X= getchar( );
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
51
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
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 TIPO DE ARGUMENTO
%C
%D
%E
%F
%O
%S
%U
%H
%I
%ID
%p
%x
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
52
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)
SENTENCIAS DE CONTROL DE UN PROGRAMA
Las sentencias se corresponden con las instrucciones vistas en el pseudo cdigo, constituyen el esqueleto de
un programa. Estas sentencias no son mas que un conjunto de palabras que indican al compilador cosas como
cual es la prxima sentencia a ejecutar.
TIPOS:
SENTENCIAS DE SELECCIN: las instrucciones que se van analizar nos permiten elegir o una
sentencia o otra.

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;
}
53
else
{
sentencia 2;
}
Tambin es posible que dentro de cada sentencia haya otra estructura ifelse es lo que se llama anidamiento
En el caso de que no halle ninguna sentencia sino se cumpliese la condicin no hara falta poner else.
Funcionamiento:
Se evaluala condicion. Si esta es cierta (valor distinto de 0)se ejecuta la sentencia 1. Si es falsa (la condicion
es 0) y existe la parte else, se ejecuta la sentencia 2. En caso de no existir else o de haber ejecutado una de las
dos sentencias se pasara a la siguiente sentencia del programa. Tanto la opcion 1 como la opcion 2 pueden
estar formadas por una (sin llaves) o mas proposiciones(con llaves).
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.
La ejecucin de sentencias comenzara en el caso en que el valor de la expresin y el caso coincidan y
terminara de ejecutar sentencias cuando encuentre una sentencia brake o continue.( el primero proporciona la
posibilidad de salir incondicionadamente de las sentencias for, while, switch y la segunda lo que hace es
romper la secuencia de ejecucin de las sentencias de un bucle haciendo que se evale de nuevo la condicin,
esta sentencia no tiene sentido en un switch) En el caso de que el valor de la expresin no coincida con ningn
caso se ejecutara la sentencia del caso marcado como default que puede no existir, es decir, es opcional. No
hay limitacin en el n de casos ni en las sentencias de cada uno.
Sintaxis:
Switch (expresin)
{
case 1:
sentencia 1;
break ;
case n
sentencia n;
break;
default:
54
sent1;
sent n;
Break;
}
SENTENCIAS DE ITERACIN:
Otra necesidad habitual de los programadores es la de ejecutar una sentencia un determinado numero de
veces: es lo que se denomina BUCLE. El C dispone de las siguientes instrucciones para este propsito
Dowhile: ejecuta en primer lugar la sentencia y luego evala la expresin. Si al volver a evaluar la
expresin esta sigue siendo cierta, se ejecuta la sentencia de nuevo y as sucesivamente hasta que se d lo
contrario. Esta funcin coincide con la estructura repetir del pseudo cdigo.

La sintaxis es la siguiente:
Do
{
sent 1;
sent n;
}
while (condicion);
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:
While (expresin)
{
Sentencia:
}
55
For : Es similar al while , es preferible usar el for cuando la modificacion de la expresion es simple.
Su sintaxis es:
For (valor inicio; valor final; incremento)
{
sentencia 1
sentencia N
}
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:
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 dowhile, 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;
Continue:
Si por alguna razon, generalmente debida a un mal diseo, fuese estrictamente necesario salir de un bucle,
disponemos de una estructura menos agresiva que el BREAK;.
56
Lo que hace CONTINUE; es romper la sentencia de ejecucion de las sentencias de un bucle, haciendo que se
evalue de nuevo la condicion.
Esta sentencia es utilizable en los tres tipos de bucles pero no en switch.
Al igual que en el break, interrumpe el flujo del programa; sin embargo en lugar de finalizar el bucle
completo, CONTINUE hace que el resto de la iteracion se evite , comenzando una nueva iteracion.
Ejemplo :
While ( (ch =getchar( ) ) = `#')
{
if (ch=='n')
continue;
putchar (ch);
}
CONTINUE hace que se ignore los caracteres nueva linea; sin embargo, el bucle se abandonara unicamente
cuando se localice el carcter `#'.
Este fragmento se podria haber expresado tambien asi:
While ( (ch=getchar( ) )!= `#')
If (ch!='n');
La referencia CONTINUE puede ayudar a acortar algunos programas,en especial si existen sentencias If else
anidadas.
ESTRUCTURA DE UN PROGRAMA BASICO
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 :
57
#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
Define nombre cadena
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
58
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.
}
Las llaves se utilizaran para encerrar un conjunto de sentencias. Estas son obligatorias cuando hay mas de
una sentencia y no lo son cuando solamente hay una. Sealan el comienzo y el fin del cuerpo de la funcion.
TEMA VI
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 :
Evita la repeticion de instrucciones en distintos lugares d el programa.
Facilita la comprension de los programas y su modificacion.
Aumenta la reutilizacion del codigo.
La razon principal del uso de las funciones es la evitacion de las odiosas repeticiones.
Escribiendo una sola vez la funcion apropiada, podremos emplearla cualquier numero de veces en un
59
determinado programa, en diferentes situaciones y localizaciones.
Una funcion es un segmento del programa que realiza determinadas tareas bien definidas entonces todo
programa consta de una o mas funciones una de las cuales es la funcion MAIN ( ) la cual tiene que estar
siempre y la ejecucion de un programa comienza con las instrucciones contenidas en ella .
Las funciones lo mismo que las variables tienen que declararse y estas definiciones tienen que ser
independientes unas de otras es decir , una funcion no necesita de otra para realizar su tarea.
Al acceder a una funcion se ejecutan las instruciones que la forman. Se puede llamar a una funcion desde
diversos puntos del programa y una vez que se han ejecutado las instrucciones que forman la funcion se
devuelve el control al punto desde que se accedio a el. Normalmente una funcion procesa informacion la cual
es pasada desde el punto en el que se accede a la funcion y devuelve un solo valor al punto desde donde se
llama a la funcion.
La informacion se la pasa a la funcion mediante unos identificadores o variables que son argumentos o
parametros y se devuelve con la sentencia RETURN.
DEFINICION DE UNA FUNCION:
Para definir una funcion hay 3 componentes principales:
Primera linea.
Declaracion de los argumentos.
El cuerpo de la funcion.
La primera linea :
Sintaxis: TIPO _DATO NOMBRE (ARG FORMAL,,ARG FORMAL N)
Tipo dato : contiene la especificacion del dato devuelto por la funcion.
Cuando la funcion devuelva un dato que no sea entero, se debe usar un indicador de datos. Por defecto el
indicador que toma es el int.
Nombre: nombre que le damos a la funcion. Generalmente la representacion del nombre de
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 ( ).
60
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.
Declaracion de los argumentos:
En estas declaraciones se dice de que tipo son los argumentos formales que tenemos entre parentesis. Es decir
cada variable de argumentos que nos se declare explicitamente se toma como int por defecto. Se deben
declarar los argumentos antes de la llave que inicia el cuerpo de la funcion.
Sintaxis: TIPO ARG FORMAL;
El cuerpo de la funcion:
Contiene las instrucciones ( declaraciones y sentencias)necesarias para que esta resuelva o realice su tarea .
Contiene las tipicas estructuras y va entre { }
Por lo tanto la estructura de una funcion seria asi:
Primera linea
Declaracion
{

return expresion;
}
La sentencia RETURN devuelve la informacion al punto en el que se llama a la funcion, si la funcion no
devuelve nada solo se pone return;
Una funcion puede incluir varias sentencias return; conteniendo cada una de ellas distintas expresiones.
ACCESO A UNA FUNCION:
Para usar una funcion hay que llamarla o invocarla
Para llamar a una funcion se especifica el nombre y los argumentos( ), en el caso de que sea necesario una
serie de argumentos van separados por comas, estos argumentos son argumentos reales por que contienen la
informacion que realmente se transmite a la funcion.
Se tiene que dar que exista un argumento real por cada argumento formal que hayamos puesto en la
61
declaracion de la funcion y tiene que ser del mismo tipo.
Sintaxis: NOMBRE_FUNCION(LISTA_ARGUMENTOS);
Ejemplo : Suma (A,B);
Como devolver valores:
La funcion MAIN, como casi todas las funciones puede devolver un valor a la funcion que la llamo. En el
caso de MAIN el valor se devuelve al sistema operativo ,el comando que lo devuelve es main donde la
expresion a retornar es la que se devuelve.
La sentencia RETURN no se limita a indicar la salida de la funcion sino que tambien puede pasar un valor a
quien llama a la funcion. Para pasar el valor que tecleo el usuario, cambiamos la sentencia RETUN; por
RETURN (ARGUMENTO);
Entre parentesis podemos poner cualquier expresion y dicha expresion puede ser tan compleja como se quiera
, devolviendose solamente un valor.
Con una instruccin return solo se puede enviar al programa de llamada un valor. Para el paso de mas de un
valor se tienen que emplear los punteros .
La palabra return hace que el valor de la expresion encerrada entre parentesis,
cualquiera que sea, quede asignada a la funcion que contenia dicho return.
Ejemplo: suma de dos cantidades
#include <stdio.h>
int suma (a , b)
int a , b;
{
int res =0;
res=a+b;
return(res);
}
void main( )
{
int n1, n2 , resultado=0
printf (dame dos numeros);
62
scanf (%d %d ,&n1, &n2);
resultado=suma(n1,n2);
printf (el resultado es %d,resultado);
}
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=5n;
pintf(la distancia es %d, d);
return;
}
}
63
void main ()
{
int n1;
printf(dame un numero);
scanf(%d,&n1);
void maximo(n1);
}
como especificar tipos de funciones.
El tipo de una funcion queda determinado por el tipo de valor que devuelve, no por el tipo de sus argumentos.
Las funciones se suponen del tipo int, a menos que se indique lo contrario.
Si una funcion no es del tipo int se debera advertir en dos sitios:
Al declarar el tipo de la funcion en su definicion
Al declararse el tipo de funcion en la funcion de llamada. Esta declaracion debe incluirse junto con las
declaraciones de variables;en la declaracion se incluiran el nombre de la funcion y los parentesis (sin
argumentos) con el fin de identificar dicho nombre como funcion.

En C todas las funciones del programa tienen la misma estructura. Cada una puede llamar a otra funcion o ser
llamada porotra. De hecho una funcion puede llamarse a si misma. El proceso por el cual una funcion se llama
a si misma recibe el nombre de recursividad.
En el caso de que se quiera llamar a una funcion b( ) desde una funcion A( ), se deben
Declarar, para evitar errores fuera de la funcion main( ):
Calcular el factorial de un numero que sea mayor que 1
#include <stdio.h>void main ( )
{
int n, contador=0, factorial=1;
printf ("dame un numero\n"); scanf ("%d", &n);
if (n<1)
{ printf ("el numero no vale\n");
} else { do{ contador =contador+1;
factorial= factorial*contador;
64
}
while( contador!=n);
printf ("el resultado es %d\n", factorial);
}
}
Programa que nos pida 4 numeros y calcule cual es el mayor
# 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
{
65
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 ()
{
/* 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);
}
66
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;
67
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
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");
}
68
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.

#include <stdio.h>
void main()
{
int suma=0,n,leidos=0,impares=0,pares=0;
69
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);
70
}
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.
#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
71
{
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)
{
72
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 hasta que
introduzcamos uno negativo y nos diga cuantas veces hemos escrito cada numero.#include
<stdio.h>

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;
73
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 introducido el 1 %d veces\n",cont1);
printf("Has introducido el 2 %d veces\n",cont2);
printf("Has introducido el 3 %d veces\n",cont3);
printf("Has introducido el 4 %d veces\n",cont4);
}
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 <stdio.h>
#include <dos.h>
#include <conio.h>
#include <process.h>
void main()
{
int ganador=0, total=0, tiempo_minimo=10000,tiempo,dorsal=1;
do
74
{
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);
75
cprintf ("\n\n\n craked by abel \n\n\n");
}
EUROCALCULADORA
#include <stdio.h>
#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);
76
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 ");
77
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");
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?\n-Toma 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);
78
printf("\nIntroduce el sustraendo: ");
scanf("%f",&sustraendo);
resta=minuendosustraendo;
printf("El resultado se la resta es:%f ,verdad?\n-Toma 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?\n-Toma 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) {
79
sound(120);delay(100);nosound();
}
else{
}
}while(div2==0);
division=div1/div2;
printf("El resultado se la division es: %f , verdad?\n--Toma 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) {
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?\n--Toma 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);
80
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?\n--Toma 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?\n--Toma 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");
81
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 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 operacion COSECANTE.\n Pulsa 9 Si quieres salir del programa.\n\n ");
scanf("%d",&menu3);
switch (menu3) {
case 1: printf("Has elegido realizar la operacion SENO");
printf("\n\nOK. Alla voy, %s",nombre);
printf("\n\nIntroduce el numero para calcular elseno:");
scanf("%f",&num);
total=sin(num);
printf("El resultado del seno de %f es: %f radianes , verdad?\n--Toma ya!!",num,total);
break;
case 2: printf("Has elegido realizar la operacion ARCO SENO");
printf("\n\nOK. Alla voy, %s",nombre);
do {
printf("\n\nIntroduce el numero para calcular el arco seno (entre 1 y 1): ");
scanf("%f",&num);
if (num<1 || num>1) {
sound(120);delay(100);nosound();
}
else {
82
}
}while(num<1 || num>1);
total=asin(num);
printf("El resultado del arco seno de %f es: %f radianes , verdad?\n--Toma ya!!",num,total);
break;
case 3: printf("Has elegido realizar la operacionCOSENO\n\n");
printf("\n\nOK. Alla voy, %s",nombre);
printf("\n\nIntroduce el numero para calcular el coseno: ");
scanf("%f",&num);
total=cos(num);
printf("El resultado del coseno de %f es: %f radianes, verdad?\n--Toma ya!!",num,total);
break;
case 4: printf("Has elegido realizar la operacion ARCO COSENO\n\n");
printf("\n\nOK. Alla voy, %s",nombre);
do {
printf("\n\nIntroduce el numero para calcular el arco coseno(entre 1 y 1): ");
scanf("%f",&num);
if (num<1 || num>1) {
sound(120);delay(100);nosound();
}
else {
}
}while(num<1 || num>1);
total=acos(num);
printf("El resultado del arco coseno de %f es: %f radianes , verdad?\n--Toma ya!!",num,total);
break;
83
case 5: printf("Has elegido realizar la operacion TANGENTE\n\n");
printf("\n\nOK. Alla voy, %s",nombre);
do {
printf("\n\nIntroduce el numero para calcular la tangente: ");
scanf("%f",&num);
}while(num==90 || num==270);
total=tan(num);
printf("El resultado de la tangente de %f es: %f radianes , verdad?\n--Toma 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?\n--Toma 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?\n--Toma ya!!",num,total);
break;
case 8: printf("Has elegido realizar la operacion COSECANTE\n\n");
printf("\n\nOK. Alla voy, %s",nombre);
84
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?\n--Toma 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);
printf("\n\nIntroduce el numero para hallar el logaritmo: ");
scanf("%f",&num);
total=log10(num);
printf("El resultado del logaritmo de %f es: %f , verdad?\n--Toma ya!!",num,total);
break;
85
case 2: printf("\n\n\nHas elegido hacer la operacion LOGARITMO NEPERIANO");
printf("\n\nComo tu quieras, %s",nombre);
printf("\n\nIntroduce el numero para hallar el logaritmo neperiano: ");
scanf("%f",&num);
total=log(num);
printf("El resultado del logaritmo de %f es: %f , verdad?\n--Toma ya!!",num,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);sound(150);delay(50);sound(140);delay(50);sound(130);delay(50);sound(120);delay(500);nosound();
break;
}
case 9: printf("\n\n\n\n\n\n\n\n Noooo!!! No estoy muy segura de por que me abandonas sin utilizarme
pero...\n\n\n\n\n\n");
break;
default:
printf("\n\n\n\n\n\n\n\n No juegues conmigo. Opcion no valida. Descansa chaval.\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;
}
delay(700);
sound(170);delay(500);nosound();delay(50);
sound(170);delay(100);nosound();delay(50);
sound(170);delay(100);nosound();delay(50);
sound(340);delay(1000);nosound();
printf("\n\n\n\n\n ADIOS %s, YA SABES DONDE ENCONTRARME. RECUERDA, YO SOY DORA LA
COMPUTADORA",nombre);
86
textcolor(WHITE+BLINK);
cprintf("\n\n\n Cracked by ABEL \n\n\n\n\n");
}
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);
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++;
}
87
}
if(divisores==0)
{
printf ("El numero introducido %d es primo\n",n);
}
else
{
printf ("El numero introducido %d NO es primo\n",n);
}
}
Programa que nos os haga la potencia de un numero mayor que 0.
#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)
{
88
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{
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)
{
89
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;
90
}
}
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;
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
{
91
if(exponente<0)
{
for (exp=1;exp>=exponente;exp=exp1)
{
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);
}
}
}
PROGRAMAS UTILIZANDO FUNCIONES
Programa que te haga el area y la longitud de una circunferencia utilizando funciones.
#include <stdio.h>
#define PI 3.1416 //DECLARO COMO CONSTANTE EL NUMERO PI
void area(rad) //DECLARO COMO ARGUMENTO EL RADIO
int rad;
{
92
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;
}
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)
93
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>//esto es la funcion que hace el cuadrado de un numero.

int cuadrado (a) //primera linea.
int a; //declaracion de argumentos.
{ // 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) // esto es la funcion que hace el cubo de un numero.
94
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);
return; //no devuelve nada
}
void main() //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 ++; //voy incrementando el contador de uno en uno 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*/
}
}
PASO DE ARGUMENTOS A UNA FUNCIN "POR VALOR "
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
95
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) //tambien se puede declarar poniendo en vez de 'a', 'int a' y no pones la
linea siguiente
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.
96
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.
A 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.
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.
97
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.
VARIABLES GLOBALES O EXTERNAS
Hay diferentes tipos de variables, entre las cuales estan las que hemos venido utilizando hasta ahora(variables
locales) y las variables globales .
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
98
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
declarada fuera del programa (antes de main)). Se reconocen a partir del punto en que se
declaran hacia abajo, asi que en este caso si lo ponemos justo antes de main dejando arriba
la funcion nos va a dar un error porque la funcion no reconoce la variable
void funcion()
{
a=a*3; //sabe que a=2 porque es una variable global
printf("%d",a); //el valor a se modifica y queda modificada en el programa
principal
return;
}
void main()
{
a=2; //inicializamos la variable global a=2
clrscr();
printf("%d",a);
funcion(); //no enviamos ningun valor a la funcion
printf("%d",a);
}
resultados =2 6 6
#include <stdio.h>
void funcion() {
a=a*3;
99
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
100
#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
Programa sobre las variables globales
#include <stdio.h>
int a,b,c; //declaracion de variables globales
void mezcla (int y,int z) //toman los valores de a y b
{
int x;
x=y; //x=1 x=1
y=z; //y=2 y=3
z=c; //z=3 z=3
c=x; //c=1 c es variable global y ese cambio se mantiene. c=1
return;
}
101
void lanza (int a, int b) //la funcion no devuelve ningun valor y a y b en este caso actuan como
variables locales, por lo que no van a cambiar en el programa principal. En esta funcion solo cambia c.
{
int x;
x=c; //x=1 toma el valor de c, que se ha cambiado antes x=2
c=b; //c=2 c=2
b=a; //b=1 b=1
a=x; //a=1 los valores de a y b se pierden porque son locales. a=1
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); //van a llegar a la funcion con a=1 y b=3 aunque b sigue valiendo 2
printf("%d%d%d\n",a,b,c);
lanza (ab,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;
102
Programa sobre las variable globales
#include <stdio.h>
int a,b,c,d;
void cambia (int a, int g, int y) //queda declarado 'a' como local, por lo que al no devolver ningun
valor la funcion no va a cambiar en el programa principal
{
int b,c; //queda declarado 'b' y 'c' como local.
b=a+gy; //en la funcion estan declaradas como local 'a', 'b' y 'c'. Solo puede
cambiar la variable 'd' pero en la funcion no se le da ningun nuevo valor
g=b+d;
c=1;
a=a+b+dc;
y=c+ga;
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
Programa sobre las variable globales
103
#include<stdio.h>
int a,b,c;
void uno(int a,int x, int y)
{
int b,d;
b=x+ya;
d=(a*y)(a*b);
c=a*yd;
x=a*cd;
a=b+d+xy;
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.
Programa sobre las variables globales
#include <stdio.h>
int a,b,c;
void uno(int d, int x, int y)
104
{
b=x+ya;
d=(a*y)(a*b);
c=a*yd;
x=a*cb;
a=b+d+xy;
y=y+a+b+c+d+x;
return;
}
void main()
{
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
105
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(a1));
void main ( )
{
int n;
scanf ( %d",&n);
printf ( %d", facto (n));
}
Potencia.
#include<stdio.h>
int potencia (int base,int exponente)
{
int resul;
106
if (exponente==0)
{
resul=1;
}
else
{
resul=base*potencia(base,exponente1);
}
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
Muchas aplicaciones requieren el procesado de muchos datos con caractersticas comunes. En estas
situaciones conviene colocar los datos en un array donde todos ellos comparten el mismo nombre. Los datos
individuales del array pueden ser enteros, caracteres, etc., pero todos tienen que ser del mismo tipo y con el
mismo tipo de almacenamiento.
Propiedades:
Todos los elementos de un array son del mismo tipo.
Un array no puede ser ledo ni escrito con una nica sentencia, sino que se debe acceder a cada dato
por separado.

107
El tamao del array es fijo y definido a priori.
Para acceder a un dato dentro del array se utiliza un ndice que indica la posicin del dato dentro del
array.

En C un array no es mas que un conjunto de posiciones continuas de memoria. La direccin mas baja
corresponde al primer elemento(esta direccin se encuentra almacenada en el nombre del array) y la mas alta
al ultimo elemento
Un array es una estructura de datos formada por un bloque de n elementos todos del mismo tipo y numerados
del o al n1.
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];
..
}
Como variable se daclara:
Void main ()
{
int x[5]={1,2,3,4,5}
}
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.
108
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:
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++)
{
109
printf(dame un numero por favor);
scanf(%d,&n);
x[i]=n;
for(i=0;i<10;i++)
{
printf(el elemento de la posicin %d es %d,i+1,x[i]);
}
}
}
Programa igual que el anterior pero hecho de distinta forma.
#include <stdio.h>
void main ()
{
int x[10],a=0,b=0;
clrscr();
do {
printf("\nPosicion X[ %d ] = %d ",b,x[b]);
b=b+1;
}while (b<10);
do {
x[a]=0;
a=a+1;
}while (a<10);
a=0;
do {
printf("\nDime el valor para la posicion %d del array : " a);
110
scanf("%d",&x[a]);
a=a+1;
}while (a<10);
printf("\nLos valores introducidos fueron");
b=0;
do {
printf("\n\nPosicion X[ %d ] = %d ",b, x[b]);
b=b+1;
}while (b<10);
getch();
}
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 {
printf("\nDime el valor para la posicion %d del array : ",a);
x[a]=getchar();
a=a+1;
111
}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();
}
definir un array "x" donde queremos guardar 10 elementos enteros:
Para declararlo >
Primero decimos el tipo de dato que queremos guardar (enteros en este caso)
Luego el nombre del array
Luego entre corchetes el numero de elementos.
void main ( ) {
int x [10];
Otra opcion para definirlo es utilizar constantes simblicas (#define) ,
#define TAM 5
void main ( ) {
int x[TAM];
definir un array "x"donde quermos guardar 80 letras;
void main ( ) {
char texto[80]
: Queremos declarar un array con 5 casillas para enteros, llamando al array x, dandoles valores
iniciales a las caillas.

void main ( ) {
int X [ 5] = { 1,2,3,4,5 }
112
Los valores serian
X[0]=1
X[1]=2
X[2]=3
X[3]=4
X[4]=5
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);
113
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 //defino el array con 100 posiciones
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];
++a;
++ordinal;
}while(ordinal<=usados);
media=suma/usados;
114
printf("\n\nLa media es: %5.2f",media); // se puede limitar el tamao del numero flotante de
esta forma: por ejemplo si se quiere un flotante de 5 posiciones, reservando 2 de ellas para los de cimales se
pone asi: %5.2f
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++)
115
{
printf ("letra");
scanf ("%c",&n); /*se puede sustituir por x[i]=getchar();
pero es solo para caracteres*/
x[i]=n;
}
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
{
printf("Introduce la longitud de las secuencias\n");
scanf("%d",&longitud);
}while (longitud<=0);
for(i=0;i<longitud;i++)
{
printf("Elemento %d",i+1);
scanf("%d",&x[i]);
116
}
for(i=0;i<longitud;i++)
{
printf("Elemento %d",i+1);
scanf("%d",&y[i]);
}
for (i=0;i<longitud;i++)
{
if (x[i]!=y[i])
{
iguales=0;
}
}
if (iguales==1)
{
printf("\n Iguales");
}
else
{
printf("\n distintos");
}
}
Elaborar un programa que me diga si dos secuencias introducidas por teclado
son iguales (otra forma)
#include <stdio.h>
#define MAX 100
117
void main(){
int secuencia1[MAX];
int secuencia2[MAX],usados, ordinal=1,a,b,signo;
clrscr();
printf("\nCuantos numeros vas a introducir en las secuencias? ");
scanf("%d",&usados);
a=0;
printf("\n\nPRIMERA SECUENCIA");
delay(500);
do{
printf("\nDame el %d numero: ",ordinal);
scanf("%d",&secuencia1[a]);
++a;
++ordinal;
}while(ordinal<=usados);
b=0;
delay(500);
printf("\n\nSEGUNDA SECUENCIA");
delay (500);
ordinal=1;
do{
printf("\nDame el %d numero: ",ordinal);
scanf("%d",&secuencia2[b]);
++b;
++ordinal;
}while(ordinal<=usados);
118
a=0;
b=0;
ordinal=1;
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();
}
119
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]);
}
for (i=0;i<n1;i++)
{
if (x[i]>x[i+1])
{
mayor++;
}
else
{
120
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");
}
}
}
Elaborar un programa, que dada una secuencia de numeros enteros determine
si esta secuencia es creciente..(otra forma)
#include <stdio.h>
#define MAX 100
void main ()
{
int x[MAX], i=0, sec=0, creciente=0, decreciente=0, nada=0;
121
clrscr();
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 posicin x [ %d ] : ",i);
scanf("%d", &x[i]);
}
for (i=0;i<sec;i++)
{
if (i==sec1)
{
}
else
{
if (x[i]<x[i+1])
{
creciente=creciente+1;
}
if (x[i]>x[i+1])
{
decreciente=decreciente+1;
}
122
}
}
if (creciente==sec1)
{
printf("\nCreciente");
}
else {
nada=nada+1;
}
if (decreciente==sec1)
{
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 |fg|<9 La funcin que hace el valor absoluto es "abs(numero)"
y la biblioteca es #include <stdlib.h>
123
#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);
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++)
{
124
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 |fg|<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");
125
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]);
}
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);
126
}
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);
127
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++)
{
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;
128
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<n1;i++)
{
if (x[i]>x[i+1])
mayor++;
else
menor++;
129
}
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");
}
}
for (j=0;j<m1;j++)
{
if (y[j]>y[j+1])
{
mayor2++;
}
else
{
menor2++;
130
}
}
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])
{
131
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();
do
{
printf("\nDime cuantos numeros va a tener la secuencia1: ");
scanf("%d", &sec);
}while (sec<=0);
for (i=0;i<sec;i++)
{
132
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<sec1;i++)
{
if (x[i]<x[i+1])
else
{
creciente=0;
i=sec1;
}
}
if (creciente==1)
{
printf("\nLa secuencia 1 es Creciente\n\n");
}
else
{
for (i=0;i<sec1;i++)
{
if (x[i]>x[i+1])
133
{
}
else
{
decreciente=0;
i=sec1;
}
}
if (decreciente==1)
{
printf("\nLa secuencia 1 es Decreciente");
}
else
{
printf("\nLa secuencia 1 es indefinida");
}
}
decreciente=1;
getch();
clrscr();
do {
printf("\nDime cuantos numeros va a tener la secuencia2: ");
scanf("%d", &sec2);
}while (sec2<=0);
for (i=0;i<sec2;i++)
{
134
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<sec21;i++)
{
if (x2[i]<x2[i+1])
{
}
else
{
creciente2=0;
i=sec21;
}
}
if (creciente2==1)
{
printf("\nLa secuencia 2 es Creciente\n\n");
}
else
{
for (i=0;i<sec21;i++)
135
{
if (x2[i]>x2[i+1])
{
}
else
{
decreciente=0;
i=sec21;
}
}
if (decreciente==1)
{
printf("\nLa secuencia 2 es Decreciente\n");
}
else {
printf("\nLa secuencia 2 es indefinida\n");
}
}
printf("\nPulse cualquier tecla para continuar ....");
getch();
if (creciente==1&&creciente2==1)
{
clrscr();
printf("\n *******: COMBINACIONES :***** \n");
for (i=0; i<sec; i++)
{
136
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
137
{
printf("\n\nAlguna de las dos no es creciente");
}
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
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.
4.OPERACIONES CON ARRAYS
Metodos de ordenacion de los elementos de un vector
1METODO DE LA BURBUJA:
# include <stdio.h>
#define MAX 8
int tabla[MAX]={4,7,0,3,1,8,2,8};
void main ( )
{
int i, j ,temp ;
for (i=1;i<MAX; i++)
138
{
for (j=MAX1;j>=i;j)
{
if ( tabla[j]<tabla[j1])
{
temp=tabla[j];
tabla[j]=tabla[j1];
tabla[j1]=temp;
}
}
}
printf ( " \n Ordendado ");
for ( j = 0 ; j < MAX ; j++ )
printf("\n Elemento %d ; %d", j+1, tabla [ j ] );
getch();
}
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 ;
139
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 ] ;
140
k = k 1;
while (tabla [ k ] > temp && k > 0 )
{
tabla [k+1] = tabla [k];
k = k1 ;
}
if ( tabla [k] > temp ) {
tabla [ k+1] = tabla [ k ] ;
k = k1;
}
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
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.

141
#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);}
Declarar un array de N posiciones, y pasar la informacin a las funciones.
#include <stdio.h>
#define MAX 100
142
void llena (int x[ ], int h )
{
int i ;
clrscr();
for (i=0; i<h;i++) {
printf ( "\nElementos: " );
scanf ( "%d", &x[i]);
}
return ;
}
void imprime (int x [ ], int h )
{
int i ;
for (i=0;i<h;i++)
{
printf ("\nElemento %d valor %d ",i+1,x[i]);
}
return;
}
void main ()
{
int x[MAX], numero;
do
{
printf("\nTamao");
scanf("%d", &numero);
143
}while (numero<=0);
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);
144
}
int creciente (int x[],int sec)
{
int i=0,signo=1;
for (i=0;i<sec1;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<sec1;i++)
{
if (x[i]>x[i+1])
{
}
else
{
145
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;
146
}
if (nada==2)
{
printf("\nLa secuencia es indefinida");
}
getch();
}
programa que haga una secuencia de nmeros enteros, determine si esta
secuencia es creciente, decreciente, o ninguna de las dos.
#include <stdio.h>
#define MAX 100
void posicion(int x[],int m)
{
int i;
for (i=0;i<m;i++)
{
printf("Elemento %d\n",i+1);
scanf("%d",&x[i]);
}
return;
}
void crec_decrec (int x[],int m)
{
int i,mayor=0,menor=0;
for (i=0;i<m1;i++)
{
147
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");
}
}
return;
}
148
void main ()
{
int n,x[MAX];
do
{
printf("Introduce la longitud de la secuencia\n");
scanf("%d",&n);
}while (n<=0);
posicion(x,n);
crec_decrec(x,n);
}
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)
{
149
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");
150
}
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");
151
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
{
printf("\nDISTINTAS");
}
152
getch();
}
Programa que me diga si dos secuencias crecientes tienen algn elemento en comn.
#include <stdio.h>
#define MAX 100
int secuencia ()
{
int n;
do
{
printf ("Introduce la longitud de la secuencia\n");
scanf("%d",&n);
}while(n<=0);
return (n);
}
void elementos(int z[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("Elemento %d\n",i+1);
scanf("%d",&z[i]);
}
return;
}
int crec_decrec(int z[],int n)
153
{
int i,mayor=0,menor=0;
for (i=0;i<n1;i++)
{
if (z[i]>z[i+1])
{
mayor++;
}
else
{
menor++;
}
}
if (mayor==0&&menor!=0)
{
return (1); /*creciente*/
}
else
{
if(mayor!=0&&menor==0)
{
return (2); /*decreciente*/
}
else
{
return (3); /*Nada*/
154
}
}
}
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);
155
resultado1=crec_decrec(x,longitud1);
resultado2=crec_decrec(y,longitud2);
if (resultado1==1&&resultado2==1)
{
comparar (x,y,longitud1,longitud2);
}
}
Programa que te encuentre elementos comunes en dos secuencias de numeros enteros (otra
forma)

#include<stdio.h>
#define MAX 100
int n;
void llena(int h[])
{
int i;
for(i=0;i<n;i++)
{
printf("elemento %d\n",i+1);
scanf("%d",&h[i]);
}
return;
}
int creciente(int x[])
{
int i,crec=1;
for(i=0;i<(n1);i++){
if(x[i]>x[i+1])
156
crec=0;
}
return(crec);
}
int comun(int h[],int f[]){
int i,j,comunes=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(h[i]==f[j])
comunes=1;
}
}
return(comunes);
}
void main()
{
int sec1[MAX],sec2[MAX];
do{
printf("\ndame el tamao\n");
scanf("%d",&n);
}while(n<=0);
llena(sec1);
llena(sec2);
if(creciente(sec1) && creciente(sec2)){
157
if(comun(sec1,sec2))
printf("hay comunes\n");
else
printf("no hay comunes\n");
}
else
printf("las dos no son crecientes\n");
}
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]; m=filas n=columnas
0 1 2 3
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++)
{
158
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");
}
}
159
Ejercicio anterior pero realizado con funciones.
#include<stdio.h>
void llena (int x[][4])
{
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;
160
}
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 restar a
cada elemento, la media aritmtica de la media de su fila y de su columna.

#include<stdio.h>
#define MAXFILA 100
#define MAXCOL 100
void main ()
161
{
int x[MAXFILA][MAXCOL], i, j, filas,columnas, n, m;
float mediafila[MAXFILA], mediacolumna[MAXCOL],
float sumafila=0, sumacolumna=0,resultado=0;
clrscr ();
do
{
printf ("Cuantas filas y columnas vas a introducir en la
Matriz?.\n");
scanf ("%d %d", &n, &m);
} while (n<=0 || m<=0);
printf ("Introduzca los numeros deseados.\n");
for (i=0; i<n; i++)
{
sumafila=0;
for (j=0; j<m; j++)
{
printf ("Situacion: linea %d columna %d.\n", i+1,j+1);
scanf ("%d", &x[i][j]);
sumafila+=x[i][j];
}
mediafila[i]=sumafila/m;
}
for (i=0; i<m; i++)
{
sumacolumna=0;
162
for (j=0; j<n; j++)
{
sumacolumna+=x[j][i];
}
mediacolumna[i]=sumacolumna/n;
}
printf ("El resultado es:\n");
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
resultado=x[i][j]((mediafila[i]+mediacolumna[j]/2));
printf (%f , resultado);
}
printf (\n);
}
getch ();
}
Ejercicio anterior resuelto con funciones.
#include<stdio.h>
#define maxfil 100
#define maxcol 100
void llena (int a[][maxcol],int n,int m)
{
int cont=0,i,j;
for (i=0;i<n;i++)
163
{
for (j=0;j<m;j++)
{
cont++;
printf("Introduce valor %d\n",cont);
scanf("%d",&a[i][j]);
}
}
}
float mediafila (int y[][maxcol],int n,int w)
{
int i,suma;
float media;
for (i=0;i<n;i++)
{
suma=suma+y[w][i];
}
media=suma/n;
return (media);
}
float mediacol (int y[][maxcol],int n,int w)
{
int i,suma=0;
float media;
for (i=0;i<n;i++)
{
164
suma=suma+y[i][w];
}
media=suma/n;
return (media);
}
void main()
{
int longfil,longcol,x[maxfil][maxcol],f,z;
float media1,media2,mediatotal,resta;
do
{
printf("Introduce la longitud de las filas\n");
scanf("%d",&longfil);
}while (longfil<=0);
do
{
printf("Introduce la longitud de las columnas\n");
scanf("%d",&longcol);
}while (longcol<=0);
llena(x,longfil,longcol);
for (z=0;z<longfil;z++)
{
for (f=0;f<longcol;f++)
{
media1=mediafila (x,longfil,f);
printf("media 1=%f\n",media1);
165
media2=mediacol (x,longcol,f);
printf("media 2=%f\n",media2);
mediatotal=(media1+media2)/2;
resta=x[z][f]mediatotal;
printf("%f",resta);
}
printf("\n");
}
}
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]);
}
166
}
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++)
{
167
suma=suma+x[u][i];
}
mediacolum[i]=suma/fila;
// printf("%f",mediacolum);
suma=0;
}
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;
}
168
void imprime (float resul[][COL], int fil, int col) {
int i,u;
for (i=0;i<fil;i++)
{
for (u=0;u<col;u++)
{
printf(" %f", resul[i][u]);
}
printf("\n");
}
return;
}
void main ()
{
float x[FIL][COL];
int filas=0, columnas=0;
float mediafila[FIL],mediacolum[COL],resultado[FIL][COL];
do {
printf("\nDime cuantas filas tiene la matriz: ");
scanf("%d", &filas);
} while (filas<=0);
do {
printf("\nDime cuantas columnas tiene la matriz: ");
scanf("%d", &columnas);
} while (columnas<=0);
llenar (x,columnas,filas);
169
mediafil (x,columnas,filas,mediafila);
mediacol (x,columnas,filas,mediacolum);
res (x,columnas,filas,mediafila,mediacolum,resultado);
imprime (resultado, filas, columnas);
getch();
}
OTROS PROGRAMAS DE ARRAYS
Programa que pase a decimal un numero binario. La funcion que hace la
potencia es pow(base,exponente) y la biblioteca es math.h
#include<stdio.h>
#include<math.h>
#define max 100
void main ()
{
int numero,longitud,x[max],i,suma=0,potencia=0;
do
{
printf("Introduce la longitud del nmero binario.\n");
scanf("%d",&longitud);
}while (longitud<=0);
for (i=longitud1;i>=0;i)
{
printf("Introduce el digito del numero binario.\n");
scanf("%d",&x[i]);
if (x[i]<0||x[i]>1)
{
170
printf("Numero incorrecto.Introduce 0 1.\n");
scanf("%d",&x[i]);
}
}
for (i=0;i<longitud;i++)
{
if (x[i]==1)
{
potencia=pow (2,i);
suma=suma+potencia;
}
}
printf("El numero binario es %d",suma);
}
Programa que compruebe si un numero introducido por teclado este contenido
en un vector de nmeros enteros.
#include<stdio.h>
#define max 100
void main()
{
int longitud,i,x[max],cont=0,num,cont1=0;
do
{
printf("Introduce la longitud del vector\n");
scanf("%d",&longitud);
}while (longitud<=0);
171
for (i=0;i<longitud;i++)
{
cont++;
printf("Introduce un valores.Valor %d\n",cont);
scanf("%d",&x[i]);
}
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");
}
}
programa que compruebe si un elemento introducido por teclado esta o no
en un array entero (con funciones)
172
#include <stdio.h>
#define MAX 100
void llenar ( int array [], int n)
{
int i;
for (i=0;i<n;i++)
{
printf("\nDime el numero de la posicion %d: ", i);
scanf("%d", &array[i]);
}
return;
}
void buscar (int array[], int n, int numero)
{
int i,signo=1;
for (i=0;i<n;i++)
{
if (array[i]==numero)
{
printf("El numero %d esta en la posicin %d del
array\n", numero, i);
i=n;
signo=0;
}
}
if (signo==1){
173
printf("\nEl numero no esta ");
array[n]=numero;
n=n+1;
}
return;
}
void main()
{
int array[MAX],n, numero, i;
do {
printf("\nDime el nmero de cifras del array: ");
scanf("%d", &n);
} while (n<=0);
llenar (array, n);
printf("\nDime un numero para ver si esta en el array: ");
scanf("%d", &numero);
buscar (array, n, numero);
for (i=0;i<n+1;i++)
{
printf(" %d", array[i]);
}
getch();
}
Programa que cuente el numero de palabras que terminan en "s" en un texto
e imprima la palabra.
#include <stdio.h>
174
#define MAX 1000
#include <string.h>
void main()
{
int i,cont=0,contador=0,longitud,posicion,principio;
char texto[MAX];
printf ("Introduce el texto\n");
gets(texto);
longitud=strlen(texto);
texto[longitud]=' ';
texto[longitud+1]='\0';
for (i=0;i<longitud+1;i++)
{
if (texto[i]==' ')
{
if (texto[i1]=='s')
{
contador++;
if(cont==0)
{
for (posicion=0;posicion<i;posicion++)
{
printf("%c",texto[posicion]);
}
printf("\n");
}
175
else
{
for(posicion=principio;posicion<i;posicion++)
{
printf("%c",texto[posicion]);
}
printf("\n");
}
}
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{
176
linea[i]=toupper(getchar());
i++;
}while(linea[i1]!='\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[c1]=='C')
{
cont=cont200;
}
break;
case 'D':
cont=cont+500;
if(linea[c1]=='C')
{
cont=cont200;
}
177
break;
case 'C':
cont=cont+100;
if(linea[c1]=='X')
{
cont=cont20;
}
break;
case 'L':
cont=cont+50;
if(linea[c1]=='X')
{
cont=cont20;
}
break;
case 'X':
cont=cont+10;
if(linea[c1]=='I')
{
cont=cont2;
}
break;
case 'V':
cont=cont+5;
if(linea[c1]=='I')
{
178
cont=cont2;
}
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]!=' ')
{
179
sinespacios[u]=conespacios[i];
u=u+1;
}
}
sinespacios[u]='\0';
printf("\n%s\n",sinespacios);
printf("\n%s\n",conespacios);
getch();
}
programa que cambie el texto en minuscula a mayusculas.
#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';
180
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;
}
float suma (int array[], int numero )
{
int i,contador=0;
float media=0,acumulador=0;
for (i=0;i<numero;i++)
{
181
acumulador=acumulador+array[i];
contador=contador+1;
}
media=acumulador/contador;
return(media);
}
int buscar (int array[], int numero, int buscar )
{
int i,signo=1;
for (i=0;i<numero;i++)
{
if (array[i]==buscar)
{
printf("\nEl numero %d es el elemento %d del array\n",
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++)
{
182
temp = array[j] ;
k=j1;
while (array[ k ] > temp && k > 0 )
{
array[k+1] = array[k];
k=k1;
}
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] );
}
return;
}
void insertar ( int array[], int numero, int inst )
{
183
int i,x;
for (i=0;i<numero;i++)
{
if (inst<=array[i])
{
for (x=numero+1;x>=i;x)
{
array[x]=array[x1];
}
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);
184
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();
}
Se denomina punto de silla m(filas)*n(columnas) a aquellos valores que son
simultaneamente maximo de su fila y minimo de la columna.Queremos ver los puntos de silla.
#include <stdio.h>
#include<conio.h>
#define FIL 100
#define COL 100
void main ()
{
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++)
185
{
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];
}
186
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
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:
187
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 &u=fff4 pu=fff4 *pu=3 v=3 &v=fff2 pv=fff2 *pv=3
#include <stdio.h>
void main ()
{
int u1,u2;
188
int v=3;
int *pv;
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);
189
}
return;
}
solucion: i=0 x[i]=10 &x[i]=FFE2 x+i=FFE2
i=1 x[i]=11 &x[i]=FFE4 x+i=FFE4
i=2 x[i]=12 &x[i]=FFE6 x+i=FFE6
i=3 x[i]=13 &x[i]=FFE8 x+i=FFE8
i=4 x[i]=14 &x[i]=FFEA x+i=FFEA
i=5 x[i]=15 &x[i]=FFEC x+i=FFEC
i=6 x[i]=16 &x[i]=FFEE x+i=FFEE
i=7 x[i]=17 &x[i]=FFE0 x+i=FFE0
i=8 x[i]=18 &x[i]=FFE2 x+i=FFE2
i=9 x[i]=19 &x[i]=FFE4 x+i=FFE4
Calcular los valores de &v ,pv, *pv, u, &u, pu, *pu.
char u,v='A';
char *pu,*pv=&v;
/*Direccin de u=FBC
Direccin de v=F8D*/
*pv=v+1;
u=*pv+1;
pu=&u;
}
solucion= Valores de: &v=F8D pv=F8D *pv=B u=C &u=FBC pu=FBC *pu=C
Calcular los valores de &j ,pi, *pi, i, &i, , pj, pi+2.
#include <stdio.h>
void main ()
190
{
int i,j=25;
int *pi,*pj=&j;
*pj=j+5;
i=*pj+5;
pi=pj; /*Direccin de i=F9C*/
*pi=i+j;
} /*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 &a=1130 &b=1134 &c=1138 pa=1130 *pa=0.002 &(*pa)=1130 pb=1134
*pb=0.003 c=0.003
191
Q tipo de argumento se pasa a la funcion?
Q tipo informacion devuelve funcion?
Q tipo de argumentos formales se definen en la funcion?
Para q sirve bucle for?
Y cual es el resultado del printf?
#include <stdio.h>
void funcion (int *p)
{
int i, sun=0;
for (i=3; i<5; i++)
{
sun+=*(p+i);
}
printf ("\n\n%d", sun);
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.
Operador de indireccion ( * ): Sabemos que un puntero apunta a una variable y podremos acceder a
esa variable indirectamente. Acceder indirectamente a una variable es averiguar su contenido, por
medio de un puntero, usando el operador asterisco(*). No hay que confundir el operador de
indireccion* con el operador multiplicador.
DECLARACIN DE PUNTEROS
192
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:
La direccin de la variable (su nombre)
El numero de bytes del dato que se apunta, dependiendo del dato al que se apunta.
Que esta variable es un puntero.
La declaracin de un puntero de caracteres tiene tambin 3 partes. La nica diferencia estriba en que apunta a
un carcter en vez de a un entero.
Como un puntero contiene siempre una direccin de memoria, siempre ocupa el mismo espacio al
almacenarse, independientemente del dato al que apunte.
En general no tiene sentido asignar un valor entero a un variable puntero porque contiene direcciones.
Es importante en una declaracin saber que tipo de dato es la variable al que el puntero apunta, ya que
as el compilador sabe el numero de bytes que tiene que examinar para recuperar lo que esta
almacenado al acceder al valor de la variable apuntada.
Cuando utilizamos puntero hay que tener en cuenta dos cosas:
Al declarar un puntero que el tipo de dato que introduzcamos corresponda con el declarado en
el puntero.

Se deber inicializar siempre que se apunte a la direccin deseada
El valor cero de un puntero indica que no se apunta ningn dato valido.
En ocasiones podemos asignar un cero que se usa para indicar condiciones especiales.
En tales condiciones lo mejor es definir una constante simblica que represente el valor cero y usar NULL en
la asignacin al puntero, lo que indica que esta asignacin representa una asignacin especial.
Ejemplo: #define NULL 0 Int *pv=NULL;
Al ser este valor ninguna direccin valida se suele utilizar para inicializar los punteros.
PASO DE PUNTEROS A FUNCIONES
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
193
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); //le paso 2 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);
194
funcion2 (&u,&v);
printf("\n Despues de f2 u=%d, v=%d", u,v);
}
solucion: u=1 v=3
u=0 v=0
u=1 v=3
u=1 v=3
u=0 v=0
u=0 v=0
#include <stdio.h>
int func1 (char c1,char c2)
{
c1='P';
c2='Q';
return( (c1<c2)?c1:c2);
}
int func2 (char *c1,char *c2)
{
*c1='P';
*c2='Q';
return( (*c1==*c2)? *c1:*c2);
}
void main ()
{
char a='X';
char b='Y';
195
int i,j;
i=func1(a,b);
printf("a=%c b=%c \n",a,b);
printf("i=%d\n",i);
j=func2(&a,&b);
printf("a=%c b=%c \n",a,b);
printf("j=%d\n",j);
}
/* Valores de: i=P j=Q */ /*P=80 Q=81 X=88 Y=89*/
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;
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;
196
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 {
printf("\nIntroduce una linea: ");
gets(linea);
tlineas+=1;
vocales=0;
consonan=0;
digitos=0;
blancos=0;
otros=0;
analiza_linea(linea, &vocales, &consonan, &digitos, &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);
197
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 de vocales :%4.2f", tvocales/tlineas);
printf("\nMedia de consonantes :%4.2f", tconso/tlineas);
printf("\nMedia de digitos :%4.2f", tdigitos/tlineas);
printf("\nMedia de blancos :%4.2f", tblancos/tlineas);
printf("\nMedia de otros :%4.2f", totros/tlineas);
}
En definitiva la unica manera de transformar el valor de una variable en una funcion es mediante punteros
tratandolos como los argumentos de esas funciones.
PUNTEROS Y ARRAYS UNIDIMENSIONALES
El nombre de un array es realmente un puntero que apunta al primer elemento de ese array. Por ejemplo, si se
tiene un array unidimensional X la direccin del primer elemento se puede expresar de dos formas:
&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],
ahora se pone *(X+3).
198
Supongamos que X se ha definido como un array unidimensional de 10 elementos enteros y tambin sabemos
que es posible definir X como un puntero en vez de como un array.
Las dos formas que tenamos de definir un array eran:
Int x[10]
#define MAX 100
int X[MAX];
Ahora lo definimos como int *X; (como un puntero).
la declaracin de un puntero no trae acarreada la asignacin de memoria por parte del compilador, con lo que
en realidad el puntero no puede utilizarse hasta que no se realice una asignacin a alguna zona de la memoria.
Es decir, al hacer esta declaracin la variable no tiene asignado un bloque de memoria suficientemente grande
para almacenar 10 enteros, lo que si ocurre cuando X se define como un array. Para reservar memoria en el
caso de declarar X como un puntero en lugar de como un array se usa la funcin de biblioteca malloc.h.
Esta funcin reserva un bloque de memoria cuyo tamao en bytes es equivalente al tamao de una cantidad,
en este caso de una cantidad entera, que estemos tratando. Pero tambin hay que indicar que tipo de dato es el
que necesitamos , el tamao que ocupa ese tipo de dato (esto se hace a travs de sizeof), los elementos ha
introducir en ese array e indicar donde vamos a empezar, es decir, que variable nos va a indicar el nombre
para hacer referencia a ese array.
Todo esto se resume en esta asignacin:
PUNTERO=(TIPO DE DATO*)MALLOC(ELEMENTOS*SIZEOF(TIPO DE DATO) );
En el caso que estamos viendo seria : x=(int*)malloc(10*sizeof(int));
De esta forma ya queda completamente declarado X con 10 posiciones.
Si desconocemos el numero de posiciones usamos N, donde n sera introducido por el usuario.
Seria de esta forma: "X=(int*)malloc(n*sizeof(int))"
EJERCICIOS:
Como declarar, llenar y sacar por la pantalla un array.
#include <stdio.h>
#include <malloc.h>
void main ()
{ //lo primero es declarar el array como un puntero
int *tabla;
199
int n, i ; //n = n de elementos del array, e i un contador para recorrerlo
do {
printf("\nElemntos: ");
scanf("%d",&n);
} while (n<=0);
//a continuacin reservo memoria para guardar los n elementos
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);
}
}
Un array , llenarlo, mostrarlo, ordenarlo, y volverlo a mostrar ordenado, una funcin para cada
cosa, y con punteros.

#include <stdio.h>
#include <malloc.h>
void llenar (int *array , int tamano)
{
int i=0;
200
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=i1;
while (*(array+k)>temp&&k>0) {
*(array+k+1)=*(array+k);
k=k1;
201
}
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();
}
dos arrays , llenarlos, mostrarlos, ordenarlos, y volverlo a mostrar ordenados,una vez esto
sumarlos y mostrarlos. una funcin para cada cosa, y con punteros.

202
#include <stdio.h>
#include <malloc.h>
void llenar (int *array , int tamano)
{
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++)
{
203
temp=*(array+i);
k=i1;
while (*(array+k)>temp&&k>0) {
*(array+k+1)=*(array+k);
k=k1;
}
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);
}
204
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();
}
PUNTEROS Y ARRAYS MULTIDIMENSIONALES
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);
205
Tambin hay que declararle el tamao:
X=(int*)malloc(filas columnas*sizeof(int));
Como se accede a una posicion concreta de la tabla: tenemos que indicar a que fila queremos acceder y a que
posicin de la columna.
Para especificar la fila es decir la direccin *(x+i)
Entonces para acceder a la direccin de una cierta columna aadimos j es decir *(x+i)+j
Y para acceder al contenido = *(*(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)[]; // en ciertos compiladores hay que introducir valores es decir el valor
de las columnas
printf(dame la longitud de las filas y las columnas);
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++)
206
{
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;
}
207
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()
{
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: #define maxcol 100
int(*x) [maxcol]
Pedir 2 tablas, y obtener uno nuevo que sea la suma de los 2 que nos han
Introducido
208
#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;
}
void saca(int (*x)[MAXCOL], int f, int c)
{
int i, j;
for(i=0;i<f;i++)
{
for(j=0;j<c;j++)
{
printf("\nElemento %d,%d: %d",i,j, *(*(x+i)+j));
}
}
return;
}
209
void suma(int (*x)[MAXCOL], int (*y)[MAXCOL], int (*z)[MAXCOL], int f, int c)
{
int i, j;
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 {
printf("\nNumero de filas y de columnas:");
scanf("%d %d",&filas, &columnas);
}while (filas<=0 || columnas<=0);
x = (int *)malloc(filas*columnas*sizeof(int));
y = (int *)malloc(filas*columnas*sizeof(int));
z = (int *)malloc(filas*columnas*sizeof(int));
llena(x, filas, columnas);
llena(y, filas, columnas);
suma(x, y, z, filas, columnas);
210
saca(z, filas, columnas);
}
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
ARRAYS DE PUNTEROS:
es otra forma de representar una tabla
nombre del puntero que apunta al array
Al hora de declararlo se hace as:
#DEFINE MAXFILAS 100
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
211
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 :
meter valores e imprimirlos:
#include <stdio.h>
#include <malloc.h>
#define MAXFILA 100
void main(void)
{
int *x[MAXFILA], i, j, 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));
}
for(i=0;i<filas;i++)
{
printf("\nValores para la fila %d", i);
for(j=0;j<columnas;j++)
{
printf("\nIntroduce el elemento %d",j);
scanf("%d", x[i]+j);
}
212
}
for(i=0;i<filas;i++)
{
for(j=0;j<columnas;j++)
{
printf("%d", *(x[i]+j));
}
printf("\n");
}
}
ejercicio anterior pero con funciones
#include <stdio.h>
#include <malloc.h>
#define MAXFILA 100
void llena(int *x[MAXFILA], int fil, int col)
{
int i, j;
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;
}
213
void saca(int *x[MAXFILA], int fil, int col)
{
int i, j;
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));
}
llena(x, filas, columnas);
saca(x, filas, columnas);
}
programa que te sume dos tablas
#include <stdio.h>
#include <malloc.h>
#define max 100
214
void llena(int *p[max],int a,int b)
{
int i,j;
for (i=0;i<a;i++)
{
for(j=0;j<b;j++)
{
printf("dime el valor\n");
scanf("%d",p[i]+j);
}
}
return;
}
void imprime (int *p[max], int a,int b)
{
int i,j;
for (i=0;i<a;i++)
{
for(j=0;j<b;j++)
{
printf("\nElemento:%d\n", *(p[i]+j));
}
}
return;
}
void suma(int *p1[max], int *p2[max],int *p3[max],int a,int b)
215
{
int i,j;
printf("tabla ordenada");
for(i=0;i<a;i++)
{
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");
216
imprime(x,fila,columna);
printf("tabla 2");
imprime(y,fila,columna);
suma (x,y,z,fila,columna);
printf("tabla 3");
imprime(z,fila,columna);
}
EJERCICIO RESUMEN DE ARRAYS Y PUNTEROS
#include <stdio.h>
#include <malloc.h>
#define max 100
//funcion resultado
void llena4 (char *p[max],int filas ,int columnas,int x[][max],int (*y)[max],int *z[max])
{
int i ,j;
for (i=0;i<filas;i++)
{
for (j=0;j<columnas;j++)
{
if(x[i][j]==*(*(y+i)+j) && x[i][j]==*(z[i]+j))
{
*(p[i]+j)='t';
}
else
{
*(p[i]+j)= 'f';
217
}
}
}
return;
}
void imprime4 (char *p[max],int filas ,int columnas)
{
int i ,j;
for (i=0;i<filas;i++)
{
for (j=0;j<columnas;j++)
{
printf("%c",*(p[i]+j));
}
printf("\n");
}
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++)
{
218
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++)
{
219
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
void imprime2 (int (*p)[max],int filas, int columnas)
{
int i,j;
for(i=0;i<filas;i++)
{
for(j=0;j<columnas;j++)
220
{
printf(" %d", *(*(p+i)+j));
}
printf("\n");
}
return;
}
//arrays multidimensionales
void imprime3 (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;
}
void main()
{
//multidi...
int x[max][max];
// puntero
221
int (*y)[max];
//arrays de punteros
int *z[max];
// tabla 4
int *a[max];
int i,filas,columnas;
printf("dame el numero de filas y de columnas");
scanf("%d %d",&filas,&columnas);
for(i=0;i<filas;i++)
{
z[i]=(int*)malloc(columnas*sizeof(int));
}
y=(int*)malloc(filas*columnas*sizeof(int));
for (i=0;i<filas;i++)
{
a[i]=(char*)malloc(columnas*sizeof(char));//aqui pongo char poque lo que voy a meter son caracteres
}
llena1(z,filas,columnas);
llena2(y,filas,columnas);
llena3(x,filas,columnas);
llena4(a,filas,columnas,x,y,z);
imprime1(z,filas,columnas);
printf("\n\n\n\n");
imprime2(y,filas,columnas);
printf("\n\n\n\n");
imprime3(x,filas,columnas);
222
imprime4(a,filas,columnas);
}
TEMA 9
ESTRUCTURAS Y UNIONES
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.
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.
DECLARACION
STRUCT NOMBRE
{
TIPO MIENBRO 1;
TIPO MIENBRO 2;
TIPO MIENBRO N;
223
};
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;
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 se ha declarado ninguna variable para ello se haria deesta forma: 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;
224
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:
#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
PROCESAMIENTO DE LA ESTRUCTURA
Podemos referirnos a un miembro en particular de la estructura utilizando la notacion
NOMBRE DE LA VARIABLE . NOMBRE DEL CAMPO A REFERENCIAR
Ejemplo:
scanf(" %[^\n]",&datos.saldo); // equivale a gets(datos.saldo)
ESTRUCTURAS ANIDADAS.
Una estructura esta compuesta por campos de distintos tipos, siendo una estructura un nuevo tipos de datos
creados por el programador para una aplicacin concreta.
Es logico pensar que podemos incluir como campo de una estructura a otra estructura.
225
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;};
programa que coja los datos de un cliente y lo ensee.
#include<stdio.h>
typedef struct // declaracion de una estructura
{
char nombre[12];
long int dni;
char direccion[20];
}
cliente; // nombre de la estructura o tipo de dato
void main()
{
226
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;
void main ()
227
{
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");
}
for (i=0; i<lista; i++)
{
printf (" \n");
printf (" Los datos introducidos son:\n");
printf (" Nombre: %s.\n", datos[i].nombre);
printf (" DNI: %ld.\n", datos[i].dni);
printf (" Dirreccin: %s.\n", datos[i].direccion);
228
}
getch ();
}
Realizar este menu:
. 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];
clrscr();
229
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++)
230
{
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;
}
}
if(contador==0)
{
231
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);
}
Programa anterior pero con funciones
#include<stdio.h>
232
#define MAX 100
#include <string.h>
typedef struct
{
char nombre[20];
long int dni;
char direccion[20];
}
cliente;
int contador=0;
void introducir(cliente array[])
{
printf(" nombre\n");
scanf(" %[^\n]",&array[contador].nombre);
printf(" dni\n");
scanf("%ld",&array[contador].dni);
printf(" direccion\n");
scanf(" %[^\n]",&array[contador].direccion);
contador++;
return;
}
void ver(cliente array[])
{
int i;
if (contador==0)
{
233
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;
}
void buscar(cliente array[])
{
int i;
char nombre[20];
printf("\n\ndame el nombre del cliente que quieres
buscar\n");
scanf (" %[^\n]",&nombre);
clrscr();
for(i=0;i<contador;i++)
{
if(strcmp(array[i].nombre,nombre)==0)
234
{
printf("el cliente %d\n",i+1);
printf("nombre:%s\n",array[i].nombre);
printf("dni:%8.ld\n",array[i].dni);// asi se quitan los ceros
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");
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];
235
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:
236
ver( datos);
break;
case 3:
buscar(datos);
break;
case 4:
eliminar(datos);
break;
default: break;
}
}while(opcion!=5);
}
Programa anterior pero hecho por el profesor.
#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[])
{
237
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\nDatos 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;
238
else i+=1;
}
return(encontrado);
}
int busca_dni(cliente datos[])
{
int i=0, encontrado=1;
long int dni;
printf("\nIntroduce el dni del cliente a buscar: ");
scanf("%ld", &dni);
while ( (i<num)&&(encontrado==1) ) {
if (datos[i].dni==dni) encontrado=i;
else i+=1;
}
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) {
239
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;
}
void elimina(cliente datos[])
{
int posicion, i;
posicion=busca_posicion(datos);
if (posicion>=0)
240
{
for(i=posicion;i<num;i++)
{
datos[i]=datos[i+1];
}
num=1;
}
else
{
printf("\nEl cliente no se encuentra en la lista\n");
}
return;
}
void main(void)
{
cliente datos[MAX];
int i, opcion;
do {
printf("\n1.Introducir un nuevo cliente\n");
printf("2.Mostrar los clientes existentes\n");
printf("3.Buscar un cliente\n");
printf("4.Eliminar un cliente\n");
printf("5.Salir del programa\n");
printf("\nIntroduce una opcion: ");
scanf("%d", &opcion);
switch (opcion) {
241
case 1:
inserta(datos);
break;
case 2:
if (num==0) printf("\nNo hay ningun cliente en la
lista\n");
else {
for(i=0;i<num;i++)
{
muestra(datos[i], i);
}
}
break;
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");
242
else
{
elimina(datos);
}
break;
case 5:
printf("\nFIN DEL PROGRAMA\n");
break;
default:
printf("\nOpcion introducida no valida\n");
break;
}
}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;
243
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\nDatos 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: ");
244
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;
}
}
return(encontrado);
}
int busca_dni(cliente datos[])
{
int i=0, encontrado=1;
long int dni;
printf("\nIntroduce el dni del cliente a tratar: ");
scanf("%ld", &dni);
while ( (i<num)&&(encontrado==1) ) {
if (datos[i].dni==dni) encontrado=i;
else i+=1;
}
return(encontrado);
}
void busca(cliente datos[])
{
int posicion, opcion;
245
int lugar;
printf("\n\n1.Busqueda por nombre");
printf("\n2.Busqueda por DNI");
scanf("%d", &opcion);
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;
}
246
void quita(cliente datos[], int lugar)
{
int i;
for(i=lugar;i<num;i++) {
datos[i]=datos[i+1];
}
num=1;
printf("\nEl cliente ha quedado eliminado.\n");
return;
}
void elimina(cliente datos[])
{
int posicion;
int sitio;
posicion=busca_posicion(datos, &sitio);
switch (posicion)
{
case 0: //no hay clientes con ese nombre
printf("\nEl cliente no se encuentra en la lista\n");
break;
case 1: //solamente hay un cliente con ese nombre
quita(datos, sitio);
break;
default: //hay mas de un cliente con ese nombre
printf("\nHay mas de un cliente con ese nombre");
posicion=busca_dni(datos);
247
if (posicion>=0) {
quita(datos, posicion);
}
else
printf("\nNo hay clientes con ese DNI en la lista\n");
break;
}
return;
}
void main(void)
{
cliente datos[MAX];
int i, opcion;
do {
printf("\n1.Introducir un nuevo cliente\n");
printf("2.Mostrar los clientes existentes\n");
printf("3.Buscar un cliente\n");
printf("4.Eliminar un cliente\n");
printf("5.Salir del programa\n");
printf("\nIntroduce una opcion: ");
scanf("%d", &opcion);
switch (opcion)
{
case 1:
inserta(datos);
break;
248
case 2:
if (num==0) printf("\nNo hay ningun cliente en la
lista\n");
else {
for(i=0;i<num;i++) {
muestra(datos[i], i);
}
}
break;
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:
249
printf("\nFIN DEL PROGRAMA\n");
break;
default:
printf("\nOpcion introducida no valida\n");
break;
}
}while(opcion!=5);
getch();}
ESTRUCTURAS Y PUNTEROS
La direccin de comienzo de una estructura puede accederse de la misma manera que cualquier otra direccin
mediante el uso del operador indireccion
Si variable V representa un tipo de estructura entonces &v representa la direccin de comienzo de la
estructura es decir de la variable, adems podemos declarar un puntero a una estructura escribiendo
TIPO DE ESTRUCTURA* PUNTEROVARIABLE
Aqu tenemos un puntero que apunta a un dato del tipo de la estructura que hayamos definido
Para que ese puntero se quede con la direccin de la variable ponemos
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
250
datos.nombre
ahora
(*PDATOS).NOMBRE;
hay otra forma de acceder al valor de los campos: PDATOS>NOMBRE
EJEMPLO:
#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 nombre que ha metido es:%s\n",datos.nombre);
printf("el nombre que ha metido es:%s\n",(*pdatos).nombre);
251
printf("el nombre que ha metido es:%s\n",pdatos>nombre);
printf("el dni que ha metido es:%ld\n",datos.dni);
printf("el dni que ha metido es:%ld\n",(*pdatos).dni);
printf("el dni que ha metido es:%ld\n",pdatos>dni);
printf("la direccion que ha metido es:%s\n",datos.direccion);
printf("la direccion que ha metido es:%s\n",(*pdatos).direccion);
printf("la direccion que ha metido es:%s\n",pdatos>direccion);
}
Programa anterior pero con varios clientes.
#include<stdio.h>
#define MAX 100
typedef struct {
char nombre[20];
long int dni;
char direccion[20];
} cliente;
void main () {
cliente datos[MAX];
cliente *pdatos;
int lista, i;
clrscr();
do {
printf ("Cuantos clientes nuevos vas a introducir?");
scanf ("%d", &lista);
}while (lista<=0);
for (i=0; i<lista; i++) {
252
printf ("Introduzca los datos del %d cliente.\n", i+1);
printf("\n\n NOMBRE: ");
scanf(" %[^\n]",datos[i].nombre);
printf("\n DNI: ");
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: ");
for (i=0; i<lista; i++) {
printf ("El nombre es: %s.\n", (*(pdatos+i)).nombre);
printf ("El DNI es: %d.\n", (*(pdatos+i)).dni);
printf ("La direccin es: %s.\n", (*(pdatos+i)).direccion);
}
printf ("\n\nTercera forma: ");
for (i=0; i<lista; i++) {
printf ("El nombre es: %s.\n", (pdatos+i)>nombre);
253
printf ("El DNI es: %d.\n", (pdatos+i)>dni);
printf ("La direccin es: %s.\n", (pdatos+i)>direccion);
}
getch ();
}
programa de busqueda de clientes en un array
#include <stdio.h>
#define MAX 3
#define NULL 0
typedef struct {
char nombre[20];
long int dni;
char direccion [20];
}cliente;
cliente *busca(cliente datos[], long int n)
{
//devuelve un puntero,es decir:una direccion.
int i;
for (i=0; i<3; i++)
{
if (datos[i].dni==n)
{
return (&datos[i]);
}
}
return (NULL);
254
}
void main () {
cliente *pdatos;
cliente datos [MAX]= {{"Pepe", 1245, "Santiago"},{"Luis", 3875,
"Burgos"},{"Maria", 9540, "Alegria"}};
long int numero;
clrscr();
printf ("\nNmero a buscar: ");
scanf ("%ld", &numero);
pdatos=busca(datos, numero);
if (pdatos==NULL) {
printf ("\nNo existe.");
}else {
printf ("\nNombre: %s.", pdatos>nombre);
printf ("\nDNI: %ld.", pdatos>dni);
printf ("\nDireccin: %s.", pdatos>direccion);
}
getch();
}
LISTAS ENLAZADAS
Una lista va a combinar un puntero (indica el principio de la lista) y una estructura.
Para hacer listas utilizaremos :
STRUCT NOMBRE
{
TIPO MIENBRO 1;
TIPO MIENBRO 2;
255
TIPO MIENBRO N;
};
TYPEDEF STRUCT NOMBRE NODO
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
#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
256
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);
}
Programa que te crea una lista con dos nodos
# 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(){
nodo *inicio=null;
nodo *temporal=null;// es otro puntero que sustituye a inicio ya que si se toca inicio este perderia su valor
inicial.
257
inicio=(nodo*)malloc(sizeof (nodo)); //reservar espacio/
printf("\n NOMBRE\n ");
scanf(" %[^\n]",inicio>nombre);
printf("\n DNI\n");
scanf("%ld",&inicio>dni);
printf("\n NUMERO");
scanf("%d",&inicio>numero);
inicio> siguiente= NULL;
inicio>siguiente=(nodo*)malloc(sizeof(nodo));
printf("\n NOMBRE\n ");
scanf(" %[^\n]",inicio>siguiente>nombre);
printf("\n DNI\n");
scanf("%ld",&inicio>siguiente>dni);
printf("\n NUMERO");
scanf("%d",&inicio>siguiente>numero);
inicio>siguiente>siguiente=NULL;
/*printf("\n nombre: %s",inicio>nombre);
printf("\n DNI: %ld",inicio>dni);
printf("\n numero:%d",inicio>numero);
printf("\n nombre: %s",inicio>siguiente>nombre);
printf("\n DNI: %ld",inicio>siguiente>dni);
printf("\n numero:%d",inicio>siguiente>numero);*/
temporal=inicio;
en el caso de que la lista tenga muchos nodos para imprimir los datos se hace asi:
while(temporal!=null)
{
258
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: ");
259
scanf("%d", &p>num_cliente);
printf("\nDNI: ");
scanf("%ld", &p>dni);
printf("\nDireccion: ");
scanf(" %[^\n]", p>direccion);
p>siguiente=NULL;
return;
}
//Inserta el primer elememto de la lista
void insertar(nodo *principio)
{
pide_datos(principio);
return;
}
//Aade un elemento al final de la lista
nodo *anadir_final(nodo *principio)
{
nodo *auxiliar;
auxiliar=principio;
while (auxiliar>siguiente!=NULL) {
auxiliar=auxiliar>siguiente;
}
auxiliar>siguiente=(nodo *)malloc(sizeof(nodo));
pide_datos(auxiliar>siguiente);
return(principio);
}
260
//Inserta al principio de la lista
nodo *anadir_primero(nodo *principio)
{
nodo *auxiliar;
auxiliar=(nodo *)malloc(sizeof(nodo));
pide_datos(auxiliar);
auxiliar>siguiente=principio;
principio=auxiliar;
return(principio);
}
void mostrar(nodo *puntero)
{
nodo *registro;
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;
261
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: ");
scanf("%d", &opci);
return(opci);
}
nodo *buscar(nodo *p)
{
long int numero;
nodo *aux;
printf("\n\nIntroduce el dni del cliente a buscar: ");
scanf("%ld", &numero);
aux=p;
while(aux!=NULL) {
if (aux>dni==numero)
return(aux);
aux=aux>siguiente;
}
return(NULL);
}
nodo *elimina(nodo *p, nodo *temp)
262
{
nodo *anterior;
if (temp==p) {//Solamente hay un elemento en la lista
p=NULL;
free(temp);
}
else {
anterior=p;
while(anterior>siguiente!=temp) {
anterior=anterior>siguiente;
}
anterior>siguiente=temp>siguiente;
free(temp);
}
return(p);
}
void main(void) {
int opcion;
nodo *principio=NULL;//Puntero al primer elemnto de la lista
nodo *temp;
clrscr();
opcion=menu();
while (opcion!=7) {
switch (opcion)
{
case 1:
263
if (principio==NULL)
{
principio=(nodo *)malloc(sizeof(nodo));
insertar(principio);
}
else
printf("\n\nLa lista ya existe");
break;
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:
264
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");
265
else
principio=elimina(principio, temp);
}
break;
case 7: printf("\n\nFin del programa");
break;
default:printf("\n\nOpcion no valida");
break;
}
opcion=menu();
}
}
}
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
266
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);
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)
267
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
}
268
}
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.
# Include < stdio.h>
Void main()
{
file * fich;
int i, num;
Char nombre[20];
269
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;
270
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
typedef struct{
char nombre[20];
int num;
}cliente;
void main(void) {
FILE *fichero;
cliente aux;
if ( (fichero=fopen("ejemplo.dat","r"))==NULL)
271
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);
}
ALGORITMO DE ACTUALIZACIN DE FICHEROS
Vamos a suponer que tenemos dos ficheros con dos campos enteros: 1. clientes con los campos num_cliente
y saldo. 2. bonificaciones con los campos num_cliente y bonif. Queremos obtener otro fichero nuevo con los
campos num_cliente y saldo+bonificacin.
Para realizar esto se utiliza la tabla de verdad:
////// CLIENTES BONIFICACIONES
C1 1 1
C2 1 0
C3 0 1
C1 actualizar el saldo y escribir en nuevo.
C2 sacar mensaje por pantalla
C3 escribir en nuevo
Leer registro clientes
Leer registro bonificaciones
Calcular numero_clinete mnimo
Mientras (num_cliente_cliente!=MAX || num_cliente_bonif!=MAX) hacer
Si (num_cliente_cliente==mnimo && num_cliente_bonif==mnimo)
Tratamiento C1
272
Leer registro clientes
Leer registro bonificaciones
Sino
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;
273
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");
bon=fopen("bonificaciones.dat","r");
nuevo=fopen("salida.dat","w");
if(cli==NULL || bon==NULL || nuevo==NULL);
274
{
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;
275
}
fread(&temp,sizeof(bonif),1,bon);
if( feof(bon) )
{
temp.ncliente=MAX;
}
}
else
{
if(aux.ncliente==min)
{
printf("El cliente %d ha causado
baja.\n",aux.ncliente);
fread(&aux,sizeof(cliente),1,cli); //funcin
if( feof(cli) )
{
aux.ncliente=MAX;
}
}
else
{
fwrite(&aux,sizeof(cliente),1,nuevo);
fread(&temp,sizeof(bonif),1,bon);
if( feof(bon) )
{
temp.ncliente=MAX;
276
}
}
}
minimo=calcular_minimo(aux.ncliente,temp.ncliente);
}
}
fclose(nuevo);
fclose(bon);
fclose(cli);
}
Programa que te actualice un fichero hecho con funciones.
#include <stdio.h>
#include <stdlib.h>
#define MAX 10000
typedef struct{
int num_cliente;
int saldo;
}cliente;
typedef struct{
int num_cliente;
int bonificacion;
}datos;
int calc_minimo(int a, int b)
{
if (a<=b) return(a);
else return(b);
277
}
cliente lee_viejo(FILE *viejo)
{
cliente aux;
fread(&aux, sizeof(cliente), 1, viejo);
if (feof(viejo)) aux.num_cliente=MAX;
return(aux);
}
datos lee_datos(FILE *modif)
{
datos aux;
fread(&aux, sizeof(datos), 1, modif);
if (feof(modif)) aux.num_cliente=MAX;
return(aux);
}
void main(void)
{
FILE *viejo;
FILE *modif;
FILE *nuevo;
int minimo;
cliente aux;
datos aux1;
viejo=fopen("clientes.dat","r");
modif=fopen("datos.dat","r");
nuevo=fopen("nuevo.dat","w");
278
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.",
aux.num_cliente);
aux=lee_viejo(viejo);
}
else
{
279
fwrite(&aux1, sizeof(cliente), 1, nuevo);
aux1=lee_datos(modif);
}
}
minimo=calc_minimo(aux.num_cliente, aux1.num_cliente);
}
}
fclose(nuevo);
fclose(modif);
fclose(viejo);
}
FUNCIONES DE TRATAMIENTOS DE FICHEROS:
FPRINTF y FSCANF se comportan igual que printf y scanf, excepto que requieren un argumento adicional
para apuntar al fichero correspondiente
El formato general de estas dos funciones es:
FPRINTF(NOMBRE DEL PUNTERO ,LISTA DE ARGUMENTOS);
FSCANF(NOMBRE DEL PUNTERO;LISTA DE ARGUMENTOS);
Ejemplos:
fscanf(fich, %d %d, &a, &b);
fprintf(fichero,%d %[^\n]\n,num,nombre);
FEOF se utiliza para saber cuando es el final de fichero , es decir esta funcion devuelve distinto de cero si se
ha alcanzado el final de fichero sealado por el puntero declarado anteriormente:
Ejemplo:
if( feof(bon) )
{
temp.ncliente=MAX;
}
280
Ademas de estas fuciones de tratamiento de ficheros se encuentran
FREAD y FWRITE.
FREAD ( ) lee el archivo, previamente abierto, indicado por el nombre del puntero a ese fichero FILE
*FICHERO, el numero de veces indicado por el NUMERO, el numero de bytes indicado por el tamao (SIZE
OF( TIPO DE DATO))y lo almacena en el puntero declarado.
(& PUNTERO).
Ejemplo:
#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;
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);
}
281
}
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
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");
282
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
elaborar un programa que codifique una linea de texto de a lo sumo 100caracteres usando para ello
una clave basada en una secuencia de numeros

la linea codificada se obtiene del siguiente modo: para cada caracter de la linea de origen se obtiene la suma
de su codigo ascii con uno de los numeros que componen la clave se halla el resto de dividir el resultado entre
256.
y este resultado es el codigo asccii del nuevo caracter. para el 1 caracter se coge el primer numero y asi
sucesivamente . la clave se pide por teclado y se termina cuando se meta un cero.
#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++)
283
{
suma=ascii[i]+numero[j];
resto[i]=suma%256;
printf("el resultado es %d\n",resto[i]);
if(j==metidos1)
{
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);
284
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++)
{
285
printf("%c",caracter[i]);
}
}
Programa en el cual se declare una tabla de diez por diez en la cual hay numeros enteros . lo que hay
que hacer es pedir un numero y una posicion a cambiar y cambiar los numeros colindantes al
cambiado por el nuevo.

#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;
}
}
if (a+1<LADO && nuevo!=antiguo)
{
if (*(*(foto+a+1)+b)==antiguo)
{
rellenar (foto, a+1, b, nuevo);
*(*(foto+a+1)+b)=nuevo;
286
}
}
if (b1>=0 && nuevo!=antiguo)
{
if (*(*(foto+a)+(b1))==antiguo) {
rellenar (foto, a, b1, nuevo);
*(*(foto+a)+(b1))=nuevo;
}
}
if (a1>=0 && nuevo!=antiguo)
{
if (*(*(foto+a1)+b)==antiguo)
{
rellenar (foto, a1, b, nuevo);
*(*(foto+a1)+b)=nuevo;
}
}
return;
}
void imprime (int (*foto)[LADO])
{
int i, j;
for (i=0; i<LADO; i++)
{
for (j=0; j<LADO; j++)
{
287
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));
288
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)
{
if (*(*(foto+a)+(b+1))==antiguo)
289
{
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 (b1>=0 && nuevo!=antiguo)
{
if (*(*(foto+a)+(b1))==antiguo)
{
rellenar (foto, a, b1, nuevo);
*(*(foto+a)+(b1))=nuevo;
}
}
if (a1>=0 && nuevo!=antiguo)
{
if (*(*(foto+a1)+b)==antiguo)
{
rellenar (foto, a1, b, nuevo);
290
*(*(foto+a1)+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 ("");
291
}
else if (*(*(foto+i)+j)==4 )
{
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);
292
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");
293
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);
}
}
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 {
printf ("INTRODUCE LA POSICIN A CAMBIAR: ");
294
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 ();
}
practica 2 hecha por el profesor
#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+f1)+c)==actual )
rellenar(foto, c, f1, nuevo_color);
}
if (f!=10) {
if ( *(*(foto+f+1)+c)==actual )
rellenar(foto, c, f+1, nuevo_color);
}
if (c!=1) {
if ( *(*(foto+f)+c1)==actual )
295
rellenar(foto, c1, f, nuevo_color);
}
if (c!=1) {
if ( *(*(foto+f)+c+1)==actual )
rellenar(foto, c+1, f, nuevo_color);
}
return;
}
void llena(int (*foto)[10])
{
int i, j;
for(i=0;i<10;i++) {
for(j=0;j<10;j++) {
printf("\nElemento %d, %d", i+1, j+1);
scanf("%d", *(foto+i)+j);
}
}
return;
}
void imprime(int (*foto)[10])
{
int i, j;
printf("\n\n");
for(i=0;i<10;i++) {
for(j=0;j<10;j++) {
printf("%d", *(*(foto+i)+j));
296
}
printf("\n");
}
return;
}
void main(void)
{
int (*foto)[10], nuevo_color, fila, columna;
foto=(int *)malloc(10*10*sizeof(int));
llena(foto);
printf("\nIntroduce el nuevo_color: ");
scanf("%d", &nuevo_color);
printf("\nIntroduce la posicion a tratar: ");
scanf("%d %d", &fila, &columna);
rellenar(foto, columna, fila, nuevo_color);
imprime(foto);
}
practica 1 hecha por el profesor
#include <stdio.h>
#include <ctype.h>
#define MAX 100
char trata(char origen, int clave)
{
int suma, resto;
suma= toascii(origen) + clave;
resto=(suma%256);
297
return(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);
}
practica 1 otra forma de hacerlo
298
#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==metidos1)
{
j=0;
}
else
{
j++;
}
}
return;
}
void main()
{
char linea[max];//array que contiene el texto metido.
299
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);
printf("el texto introducido es:%s\n",linea);
printf("la clave es:");
for(i=0;i<metidos;i++)
{
printf("%d",numero[i]);
}
for(i=0;i<longitud;i++)
300
{
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]);
}
}
13
195
pruebas
organigrama
prototipo
usuario
LENGUAJE DE ALTO NIVEL
LENGUAJE DE BAJO NIVEL
LENGUAJE MAQUINA
ALTO NIVEL
VERIFICAR ERRORES
EJECUCION
VERIFICAR RESULTADOS
301
PERIFERICOS DE ENTRADA
SOPORTE E/S
PROGRAMA
SOPORTE E/S
PERIFERICOS DE SALIDA
Disco
magntico
tarjeta
Pantalla
proceso
teclado
Archivo en CM
Archivo
S=S+5
Escribir telfono
Leer telfono
INICIO
INICIO
SI
F=A
E=B
LEER A
LEER B
LEER C
LEER A
LEER B
LEER C
302
A=B+C
D=A+B
E=A+C
F=B+C
NO
SI
B=A+C
D=C
I
FIN
NO
SI
C=A+B
SI
NO
NO
I
DISTINTOS
SI
NO
FIN
I
SI
NO
DISTINTOS
INICIO
LEER N
303
C=O
R=O
C=C+1
R=C+R
C=N
NO
SI
R
FIN
NO
SI
A=B+C
INICIO
LEER A Y B
NO
SI
A>B
NO
A<B
ESCRIBIR A ,B
SON IGUALES
SI
ESCRIBIR B,A
FIN
Accion 1
Accion 2
304
Accion N
NO
cond
FIN
SI
C=C+1 R=C+R
C=N
NO
SI
FIN
R
cond
NO
SI
Operacin..
INICIO
LEER N
SI
NO
N<1
NO VALE
CONT=O FACT=1
C=C+1 F=F*C
C=N
FIN
FACTORIAL
305
NO
SI
F=1
NO
N<>O
NO VALE
SI
FIN
F=F*N N=N1
INICIO
LEER A B C D
NO
SI
A>o=B
MAXI =A
MAXI=B
SI
NO
M<C
MAXIMO =C
M<C
SI
NO
ESCRIBIR D
ESCRIBIR M
FIN
306
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
NO
MA>O=M
ESCR M
ESCR MA
FIN
INICIO
C<>O
NO
NO
N>o=O
S=O M=O
C=O
SI
307
SI
M=S/C
S=S+N
C=C+1
LEER N
ESCR M
ESCR S
LEER N
FIN
INICIO
S=O
P=2
NO
P<50
ESCRI
BIR S
SI
S=S+P
P=P+2
FIN
INICIO
S=O
N=2
ECRI
S
NO
308
N<50
SI
SI
NO
NMOD2=0
IMPAR
PAR
FIN
S=S+N
N=N+1
INICIO
C=O
S=O
Leer D
LEER DURACION
NO
D< = O
SI
LEER DURACION
SI
NO
D<=3
S=10
C=4
COSTE=10
309
NO
C<=D
SI
S=S+5
C=C+1
ESCRIBIR COSTE
FIN
FIN
INICIO
C=O
S=O
SI
C<3
S=10
1O
C=C3
S=C*5+1O
ESCRIB COSTE
NO
INICIO
S=O
C=O
I=O
P=O
LEER N
N< O
SI
310
NO
SI
NO
NMOD2=0
CIMPAR=CI+1
S=S+N
MOSTRAR P
CPAR=CPAR+1
C=C+1
SI
NO
M=O
C=1O
NO
CPAR=O
M=S/Ci
SI
ESCRIBIR MEDIA
FIN
Variable
Inicio,final,incr
INICIO
LEER N
CR=O
C=O
CU=O
311
NO
NO
FIN
C<>N
SI
C=C+1
CR=C*C
CU=CR*C
ESCRIBIR CUADRADO
Y CUBO
INICIO
DIAS =1
SUELDO=O
NO
SI
SUELDO
DIAS < =5
Leer horas
Leer turno
FIN
NO
NO
SI
T=M
T=T
SI
312
S=S+H*1000
S=S+H*600
S=S+H*800
DIAS=DIAS +1
INICIO
Dias=1
S=O
SUELDO
DIAS
1,5,1
LEER HORAS
LEER TURNO
FIN
SI
T=M
NO
S=S+H*600
NO
T=T
SI
S=S+H*1000
S=S+H*800
D=D+1
SEGUN
variable
INICIO
313
C1=0 C3=0 C4=0 C2=0
LEER N
NO
MENSAJE
N>O
SI
NO
FIN
N >=1
N<=4
MENSAJE
SI
SI
N=1
C1=C1+1
SI
NO
N=2
C2=C2+1
NO
N=3
SI
C3=C3+1
NO
C4=C4+1
314
N>0
NO
SOLUCION
SI
N
FIN
M
C4=C4+1
C1=C1+1
C2=C2+1
C3=C3+1
LEER N
INICIO
GANADOR=O
TOTAL=O
TM=O
DORSAL
1,300,1
TOTAL=TOTAL/300
LEER TIEMPO
ESCRIBIR GANADOR
ESCRIBIR TM
ECRIBIR TOTAL
Total=total+tiempo
FIN
NO
315
SI
T<TM
GANADOR =TM
INICIO
1AREA
2SUPERFICIE
R=O A=O
S=O N=O
P=3,14
LEER RY N
FIN
N
SI
SI
MENSAJE
N>O
N>O
NO
S=R*R*P
A=R*R*P
NO
S
ESCRIBIR A
INICIO
LEER N
316
NO
N>O
SI
CONTADOR=N
SI
N MOD CONT=O
NO
ESCRIBIR CONTADORR
CONTADOR= CONTADOR1
SI
FIN
CONTADOR=O
NO
C=N
CONTADOR =CONTADOR+1
INICIO
LEER N
SI
N<=O
NO
FIN
I
1,N,1
SI
N MOD I=O
317
NO
ESCRIBIR I
INICIO
DIVISOR=O CONT=2
DAME NUMERO
LEER N
NO
N>O
SI
SI
NO
CONTADOR<N
NO
D=O
SI
SI
N MOD CONT=O
NO
DIVISORES=DIVISORES+1
NUMERO PRIMO
C=C+1
FIN
INICIO
LEER N
NO
318
N>0
SI
N MOD 10=A
ESCRIBIR A
NO
N=N/10
FIN
ESCRIBIR N
N=O
SI
INICIO
POTENCIA =1
LEER BASE
SI
BASE<=O
NO
LEER EXP
SI
EXP>=O
NO
NO
EXP=O
I
1, EXP, 1
SI
319
P=P*BASE
ESCRBIR POTENCIA
FIN
POTENCIA=POTENCIA*BASE
CONTADOR=CONTADOR+1
NO
SI
CONTADOR>=EXP
ESCRIBIR POTENCIA
FIN
INICIO
SUMA=O
LEER N1 N2
N1 N2 <=O
NO
SI
LEER N1 N2
NO
N1MOD2<>0
SI
S=S+N2
NO
N1>1
SI
N1=N1/2
N2=N2*2
320
SI
NO
N1MOD2<>0
S=S+N2
FIN
INICIO
LEER A B C
D= SQRT(B*B(4*A*C) )
D= SQRT(D) , X1= B+D/2A
X2 =BD/2A
D<0
ESCRIBIR X1 X2
FIN
INICIO
LEER A
LEER C
LEER B
A>O B>O C>0
A=B
A=C
B=C
A=C
A<>B<>C
B=C
A=C
A=B=C
321
A=B
FIN
INICIO
LEER LADO
FIN
I
1,LADO,1
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=PRPR*0,3
PRECIO
FIN
INICIO
P=0 S=0 C=0
C=C+1
P=P+2
322
S=S+P
FIN
C=N
INICIO
LEER A
B=MOD2
PAR
B=0
FIN
IMPAR
INICIO
1=1OPCION
2=2OPCION
3=3OPCION
LEER OPCION
FIN
OP<>3
OPC
LEER AB
LEER CD
LEER N
ERROR
N>0
E=A+B
F=C+D
E>F
323
E ES M
F>E
F=E
F ES M
INICIO
1=COCHES
2=BICIS
3=MOTOS
4=CAMIONES
OPCION
T=100
ERROR
LEER KM
LEER KM
LEER KM
KM>0
KM>0
KM>0
LEER To
T=KM*40
T=KM*30
LEER T
To>0
LEER T
T=10*To
T1=T+50*KM
324
IMPORTE
FIN
Enlazador
Programa. objeto
Compilador
Programa fuente
Pr.ejecutable
325
Void maximo (x,y);
Int x,y;
{
int max=0;
if(x>y)
max=x;
else
max=y
printf (el maximo es % d,max);
return;
}
#include <stdio.h>
void suma (a , b)
326
int a , b;
{
int res =0;
res=a+b;
printf(%d,res);
return;
}
void main( )
{
int n1, n2 ,
printf (dame 2 numeros);
scanf (%d %d ,&n1, &n2);
suma(n1,n2);
}
0 int tabla [3][4];
1
2
327

Вам также может понравиться