Fundamentos de programación

Lenguajes de programación. Informática. Computación. Pseudocódigo. Lenguaje C. Programación estructurada. Algoritmos. Estructuras repetitivas

  • Enviado por: Abel
  • Idioma: castellano
  • País: España España
  • 197 páginas
publicidad
cursos destacados
Introducción a Windows Phone 7
Introducción a Windows Phone 7
Introducción a Windows Phone 7 en 6 lecciones:
Instalación del entorno (SDK 7.1)
Entorno de...
Ver más información

Crea aplicaciones para Android sin programar
Crea aplicaciones para Android sin programar
El mercado de aplicaciones móviles está en constante crecimiento y es Android el sistema operativo que lo está...
Ver más información

publicidad

Tema1

CONCEPTOS

PROGRAMACION: es una de las etapas más importantes del ciclo de vida de un proyecto informático, y requiere un determinado método de trabajo, las herramientas que utilizamos para programar son los lenguajes de programación a través de los cuales codificaremos los programas. La fase de programación desarrolla el algoritmo del programa a partir de los ordinogramas obtenidos en la fase de análisis.

El algoritmo suele representarse gráficamente mediante ordinogramas más completos que los obtenidos en el análisis orgánico. Para el desarrollo de los algoritmos también se emplean el pseudocodigo las cuales son representaciones estructuradas no gráficas 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 programación por ejemplo C

El conjunto de programas forman lo que se ha denominado el software de un sistema informático o lo que es lo mismo una aplicación informática la cual no se fabrica no se desgasta sino que se desarrolla y se deteriora respectivamente y, además, se construyen a medida.

Ejemplos : Software de sistemas (WORD)

Software de gestión( utilizado por las industrias para las facturas por ejemplo)

En tiempo real (central nuclear)

Al hablar de programas nos referimos a su finalización 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 definición: estudiar lo que el cliente nos pide para saber lo que hay que hacer.

  • Fase de desarrollo: diseñar la solución y hacer el algoritmo que nos resuelva lo que ha pedido el cliente.

  • Fase de operación: mantenimiento del programa.

Otra clasificación más explícita

  • Análisis y definición de las necesidades:

Establece los objetivos del sistema que queremos construir y los requisitos para su elaboración a partir de las indicaciones.

  • Diseño 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 informático hace falta. necesidades del hardware: nos encargamos de determinar las funciones y el lenguaje de programación a usar.

  • Aplicaciones y pruebas de unidades: Se implementa cada función por separado y se verifica si nos sirve para lo que le hemos programado, implementar significa dividir todo en cachos pequeños, ir codificando y probando poco a poco.

  • Fase de prueba: Juntamos las partes obtenidas en el proceso anterior y vemos si funciona en conjunto.

  • Operación y mantenimiento:

Sé esta al tanto si surge algún imprevisto y se recogen las modificaciones que quiera el usuario, propuestas sobre modificaciones o ampliaciones.

Esta clasificación se corresponde con la anterior de la siguiente manera:

La fase de análisis y definición de necesidades corresponde con la fase de definición, las 3 fases siguientes corresponden con la fase de desarrollo y la fase de operación y mantenimiento se corresponde con la ultima fase, la fase de operación.

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 solución a los posibles errores es más costoso si se ha cometido algún error desde el principio.

Para intentar resolver esto utilizamos la realimentacion, es decir, se establece una comunicación entre las fases

Codificación Explotación

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 según necesidades.

  • Ley de complejidad creciente: las ampliaciones son cada vez más complejas.

  • Ley de conservación 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 conservación de la familiaridad: en el tiempo de vida del desarrollo de un sistema la evolución de su cambio en cada versión 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 más o menos los factores que hacen que se aumente la calidad del software son :

  • Ausencia de errores.

  • Fácil 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 fáciles 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 síntomas del error.

    Usar los estándares recomendados, es decir, seguir los pasos que sabes que no conducen al error.

    • INGENIERÍA 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 elaboración de los programas

    • aumentar la fiabilidad

    • reutilizacion

    • PROGRAMACION ESTRUCTURADA:

    Forma de organizarse cuando queremos resolver el problema de forma que lleguemos a la solución del mismo en un tiempo razonable.

    Bases : Forma de programar usando el diseño descendente (ciclo de vida).

    Organizar y codificar programas que se entienden fácilmente 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 programación e intentar que se puedan verificar los programas en el momento de ser construidas.

    Consecuencias:

    • aparecen nuevos lenguajes de programación

    • aparecen métodos para diseñar programas

    • verificar la validez de los programas

    • obtener programas claros legibles y elegantes

    • la enseñanza de la programación

    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 resolución 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 solución del problema.

  • Para elaborar un ALGORITMO es necesario seguir unos pasos:

    • Resolución de un programa:

    • Análisis del problema: ver las entradas, salidas y el procedimiento de un sistema

    • Definición del algoritmo: el problema inicial se va dividiendo en subproblemas con el fin que cada vez que hagamos esto nos encontremos con un problema más 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 modificación, la verificación y la comprensión del programa.

    ANALISIS DEL PROBLEMA DEFINICION DEL ALGORITMO

    VERIFICAR EL ALGORITMO

    • Implementaron del algoritmo:

    • Codificamos el programa según el algoritmo que hemos obtenido.

    • Ejecutar el programa.

    El concepto de algoritmo procede de algoritmo que es el proceso de hacer aritmética haciendo uso de las herramientas necesarias. Cuando creamos un algoritmo debemos especificar las acciones a realizar pudiendo utilizar los lenguajes de programación

    Antes de pasar a la codificación de un algoritmo mediante un lenguaje de programación utilizaremos un lenguaje natural para crear el pseudocodigo de cada problema planteado.

    Podemos definir lenguaje de programación 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 instrucción en binario

    Este lenguaje presenta la mayoría de los inconvenientes del lenguaje maquina.

    • El programador ha de conocer perfectamente el hardware del equipo

    • Las instrucciones son elementales básicas

    • 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 mínima ocupación de memoria(la cantidad de memoria que necesitan los programas es menor que la utilizada por los lenguajes de alto nivel) y mínimo tiempo de ejecución en comparación con el resultado de la compilación del programa equivalente escrito en otros lenguajes.

    • Los programas escritos en este lenguaje son más 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 código maquina para que el ordenador pueda ejecutarlos. Al igual que el lenguaje ensamblador cada ordenador tiene su propio ensamblador.

    Utilización: en la programación 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 están mas cerca del programador que del hardware de la maquina

  • Características:

    • Son independientes del hardware, pudiendo utilizar un mismo programa en diferentes equipos con la única condición de disponer de un programa traductor o compilador.

    • La estructura de los lenguajes de programación de alto nivel tienden a semejarse lo más posible al lenguaje natural esto lleva consigo una mayor legibilidad de los programas y un aprendizaje más rápido 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 básicas.

    La existencia de estas instrucciones tiene como consecuencia la obtención de programas más cortos y por lo tanto más legibles que sus equivalentes en lenguaje de bajo nivel.

    Pero aun así también tienen defectos como que son más lentos de ejecución 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 están escritos en otros lenguajes por ello es necesario traducirlos

    Hay 3 herramientas que realizan esta operación:

    • 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 instrucción a instrucción. La ventaja que tiene es que si el programa tiene errores permitirá al programador corregirlos sobre la marcha y continuar la ejecución, el inconveniente es que cada vez que se desea ejecutar el programa es necesario traducirlo, es decir, que la ejecución de un programa es más 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 ejecución 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 solución de un determinado problema

    • Debe buscar la simplicidad en la creación de los programas.

    • Tiene que proporcionarnos programas eficientes, es decir, que el proceso de traducción de las instrucciones del programa a su código maquina equivalente se haga de forma rápida y sobre todo que el código resultante sea lo más eficaz posible. Hay dos formas de enfocar la eficiencia del código maquina: la velocidad y el tamaño.

    El código maquina destinado a realizar una determinada operación debe llevar al ordenador a efectuarla de la forma más rápida posible, hay muchos métodos distintos para realizar una misma operación por eso se busca el método más rápido. También ha de buscar el método que requiera menos cantidad de código maquina para realizar una operación determinada.

    Hemos de tener en cuenta que un código maquina mas corto suele ser mas lento mientras que uno largo suele ser más rápido.

    • Obtención 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 diseño de algoritmos

    • Diagramas de flujo.

    • Pseudocodigo.

  • Diagramas de flujo: representación gráfica del flujo de datos u operaciones de un programa, un diagrama de flujo nos permite representar el circuito de información desde su entrada como dato hasta su salida como resultado, esclareciendo la secuencia de las operaciones.

  • Son considerados el lenguaje común 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 análisis reciben el nombre de organigramas en cambio en la fase de programación reciben el nombre de ordinogramas teniendo en cuenta esto se puede decir que hay dos tipos de flujos de datos:

    • Organigramas. Los organigramas reflejan gráficamente la ubicación de información en los soportes periféricos de entrada y salida unida por el flujo de datos e información que utiliza un programa de manera clara y sencilla; un organigrama debe dar una visión externa e interna a través de los siguientes elementos:

    Los soportes (medio capaz de almacenar información) de los datos de entrada, los soportes de los datos de salida, el nombre del programa y el flujo de datos

    Los símbolos utilizados para la entrada y salida de datos indican el tipo de soporte físico. si se utilizan archivos es conveniente poner su nombre

    Los símbolos más utilizados en los organigramas son:

    ……………………………

    • Ordinogramas: son diagramas de flujo que representan la secuencia lógica de las operaciones que se han de efectuar para llevar a cabo un proceso o subsistema determinado, es decir, los ordinogramas representan gráficamente paso a paso todas las

    instrucciones del programa, reflejando la secuencia lógica de las operaciones necesarias para la resolución de un problema

    El ordinograma detalla paso a paso el proceso que debemos seguir en la etapa de programación, todo ordinograma debe plasmar un inicio, un fin y una secuencia de operaciones. En la representación de los ordinogramas es conveniente seguir unas reglas:

    • Utilizar líneas rectas.

    • debe haber un solo comienzo y un solo fin

    • se evitara los cruces de líneas de flujo

    • Las instrucciones deben ser mínimas.

    • No hacer uso excesivo de comentarios.

    • Las expresiones utilizadas dentro de los símbolos deben ser independientes del lenguaje de programación.

    • Etc. …..

    Como con los organigramas los ordinogramas poseen sus símbolos:

    ETC…………

    Tomas de decisión datos terminador operación conector

    • 1 INICIO 1

    • 2 OPERACIONES

    • 3 SECUENCIA 2

    DE OPERACIONES

    • 4 FIN

    3

    4

  • Pseudocodigo: representaciones estructuradas escritas no gráficas, es una notación

  • Mediante la cual podemos escribir la solución 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 solución del problema y la codificación en un lenguaje.

    Todo pseudocodigo debe posibilitar la descripción de los siguientes elementos:

    • Instrucciones de entrada/salida

    • Instrucciones de proceso

    • Sentencias de control de flujo de ejecución.

    • Acciones compuestas(subrogaras).

    • Comentarios que comienzan**.

    La estructura de los pseudocodigo es así:

    La primera parte del pseudocodigo contiene el nombre que informático asigna al programa.

    La segunda parte es una descripción de los elementos que forman el entorno del propio programa, se incluye la declaración de variables (numéricas enteras, numéricas reales, alfanuméricas, lógicas)

    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 numéricas enteras

    Algoritmo:

    Escribir “introduzca la base y la altura”

    Leer base, altura

    Calcular area=base *altura

    Escribir “el área de rectángulo es: …

    Fin programa.

    TEMA3

    TECNICAS DE PROGRAMACION

    CONCEPTOS:

  • OBJETOS DE UN PROGRAMA:

  • ¿Qué son? Elementos a través de los cuales almacenamos los datos y resultados de operaciones con los que llegamos a la resolución de un problema.

    Ahora veremos elementos que nos ayudan a trabajar en la fácil comprensión de los programas.

    DATOS

    SIMPLES

    Numéricos

    Enteros

    Reales

    Lógicos

    Carácter

    DEFINIDAS POR EL USUARIO

    ESTRUCTURADAS

    NUMERICOS: Contienen datos formados exclusivamente por números

    que pueden ser de dos tipos:

    • Enteros : son datos numéricos llamados también de coma o punto fijo. Su rango depende del computador y del lenguaje de programación, se representan en decimal por dígitos (1 2 3 4 5 6 7 8 9) formando cantidades enteras, es decir, sin parte fraccionaria positivas o negativas.

    • Reales :son datos numéricos también llamados de coma o punto flotante. Su rango depende del computador y del lenguaje de programación, se representan por dígitos 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 comparación.

    CARÁCTER: Aquellos que representan un solo elemento alfanumérico, va entre comillas

    Cuando es un solo carácter va entre ` ` y cuando es una cadena va entre” “ la característica más principal del carácter es la longitud el espacio también es considerado un carácter.

    Cada carácter de tipo alfanumérico 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 resolución 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 máximo de sus caracteres difieren según los lenguajes

    Los identificadores son nombres que nos van a servir para nombrar algo, hay que definirlos de la forma más explícita posible ejemplo S=S+P

    Las palabras reservadas son las que forman el lenguaje de programación 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 ejecución 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 más 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 según 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, también 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 valor se incrementa varias veces en cantidades variables.

  • OPERACIONES ARITMETICAS: están formadas por un operador y una serie de datos permiten elaborar expresiones estos operadores aritméticos son: + - * / … etc.

  • En el caso de que se den varias a la vez se opera según esta prioridad

    Potencias multiplicaciones divisiones y por ultimo sumas y restas.

  • OPERACIONES LOGICAS o BOOLEANAS: Estan formados por una constante o variable, operador lógico seguido de una constante o variable.

  • Solo pueden expresar dos valores verdadero o falso, las operaciones booleanas actúan sobre una o más variables obteniendo otra variable booleana, cada operación lógica se rige por su tabla de verdad,

    Se utilizan para evaluar las condiciones a través de los operadores relacionales como por ejemplo ( = <> < > >= <=…) y a través de los operadores lógicos combinan expresiones lógicas

    Y son el AND NOT OR

    Expresión primera

    Operador lógico

    Expresión 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 posición de memoria que habíamos 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 resolución de un programa, las partes que forman un programa son:

    • Entradas de datos: . Acciones que obtienen la información 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 envían a dispositivos externos como por ejemplo la pantalla, impresora………

    Los programas manejan objetos que modifican su estado dependiendo de la ejecución de instrucciones, las instrucciones se clasifican en:

    • Instrucciones primitivas:

    • Asignación.

    • Entrada

    • Salida

    • Instrucciones de declaración: simples. Indican el tipo, las características y la identificación de los objetos que componen un programa. Por ejemplo si es numérico, alfanumérico….el numero de caracteres que tiene…………………

    • Instrucciones de control

    • Secuencia

    • Selección

    • Repetición o iteración.

    Evalúan las expresiones lógicas con el objetivo de controlar la ejecución de otras instrucciones o alterar el orden de ejecución normal de las instrucciones de un programa

    También esta formado por variables auxiliares

    TECNICAS DE PROGRAMACION:

  • PROGRAMACION CONVENCIONAL:

  • Ante cualquier problema debemos seguir los siguientes pasos: análisis del problema, diseño del algoritmo y resolución a través del computador. Estos tres pasos constituyen lo que se llama la programación convencional imprimiendo en ella objetivos tales como la concreción, la legibilidad, la depuración de errores y la facilidad en la modificación.

    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 todavía se incrementa mas cuando la técnica utilizada en la programación es la convencional.

    La técnica utilizada era la formación de bucles y rutinas entremezcladas que se llamaban unas a otras y conseguían el correcto funcionamiento a costa del consumo de recursos, la escasez musical…………etc

    La programación convencional lleva consigo poca claridad y como consecuencia falta de fiabilidad, sobre todo cuando el algoritmo planteado es grande o complejo y, además, con esta técnica es difícil saber donde ocurrió un error.

  • PROGRAMACION MODULAR:

  • Técnica 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 módulos los cuales tienen que poder ser analizados y programados por separados.

    Los módulos son un conjunto de instrucciones lógicamente enlazados que realizan una función, a cada modulo se le asigna un nombre para que pueda ser identificado.

    Características de los módulos:

    • 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 solución completa del problema.

    • Independencia total entre ellos, es decir, que no necesitan colaboración de otros.

    • Un modulo debe representar por si mismo una estructura coherente y resolver una parte bien definida del problema.

    • Estos módulos deben estar previamente definidos

    • Debe existir conexión entre los módulos.

    • Las funciones de estos módulos, es decir, de estos programas sencillos e independientes no interfieren en el funcionamiento de otros programas.

    • Estos módulos pueden ejecutarse unos a continuación de otros o pueden ser llamados en momentos determinados para su ejecución.

    Frente a la programación convencional la programación modular presenta unas ventajas:

    • Los programas hechos con esta técnica de programación son más sencillos de escribir y de depurar por que se pueden hacer pruebas parciales con cada modulo por separado.

    • La modificación de un modulo se hace mas cómoda y en general no tiene que afectar al resto de los módulos.

    • Un programa se puede ampliar fácilmente diseñando nuevos módulos.

    • Un mismo modulo escrito una sola vez puede ser referenciado desde varios puntos del programa evitando la repetición de instrucciones ya escritas.

  • PROGRAMACION ESTRUCTURADA:

  • Como consecuencia de los problemas que aparecieron en la programación utilizando la programación convencional aparece en los años setenta un nuevo concepto de programación: la programación estructurada creada por el profesor E.W DIJKSTRA.

    Consiste una técnica constructiva de programas basada en el conjunto de reglas que persiguen coordinar las diferentes etapas de programación, utilizando para ello estructuras especificas y optimizando los recursos lógicos y físicos de cada lenguaje de programación. Esta metodología solventa los costes producidos y mejora la productividad del equipo de proyecto.

    Otra definición puede ser la siguiente: es un criterio de programación 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, selección, iteración, es decir, que cualquier programa se puede resolver anidando estas tres estructuras.

    La programación estructurada se utiliza para aumentar la eficacia del ordenador para ello los programas tiene que tener una estructura fácil y comprensible, consiguiendo programas fiables, fácilmente modificables, y manejables.

    El método de trabajo más antiguo dentro de esta programación es el método de WARNIER, basado en una organización lógica de conjuntos.

    La programación modular y la programación estructurada son criterios de programación complementarias por que por la programación modular descomponemos el programa en partes más pequeñas y con la programación estructurada desarrollamos estos módulos.

    Lo que se busca con la programación modular y la programación estructurada es:

    • Adaptarse fácilmente a las modificaciones.

    • Propiciar una puesta a punto más rápida

    • Posibilitar una cómoda interpretación de los programas por diferentes programadores.

  • DOCUMENTACION:

  • La documentación nos da información sobre 3 cosas: que hace el programa, como se construye, y como usar el programa.

    La documentación 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 información precisa de lo que hace el programa, una documentación clara para manejar el programa sin saber usarlo demasiado y esta formado por:

    • Documento de descripción funcional: documentación que trata de los requisitos y propósitos del programa ofrece ejemplos sencillos de lo que hace el programa para saber si es lo que busca el usuario.

    • Documento de instalación y documentación: el cual detalla la instalación y los requisitos del hardware y cuales son los archivos de configuración.

    • 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 documentación se puede observar una descripción total y formal del programa.

    • Guía del operador: en ella sé ofrecen respuestas rápidas a problemas inesperadas.

    • De sistema: esta documentación 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 módulos(descripción)

    • Coger estos módulos y hacer un pequeño programa

    • Pruebo los modulos y los junto en la resolución para dar lugar al programa grande

    Diccionario de datos: documento que detalla todas las entidades relevantes del sistema

    ( estructuras de datos, archivos, procedimientos para tratar las estructuras……)

    Este tipo de documentación 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 números 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

    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 SELECCIÓN

    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

    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 números naturales (repetido)

    Inicio

    Leer N

    R=O

    C=O

    Repetir

    C=C+1

    R=C+R

    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(N-1)(N-2)(N-3)

    Fact=1

    Mientras n<>0 hacer

    Fact=fact*N

    N=N-1

    Fin mientras

    Escribir resultado

    Fin

    • tenemos 4 números 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

    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 números 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

    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 números pares pasando x todos los números indicando si es par o no

    Inicio

    S=O

    N=2

    Mientras n<50 hacer

    Si n mod 2=0 entonces

    Par

    S=S+N

    Sino

    Impar

    N=N+1

    Fin si

    Fin mientras

    Escribir suma

    Fin

    • Determina la cantidad total a pagar por una llamada telefónica 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 más. C= contador, D= duración, 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:

    • Diseñar un algoritmo que dados 10 números enteros, indique cuales son pares, nos los muestre y calcule la media de los impares.

    Inicio

    S=O
    C=O
    I=O
    P=O

    Leer N

    Repetir

    Repetir leer N

    Hasta n>O

    Si Nmod2=O ents

    Mostrar p

    Cpar=cpar+1

    Sino

    Cimp=Cimp+1

    S=S+N

    Fin si
    C=C+1

    Hasta C=1O

    M=O

    Si contador par =O ents

    M=S/Cimp

    Escribir media

    Fin si

    Fin

    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 operación automaticamente.

    Para variable desde inicio

    hasta final hacer

    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 mañana 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 : mañana---600 pts por hora

    Tarde-----800” “ “

    Noche ------1000 “

    Inicio

    Dias =1

    Sueldo=O

    Mientras D< = 5 hacer

    Leer horas

    Leer turno

    Si turno =mañana entonces

    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

    Fin si

    Dias=Dias+1

    Fin si

    Fin para

    Escribir sueldo

    Fin

    ESTRUCTURA CONDICIONAL MULTIPLE

    Según variable hacer

    =1 ---------------

    =2----------------

    =N-----------------

    Fin segun

    =1 =2 = otros

    • Queremos que nos den números 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

    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 según

    Inicio

    Leer n

    C1=O

    C2=O

    C3=O

    C4=O

    Mientras N>O hacer

    Según 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

    =otro escribir mensaje

    fin según

    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

    • Algoritmo que permite elegir la opción 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

    Según 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 según

    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

    sino

    fin si

    C=C-1

    Repetir si cont=O entonces

    Escribir contador

    Hasta C=O

    Fin

    También se puede hacer si pones el contador en 1 y en la ultima decisión 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

    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

    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 multiplicación 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

    N2=n2*2

    Si n1 mod2<>O ents

    S=S+N2

    Fin si

    Fin mientras

    Escribir suma

    Fin

    • Algoritmo que nos de la solución de una ecuación 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 = -B-D/2a

    Escribir X1 X2

    Fin

    • Algoritmo que lea 3 números >O y diga si son iguales o no

    Inicio

    Repetir

    Leer A

    Leer B

    Leer C

    Hasta

    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 triángulo hecho con asteriscos dándote el lado Ejemplo: lado 3 -

    *

    * *

    * * *

    Inicio

    Pedir Lado

    Para I Desde 1 Hasta Lado Hacer

    Para J Desde 1 Hasta I Hacer

    Escribir*

    Fin Para

    Saltar Línea

    Fin Para

    Fin

    • Algoritmo para determinar el Precio de un billete de ida y vuelta conociendo la distancia, los días de la estancia y sabiendo si la distancia es superior a 1000km y la estancia superior a 7 días 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=Precio-Pr *0,3

    Escribir Precio

    Fin

    • Algoritmo que sume los n números pares

    • Algoritmo que diga si un numero es par o impar

    Inicio

    P=0

    C=O

    S=0

    Repetir

    C=C+1

    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 números hasta introducir uno negativo Pide 2 pares de números y decir que par es mayor, salir

    Inicio

    Escribir Menú

    Leer Opción

    Mientras Opción<>3 Hacer

    Según Opción Hacer

    =1 Leer N

    Mientras N> =0 Hacer

    Leer N

    Fin Mientras

    =2 Leer A B C D

    Suma =A+B

    F=C+A

    Si Suma >Suma 2 Entonces

    Escribir Suma1

    Sino

    Si Suma2>Suma1 Entonces

    Escribir Suma 2

    Sino

    Escribir Igual

    Fin Si

    Fin Si

    = Otros Escribir Error

    Fin Según

    Escribir Menu

    Leer Opcion

    Fin Mientras

    Fin

    • Algoritmo que nos calcule el importe apagar por un vehículo 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

    Según 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

    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 programación de propósito general que combina las características de un lenguaje de alto nivel con ciertas características 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 año 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 están escritos en C.

    C es el resultado de la a unión 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 características que poseía 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 década 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 programación potente que genere un modulo objeto eficiente. Aunque fue diseñado inicialmente para la programación de sistemas, posteriormente su uso se ha extendido a aplicaciones técnico científicas, 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 ningún sistema operativo en concreto, de forma que se obtiene una gran portabilidad de los programas escritos en este lenguaje.

    Esta portabilidad y su gran aceptación provocaron la aparición de multitud de versiones comerciales, cada una de ellas con sus características propias.

    Este echo trajo consigo algunas incompatibilidades entre las versiones del lenguaje de forma que se hizo necesaria una estandarización del mismo que corrió a cargo de ANSI, es decir el AMERICAN NATIONAL STANDARS INSTITUTE elaboro una definición normalizada del lenguaje de programación C.

    CARACTERISTICAS

    • Lenguaje complicado si no se tiene cierta experiencia a la hora de elaborar programas.

    • Suministra una visión 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 solución.

    • 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 ningún sitio.

    • Es un lenguaje potente porque permite realizar multitud de tareas.

    • Es un lenguaje muy utilizado en distintos tipos de aplicación.

    • Reutilizacion: aprovecha el uso de tareas ya implementadas.

    • No es un lenguaje muy estructurado como ocurre en lenguajes como el PASCAL……

    • Un aspecto destacable del paso del tiempo en C es su control sobre aspectos del computador a la manera de los lenguajes ensambladores.

    Resumiendo C es un lenguaje de proposito general es decir que puede ser utilizado para programar una gran variedad de aplicaciones .

    Por su diseño 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 Técnica para resolver un programa cualquiera: .

    • Leer el enunciado y una vez entendido elaborar una solución mental del mismo.

    • Elaborar un algoritmo.

    • Asegurarnos de que el algoritmo resuelve el problema inicial.

    • Codificar el programa a través del algoritmo.

    • Editar el programa en el ordenador.

    • Compilar y enlazar.

    • Ejecutar y comprobar resultados.

    Todo programa en C consta de una o más funciones.

    Una función es un conjunto de sentencias, es decir, de datos e instrucciones que realizan una tarea determinada.

    En el lenguaje C podemos hacer una distinción 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, también 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 programación es la utilización de módulos, es decir, una programación dividida en partes diferenciadas que contengan las instrucciones.

    Un programa esta formado por instrucciones que realizan las operaciones a lo largo del mismo. Estas instrucciones se pueden agrupar en las llamadas funciones, evitando la repetición innecesaria de una parte del programa y dotándolo de una gran independencia.

    Esto confiere una claridad a la programación permitiendo a simple vista una composición mental de la solución del problema.

    El funcionamiento de un programa compuesto por varias funciones es el siguiente:

    El programa se ejecuta secuencialmente.

    Detecta la funcion. Ejecuta dicha función.

    Continua con el programa secuencialmente donde lo dejo.

    Una de las ventajas que tiene esta forma de trabajo es la confección de nuestra propia biblioteca de funciones( una biblioteca de funciones o librería 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 diseñar las mismas funciones cada vez que sean necesarias.

    La estructura de una función es la siguiente:

    • Cabecera: nombre con que identificamos a una función seguida de los argumentos entre paréntesis 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 función.

    • El cuerpo: todas las sentencias de control, operaciones aritméticas………

    • Una llave de cierre } la cual indica el fin de la función.

    Otra manera de ver su estructura es la siguiente:

    • Una cabecera.

    • Declaración de argumentos.

    • Declaración de variables locales.

    • Sentencia compuesta.

    • Valor devuelto.

    En todo programa hay una función que siempre tiene que aparecer que es aquella que todo programa comienza siempre ejecutando: main ( ).

    LA FUNCION MAIN( ): La función main( ) es una función particular. La primera particularidad es que a esta función la invoca el sistema operativo y no otra función. 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 función. Por tanto, todo programa en C debe tener una única función 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 algún tipo de error.

    CARACTERISITICAS DESEABLES DE UN PROGRAMA EN C

    • INTEGRIDAD: se refiere a la corrección de los cálculos que hacemos en el programa.

    • CLARIDAD: se refiere a la facilidad de lectura del programa en conjunto y esto lo conseguimos a través de los comentarios y sobre todo facilidad para el propio programador y para otros.

    • SENCILLEZ: hacer las cosas lo más fáciles posibles.

    • EFICIENCIA: usar adecuadamente los recursos del sistema; Hay que buscar la armonía entre la sencillez y la eficiencia.

    • MODULARIDEZ: consiste en coger el programa grande y dividirlo en programas más pequeños, es decir, en módulos, 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 compilación es una de las fases más importantes en la elaboración 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 través de un compilador y mediante la consulta de una serie de tablas.

    Estas tablas funcionan como un diccionario. El compilador toma una instrucción y busca en la tabla su código binario correspondiente. A continuación, sustituye la instrucción por su código binario en el programa objeto. Este proceso se repite para cada una de las instrucciones que forman el programa.

    Puesto que cada lenguaje de programación utiliza instrucciones con formato diferente, cada lenguaje de programación tiene su propio compilador.

    La compilación permite la detección de todo tipo de errores para su posterior corrección 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 compilación, se genera igualmente un programa objeto por supuesto inservible y además una lista de errores que indica la línea de código fuente en que fue detectado el error y el tipo.

    Estos errores se llaman errores sintácticos.

    Una vez que hemos escrito y compilado el programa, es decir, después de la creación de los módulos solo queda unirlos mediante un enlazador cuyas dos tareas son: enlazar los módulos en código maquina y convertir esos módulos en un programa ejecutable.

    Y después de la obtención de un programa ejecutable, sin errores de compilación ni de enlazado viene la parte más difícil: comprobar a través de la depuración que el programa funciona bien; o sea, que no contiene errores lógicos, es decir, errores que se producen en los ordinogramas y en la codificación y tienen como resultado un funcionamiento incorrecto del programa.

    A través de un depurador se obtiene un programa libre de errores, es decir, depurado.

    'Fundamentos de programación'

    'Fundamentos de programación'

    'Fundamentos de programación'

    El compilador interpreta el programa dando lugar a un archivo de código objeto del programa inicial. A continuación se enlaza para producir un archivo ejecutable.

    Este enlazador tiene como misión unir los módulos del programa que han sido compilados anteriormente y las funciones de la biblioteca del compilador C.

    Una función biblioteca es una función 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 minúscula

    Las palabras clave no se pueden utilizar como identificadores,

    Estas son:

    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 ,carácter de subrayado y digitos, si bien el primer carácter debe ser una letra o un subrayado nunca un digito.

    Es importante saber que en C las minúsculas y las mayúsculas son diferentes.

    Conviene elegir nombres cuyo significado se identifique fácilmente con el propósito del identificador. Por consiguiente, suelen ser más recomendables los nombres largos para los identificadores.

    Habitualmente se utilizan las mayúsculas para los nombres de las constantes y las minúsculas para los nombres de las variables.

    Separadores: En C se consideran separadores los espacios en blanco, los tabuladores, los cambios de línea 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 programación se aplica a los valores usados en un programa y que se pueden calcular en tiempo de compilación.

    Las constantes no solo son numéricas (enteras, fraccionarias…) también pueden existir constantes que sean caracteres (letras) o palabras.

    Las llamadas constantes simbólicas son un nombre que sustituye una secuencia de caracteres la cual puede ser representada por:

    Una constante numérica

    Una constante de caracteres

    Una constante de cadena de caracteres

    Cuando se compila un programa cada aparición de la constante simbólica se sustituye por la secuencia de caracteres.

    Las constantes tienen que declararse al principio y se escriben en mayúsculas para diferenciarlas de las variables

    Representación:

    • 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 operación (según 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 :

    total=224-23;

    - 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= -

    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

    O. MONARIOS

    (también llamados de incremento y decremento)

    ++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 después de ser utilizada, es el llamado modo sufijo.)

    --i

    i--

    (cont=cont-1 : --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 asignación.)

    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)

    OPERADOR CONDICIONAL

    Es un operador ternario es decir con tres 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:

    ( ) [ ] &

    --,++,~,! ^

    *,/,% |

    +,- &&

    <<,>> ||

    <,<=,>.>= ?:

    ==,!= /=,*=,-=,+=,=

    TIPOS DE DATOS

    Los tipos de datos básicos 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 carácter. 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:

    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 tamaños 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 declaración 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

    • 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 función permite leer datos de la entrada estándar, es decir, el teclado y almacenar el resultado de la lectura en las variables que recibe como argumento.

    Se utiliza para introducir cualquier combinación de valores numéricos, caracteres sueltos o cadenas de caracteres. Según 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)

    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 según 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 carácter 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 parámetros en las funciones diremos que una variable se pasa por referencia cuando va precedida del operador & en la llamada a una función.

    Cada elemento de la lista de argumentos debe tener su especificación en el formato.

    La funcion Scanf devuelve el control cuando recibe un carácter nulo o de terminacion (pulsar INTRO despues de leer el dato) o bien cuando se produce un error en la conversion.

    • GETCHAR: esta función mucho más sencilla que la anterior no tiene argumentos y simplemente devuelve el carácter leido en forma de entero sin signo.

    Es una función que lee un carácter del dispositivo de entrada estándar, es decir, el teclado.

    Se declara antes la variable donde lo vamos a guardar y luego coge su contenido

    El prototipo de esta función es: Variable getchar (argumentos);

    Char x;

    X= getchar( );

    • GETS: Función 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 línea; [20] ( tengo una variable llamada línea que como mucho tiene 20 caracteres)

    Gets (línea); ( con Scanf seria así: Scanf (“%S”, línea); )

    Otras funciones de entrada son getch( ) y getche ( ).

    SALIDA:

    • PUTCHAR: Es una función simétrica a getchar que nos saca un carácter por pantalla sin salto de linea

    Sintaxis: Char letra;

    Putchar (letra);

    • PRINTF: Es una función que básicamente 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 función 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 función que el carácter que le acompaña 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 función la cadena con el formato de los argumentos contiene los comandos que le indican a la función 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

    Carácter.

    Entero Decimal

    Flotante en Notación científica

    Real decimal

    Octal

    Cadena de caracteres

    Entero Decimal sin signo (unsigned)

    Hexadecimal

    Entero

    Entero largo

    Puntero

    Entero hexadecimal sin signo

    Lo que hace la función printf( ) cuando se la llama es analizar la cadena de formato. Todos los caracteres imprimibles, los que no estén 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 según dicho formato. Los comandos de formato y los argumentos deberán coincidir de izquierda a derecha. La cantidad de comandos de la cadena de formato le indica a la función cuantos argumentos debe esperar.

    Esta función nos saca mensajes de información por ejemplo:

    Printf(“introduce dos valores/n”);

    Cuando utilizamos la contrabarra el cursor pasa línea.

    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 atrás); \r (retorno de carro); \t (avance de carro); \0(null);…………..

    • PUTS: Esta función escribe una cadena de caracteres por pantalla seguida por un salto de linea es decir no es necesario añadir \n al final de la cadena , lo añade 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 línea [20];

    Puts (línea)

    SENTENCIAS DE CONTROL DE UN PROGRAMA

    Las sentencias se corresponden con las instrucciones vistas en el pseudo código, 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 próxima sentencia a ejecutar…….

    TIPOS:

    • SENTENCIAS DE SELECCIÓN: 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 función del valor booleano de una expresión.

  • Su sintaxis es:

    If (condición)

    {

    sentencia1;

    }

    else

    {

    sentencia 2;

    }

    También es posible que dentro de cada sentencia haya otra estructura if-else es lo que se llama anidamiento

    En el caso de que no halle ninguna sentencia sino se cumpliese la condición no haría 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 “según” del pseudo código que permite la elección de uno o varios casos. Es llamada la funcion de la selecion multiple.

  • El switch evalúa la expresión que debe ser obligatoriamente entera, que se proporciona entre paréntesis y compara su valor con todos los casos.

    La ejecución de sentencias comenzara en el caso en que el valor de la expresión 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 ejecución de las sentencias de un bucle haciendo que se evalúe de nuevo la condición, esta sentencia no tiene sentido en un switch) En el caso de que el valor de la expresión no coincida con ningún caso se ejecutara la sentencia del caso marcado como default que puede no existir, es decir, es opcional. No hay limitación en el n° de casos ni en las sentencias de cada uno.

    Sintaxis:

    Switch (expresión)

    {

    case 1:

    sentencia 1;

    break ;

    case n

    sentencia n;

    break;

    default:

    sent1;

    sent n;

    Break;

    }

    • SENTENCIAS DE ITERACIÓN:

    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 propósito

  • Do-while: ejecuta en primer lugar la sentencia y luego evalúa la expresión. Si al volver a evaluar la expresión esta sigue siendo cierta, se ejecuta la sentencia de nuevo y así sucesivamente hasta que se dé lo contrario. Esta función coincide con la estructura “repetir” del pseudo código.

  • La sintaxis es la siguiente:

    Do

    {

    sent 1;

    sent n;

    }

    while (condicion);

  • While: Permite repetir una sentencia mientras una determinada expresión 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 código

    Su sintaxis es:

    While (expresión)

    {

    Sentencia:

    }

  • 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 do-while, antes de alcanzar el valor terminal que determina la salida de los mismos.

    En caso de estar en sentencias anidadas lo que hace es salir incondicionalmente de las mas interna.

    Es sintacticamente correcta usarla en cualquier bucle, pero atenta contra la programacion estructurada y hace dificil mantener y leer los programas puesto que se esta añadiendo 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 diseño, fuese estrictamente necesario salir de un bucle, disponemos de una estructura menos agresiva que el BREAK;.

    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 carácter `#'.

    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 inclusión de archivos que permiten incluir otros ficheros tanto del usuario como del fabricante. Estos archivos contienen la declaración 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 información de utilidad para el programa.

    Ejemplo :

    #include <stdio.h>

    #include “stdio.h”

    #include “a:stdio.h” busca en el disco a:

    incluimos ficheros porque estos contienen la informacion necesaria . por ejemplo el “stido.h” contiene tipos y macros necesarias para la entrada/salida standard.

    “math.h” declara prototipos para funciones matematicas. Etc…

    • 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 carácter y cadenas, empleando apostrofes para los primeros y comillas para los segundos.

    La expresion situada detrás de #define que se utilizara en todo el listado se denomina identificador.la expresion que lo sigue es el valor que sustituira al identificador durante la ejecucion del programa y se le denomina texto. El identificador esta separado del texro mediante un espacio en blanco. Por convenio el identificador se escribe en mayusculas.

    Ejemplos :

    #define PI 3,14;

    #define ESS `S'

    Otra utilidad seria; supongamos que en un programa se necesita imprimir un mensaje error, en varios lugares de un programa. Se puede crear la diractiva:

    #define ERROR printf (“\n *** ERROR***\n”)

    si en el programa aparece: if (estado>dato)

    error;

    ahora error se sustituiria por printf(“\n***ERROR***\n”)

    Void main ( )

    La funcion main es la funcion principal que aparece en la cabecera de un programa. Es el punto de entrada al programa y el punto de salida. Solo se puede utilizar una unica vez en cada programa, ya que si se usa mas veces el compilador no reconoce cual es el que indica el comienzo. Los parentesis indican que hacemos referencia a una funcion.

    Según 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 instrucción.

    }

    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. Señalan 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 diseñada 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 pequeños 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 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 ( ).

    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 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 instrucción 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”);

    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=5-n;

    pintf(“la distancia es %d”, d);

    return;

    }

    }

    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;

    }

    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

    {

    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);

    }

    if (introducidos!=0)

    {

    media=suma/introducidos;

    printf ("la media es %f y la suma es %f\n", media, suma);

    }

    }

    • Programa que determine la cantidad a pagar por una llamada telefonica dependiendo de: toda llamada que dura - de 3 minutos tiene un coste de 10 pts, cada minuto mas es un paso de contador y cuesta 5 pts mas.

    #include<stdio.h>

    void main ()

    {

    float tiempo,dinero=0,contador=0;

    do

    {

    printf ("dame el tiempo\n");

    scanf("%f",&tiempo);

    }

    while (tiempo<=0);

    if (tiempo <=3)

    {

    dinero=10;

    }

    else

    {

    contador=4;

    dinero=10;

    while (contador<=tiempo)

    {

    dinero=dinero+5;

    contador=contador+1;

    }

    }

    printf ("el coste es %f\n",dinero)

    }

    • Programa que permita dar elegir al usuario la opcion de calcular el area o la longitud de una circunferencia.

    #include <stdio.h>

    #define PI 3.1416

    void main ()

    {

    float superficie=0, area=0, radio;

    int n;

    printf ( " si quiere hacer el area pulse 1, si quiere hacer la superficie pulse 2");

    scanf ( "%d", &n);

    switch (n)

    {

    case 1:

    do {

    printf ("dame el puto radio");

    scanf ("%f",&radio);

    if (radio<=0)

    printf("Radio no vale");

    }

    while (radio<=0);

    area=PI*radio*radio;

    printf("el resultado es %f",area);

    break;

    case 2:

    do {

    printf ("dame el radio");

    scanf ( "%f", &radio);

    if (radio<=0)

    printf (" radio no vale");

    }

    while (radio<=0);

    superficie = 2*PI*radio;

    printf ("el resultado es %f",superficie);

    break;

    default:

    printf (" pedazo de gilipollas, te hemos dicho que metas el 1 o el 2 este numero te lo puedes meter por el culo");

    break;

    }

    }

    • Diseñar 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;

    float media=0;

    do

    {

    printf("dame un numero\n");

    scanf("%d",&n);

    }

    while(n<0);

    while (leidos!=10)

    {

    leidos=leidos+1;

    if(n%2==0)

    {

    printf ("este numero es par \n");

    pares=pares+1;

    }

    else

    {

    suma=suma+n;

    impares=impares+1;

    }

    do

    {

    printf("dame un numero\n");

    scanf("%d",&n);

    }

    while(n<0);

    }

    printf("%d\n",pares);

    if (impares!=0)

    {

    media=suma/impares;

    printf ("la media es %f\n",media);

    }

    }

    • Programa que nos muestre el salario de un trabajador teniendo en cuenta que trabajan 5 dias a la semana y los turnos se pagan asi:

    Turno mañana=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 ma¤ana pulse 1 , si es de tarde pulse 2, y si es de noche pulse cualquier otro valor\n");

    scanf("%d", &turno);

    if (turno==1)

    {

    sueldo=sueldo+horas*600;

    }

    else

    {

    if (turno==2)

    {

    sueldo=sueldo+horas*800;

    }

    else

    {

    sueldo=sueldo +horas*1000;

    }

    }

    dias=dias+1;

    }

    printf("el sueldo es %d",sueldo);

    }

    #include <stdio.h>

    void main()

    {

    int dias=1, sueldo=0,turno,horas;

    for (dias=1;dias<=5;dias++)

    {

    printf ("dame las horas\n");

    scanf ("%d", &horas);

    printf("si el turno que usted tiene es de ma¤ana pulse 1 , si es de tarde pulse 2, y si es de noche pulse cualquier otro valor\n");

    scanf("%d", &turno);

    if (turno==1)

    {

    sueldo=sueldo+horas*600;

    }

    else

    {

    if (turno==2){

    sueldo=sueldo+horas*800;

    } else {

    sueldo=sueldo +horas*1000;

    }

    }

    }

    printf("el sueldo es %d",sueldo);

    }

    • Programa que nos pida que escribamos numeros que comprenden del 1 al 4 inclusives 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;

    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

    {

    printf ("dime el tiempo del corredor\n");

    scanf ("%d",&tiempo);

    total=total+tiempo;

    if (tiempo<tiempo_minimo)

    {

    ganador=dorsal;

    tiempo_minimo=tiempo;

    }

    dorsal=dorsal+1;

    }

    while (dorsal<=10);

    total=total/10;

    printf ("el ganador es el dorsal %d\n", ganador);

    printf("el tiempo minimo recorrido es %d minutos\n",tiempo_minimo);

    printf("el tiempo medio total es %d minutos\n", total);

    sound (200);delay(500);nosound();delay(50);

    sound (290);delay(500);nosound();delay(70);

    sound (200);delay(520);nosound();delay(89);

    sound (200);delay(500);nosound();delay(50);

    sound (200);delay(500);nosound();delay(50);

    sound (200);delay(500);nosound();delay(50);

    sound (200);delay(500);nosound();delay(50);

    sound (100);delay(3000);nosound();delay(50);

    gotoxy (29,3);

    textcolor (YELLOW+BLINK);

    cprintf ("\n\n\n -craked by abel - \n\n\n");

    }

    • EUROCALCULADORA

    #include <stdio.h>

    #include <math.h>

    #include <conio.h>

    #include <dos.h>

    #include <process.h>

    #define euro 166.386

    void main ()

    {

    float num,suma=0,resta=0,multip=1,division=0,raiz=0,div1,div2,r1,minuendo,sustra endo,euros,ptas,total;

    int menu,c=1,sumandos,menu2,menu3,menu4;

    char nombre[10];

    textcolor(GREEN);

    clrscr ();

    sound(170);delay(500);nosound();delay(50);//EL PRIMER DELAY ES LA DURACION DEL SONIDO, Y EL SEGUNDO LA DURACION DEL SILENCIO ENTRE SONIDO Y SONIDO sound(170);delay(100);nosound();delay(50);

    sound(170);delay(100);nosound();delay(50);

    sound(340);delay(1000);nosound();

    gotoxy(29,3);

    printf("SOY DORA LA EUROCALCULADORA");

    gotoxy(25,7);

    printf("ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ\n");delay (150);gotoxy(25,8);

    printf("ÛÛÛ ÛÛÛ\n");delay (150);gotoxy(25,9);

    printf("ÛÛÛ ÛÛÛ\n");delay (150);gotoxy(25,10);

    printf("ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ\n");delay (150);gotoxy(25,11);

    printf("ÛÛÛ 7 ÛÛÛ 8 ÛÛÛ 9 ÛÛÛ ( ÛÛÛ ) ÛÛÛ\n");delay (150);gotoxy(25,12);

    printf("ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ\n");delay (150);gotoxy(25,13);

    printf("ÛÛÛ 4 ÛÛÛ 5 ÛÛÛ 6 ÛÛÛ x ÛÛÛ / ÛÛÛ\n");delay (150);gotoxy(25,14);

    printf("ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ\n");delay (150);gotoxy(25,15);

    printf("ÛÛÛ 1 ÛÛÛ 2 ÛÛÛ 3 ÛÛÛ + ÛÛÛ - ÛÛÛ\n");delay (150);gotoxy(25,16);

    printf("ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ\n");delay (150);gotoxy(25,17);

    printf("ÛÛÛ . ÛÛÛ+/-ÛÛÛ 9 ÛÛÛ = ÛÛÛ C ÛÛÛ\n");delay (150);gotoxy(25,18);

    printf("ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ\n");delay (150);gotoxy(25,19);

    printf("ÛÛÛÛÛ");

    textcolor(RED+BLINK);

    cprintf(" EUROCALCULADORA DORA ");

    textcolor(GREEN);

    cprintf("ÛÛÛÛÛ\n");delay (50);gotoxy(25,20);

    printf("ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ\n");

    gotoxy(30,23);

    textcolor(WHITE+BLINK);

    cprintf("- Cracked by ABEL -");

    getch();

    textcolor(LIGHTGRAY);

    clrscr ();

    printf("\n - DIME TU NOMBRE: ");

    scanf("%s",&nombre);

    clrscr ();

    printf("\n\n HOLA %s, YO SOY DORA LA EUROCALCULADORA",nombre);

    printf("\n\n - Cracked by ABEL -");

    printf("\n\n\n\n\nSupongo que has entrado en este programa para algo asi que elige una opcion:");

    printf("\n\n\n - Pulsa 1 para hacer una SUMA.\n - Pulsa 2 para hacer una RESTA.\n - Pulsa 3 para hacer una MULTIPLICACION.\n - Pulsa 4 para hacer una DIVISION.\n - Pulsa 5 para hacer una RAIZ CUADRADA.\n - .

    Pulsa 6 para realizar un CAMBIO DE MONEDA.\n - Pulsa 7 para realizar operaciones TRIGONOM£TRICAS.\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);

    printf("\nIntroduce el sustraendo: ");

    scanf("%f",&sustraendo);

    resta=minuendo-sustraendo;

    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) {

    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);

    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");

    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 {

    }

    }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;

    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);

    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;

    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);

    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++;

    }

    }

    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)

    {

    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)

    {

    printf ("Numero incorrecto\n""Introduce un numero mayor que cero\n");

    scanf("%d",&n);

    }

    for (variable=1;variable<=n;variable++)

    {

    if (n%variable==0)

    {

    printf("Divisor= %d\n",variable);

    }

    }

    }

    • Programa que teniendo en cuenta el suceso de que ha habido una carrera en la que participaban 10 corredores, te diga quien ha sido el ganador y que tiempo ha recorrido y diga cual es la media del tiempo total corrido por los 10 corredores. Pero con un for.

    #include <stdio.h>

    void main()

    {

    int ganador=0, total=0, tiempo_minimo=10000,tiempo,dorsal;

    for (dorsal=1 ;dorsal<=10;dorsal++)

    {

    printf ("dime el tiempo del corredor\n");

    scanf ("%d",&tiempo);

    total=total+tiempo;

    if (tiempo<tiempo_minimo)

    {

    ganador=dorsal;

    tiempo_minimo=tiempo;

    }

    }

    total=total/10;

    printf ("el ganador es el dorsal %d\n", ganador);

    printf("el tiempo minimo recorrido es %d minutos\n",tiempo_minimo);

    printf("el tiempo medio total es %d minutos\n", total);

    }

    • Programa que nos haga el potencial de un numero teniendo en cuenta que su exponente puede ser positivo o negativo.

    #include <stdio.h>

    void main (){

    int n,exponente,exp;

    float pot=1;

    printf ("Introduce la base\n");

    scanf("%d",&n); while (n<=0)

    {

    printf("La base introducida no es valida\n" "Introduce un numero mayor que cero\n");

    scanf("%d",&n);

    }

    printf ("Introduce el exponente\n");

    scanf ("%d",&exponente);

    if (exponente==0)

    {

    printf ("el resultado es %d\n",pot);

    }

    else

    {

    if(exponente<0)

    {

    for (exp=-1;exp>=exponente;exp=exp-1)

    {

    pot=pot*n;

    }

    pot=1/pot;

    printf ("El resultado es %f",pot);

    }

    else

    {

    for (exp=1;exp<=exponente;exp++)

    {

    pot=pot*n;

    }

    printf("El resultado es %f\n",pot);

    }

    }

    }

    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;

    {

    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)

    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.

    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 FUNCIÓN "POR VALOR "

    Cuando se le pasa un valor a una función mediante un argumento actual, se copia el valor del argumento actual al argumento formal de la función (el formal es el que ponemos en la declaración de la función) por lo tanto se puede modificar el valor del argumento formal dentro de la función , pero el valor del argumento actual en el punto de la llamada a la función 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' quedar¡a 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 ningún problema (usamos el argumento a en ambas funciones).

    Ventaja : Permite proporcionar una expresión ( a*2+4....)como argumento actual

    Problema : Impide que se transfiera información desde la función hacia el punto de llamada mediante los argumentos, por lo tanto al transferencia de información sólo se realiza en un sentido, desde el punto de la llamada hacia la función.

    N - LA FORMA DE PASAR INFORMACIÓN 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 FUNCIÓN UN VALOR DETERMINADO CON EL QUE TRABAJAMOS EN ESE MOMENTO.

    A la hora de pasar parámetros a la función en c hay que tener en cuenta que todos se pasan por valor, es decir, se pasa una copia temporal del parámetro, no el parámetro en si.

    Esto significa que la función no puede modificar las variables externas a ella, ya que le ha sido pasada una copia y no el valor original. Un parámetro por valor se pude entender como una variable local, de modo que dentro de la función puede cambiar su valor pero los cambios no tienen efecto fuera de ella.

    Sin embargo, en la mayoría de las ocasiones, lo que queremos es que los parámetros que pasamos a la función cambien de valor. Para conseguir eso, lo que debemos de usar es el paso de parámetros por referencia. Quiere esto decir que lo que se pasa a la función no es una copia del parámetro sino el argumento.

    El paso de parámetros por referencia es sinónimo en C de paso de direcciones de memoria, es decir la función conoce la dirección de memoria donde están almacenados los parámetros 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 parámetros a modificar.

    #include <stdio.h>

    void modificar ( *a )

    int a;

    {

    *a= *a * 3;

    printf("%d", *a);

    return;

    }

    void main ()

    {

    int a=2;

    printf ( "%d", a);

    modificar (&a) ;

    printf ( "%d", a);

    }

    Resultado=266.

    ¿Qué ha ocurrido? .En primer lugar, sigue siendo cierto que en C todos los parámetros se pasan por valor. Pero en este caso lo que se ha pasado a la función no ha sido el contenido de las variables, lo que se ha pasado ha sido la dirección de memoria de la variable “a” .

    Dichas direcciones se no varían al salir de la función sino lo que se ha modificado ha sido el contenido de esa dirección de memoria. Dentro de la función se trabaja con las direcciones como punteros.

    Un aspecto muy importante relacionado con el paso de parámetros por referencia es el retorno de valores por parte de una función. Sabemos que en C una función 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 función 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 función MAIN , son privadas a esa función, es decir, son variables locales de función main. Esto implica que ninguna otra función 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 ningún problema. (Ejemplo: los contadores i,j).

    Las variables locales empiezan a existir cuando se llama a la función y desaparecen cuando acaba la función. Por esta razón reciben el nombre de variables automáticas las cuales aparecen y desaparecen con cada invocación de la función en las que están declaradas. para garantizar su contenido se han de inicializar al entrar a la función. en caso contrario tendrán un valor indeterminado.

    • Variables globales o externas:

    Como alternativa a las variables automáticas es posible definir variables externas a todas las funciones.

    A estas variables se las califica de globales. Cualquier función 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. Además mantienen sus valores, ya que existen permanentemente, incluso después de finalizar las funciones que las modifican, sin embargo el uso excesivo de este tipo de variables atenta contra la programación estructurada.

    Este tipo de variables, al contrario que las automáticas, no están confinadas a funciones simples. Su ámbito se extiende desde el punto de definición hasta el resto del programa, por lo tanto, serán reconocidas por más de una función y a menudo por todo el programa.

    Como las variables externas se reconocen globalmente pueden accederse desde cualquier función que caiga dentro de su ámbito, y mantendrán 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 función y este valor se puede usar accediendo a la variable en otra función distinta. El uso de éste tipo de variables permite transmitir información entre funciones sin el uso de argumentos, lo que es especialmente útil cuando una función 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;

    printf ("%d", a);

    return;

    }

    int a=0;

    void main () {

    a=2;

    printf ( "%d", a);

    funcion ();

    printf("%d", a);

    }

    resultado = error porque hay que declarar la variable antes de una

    funcion si se utiliza en esta

    • #include <stdio.h>

    void funcion ( int a ) {

    a=a*3;

    printf ("%d", a);

    return;

    }

    int a=0;

    void main () {

    a=2;

    printf ( "%d", a);

    funcion ();

    printf("%d", a);

    }

    resultado = 2 6 2

    • #include <stdio.h>

    int funcion() {

    a=a*3;

    printf ("%d", a);

    return(a);

    }

    int a=0;

    void main () {

    a=2;

    printf ( "%d", a);

    a= funcion ( a );

    printf("%d", a);

    }

    resultado = 2 6 6

    • 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;

    }

    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 (a-b,b); //van a llegar a la funcion con a=-1 y b=2 aunque a sigue valiendo 1. Ahora a y b

    son variables locales y la funcion no devuelve nada por lo que los valores de a y b no van a variar

    printf("%d%d%d\n",a,b,c);

    }

    resultado= 123,121,122,121,122;

    • 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+g-y; //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+d-c;

    y=c+g-a;

    return;

    }

    void main(){

    a=1; b=2; c=3; d=4;

    clrscr();

    cambia(b,c,d);

    printf("%d%d%d%d\n",a,b,c,d);

    cambia(b,a,c);

    printf("%d%d%d%d\n",a,b,c,d);

    getch();

    }

    resultado=1234 1234

    • Programa sobre las variable globales

    #include<stdio.h>

    int a,b,c;

    void uno(int a,int x, int y)

    {

    int b,d;

    b=x+y-a;

    d=(a*y)-(a*b);

    c=a*y-d;

    x=a*c-d;

    a=b+d+x-y;

    y=y+a+b+c+d+x;

    return;}

    void main()

    {

    a=1;

    b=2;

    c=3;

    printf("%d%d%d",a,b,c);

    uno(b,c,a);

    printf ("%d%d%d",a,b,c);

    }

    resultado= 123,124.

    • Programa sobre las variables globales

    #include <stdio.h>

    int a,b,c;

    void uno(int d, int x, int y)

    {

    b=x+y-a;

    d=(a*y)-(a*b);

    c=a*y-d;

    x=a*c-b;

    a=b+d+x-y;

    y=y+a+b+c+d+x;

    return;

    }

    void main()

    {

    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 función se llama así misma repetidas veces hasta que se satisface una condición, este proceso se utiliza para cálculos repetitivos en los que cada resultado se determina en función del anterior. Se pueden escribir de esta forma muchos problemas interactivos.

    Se tienen que satisfacer dos condiciones para resolver un problema recursivamente:

    • Que el problema se pueda escribir de forma recursiva

    • Que contenga una condición de fin para terminar con el problema.

    A veces una función 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 situación en que se ejecute la función sin volver a llamarse a si misma. Si no haces esto, la función 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 ejecución.

    Ejemplos :

    • Factorial. 4! = 4 * 3!--- 3*2!.... 2*1!..... se incluye una condición de fin cuando se llegue a 1

    #include <stdio.h>

    int facto (int a)

    {

    if (a ==1 )

    {

    return (1);

    }

    else

    return (a*facto(a-1));

    void main ( )

    {

    int n;

    scanf ( %d",&n);

    printf ( %d", facto (n));

    }

    • Potencia.

    #include<stdio.h>

    int potencia (int base,int exponente)

    {

    int resul;

    if (exponente==0)

    {

    resul=1;

    }

    else

    {

    resul=base*potencia(base,exponente-1);

    }

    return(resul);

    }

    void main ()

    {

    int base,exponente,pot;

    scanf("%d",&base);

    scanf ("%d",&exponente);

    pot=potencia (base,exponente);

    printf("%d", pot);

    }

    TEMA 7

    “ARRAYS”

    1.DEFINICION DE ARRAY

    Muchas aplicaciones requieren el procesado de muchos datos con características 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 leído ni escrito con una única sentencia, sino que se debe acceder a cada dato por separado.

    • El tamaño del array es fijo y definido a priori.

    • Para acceder a un dato dentro del array se utiliza un índice que indica la posición del dato dentro del array.

    En C un array no es mas que un conjunto de posiciones continuas de memoria. La dirección mas baja corresponde al primer elemento(esta dirección 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 n-1.

    Cada uno de los elementos del vector se trata como si fuese una variable independiente del mismo tipo que el del vector.

    2. DECLARACIÓN DE UN ARRAY

    Los arrays se definen en gran parte como las variables ordinarias, excepto que cada array debe acompañarse de una especificación de su tamaño. Para un array unidimensional el tamaño se especifica con una expresión 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 números enteros.).

    Otra forma de definirlo es usando constantes simbólicas.

    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 números entre paréntesis son el valor inicial que toma cada posición del array.

    Declaracion de un array: TIPO NOMBRE [TAMAÑO]

    INT TABLA[5]

    N=5

    ---------------------------------------------

    0 1 2 3 4

    Se debe tener en cuenta que la declaración de un array no conlleva necesariamente su inicialización, es decir, nadie nos asegura que al declarar el vector todos los elementos valgan 0

    Para ello utilizamos un FOR. sin embargo también se pude inicializar un vector al mismo tiempo que se declara(int días[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 teclearíamos: tabla[4];

    Hay que tener presente que debido a que la enumeración 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++)

    {

    printf(“dame un numero por favor”);

    scanf(“%d”,&n);

    x[i]=n;

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

    {

    printf(“el elemento de la posición %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);

    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;

    }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 simbólicas (#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 }

    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 números flotantes y calcular la media y

    escribir la desviación de cada elemento respecto a la media.

    #include <stdio.h>

    #define max 100

    void main ()

    {

    float x[max],media,desviacion,suma=0;

    int n,cont;

    clrscr();

    printf("Introduce la cantidad de numeros que vas a introducir");

    scanf("%d",&n);

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

    {

    printf("Dame un numero\n");

    scanf ("%f",&x[cont]);

    suma=suma+x[cont];

    }

    media=suma/n;

    printf("La media es %f\n",media);

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

    {

    desviacion=x[cont]-media;

    printf("posicion=%d valor=%f

    desviacion=%f\n",cont+1,x[cont],desviacion);

    }

    getch;

    }

    • Programa anterior pero con modificaciones.

    #include <stdio.h>

    #define MAX 100 //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;

    printf("\n\nLa media es: %5.2f",media); // se puede limitar el tama¤o 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++)

    {

    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]);

    }

    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

    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);

    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();

    }

    • 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<n-1;i++)

    {

    if (x[i]>x[i+1])

    {

    mayor++;

    }

    else

    {

    menor++;

    }

    }

    if (mayor==0&&menor!=0)

    {

    printf("La serie es ascendente\n");

    }

    else

    {

    if(mayor!=0&&menor==0)

    {

    printf("La serie es descendente\n");

    }

    else

    {

    printf("La serie no es ascendente ni descendente\n");

    }

    }

    }

    • 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;

    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 posici¢n x [ %d ] : ",i);

    scanf("%d", &x[i]);

    }

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

    {

    if (i==sec-1)

    {

    }

    else

    {

    if (x[i]<x[i+1])

    {

    creciente=creciente+1;

    }

    if (x[i]>x[i+1])

    {

    decreciente=decreciente+1;

    }

    }

    }

    if (creciente==sec-1)

    {

    printf("\nCreciente");

    }

    else {

    nada=nada+1;

    }

    if (decreciente==sec-1)

    {

    printf("\nDecreciente");

    }

    else

    {

    nada=nada+1;

    }

    if (nada==2)

    {

    printf("\nSecuencia Indeterminada");

    }

    getch();

    }

    • Programa que dadas dos secuencias nos diga si existen dos números "f" y "g"

    que cumplan que |f-g|<9 La función que hace el valor absoluto es "abs(numero)"

    y la biblioteca es #include <stdlib.h>

    #include <stdio.h>

    #define MAX 100

    #include <stdlib.h>

    void main()

    {

    int n,i,x[MAX],y[MAX],j;

    do

    {

    printf ("Introduce la longitud de la secuencia\n");

    scanf("%d",&n);

    }

    while(n<=0);

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

    {

    printf("Primera secuencia.\nElemento %d\n",i+1);

    scanf("%d",&x[i]);

    }

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

    {

    printf("Segunda secuencia.\nElemento %d\n",j+1);

    scanf("%d",&y[j]);

    }

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

    {

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

    {

    if (abs(x[i]-y[j])<9)

    {

    printf("Los numeros %d %d cumplen la

    funcion\n",x[i],y[j]);

    }

    }

    }

    }

    • meto dos secuencias y busca combinaciones que cumplan |f-g|<9

    #include <stdlib.h>

    #include <stdio.h>

    #define MAX 100

    void main ()

    {

    int x[MAX],x2[MAX], numero,sec2=0, sec=0,i=0, u=0,combinaciones=0;

    do

    {

    printf("\nDime cuantos numeros tiene el vector1 : ");

    scanf("%d", &sec);

    }while (sec<=0);

    do

    {

    printf("\nDime cuantos numeros tiene el vector2 : ");

    scanf("%d", &sec2 );

    } while (sec<=0);

    printf("\nPRIMERA SECUENCIA");

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

    {

    printf("\nDime el numero de la posicion x [ %d ] : ", i);

    scanf("%d",&x[i]);

    }

    printf("\nSEGUNDA SECUENCIA");

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

    {

    printf("\nDime el numero de la posicion x2 [ %d ] : ", i);

    scanf("%d",&x2[i]);

    }

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

    {

    for (u=0;u<sec2;u++)

    {

    if ( (abs(x[i])-(x2[u])) < (9) )

    {

    combinaciones=combinaciones+1;

    printf("\nCombinacion %d, %d - %d = %d ",

    combinaciones, x[i], x2[u], abs(x[i]-x2[u]));

    }

    }

    }

    if (combinaciones>0)

    {

    printf("\nHay %d combinaciones", combinaciones);

    }

    getch();

    }

    • Igual que el ejercicio anterior pero de forma que cada vector pueda tener

    distinta longitud.

    #include <stdio.h>

    #include <stdlib.h>

    #define MAX 100

    void main()

    {

    int n,i,x[MAX],y[MAX],j,m;

    do

    {

    printf ("Introduce la longitud de la primera secuencia\n");

    scanf("%d",&n);

    }

    while(n<=0);

    do

    {

    printf ("Introduce la longitud de la seguda secuencia\n");

    scanf("%d",&m);

    }

    while (m<=0);

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

    {

    printf("Primera secuencia.\nElemento %d\n",i+1);

    scanf("%d",&x[i]);

    }

    for(j=0;j<m;j++)

    {

    printf("Segunda secuencia.\nElemento %d\n",j+1);

    scanf("%d",&y[j]);

    }

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

    {

    for (j=0;j<m;j++)

    {

    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 algún elemento

    en común.

    #include <stdio.h>

    #define MAX 100

    void main()

    {

    int n,x[MAX],y[MAX],m,i,j,mayor=0,menor=0,mayor2=0,menor2=0,a,b;

    do

    {

    printf ("Introduce la longitud de la primera secuencia\n");

    scanf("%d",&n);

    }while(n<=0);

    do

    {

    printf ("Introduce la longitud de la seguda secuencia\n");

    scanf("%d",&m);

    }while (m<=0);

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

    {

    printf("Primera secuencia.\nElemento %d\n",i+1);

    scanf("%d",&x[i]);

    }

    for(j=0;j<m;j++)

    {

    printf("Segunda secuencia.\nElemento %d\n",j+1);

    scanf("%d",&y[j]);

    }

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

    {

    if (x[i]>x[i+1])

    mayor++;

    else

    menor++;

    }

    if (mayor==0&&menor!=0)

    {

    printf("La primera serie es creciente\n");

    }

    else

    {

    if(mayor!=0&&menor==0)

    {

    printf("La primera serie es decreciente\n");

    }

    else

    {

    printf("La primera serie no es creciente ni

    decreciente\n");

    }

    }

    for (j=0;j<m-1;j++)

    {

    if (y[j]>y[j+1])

    {

    mayor2++;

    }

    else

    {

    menor2++;

    }

    }

    if (mayor2==0&&menor2!=0)

    {

    printf("La segunda serie es creciente\n");

    }

    else

    {

    if(mayor2!=0&&menor2==0)

    {

    printf("La segunda serie es decreciente\n");

    }

    else

    {

    printf("La segunda serie no es creciente ni

    decreciente\n");

    }

    }

    if((mayor==0)&&(mayor2==0))

    {

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

    {

    for (b=0;b<m;b++)

    {

    if(x[a]==y[b])

    {

    printf("Entre la primera serie y la segunda

    es comun el valor %d",x[a]);

    }

    }

    }

    }

    else

    {

    printf("Las dos series no tienen ningun valor en comun.\n");

    }

    }

    • Dos secuencias crecientes , ver si tienen algun elemento en comun.

    #include <stdio.h>

    #define MAX 100

    void main ()

    {

    int x[MAX],x2[MAX], i=0, sec, creciente=1, decreciente=1, salida=0;

    int u=0, sec2, creciente2=1,combinaciones=0;

    clrscr();

    do

    {

    printf("\nDime cuantos numeros va a tener la secuencia1: ");

    scanf("%d", &sec);

    }while (sec<=0);

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

    {

    printf("\nDime un valor para la posicion x [ %d ] : ",i);

    scanf("%d", &x[i]);

    if (i==10||i==20||i==30)

    {

    printf("Pulsa cualquier tecla para continuar...");

    clrscr();

    }

    }

    for (i=0;i<sec-1;i++)

    {

    if (x[i]<x[i+1])

    else

    {

    creciente=0;

    i=sec-1;

    }

    }

    if (creciente==1)

    {

    printf("\nLa secuencia 1 es Creciente\n\n");

    }

    else

    {

    for (i=0;i<sec-1;i++)

    {

    if (x[i]>x[i+1])

    {

    }

    else

    {

    decreciente=0;

    i=sec-1;

    }

    }

    if (decreciente==1)

    {

    printf("\nLa secuencia 1 es Decreciente");

    }

    else

    {

    printf("\nLa secuencia 1 es indefinida");

    }

    }

    decreciente=1;

    getch();

    clrscr();

    do {

    printf("\nDime cuantos numeros va a tener la secuencia2: ");

    scanf("%d", &sec2);

    }while (sec2<=0);

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

    {

    printf("\nDime un valor para la opsici¢n x2 [ %d ] : ",i);

    scanf("%d", &x2[i]);

    if (i==10||i==22||i==33)

    {

    printf("\nPulsa cualquier tecla para continuar");

    clrscr();

    }

    }

    for (i=0;i<sec2-1;i++)

    {

    if (x2[i]<x2[i+1])

    {

    }

    else

    {

    creciente2=0;

    i=sec2-1;

    }

    }

    if (creciente2==1)

    {

    printf("\nLa secuencia 2 es Creciente\n\n");

    }

    else

    {

    for (i=0;i<sec2-1;i++)

    {

    if (x2[i]>x2[i+1])

    {

    }

    else

    {

    decreciente=0;

    i=sec2-1;

    }

    }

    if (decreciente==1)

    {

    printf("\nLa secuencia 2 es Decreciente\n");

    }

    else {

    printf("\nLa secuencia 2 es indefinida\n");

    }

    }

    printf("\nPulse cualquier tecla para continuar ....");

    getch();

    if (creciente==1&&creciente2==1)

    {

    clrscr();

    printf("\n *******: COMBINACIONES :***** \n");

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

    {

    for (u=0;u<sec2;u++)

    {

    if (x2[i]==x2[u])

    {

    printf("\nLa posici¢n X [ %d ] de la

    secuencia 1 vale %d \n\ry la posici¢n 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

    {

    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 tamaño) las operaciones de asignación, de comparación 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 tamaño del array.

    4.OPERACIONES CON ARRAYS

    • Metodos de ordenacion de los elementos de un vector

    1-METODO 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++)

    {

    for (j=MAX-1;j>=i;j--)

    {

    if ( tabla[j]<tabla[j-1])

    {

    temp=tabla[j];

    tabla[j]=tabla[j-1];

    tabla[j-1]=temp;

    }

    }

    }

    printf ( " \n Ordendado ");

    for ( j = 0 ; j < MAX ; j++ )

    printf("\n Elemento %d ; %d", j+1, tabla [ j ] );

    getch();

    }

    2.-SELECCIÓN DIRECTA

    #include <stdio.h>

    #define MAX 4

    int tabla [MAX]= { 4,3,5,2 } ;

    void main ()

    {

    int i,j,k,temp;

    for ( k = 0 , k < MAX - 1 ; k ++ )

    {

    i = k ;

    temp = tabla [ k ];

    for ( j = k+1 ; j < MAX ; j++ )

    {

    if ( tabla [ j ] < temp )

    {

    i = j ;

    temp = tabla [ i ] ;

    }

    }

    tabla [ i ] = tabla [ k ] ;

    tabla [ k ] = temp ;

    }

    printf ( " \n Ordenado ");

    for (j = 0 ; j < MAX ; j ++ )

    {

    printf ( " \n Elemnto %d ; %d ", j + 1 , tabla [ j ] );

    }

    }

    3.-INSERCCIÓN DIRECTA

    #include <stdio.h>

    #define MAX 4

    int tabla[MAX] = { 4,3,5,2};

    void main ( ) {

    int j,k,temp;

    for (j=1; j < MAX ; j++ ) {

    temap = tabla [ j ] ;

    k = k - 1;

    while (tabla [ k ] > temp && k > 0 )

    {

    tabla [k+1] = tabla [k];

    k = k-1 ;

    }

    if ( tabla [k] > temp ) {

    tabla [ k+1] = tabla [ k ] ;

    k = k-1;

    }

    else {

    tabla [k+1] = temp;}

    printf (" \n Ordenado ");

    for ( j =0; j< MAX; j++) {

    printf("\n Elemento %d ; %d ", j + 1, tabla [ j ] );

    }

    }

    5. PASO DE ARRAYS A FUNCIONES

    El nombre de un Array se puede usar como argumento de una función permitiendo que el array completo sea pasado a la función.

    Para pasar un Array, su nombre debe aparecer solo, sin corchetes ni índices, como un argumento actual dentro de la llamada a la función. El correspondiente argumento formal se pone: el nombre del Array con dos corchetes vacíos.

    El tamaño no se especifica dentro de la declaración formal.

    “para pasar un array a una función se le pasa el nombre del array, es decir se pasa la dirección del comienzo del array. Esto significa que todas las operaciones que se realizan sobre el array mientras esta dentro de la función afectan al array fuera de la función.”

    • Vamos a declarar un array de cinco posiciones enteras y los vamos a llenar con valores a través de una función e imprimirles a través de otra función.

    #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 información a las funciones.

    #include <stdio.h>

    #define MAX 100

    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("\nTamaño");

    scanf("%d", &numero);

    }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);

    }

    int creciente (int x[],int sec)

    {

    int i=0,signo=1;

    for (i=0;i<sec-1;i++)

    {

    if (x[i]<x[i+1])

    {

    }

    else

    {

    signo=0;

    }

    }

    return(signo);

    }

    int decreciente (int x[], int sec )

    {

    int i=0, signo=1;

    for (i=0;i<sec-1;i++)

    {

    if (x[i]>x[i+1])

    {

    }

    else

    {

    signo=0;

    }

    }

    return(signo);

    }

    void main ()

    {

    int x[MAX], tamano, nada=0,cre=0,dec=0;

    tamano=llenar(x);

    cre=creciente(x,tamano);

    if (cre==1)

    {

    printf("\nLa secuencia es creciente");

    }

    else

    {

    nada=nada+1;

    }

    dec=decreciente(x,tamano);

    if (dec==1)

    {

    printf("\nLa secuencia es decreciente");

    }

    else

    {

    nada=nada+1;

    }

    if (nada==2)

    {

    printf("\nLa secuencia es indefinida");

    }

    getch();

    }

    • programa que haga una secuencia de números 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<m-1;i++)

    {

    if (x[i]>x[i+1])

    {

    mayor++;

    }

    else

    {

    menor++;

    }

    }

    if (mayor==0&&menor!=0)

    {

    printf("La serie es ascendente\n");

    }

    else

    {

    if(mayor!=0&&menor==0)

    {

    printf("La serie es descendente\n");

    }

    else

    {

    printf("La serie no es ascendente ni descendente\n");

    }

    }

    return;

    }

    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)

    {

    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");

    }

    else

    {

    printf("\n distintos");

    }

    return;

    }

    void main()

    {

    int x[max],y[max],tamano;

    tamano=longi();

    secuencias(x,y,tamano);

    igual_distinto(x,y,tamano);

    }

    • programa que diga si dos secuencias introducidas por teclado son iguales, pedimos la primera, luego la segunda y luego comparamos uno a uno.(son enteros)

    #include <stdio.h>

    #define MAX 100

    void main ()

    {

    int x[MAX], x2[MAX],cont1,cont2,i,signo=0;

    do

    {

    printf("\nDime cuantos numeros tienen las secuencias: ");

    scanf("%d",&cont1);

    }while (cont1<=0);

    printf("\nPRIMERA SECUENCIA");

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

    {

    printf("\nDime el valor: ");

    scanf("%d",&x[i]);

    }

    printf("\nSEGUNDA SECUENCIA");

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

    {

    printf("\nDime el valor: ");

    scanf("%d",&x2[i]);

    }

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

    {

    if (x[i]==x2[i])

    {

    signo=signo+1;

    }

    }

    if (signo==cont1)

    {

    printf("\nIGUALES");

    }

    else

    {

    printf("\nDISTINTAS");

    }

    getch();

    }

    • Programa que me diga si dos secuencias crecientes tienen algún elemento en común.

    #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)

    {

    int i,mayor=0,menor=0;

    for (i=0;i<n-1;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*/

    }

    }

    }

    void comparar(int x[],int y[],int n,int m)

    {

    int a,b;

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

    {

    for (b=0;b<m;b++)

    {

    if(x[a]==y[b])

    {

    printf("Entre la primera serie y la segunda es

    comun el valor %d\n",x[a]);

    }

    }

    }

    return;

    }

    void main()

    {

    int longitud1,longitud2,x[MAX],y[MAX],resultado1=0,resultado2=0;

    longitud1=secuencia();

    longitud2=secuencia();

    elementos (x,longitud1);

    elementos (y,longitud2);

    resultado1=crec_decrec(x,longitud1);

    resultado2=crec_decrec(y,longitud2);

    if (resultado1==1&&resultado2==1)

    {

    comparar (x,y,longitud1,longitud2);

    }

    }

    • 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<(n-1);i++){

    if(x[i]>x[i+1])

    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 tamaño\n");

    scanf("%d",&n);

    }while(n<=0);

    llena(sec1);

    llena(sec2);

    if(creciente(sec1) && creciente(sec2)){

    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 función, el número de filas no se pasa. Ejemplo: int función (int x[ ][n] ) y en el punto de llamada a la funcion no varia nada, sigue siendo asi: NOMBRE DE LA FUNCION (NOBRE DEL ARRAY) .

    EJERCICIOS:

    • Declarar dos matrices de 5 filas y 4 columnas. Llenarlas de elementos

    enteros y sacar por pantalla el resultado de sumar las dos matrices.

    #include <stdio.h>

    void main()

    {

    int x[5][4],y[5][4],z[5][4],i,j,cont=0,cont2=0;

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

    {

    for(j=0;j<4;j++)

    {

    cont++;

    printf ("Primera matriz.Valor %d\n",cont);

    scanf ("%d",&x[i][j]);

    }

    }

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

    {

    for(j=0;j<4;j++)

    {

    cont2++;

    printf ("Segunda matriz.Valor %d\n",cont2);

    scanf ("%d",&y[i][j]);

    }

    }

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

    {

    for(j=0;j<4;j++)

    {

    z[i][j]=x[i][j]+y[i][j];

    printf(" %d ",z[i][j]);

    }

    printf("\n");

    }

    }

    • Ejercicio anterior pero realizado con funciones.

    #include<stdio.h>

    void llena (int x[][4])

    {

    int i,j;

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

    {

    for(j=0;j<4;j++)

    {

    printf("Introduce valores");

    scanf("%d",&x[i][j]);

    }

    }

    return;

    }

    void suma (int a[][4],int b[][4],int c[][4])

    {

    int i,j;

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

    {

    for (j=0;j<4;j++)

    {

    c[i][j]=a[i][j]+b[i][j];

    }

    }

    return;

    }

    void imprime (int h[][4])

    {

    int i,j;

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

    {

    for (j=0;j<4;j++)

    {

    printf("%d",h[i][j]);

    }

    }

    return;

    }

    void main()

    {

    int n1[5][4],n2[5][4],res[5][4];

    llena(n1);

    llena(n2);

    suma(n1,n2,res);

    imprime(res);

    }

    • Programa que lea una matriz de "M" filas y "N" columnas y escriba el resultado de restar a cada elemento, la media aritmética de la media de su fila y de su columna.

    #include<stdio.h>

    #define MAXFILA 100

    #define MAXCOL 100

    void main ()

    {

    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;

    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++)

    {

    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++)

    {

    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);

    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]);

    }

    }

    return;

    }

    void mediafil (float x[][COL], int col, int fila, float mediafila[FIL])

    {

    int i,u;

    float suma=0;

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

    {

    for (u=0;u<col;u++)

    {

    suma=suma+x[i][u]; //calcular la media fila

    }

    mediafila[i]=suma/col;

    // printf(" %f",mediafila[i]);

    suma=0;

    }

    return;

    }

    void mediacol (float x[][COL], int col, int fila, float mediacolum[COL]) {

    int i,u;

    float suma=0;

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

    {

    for (u=0;u<fila;u++)

    {

    suma=suma+x[u][i];

    }

    mediacolum[i]=suma/fila;

    // printf("%f",mediacolum);

    suma=0;

    }

    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;

    }

    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);

    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 n£mero binario.\n");

    scanf("%d",&longitud);

    }while (longitud<=0);

    for (i=longitud-1;i>=0;i--)

    {

    printf("Introduce el digito del numero binario.\n");

    scanf("%d",&x[i]);

    if (x[i]<0||x[i]>1)

    {

    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 números 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);

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

    {

    cont++;

    printf("Introduce un valores.Valor %d\n",cont);

    scanf("%d",&x[i]);

    }

    printf("Introduce un n£mero 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 n£mero 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)

    #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 posici¢n %d del

    array\n", numero, i);

    i=n;

    signo=0;

    }

    }

    if (signo==1){

    printf("\nEl numero no esta ");

    array[n]=numero;

    n=n+1;

    }

    return;

    }

    void main()

    {

    int array[MAX],n, numero, i;

    do {

    printf("\nDime el n£mero 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>

    #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[i-1]=='s')

    {

    contador++;

    if(cont==0)

    {

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

    {

    printf("%c",texto[posicion]);

    }

    printf("\n");

    }

    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{

    linea[i]=toupper(getchar());

    i++;

    }while(linea[i-1]!='\n' && i<100);

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

    {

    printf("\n %c",linea[c]);

    f=c;

    }

    cont=0;

    for(c=0;c<f;c++)

    {

    switch(linea[c])

    {

    case 'M':

    cont=cont+1000;

    if(linea[c-1]=='C')

    {

    cont=cont-200;

    }

    break;

    case 'D':

    cont=cont+500;

    if(linea[c-1]=='C')

    {

    cont=cont-200;

    }

    break;

    case 'C':

    cont=cont+100;

    if(linea[c-1]=='X')

    {

    cont=cont-20;

    }

    break;

    case 'L':

    cont=cont+50;

    if(linea[c-1]=='X')

    {

    cont=cont-20;

    }

    break;

    case 'X':

    cont=cont+10;

    if(linea[c-1]=='I')

    {

    cont=cont-2;

    }

    break;

    case 'V':

    cont=cont+5;

    if(linea[c-1]=='I')

    {

    cont=cont-2;

    }

    break;

    case 'I':

    cont=cont+1;

    break;

    }//fin swith

    }//fin for

    printf("\n el numero es %i",cont);

    }

    • Un programa que le quite los espacios al texto que introduzcamos por teclado

    #include <stdio.h>

    #include <string.h>

    #define MAX 1000

    void main ()

    {

    char conespacios[MAX], sinespacios[MAX];

    int caracteres=0,i,u=0;

    printf("\n Escribe un texto : \n");

    gets (conespacios);

    caracteres=strlen(conespacios);

    conespacios[caracteres]='\0';

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

    {

    if (conespacios[i]!=' ')

    {

    sinespacios[u]=conespacios[i];

    u=u+1;

    }

    }

    sinespacios[u]='\0';

    printf("\n%s\n",sinespacios);

    printf("\n%s\n",conespacios);

    getch();

    }

    • 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';

    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 posici¢n 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++)

    {

    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++)

    {

    temp = array[j] ;

    k=j-1;

    while (array[ k ] > temp && k > 0 )

    {

    array[k+1] = array[k];

    k=k-1;

    }

    if ( array[k] > temp )

    {

    array[k+1] = array[k] ;

    array[k]=temp;

    }

    else

    {

    array[k+1] = temp;

    }

    }

    printf (" \n Ordenado ");

    for ( j=0; j<numero; j++)

    {

    printf("\n Elemento %d ; %d ", j+1,array[j] );

    }

    return;

    }

    void insertar ( int array[], int numero, int inst )

    {

    int i,x;

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

    {

    if (inst<=array[i])

    {

    for (x=numero+1;x>=i;x--)

    {

    array[x]=array[x-1];

    }

    array[i]=inst;

    i=numero;

    }

    }

    return;

    }

    void main ()

    {

    int sec[MAX], nsec=0,numero=0,signo=0;

    float media=0;

    do

    {

    printf("\nDime cuantos n£meros tiene la secuencia : ");

    scanf("%d", &nsec);

    } while ( nsec <= 0 );

    llenar(sec,nsec);

    media=suma(sec,nsec);

    printf("\nLa Media es %f ", media);

    printf("\n\nDime el numero que quieres buscar en el array : ");

    scanf("%d", &numero);

    ordenar (sec,nsec);

    signo=buscar ( sec,nsec,numero);

    if (signo==1)

    {

    insertar(sec,nsec,numero);

    }

    ordenar (sec,nsec+1);

    getch();

    }

    • 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("tama¤o?:");

    scanf("%d %d",&fila,&columna);

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

    {

    for(j=0;j<columna;j++)

    {

    printf("valor %d:\n",j+1);

    scanf("%d",&matriz[i][j]);

    }

    }

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

    {

    maximo=0;

    for(j=0;j<columna;j++)

    {

    if (matriz[i][j]>=maximo)

    {

    maximo=matriz[i][j];

    }

    maxf[i]=maximo;

    }

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

    {

    minimo=10000;

    for(j=0;j<fila;j++)

    {

    if(matriz[j][i]<=minimo)

    minimo=matriz[j][i];

    }

    minc[i]=minimo;

    }

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

    {

    for(j=0;j<columna;j++)

    {

    if(matriz[i][j]==minc[j]&&matriz[i][j]==minc[j])

    printf("El n§ %d de la fila %dy la columna %d es

    un punto de silla",matriz[i][j],i+1,j+1);

    }

    }

    }

    }

    TEMA 8

    “PUNTEROS”

  • PUNTEROS.CONCEPTOS BÁSICOS

  • DEFINICION: Una variable de tipo puntero es un tipo de dato cuyo valor es la dirección de almacenamiento de otro tipo de dato(variable) dentro de la memoria del ordenador, es decir una variable que contiene la dirección de otra variable.

    Dentro de la memoria, cada dato ocupa una o más celdas contiguas. El número 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 carácter)

    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 dirección 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 posición que ocupa).

    Esa dirección puede ser determinada mediante la expresión &V, donde & es un operador de dirección que proporciona la dirección del operante. Esa dirección se le puede asignar a otra variable de la siguiente forma: pv=&V

    Ahora la variable pv contiene la dirección de V, no su valor, y es una variable de tipo puntero.

    Ahora el dato que contiene V puede ser accedido de dos formas:

    • La primera es la utilizada hasta ahora: utilizando el nombre de la variable.

    • Accediendo al contenido de la dirección que guarda el puntero: *variable. El * se llama operador indirección.

    Por lo tanto *variable y variable es lo mismo es decir, v=*pv.

    En definitiva esto se resume en dos cosas:

    • "Pv" por si sólo almacena una dirección (pv=&v),

    • "v" también puede ser accedida como el contenido que guardo en esa dirección

    ( 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;

    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);

    }

    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;

    /*Direcci¢n de u=FBC

    Direcci¢n 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 ()

    {

    int i,j=25;

    int *pi,*pj=&j;

    *pj=j+5;

    i=*pj+5;

    pi=pj; /*Dirección de i=F9C*/

    *pi=i+j;

    } /*Dirección 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);

    }

    /* dirección a: 1130

    dirección b: 1134

    dirección c: 1138 */

    solucion &a=1130 &b=1134 &c=1138 pa=1130 *pa=0.002 &(*pa)=1130 pb=1134

    *pb=0.003 c=0.003

    • ¨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 dirección 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.

  • DECLARACIÓN DE PUNTEROS

  • Los punteros, como cualquier otra variable, tienen que ser declarados antes de su uso en un programa. Cuando una variable puntero es definida, su nombre debe ir precedido por un *.

    Declaración: TIPO DE DATO * NOMBRE DEL PUNTERO.

    El tipo de dato que aparece en la declaración se refiere al tipo de dato que se almacena en la dirección representada por el puntero y no al puntero en si mismo.

    Ejemplos: int *p; float *p=&v;

    En definitiva la declaración de una variable puntero informa al compilador de 3 cosas:

    • La dirección 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 declaración de un puntero de caracteres tiene también 3 partes. La única diferencia estriba en que apunta a un carácter en vez de a un entero.

    Como un puntero contiene siempre una dirección 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 declaración 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 dirección deseada

    El valor cero de un puntero indica que no se apunta ningún dato valido.

    En ocasiones podemos asignar un cero que se usa para indicar condiciones especiales.

    En tales condiciones lo mejor es definir una constante simbólica que represente el valor cero y usar NULL en la asignación al puntero, lo que indica que esta asignación representa una asignación especial.

    Ejemplo: #define NULL 0 Int *pv=NULL;

    Al ser este valor ninguna dirección valida se suele utilizar para inicializar los punteros.

  • PASO DE PUNTEROS A FUNCIONES

  • La forma que habíamos visto de pasar argumentos a la función 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 función se mantengan es usando los punteros.

    A menudo los punteros se pasan a las funciones como argumentos. Esto permite que datos de la porción del programa en la que se llama a la función 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 función, por lo que cualquier modificación de este dato dentro de la función 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 función es la dirección del dato. El contenido de esta dirección puede ser accedido dentro de la función y modificado conservándose estos cambios cuando la función 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);

    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';

    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;

    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);

    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 dirección del primer elemento se puede expresar de dos formas:

    • &X [0]

    • X

    Si por ejemplo queremos acceder a la posición 3 del array se puede poner :

    • &X[3]

    • X+3.

    Del mismo modo, para referirnos al contenido de una posición se ponia

    • X[3],

    • ahora se pone *(X+3).

    Supongamos que X se ha definido como un array unidimensional de 10 elementos enteros y también sabemos que es posible definir X como un puntero en vez de como un array.

    Las dos formas que teníamos de definir un array eran:

    • Int x[10]

    • #define MAX 100

    int X[MAX];

    • Ahora lo definimos como int *X; (como un puntero).

    la declaración de un puntero no trae acarreada la asignación de memoria por parte del compilador, con lo que en realidad el puntero no puede utilizarse hasta que no se realice una asignación a alguna zona de la memoria.

    Es decir, al hacer esta declaración 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 función de biblioteca malloc.h.

    Esta función reserva un bloque de memoria cuyo tamaño en bytes es equivalente al tamaño de una cantidad, en este caso de una cantidad entera, que estemos tratando. Pero también hay que indicar que tipo de dato es el que necesitamos , el tamaño que ocupa ese tipo de dato (esto se hace a través 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 asignación:

    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;

    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 continuación reservo memoria para guardar los n elementos

    tabla=(int *)malloc(n*sizeof(int));

    //ahora hay que inidicar que apunte a la primera posición.

    //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 función para cada cosa, y con punteros.

    #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++)

    {

    temp=*(array+i);

    k=i-1;

    while (*(array+k)>temp&&k>0) {

    *(array+k+1)=*(array+k);

    k=k-1;

    }

    if (*(array+k)>temp)

    {

    *(array+k+1)=*(array+k);

    *(array+k)=temp;

    }

    else

    {

    *(array+k+1)=temp;

    }

    }

    return;

    }

    void main ()

    {

    int *array,tamano=0;

    printf("\n Dime el tamaño 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 función para cada cosa, y con punteros.

    #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++)

    {

    temp=*(array+i);

    k=i-1;

    while (*(array+k)>temp&&k>0) {

    *(array+k+1)=*(array+k);

    k=k-1;

    }

    if (*(array+k)>temp)

    {

    *(array+k+1)=*(array+k);

    *(array+k)=temp;

    }

    else

    {

    *(array+k+1)=temp;

    }

    }

    return;

    }

    void suma(int *array, int *array1,int *array2,int a)

    {

    int i,j;

    printf("tabla ordenada");

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

    {

    (array3+i)=(array1+i)+(array2+i);

    }

    void main ()

    {

    int *array,*array1,*array2,tamano=0;

    printf("\n Dime el tamaño 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 posición de un array. Para declarar una tabla en la funcion principalse hace int (*x)[]

    Para el array multidimensional teníamos que pedir el tamaño de sus filas y columnas ahora también:

    int filas, columnas.

    Printf(“dame las filas y las columnas”);

    Scanf(“%d %d”,filas,columnas);

    También hay que declararle el tamaño:

    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 posición de la columna.

    Para especificar la fila es decir la dirección *(x+i)

    Entonces para acceder a la dirección de una cierta columna añadimos 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++)

    {

    for(j=0;j<columnas;j++)

    {

    printf (“%d”,*(*(x+i)+j));

    }

    }

    }

    para pasar a una funcion no cambia = llena (x,filas,columnas);

    pero a la hora de recibir es void llena (int (*x)[])

    • Ejercicio anterior pero con funciones

    #include<stdio.h>

    #include<malloc.h>

    #define max 100

    void llena(int (*x)[max],int filas, int columnas)

    {

    int i,j;

    for(i=0,i<filas;i++)

    {

    for(j=0;j<columnas;j++)

    {

    printf (“dame un valor”);

    scanf(“%d”,*(x+i)+j);

    }

    }

    return;

    }

    void imprime(int (*x)[max],int filas,int columnas)

    {

    int i,j;

    for(i=0,i<filas;i++)

    {

    for(j=0;j<columnas;j++)

    {

    printf (“%d”,*(*(p+i)+j));

    }

    }

    return;

    }

    void main()

    {

    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

    #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;

    }

    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);

    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 tamaño :

    scanf(“%d %d,&fila,&columna);

    For (i=0;i<filas;i++)

    {

    Nombre[i]=(int*)malloc(columnas*sizeof(int))

    }

    para acceder a una posición de la tabla seria:

    X[FILA]+COLUMNA

    y para el contenido :

    *(X[FILA]+COLUMNA)

    vamos a tener una tabla la cual se puede tratar como un puntero o como una array de punteros

    en el segundo caso no solamente se tiene la primera direccion sino las siguientes las cuales se guardan en un vector

    EJEMPLOS :

    • 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);

    }

    }

    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;

    }

    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

    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)

    {

    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 tamaño\n");

    scanf("%d %d",&fila,&columna);

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

    {

    x[i]=(int *)malloc(columna*sizeof(int));

    y[i]=(int *)malloc(columna*sizeof(int));

    z[i]=(int *)malloc(columna*sizeof(int));

    }

    llena(x,fila,columna);

    llena (y,fila,columna);

    printf("tabla 1");

    imprime(x,fila,columna);

    printf("tabla 2");

    imprime(y,fila,columna);

    suma (x,y,z,fila,columna);

    printf("tabla 3");

    imprime(z,fila,columna);

    }

    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';

    }

    }

    }

    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++)

    {

    scanf("%d",p[i]+j);

    }

    }

    return;

    }

    //punteros

    void llena2 ( int (*p)[max],int filas,int columnas)

    {

    int i,j;

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

    {

    for (j=0;j<columnas;j++)

    {

    scanf(" %d", *(p+i)+j);

    }

    }

    return;

    }

    //arrays mutidimensional

    void llena3(int p[][max], int filas, int columnas)

    {

    int i, j;

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

    {

    for (j=0;j<columnas;j++)

    {

    scanf(" %d", &p[i][j]);

    }

    }

    return;

    }

    //arrays de punteros

    void imprime1 (int *p[max],int filas,int columnas)

    {

    int i,j;

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

    {

    for(j=0;j<columnas;j++)

    {

    printf(" %d", *(p[i]+j));

    }

    printf("\n");

    }

    return;

    }

    // punteros

    void imprime2 (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;

    }

    //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

    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);

    imprime4(a,filas,columnas);

    }

    TEMA 9

    “ESTRUCTURAS Y UNIONES”

  • INTRODUCCION

  • “En muchas aplicaciones es necesario la creación de nuevos tipos de datos que permitan agrupar información de distintos tipos.

    La combinación de muchas variables es una variable, unificando el uso de todas ellas, se denomina estructura.

    En una estructura cada variable definida internamente ocupa el tamaño correspondiente al tipo al que pertenece. Existe también la posibilidad de que muchas variables compartan la misma memoria utilizando una unión. En este caso solo se podrá almacenar un dato en esa porción de memoria, siendo referenciado el contenido según 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 podía haber o elementos enteros o caracteres etc.…

    Una estructura también 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”

    Definición: 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;

    };

    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 definición 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;

    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 habría 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 aplicación concreta.

    Es logico pensar que podemos incluir como campo de una estructura a otra estructura.

    Por ejemplo

    typedef struct

    {

    int dia;

    int mes;

    int año;

    }

    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 enseñe.

    #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()

    {

    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 dirección.

    #include<stdio.h>

    #define MAX 100

    typedef struct

    {

    char nombre[20];

    long int dni;

    char direccion[20];

    } cliente;

    void main ()

    {

    cliente datos[MAX];

    int lista, i;

    clrscr ();

    do

    {

    printf (" ¨Cuantos clientes vas a introducir:\n");

    scanf (" %d", &lista);

    } while (lista<=0);

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

    {

    printf ("Introduzca el nombre del cliente.\n");

    scanf (" %[^\n]", &datos[i].nombre);

    printf ("Introduzca el DNI del cliente.\n");

    scanf (" %ld", &datos[i].dni); /*%ld es por el long int*/

    printf ("Introduzca la direcci¢n 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 (" Dirrecci¢n: %s.\n", datos[i].direccion);

    }

    getch ();

    }

    • Realizar este menu:

    . añadir 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();

    do{

    printf(" opcion 1: añadir cliente\n");

    printf(" opcion 2: ver clientes\n");

    printf(" opcion 3: buscar cliente\n");

    printf(" opcion 4: eliminar cliente\n");

    printf(" opcion 5: salir \n\n\n");

    scanf("%d", &opcion);

    switch(opcion)

    {

    case 1:

    printf(" nombre\n");

    scanf(" %[^\n]",&array[i].nombre);

    printf(" dni\n");

    scanf("%ld",&array[i].dni);

    printf(" direccion\n");

    scanf(" %[^\n]",&array[i].direccion);

    i++;

    break;

    case 2:

    if (i==0)

    {

    printf("\nno hay ningun cliente\n");

    }

    else

    {

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

    {

    printf("\n\nlos datos del cliente %d\n",j+1);

    printf(" nombre:%s\n",array[j].nombre);

    printf(" dni:%8.ld\n",array[j].dni);

    printf(" direccion:%s\n",array[j].direccion);

    }

    }

    break;

    case 3:

    printf("\n\ndame el nombre del cliente que quieres

    buscar\n");

    scanf (" %[^\n]",&nombre);

    clrscr();

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

    {

    if(strcmp(array[j].nombre,nombre)==0)

    {

    printf("el cliente %d\n",j+1);

    printf("nombre:%s\n",array[j].nombre);

    printf("dni:%8.ld\n",array[j].dni);

    printf("direccion:%s\n",array[j].direccion);

    contador=1;

    }

    }

    if(contador==0)

    {

    printf("\nel cliente que busca no se encuentra\n");

    }

    break;

    case 4:

    printf("dame el cliente a eliminar");

    scanf(" %[^\n]",eliminar);

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

    {

    if(strcmp(eliminar,array[j].nombre)==0)

    {

    for(k=j+1;k<i;k++)

    {

    array[j]=array[k];

    j++;

    }

    i--;

    }

    }

    break;

    default:

    break;

    }

    }while(opcion!=5);

    }

    • Programa anterior pero con funciones

    #include<stdio.h>

    #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)

    {

    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)

    {

    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];

    i++;

    }

    contador--;

    }

    }

    return;

    }

    void main()

    {

    cliente datos[MAX];

    int opcion;

    clrscr();

    do

    {

    printf(" opcion 1: añadir cliente\n");

    printf(" opcion 2: ver clientes\n");

    printf(" opcion 3: buscar cliente\n");

    printf(" opcion 4: eliminar cliente\n");

    printf(" opcion 5: salir \n\n\n");

    scanf("%d", &opcion);

    switch(opcion)

    {

    case 1:

    introducir( datos);

    break;

    case 2:

    ver( datos);

    break;

    case 3:

    buscar(datos);

    break;

    case 4:

    eliminar(datos);

    break;

    default: break;

    }

    }while(opcion!=5);

    }

    • 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[])

    {

    printf("\nIntroduzca datos del cliente %d", num+1);

    printf("\nNombre: ");

    scanf(" %[^\n]", &datos[num].nombre);

    printf("\nDNI: ");

    scanf(" %ld", &datos[num].dni);

    printf("\nDireccion: ");

    scanf(" %[^\n]", &datos[num].direccion);

    num+=1;

    return;

    }

    void muestra(cliente registro, int num_cliente)

    {

    printf("\n\n----Datos del cliente %d----", num_cliente+1);

    printf("\nNombre: %s", registro.nombre);

    printf("\nDNI: %ld", registro.dni);

    printf("\nDireccion: %s\n", registro.direccion);

    return;

    }

    int busca_posicion(cliente datos[])

    {

    int i=0, encontrado=-1;

    char nombre[20];

    printf("\nIntroduce el nombre del cliente a tratar: ");

    scanf(" %[^\n]", &nombre);

    while ( (i<num)&&(encontrado==-1) ) {

    if (strcmp(datos[i].nombre, nombre)==0) encontrado=i;

    else i+=1;

    }

    return(encontrado);

    }

    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) {

    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)

    {

    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) {

    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");

    else

    {

    elimina(datos);

    }

    break;

    case 5:

    printf("\n---FIN DEL PROGRAMA---\n");

    break;

    default:

    printf("\nOpcion introducida no valida\n");

    break;

    }

    }while(opcion!=5);

    getch();

    }

    • Programa anterior teniendo en cuenta que puede haber mas de un cliente con el mismo nombre cuando se quiera eliminar un cliente

    #include <stdio.h>

    #include <conio.h>

    #include <string.h>

    #define MAX 100

    int num=0;

    typedef struct {

    char nombre[20];

    long int dni;

    char direccion[20];

    }cliente;

    void inserta(cliente datos[])

    {

    printf("\nIntroduzca datos del cliente %d", num+1);

    printf("\nNombre: ");

    scanf(" %[^\n]", &datos[num].nombre);

    printf("\nDNI: ");

    scanf(" %ld", &datos[num].dni);

    printf("\nDireccion: ");

    scanf(" %[^\n]", &datos[num].direccion);

    num+=1;

    return;

    }

    void muestra(cliente registro, int num_cliente)

    {

    printf("\n\n----Datos del cliente %d----", num_cliente+1);

    printf("\nNombre: %s", registro.nombre);

    printf("\nDNI: %ld", registro.dni);

    printf("\nDireccion: %s\n", registro.direccion);

    return;

    }

    /*Devuelve ctos clientes hay con el mismo nombre*/

    int busca_posicion(cliente datos[], int *sitio)

    {

    int i=0, encontrado=0;

    char nombre[20];

    printf("\nIntroduce el nombre del cliente a tratar: ");

    scanf(" %[^\n]", &nombre);

    for (i=0;i<num;i++) {

    if (strcmp(datos[i].nombre, nombre)==0) {

    muestra(datos[i], i);

    (*sitio)=i;

    printf("\n");

    encontrado+=1;

    }

    }

    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;

    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;

    }

    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);

    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;

    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:

    printf("\n---FIN DEL PROGRAMA---\n");

    break;

    default:

    printf("\nOpcion introducida no valida\n");

    break;

    }

    }while(opcion!=5);

    getch();}

  • ESTRUCTURAS Y PUNTEROS

  • La dirección de comienzo de una estructura puede accederse de la misma manera que cualquier otra dirección mediante el uso del operador indireccion

    Si variable V representa un tipo de estructura entonces &v representa la dirección de comienzo de la estructura es decir de la variable, además 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 dirección 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

    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);

    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++) {

    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 DIRECCIàN: ");

    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 direcci¢n 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 direcci¢n 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);

    printf ("El DNI es: %d.\n", (pdatos+i)->dni);

    printf ("La direcci¢n 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);

    }

    void main () {

    cliente *pdatos;

    cliente datos [MAX]= {{"Pepe", 1245, "Santiago"},{"Luis", 3875,

    "Burgos"},{"Maria", 9540, "Alegria"}};

    long int numero;

    clrscr();

    printf ("\nN£mero 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 ("\nDirecci¢n: %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;

    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

    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.

    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)

    {

    printf("\n nombre: %s",temporal->nombre);

    printf("\n DNI: %ld",temporal->dni);

    printf("\n numero:%d",temporal->numero);

    temporal=temporal->siguiente;

    }

    • Programa que te permita hacer las siguientes operaciones con una lista:

    Crear lista.

    Anadir nodo tanto al principio como al final.

    Buscar nodo

    Eliminar nodo

    #include <stdio.h>

    #include <conio.h>

    #include <stdlib.h>

    #define NULL 0

    struct lista_elem{

    char nombre[20];

    int num_cliente;

    long int dni;

    char direccion[20];

    struct lista_elem *siguiente;

    };

    typedef struct lista_elem nodo;

    void pide_datos(nodo *p) {

    printf("\n\nNombre: "); //Pedimos los datos

    scanf(" %[^\n]",p->nombre);

    printf("\nNumero de cliente: ");

    scanf("%d", &p->num_cliente);

    printf("\nDNI: ");

    scanf("%ld", &p->dni);

    printf("\nDireccion: ");

    scanf(" %[^\n]", p->direccion);

    p->siguiente=NULL;

    return;

    }

    //Inserta el primer elememto de la lista

    void insertar(nodo *principio)

    {

    pide_datos(principio);

    return;

    }

    //Añade 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);

    }

    //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;

    printf("\n\n1.CREAR lista enlazada");

    printf("\n2.A¥ADIR nuevo elemento al final de la lista");

    printf("\n3.A¥ADIR 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)

    {

    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:

    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:

    if (principio==NULL)

    printf("\n\nNo hay clientes");

    else

    {

    temp=buscar(principio);

    if (temp==NULL)

    printf("\n\nEl cliente no esta en la

    lista");

    else

    {

    printf("\n\nNombre: %s", temp->nombre);

    printf("\nNumero cliente: %d", temp-

    >num_cliente);

    printf("\nDNI: %ld", temp->dni);

    printf("\nDireccion: %s", temp->direccion);

    }

    }

    break;

    case 6: if (principio==NULL)

    printf("\n\nNo hay clientes");

    else

    {

    temp=buscar(principio);

    if (temp==NULL)

    printf("\n\nEl cliente no esta

    en la lista");

    else

    principio=elimina(principio, temp);

    }

    break;

    case 7: printf("\n\nFin del programa");

    break;

    default:printf("\n\nOpcion no valida");

    break;

    }

    opcion=menu();

    }

    }

    }

    TEMA 10

    “FICHEROS”

    • INTRODUCCION

    En la mayoría de las aplicaciones es necesario guardar información de forma permanente.

    Hasta ahora todos los mecanismos de almacenamiento de información(constantes,variables,estructuras,vectores,tablas,punteros..etc)enumerados en unidades anteriores eran volátiles. Es decir cuando el programa que los ejecutaba termina su ejecución desaparecen y la información 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 ejecución.

    En C la estructura de datos externa básica es el fichero o archivo.

    Un archivo se puede definir como una estructura de datos consistente en una secuencia de componentes del mismo tipo, almacenados de forma externa al programa, generalmente en dispositivos de almacenamiento auxiliar.

    A cada uno de los componentes de un fichero se llama registro .

    A su vez un registro esta formado por un conjunto de informaciones de distintos tipo que hacen referencia al mismo registro y que se denominan campos

    Antes de que le programa pueda acceder a un fichero, debe de haber alguna información especifica al conjunto del mismo.

    Esta información 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 información 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 través de una función llamada FOPEN( ).

    Esta función es una función controlada por tres parámetros.

    El primero es el nombre de l fichero que se va a abrir.

    El segundo parámetro describe el uso que se va a destinar a este fichero. Existen varios usos entre los cuales están:

    r: le abrimos solamente para lectura

    w: le abrimos solamente para escritura.

    a: abre un archivo existente para añadir información 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 parámetro es un puntero al fichero: su valor se devuelve en la función, es decir,

    la función 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 función no pueda abrir el fichero van desde que puede que ese archivo no exista hasta que sea por ejemplo de lectura y le queramos acceder a el como de escritura

    IF ( (FICHERO=FOPEN("EJEMPLO.DAT","W"))==NULL)

    PRINTF("\NERROR EN LA APERTURA DEL FICHERO");

    ELSE {

    Despues de haber realizado las operciones de escritura y/o lectura dependiendo del tipo de fichero que sea nada mas terminar, lo que hay que hacer es cerrar dicho fichero.

    La funcion que se encarga de realizar esto es FCLOSE( ).

    El argumento de dicha funcion es el puntero al fichero y no el nombre de dicho fichero:

    FCLOSE (NOMBRE);

    Ejercicios:

    • Programa gracias a cual se escriban cuatro pares de numeros en un fichero

    #Include<stdio.h>

    Void main()

    {

    file*fichero

    int n1,n2,i;

    fichero=fopen(“ejemplo2.dat”,”w”);

    if(fichero==null)

    {

    printf(“\nerror en la apertura”);

    }

    else

    {

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

    {

    printf(“valores”);

    scanf(“ %d %d,&n1,&n2);

    fprintf(fichero,”%d %d\n”,n1,n2); // escribe en el fichero

    }

    }

    Fclose(fichero);

    }

    • Programa gracias al cual te imprima por pantalla los valores de un fichero

    #Include <stdio.h>

    Void main()

    {

    File * fich;

    Int a,b;

    If ( ( fich=fopen(“ejemplo2.dat”,”r”))==null)

    printf(“error);

    Else{

    fscanf(fich,”%d %d”,&a,&b);

    while(¡ feof(fich))

    {

    printf(“%d %d”,a,b);

    fscanf(fich, “ %d %d”, &a, &b);

    }

    }

    Fclose(fich)}

    • Programa que te escriba en un fichero cuatro pares de numeros y caracteres.

    # Include < stdio.h>

    Void main()

    {

    file * fich;
    int i, num;

    Char nombre[20];

    If ( ( fich=fopen(“ejemplo2.dat”,”w”))==null)

    printf(“error);

    Else

    {

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

    {

    printf(“valores”);

    scanf(“ %d %[ ^\n],&num,nombre);

    fprintf(fichero,”%d %[^\n]\n”,num,nombre);

    }

    }

    Fclose(fichero);

    }

    • Programa que te escriba los datos de un cliente en un fichero mediante una estructura

    #include <stdio.h>

    #include <conio.h>

    #include <stdlib.h>

    #define NULL 0

    typedef struct{

    char nombre[20];

    int num;

    }cliente;

    void main(void) {

    FILE *fichero;

    cliente aux;

    int i;

    if ( (fichero=fopen("ejemplo.dat","w"))==NULL)

    printf("\nError en la apertura del fichero");

    else {

    for(i=0;i<4;i++) {

    printf("\nNombre: ");

    scanf(" %[^\n]", &aux.nombre);

    printf("\nNumero: ");

    scanf("%d", &aux.num);

    fwrite(&aux, sizeof(cliente), 1, fichero);

    }

    }

    fclose(fichero);

    }

    • Programa que acceda aun fichero para mostrar por pantalla los caracteres y numeros escritos en el programa anterior.

    #include <stdio.h>

    #include <conio.h>

    #include <stdlib.h>

    #define NULL 0

    typedef struct{

    char nombre[20];

    int num;

    }cliente;

    void main(void) {

    FILE *fichero;

    cliente aux;

    if ( (fichero=fopen("ejemplo.dat","r"))==NULL)

    printf("\nError en la apertura del fichero");

    else {

    fread(&aux, sizeof(cliente), 1, fichero);

    while(!feof(fichero)) {

    printf("\n\nEl nombre es: %s", aux.nombre);

    printf("\nEl numero es: %d", aux.num);

    fread(&aux, sizeof(cliente), 1, fichero);

    }

    }

    fclose(fichero);

    }

    • ALGORITMO DE ACTUALIZACIÓN 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+bonificación.

    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 mínimo

    Mientras (num_cliente_cliente!=MAX || num_cliente_bonif!=MAX) hacer

    Si (num_cliente_cliente==mínimo && num_cliente_bonif==mínimo)

    Tratamiento C1

    Leer registro clientes

    Leer registro bonificaciones

    Sino

    Si (num_cliente_cliente==mínimo)

    Tratamineto C2

    Leer registro clientes

    Leer registro bonificaciones

    Sino

    Tratamiento C3

    Leer registro bonificaciones

    Fin si

    Fin si

    Calrcular número_cliente mínimo

    Fin mientras

    El MAX se utiliza para cuando lleguemos a final de fichero le asignemos ese máximo al número de cliente.

    • Programa que te actualice un fichero;

    #include <stdio.h>

    #define MAX 10000

    typedef struct

    {

    int ncliente;

    int saldo;

    }cliente;

    typedef struct

    {

    int ncliente;

    int bonificacion;

    }bonif;

    int calcular_minimo (int aux.ncliente,int temp.ncliente)

    {

    int minimo;

    if( (aux.ncliente==temp.ncliente) || (aux.ncliente<temp.ncliente) )

    {

    minimo=aux.ncliente;

    }

    else

    {

    minimo=temp.ncliente;

    }

    return(minimo);

    }

    void main()

    {

    cliente aux;

    bonif temp;

    FILE *cli;

    FILE *bon;

    FILE *nuevo;

    cli=fopen("clientes.dat","r");

    bon=fopen("bonificaciones.dat","r");

    nuevo=fopen("salida.dat","w");

    if(cli==NULL || bon==NULL || nuevo==NULL);

    {

    printf("\nERROR");

    }

    else

    {

    fread(&aux,sizeof(cliente),1,cli);

    if( feof(cli) )

    {

    aux.ncliente=MAX;

    }

    fread(&temp,sizeof(bonif),1,bon);

    if( feof(bon) )

    {

    temp.ncliente=MAX;

    }

    minimo=calcular_minimo(aux.ncliente,temp.ncliente);

    while(aux.ncliente!=MAX || temp.ncliente!=MAX)

    {

    if(aux.ncliente==minimo && temp.ncliente==minimo)

    {

    aux.saldo=aux.saldo+temp.bonificacion;

    fwrite(&aux,sizeof(cliente),1,nuevo);

    fread(&aux,sizeof(cliente),1,cli);

    if( feof(cli) )

    {

    aux.ncliente=MAX;

    }

    fread(&temp,sizeof(bonif),1,bon);

    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); //funci¢n

    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;

    }

    }

    }

    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);

    }

    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");

    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

    {

    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 señalado por el puntero declarado anteriormente:

    Ejemplo:

    if( feof(bon) )

    {

    temp.ncliente=MAX;

    }

    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 tamaño (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);

    }

    }

    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 tamaño 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 tamaño 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");

    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++)

    {

    suma=ascii[i]+numero[j];

    resto[i]=suma%256;

    printf("el resultado es %d\n",resto[i]);

    if(j==metidos-1)

    {

    j=0;

    }

    else

    {

    j++;

    }

    }

    return;

    }

    void main()

    {

    char linea[max];//array que contiene el texto metido.

    int numero[max];//array que contiene la clave

    int ascii[max];

    int i=0,longitud=0,variable,resultado,caracter[max]; //caracter es el

    nuevo numero

    int metidos=0;

    printf("dime el texto a inroducir\n");

    gets(linea);

    longitud=strlen(linea);

    linea[longitud]='\0';

    do

    {

    printf("dame un numero\n");

    scanf("%d",&variable);

    if (variable!=0)

    {

    numero[i]=variable;

    metidos=metidos+1;

    i=i+1;

    }

    }while(variable!=0);

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

    {

    printf("%d",numero[i]);

    }

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

    {

    resultado=toascii(linea[i]);

    ascii[i]=resultado;

    printf("el numero ascii correspondiente a %c:

    %d\n",linea[i],ascii[i]);

    }

    suma(ascii,numero,metidos,longitud,caracter);

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

    {

    printf("%c",caracter[i]);

    }

    }

    • 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;

    }

    }

    if (b-1>=0 && nuevo!=antiguo)

    {

    if (*(*(foto+a)+(b-1))==antiguo) {

    rellenar (foto, a, b-1, nuevo);

    *(*(foto+a)+(b-1))=nuevo;

    }

    }

    if (a-1>=0 && nuevo!=antiguo)

    {

    if (*(*(foto+a-1)+b)==antiguo)

    {

    rellenar (foto, a-1, b, nuevo);

    *(*(foto+a-1)+b)=nuevo;

    }

    }

    return;

    }

    void imprime (int (*foto)[LADO])

    {

    int i, j;

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

    {

    for (j=0; j<LADO; j++)

    {

    printf ("%d ", *(*(foto+i)+j) );

    }

    printf ("\n\n");

    }

    return;

    }

    void llena (int (*foto)[LADO])

    {

    int i, j;

    printf ("VAMOS A INTRODUCIR LOS VALORES ...\n\n");

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

    {

    for (j=0; j<LADO; j++)

    {

    printf ("VALOR (%d,%d): ", i+1, j+1);

    scanf ("%d", *(foto+i)+j);

    }

    }

    return;

    }

    void main ()

    {

    int (*foto)[LADO];

    int nuevo, a, b;

    clrscr ();

    foto=(int*) malloc (LADO*LADO*sizeof(int));

    llena (foto);

    clrscr ();

    printf ("INTRODUCE EL NUEVO VALOR: ");

    scanf ("%d", &nuevo);

    do

    {

    printf ("INTRODUCE LA POSICIàN 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)

    {

    rellenar (foto, a, b+1, nuevo);

    *(*(foto+a)+(b+1))=nuevo;

    }

    }

    if (a+1<LADO && nuevo!=antiguo)

    {

    if (*(*(foto+a+1)+b)==antiguo)

    {

    rellenar (foto, a+1, b, nuevo);

    *(*(foto+a+1)+b)=nuevo;

    }

    }

    if (b-1>=0 && nuevo!=antiguo)

    {

    if (*(*(foto+a)+(b-1))==antiguo)

    {

    rellenar (foto, a, b-1, nuevo);

    *(*(foto+a)+(b-1))=nuevo;

    }

    }

    if (a-1>=0 && nuevo!=antiguo)

    {

    if (*(*(foto+a-1)+b)==antiguo)

    {

    rellenar (foto, a-1, b, nuevo);

    *(*(foto+a-1)+b)=nuevo;

    }

    }

    return;

    }

    void imprime (int (*foto)[LADO])

    {

    int i, j;

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

    {

    for (j=0; j<LADO; j++)

    {

    if ( *(*(foto+i)+j)==1 )

    {

    textcolor (1);

    cprintf ("ÛÛ");

    }

    else if (*(*(foto+i)+j)==2 )

    {

    textcolor (2);

    cprintf ("ÛÛ");

    }

    else if (*(*(foto+i)+j)==3 )

    {

    textcolor (3);

    cprintf ("ÛÛ");

    }

    else if (*(*(foto+i)+j)==4 )

    {

    textcolor (4);

    cprintf ("ÛÛ");

    } else if (*(*(foto+i)+j)==5 ) {

    textcolor (5);

    cprintf ("ÛÛ");

    } else if (*(*(foto+i)+j)==6 ) {

    textcolor (6);

    cprintf ("ÛÛ");

    } else if (*(*(foto+i)+j)==7 ) {

    textcolor (7);

    cprintf ("ÛÛ");

    }

    else if (*(*(foto+i)+j)==8 ) {

    textcolor (8);

    cprintf ("ÛÛ");

    } else if (*(*(foto+i)+j)==9 ) {

    textcolor (9);

    cprintf ("ÛÛ");

    } else if (*(*(foto+i)+j)==10 ) {

    textcolor (10);

    cprintf ("ÛÛ");

    } else if (*(*(foto+i)+j)==11 ) {

    textcolor (11);

    cprintf ("ÛÛ");

    } else if (*(*(foto+i)+j)==12 ) {

    textcolor (12);

    cprintf ("ÛÛ");

    } else if (*(*(foto+i)+j)==13 ) {

    textcolor (13);

    cprintf ("ÛÛ");

    } else if (*(*(foto+i)+j)==14 ) {

    textcolor (14);

    cprintf ("ÛÛ");

    } else if (*(*(foto+i)+j)==15 ) {

    textcolor (15);

    cprintf ("ÛÛ");

    } else if (*(*(foto+i)+j)==0 ) {

    textcolor (0);

    cprintf ("ÛÛ");

    }

    }

    printf ("\n\r");

    }

    return;

    }

    void llena (int (*foto)[LADO])

    {

    int i, j;

    printf ("VAMOS A INTRODUCIR LOS VALORES ...\n\n");

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

    {

    for (j=0; j<LADO; j++)

    {

    do {

    printf ("VALOR (%d,%d): ", i+1, j+1);

    scanf ("%d", *(foto+i)+j);

    } while (*(*(foto+i)+j)>15 || *(*(foto+i)+j)<0);

    }

    }

    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 POSICIàN 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 ();

    }

    • 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+f-1)+c)==actual )

    rellenar(foto, c, f-1, nuevo_color);

    }

    if (f!=10) {

    if ( *(*(foto+f+1)+c)==actual )

    rellenar(foto, c, f+1, nuevo_color);

    }

    if (c!=1) {

    if ( *(*(foto+f)+c-1)==actual )

    rellenar(foto, c-1, 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));

    }

    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);

    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

    #include<stdio.h>

    #define max 100

    #include<string.h>

    #include<ctype.h>// biblioteca de toascii

    void suma(int ascii[],int numero[], int metidos, int longitud, int resto[])

    {

    int i,suma,j=0;

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

    {

    suma=ascii[i]+numero[j];

    resto[i]=suma%256;

    printf("\nel codigo nuevo es: %d",resto[i]);

    if(j==metidos-1)

    {

    j=0;

    }

    else

    {

    j++;

    }

    }

    return;

    }

    void main()

    {

    char linea[max];//array que contiene el texto metido.

    int numero[max];//array que contiene la clave

    int ascii[max];

    int i=0,longitud=0,variable,resultado,caracter[max];//caracter es el nuevo numero

    int metidos=0;

    printf("dime el texto a inroducir\n");

    gets(linea);

    longitud=strlen(linea);

    linea[longitud]='\0';

    do

    {

    printf("dame un numero\n");

    scanf("%d",&variable);

    if (variable!=0)

    {

    numero[i]=variable;

    metidos=metidos+1;

    i=i+1;

    }

    }while(variable!=0);

    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++)

    {

    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

    PERIFERICOS DE ENTRADA

    SOPORTE E/S

    PROGRAMA

    SOPORTE E/S

    PERIFERICOS DE SALIDA

    Disco

    magnético

    tarjeta

    Pantalla

    proceso

    teclado

    Archivo en CM

    Archivo

    S=S+5

    Escribir teléfono

    Leer teléfono

    INICIO

    INICIO

    SI

    F=A

    E=B

    LEER A

    LEER B

    LEER C

    LEER A
    LEER B

    LEER C

    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

    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

    Accion N

    NO

    cond

    FIN

    SI

    C=C+1 R=C+R

    C=N

    NO

    SI

    FIN

    R

    cond

    NO

    SI

    Operación………..

    INICIO

    LEER N

    SI

    NO

    N<1

    NO VALE

    CONT=O FACT=1

    C=C+1 F=F*C

    C=N

    FIN

    FACTORIAL

    NO

    SI

    F=1

    NO

    N<>O

    NO VALE

    SI

    FIN

    F=F*N N=N-1

    INICIO

    LEER A B C D

    NO

    SI

    A>o=B

    MAXI =A

    MAXI=B

    SI

    NO

    M<C

    MAXIMO =C

    M<C

    SI'Fundamentos de programación'

    NO

    ESCRIBIR D

    ESCRIBIR M

    FIN

    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'Fundamentos de programación'

    NO

    MA>O=M

    ESCR M

    ESCR MA

    FIN

    INICIO

    C<>O

    NO

    NO

    N>o=O

    S=O M=O

    C=O

    SI'Fundamentos de programación'

    SI'Fundamentos de programación'

    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'Fundamentos de programación'

    S=S+P

    P=P+2

    FIN

    INICIO

    S=O

    N=2

    ECRI

    S

    NO

    N<50

    SI'Fundamentos de programación'

    SI'Fundamentos de programación'

    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'Fundamentos de programación'

    LEER DURACION

    SI'Fundamentos de programación'

    NO

    D<=3

    S=10

    C=4

    COSTE=10

    NO

    C<=D

    SI'Fundamentos de programación'

    S=S+5

    C=C+1

    ESCRIBIR COSTE

    FIN

    FIN

    INICIO

    C=O

    S=O

    SI'Fundamentos de programación'

    C<3

    S=10

    1O

    C=C-3

    S=C*5+1O

    ESCRIB COSTE

    NO

    INICIO

    S=O
    C=O
    I=O
    P=O

    LEER N

    N< O

    SI'Fundamentos de programación'

    NO

    SI'Fundamentos de programación'

    NO

    NMOD2=0

    CIMPAR=CI+1

    S=S+N

    MOSTRAR P

    CPAR=CPAR+1

    C=C+1

    SI'Fundamentos de programación'

    NO

    M=O

    C=1O

    NO

    CPAR=O

    M=S/Ci

    SI'Fundamentos de programación'

    ESCRIBIR MEDIA

    FIN

    Variable

    Inicio,final,incr

    INICIO

    LEER N

    CR=O
    C=O
    CU=O

    NO

    NO

    FIN

    C<>N

    SI'Fundamentos de programación'

    C=C+1

    CR=C*C
    CU=CR*C

    ESCRIBIR CUADRADO

    Y CUBO

    INICIO

    DIAS =1

    SUELDO=O

    NO

    SI'Fundamentos de programación'

    SUELDO

    DIAS < =5

    Leer horas

    Leer turno

    FIN

    NO

    NO

    SI'Fundamentos de programación'

    T=M

    T=T

    SI'Fundamentos de programación'

    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'Fundamentos de programación'

    T=M

    NO

    S=S+H*600

    NO

    T=T

    SI'Fundamentos de programación'

    S=S+H*1000

    S=S+H*800

    D=D+1

    SEGUN

    variable

    INICIO

    C1=0 C3=0 C4=0 C2=0

    LEER N

    NO

    MENSAJE

    N>O

    SI'Fundamentos de programación'

    NO

    FIN

    N >=1

    N<=4

    MENSAJE

    SI'Fundamentos de programación'

    SI'Fundamentos de programación'

    N=1

    C1=C1+1

    SI'Fundamentos de programación'

    NO

    N=2

    C2=C2+1

    NO

    N=3

    SI'Fundamentos de programación'

    C3=C3+1

    NO

    C4=C4+1

    N>0

    NO

    SOLUCION

    SI'Fundamentos de programación'

    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

    SI'Fundamentos de programación'

    T<TM

    GANADOR =TM

    INICIO

    1---AREA

    2---SUPERFICIE

    R=O A=O

    S=O N=O

    P=3,14

    LEER RY N

    FIN

    N

    SI'Fundamentos de programación'

    SI'Fundamentos de programación'

    MENSAJE

    N>O

    N>O

    NO

    S=R*R*P

    A=R*R*P

    NO

    S

    ESCRIBIR A

    INICIO

    LEER N

    NO

    N>O

    SI'Fundamentos de programación'

    CONTADOR=N

    SI'Fundamentos de programación'

    N MOD CONT=O

    NO

    ESCRIBIR CONTADORR

    CONTADOR= CONTADOR-1

    SI'Fundamentos de programación'

    FIN

    CONTADOR=O

    NO

    C=N

    CONTADOR =CONTADOR+1

    INICIO

    LEER N

    SI'Fundamentos de programación'

    N<=O

    NO

    FIN

    I

    1,N,1

    SI'Fundamentos de programación'

    N MOD I=O

    NO

    ESCRIBIR I

    INICIO

    DIVISOR=O CONT=2

    DAME NUMERO

    LEER N

    NO

    N>O

    SI'Fundamentos de programación'

    SI'Fundamentos de programación'

    NO

    CONTADOR<N

    NO

    D=O

    SI'Fundamentos de programación'

    SI'Fundamentos de programación'

    N MOD CONT=O

    NO

    DIVISORES=DIVISORES+1

    NUMERO PRIMO

    C=C+1

    FIN

    INICIO

    LEER N

    NO

    N>0

    SI'Fundamentos de programación'

    N MOD 10=A

    ESCRIBIR A

    NO

    N=N/10

    FIN

    ESCRIBIR N

    N=O

    SI'Fundamentos de programación'

    INICIO

    POTENCIA =1

    LEER BASE

    SI'Fundamentos de programación'

    BASE<=O

    NO

    LEER EXP

    SI'Fundamentos de programación'

    EXP>=O

    NO

    NO

    EXP=O

    I

    1, EXP, 1

    SI'Fundamentos de programación'

    P=P*BASE

    ESCRBIR POTENCIA

    FIN

    POTENCIA=POTENCIA*BASE
    CONTADOR=CONTADOR+1

    NO

    SI'Fundamentos de programación'

    CONTADOR>=EXP

    ESCRIBIR POTENCIA

    FIN

    INICIO

    SUMA=O

    LEER N1 N2

    N1 N2 <=O

    NO

    SI'Fundamentos de programación'

    LEER N1 N2

    NO

    N1MOD2<>0

    SI'Fundamentos de programación'

    S=S+N2

    NO

    N1>1

    SI'Fundamentos de programación'

    N1=N1/2

    N2=N2*2

    SI'Fundamentos de programación'

    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 =-B-D/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

    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=PR-PR*0,3

    PRECIO

    FIN

    INICIO

    P=0 S=0 C=0

    C=C+1

    P=P+2

    S=S+P

    FIN

    C=N

    INICIO

    LEER A

    B=MOD2

    PAR

    B=0

    FIN

    IMPAR

    INICIO

    1=1ªOPCION

    2=2ªOPCION

    3=3ªOPCION

    LEER OPCION

    FIN

    OP<>3

    OPC

    LEER AB

    LEER CD

    LEER N

    ERROR

    N>0

    E=A+B

    F=C+D

    E>F

    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

    IMPORTE

    FIN

    'Fundamentos de programación'

    Enlazador

    Programa. objeto

    Compilador

    Programa fuente

    Pr.ejecutable

    'Fundamentos de programación'

    'Fundamentos de programación'

    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)

    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