Está en la página 1de 158

Una introduccin a la programacin.

Un enfoque algortmico

Anexo I. Programas en C

Jess J. Garca Molina Francisco J. Montoya Dato Jos L. Fernndez Alemn Mara J. Majado Rosales

21 de octubre de 2005

Programas en C. Una introduccin a la Programacin.

ndice

1. Introduccin
1.1. Gua de usuario para Dev-C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3
4

2. Fe de erratas 3. Listados
3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. Captulo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Captulo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Captulo 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Captulo 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Captulo 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 7
7 26 41 61 84

Captulo 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Captulo 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

ITES  PARANINFO c

Programas en C. Una introduccin a la Programacin.

1.

Introduccin

Este documento incluye los programas C que se han obtenido al codicar en este lenguaje de programacin todos los algoritmos que aparecen en el libro Una Introduccin a la Programacin. Un enfoque algortmico, segn la conversin descrita en el Captulo 9 del libro. Por tanto, el lector del libro dispone de los programas que le permiten analizar el comportamiento de los algoritmos durante la ejecucin. Los programas han sido creados y probados con la versin 4.9.7.0 del entorno Dev-C++ (compilador gcc) de Bloodshed, sobre los sistemas operativos Windows 98, 2000 y XP. Si el lector est ms habituado a entornos Linux, puede utilizar el compilador gcc para Linux. Dev-C++ es un entorno de programacin moderno potente y amigable, y se puede descargar desde el sitio web de Bloodshed http://www.bloodshed.net/devcpp.html. El lector encontrar los programas en el chero

gFzip que puede obtener en el sitio web donde aparece evqTRFg,

este documento. Los programas estn distribuidos en carpetas, una por cada captulo. El nombre de los archivos hace referencia al identicador en el libro del algoritmo que implementa, por ejemplo es el programa para el Algoritmo 6.4 del Captulo 6. Puesto que C no dispone del tipo secuencia propiamente dicho, se han implementado unas unidades que permiten el manejo de secuencias de caracteres, enteros y reales para el primer y segundo modelos de acceso secuencial descritos en el Captulo 5. Los dos ltimos modelos se han construido apoyndonos en el concepto de secuencia intermedia. En la carpeta

li

estn los archivos cabecera, los archivos con

el cdigo fuente y las libreras compiladas de seis mquinas secuenciales, que corresponden con los dos primeros modelos de cada uno de los tres tipos de datos: caracteres, enteros y reales. Los archivos cabecera y el cdigo fuente de cada unidad se han nombrado con el prejo ms seguido de una letra que indica el tipo de elemento (c, e o r) y un 1 o 2 para sealar el modelo. Por ejemplo,

msePFh

es el archivo cabecera y

msePF

es el archivo con el cdigo fuente para secuencias de

enteros del segundo modelo. Las primitivas para el manejo de secuencias se nombran igual que en el libro (EA, Comenzar, Avanzar, etc.) pero con un sujo que indica el tipo de elemento y el modelo secuencial (iewgI, iewiP, cabecera de cada librera. El lector interesado tambin puede escudriar el cdigo de los archivos que contiene el cdigo fuente de las libreras con el objetivo de aprender sobre estructuras de datos dinmicas (se han implementado como listas). Para ejecutar los programas se han creado archivos que almacenan secuencias que se utilizan como ejemplo de entrada, preparados para que el lector pueda modicarlos. Estos archivos de datos se identican con el prejo datos seguido del identicador del algoritmo. Por ejemplo, con la entrada de datos del programa

evnzrwP, evnzrwgP, etc.). Para conocer el lxico que puede utilizar se puede consultar el archivo

evqRQFg.

dtosRFQFtxt

corresponde

Las secuencias de datos se almacenan como lneas

de caracteres y las secuencias de nmeros con un nmero por lnea de entrada. En la carpeta con los programas del Captulo 6 se incluyen dos programas (qixpTIFg y la visualizacin de los dos archivos creados,

qixpTRFg)

que crean los archivos de

datos C para el Algoritmo 6.1 y el Algoritmo 6.4 (tambin se proporcionan los programas que permiten

ipTIFg

ipTRFg).

En los programas no se ha realizado la comprobacin de que los datos de entrada son vlidos, por lo que en el caso de una entrada incorrecta el resultado es impredecible. En la prxima versin de este documento se incluir el cdigo de todas las acciones y funciones del Captulo 8, as como de la aplicacin gestor de archivos indexados que se discute en dicho captulo. Tambin estarn disponibles en el sitio web del libro algoritmos y programas que son soluciones a los ejercicios del libro y la implementacin de las libreras del tercer y cuarto modelo de acceso secuencial.

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

1.1. Gua de usuario para Dev-C++


El entorno dispone de una ayuda y un tutorial. Los pasos para ejecutar un programa, una vez abierto el entorno, seran (existen botones para ejecutar las rdenes, adems de teclas rpidas): Establecer el directorio en el que se encuentran las libreras (opcin del men

Opciones del compilador

Herramientas).

En la pestaa

Directorios,

seleccionar e introducir, si procede, los

directorios donde se encontrarn los archivos cabecera (include) y las libreras. Este paso slo sera necesario realizarlo una vez. Incluir las opciones del compilador necesarias para enlazar con las libreras que utilice el programa (opcin En la pestaa la librera

Opciones del compilador

del men

Herramientas).

Compilador,
y

activar aadir los siguientes comandos al llamar al compilador e se introducir la cadena  Elonio

incluir en el cuadro de texto las opciones que correspondan. Por ejemplo, si es preciso enlazar con

libconio.a

libmsc1.a,

ElmsI ElstdCC.
y

Para

ejecutar nuestros programas siempre se deben enlazar con las libreras

libconio.a

libstdc++.a,

la primera incluye la funcin clrscr para limpiar la pantalla que se utiliza en todos los programas y la segunda es la librera estndar de C++ que es necesario por un error del compilador. En http://conio.sourceforge.net/ se pueden encontrar enlaces para descargar la librera libconio, as como una breve introduccin y documentacin sobre ella. Cargar el programa (opcin

Abrir Proyecto

Archivo del men Archivo).

Hay que asegurarse

que en el nombre del archivo fuente la extensin es C mayscula, ya que si fuese minscula al compilar se producirn errores al enlazar con unidades. Compilar el programa (opcin Ejecutar el programa (opcin

Compilar

del men

Ejecutar).

Ejecutar

del men

Ejecutar).

Para generar una librera se deben seguir los siguientes pasos:

Crear un proyecto con el nombre de la librera (por ejemplo libmsc1). Seleccionar de la opcin

Static Library

Nuevo proyecto

del men

File. Aadir a proyecto Execute.


del men

Cargar el archivo que contiene el cdigo fuente de la librera, opcin

Proyecto.
Compilar el cdigo fuente mediante la opcin librera esttica (en el ejemplo

Compile

del men

El resultado es una

libmsc1.a)

que ser preciso incluir en el directorio de las libreras

para poder enlazarla con un programa.

ITES  PARANINFO c

Programas en C. Una introduccin a la Programacin.

2.

Fe de erratas
Hemos encontrado en el libro las erratas que indicamos abajo organizadas por captulos. En el sitio

web del libro iremos actualizando esta fe de erratas en un chero aparte.

Captulo 4
Algoritmo 4.4
El segundo argumento de la llamada a la accin en vez de

sumGnum.

isriir que escribe el resultado debe ser sumGnumilem

Captulo 6
Algoritmo 6.17
La funcin en el texto. En la funcin de la clusula

osinl no coincide en el texto y en el algoritmo. El algoritmo vlido es el que aparece godifiion hay que cambiar nuevorF ixyygey de la instruccin iqx.
por

nuevorFs

en la segunda asignacin

Captulo 7
Algoritmo 7.13

ist debe denirse origen, intermedio y destino.


El tipo vez de

fuera de la accin

rnoi,

ya que se utiliza como tipo de los parmetros

La segunda llamada a la accin

rnoi debera ser rnoi@nEID intermedioD origenD destinoA rnoi@nEID intermedioD destinoD origenA.

en

Seccin 7.5.4 (Pgina 377)


En la postcondicin de la accin

yrdenrs

debera decir

tk a viejk

en vez de

tk a viejk.

Captulo 8
Seccin 8.3 (Pgina 395)
En la tercera lnea debera decir una secuencia de cuatro nodos: en vez de una secuencia de tres nodos:.

Seccin 8.7.4 (Pgina 464)


En la accin

snsertrerhivosndexdo hay que cambiar: s @fusrosiionsndie@rhFindieD pFlveA X yxveA

por:

s @fusrosiionsndie@rhFindieD pFlveA = yxveA

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

Captulo 9
Seccin 9.7.12 (Pgina 565)
En la Figura 9.4 el elemento

HPW

debera ser

tHPW

ITES  PARANINFO c

Programas en C. Una introduccin a la Programacin.

3.

Listados

3.1. Captulo 2

/* * Algoritmo 2.1. Calculo de la nota final de una asignatura * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb #include `onioFhb int min @A { float noteoriY float notrtiY float notpinlY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.1. Calculo de la nota final de una asignatura *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Nota de teoria: "AY snf@" %f"D8noteoriAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Nota de practicas: "AY snf@" %f"D8notrtiAY while @gethr@A 3a 9n9AY printf@"\n"AY notpinl a noteori B HFU C notrti B HFQY printf@"La nota final es: %.2f\n"D notpinlAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/*

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

* Algoritmo 2.2. Convertir temperatura Fahrenheit en temperatura Celsius * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb #include `onioFhb float tempphrenheitY // dato, temperatura en grados Fahrenheit float tempgelsiusY // resultado, temperatura en grados Celsius void gonvertirphrenheitgelsius@A // PRE 0 <= tempFahrenheit <= 200 // POST convierte a grados celsius la temperatura de tempFahrenheit { tempgelsius a @SFH G WFHA B @tempphrenheit E QPFHAY } int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.2. Convertir temperatura Fahrenheit en *****\n"AY printf@"***** temperatura Celsius *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Temperatura Fahrenheit (>= 0) y (<= 200): "AY snf@" %f"D 8tempphrenheitAY while @gethr@A 3a 9n9AY gonvertirphrenheitgelsius@AY printf@"La temperatura en grados Celsius es: %.2f\n"D tempgelsiusAY printf@"\nPulse enter para continuar"AY gethr@AY return HY } /* * Algoritmo 2.3. Calculo del salario neto de un trabajador (version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico

ITES  PARANINFO c

Programas en C. Una introduccin a la Programacin.

* Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb #include `onioFhb #define swiy HFPH #define iqywihsgy HFHS #define gywviwixysxixsy TH #define gywviwixyexy T long int slriofseY // dato, sueldo base del trabajador long int ntigueddY // dato, anyos en la empresa double slrioxetoY // resultado, salario percibido por el trabajador long int slriofrutoY // salario bruto del trabajador double desuentosY // descuentos aplicados void glulrlriofruto@A // PRE salarioBase y antiguedad tienen un valor valido // POST salarioBruto contiene el salario bruto del trabajador { long int numerouinqueniosY long int numeroeyosY long int pgouinqueniosY long int pgoeyosY numerouinquenios a ntiguedd G SY numeroeyos a ntiguedd 7 SY pgouinquenios a numerouinquenios B gywviwixysxixsyY pgoeyos a numeroeyos B gywviwixyexyY slriofruto a slriofse C pgouinquenios C pgoeyosY

void glulrhesuentos@A // PRE se ha calculado el salario bruto y se ha asignado a salarioBruto // POST descuentos almacena el valor total de los descuentos sobre el salario bruto { desuentos a slriofruto B @swiy C iqywihsgyAY } void glulrlrioxeto@A /* PRE salarioBruto y descuentos almacenan, respectivamente, el salario bruto y el descuento que le corresponde */

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

/* POST salarioNeto contiene el salario recibido por el trabajador, salarioNeto = salarioBruto - descuentos */ { slrioxeto a slriofruto E desuentosY } int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.3. Calculo del salario neto de un *****\n"AY printf@"***** trabajador (version 1) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el salario base: "AY snf@" %ld"D8slriofseAY while @gethr@A 3a 9n9AY printf@"Introduzca la antiguedad: "AY snf@" %ld"D8ntigueddAY while @gethr@A 3a 9n9AY glulrlriofruto@AY glulrhesuentos@AY glulrlrioxeto@AY printf@"El sueldo neto es: %.2lf\n"D slrioxetoAY printf@"\nPulse enter para continuar"AY gethr@AY return HY } /* * Algoritmo 2.4. Calculo del salario neto de un trabajador (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb #include `onioFhb #define swiy HFPH #define iqywihsgy HFHS

ITES  PARANINFO c

10

Programas en C. Una introduccin a la Programacin.

#define gywviwixysxixsy TH #define gywviwixyexy T long int slriofseY // dato, sueldo base del trabajador int ntigueddY // dato, anyos en la empresa double slrioxetoY // resultado, salario percibido por el trabajador long int slriofrutoY // salario bruto del trabajador double desuentosY // descuentos aplicados int numerouinqueniosY int numeroenyosY long int pgouinqueniosY long int pgoenyosY int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.4. Calculo del salario neto de *****\n"AY printf@"***** un trabajador (version 2) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el salario base: "AY snf@" %ld"D 8slriofseAY while @gethr@A 3a 9n9AY printf@"Introduzca la antiguedad: "AY snf@" %ld"D 8ntigueddAY while @gethr@A 3a 9n9AY // Cslculo del salario bruto numerouinquenios a ntiguedd G SY numeroenyos a ntiguedd 7 SY pgouinquenios a numerouinquenios B gywviwixysxixsyY pgoenyos a numeroenyos B gywviwixyexyY slriofruto a slriofse C pgouinquenios C pgoenyosY // Calculo de los descuentos y el salario neto desuentos a slriofruto B @swiy C iqywihsgyAY slrioxeto a slriofruto E desuentosY printf @"El sueldo neto es: %.2lf\n"D slrioxetoAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

11

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

/* * Algoritmo 2.5. Expresar una cantidad de bytes en megabytes y kilobytes * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb #include `onioFhb long int nY // dato, numero de bytes a descomponer long int mY // resultado, numero de megabytes int kY // 0..1024, resultado, numero de kilobytes int Y // 0..1024, resultado, numero de bytes

void gonvertir @A // PRE 0 <= n // POST (n = 1048576mb + 1024kb + b) y (0 <= kb < 1024) y (0 <= b < 1024) { long int rY // 0..1048575, resto de bytes m a n G IHRVSUTY r a n 7 IHRVSUTY // E1: n = 1048576 mb + rb y 0 <= rb < 1048576 k a r G IHPRY a r 7 IHPRY } int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.5. Expresar una cantidad de bytes *****\n"AY printf@"***** en megabytes y kilobytes *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Descomposicion en bytes, kilobytes y megabytes\n"AY printf@"Introduzca un entero (>= 0): "AY snf@" %ld"D 8nAY while @gethr@A 3a 9n9AY gonvertir@AY printf@"La descomposicion es:\n"AY

ITES  PARANINFO c

12

Programas en C. Una introduccin a la Programacin.

printf@" Megabytes: %ld\n"D mAY printf@" Kilobytes: %d\n"D kAY printf@" Bytes: %d\n"D AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 2.6. Dibujar un cuadrado * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ /* No codificado */ /* * Algoritmo 2.7. Correspondencia entre calificaciones (version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb #include `onioFhb int notY // 0..20, nota en la universidad extranjera, 0 <= nota <= 20 int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.7. Correspondencia entre calificaciones (version 1) *****\ n"AY printf@"*****\n"AY

13

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

printf@"\n"AY printf@"Introduzca la nota (>= 0) y (<= 20): "AY snf@" %d"D 8notAY while @gethr@A 3a 9n9AY printf@"La calificacion es "AY switch @notA { case PH X printf@"matricula de honor"AY breakY case IWX case IV X printf@"sobresaliente"AY breakY case IUX case ITX printf@"notable"AY breakY case ISX case IRX printf@"aprobado"AY breakY defaultX if @not ` IRA printf@"suspenso"AY breakY } printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 2.8. Correspondencia entre calificaciones (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb #include `onioFhb int notY

int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.8. Correspondencia entre calificaciones (version 2) *****\ n"AY printf@"*****\n"AY

ITES  PARANINFO c

14

Programas en C. Una introduccin a la Programacin.

printf@"\n"AY printf@"Introduzca la nota (>= 0) y (<= 20): "AY snf@" %d"D8notAY while @gethr@A 3a 9n9AY printf@"La calificacion es "AY switch @notA { case PHX printf@"matricula de honor"AY breakY case IWX case IVX printf@"sobresaliente"AY breakY case IUX case ITX printf@"notable"AY breakY case ISX case IRX printf@"aprobado"AY breakY case IQX case IPX case IIX case IHX case WX case VX case UX case TX case SX case RX case QX case PX case IX case HX printf@"suspenso"AY breakY defaultX printf@"no valida"AY breakY } printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 2.9. Simulacion de una calculadora simple * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */

15

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

#include `stdioFhb #include `onioFhb int operndoID operndoPY char operdorY int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.9. Simulacion de una calculadora simple *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el primer operando entero: "AY snf@" %d"D 8operndoIAY while @gethr@A 3a 9n9AY printf@"Introduzca el segundo operando entero: "AY snf@" %d"D 8operndoPAY while @gethr@A 3a 9n9AY printf@"Introduzca el operador (+, *, -, /): "AY snf@" %c"D 8operdorAY while @gethr@A 3a 9n9AY printf@"El resultado de la operacion es: "AY switch @operdorA { case 9C9X printf@" %d"D operndoI C operndoPAY breakY case 9B9X printf@" %d"D operndoI B operndoPAY breakY case 9E9X printf@" %d"D operndoI E operndoPAY breakY case 9G9X printf@" %d"D operndoI G operndoPAY breakY defaultX printf@"operador incorrecto"AY breakY } printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY } /* * Algoritmo 2.10. Obtener el mayor de dos numeros enteros * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales

ITES  PARANINFO c

16

Programas en C. Una introduccin a la Programacin.

* Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb #include `onioFhb int xD zY int myorY int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.10. Obtener el mayor de dos numeros enteros *****\n"AY printf@"*****\n"AY printf@"\n"AY // PRE (x = X) y (z = Z) // POST ((x >= z) => (mayor = X)) y ((z >= x) => (mayor = Z)) printf@"Introduzca el primer entero: "AY snf@" %d"D 8xAY while @gethr@A 3a 9n9AY printf@"Introduzca el segundo entero: "AY snf@" %d"D 8zAY while @gethr@A 3a 9n9AY if @x ba zA myor a xY else myor a zY printf@"El numero mayor es: %d\n"D myorAY printf@"\nPulse enter para continuar"AY gethr@AY return HY } /* * Algoritmo 2.11. Comprobar si una fecha es correcta (version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb

17

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

#include `onioFhb #define fooleno int #define erddero I #define plso H unsigned unsigned long int fooleno fooleno int diY int mesY nyoY esfisiestoY // indicador de anyo bisiesto fehlidY // indicador de fecha valida

void enyofisiesto@A // POST esBisiesto es Verdadero si el anyo es bisiesto y Falso en caso contrario *) { esfisiesto a @nyo 7 R aa HA 88 @nyo 7 IHH 3a HA || @nyo 7 RHH aa HA 88 @nyo 3a QTHHAY } int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.11. Comprobar si una fecha es correcta (version 1) *****\n "AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el dia: "AY snf@" %u"D 8diAY while @gethr@A 3a 9n9AY printf@"Introduzca el mes: "AY snf@" %u"D 8mesAY while @gethr@A 3a 9n9AY printf@"Introduzca el anyo: "AY snf@" %ld"D 8nyoAY while @gethr@A 3a 9n9AY fehlid a erdderoY if @di ` IA fehlid a plsoY else switch @mesA { case IX case QX case SX case UX case VX

ITES  PARANINFO c

18

Programas en C. Una introduccin a la Programacin.

} printf@" %u/ %u/ %ld"D diD mesD nyoAY if @fehlidA printf@" es una fecha valida\n"AY else printf@" no es una fecha valida\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

case IHX case IPX // meses de 31 dias if @di b QIA fehlid a plsoY breakY case RX case TX case WX case IIX // meses de 30 dias *) if @di b QHA fehlid a plsoY breakY case PX // mes de febrero enyofisiesto@AY if @@di b PWA || @3esfisiesto 88 @di b PVAAA fehlid a plsoY breakY defaultX fehlid a plsoY breakY

/* * Algoritmo 2.12. Comprobar si una fecha es correcta (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb #include `onioFhb #define i I #define pevi H unsigned int diY unsigned int mesY long int nyoY int esfisiestoY // indicador de anyo bisiesto int fehlidY // indicador de fecha valida // igual que en Algoritmo 2.11

19

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

void enyofisiesto@A // POST esBisiesto es Verdadero si el anyo es bisiesto y Falso en caso contrario *) { esfisiesto a @nyo 7 R aa HA 88 @nyo 7 IHH 3a HA || @nyo 7 RHH aa HA 88 @nyo 3a QTHHAY } int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.12. Comprobar si una fecha es correcta (version 2) *****\n "AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el dia: "AY snf@" %u"D 8diAY while @gethr@A 3a 9n9AY printf@"Introduzca el mes: "AY snf@" %u"D 8mesAY while @gethr@A 3a 9n9AY printf@"Introduzca el anyo: "AY snf@" %ld"D 8nyoAY while @gethr@A 3a 9n9AY if @di ` IA fehlid a peviY else switch @mesA { case IX case QX case SX case UX case VX case IHX case IPX fehlid a di `a QIY breakY case RX case TX case WX case IIX fehlid a di `a QHY breakY case PX enyofisiesto@AY fehlid a @di `a PWA 88 @esfisiesto || @di `a PVAAY breakY defaultX fehlid a peviY breakY } printf@" %u/ %u/ %ld"D diD mesD nyoAY if @fehlidA printf@" es una fecha valida\n"AY

ITES  PARANINFO c

20

Programas en C. Una introduccin a la Programacin.

else printf@" no es una fecha valida\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 2.13. Calculo del salario neto de un trabajador (version 3) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb #include `onioFhb #define ryexywev IH #define ryeie IP #define wfevryeie IRH #define swiyfety HFIT #define swiyevy HFPP #define wfevivhy IQHH #define gywviwixysxixsy TH #define gywviwixyexy T unsigned int numerororsY // dato, horas trabajadas en un mes por el empleado id unsigned int idY // dato, identificador del empleado unsigned int ntigueddY // dato, anyos en la empresa float slrioxetoY // resultado, salario percibido por el trabajador long int slriofseY long int slriofrutoY float desuentosY void glulrlriofruto@A // PRE numeroHoras y antiguedad tienen un valor // POST salarioBruto contiene el salario bruto del trabajador { unsigned int numerouinqueniosY unsigned int numeroenyosY unsigned int pgouinqueniosY unsigned int pgoenyosY // calcular sueldo base por horas trabajadas

21

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

if @numerorors b wfevryeieA slriofse a @numerorors E wfevryeieA B ryeie C wfevryeie B ryexywevY else slriofse a numerorors B ryexywevY // calcular gratificacion por antiguedad numerouinquenios a ntiguedd G SY numeroenyos a ntiguedd 7 SY pgouinquenios a numerouinquenios B gywviwixysxixsyY pgoenyos a numeroenyos B gywviwixyexyY // calcular salario bruto slriofruto a slriofse C pgouinquenios C pgoenyosY } void glulrhesuentos@A // PRE salarioBruto almacena el salario bruto calculado // POST descuentos almacena el valor total de los descuentos sobre el salario bruto { if @slriofruto b wfevivhyA desuentos a slriofruto B swiyevyY else desuentos a slriofruto B swiyfetyY } void glulrlrioxeto@A /* PRE salarioBruto y descuentos almacenan, respectivamente, el salario bruto y el descuento correspondiente */ /* POST salarioNeto contiene el salario percibido por el trabajador, salarioNeto = salarioBruto !descuentos */ { slrioxeto a slriofruto E desuentosY } int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.13. Calculo del salario neto de *****\n"AY printf@"***** un trabajador (version 3) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Identificador del empleado: "AY snf@" %u"D 8idAY while @gethr@A 3a 9n9AY printf@"Numero de horas trabajadas en un mes por el empleado: "AY snf@" %u"D 8numerororsAY

ITES  PARANINFO c

22

Programas en C. Una introduccin a la Programacin.

while @gethr@A 3a 9n9AY printf@"Antiguedad del empleado: "AY snf@" %u"D 8ntigueddAY while @gethr@A 3a 9n9AY glulrlriofruto@AY glulrhesuentos@AY glulrlrioxeto@AY printf@"El salario del empleado %u es: %.2f\n"D idD slrioxetoAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 2.14. Dibujar un cuadrado a partir de la posicion de los vertices * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 2. Secuenciacion y analisis de casos */ /* No codificado */ /* * Algoritmo 2.15. Comprobar si una fecha es correcta (version 3) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Capitulo 2. Secuenciacion y analisis de casos */ #include `stdioFhb #include `onioFhb #define fooleno int #define erddero I #define plso H typedef struct { unsigned int diY // 1..31 unsigned int mesY // 1..12

23

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

long int nyoY } pehY peh fY // dato, fecha dia/mes/anyo fooleno esfisiestoY // indicador de ao bisiesto fooleno fehlidY // indicador de fecha vlida void enyofisiesto@A // POST esBisiesto es Verdadero si f.anyo es bisiesto y Falso en caso contrario { esfisiesto a @fFnyo 7 R aa HA 88 @fFnyo 7 IHH 3a HA || @fFnyo 7 RHH aa HA 88 @fFnyo 3a QTHHAY } int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 2.15. Comprobar si una fecha es correcta (version 3) *****\n "AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el dia: "AY snf@" %u"D 8fFdiAY while @gethr@A 3a 9n9AY printf@"Introduzca el mes: "AY snf@" %u"D 8fFmesAY while @gethr@A 3a 9n9AY printf@"Introduzca el anyo: "AY snf@" %ld"D 8fFnyoAY while @gethr@A 3a 9n9AY switch @fFmesA { case IX case QX case SX case UX case VX case IHX case IPX fehlid a erdderoY breakY case RX case TX case WX case IIX fehlid a fFdi 3a QIY breakY case PX enyofisiesto@AY fehlid a @fFdi `a PWA 88 @esfisiesto || @fFdi 3a PWAAY

ITES  PARANINFO c

24

Programas en C. Una introduccin a la Programacin.

breakY } printf@" %u/ %u/ %ld"D fFdiD fFmesD fFnyoAY if @fehlidA printf@" es una fecha valida\n"AY else printf@" no es una fecha valida\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

25

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

3.2. Captulo 3

/* * Algoritmo 3.1. Calcular el perimetro de un cuadrilatero irregular (version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 3. Acciones y funciones */ #include `stdioFhb #include `onioFhb #include `mthFhb typedef float goordendY typedef struct { goordend xY goordend yY } untoY

unto pID pPD pQD pRY unto poD pdY float distD perimetroY void histni@A // PRE po y pd almacenan dos puntos // POST dist almacena la distancia entre los puntos po y pd { dist a sqrt@pow@pdFx E poFxD PA C pow@pdFy E poFyD PAAY } void veerunto @float BxD float ByD short int nA { printf@" Coordenada x del punto %d: "D nAY snf@" %f"D xAY while @gethr@A 3a 9n9AY printf@" Coordenada y del punto %d: "D nAY snf@" %f"D yAY while @gethr@A 3a 9n9AY printf@"\n"AY } int min@A

ITES  PARANINFO c

26

Programas en C. Una introduccin a la Programacin.

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 3.1. Calcular el perimetro de un *****\n"AY printf@"***** cuadrilatero irregular (version 1) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca los puntos del cuadrilatero (en orden de adyacencia): \n\n"AY veerunto@8pIFxD 8pIFyD IAY veerunto@8pPFxD 8pPFyD PAY veerunto@8pQFxD 8pQFyD QAY veerunto@8pRFxD 8pRFyD RAY perimetro a HFHY // E0 : perimetro = 0 po a pIY pd a pPY histni@AY perimetro a distY // E1 : perimetro = Distancia (p1, p2) po a pPY pd a pQY histni@AY perimetro a perimetro C distY // E2 : perimetro = Distancia (p1, p2) + Distancia (p2, p3) po a pQY pd a pRY histni@AY perimetro a perimetro C distY // E3 : perimetro = Distancia (p1, p2) + Distancia (p2, p3) + Distancia (p3, p4) po a pRY pd a pIY histni@AY perimetro a perimetro C distY /* E4 : perimetro = Distancia (p1, p2) + Distancia (p2, p3) + Distancia (p3, p4) + Distancia (p4, p1) */ printf@"El perimetro del cuadrilatero irregular es: %.2f\n"D perimetroAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

27

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

/* * Algoritmo 3.2. Calcular el perimetro de un cuadrilatero irregular (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 3. Acciones y funciones */ #include `stdioFhb #include `onioFhb #include `mthFhb typedef float goordendY typedef struct { goordend xY goordend yY } untoY unto pID pPD pQD pRY float dID dPD dQD dRY float perimetroY void histni@unto poD unto pdD float BdistA // PRE po y pd almacenan dos puntos // POST dist retorna la distancia entre los puntos po y pd { } Bdist a sqrt@pow@pdFx E poFxD PA C pow@pdFy E poFyD PAAY

void veerunto@float BxD float ByD short int nA { printf@" Coordenada x del punto %d: "D nAY snf@" %f"D xAY while @gethr@A 3a 9n9AY printf@" Coordenada y del punto %d: "D nAY snf@" %f"D yAY while @gethr@A 3a 9n9AY printf@"\n"AY } int min@A {

ITES  PARANINFO c

28

Programas en C. Una introduccin a la Programacin.

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 3.2. Calcular el perimetro de un *****\n"AY printf@"***** cuadrilatero irregular (version 2) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca los puntos del cuadrilatero: \n\n"AY veerunto@8pIFxD 8pIFyD IAY veerunto@8pPFxD 8pPFyD PAY veerunto@8pQFxD 8pQFyD QAY veerunto@8pRFxD 8pRFyD RAY histni@pID pPD 8dIAY histni@pPD pQD 8dPAY histni@pQD pRD 8dQAY histni@pRD pID 8dRAY perimetro a dI C dP C dQ C dRY printf@"El perimetro del cuadrilatero irregular es: %.2f\n"D perimetroAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 3.3. Accion para el intercambio de dos variables * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 3. Acciones y funciones */ #include `stdioFhb #include `onioFhb int xD yY void sntermir@int BD int BA // PRE a, b : Entero, a = A, b = B // POST a = B, b = A {

29

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

int tY t a BY B a BY B a tY

int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 3.3. Accion para el intercambio de dos variables *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Valor inicial de x: "AY snf@" %d"D 8xAY while @gethr@A 3a 9n9AY printf@"Valor inicial de y: "AY snf@" %d"D 8yAY printf@"\n"AY while @gethr@A 3a 9n9AY sntermir@8xD 8yAY printf@"Valor final de x: %d\n"D xAY printf@"Valor final de y: %d\n"D yAY printf@"\nPulse enter para continuar"AY gethr@AY return HY } /* * Algoritmo 3.4. Desplazamiento circular de tres variables * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 3. Acciones y funciones */ #include `stdioFhb #include `onioFhb int D D Y

ITES  PARANINFO c

30

Programas en C. Una introduccin a la Programacin.

void sntermir@int BxD int ByA // PRE x, y : Entero, x = X, y = Y *) // POST x = Y, y = X *) { int tY t a BxY Bx a ByY By a tY

int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 3.4. Desplazamiento circular de tres variables *****\n"AY printf@"*****\n"AY printf@"\n"AY // PRE a, b, c : Entero, a = A, b = B, c = C // POST a, b, c : Entero, a = B, b = C, c = A printf@"Introduzca tres enteros separados por espacios\n"AY printf@"y termine pulsando enter: "AY snf@" %d %d %d"D 8D 8D 8AY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Valor inicial de a, b y c: %d, %d, %d\n"D D D AY printf@"\n"AY // E0 : a = A, b = B, c = C // E0 = PRE sntermir@8D 8AY // E1 : a = B, b = A, c = C sntermir@8D 8AY // Ef : a = B, b = C, c = A => Post printf@"Desplazamiento circular a la izquierda\n"AY printf@"\n"AY printf@"Valor final de a, b y c: %d, %d, %d\n"D D D AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 3.5. Algoritmo para dibujar dos cuadrados encajados

31

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

* Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 3. Acciones y funciones */


/* No codificado */ /* * Algoritmo 3.6. Calcular el perimetro de un cuadrilatero irregular (version 3) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 3. Acciones y funciones */ #include `stdioFhb #include `onioFhb #include `mthFhb

typedef float goordendY typedef struct { goordend xY goordend yY } untoY unto pID pPD pQD pRY float perimetroY float histni@unto poD unto pdA // PRE po y pd almacenan dos puntos // POST retorna la distancia entre los puntos po y pd { return sqrt@pow@pdFx E poFxD PA C pow@pdFy E poFyD PAAY } void veerunto@float BxD float ByD short int nA { printf@" Coordenada x del punto %d: "D nAY snf @" %f"D xAY while @gethr@A 3a 9n9AY

ITES  PARANINFO c

32

Programas en C. Una introduccin a la Programacin.

printf@" Coordenada y del punto %d: "D nAY snf @" %f"D yAY while @gethr@A 3a 9n9AY printf@"\n"AY

int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 3.6. Calcular el perimetro de un *****\n"AY printf@"***** cuadrilatero irregular (version 3) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca los puntos del cuadrilatero:\n"AY printf@"\n"AY veerunto@8pIFxD 8pIFyD IAY veerunto@8pPFxD 8pPFyD PAY veerunto@8pQFxD 8pQFyD QAY veerunto@8pRFxD 8pRFyD RAY perimetro a histni@pID pPA C histni@pPD pQA C histni@pQD pRA C histni@pR D pIAY printf@"El perimetro del cuadrilatero irregular es: %.2f"D perimetroAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 3.7. Funcion que obtiene el mayor de tres numeros (version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 3. Acciones y funciones */ #include `stdioFhb #include `onioFhb long int xD yD zY

33

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

int wxQ@long int D long int D long int A { int mY if @@ ba A 88 @ ba AA m a Y else if @@ ba A 88 @ ba AA m a Y else if @@ ba A 88 @ ba AA m a Y } return mY

int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 3.7. Funcion que obtiene el mayor *****\n"AY printf@"***** de tres numeros (version 1) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca tres enteros separados por espacios\n"AY printf@"y termine pulsando enter: "AY snf@" %ld %ld %ld"D 8xD 8yD 8zAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"El maximo de %ld, %ld y %ld es: %ld"D xD yD zD wxQ@xD yD zAAY printf@"\nPulse enter para continuar"AY gethr@AY return HY } /* * Algoritmo 3.8. Funcion que obtiene el mayor de tres numeros (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Mara J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 3. Acciones y funciones */

#include `stdioFhb #include `onioFhb

ITES  PARANINFO c

34

Programas en C. Una introduccin a la Programacin.

long int xD yD zY int wxP @long int D long int A { return @ C C s @ E AA G PY } int wxQ @long int D long int D long int A { return wxP@ D wxP @D AAY } int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 3.8. Funcion que obtiene el mayor de *****\n"AY printf@"***** tres numeros (version 2) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca tres enteros separados por espacios\n"AY printf@"y termine pulsando enter: "AY snf@" %ld %ld %ld"D 8xD 8yD 8zAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"El maximo de %ld, %ld y %ld es: %ld"D xD yD zD wxQ @xD yD zAAY printf@"\nPulse enter para continuar"AY gethr@AY return HY } /* * Algoritmo 3.9. Calcular la suma de dos duraciones de tiempo (version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 3. Acciones y funciones */ #include `stdioFhb #include `onioFhb

35

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

typedef struct { long int horY unsigned int minD segY // 0..59 } hurionY hurion tID tPY // entrada de datos hurion tQY // salida de datos hurion umrhuriones@hurion dID hurion dPA { unsigned int xD yY hurion resY y a @dIFseg C dPFsegA G THY // acarreo de segundos x a @dIFmin C dPFmin C yA G THY // acarreo de minutos resFhor a dIFhor C dPFhor C xY resFmin a @dIFmin C dPFmin C yA 7 THY resFseg a @dIFseg C dPFsegA 7 THY return resY

int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 3.9. Calcular la suma de dos *****\n"AY printf@"***** duraciones de tiempo (version 1) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca dos duraciones:\n\n"AY printf@" Horas de la duracion 1: "AY snf@" %d"D 8tIFhorAY while @gethr@A 3a 9n9AY printf@" Minutos de la duracion 1: "AY snf@" %d"D 8tIFminAY while @gethr@A 3a 9n9AY printf@" Segundos de la duracion 1: "AY snf@" %d"D 8tIFsegAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@" Horas de la duracion 2: "AY snf@" %d"D 8tPFhorAY while @gethr@A 3a 9n9AY printf@" Minutos de la duracion 2: "AY snf@" %d"D 8tPFminAY while @gethr@A 3a 9n9AY

ITES  PARANINFO c

36

Programas en C. Una introduccin a la Programacin.

printf@" Segundos de la duracion 2: "AY snf@" %d"D 8tPFsegAY while @gethr@A 3a 9n9AY tQ a umrhuriones@tID tPAY printf@"\nLa suma de las duraciones es : %d- %d- %d"D tQFhorD tQFminD tQFsegAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 3.10. Calcular la suma de dos duraciones de tiempo (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 3. Acciones y funciones */ #include `stdioFhb #include `onioFhb typedef struct { long int horY unsigned int minD segY // 0..59 } hurionY hurion tID tPY // entrada de datos hurion tQY // salida de datos long int gonvertirh@hurion dA { return @QTHH B dFhor C TH B dFmin C dFsegAY } hurion gonvertirh@long int nA { hurion dY unsigned int rhY // 0..3599 dFhor a n G QTHHY rh a n 7 QTHHY dFmin a rh G THY dFseg a rh 7 THY return dY

37

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

} hurion umrhuriones@hurion D hurion A { return gonvertirh@gonvertirh@A C gonvertirh@AAY } int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 3.10. Calcular la suma de dos *****\n"AY printf@"***** duraciones de tiempo (version 2) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca dos duraciones:\n\n"AY printf@" Horas de la duracion 1: "AY snf@" %d"D 8tIFhorAY while @gethr@A 3a 9n9AY printf@" Minutos de la duracion 1: "AY snf@" %d"D 8tIFminAY while @gethr@A 3a 9n9AY printf@" Segundos de la duracion 1: "AY snf@" %d"D 8tIFsegAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@" Horas de la duracion 2: "AY snf@" %d"D 8tPFhorAY while @gethr@A 3a 9n9AY printf@" Minutos de la duracion 2: "AY snf@" %d"D 8tPFminAY while @gethr@A 3a 9n9AY printf@" Segundos de la duracion 2: "AY snf@" %d"D 8tPFsegAY while @gethr@A 3a 9n9AY tQ a umrhuriones@tID tPAY printf@"\nLa suma de las duraciones es : %d- %d- %d"D tQFhorD tQFminD tQFsegAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 3.11. Comprobar si una fecha es valida (version 3)

ITES  PARANINFO c

38

Programas en C. Una introduccin a la Programacin.

* Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 3. Acciones y funciones */ #include `stdioFhb #include `onioFhb #define fooleno int #define erddero I #define plso H int diswesIP a {QID PVD QID QHD QID QHD QID QID QHD QID QHD QI}Y typedef struct { unsigned int diY // 1..31; unsigned int mesY // 1..12; unsigned int nyoY } pehY peh fY // fecha dia/mes/anyo fooleno enyofisiesto@int nyoA // PRE anyo es un entero /* POST AnyoBisiesto es verdad si anyo es bisiesto y falso en caso contrario */ { return @@nyo 7 RA aa HA 88 @@nyo 7 IHHA 3a HA || @@nyo 7 RHHA aa HA 88 @nyo 3a QTHHAY } int min@A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 3.11. Comprobar si una fecha es valida (version 3) *****\n"A Y printf@"*****\n"AY printf@"\n"AY printf@"Introduzca una fecha\n"AY printf@"Introduzca el dia: "AY snf@" %d"D 8fFdiAY

39

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

while @gethr@A 3a 9n9AY printf@"Introduzca el mes: "AY snf@" %d"D 8fFmesAY while @gethr@A 3a 9n9AY printf@"Introduzca el anyo: "AY snf@" %d"D 8fFnyoAY while @gethr@A 3a 9n9AY if @enyofisiesto@fFnyoAA diswesI a PWY printf@" %d/ %d/ %d "D fFdiD fFmesD fFnyoAY if @fFdi `a diswesfFmesEIA printf@"es una fecha valida\n"AY else printf@"no es una fecha valida\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

ITES  PARANINFO c

40

Programas en C. Una introduccin a la Programacin.

3.3. Captulo 4

/* * Algoritmo 4.1. Calcular el valor medio de las notas de una asignatura * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */ #include `stdioFhb #include `onioFhb int min@A { float vY // nota leida float sY // lleva cuenta de la suma total int nY // lleva cuenta del numero de notas lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.1. Calcular el valor medio de *****\n"AY printf@"***** las notas de una asignatura *****\n"AY printf@"*****\n"AY printf@"\n"AY s a HY n a HY printf@"Introduzca una nota (valor <0 para terminar): "AY snf@" %f"D 8vAY while @gethr@A 3a 9n9AY // E0 : s = 0 y n = 0 while @v ba HA { s a s C vY n a n C IY printf@"Introduzca una nota (valor <0 para terminar): "AY snf@" %f"D 8vAY while @gethr@A 3a 9n9AY /* Ei : s = suma de las n notas introducidas hasta este paso y n = numero de notas introducidas hasta este paso */ } /* Ef : s = suma de todas las notas y n = numero total de

41

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

notas introducidas */ if @n b HA printf@"Valor medio de las notas = %.2f\n"D sGnAY else printf@"No hay valores\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.2. Calcular el numero de ceros y unos en una secuencia de caracteres * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion * Fichero de entrada: datos4_2.TXT */

#include `stdioFhb #include `onioPFhb #include "msc1.h" int min@A { wsI sY int numgerosY int numnosY char Y

// secuencia de enteros // contador del numero de ceros // contador del numero de unos

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.2. Calcular el numero de ceros y unos *****\n"AY printf@"***** en una secuencia de caracteres *****\n"AY printf@"*****\n"AY printf@"\n"AY s a snitwgI@AY grgrpiherowgI@sD"datos4_2.txt"AY numgeros a HY numnos a HY printf@"La secuencia de entrada es: "AY gomenzrwgI@sAY while @iewgI@sA 3a wgIwrpin@AA {

ITES  PARANINFO c

42

Programas en C. Una introduccin a la Programacin.

} printf@"\n"AY printf@" Numero de ceros = %d\n"D numgerosAY printf@" Numero de unos = %d\n"D numnosAY printf@"\nPulse enter para continuar"AY gethr@AY } return HY

if @iewgI@sA aa 9H9A numgeros a numgeros C IY else numnos a numnos C IY printf@" %c "D iewgI@sAAY evnzrwgI@sAY

/* * Algoritmo 4.3. Crear una secuencia de caracteres a partir de otra existente * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion * Fichero de prueba: datos4_3.txt */ #include `stdioFhb #include `onioPFhb #include "msc1.h" int min@A { wsI sD tY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.3. Crear una secuencia de caracteres *****\n"AY printf@"***** a partir de otra existente *****\n"AY printf@"*****\n"AY printf@"\n"AY s a snitwgI@AY t a snitwgI@AY grgrpiherowgI@sD"datos4_3.txt"AY printf@"La secuencia de entrada es: "AY

43

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

gomenzrwgI@sAY errnrwgI@tAY while @iewgI@sA 3a wgIwrpin@AA { if @iewgI@sA aa 9B9A egistrrwgI@tD 9C9AY else egistrrwgI@tD iewgI@sAAY printf@" %c"D iewgI@sAAY evnzrwgI@sAY } wrrwgI@tAY printf@"La secuencia de salida es: "AY gomenzrwgI@tAY while @iewgI@tA 3a wgIwrpin@AA { printf@" %c"D iewgI@tAAY evnzrwgI@tAY } lvrpiherowgI@tD"sal4_3.txt"AY printf@"\n"AY printf@"Grabado\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.4. Calcular el valor medio de una secuencia con las notas de una asignatura * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion * Fichero de entrada: datos4_4.txt */

#include `stdioFhb #include `onioPFhb #include "msr1.h" int min@A { wsrI sY float sumY // lleva cuenta de la suma total de las notas int numilemY // lleva cuenta del numero de notas

ITES  PARANINFO c

44

Programas en C. Una introduccin a la Programacin.

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.4. Calcular el valor medio de una secuencia *****\n"AY printf@"***** con las notas de una asignatura *****\n"AY printf@"*****\n"AY printf@"\n"AY s a snitwI@AY grgrpiherowI@sD"datos4_4.txt"AY gomenzrwI@sAY printf@"La secuencia de entrada es: "AY sum a HFHY numilem a HY // Eini : suma = 0 y numElem = 0 y ea = Primero (S) y INV = Verdadero while @iewI@sA 3a wIwrpin@AA { // INV 1 <= i <= Long (Piz) y suma tiene el // sumatorio desde i=1 hasta Long(Piz) de Si // y numElem = Long (Piz) y (EA (S) <> MarcaFin) sum a sum C iewI@sAY numilem a numilem C IY printf@" %.2f "D iewI@sAAY evnzrwI@sAY } // Efin : INV y (EA (S) = MarcaFin) printf@"\n"AY printf@"\n"AY if @numilem b HA printf@"Valor medio de las notas = %.2f"D sumGnumilemAY else printf@"Secuencia vacia"AY printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY } /* * * * * * * * * * *

Algoritmo 4.5. Calcular el numero de pares ceros-unos en una secuencia de caracteres Titulo del libro: Una introduccion a la programacion. Un enfoque algoritmico Autores del libro: Jesus J. Garcia Molina Francisco J. Montoya Dato Jose L. Fernandez Aleman Maria J. Majado Rosales Fecha: 1/9/2005 Capitulo 4. La iteracion Fichero de entrada: datos4_5.txt

45

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

*/ #include `stdioFhb #include `onioPFhb #include "msc1.h" int min@A { wsI sY int numgerosY // lleva cuenta del numero de '0' int numresY // lleva cuenta del numero de pares lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.5. Calcular el numero de pares ceros-unos *****\n"AY printf@"***** en una secuencia de caracteres *****\n"AY printf@"*****\n"AY printf@"\n"AY s a snitwgI@AY grgrpiherowgI@sD"datos4_5.txt"AY gomenzrwgI@sAY printf@"La secuencia de entrada es: "AY numgeros a HY numres a HY // INV y (EA = Primero (S)) while @iewgI@sA 3a wgIwrpin@AA { // INV : numPares = NumPares (Piz), numCeros = NumCeros (Piz) // INV y (EA_MSC1 <> MarcaFin) switch @iewgI@sAA { case 9H9X numgeros a numgeros C IY breakY case 9I9X numres a numres C numgerosY breakY } printf@" %c"D iewgI@sAAY evnzrwgI@sAY } // INV y (EA = MarcaFin), numPares = NumPares (S) *) printf@"\n"AY printf@"\n"AY printf@"El numero de pares 0-1 es: %d\n"D numresAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.6. Calculo del factorial (version 1)

ITES  PARANINFO c

46

Programas en C. Una introduccin a la Programacin.

* Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */ #include `stdioFhb #include `onioFhb int min@A { int nD iY long int ftorilY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.6. Calculo del factorial (version 1) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un entero (< 17): "A Y snf@" %d"D 8nAY while @gethr@A 3a 9n9AY i a HY ftoril a IY while @i ` nA { // INV: factorial = i! i a i C IY ftoril a ftoril B iY } printf@"\n"AY printf@"El factorial de %d es: %ld\n"D nD ftorilAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.7. Calculo del factorial (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato

47

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

* Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */ #include `stdioFhb #include `onioFhb int min@A { int nD iY long int ftorilY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.7. Calculo del factorial (version 2) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un entero (< 17): "AY snf@" %d"D 8nAY while @gethr@A 3a 9n9AY ftoril a IY for @iaPY i`anY iCCA ftoril a ftoril B iY // INV factorial = i! printf@"\n"AY printf@"El factorial de %d es: %ld\n"D nD ftorilAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.8. Calculo del producto mediante sumas sucesivas * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */ #include `stdioFhb

ITES  PARANINFO c

48

Programas en C. Una introduccin a la Programacin.

#include `onioFhb int min@A { int D D produtoY int iY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.8. Calculo del producto mediante sumas sucesivas *****\n"A Y printf@"*****\n"AY printf@"\n"AY printf@"Introduzca dos numeros enteros separados por blancos: "AY snf@" %d %d"D 8D 8AY while @gethr@A 3a 9n9AY produto a HY for @iaIY i`aY iCCA produto a produto C Y // INV producto = a * i y 1 <= i <= b // INV y (i = b), producto = a * b = POST printf@"\n"AY printf@" %d* %d= %d\n"D D D produtoAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.9. Calculo del cociente y resto de una division entera * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */ #include `stdioFhb #include `onioFhb int min@A { int pD D rY

49

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

int qY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.9. Calculo del cociente y resto de una division entera *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca dividendo (>= 0) y divisor (> 0) separados por blancos: "AY snf@" %d %d"D 8pD 8qAY while @gethr@A 3a 9n9AY r a pY a HY while @r ba qA { // INV (p = q * c + r) y (r >= 0) r a r E qY a C IY } // INV y (r < q) => POST printf@"\n"AY printf@"Cociente = %d Resto = %d\n"D D rAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.10. Calculo del maximo comun divisor * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */ #include `stdioFhb #include `onioFhb

int min@A { unsigned int D D uD vY lrsr@AY printf@"\n"AY

ITES  PARANINFO c

50

Programas en C. Una introduccin a la Programacin.

printf@"*****\n"AY printf@"***** Algoritmo 4.10. Calculo del maximo comun divisor *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca dos enteros (> 0) separados por blancos: "AY snf@" %u %u"D 8D 8AY while @gethr@A 3a 9n9AY u a Y v a Y while @u 3a vA // INV (* mcd (a,b) = mcd (u,v) if @u b vA u a u E vY else v a v E uY //INV y (u = v) printf@"\n"AY printf@"Maximo comun divisor de %u y %u es: %u\n"D D D uAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.11. Calculo de las potencias de 2 (version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */ #include `stdioFhb #include `onioFhb long int oteniP@int nA // PRE n : Entero >= 0 // POST Potencia2 = 2^n { long int pY int jY p a IY for @j a IY j`anY jCCA p a p B PY // INV p = 2^j return pY

51

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

} int min@A { int iY int xY int yY

// indice inferior del intervalo de potencias // indice superior del intervalo

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.11. Calculo de las potencias de 2 (version 1) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca dos enteros (>= 0) en orden creciente separados por blancos: "AY snf@" %d %d"D 8xD 8yAY while @gethr@A 3a 9n9AY printf@"\n"AY for @i a xY i `a yY iCCA printf@"La potencia %d-esima de 2 es: %ld\n"D iD oteniP@iAAY /* INV se han calculado y mostrado las potencias de 2 en el intervalo [x,i] */ printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.12. Calculo de las potencias de 2 (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */

#include `stdioFhb #include `onioFhb int min@A { int xY // indice inferior int yY // indice superior long int poteniPY // resultado

ITES  PARANINFO c

52

Programas en C. Una introduccin a la Programacin.

int iY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.12. Calculo de las potencias de 2 (version 2) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca dos enteros (>= 0) en orden creciente separados por blancos: "AY snf@" %d %d"D 8xD 8yAY while @gethr@A 3a 9n9AY printf@"\n"AY poteniP a IY for @iaIY i`axY iCCA poteniP a poteniP B PY // INV potencia2 = 2^i printf@"La potencia %d-esima de 2 es: %ld\n"D xD poteniPAY for @iaxCIY i`ayY iCCA { poteniP a poteniP B PY printf@"La potencia %d-esima de 2 es: %ld\n"D iD poteniPAY /* INV potencia2 = 2^i y se han mostrado las potencias de 2 en el intervalo [x,i] */ } printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.13. Calculo del termino enesimo de la sucesion de Fibonacci * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */ #include `stdioFhb #include `onioFhb int min@A { long int ultD penultY // ultimo y penultimo termino de Fibonacci long int opipioY // valor Fibonacci en el paso i-1

53

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

long int fioY int nY int iY

// resultado // dato

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.13. Calculo del termino enesimo *****\n"AY printf@"***** de la sucesion de Fibonacci *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un entero (>= 0): "AY snf@" %d"D 8nAY while @gethr@A 3a 9n9AY printf@"\n"AY switch @nA { case H X case I X printf@"El termino %d-esimo de la sucesion (posicion %d) es: 1\n"D nD nCIAY breakY default X penult a IY ult a IY fio a PY for @iaQY i`anY iCCA { opipio a fioY fio a fio C ultY penult a ultY ult a opipioY /* INV (fibo = fi) y (ult = fi-1) y (penult = fi-2), 3 <= i <= n */ } // INV y (i = n) printf@"El termino %d-esimo de la sucesion (posicion %d) es: %d\n"D nD nCID fioAY } printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.14. Comprobar si un numero es primo (version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales

ITES  PARANINFO c

54

Programas en C. Una introduccin a la Programacin.

* Fecha: 1/9/2005 * Capitulo 4. La iteracion */ #include `stdioFhb #include `onioFhb int min@A { int nY int jY

// dato

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.14. Comprobar si un numero es primo (version 1) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un entero (> 0): "AY snf@" %d"D 8nAY while @gethr@A 3a 9n9AY printf@"\n"AY if @n aa IA printf@"1 es primo\n"AY else { j a PY while @@n 7 jA 3a HA j a j C IY // INV ( i : 2 <= i < j : (n % i) <> 0) // INV y (n % j = 0) if @j aa nA printf@" %d es primo\n"D nAY else printf@" %d no es primo\n"D nAY } printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * * * * * * * *

Algoritmo 4.15. Comprobar si un numero es primo (version 2) Titulo del libro: Una introduccion a la programacion. Un enfoque algoritmico Autores del libro: Jesus J. Garcia Molina Francisco J. Montoya Dato Jose L. Fernandez Aleman Maria J. Majado Rosales Fecha: 1/9/2005

55

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

* Capitulo 4. La iteracion */ #include `stdioFhb #include `onioFhb int min@A { int nY int jY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.15. Comprobar si un numero es primo (version 2) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un entero (> 0): "AY snf@" %d"D 8nAY while @gethr@A 3a 9n9AY printf@"\n"AY if @@n aa IA || @n aa PA || @n aa QAA printf@" %d es primo\n"D nAY else if @@n b QA 88 @@n 7 PA aa HAA printf@" %d es par, no es primo\n"D nAY else if @@n b QA 88 @@n 7 PA 3a HAA { j a QY while @@@n 7 jA 3a HA 88 @j ` @n G jAAA j a j C PY // INV (i : 3 <= i < j : (n MOD i) <> 0) *) // INV y (n MOD j = 0) o (j = (n DIV j))*) if @@n 7 jA 3a HA printf@" %d es primo\n"D nAY else printf@" %d no es primo\n"D nAY } printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.16. Calcular la parte entera de la raiz cuadrada de un entero (version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion

ITES  PARANINFO c

56

Programas en C. Una introduccin a la Programacin.

*/ #include `stdioFhb #include `onioFhb int min@A { int nD rY // n dato de entrada, rc parte entera de la raiz int iY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.16. Calcular la parte entera de la raiz cuadrada *****\n"A Y printf@"***** de un entero (version 1) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un entero (>= 0): "AY snf@" %d"D 8nAY printf@"\n"AY while @gethr@A 3a 9n9AY i a IY while @n ba i B iA // INV ( j : 1 <= j < i : (j^2 <= n)) i a i C IY // INV y (n < i^2) r a i E IY printf@"La parte entera de la raiz cuadrada de %d es: %d\n"DnD rAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.17. Calcular la parte entera de la raiz cuadrada de un entero (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */ #include `stdioFhb

57

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

#include `onioFhb int min@A { int nD rY // n dato, rc resultado int impD iD Y lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.17. Calcular la parte entera de la raiz cuadrada *****\n"A Y printf@"***** de un entero (version 2) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un entero (>= 0): "AY snf@" %d"D 8nAY while @gethr@A 3a 9n9AY printf@"\n"AY i a IY a IY imp a IY while @ `a nA { /* INV (j : 1 <= j < i : (j^2 <= n) <> 0) y (c = i^2) y c es el i-esimo cuadrado, e imp es el i-esimo impar */ imp a imp C PY a C impY i a i C IY } // INV y (n < c) r a i E IY printf@"La parte entera de la raiz cuadrada de %d es: %d\n"D n DrAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.18. Calcular 1/x a partir de una sucesion recurrente * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */

ITES  PARANINFO c

58

Programas en C. Una introduccin a la Programacin.

#include `stdioFhb #include `onioFhb int min@A { float float float float xY Y Y epsY // // // // dato entre 0 y 1 resultado para el calculo de la sucesion error

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.18. Calcular 1/x a partir de una sucesion recurrente *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un valor real (<= 1) y (> 0): "AY snf@" %f"D 8xAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Introduzca el error permitido: "AY snf@" %f"D 8epsAY while @gethr@A 3a 9n9AY printf@"\n"AY a IY a I E xY while @ b epsA { a B @I C AY a B Y } printf@"El resultado de evaluar la expresion 1/ %f es: %f\n"D xD AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 4.19. Aproxima e elevado a x a partir de su desarrollo en serie * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 4. La iteracion */

59

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

#include `stdioFhb #include `onioFhb int min@A { int xY int iY float tD sY float epsY

// // // //

dato numero de termino termino y suma de la serie error

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 4.19. Aproxima e elevado a x *****\n"AY printf@"***** a partir de su desarrollo en serie *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un entero: "AY snf@" %d"D 8xAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Introduzca el error permitido: "AY snf@" %f"D 8epsAY while @gethr@A 3a 9n9AY t a IY s a tY i a HY while @t b epsA { i a i C IY t a t B @@floatA x G @floatA iAY s a s C tY } printf@"\n"AY printf@"e elevado a %d es: %f\n"D xD sAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

ITES  PARANINFO c

60

Programas en C. Una introduccin a la Programacin.

3.4. Captulo 5

/* * Algoritmo 5.1. Calcular el numero de pares (primer modelo, tercer esquema) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: datos5_1.txt */ #include `stdioFhb #include `onioPFhb #include "mse1.h" int min@A { int D Y int numeD numfY int numresY wseI Y lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 5.1. Calcular el numero de pares *****\n"AY printf@"***** (primer modelo, tercer esquema) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un par de enteros:\n"AY printf@" primer entero: "AY snf@" %d"D 8AY while @gethr@A 3a 9n9AY printf@" segundo entero: "AY snf@" %d"D 8AY while @gethr@A 3a 9n9AY a snitwiI@AY grgrpiherowiI@D"datos5_1.txt"AY gomenzrwiI@AY if @iewiI@A aa wiIwrpin@AA printf@"Secuencia vacia"AY else { printf@"\n"AY printf@"La secuencia de entrada es: "AY

61

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

} printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

printf@" %d "D iewiI@AAY numres a HY if @iewiI@A aa A { nume a IY numf a HY } else if @iewiI@A aa A { nume a HY numf a IY } else { nume a HY numf a HY } // Se utiliza la equivalencia ITERAR-MIENTRAS evnzrwiI@AY while @iewiI@A 3a wiIwrpin@AA { if @iewiI@A aa A { numres a numres C numfY nume a nume C IY } else if @iewiI@A aa A { numres a numres C numeY numf a numf C IY } printf@" %d "D iewiI@AAY evnzrwiI@AY } printf@"\n\n"AY printf@"El numero de pares ( %d, %d) ( %d, %d) es: %d"D D D D D numresAY

/* * Algoritmo 5.2. Calcular el numero de pares (segundo modelo, tercer esquema) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: datos5_2.txt */ #include `stdioFhb #include `onioPFhb #include "mse2.h"

int min@A {

ITES  PARANINFO c

62

Programas en C. Una introduccin a la Programacin.

int D Y int numeD numfY int numresY wseP Y lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 5.2. Calcular el numero de pares *****\n"AY printf@"***** (segundo modelo, tercer esquema) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un par de enteros:\n"AY printf@" primer entero: "AY snf@" %d"D 8AY while @gethr@A 3a 9n9AY printf@" segundo entero: "AY snf@" %d"D 8AY while @gethr@A 3a 9n9AY a snitwiP@AY grgrpiherowiP@D"datos5_2.txt"AY sniirwiP@AY if @isiwiP@AA printf@"Secuencia vacia"AY else { printf@"\n"AY printf@"La secuencia de entrada es: "AY evnzrwiP@AY printf@" %d "D iewiP@AAY numres a HY if @iewiP@A aa A { nume a IY numf a HY } else if @iewiP@A aa A { nume a HY numf a IY } else { nume a HY numf a HY } while @3isltimowiP@AA { evnzrwiP@AY printf@" %d "D iewiP@AAY if @iewiP@A aa A { numres a numres C numfY nume a nume C IY } else if @iewiP@A aa A { numres a numres C numeY numf a numf C IY } } printf@"\n"AY printf@"\n"AY printf@"El numero de pares ( %d, %d) ( %d, %d) es: %d"D D D D D numresAY

63

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

} printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY


/* * Algoritmo 5.3. Calcular el numero de pares (tercer modelo, segundo esquema) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: datos5_3.txt */ #include `stdioFhb #include `onioPFhb #include "mse1.h" #define fooleno int #define erddero I #define plso H /* * Maquina abstracta del tercer modelo a partir de * una maquina secuencial del primer modelo */ int uxY

void gomenzrwiQ@wseI A { gomenzrwiI@AY ux a iewiI@AY evnzrwiI@AY } void evnzrwiQ@wseI A { ux a iewiI@AY evnzrwiI@AY }

ITES  PARANINFO c

64

Programas en C. Una introduccin a la Programacin.

int iewiQ@wseI A { return uxY } void grgrpiherowiQ@wseI D char BnomreA { grgrpiherowiI@D nomreAY } fooleno isiwiQ@wseI A { return iewiI@A aa wiIwrpin@AY } fooleno isltimowiQ@wseI A { return iewiI@A aa wiIwrpin@AY } wseI snitwiQ@A { return snitwiI@AY } int min@A { int D Y int numeD numfY int numresY wseI Y lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 5.3. Calcular el numero de pares *****\n"AY printf@"***** (tercer modelo, segundo esquema) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un par de enteros:\n"AY printf@" primer entero: "AY snf@" %d"D 8AY while @gethr@A 3a 9n9AY printf@" segundo entero: "AY snf@" %d"D 8AY while @gethr@A 3a 9n9AY a snitwiQ@AY

65

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

grgrpiherowiQ@D"datos5_3.txt"AY gomenzrwiQ@AY if @isiwiQ@AA printf@"Secuencia vacia"AY else { printf@"\n"AY printf@"La secuencia de entrada es: "AY printf@" %d "D iewiQ@AAY numres a HY nume a HY numf a HY // Se utiliza la equivalencia ITERAR-MIENTRAS if @iewiQ@A aa A { numres a numres C numfY nume a nume C IY } else if @iewiQ@A aa A { numres a numres C numeY numf a numf C IY } while @3isltimowiQ@AA { evnzrwiQ@AY printf@" %d "D iewiQ@AAY if @iewiQ@A aa A { numres a numres C numfY nume a nume C IY } else if @iewiQ@A aa A { numres a numres C numeY numf a numf C IY } } printf@"\n"AY printf@"\n"AY printf@"El numero de pares ( %d, %d) ( %d, %d) es: %d"D D D D D numresAY } printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 5.4. Calcular el numero de pares (cuarto modelo, segundo esquema) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato

ITES  PARANINFO c

66

Programas en C. Una introduccin a la Programacin.

* Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: dat5_4.txt */ #include `stdioFhb #include `onioPFhb #include "mse1.h" #define fooleno int #define erddero I #define plso H /* * Maquina abstracta del cuarto modelo a partir de * una maquina secuencial del primer modelo */ ipofsewiI wiRwrpin@A { return wiIwrpin@AY } fooleno omenzrY wseI snitwiR@A { return snitwiI@AY } void sniirwiR@wseI A { gomenzrwiI@AY omenzr a plsoY } void evnzrwiR@wseI A { if @3omenzrA omenzr a erdderoY else evnzrwiI@AY } int iewiR@wseI A {

67

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

return iewiI@AY

void grgrpiherowiR@wseI D char BnomreA { grgrpiherowiI@D nomreAY } fooleno isiwiR@wseI A { return iewiI@A aa wiIwrpin@AY } int min@A { int D Y int numeD numfY int numresY wseI Y lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 5.4. Calcular el numero de pares *****\n"AY printf@"***** (cuarto modelo, segundo esquema) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un par de enteros:\n"AY printf@" primer entero: "AY snf@" %d"D 8AY while @gethr@A 3a 9n9AY printf@" segundo entero: "AY snf@" %d"D 8AY while @gethr@A 3a 9n9AY a snitwiR@AY grgrpiherowiR@D"datos5_4.txt"AY sniirwiR@AY if @isiwiR@AA printf@"Secuencia vacia"AY else { printf@"\n"AY printf@"La secuencia de entrada es: "AY numres a HY nume a HY numf a HY evnzrwiR@AY do {

ITES  PARANINFO c

68

Programas en C. Una introduccin a la Programacin.

} printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

} while @iewiR@A 3a wiRwrpin@AAY printf@"\n"AY printf@"\n"AY printf@"El numero de pares ( %d, %d) ( %d, %d) es: %d"D D D D D numresAY

if @iewiR@A aa A { numres a numres C numfY nume a nume C IY } else if @iewiR@A aa A { numres a numres C numeY numf a numf C IY } printf@" %d "D iewiR@AAY evnzrwiR @AY

/* * Algoritmo 5.5. Comprobar si hay una nota mayor o igual que 9 (primer modelo) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: datos5_5.txt */ #include `stdioFhb #include `onioPFhb #include "msr1.h" int min@A { wsrI Y lrsr@AY printf@"\n"AY printf@"*****\n"AY

69

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

printf@"***** Algoritmo 5.5. Comprobar si hay una nota mayor o igual que 9 *****\n"A Y printf@"***** (primer modelo) *****\n"AY printf@"*****\n"AY printf@"\n"AY a snitwI@AY grgrpiherowI@D"datos5_5.txt"AY printf@"La secuencia de entrada es: "AY gomenzrwI@AY while @iewI@A 3a wIwrpin@AA { printf@" %.2f "D iewI@AAY evnzrwI@AY } printf@"\n"AY gomenzrwI@AY while @@iewI@A 3a wIwrpin@AA 88 @3@iewI@A ba WAAA evnzrwI@AY // INV "No existe en Piz una nota superior o igual a 9" // fin while printf@"\n"AY if @iewI@A aa wIwrpin@AA printf@"No existe ninguna nota superior o igual a 9"AY else printf@"Al menos existe una nota superior o igual a 9"AY printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 5.6. Comprobar si hay una nota mayor o igual que 9 (segundo modelo) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: datos5_6.txt */

#include `stdioFhb #include `onioPFhb #include "msr2.h"

ITES  PARANINFO c

70

Programas en C. Una introduccin a la Programacin.

int min@A { wsrP Y lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 5.6. Comprobar si hay una nota mayor o igual que 9 *****\n"A Y printf@"***** (segundo modelo) *****\n"AY printf@"*****\n"AY printf@"\n"AY a snitwP@AY grgrpiherowP@D"datos5_6.txt"AY printf@"La secuencia de entrada es: "AY sniirwP@AY evnzrwP@AY printf@" %.2f "D iewP@AAY do { // INV "No existe en Piz una nota superior o igual a 9" evnzrwP@AY printf@" %.2f "D iewP@AAY } while @3@isltimowP@AAAY sniirwP@AY if @isiwP@AA printf@"Nadie se ha presentado al examen"AY else { do // INV "No existe en Piz una nota superior o igual a 9" evnzrwP@AY while @3@isltimowP@A || @iewP@A ba WAAAY printf@"\n"AY printf@"\n"AY if @iewP@A ba WA printf@"Al menos existe una nota superior o igual a 9"AY else printf@"No existe ninguna nota superior o igual a 9"AY }Y printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 5.7. Calculo posicion de la primera palabra que comienza por 'a' * (primer modelo, primer esquema)

71

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

* Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: datos5_7.txt */ #include `stdioFhb #include `onioPFhb #include "msc1.h" #define iegsy 9 9 int min@A { int posiionY char nteriorY wsI Y lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 5.7. Calculo posicion de la primera palabra que comienza *****\n"AY printf@"***** por 'a' (primer modelo, primer esquema) *****\n"AY printf@"*****\n"AY printf@"\n"AY a snitwgI@AY grgrpiherowgI@D"datos5_7.txt"AY printf@"La secuencia de entrada es: "AY gomenzrwgI @AY while @iewgI @A 3a wgIwrpin@AA { printf@" %c"D iewgI @AAY evnzrwgI@AY }Y gomenzrwgI @AY posiion a HY nterior a iegsyY while @@iewgI @A 3a wgIwrpin@AA 88 3@@iewgI @A aa 99A 88 @nterior aa iegsyAAA { posiion a posiion C IY nterior a iewgI @AY evnzrwgI @AY // INV "En Piz ninguna palabra empieza por 'a'" y posicion = Long (Piz)

ITES  PARANINFO c

72

Programas en C. Una introduccin a la Programacin.

}Y printf@"\n"AY printf@"\n"AY if @iewgI @A aa wgIwrpin@AA printf@"El texto no contiene ninguna palabra que comience por la letra a"AY else printf@"Posicion de la primera palabra que comienza por a es: %d"D posiionCIAY printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 5.8. Calculo posicion de la primera palabra que comienza por 'a' * (primer modelo, tercer esquema) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: datos5_8.txt */ #include `stdioFhb #include `onioPFhb #include "msc1.h" #define #define #define #define iegsy 9 9 fooleno int erddero I plso H

int min@A { int posiionY char nteriorY wsI Y lrsr@AY printf@"\n"AY printf@"*****\n"AY

73

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

printf@"***** Algoritmo 5.8. Calculo posicion de la primera palabra que comienza *****\n"AY printf@"***** por 'a' (primer modelo, tercer esquema) *****\n"AY printf@"*****\n"AY printf@"\n"AY a snitwgI@AY grgrpiherowgI@D"datos5_8.txt"AY printf@"La secuencia de entrada es: "AY gomenzrwgI @AY while @@iewgI @A 3a wgIwrpin@AAA { printf@" %c"D iewgI @AAY evnzrwgI@AY }Y printf@"\n"AY gomenzrwgI @AY if @iewgI@A aa wgIwrpin@AA printf@"\nLa secuencia esta vacia"AY else if @iewgI @A aa 99A printf@"Posicion de la primera palabra que comienza por a es: %d"D IAY else { posiion a IY nterior a iewgI @AY // Se utiliza la equivalencia ITERAR-MIENTRAS // INV "En Piz ninguna palabra empieza por 'a'" y posicion = Long (Piz) do { evnzrwgI @AY if @@iewgI@A aa wgIwrpin@AA || @@iewgI@A aa 99A 88 @nterior aa iegsyAAA breakY posiion a posiion C IY nterior a iewgI@AY } while @erdderoAY printf@"\n"AY if @iewgI@A aa wgIwrpin@AA printf@"El texto no contiene ninguna palabra que comience por la letra a"AY else printf@"Posicion de la primera palabra que comienza por a es: %d"D posiionCIAY } printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 5.9. Comprobar si todas las palabras acaban con la misma letra

ITES  PARANINFO c

74

Programas en C. Una introduccin a la Programacin.

* (primer modelo, sin secuencia intermedia) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: datos5_9.txt */ #include `stdioFhb #include `onioPFhb #include "msc1.h" #define iegsy 9 9 int min@A { char ultvetrrimlD nteriorY wsI Y lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 5.9. Comprobar si todas las palabras acaban con la misma *****\n"AY printf@"***** letra (primer modelo, sin secuencia intermedia) *****\n"AY printf@"*****\n"AY printf@"\n"AY /* Esquema de recorrido y busqueda. Encontrar letra final de la primera palabra */ a snitwgI@AY grgrpiherowgI@D"datos5_9.txt"AY printf@"La secuencia de entrada es: "AY gomenzrwgI@AY while @iewgI@A 3a wgIwrpin@AA { printf@" %c"D iewgI@AAY evnzrwgI@AY }Y printf@"\n"AY gomenzrwgI@AY nterior a iegsyY while @@iewgI@A 3a wgIwrpin@AA 88 3@@iewgI@A aa iegsyA 88 @nterior 3a iegsyAAA { nterior a iewgI@AY evnzrwgI@AY

75

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

/* INV anterior = "ultimo elemento de Piz" y "no hay ningun par (letra, espacio) en Piz" */ }Y if @@iewgI@A aa wgIwrpin@AA 88 @nterior aa iegsyAA printf@"No hay palabras en la secuencia"AY else if @@iewgI@A aa wgIwrpin@AAA /* Solo hay una palabra y anterior <> ESPACIO */ printf@"Todas las palabras terminan en la misma letra"AY else { /* EA (S) es un espacio en blanco Esquema de recorrido y busqueda. Comprobar en el resto de la secuencia */ ultvetrriml a nteriorY nterior a iewgI@AY evnzrwgI@AY while @@iewgI@A 3a wgIwrpin@AA 88 3@@iewgI@A aa iegsyA 88 @nterior 3a iegsyA 88 @nterior 3a ultvetrrimlAAA { nterior a iewgI@AY evnzrwgI@AY /* INV anterior = "ultimo elemento de Piz" y "no hay ningun par (letra, espacio) en Piz tal que letra <> ultLetraPrimPal" */ }Y printf@"\n"AY if @@iewgI@A aa wgIwrpin@AA 88 @@nterior aa ultvetrrimlA || @nterior aa iegsyAAA printf@"Todas las palabras terminan en la misma letra"AY else printf@"Todas las palabras no terminan en la misma letra"AY }Y printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 5.10. Comprobar si todas las palabras acaban con la misma letra * (primer modelo, con secuencia intermedia formada por las * ultimas letras de cada palabra) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales

ITES  PARANINFO c

76

Programas en C. Una introduccin a la Programacin.

* Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: datos5_10.txt */ #include `stdioFhb #include `onioPFhb #include "msc1.h" #define iegsy 9 9 #define fooleno int #define erddero I #define plso H char ultvetrY fooleno pinheeueniltvetrY char ultvetrrimlY wsI Y void sgnorrispios@A // POST EA es la siguiente letra, si la hay { while @@iewgI@A 3a wgIwrpin@AA 88 @iewgI@A aa iegsyAA evnzrwgI@AY } void ytenerltimo@A /* POST ultLetra es la ltima letra de la siguiente palabra, si la hay, y se actualiza FinDeSecuenciaUltLetra */ { sgnorrispios@AY if @@iewgI@A aa wgIwrpin@AAA pinheeueniltvetr a erdderoY else { pinheeueniltvetr a plsoY do { ultvetr a iewgI@AY evnzrwgI@AY } while @3@@iewgI@A aa wgIwrpin@AA || @iewgI@A aa iegsyAAAY }Y } void gomenzrltvetr@A /* POST ultLetra es la ultima letra de la primera palabra, si la hay, y se actualiza FinDeSecuenciaUltLetra */ { gomenzrwgI@AY ytenerltimo@AY

77

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

} void evnzrltvetr@A /* POST ultLetra es la ltima letra de la siguiente palabra, si la hay, y se actualiza FinDeSecuenciaUltLetra */ { ytenerltimo@AY } int min @A { lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 5.10. Comprobar si todas las palabras acaban con la *****\n" AY printf@"***** misma letra (primer modelo, con secuencia *****\n"AY printf@"***** intermedia formada por las ultimas letras de *****\n"AY printf@"***** cada palabra) *****\n"AY printf@"*****\n"AY printf@"\n"AY a snitwgI@AY grgrpiherowgI@D"dat5_10.txt"AY printf@"La secuencia de entrada es: "AY gomenzrwgI@AY while @iewgI@A 3a wgIwrpin@AA { printf@" %c"D iewgI@AAY evnzrwgI@AY }Y printf@"\n"AY gomenzrltvetr@AY if @pinheeueniltvetrA printf@"No hay palabras"AY else { ultvetrriml a ultvetrY do evnzrltvetr@AY // INV Todas las letras de Piz son iguales a ultLetraPrimPal while @3@pinheeueniltvetr || @ultvetr 3a ultvetrrimlAAAY printf@"\n"AY if @pinheeueniltvetrA printf@"Todas las palabras terminan en la misma letra"AY else printf@"Todas las palabras no terminan en la misma letra"AY } printf@"\n"AY printf@"\nPulse enter para continuar"AY

ITES  PARANINFO c

78

Programas en C. Una introduccin a la Programacin.

gethr@AY return HY

/* * Algoritmo 5.11. Obtener el k-abecedario de mayor longitud * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: dat5_11.txt */ /* El codigo ASCII de la enye no se encuentra entre el codigo ASCII de la letra 'n' y la letra 'o' */ #include `stdioFhb #include `onioPFhb #include "msc1.h" #define iegsy 9 9 #define fooleno int #define erddero I #define plso H typedef struct { int longiY char primervetrY } ueeedrioY ueeedrio kefgY fooleno isltimokefgD isikefgY char nteriorY wsI Y void inontrrsnikefg@A /* PRE EA es el primer caracter de la secuencia o el siguiente despues del ultimo k-abecedario en Piz, si lo hay */ /* POST EA es la segunda letra del siguiente k-abecedario, si lo hay */ { do { nterior a iewgI@AY

79

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

evnzrwgI@AY /* INV No hay ningun k-abecedario entre EA y el ultimo k-abecedario en Piz, si lo hay */ } while @3@@iewgI@A aa wgIwrpin@AA || @iewgI@A aa nteriorCIAAAY isltimokefg a iewgI@A aa wgIwrpin@AY

void sniirkefg@A /* POST Se actualizan EsVaciakABC y EsUltimokABC, y anterior y EA contienen el primer y el segundo caracter, respectivamente del primer k-abecedario, si lo hay */ { gomenzrwgI@AY if @iewgI@A aa wgIwrpin@AA { isltimokefg a erdderoY isikefg a erdderoY } else { inontrrsnikefg@AY isikefg a iewgI@A aa wgIwrpin@AY } } void evnzrkefg@A /* PRE EsUltimokABC = Falso y EA es el segundo caracter del actual k-abecedario */ /* POST kABC contiene la longitud y el primer caracter del actual k-abecedario, EA es el segundo caracter del siguiente k-abecedario, si lo hay, y se actualiza EsUltimokABC */ { kefgFlongi a IY kefgFprimervetr a nteriorY do { kefgFlongi a kefgFlongi C IY nterior a iewgI@AY evnzrwgI@AY // INV kABC.long mantiene la longitud del k-abecedario actual } while @3@@iewgI@A aa wgIwrpin@AA || @iewgI@A 3a nteriorCIAAAY if @@iewgI@A aa wgIwrpin@AAA isltimokefg a erdderoY else inontrrsnikefg@AY } int min @A { ueeedrio myorkefgY int iY

ITES  PARANINFO c

80

Programas en C. Una introduccin a la Programacin.

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 5.11. Obtener el k-abecedario de mayor longitud *****\n"AY printf@"*****\n"AY printf@"\n"AY a snitwgI@AY grgrpiherowgI@D"dat5_11.txt"AY printf@"La secuencia de entrada es: "AY gomenzrwgI@AY while @iewgI@A 3a wgIwrpin@AA { printf@" %c"D iewgI@AAY evnzrwgI@AY }Y printf@"\n"AY sniirkefg@AY if @isikefgA printf@"No hay k-abecedarios"AY else { evnzrkefg@AY myorkefg a kefgY while @3isltimokefgA { evnzrkefg@AY if @myorkefgFlongi ` kefgFlongiA myorkefg a kefgY /* INV mayorkABC.long mantiene la longitud del maximo k-abecedario de Piz */ }Y printf@"\n"AY printf@"El k-abecedario de mayor longitud es: \n"AY printf@"\n"AY printf@" longitud: %d\n"D myorkefgFlongiAY printf@"\n"AY printf@" k-abecedario: "AY for @i a IY i `a myorkefgFlongiY iCCA printf@" %c"D myorkefgFprimervetrCiEIAY } printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 5.12. Control de trafico en una autopista * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato

81

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

* Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 5. Tecnicas de disenyo de algoritmos * Fichero de entrada: dat5_12.txt */ #include `stdioFhb #include `onioPFhb #include "mse1.h" int min @A { int numegotlY // Numero de segundos transcurridos durante el control int numehintY // Numero de vehiculos que han entrado en la autopista int numegsnterwsvrgoY // Intervalo de tiempo mas largo sin entrar vehiculos int numegsnteretulY // Contador del numero de segundos del intervalo actual wseI Y lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 5.12. Control de trafico en una autopista *****\n"AY printf@"*****\n"AY printf@"\n"AY a snitwiI@AY grgrpiherowiI@D"dat5_12.txt"AY printf@"La secuencia de entrada es: "AY gomenzrwiI@AY numegotl a HY numehint a HY numegsnterwsvrgo a HY while @iewiI@A 3a HA { printf@" %d "D iewiI@AAY switch @iewiI@AA { case PX numehint a numehint C IY evnzrwiI@AY breakY case IX numegsnteretul a IY evnzrwiI@AY while @3@@iewiI@A aa HA || @iewiI@A aa PAAA { printf@" %d "D iewiI@AAY

ITES  PARANINFO c

82

Programas en C. Una introduccin a la Programacin.

} } printf@"\n\n"AY printf@"El tiempo total transcurrido es: %d\n"D numegotlAY printf@"\n"AY printf@"El numero de vehiculos que han circulado por la autopista es: %d\n"D numehintAY printf@"\n"AY printf@"El intervalo de tiempo mas largo sin entrar un vehiculo es: %d\n"D numegsnterwsvrgoAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

} if @numegsnteretul b numegsnterwsvrgoA numegsnterwsvrgo a numegsnteretulY numegotl a numegotl C numegsnteretulY breakY defaultX evnzrwiI@AY

if @iewiI@A aa IA numegsnteretul a numegsnteretul C IY evnzrwiI@AY

83

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

3.5. Captulo 6

/* * Algoritmo 6.1. Mostrar la nota de un alumno (version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas * Fichero de entrada: datos6_1.dat */ Para generar el fichero datos6_1.dat emplear el programa genf6_1.c Para consultar el fichero datos6_1.dat emplear el programa verf6_1.c en este algoritmo se ha sustituido la secuencia de NotaAlumno por un fichero secuencial, 'datos6_1.dat' */

/* * * *

#include `stdioFhb #include `onioFhb #define weevwxy PHH typedef struct { int odigoY /* 1..MAX_ALUMNOS; */ float notY } xotelumnoY int min @A { psvi BfY xotelumno lumY int odY /* 1..MAX_ALUMNOS; */ lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.1. Mostrar la nota de un alumno (version 1) *****\n"AY printf@"*****\n"AY printf@"\n"AY f a fopen@"datos6_1.dat"D "rb"AY printf@"Introduzca el codigo del alumno (>= 1) (<= %d ): "DweevwxyAY snf@" %d"D 8odAY while @gethr@A 3a 9n9AY fred @8lumD sizeof@xotelumnoAD ID fAY while @3@feof@fAA 88 @lumFodigo 3a odAA

ITES  PARANINFO c

84

Programas en C. Una introduccin a la Programacin.

fred @8lumD sizeof@xotelumnoAD ID fAY /* Si se ha llegado al final, feof sera verdadero, * por ello debemos consultar la funcion feof * para determinar la ausencia del codigo */ printf@"\n"AY if @feof@fAA printf@"No existe ese codigo\n"AY else printf@"La nota de este alumno es: %.2f\n"D lumFnotAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.2. Mostrar la nota de un alumno (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */ /* En lugar de solicitar las notas, se ha declarado la tabla constante */ /* En C las tablas comienzan en cero y por esa razon el codigo del alumno */ /* comienza en cero en lugar de en uno, como en el Algoritmo 6.1 */ #define weevwxy IHH #include `stdioFhb #include `onioFhb float notsweevwxy a {IFHD QFSD SFPD QFSD SFPD IFPD SFQD TFPD PFPD PFPD IFPD VFPD SFSD SFPD IFPD SFQD TFPD PFPD PFTD IFPD VFPD QFRD SFPD IFPD WFHD TFPD PFPD PFRD IFPD VFPD int min@A { IFPD PFUD IFPD SFRD PFUD IFPD SFRD PFUD IFPD SFRD PFUD QFRD VFPD QFPD QFRD VFPD QFPD QFRD VFPD QFPD SFQD PFPD QFSD SFQD PFPD QFSD SFQD PFPD QFSD SFQD TFPD IFPD SFPD TFPD IFPD SFPD TFPD IFPD SFPD TFPD PFPD VFPD IFPD PFPD VFPD IFPD PFPD VFPD IFPD PFPD IFPD SFRD PFUD IFPD SFRD PFUD IFPD SFRD PFUD IFPD VFPD QFPD QFRD VFPD QFPD QFRD VFPD QFPD QFRD VFP}Y

85

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

int odY /* 1..MAX_ALUMNOS; */ lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.2. Mostrar la nota de un alumno (version 2) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el codigo del alumno (>= 0) y (<= %d): "D weevwxyEIAY snf@" %d"D 8odAY while @gethr@A 3a 9n9AY printf@"\n"AY if @notsod 3a EIFHA printf@"La nota del alumno %d es: %.2f\n"D odD notsodAY else printf@"No existe una calificacion para ese alumno"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.3. Calculo de la frecuencia de aparicion de las letras mayusculas en un texto * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas * Fichero de entrada: datos6_3.txt */ #include `stdioFhb #include `onioPFhb #include "msc1.h" #define #define #define #define #define #define iegsy 9 9 fooleno int erddero I plso H ewrsy 99 E 9e9 C I elemristo@hDA h@A E 9e9

typedef int preuenivetrsewrsyY

ITES  PARANINFO c

86

Programas en C. Una introduccin a la Programacin.

void sniilizrlpreuenis @int BtA // Inicializacion de la tabla con ceros // POST: t[c] = 0, c: 'A' <= c <= 'Z' { char Y // 'A'..'Z'; for @ a 9e9Y `a 99Y CCA { elemristo@tD A a HY }

void isriirlpreuenis @int BtA // POST: Se escriben los valores de la tabla t { char Y // 'A'..'Z'; printf@"\n"AY for @ a 9e9Y `a 99Y CCA { printf@" *|* %c : %d"D D elemristo@tD AAY if @@@E9e9CIA 7 TA aa HA printf@"\n"AY } printf@"\n"AY

fooleno iswyusul @char rA // POST: Retorna Verdadero si y solo si car es una letra mayuscula { return @r ba 9e9A 88 @r `a 99AY } int min@A { preuenivetrs tfY wsI Y lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.3. Calculo de la frecuencia de aparicion de las *****\n"AY printf@"***** letras mayusculas en un texto *****\n"AY printf@"*****\n"AY printf@"\n"AY a snitwgI@AY grgrpiherowgI@D"datos6_3.txt"AY gomenzrwgI@AY if @iewgI@A aa wgIwrpin@AA printf@"Secuencia vacia"AY

87

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

else { sniilizrlpreuenis@tfAY printf@"La secuencia de entrada es: "AY do { printf@" %c"D iewgI@AAY if @iswyusul @iewgI@AAA elemristo@tfD iewgI@AA a elemristo@tfD iewgI@AA C IY evnzrwgI@AY /* INV: tf almacena la frecuencia de aparicion de cada letra mayuscula en Piz */ } while @3@iewgI@A aa wgIwrpin@AAAY printf@"\n"AY isriirlpreuenis@tfAY } printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.4. Calcular distribucion de las notas * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas * Fichero de entrada: datos6_4.dat */

/* Para generar el fichero datos6_4.dat emplear el programa genf6_4.c */ /* Para consultar todo el fichero datos6_4.dat emplear el programa verf6_4.c */ #include `stdioFhb #include `onioFhb #define fooleno int #define erddero I #define plso H #define xwxye S #define weihsexi IHH typedef struct { char nomreQHY int eddY fooleno sexoY

ITES  PARANINFO c

88

Programas en C. Una introduccin a la Programacin.

float notY } istudinteY typedef psvi BpestudintesY typedef istudinte gursoweihsexiCIY void isrie@int iA { switch @iA { case H X printf@"Numero case I X printf@"Numero case P X printf@"Numero case Q X printf@"Numero case R X printf@"Numero } }

de de de de de

suspensos: "AY breakY aprobados: "AY breakY notables: "AY breakY sobresalientes: "AY breakY matriculas de honor: "AY breakY

int min@A { pestudintes fY gurso Y int fxotsxwxyeY int iD kY // 0..MAX_ESTUDIANTES int jY // 0..NUM_NOTAS lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.4. Calcular distribucion de las notas *****\n"AY printf@"*****\n"AY printf@"\n"AY f a fopen@"datos6_4.dat"D "rb"AY k a HY fred @8kD sizeof@istudinteAD ID fAY while @@3feof@fAA 88 @k `a weihsexiEIAA { k a kCIY fred@8kD sizeof@istudinteAD ID fAY } flose@fAY // Comenzar i a HY // Tratamiento inicial for @j a HY j `a xwxyeEIY jCCA fxotsj a HY // Tratamiento de cada elemento de la tabla

89

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

while @i 3a kA { if @@iFnotA ` SA fxotsH a fxotsH C IY else if @@iFnot ba SA 88 @iFnot ` UAA fxotsI a fxotsI C IY else if @@iFnot ba UA 88 @iFnot ` WAA fxotsP a fxotsP C IY else if @iFnot aa WA fxotsQ a fxotsQ C IY else fxotsR a fxotsR C IY // Avanzar i a iCIY } // Tratamiento final for @j a HY j `a xwxyeEIY jCCA { isrie@jAY printf@" %d\n"D fxotsjAY } printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.5. Porcentaje de mujeres y hombres, y nota media de cada sexo * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas * Fichero de entrada: datos6_4.dat */

/* Para generar el fichero datos6_4.dat emplear el programa genf6_4.c */ /* Para consultar todo el fichero datos6_4.dat emplear el programa verf6_4.c */ #include `stdioFhb #include `onioFhb #define fooleno int #define erddero I #define plso H #define weihsexi IHH typedef struct { char nomreQHY int eddY

ITES  PARANINFO c

90

Programas en C. Una introduccin a la Programacin.

fooleno sexoY // verdadero si es mujer, falso si es hombre float notY } istudinteY typedef psvi BpestudintesY typedef istudinte gursoweihsexiCIY typedef int xumistudintesY // 0..MAX_ESTUDIANTES void veer@gurso D xumistudintes BlA { pestudintes fY f a fopen@"datos6_4.dat"D "rb"AY Bl a HY fred@8BlD sizeof@istudinteAD ID fAY while @@3feof@fAA 88 @Bl ` weihsexiAA { Bl a Bl C IY fred@8BlD sizeof@istudinteAD ID fAY } flose@fAY

int min@A { gurso Y int ontwD ontrY // 0..MAX_ESTUDIANTES contadores numero de mujeres y hombres float sumwD sumrY // contadores notas de mujeres y hombres float mujeresD homresY // porcentajes de mujeres y hombres xumistudintes longiY // longitud de la secuencia almacenada int iY // 1..MAX_ESTUDIANTES indice para la tabla lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.5. Porcentaje de mujeres y hombres, *****\n"AY printf@"***** y nota media de cada sexo *****\n"AY printf@"*****\n"AY printf@"\n"AY // Se introducen los datos de long estudiantes en la tabla c veer @D 8longiAY switch @longiA { case H X printf@"No hay alumnos\n"AY breakY default X sumw a HY sumr a HY ontw a HY ontr a HY for @i a HY i `a longiEIY iCCA if @iFsexoA {

91

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

} printf@"\nPulse enter para continuar"AY gethr@AY return HY

} else { sumr a sumr C iFnotY ontr a ontr C IY }Y mujeres a ontw G @floatA longi B IHHY homres a ontr G @floatA longi B IHHY printf@"Porcentaje de mujeres: %.2f % %\n"D mujeresAY printf@"\n"AY printf@"Porcentaje de hombres: %.2f % %\n"D homresAY if @ontw 3a HA printf@"\nNota media de las mujeres: %.2f\n"D sumwG ontwAY if @ontr 3a HA printf@"\nNota media de los hombres: %.2f\n"D sumrG ontrAY

sumw a sumw C iFnotY ontw a ontw C IY

/* * Algoritmo 6.6. Producto escalar de dos vectores * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */ #include `stdioFhb #include `onioFhb #define vwe IHH typedef unsigned int ngoY // 1..LMAX typedef float etorvweY

void veer@float BD ngo nA { ngo iY for @i a HY i `a nEIY iCCA { printf@"Introduzca componente %d: "D iCIAY snf@" %f"D 8iAY

ITES  PARANINFO c

92

Programas en C. Una introduccin a la Programacin.

}Y

while @gethr@A 3a 9n9AY

int min@A { etor D Y float produtoY ngo longitudY ngo iY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.6. Producto escalar de dos vectores *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduce la longitud de los vectores: "AY snf@" %d"D 8longitudAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Vector 1: \n"AY veer@D longitudAY printf@"\n"AY printf@"Vector 2: \n"AY veer@D longitudAY produto a HY for @i a HY i `a longitudEIY iCCA produto a produto C i B iY // INV producto = a[1]* b[1] + a[2]* b[2] + .. a[i] * b[i] printf@"\n"AY printf@"El producto escalar es: %.2f\n"D produtoAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.7. Obtener el mayor, su numero de ocurrencias y su primera y ultima posicion * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005

93

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

* Capitulo 6. Tablas */ #include `stdioFhb #include `onioFhb #define vwe IHH typedef unsigned int ngoY // 1..LMAX typedef int etorvweY void veer@int BD ngo nA { ngo iY for @i a HY i `a nEIY iCCA { printf@" Introduzca componente %d: "D iCIAY snf@" %d"D 8iAY while @gethr@A 3a 9n9AY }Y

int min@A { ngo longitudY etor tY int myorY ngo numepY ngo priD ultY ngo iY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.7. Obtener el mayor, su numero de ocurrencias y *****\n"AY printf@"***** su primera y ultima posicion *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el numero de elementos: "AY snf@" %d"D 8longitudAY while @gethr@A 3a 9n9AY veer@tD longitudAY myor a tHY numep a IY pri a HY ult a HY for @i a IY i `a longitudEIY iCCA // Se cumple INV definido en la descripcion del algoritmo if @ti b myorA { myor a tiY numep a IY pri a iY

ITES  PARANINFO c

94

Programas en C. Una introduccin a la Programacin.

ult a iY } else if @ti aa myorA { numep a numep C IY ult a iY } printf@"\n"AY printf@"El mayor es: %d\n"D myorAY printf@"\n"AY printf@"El numero de apariciones es: %d\n"D numepAY printf@"\n"AY printf@"Las posiciones de la primera y la ultima aparicion son: %d y %d\n"D priCID ultCIAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.8. Calcular la fecha a partir de la posicion del dia en el anyo (version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */ // Calcular la fecha a partir de la posicion del dia en el anyo (version 1) #include `stdioFhb #include `onioFhb typedef int wesenyoY // 1..12 typedef int hienyoY // 1..365 typedef int himesY // 1..31 int min@A { int tpIP a { ID QPD THD WID IPID ISPD IVPD PIQD PRRD PURD QHSD QQS }Y int pY int iY int mesY int diY

95

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.8. Calcular la fecha a partir de la posicion *****\n"AY printf@"***** del dia en el anyo (version 1) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca la posicion del dia en el anyo: "AY snf@" %d"D 8pAY while @gethr@A 3a 9n9AY i a IY while @@i 3a IIA 88 @tpi `a pAA { // INV (j: 1 <= j < i : p >= tp[j]) i a i C IY } if @tpi b pA mes a iY else mes a IPY di a p E tpmesEI C IY printf@"\n"AY printf@"Dia: %d del mes: %d\n"D diD mesAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.9. Calcular la fecha a partir de la posicion del dia en el anyo (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */

// Calcular la fecha a partir de la posicion del dia en el anyo (version 2) #include `stdioFhb #include `onioFhb typedef int weseyoY // 1..12 typedef int hieyoY // 1..365 typedef int himesY // 1..31

ITES  PARANINFO c

96

Programas en C. Una introduccin a la Programacin.

int min@A { int tpIP a {ID QPD THD WID IPID ISPD IVPD PIQD PRRD PURD QHSD QQS}Y int pY int iY int mesY int diY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.9. Calcular la fecha a partir de la posicion *****\n"AY printf@"***** del dia en el anyo (version 2) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca la posicion del dia en el anyo: "AY snf@" %d"D 8pAY while @gethr@A 3a 9n9AY if @p ba tpIIA mes a IPY else { i a IY while @tpi `a pA // INV j: 1 <= j < i : p >= tp[j] i a i C IY mes a iY }Y di a p E tpmesEI C IY printf@"\n"AY printf@"Dia: %d del mes %d\n"D diD mesAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.10. Calculo del peso del segmento de mayor peso * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */

97

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

#include `stdioFhb #include `onioFhb #define vwe IHH typedef int ngoY typedef int etorvweY void veer@int BD ngo nA { ngo iY for @i a HY i `a nEIY iCCA { printf@" Introduzca componente %d: "D iCIAY snf@" %d"D 8iAY while @gethr@A 3a 9n9AY }

int min@A { etor tY int pesowximoY // peso mayor de los segmentos de la secuencia int pesowximoegetY // peso mayor de los segmentos actuales ngo iD longitudY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.10. Calculo del peso del segmento de mayor peso *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el numero de elementos (maximo %d): "D vweAY snf@" %d"D 8longitudAY while @gethr@A 3a 9n9AY veer@tD longitudAY if @longitud aa HA printf@"Secuencia vacia\n"AY else { pesowximo a tHY pesowximoeget a tHY for @i a IY i `a longitudEIY iCCA { if @ti b ti C pesowximoegetA pesowximoeget a tiY else pesowximoeget a pesowximoeget C tiY if @pesowximo ` pesowximoegetA pesowximo a pesowximoegetY } printf@"\n"AY printf@"El peso del segmento de mayor peso es: %d\n"D pesowximoAY } printf@"\nPulse enter para continuar"AY

ITES  PARANINFO c

98

Programas en C. Una introduccin a la Programacin.

gethr@AY return HY

/* * Algoritmo 6.11. Suma de enteros distintos de cero en segmentos con cero en los extremos * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */ #include `stdioFhb #include `onioFhb #define vwe IHH typedef int ngoY // 1..LMAX typedef int etorvweY void veer@int BD ngo nA { ngo iY for @i a HY i `a nEIY iCCA { printf@" Introduzca el elemento %d: "DiCIAY snf@" %d"D 8iAY while @gethr@A 3a 9n9AY }

int min@A { etor tY ngo longitudY ngo iY int nogerosvgY int pesoxogerosY int erosY lrsr@AY printf@"\n"AY printf@"*****\n"AY

99

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

printf@"***** Algoritmo 6.11. Suma de enteros distintos de cero en *****\n"AY printf@"***** segmentos con cero en los extremos *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca la longitud de la secuencia (maximo %d): "D vweAY snf@" %d"D 8longitudAY while @gethr@A 3a 9n9AY veer@tD longitudAY nogerosvg a HY pesoxogeros a HY eros a HY for @i a HY i `a longitudEIY iCCA if @ti aa HA { nogerosvg a nogerosvg C pesoxogerosY eros a eros C IY } else pesoxogeros a pesoxogeros C erosY printf@"\n"AY printf@"La suma de los elementos distintos de cero en \n"AY printf@"segmentos con cero en los extremos es: %d\n"D nogerosvgAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.12. Calcular numero de pares cero-uno (version fuerza bruta) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */ #include `stdioFhb #include `onioFhb #define vwe IHH typedef int ngoY // 1..LMAX typedef int etorvweY

void veer@int BD ngo nA { ngo iY

ITES  PARANINFO c

100

Programas en C. Una introduccin a la Programacin.

for @i a HY i `a nEIY iCCA { printf@" Introduzca elemento %d: "DiCIAY snf@" %d"D 8iAY while @gethr@A 3a 9n9AY }

int min@A { etor tY int numresY ngo iD jD longitudY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.12. Calcular numero de pares cero-uno *****\n"AY printf@"***** (version fuerza bruta) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca la longitud de la secuencia (maximo %d): "D vweAY snf@" %d"D 8longitudAY while @gethr@A 3a 9n9AY veer@tD longitudAY numres a HY for @i a HY i `a longitudEIY iCCA if @ti aa HA for @j a i C IY j `a longitudY jCCA if @tj aa IA numres a numres C IY printf@"\n"AY printf@"El numero de pares 0-1 es: %d\n"D numresAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * * * * * * * *

Algoritmo 6.13. Metodo de ordenacion de insercion directa Titulo del libro: Una introduccion a la programacion. Un enfoque algoritmico Autores del libro: Jesus J. Garcia Molina Francisco J. Montoya Dato Jose L. Fernandez Aleman Maria J. Majado Rosales Fecha: 1/9/2005

101

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

* Capitulo 6. Tablas */ #include `stdioFhb #include `onioFhb #define vwe IHH typedef int ngoY // 0..LMAX typedef int etorvweCIY void veer@int BD ngo nA { ngo iY for @i a IY i `a nY iCCA { printf@" Introduzca elemento %d: "D iAY snf@" %d"D 8iAY while @gethr@A 3a 9n9AY }

void isriir @int BD ngo nA { ngo iY for @i a IY i `a nY iCCA printf@" %d "D iAY printf@"\n"AY

int min@A { etor tY ngo qD jY ngo nY ngo xY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.13. Metodo de ordenacion de insercion directa *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el numero de elementos (maximo %d): "D vweAY snf@" %d"D 8nAY while @gethr@A 3a 9n9AY veer@tD nAY printf@"\n"AY

ITES  PARANINFO c

102

Programas en C. Una introduccin a la Programacin.

printf@"Los elementos iniciales son: "AY isriir@tD nAY for @q a PY q `a nY qCCA { tH a tqY // centinela x a tqY j a q E IY while @x ` tjA { tjCI a tjY // desplazamiento j a j E IY } tjCI a xY }Y printf@"\n"AY printf@"Los elementos ordenados son: "AY isriir@tD nAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.14. Metodo de ordenacion de seleccion directa * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */ #include `stdioFhb #include `onioFhb #define vwe IHH typedef int ngoY // 1..LMAX typedef int etorvweY void veer@int BD ngo nA { ngo iY for @i a HY i `a nEIY iCCA { printf@" Introduzca elemento %d: "D iCIAY snf@" %d"D 8iAY while @gethr@A 3a 9n9AY }

103

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

} void isriir @int BD ngo nA { ngo iY for @i a HY i `a nEIY iCCA printf@" %d "D iAY printf@"\n"AY

int min@A { etor tY ngo posD qD jY ngo nY int minY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.14. Metodo de ordenacion de seleccion directa *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el numero de elementos (maximo %d): "D vweAY snf@" %d"D 8nAY while @gethr@A 3a 9n9AY veer@tD nAY printf@"\n"AY printf@"Los elementos iniciales son: "AY isriir@tD nAY for @q a HY q `a n E PY qCCA { pos a qY min a tqY for @j a qY j `a nEIY jCCA if @min b tjA { pos a jY min a tjY } tpos a tqY tq a minY } printf@"\n"AY printf@"Los elementos ordenados son: "AY isriir@tD nAY printf@"\nPulse enter para continuar"AY gethr@AY

ITES  PARANINFO c

104

Programas en C. Una introduccin a la Programacin.

return HY

/* * Algoritmo 6.15. Busqueda binaria en un tabla ordenada * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */ #include `stdioFhb #include `onioFhb #define vwe IHH typedef int ngoY // 1..LMAX typedef int etorvweY void veer@int BD ngo nA { ngo iY for @i a HY i `a nEIY iCCA { printf@" Introduzca elemento %d: "D iCIAY snf@" %d"D 8iAY while @gethr@A 3a 9n9AY }

int min@A { ngo nY etor tY int iY // 0..LMAX int jY // 1..LMAX+1 ngo hY int xY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.15. Busqueda binaria en un tabla ordenada *****\n"AY

105

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el numero de elementos (maximo %d): "D vweAY snf@" %d"D 8nAY while @gethr@A 3a 9n9AY veer@tD nAY printf@"\n"AY printf@"Introduzca el elemento a buscar: "AY snf@" %d"D 8xAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"La secuencia de entrada es: "AY for @i a HY i `a nEIY iCCA printf@" %d "D tiAY printf@"\n"AY i a EIY j a nY while @@i C IA 3a jA { h a @i C jA G PY if @th `a xA i a hY else j a hY } printf@"\n"AY if @@i b EIA 88 @x aa tiAA printf@"Valor encontrado en posicion: %d\n"D iCI AY else printf@"Valor no encontrado\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.16. Suma de los valores mayores de cada fila de una matriz de enteros * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */

#include `stdioFhb #include `onioFhb #define xpils PH // constante con el numero de filas

ITES  PARANINFO c

106

Programas en C. Una introduccin a la Programacin.

#define xgolumns PH // constante con el numero de columnas #define n PH typedef int ngopilsY // 1..NFilas typedef int ngogolumnsY // 1..NColumnas typedef int etorxpilsxgolumnsY int nfD iY int nD jY void veer@etor tD int nfD int nA { int iY int jY for @i a HY i `a nfEIY iCCA { printf@"\n"AY printf@"Fila: %d\n"D iCIAY for @j a HY j `a nEIY jCCA { printf@" Introduzca elemento ( %d, %d): "DiCID jCIAY snf@" %d"D 8tijAY while @gethr@A 3a 9n9AY } }

int min@A { etor tY int nfD iY int nD jY int smD myorY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.16. Suma de los valores mayores de cada fila de *****\n"AY printf@"***** una matriz de enteros *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el numero de filas (<= %d): "D nAY snf@" %d"D 8nfAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Introduzca el numero de columnas (<= %d): "D nAY snf@" %d"D 8nAY

107

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

while @gethr@A 3a 9n9AY veer@tD nfD nAY sm a HY for @i a HY i `a nfEIY iCCA { myor a tiHY for @j a HY j `a nEIY jCCA if @myor ` tijA myor a tijY /* INVint mayor = mayor de los j elementos ya recorridos de la fila i, 1 <= j <= nc */ sm a sm C myorY /* INVext sm = suma de los mayores de las primeras i filas de T, 1 <= i <= nf */ } // INVext y (i = nf) => POST printf@"\n"AY printf@"La suma de los valores mayores de cada fila de \n"AY printf@"la matriz de enteros es: %d\n"D smAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 6.17. Cifrado PlayFair * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas * Fichero de entrada: dat6_17.txt */

#include `stdioFhb #include `onioPFhb #include "msc1.h" #define fooleno int #define erddero I #define plso H #define x S #define iegsy 9 9 typedef char lrQHY typedef char wtrizgrxxY typedef struct {

ITES  PARANINFO c

108

Programas en C. Una introduccin a la Programacin.

char pY char sY } rvetrsY typedef struct { int fD Y } osiionY lr lveY // palabra clave wtrizgr mY // matriz de codificacion wsI Y // texto original // lexico de una secuencia intermedia de pares de caracteres rvetrs pretulY fooleno ultimorY fooleno pinres@A { return @iewgI@A aa wgIwrpin@AA 88 @3ultimorAY } void sgnorrflnos@A // Salta blancos del texto original { while @iewgI@A aa iegsyA evnzrwgI@AY } void sustituir@char BlA { switch @BlA { case 9j9X Bl a 9i9Y breakY case 99X Bl a 9n9Y breakY } } void igr@A { sgnorrflnos@AY if @iewgI@A 3a wgIwrpin@AA { pretulFp a iewgI@AY sustituir@8pretulFpAY evnzrwgI@AY sgnorrflnos@AY if @iewgI@A aa wgIwrpin@AA { ultimor a erdderoY pretulFs a 9x9Y } else {

109

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

}Y

}Y

pretulFs a iewgI@AY sustituir@8pretulFsAY if @pretulFs aa pretulFpA pretulFs a 9x9Y

void gomenzrr@A { gomenzrwgI@AY ultimor a plsoY igr@AY } void evnzrr@A { if @ultimorA ultimor a plsoY else { evnzrwgI@AY igr@AY } } fooleno grinlr@lr pD int longiD char A // PRE: longi > 0 /* POST retorna Verdadero si el caracter c se encuentra en la tabla p, Falso en otro caso */ { int iY // 1..N+1 En el rango [1, long] i a HY while @@i 3a longiA 88 3@pi aa AA i a i C IY return @i 3a longiAY

void grerwtrizgodifiion@A { char letrY // letra actual int iD jY // 1..N // rellenar la primera fila con la clave for @i a HY i `a xEIY iCCA mHi a lveiY // rellenar resto de filas // inicializar recorrido intervalo de letras letr a 99Y

ITES  PARANINFO c

110

Programas en C. Una introduccin a la Programacin.

for @i a IY i `a xEIY iCCA for @j a HY j `a xEIY jCCA { while @grinlr@lveD xD letrA || @letr aa 9j9A || @letr aa 99AA letr a letrCIY mij a letrY letr a letrCIY }

void osinl@wtrizgr mD char rD osiion BposA // PRE: car es una letra y se encuentra en la tabla { int iD jY // 1..N i a HY j a HY while @mij 3a rA if @j ` xEIA j a j C IY else { i a i C IY j a HY } posEbf a iY posEb a jY

void godifiion@rvetrs prD rvetrs BnuevorA { osiion pID pPY int filD olY // 1..N osinl@mD prFpD 8pIAY osinl@mD prFsD 8pPAY if @pIFf aa pPFfA { pIF a @pIF C IA 7 xY pPF a @pPF C IA 7 xY nuevorEbp a mpIFfpIFY nuevorEbs a mpPFfpPFY

} else if @pIF aa pPFA { pIFf a @pIFf C IA 7 xY pPFf a @pPFf C IA 7 xY nuevorEbp a mpIFfpIFY nuevorEbs a mpPFfpPFY }

111

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

else { nuevorEbp a mpIFfpPFY nuevorEbs a mpPFfpIFY }

int min@A { rvetrs prgifrdoY // par codificado wsI Y // texto cifrado lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.17. Cifrado PlayFair *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca la palabra clave de 5 letras: "AY snf@" %s"D lveAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Texto original: "AY a snitwgI@AY grgrpiherowgI@D"dat6_17.txt"AY gomenzrwgI@AY while @iewgI@A 3a wgIwrpin@AA { printf@" %c"DiewgI@AAY evnzrwgI@A Y } printf@"\n"AY grerwtrizgodifiion@AY gomenzrr@AY a snitwgI@AY errnrwgI@AY while @3pinres@AA { godifiion@pretulD 8prgifrdoAY egistrrwgI @D prgifrdoFpAY egistrrwgI @D prgifrdoFsAY evnzrr@AY } wrrwgI@A Y printf@"\n"AY printf@"El texto cifrado es: "AY gomenzrwgI@AY while @iewgI@A 3a wgIwrpin@AA { printf@" %c"DiewgI@AAY evnzrwgI@A Y

ITES  PARANINFO c

112

Programas en C. Una introduccin a la Programacin.

} printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY


/* * Algoritmo 6.18. Justificacion de un texto * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas * Fichero de entrada: dat6_18.txt */ #include `stdioFhb #include `onioFhb #include "msc1.h" #define fooleno int #define erddero I #define plso H #define #define #define #define #define iegsy 9 9 exqehyweswy IS vyxqweev PH exgrywsxvsxie vyxqweevCexqehyweswy exgrywevsxie VH

typedef int vongitudlrY // 1..LONGMAXPAL typedef struct { char ontenidovyxqweevY vongitudlr longitudY } lrY typedef int osinvineY // 1..ANCHOMAXLINEA; typedef int vongitudvineY // 0..ANCHOMAXLINEA; typedef struct { vongitudvine longitudY char ontenidoexgrywevsxieY } vineY typedef int vongngrdoY // 0..SANGRADOMAXIMO;

113

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

typedef int vimenhovineY // ANCHOMINLINEA..ANCHOMAXLINEA; vongngrdo sngrdoY vimenhovine nhovineY lr plretulY vine lineetulY fooleno pinheeuenilrY wsI Y lr wrrrfoY /* ************** * Operaciones secuencia intermedia de palabras * ************** ******************** ********************/

void ytenerlr@A { int iY /* Ignora los espacios en blanco */ while @@iewgI@A 3a wgIwrpin@AA 88 @@iewgI@A aa iegsyA || @iewgI@A aa wgIwrpinvineAAA evnzrwgI @AY pinheeuenilr a @iewgI@A aa wgIwrpin@AAY if @3@iewgI@A aa wgIwrpin@AAA { /* Almacena en el campo palabraActual.contenido la siguiente palabra */ i a EIY do { i a i C IY plretulFontenidoi a iewgI @AY evnzrwgI @AY } while @3@@iewgI@A aa wgIwrpin@AA || @@iewgI@A aa iegsyA || @@iewgI@A aa wgIwrpinvineAAAAAY plretulFlongitud a i C IY } } /* ********************* void gomenzrlr@A { a snitwgI@AY grgrpiherowgI@D"dat6_18.txt"AY gomenzrwgI@AY ytenerlr@AY } /* ********************* void evnzrlr@A *************/

*************/

ITES  PARANINFO c

114

Programas en C. Una introduccin a la Programacin.

{ }

ytenerlr@AY

/* ************** ******************** * Operaciones relacionadas con el tratamiento de palabras * ************** ********************/ vongitudlr vongitud @lr plA { return @plFlongitudAY } /* ********************* *************/ fooleno sgul@lr pID lr pPA { vongitudlr longiD iY fooleno igulvongY igulvong a pIFlongitud aa pPFlongitudY if @igulvongA { longi a pIFlongitudY i a HY while @@i 3a longiEIA 88 @pIFontenidoi aa pPFontenidoiAA i a i C IY igulvong a @pIFontenidoi aa pPFontenidoiAY } return igulvongY ******************** ********************/ rY IY *************/

/* ************** * Grupo de operaciones de tratamiento de lineas * ************** void enydirgrterevine@char rA { lineetulFontenidolineetulFlongitud a lineetulFlongitud a lineetulFlongitud C } /* ********************* void enydirlrevine@A { vongitudlr iY

}Y

for @i a HY i`aplretulFlongitudEIY iCCA enydirgrterevine@plretulFontenidoiAY *************/

/* *********************

115

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

void sniilizrropvine @vongngrdo BlongngrdoD vimenhovine BlongvineA { int sngrdovineD nhovineY printf@"Introduzca el ancho de la linea (entre %d y %d): "D exgrywsxvsxieD exgrywevsxieAY snf@" %d"D 8nhovineAY while @gethr@A 3a 9n9AY if @nhovine ` exgrywsxvsxieA Blongvine a exgrywsxvsxieY else if @nhovine b exgrywevsxieA Blongvine a exgrywevsxieY else Blongvine a nhovineY printf@"\n"AY printf@"Introduzca el sangrado de la primera linea (entre 0 y %d): "D exqehyweswyAY snf@" %d"D 8sngrdovineAY while @gethr@A 3a 9n9AY if @sngrdovine ` HA longngrdo a HY else if @sngrdovine b exqehyweswyA Blongngrdo a exqehyweswyY else Blongngrdo a sngrdovineY wrrrfoFlongitud a SY wrrrfoFontenidoH a 9G9Y wrrrfoFontenidoI a 99Y wrrrfoFontenidoP a 9e9Y wrrrfoFontenidoQ a 99Y wrrrfoFontenidoR a 9G9Y *************/

/* ********************* void ngrrvine @int longngrdoA { int iY // 1..SangradoMaximo; for @i a IY i `a longngrdoY iCCA enydirgrterevine@iegsyAY

/* ********************* void sniilizrvine @int longngrdoA { lineetulFlongitud a HY if @longngrdo b HA ngrrvine@longngrdoAY }

*************/

/* ********************* *************/ fooleno geinvine @vongitudlr espiooliitdoD int longvineA

ITES  PARANINFO c

116

Programas en C. Una introduccin a la Programacin.

{ }

return @espiooliitdo `a @longvine E lineetulFlongitudAAY *************/

/* ********************* void isriirispios @osinvine numispiosA { osinvine iY for @i a IY i `a numispiosY iCCA printf@" %c"D iegsyAY }

/* ********************* *************/ void isriirvinetustifid @int longvineD int longngrdoA { vongitudvine numrueosD lnosixtrwinY vongitudvine numrueosetD numrueoswinY osinvine limsnfD limupD posY /* Calcular limite inferior y superior */ if @lineetulFontenidoH aa iegsyA /* Si es primera linea de un parrafo */ limsnf a longngrdoY else limsnf a HY /* printf("limInf %d", limInf); printf("\n"); getchar(); if @lineetulFontenidolineetulFlongitudEI aa iegsyA limup a lineetulFlongitud E PY else limup a lineetulFlongitud E IY /* printf("limSup %d", limSup); printf("\n"); getchar(); */ isriirispios@limsnfAY /* Calcular numero de huecos */ numrueos a HY for @pos a limsnfY pos `a limupY posCCA if @lineetulFontenidopos aa iegsyA

*/

117

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

numrueos a numrueos C IY /* Calcular numero de espacios a insertar y numero de huecos * en los que se inserta ese numero de espacios, en el resto * se inserta uno mas */ /* printf("numHuecos %d", numHuecos); printf("\n"); printf("longlinea %d", longLinea); printf("\n"); getchar();

*/ if @numrueos 3a HA { lnosixtrwin a @longvine E limup E IA G numrueosY numrueoswin a numrueos E @longvine E limup E IA 7 numrueosY } /* Recorrido para insertar espacios en los huecos */ /* printf("numHuecosMin %d", numHuecosMin); printf("\n"); getchar(); numrueoset a HY for @pos a limsnfY pos `a limupY posCCA { if @@lineetulFontenidopos aa iegsyA 88 @numrueoset ` numrueoswinAA { isriirispios @lnosixtrwin C IAY numrueoset a numrueoset C IY } else if @@lineetulFontenidopos aa iegsyA 88 @numrueoset ba numrueoswinAA isriirispios@lnosixtrwinCPAY else if @lineetulFontenidopos 3a iegsyA printf@" %c"D lineetulFontenidoposAY } *************/

*/

/* ********************* void isriirvineintustifir@A { osinvine iY for @i a HY i `a lineetulFlongitud E PY iCCA printf@" %c"DlineetulFontenidoiAY

ITES  PARANINFO c

118

Programas en C. Una introduccin a la Programacin.

if @lineetulFontenidolineetulFlongitudEI 3a iegsyA printf@" %c"DlineetulFontenidolineetulFlongitudEIAY

/* ********************* *************/ void isriirvine @fooleno justifiionD int longvineD int longngrdoA { if @justifiionA isriirvinetustifid@longvineD longngrdoAY else isriirvineintustifir@AY printf@"\n"AY } int min @A { printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 6.18. Justificacion de un texto *****\n"AY printf@"*****\n"AY printf@"\n"AY sniilizrropvine@8sngrdoD 8nhovineAY sniilizrvine@sngrdoAY printf@"\n"AY gomenzrlr@AY while @3pinheeuenilrA { /* printf("long linea actual %d", lineaActual.longitud); printf("\n");

for (int i = 1; i <= palabraActual.longitud; i++) printf(" %c", palabraActual.contenido[i-1]); printf("\n"); getchar(); */ if @sgul@plretulD wrrrfoAA { isriirvine@plsoD nhovineD sngrdoAY printf@"\n"AY sniilizrvine@sngrdoAY } else { if @3geinvine@vongitud@plretulAD nhovineAA { isriirvine@erdderoD nhovineD sngrdoAY

119

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

} isriirvine@plsoD nhovineD sngrdoAY printf@"\nPulse enter para continuar"AY gethr@AY return HY


} evnzrlr@AY

sniilizrvine@HAY } enydirlrevine@AY if @geinvine@ID nhovineAA enydirgrterevine@iegsyAY

int min@A { dfdf@AY } /* * Algoritmo GenF6_1. Genera el fichero datos6_1.dat * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */ /* En este algoritmo se ha sustituido la secuencia de NotaAlumno por un fichero secuencial, 'datos6_1.dat' */

#include `stdioFhb #include `onioFhb #define weevwxy PHH typedef struct { int odigoY /* 1..MAX_ALUMNOS; */ float notY } xotelumnoY int min @A { psvi BfY xotelumno lumY char xY

ITES  PARANINFO c

120

Programas en C. Una introduccin a la Programacin.

//

clrscr(); printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo GenF6_1. Genera el fichero datos6_1.dat *****\n"AY printf@"*****\n"AY printf@"\n"AY f a fopen@"datos6_1.dat"D "wb"AY do { printf@"\n"AY printf@"Introduzca el codigo del alumno (>= 1) (<= %d ): "DweevwxyAY snf@" %d"D 8lumFodigoAY while @gethr@A 3a 9n9AY printf@"Introduzca la nota del alumno: "AY snf@" %f"D 8lumFnotAY while @gethr@A 3a 9n9AY fwrite@8lumD sizeof@xotelumnoAD ID fAY printf@"Desea introducir mas notas? s/S (si),n/N (no): "AY snf@" %c"D 8xAY while @gethr@A 3a 9n9AY } while @@x 3a 9n9A 88 @x 3a 9x9AAY flose@fAY printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo VerF6_1. Consulta todo el fichero datos6_1.dat * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas */ #include `stdioFhb #include `onioFhb #define weevwxy PHH typedef struct { int odigoY /* 1..MAX_ALUMNOS; */ float notY } xotelumnoY

121

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

int min @A { psvi BfY xotelumno lumY // clrscr(); printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo VerF6_1. Consulta todo el fichero datos6_1.dat *****\n"AY printf@"*****\n"AY printf@"\n"AY f a fopen@"datos6_1.dat"D "rb"AY fred @8lumD sizeof@xotelumnoAD ID fAY printf@"** Notas de los alumnos (pulsa enter para ver siguiente) **\n"AY printf@"\n"AY while @3feof@fAA { printf@" codigo: %d\n"D lumFodigoAY printf@" nota: %.2f\n"D lumFnotAY gethr@AY fred @8lumD sizeof@xotelumnoAD ID fAY } flose@fAY printf@"\nPulse enter para continuar"AY gethr@AY return HY } /* * Algoritmo GenF6_4. Genera el fichero datos6_4.dat * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas * Fichero de salida: datos6_4.dat */

#include `stdioFhb #include `onioFhb #define fooleno int #define erddero I #define plso H #define weihsexi IHH

ITES  PARANINFO c

122

Programas en C. Una introduccin a la Programacin.

#define wrpinxots EI typedef struct { char nomreQHY int eddY fooleno sexoY float notY } istudinteY typedef psvi BpestudintesY typedef istudinte gursoweihsexiY int min@A { pestudintes fY istudinte estY char xY // clrscr(); printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo GenF6_4. Genera el fichero datos6_4.dat *****\n"AY printf@"*****\n"AY printf@"\n"AY f a fopen@"datos6_4.dat"D "wb"AY // Se introducen los datos de los estudiantes en la tabla printf@" Introduzca los datos de los estudiantes (nota=-1 para terminar)\n"AY do { printf@"\n"AY printf@" Introduzca nota: "AY snf@" %f"D 8estFnotAY while @gethr@A 3a 9n9AY if @estFnot aa wrpinxotsA breakY printf@" Introduzca el nombre: "AY snf@" %s"D 8estFnomreAY while @gethr@A 3a 9n9AY printf@" Introduzca la edad: "AY snf@" %d"D 8estFeddAY while @gethr@A 3a 9n9AY do { printf@" M/m mujer, H/h hombre: "AY snf@" %c"D 8xAY while @gethr@A 3a 9n9AY } while @@x 3a 9m9A 88 @x 3a 9w9A 88 @x 3a 9h9A 88 @x 3a 9r9AAY estFsexo a @x aa 9w9A || @x aa 9m9AY fwrite@8estD sizeof@istudinteAD ID fAY } while @erdderoAY

123

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

flose@fAY printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY


/* * Algoritmo VerF6_4. Consulta todo el fichero datos6_4.dat * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 6. Tablas * Fichero de entrada: datos6_4.dat */ #include `stdioFhb #include `onioFhb #define fooleno int #define erddero I #define plso H #define wrpinxots EP #define weihsexi IHH typedef struct { char nomreQHY int eddY fooleno sexoY float notY } istudinteY

typedef psvi BpestudintesY typedef istudinte gursoweihsexiY int min@A { pestudintes fY istudinte estY // clrscr(); printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo VerF6_4. Consulta todo el fichero datos6_4.dat *****\n"AY

ITES  PARANINFO c

124

Programas en C. Una introduccin a la Programacin.

printf@"*****\n"AY printf@"\n"AY f a fopen@"datos6_4.dat"D "rb"AY printf@"** Datos de los estudiantes (pulse enter para ver siguiente) **\n"AY printf@"\n"AY do { fred@8estD sizeof@istudinteAD ID fAY if @feof@fAA breakY printf@" nombre: %s\n"D estFnomreAY printf@" edad: %d\n"D estFeddAY printf@" sexo: "AY switch @estFsexoA { case erdderoX printf@"mujer\n"AY breakY case plsoX printf@"hombre\n"AY breakY } printf@" nota: %.2f\n"D estFnotAY gethr@AY } while @erdderoAY flose@fAY printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

125

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

3.6. Captulo 7
/* * Algoritmo 7.1. Funcion factorial recursiva * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 7. Disenyo recursivo */

#include `stdioFhb #include `onioPFhb long int ptoril @int nA { /* PRE: n >= 0 */ /* POST: Factorial (n) = n! */ long int resultdoY if @n aa HA resultdo a IY else if @n b HA resultdo a n B ptoril @nEIAY return @resultdoAY } min @A { int nY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.1. Funcion factorial recursiva *****\n"AY printf@"*****\n"AY printf@"\n"AY printf @"Numero (>= 0) y (<= 16): "AY snf@" %d"D8nAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"El factorial de %d es: %ld\n"D nD ptoril @nAAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 7.2. Funcion division natural recursiva

ITES  PARANINFO c

126

Programas en C. Una introduccin a la Programacin.

* Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Capitulo 7. Disenyo recursivo */ #include `stdioFhb #include `onioFhb typedef struct { int Y int rY } rY r hivisionxturl @int numD int denA // PRE: (num >= 0) y (den > 0) // POST: DivisionNatural (num,den) = <c, r> y num = c * den + r y 0 <= r < den { r pY if @num ` denA { pF a HY pFr a numY } else { p a hivisionxturl@numEdenD denAY pF a pF C IY } return pY } int min @A { int dividendoD divisorY r pY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.2. Funcion division natural recursiva *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el dividendo (>= 0): "AY snf@" %d"D 8dividendoAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Introduzca el divisor (> 0): "AY

127

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

snf@" %d"D 8divisorAY while @gethr@A 3a 9n9AY printf@"\n"AY p a hivisionxturl@dividendoD divisorAY printf@"Resultado: cociente = %d resto = %d\n"D pFD pFrAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 7.3. Funcion producto escalar recursiva lineal * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Capitulo 7. Disenyo recursivo */ #include `stdioFhb #include `onioFhb #define we IH typedef float etorweY

float pei @etor vID etor vPD int D int A // PRE 1 <= a <= b <= MAX, y v1 y v2 tienen valores significativos en [a, b] // POST pei (v1, v2, a, b) = sumatorio desde i = a hasta b de v1[i] * v2[i] { float peiuxY if @ aa A peiux a vI B vPY else if @ ` A peiux a vI B vP C pei@vID vPD CID AY return peiuxY } min @A { etor vvID vvPY int nD iY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.3. Funcion producto escalar recursiva lineal *****\n"AY printf@"*****\n"AY

ITES  PARANINFO c

128

Programas en C. Una introduccin a la Programacin.

printf@"\n"AY printf@"Introduzca el numero de elementos de los vectores (> 0) y (<= %d): "D weAY snf@" %d"D8nAY while @gethr@A 3a 9n9AY printf@"\nPrimer vector\n"AY for @i a HY i `a nEIY iCCA { printf@" Componente %d: "D iCIAY snf@" %f"D 8vvIiAY while @gethr@A 3a 9n9AY }Y printf@"\nSegundo vector\n"AY for @i a HY i `a nEIY iCCA { printf@" Componente %d: "D iCIAY snf@" %f"D 8vvPiAY while @gethr@A 3a 9n9AY }Y printf@"\nEl producto escalar de los vectores es: %.2f\n"D pei@vvID vvPD HD nEIAAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 7.4. Funcion producto escalar recursiva lineal final * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Capitulo 7. Disenyo recursivo */ #include `stdioFhb #include `onioFhb #define we IH typedef float etorweY float peii@etor vID etor vPD int D int D float A // PRE 1 <= a <= b <= MAX, y v1 y v2 tienen valores significativos en [a, b] // POST pei (v1, v2, a, b, c) = c + sumatorio desde i = a hasta b de v1[i] * v2[i] { float peiiuxY if @ aa A peiiux a C vI B vPY else /* a < b */ peiiux a peii @vID vPD CID D C vI B vPAY return peiiuxY

129

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

} int min@A { etor vvID vvPY int nD iY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.4. Funcion producto escalar recursiva lineal final *****\n "AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el numero de elementos de los vectores (> 0) y (<= %d): "DweAY snf@" %d"D8nAY while @gethr@A 3a 9n9AY printf@"\nPrimer vector\n"AY for @i a HY i `a nEIY iCCA { printf@" Componente %d: "D iCIAY snf@" %f"D 8vvIiAY while @gethr@A 3a 9n9AY }Y printf@"\nSegundo vector\n"AY for @i a HY i `a nEIY iCCA { printf@" Componente %d: "D iCIAY snf@" %f"D 8vvPiAY while @gethr@A 3a 9n9AY }Y printf@"\nEl producto escalar de los vectores es: %.2f\n"D peii @vvID vvPD HD nEID HAAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 7.5. Funcion producto escalar iterativa, equivalente a la del Algoritmo 7.4 * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Capitulo 7. Disenyo recursivo

ITES  PARANINFO c

130

Programas en C. Una introduccin a la Programacin.

*/ #include `stdioFhb #include `onioFhb #define we IH typedef float etorweY float peii @etor vID etor vPD int D int D float A // PRE 1 <= a <= b <= MAX, y v1 y v2 tienen valores significativos en [a, b] // POST pei (v1, v2, a, b, c) = c + sumatorio desde i = a hasta b de v1[i] * v2[ i] { int loY // corresponde al parametro a float loY // corresponde al parametro c // el parametro b no varia, no necesita copia local lo a Y lo a Y while @lo ` A { lo a lo C vIlo B vPloY lo a lo C IY } return lo C vIlo B vPloY

int min@A { etor vvID vvPY int nD iY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.5. Funcion producto escalar iterativa, *****\n"AY printf@"***** equivalente a la del Algoritmo 7.4 *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el numero de elementos de los vectores (> 0) y (<= %d): "DweAY snf@" %d"D8nAY while @gethr@A 3a 9n9AY printf@"\nPrimer vector\n"AY for @i a HY i `a nEIY iCCA { printf@" Componente %d: "D iCIAY snf@" %f"D 8vvIiAY while @gethr@A 3a 9n9AY }Y printf@"\nSegundo vector\n"AY

131

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

for @i a HY i `a nEIY iCCA { printf@" Componente %d: "D iCIAY snf@" %f"D 8vvPiAY while @gethr@A 3a 9n9AY }Y printf@"\nEl producto escalar de los vectores es: %.2f\n"D peii @vvID vvPD HD nEID HAAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 7.6. Funcion producto escalar iterativa sin parametros de inmersion ( version 1) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Mara J. Majado Rosales * Capitulo 7. Diseo recursivo */ #include `stdioFhb #include `onioFhb #define we IH typedef float etorweY int nY

float pe @etor vID etor vPA { int D Y float Y a HY while @ } return a ` a a nEIY a HY A { C vI B vPY C IY

C vI B vPY

int min@A { etor vvID vvPY

ITES  PARANINFO c

132

Programas en C. Una introduccin a la Programacin.

int iY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.6. Funcion producto escalar iterativa sin *****\n"AY printf@"***** parametros de inmersion (version 1) *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el numero de elementos de los vectores (> 0) y (<= %d): "DweAY snf@" %d"D8nAY while @gethr@A 3a 9n9AY printf@"\nPrimer vector\n"AY for @i a HY i `a nEIY iCCA { printf@" Componente %d: "D iCIAY snf@" %f"D 8vvIiAY while @gethr@A 3a 9n9AY }Y printf@"\nSegundo vector\n"AY for @i a HY i `a nEIY iCCA { printf@" Componente %d: "D iCIAY snf@" %f"D 8vvPiAY while @gethr@A 3a 9n9AY }Y printf@"\nEl producto escalar de los vectores es: %.2f\n"D pe @vvID vvPAAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 7.7. Funcion producto escalar iterativa (version 2) * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Mara J. Majado Rosales * Capitulo 7. Diseo recursivo */ #include `stdioFhb #include `onioFhb #define we IH typedef float etorweY int nY

133

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

float pe @etor vID etor vPA { int D Y float Y a HY a nEIY a HY while @ `a A { a C vI B vPY a C IY } return Y

int min@A { etor vvID vvPY int iY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.7. Funcion producto escalar iterativa (version 2) *****\n" AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el numero de elementos de los vectores (> 0) y (<= %d): "DweAY snf@" %d"D8nAY while @gethr@A 3a 9n9AY printf@"\nPrimer vector\n"AY for @i a HY i `a nEIY iCCA { printf@" Componente %d: "D iCIAY snf@" %f"D 8vvIiAY while @gethr@A 3a 9n9AY }Y printf@"\nSegundo vector\n"AY for @i a HY i `a nEIY iCCA { printf@" Componente %d: "D iCIAY snf@" %f"D 8vvPiAY while @gethr@A 3a 9n9AY }Y printf@"\nEl producto escalar de los vectores es: %.2f\n"D pe@vvID vvPAAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/*

ITES  PARANINFO c

134

Programas en C. Una introduccin a la Programacin.

* Algoritmo 7.8. Funcion potencia natural recursiva * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Capitulo 7. Disenyo recursivo */ #include `stdioFhb #include `onioFhb float otenixturl @float D int nA // PRE (n >= 0) y (n = 0 => a <> 0) // POST PotenciaNatural(a, n) = a elevado a n { float pnuxY if @n aa HA pnux a IFHY else /* n > 0 */ pnux a B otenixturl@D nEIAY return pnuxY } int min@A { float seY int exponenteY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.8. Funcion potencia natural recursiva *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un real como base de la potencia: "AY snf@" %f"D8seAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Introduzca un entero como exponente de la potencia (>= 0): "AY snf@" %d"D8exponenteAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Resultado: %.2f\n"D otenixturl@seD exponenteAAY

135

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

printf@"\nPulse enter para continuar"AY gethr@AY return HY


/* * Algoritmo 7.9. Calculo recursivo de Fibo(n) con inmersion de resultados por eficiencia * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Capitulo 7. Disenyo recursivo */ #include `stdioFhb #include `onioFhb typedef struct { int pY int sY } rY

r ipio @int nA // PRE n > 0 // POST Devuelve el par < Fibo(n), Fibo(n-1) > { int fiD fientY r prD preuxY if @n aa IA { prFp a IY prFs a IY /* iF = < Fibo(1), Fibo(0) > */ } else /* n > 1 */ { preux a ipio @n E IAY /* * tenemos: parAux.p = Fibo(n-1) y parAux.s = Fibo(n-2), luego: * Fibo(n) = Fibo(n-1) + Fibo(n-2) = parAux.p + parAux.s * Fibo(n-1) = parAux.p : */ prFp a preuxFp C preuxFsY prFs a preuxFpY } return prY }

ITES  PARANINFO c

136

Programas en C. Una introduccin a la Programacin.

int min@A { int nD fiD fientY r prY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.9. Calculo recursivo de Fibo(n) con inmersion *****\n"AY printf@"***** de resultados por eficiencia *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Termino de la sucesion que se desea calcular (> 0): "AY snf@" %d"D8nAY while @gethr@A 3a 9n9AY printf@"\n"AY pr a ipio @nAY printf@"El termino %d-esimo (posicion %d) de la sucesion es: %d\n"D nD nCID prFpAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 7.10. Funcion interfaz para la funcion del Algoritmo 7.9 * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Capitulo 7. Disenyo recursivo */ #include `stdioFhb #include `onioFhb typedef struct { int pY int sY } rY r ipio @int nA // PRE n > 0 // POST Devuelve el par < Fibo(n), Fibo(n-1) > {

137

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

int fiD fientY r prD preuxY if @n aa IA { prFp a IY prFs a IY // a = Fibo(1), b = Fibo(0) else { /* n > 1 */ preux a ipio @n E IAY /* * tenemos: parAux.p = Fibo(n-1) y parAux.s = Fibo(n-2), luego: * Fibo(n) = Fibo(n-1) + Fibo(n-2) = parAux.p + parAux.s * Fibo(n-1) = parAux.p : */ prFp a preuxFp C preuxFsY prFs a preuxFpY } return prY

int pinterf @int nA // PRE n > 0 // POST Finterf (n) = Fibo(n) { int fiD fientY int uxY r prY if @n aa HA ux a IY else { /* n > 0 */ // se llama a iFibo y se descarta su segundo resultado pr a ipio @nAY ux a prFpY

} return uxY

int min@A { int nY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.10. Funcion interfaz para la funcion del Algoritmo 7.9 *****\n"AY printf@"*****\n"AY printf@"\n"AY

ITES  PARANINFO c

138

Programas en C. Una introduccin a la Programacin.

printf@"Termino de la sucesion que se desea calcular (>= 0): "AY snf@" %d"D8nAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"El termino %d-esimo (posicion %d) de la sucesion: %d\n"D nD nCID pinterf @n AAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 7.11. Funcion potencia natural mejorada * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Capitulo 7. Disenyo recursivo */ #include `stdioFhb #include `onioFhb float otxt @float D int nA // PRE (n >= 0) y (n = 0 => a <> 0) // POST PotNat(a, n) = a elevado a n { float pD poteuxY if @n aa HA poteux a IFHY else { /* n > 0 */ p a otxt @D n G PAY if @n 7 P aa HA poteux a p B pY else poteux a B p B pY } return poteuxY

int min@A { float seY int exponenteY

139

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.11. Funcion potencia natural mejorada *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca un real como base de la potencia: "AY snf@" %f"D8seAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Introduzca un entero como exponente de la potencia (>= 0): "AY snf@" %d"D8exponenteAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Resultado: %.2f\n"D otxt@seD exponenteAAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 7.12. Funcion division natural mejorada * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Capitulo 7. Disenyo recursivo */ #include `stdioFhb #include `onioFhb typedef struct { int oY int resY } rY

r hivxt@int numD int denA // PRE: (num >= 0) y (den > 0) // POST: DivNat (num, den, c, r) y num = coc * den + res y 0 <= res < den { r prY if @num ` denA { prFo a HY

ITES  PARANINFO c

140

Programas en C. Una introduccin a la Programacin.

prFres a numY } else { pr a hivxt@numD den B PAY prFo a prFo B PY if @prFres ba denA { prFo a prFo C IY prFres a prFres E denY } } return prY

int min@A { int dividendoD divisorY r prY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.12. Funcion division natural mejorada *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el dividendo (>= 0): "AY snf@" %d"D8dividendoAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Introduzca el divisor (> 0): "AY snf@" %d"D8divisorAY while @gethr@A 3a 9n9AY pr a hivxt@dividendoD divisorAY printf@"\n"AY printf@"Resultado: cociente = %d resto = %d\n"D prFoD prFresAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 7.13. Accion recursiva que resuelve el problema de las torres de Hanoi * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales

141

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

* Capitulo 7. Disenyo recursivo */ #include `stdioFhb #include `onioFhb #define we IS typedef char istY // 'A'..'C'; El tipo Estaca sera un rango de caracteres void mover@ist D ist A // PRE ... la explicada en el texto // POST ... la explicada en el texto { /* * En nuestro caso la accion mover se limitara a * mostrar por la salida el movimiento realizado. * En general podria involucrar la modificacion del * estado de las estacas, si quisieramos llevar cuenta * del estado del juego en cada momento. Por esta * razon los parametros de tipo Estaca de la accion * Hanoi son de tipo dato-resultado. */ } printf@" mover disco de la estaca %c a la estaca %c\n"D D AY

void rnoi@int nD ist origenD ist intermedioD ist destinoA // PRE ... la explicada en el texto // POST ... la explicada en el texto { switch @nA { case I X mover@origenD destinoAY breakY default X rnoi@nEID origenD destinoD intermedioAY mover@origenD destinoAY rnoi@nEID intermedioD origenD destinoAY breakY } } int min@A { int ndisosY lrsr@AY printf@"\n"AY

ITES  PARANINFO c

142

Programas en C. Una introduccin a la Programacin.

printf@"*****\n"AY printf@"***** Algoritmo 7.13. Accion recursiva que resuelve el *****\n"AY printf@"***** problema de las torres de Hanoi *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Numero de discos (maximo %d): "D weAY snf@" %d"D8ndisosAY while @gethr@A 3a 9n9AY printf@"\n"AY rnoi@ndisosD 9e9D 9f9D 9g9AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 7.14. Algoritmo de ordenacion rapida de Hoare * Algoritmo 7.15. Accion de particionamiento para la accion de clasificacion rapida * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Capitulo 7. Disenyo recursivo */ /* * HOARE * * Implementa el algoritmo de clasificacion rapida de C. A. R. Hoare. * Solicita los datos para la generacion de los elementos del vector * (valores enteros): semilla aleatoria, numero de elementos que se * desean generar (con un maximo determinado por la constante MAX), y * valor maximo que se generara. Muestra el vector antes y despues de * la clasificacion, y comprueba que efectivamente esta ordenado tras * la llamada a la funcion de clasificacion. */ #include `stdioFhb #include `onioFhb #include `stdliFhb #define we QHHH #define fooleno int #define erddero I #define plso H typedef int ipofseY

143

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

typedef int indieY // 1..MAX typedef ipofse htosweY void gomprue@htos vD indie mrA /* * Comprueba que los 'mr' primeros elementos del vector 'v' esten * efectivamente ordenados. En caso contrario imprime un mensaje * de error indicando la posicion 'i' donde hay una inversion, es * decir, donde v[i] > v[i+1]. */ { indie iY fooleno errorY i a HY error a plsoY while @@i ` mrEIA 88 @3errorAA { if @vi b viCIA { printf@"<<< ERROR >>> (i= %d)"D iAY error a erdderoY } else i a i C IY }

int rndn@int nA { return rnd@A 7n C IY } void snithtos@ipofse BvD indie BmrA { indie iY int seedD mximoY printf@"Semilla aleatoria: "AY snf@" %d"D8seedAY while @gethr@A 3a 9n9AY srnd@seedAY printf@"\n"AY printf@"Elementos en el vector (minimo 1, maximo %d): "D weAY snf@" %d"DmrAY while @gethr@A 3a 9n9AY printf@"\n"AY printf@"Generar valores entre cero y: "AY snf@" %d"D8mximoAY

ITES  PARANINFO c

144

Programas en C. Una introduccin a la Programacin.

while @gethr@A 3a 9n9AY for @i a HY i `a BmrEI Y iCCA vi a rndn@mximoAY

void wostrrhtos@ipofse BvD indie BmrA { indie iY i a HY while @IA { // ITERAR printf@" %d"D viAY if @i aa BmrEIA breakY // DETENER i = mr; printf@", "AY i a i C IY }Y // FIN_ITERAR printf@"\n"AY

void sntermio@ipofse BvD indie iD indie jA { ipofse tY t a viY vi a vjY vj a tY

void rtiion@ipofse BvD indie infD indie supD indie BpivoteA { indie izD drY iz a inf C IY dr a supY while @iz 3a dr C IA { while @@iz `a drA 88 @viz `a vinfAA iz a iz C IY while @@iz `a drA 88 @vdr ba vinfAA dr a dr E IY if @iz ` drA { sntermio@vD izD drAY iz a iz C IY dr a dr E IY } } sntermio@vD infD drAY Bpivote a drY

145

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

} void glsifiionpids@ipofse BvD int infD int supA /* * Los parametros 'inf' y 'sup' son de tipo 'integer' en lugar de * ser de tipo 'indice' porque en las llamadas recursivas que se * hacen en esta funcion con los valores ('inf', 'p-1') y * ('p+1', 'sup') el valor de 'p+1' podria superar el limite * superior del tipo 'indice', mientras que el de 'p-1' podria * caer por debajo de su limite inferior, como asi ocurre, de * hecho. */ { indie pY if @inf ` supA { rtiion@vD infD supD 8pAY glsifiionpids@vD infD pEIAY glsifiionpids@vD pCID supAY }

void glsifiionpid@ipofse BvD indie elementosA { glsifiionpids@vD HD elementosEIAY } int min@A { htos tY indie mxrelY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 7.14. Algoritmo de ordenacion rapida de Hoare *****\n"AY printf@"***** Algoritmo 7.15. Accion de particionamiento para la accion de *****\n"A Y printf@"***** clasificacion rapida *****\n"AY printf@"*****\n"AY printf@"\n"AY snithtos@tD 8mxrelAY printf@"\n"AY printf@"\nVector antes de la clasificacion:\n"AY wostrrhtos@tD 8mxrelAY printf@"Enter para ordenar..."AY gethr@AY

ITES  PARANINFO c

146

Programas en C. Una introduccin a la Programacin.

glsifiionpid@tD mxrelAY printf@"\n"AY printf@"Vector despues de la clasificacion:\n"AY wostrrhtos@tD 8mxrelAY gomprue@tD mxrelAY printf@"\nPulse enter para continuar"AY gethr@AY return HY

147

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

3.7. Captulo 8

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Algoritmo 8.1. Comprobar el equilibrio de los signos puntuacion de apertura/cierre Titulo del libro: Una introduccion a la programacion. Un enfoque algoritmico Autores del libro: Jesus J. Garcia Molina Francisco J. Montoya Dato Jose L. Fernandez Aleman Maria J. Majado Rosales Fecha: 1/9/2005 Capitulo 8. Estructuras de datos dinamicas Ficheros de prueba: dat8_1A.txt, dat8_1B.txt, dat8_1C.txt y dat8_1D.txt SIGNOS Comprueba el equilibrio de los signos de puntuacion parentizados (parentesis, corchetes y llaves) de un fichero cuyo nombre se le solicita por teclado al usuario. A diferencia del algoritmo presentado en el capitulo de EE.DD. dinamicas, este programa no solo dice si el texto es correto o no, sino que en este ultimo caso informa ademas del punto del texto exacto y los signos que causaron el error. Para ello, al recorrer la secuencia de entrada se va llevando cuenta de la posicion por la que en cada momento se va en el recorrido (numero de linea y columna dentro de esta). Cuando se encuentra un signo de apertura, no solo se guarda en la pila el signo en cuestion, sino tambien el punto (linea y columna) donde este se encontro. De este modo, ante la ocurrencia de un error es posible notificar exactamente los signos que lo produjeron y las posiciones del texto donde estos se encuentran. Para detectar la condicion de error, en lugar de llevar una unica variable booleana llamada 'error', como en el algoritmo del libro, utilizaremos dos variables distintas que nos serviran para identificar el tipo de error exacto. Los nombres y significados de estas variables son los siguientes: error_pila: esta variable se pondra a VERDADERO cuando se encuentre un signo de cierre y la pila este vacia (es decir, no haya signos de apertura pendientes de cerrar). error_signo: esta variable se pondra a VERDADERO cuando se encuentre un signo de cierre que no se corresponda con el ultimo signo de apertura encontrado en el texto.

ITES  PARANINFO c

148

Programas en C. Una introduccin a la Programacin.

*/ #include `stdioFhb #include `stdliFhb #include `onioPFhb #include "msc1.h" #define fooleno int #define erddero I #define plso H typedef struct { char signoY int lineD olumnY } dtospilY typedef struct np { dtospil dtosY struct np BsigY } nodosignosY typedef nodosignos BpilsignosY // ---------------- Operaciones de la Pila ----------------pilsignos ili@A { return xvvY } fooleno isili@pilsignos pA { return p aa ili@AY } pilsignos epilr@pilsignos pD dtospil dA { pilsignos qY q a @pilsignosA mllo@sizeof@nodosignosAAY qEbdtos a dY qEbsig a pY } return qY

void gim@pilsignos pD dtospil BA { B a pEbdtosY }

149

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

pilsignos hespilr@pilsignos pA { pilsignos qY q a pEbsigY free@pAY return qY

pilsignos hestruiril@pilsignos pA { while @3isili@pAA p a hespilr@pAY return pY } // ---------------- Operaciones del Programa ----------------char ignogierre@char perturA /* * Devuelve el signo de cierre correspondiente al signo * de apertura 'apertura'. * * Pre: el caracter 'apertura' es un signo de apertura */ { char resY switch @perturA { case 99 X res a 99Y breakY case 9@9 X res a 9A9Y breakY case 9{9 X res a 9}9Y breakY }Y return resY

// ---------------- Programa Principal ----------------int min @A { wsI Y pilsignos pY dtospil dY fooleno errorsignoD errorpilY int linetulY // linea actual del recorrido int olumntulY // columna actual del recorrido

ITES  PARANINFO c

150

Programas en C. Una introduccin a la Programacin.

lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 8.1. Comprobar el equilibrio de los signos *****\n"AY printf@"***** puntuacion de apertura/cierre *****\n"AY printf@"*****\n"AY printf@"\n"AY a snitwgI@AY grgrpiherowgI@D "dat8_1A.txt"AY printf@"La secuencia de entrada es: "AY printf@"\n"AY printf@"\n"AY gomenzrwgI @AY while @@iewgI @A 3a wgIwrpin@AAA { printf@" %c"D iewgI @AAY evnzrwgI@AY }Y printf@"\n"AY printf@"\n"AY gomenzrwgI@AY if @iewgI@A aa wgIwrpin@AA printf@"Secuencia vacia\n"AY else { p a ili@AY linetul a IY olumntul a IY errorsigno a plsoY errorpil a plsoY do { if @@iewgI@A aa 99A || @iewgI@A aa 9@9A || @iewgI@A aa 9{9AA { dFsigno a iewgI@AY dFline a linetulY dFolumn a olumntulY p a epilr@pD dAY } else if @@iewgI@A aa 99A || @iewgI@A aa 9A9A || @iewgI@A aa 9}9AA { if @isili@pAA errorpil a erdderoY else { gim@pD 8dAY p a hespilr@pAY errorsigno a iewgI@A 3a ignogierre@dFsignoAY }

151

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

} else if @iewgI@A aa wgIwrpinvineA { linetul a linetul C IY olumntul a HY }Y /* * Avanzamos solo si no ha habido error, para preservar * en ese caso los valores de la posicion actual y poder * mostrarlos en el mensaje de error */ if @3@errorsigno || errorpilAA { evnzrwgI@AY olumntul a olumntul C IY } } while @3@@iewgI@A aa wgIwrpin@AA || errorsigno || errorpilAAY /* * Analizamos la razon por la que se detuvo la iteracion: * * error_pila: se encontro (en el EA) un signo de cierre cuando * no habia p}ientes de cierre ningun signo de apertura. * * error_signo: se encontro (en el EA) un signo de cierre que * no se corresponde con el ultimo signo de apertura * enontrado (que esta en 'd'). * * no hay error, pero la pila no es vacia: el texto se agoto y * los signos de apertura que quedan en la pila no se * cerraron. * * en otro caso: se alcanzo la marca de fin sin errores, y en * la pila no quedan signos de apertura sin cerrar, luego * el texto es correcto. */ if @errorpilA { printf@"Error: signo de cierre ' %c' en "D iewgI@AAY printf@"linea %d, columna %d,\n"D linetulD olumntulAY printf@"no tiene signo de apertura correspondiente\n"AY } else if @errorsignoA { printf@"Error: signo de cierre ' %c' en "D iewgI@AAY printf@"linea %d, columna %d,\n"D linetulD olumntulAY printf@"no se corresponde con signo de apertura "AY printf@"' %c' en linea %d"D dFsignoD dFlineAY printf@", columna %d\n"D dFolumnAY }

ITES  PARANINFO c

152

Programas en C. Una introduccin a la Programacin.

} printf@"\nPulse enter para continuar"AY gethr@AY return HY

else if @3isili@pAA { printf@"Error: se agoto el texto con los siguientes \n"AY printf@"signos de apertura pendientes de cerrar:\n\n"AY do { gim@pD 8dAY p a hespilr@pAY printf@" signo: ' %c'"D dFsignoAY printf@" linea %d, columna %d"D dFlineD dFolumnAY } while @3isili@pAAY } else { printf@"Texto correcto\n"AY } p a hestruiril@pAY

/* * Algoritmo 8.2. Crear un archivo secuencial que almacena enteros * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 8. Estructuras de datos dinamicas */ #include `stdioFhb #include `onioFhb int min@A { psvi BY int iY char nomrepiheroPHY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 8.2. Crear un archivo secuencial que almacena enteros *****\ n"AY

153

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el nombre del fichero de entrada: "AY snf@" %s"D 8nomrepiheroAY while @gethr@A 3a 9n9AY printf@"\n"AY a fopen@nomrepiheroD "wb"AY while @IA { printf@" Introduzca un numero entero (0 para terminar): "AY snf@" %d"D8iAY while @gethr@A 3a 9n9AY if @i aa HA breakY fwrite @8iD sizeof@intAD ID AY // se almacena en formato binario } flose@AY printf@"\n"AY printf@"Fichero %s creado"D nomrepiheroAY printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 8.3. Recorrido de un archivo secuencial de enteros para mostrarlos * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 8. Estructuras de datos dinamicas */

#include `stdioFhb #include `onioFhb int min@A { psvi BY int iY char nomrepiheroPHY lrsr@AY printf@"\n"AY printf@"*****\n"AY

ITES  PARANINFO c

154

Programas en C. Una introduccin a la Programacin.

printf@"***** Algoritmo 8.3. Recorrido de un archivo secuencial de enteros *****\n"A Y printf@"***** para mostrarlos *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el nombre del fichero de entrada: "AY snf@" %s"D 8nomrepiheroAY while @gethr@A 3a 9n9AY printf@"\nEl fichero consta de los siguientes elementos: "AY a fopen@nomrepiheroD "rb"AY /* * Notese que este algoritmo sigue el primer esquema de * recorrido del primer modelo de acceso secuencial * en el que se tiene: * Comenzar: fread * FinDeSecuencia: feof * Avanzar: fread */ fred@8iD sizeof@intAD ID AY while @3feof@AA { printf@" %d "D iAY fred@8iD sizeof@intAD ID AY // se almacena en formato binario } flose@AY printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

/* * Algoritmo 8.4. Acceso directo a un archivo para modificar un elemento * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 8. Estructuras de datos dinamicas */ #include `stdioFhb #include `onioFhb

155

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

#include `stdliFhb int min@A { psvi BY int iD pY int tmnyoY char nomrepiheroPHY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 8.4. Acceso directo a un archivo para *****\n"AY printf@"***** modificar un elemento *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el nombre del fichero de entrada: "AY snf@" %s"D 8nomrepiheroAY while @gethr@A 3a 9n9AY a fopen@nomrepiheroD "r+b"AY printf@"\n"AY printf@"Posicion que desea modificar (>= 0): "AY snf@" %d"D8pAY while @gethr@A 3a 9n9AY printf@"\n"AY fseek@D HD iiuixhAY // se posiciona al final del archivo tmnyo a ftell@AGsizeof@intAY // se obtiene el nmero de enteros que contiene el archivo if @@p ` HA || @p b tmnyoEIAA printf@"Posicion fuera del archivo"AY else { fseek@D p B sizeof@intAD iiuiAY fred@8iD sizeof@intAD ID AY printf@"Valor actual en la posicion %d: %d\n"D pD iAY printf@"\n"AY printf@"Introduzca el nuevo valor: "AY snf@" %d"D8iAY while @gethr@A 3a 9n9AY fseek @D p B sizeof@intAD iiuiAY fwrite@8iD sizeof@intAD ID AY printf@"\n"AY printf@"Fichero %s actualizado"D nomrepiheroAY } flose@AY printf@"\n"AY printf@"\nPulse enter para continuar"AY

ITES  PARANINFO c

156

Programas en C. Una introduccin a la Programacin.

gethr@AY return HY

/* * Algoritmo 8.5. Anyadir un elemento al final de un archivo * Titulo del libro: Una introduccion a la programacion. * Un enfoque algoritmico * Autores del libro: Jesus J. Garcia Molina * Francisco J. Montoya Dato * Jose L. Fernandez Aleman * Maria J. Majado Rosales * Fecha: 1/9/2005 * Capitulo 8. Estructuras de datos dinamicas */ #include `stdioFhb #include `onioFhb int min@A { psvi BY int iY char nomrepiheroPHY lrsr@AY printf@"\n"AY printf@"*****\n"AY printf@"***** Algoritmo 8.5. Anyadir un elemento al final de un archivo *****\n"AY printf@"*****\n"AY printf@"\n"AY printf@"Introduzca el nombre del fichero de entrada: "AY snf@" %s"D 8nomrepiheroAY while @gethr@A 3a 9n9AY a fopen@nomrepiheroD "ab"AY printf@"\n"AY printf@"Dato entero para anyadir al final del fichero: "AY snf@" %d"D8iAY while @gethr@A 3a 9n9AY fwrite@8iD sizeof@intAD ID AY flose@AY printf@"\n"AY printf@"Fichero %s actualizado"D nomrepiheroAY printf@"\n"AY printf@"\nPulse enter para continuar"AY gethr@AY return HY

157

c ITES  PARANINFO

Programas en C. Una introduccin a la Programacin.

ITES  PARANINFO c

158

También podría gustarte