Sie sind auf Seite 1von 243

I NTR O DUC C I N A L O S A L G OR I TMOS EN L E NG UA J E C / C + +

H UMB E R TO MA Z UE R A P R R A G A
hmazuera@cuao.edu.co www.geocities.com/humbertomazuera

"Feliz es el hombre que ha hallado sabidura, y el hombre que consigue discernimiento, porque el tenerla como ganancia es mejor que tener la plata como ganancia; y el tenerla como producto, que el oro mismo. Es ms preciosa que los corales, y todos tus otros deleites no pueden ser igualados a ella. Largura de das est en su diestra, en su siniestra hay riquezas y gloria. Sus caminos son caminos de agradabilidad, y todas sus veredas son paz. Es rbol de vida a los que se asen de ella, y los que la mantienen firmemente asida han de ser llamados felices."

Proverbios, 3:11-18

C A L I , fe br e r o D E l 2 0 0 1
1

TABLrrorONTENIDO dor no definido. E A DE C ! Marca Componentes de los Programas en Lenguaje C Instrucciones Secuenciales Instruccin Selectiva If Instruccin Selectiva Switch Divide y Venceras: Funciones Instruccin Repetitiva While Instruccin Repetitiva While(Continuacin) Instruccin Repetitiva Desde Instruccin Repetiva Do...While Paso por Valor y Retorno en Funciones Arreglos Unidimensionales Algoritmos de Clasificacion de Vectores Algoritmos con Vectores(Continuacin) Arreglos Bidimensionales Punteros y Paso por Referencia Estructura de Datos Registro Estructura de Datos Archivo Men de Conmutadores en Modo Grfico Las Tradicionales Printf y Scanf Cdigo ASCII y Cdigos Extendidos

CAPTULO 1 COMPONENTES DE LOS PROGRAMAS EN C++


1.1 METODOLOGA El profesor deber explicarle los diversos componentes de un programa elemental en lenguaje C++, a partir de describirle el programa COUT01.CPP, ver listado ms adelante, en l la instruccin principal que debe entender o mejor abstraer, es el objeto cout <<, la cual permite mostrar en la pantalla de la computadora, la informacin que deseamos. El profesor explicar como copiar, depurar, compilar y ejecutar en la mquina un programa. A continuacin el profesor explicar la codificacin de expresiones algebraicas como expresiones algortmicas "entendibles" por la computadora, y finalmente les explicar el programa COUT02.CPP. Ya en su casa, no se angustie, efecte la primera tarea y luego con sus compaeros de Grupo de estudio, disctanla y lleven la que crean definitiva al laboratorio de computadoras. En el laboratorio deber haber un monitor el cual les ayude a manejar el editor del lenguaje C++, a compilar y ejecutar los dos programas vistos en clase y luego la tarea. Efecte una lectura de todo este captulo con la sola finalidad de saber el que existen muchos elementos constitutivos de un lenguaje de programacin, no se alarme si no entiende mucho y no pretenda aprender nada de memoria. 1.2 PROGRAMACIN ESTRUCTURADA El concepto de programacin estructurada como un enfoque cientfico a la programacin de computadoras lo introdujeron E.W.Dijkstra y C.A.R.Hoare a fines de los aos sesenta. Mediante el anlisis matemtico de la estructura de los programas, ellos mostraron que podemos evitar muchos errores de diseo de programas mediante un enfoque sistemtico a la programacin. Es fundamental en la programacin estructurada el diseo adecuado de los algoritmos y el manejo de las estructuras de datos. La programacin estructurada enfrenta el problema a resolver con la tcnica del "Divide y Vencers", dividindolo sucesivamente en partes ms pequeas, cada una de estas partes, estas reciben diversos nombres dependiendo del lenguaje utilizado: procedimientos, rutinas, mtodos, funciones, subrutinas, bloques de cdigo, etc.; en el lenguaje C/C++ las llamamos funciones. En general un programa es un conjunto de instrucciones las cuales le dicen a la computadora cmo ejecutar una tarea especfica. Todos los lenguajes de programacin consisten en secuencias de caracteres, o sea de letras, nmeros, smbolos retornos de carro y espacios. Se puede definir un lenguaje de computadora como una secuencia de elementos, los cuales tienen un significado concreto y "entendible" por la misma. Estos elementos son: las palabras reservadas(keywords), los identificadores y los smbolos, la sintaxis del lenguaje definir cmo se combinarn todos estos para producir un cdigo ejecutable por el ordenador. 1.3 ALGORITMO Se entiende por un algoritmo la secuencia de pasos necesarios para realizar una area o un determinado problema. En el presente curso presentaremos los algoritmos escritos en el lenguaje de nivel intermedio C/C++.

1.4 SMBOLOS Un smbolo es uno o varios caracteres los cuales tienen un especial significado en los lenguajes de computador. Ellos pueden ser separadores de identificadores como la coma(,), separadores de expresiones como el punto y coma(;), agrupadores de expresiones como los parntesis y operadores de diversos tipos. Lista de ellos se presenta ms adelante en varias tablas. Cada smbolo est representado internamente por un cdigo o secuencia de cdigos ASCII. 1.5 CDIGO ASCII El cdigo ASCII(American Standard Committed for Information Interchange), es el cdigo con el cual operan los microcomputadores que trabajan bajo el sistema operativo MS-DOS y Windows. Se compone de un conjunto de caracteres de control, y caracteres imprimibles, numerados del 0 al 255. Ocupa cada uno de ellos un Byte de memoria, es decir ocho bit. Tabla 1.1 Caracteres ASCII. 0 12 24 32 44 56 68 80 92 104 116 128 140 152 164 176 188 200 212 224 236 248 1 13 25 33 45 57 69 81 93 105 117 129 141 153 165 177 189 201 213 225 237 249 2 _ 14 26 ! 34 - 46 9 58 E 70 Q 82 ] 94 i 106 u 118 130 142 154 166 178 190 202 214 226 238 250 3 _ 15 27 " 35 . 47 : 59 F 71 R 83 ^ 95 j 107 v 119 131 143 155 167 179 191 203 215 227 239 251 4 5 16 17 28 _ 29 36 $ 37 % 48 0 49 1 60 < 61 = 72 H 73 I 84 T 85 U 96 ` 97 a 108 l 109 m 120 x 121 y 132 133 144 145 156 157 168 169 _ 180 181 192 193 204 205 216 217 228 229 240 241 252 _ 253 6 18 30 38 & 50 2 62 > 74 J 86 V 98 b 110 n 122 z 134 146 158 _ 170 182 194 206 218 230 242 254 7 8 _ 9 10 _ 11 _ 19 _ 20 21 22 23 31 39 ' 40 ( 41 ) 42 * 43 + 51 3 52 4 53 5 54 6 55 7 63 ? 64 @ 65 A 66 B 67 C 75 K 76 L 77 M 78 N 79 O 87 W 88 X 89 Y 90 Z 91 [ 99 c 100 d 101 e 102 f 103 g 111 o 112 p 113 q 114 r 115 s 123 { 124 | 125 } 126 ~ 127 135 136 137 138 139 147 148 149 150 151 159 160 161 162 163 171 172 173 174 175 183 184 185 186 187 195 196 197 198 199 207 208 209 210 211 219 220 221 222 223 231 232 233 234 235 243 244 245 246 247 255

_ , 8 D P \ h t _

# / ; G S _ k w

1.6 EL LENGUAJE C++ El C++ es un poderoso compilador, utilizado por experimentados y recin iniciados programadores. Con el Turbo C++ se consigue simultneamente el C++ de la compaa AT&T y el estndar ANSI C. De esta forma el C++ es un lenguaje de propsito general en el cual se puede desarrollar cualquier tipo de aplicacin, desde aplicaciones comerciales, de ingeniera, cientficas, juegos, sistemas operativos hasta los ltimos desarrollos en inteligencia artificial y dentro de ella la robtica, los sistemas expertos, analizadores de lenguajes, etc. El C++ es un lenguaje de programacin orientada a objetos (POO), empero, este tema no ser abordado en este manual.

Tabla 1.2 auto break case* char* const* continue default do*

Las 32 palabras reservadas del C. double* else* enun extern float* for* goto if* int* long* register return* short signed sizeof static struct* switch* typedef* union* unsigned* void* volatile while*

NOTA: Solo los identificadores con asterisco(*), se utilizarn en el presente curso. Tabla 1.3 asm catch clas delete friend Las palabras reservadas ampliadas del C++ inline new operator overload private protected public template this throw try virtual

NOTA: Ninguno de estos identificadores se utilizar en este curso. Solo debe tener la precaucin, cuando defina un identificador, el de no utilizar ninguna de las palabras reservadas de las Tablas 1.2 y 1.3 1.7 LIBRERAS Para optimizar el cdigo producido, los lenguajes en general y como parte de la mxima "Divide y Vencers", colocan una serie de utilidades(funciones, tipos de datos, variables, etc.) en archivos separados, los cuales de pueden utilizar como si estuvieran en el programa que estamos diseando. El C/C++ en particular trae una gran cantidad de archivos a incluir por medio de la directiva del compilador #include, la cual debe ser colocada preferiblemente al inicio del programa y siempre por fuera del mbito de las funciones. Los archivos a incluir en el turbo C++ los puede encontrar en el nivel de ayuda del editor. Los siguientes sern los utilizados en el presente manual, y con esta sintaxis: #include #include #include #include <iostream.h> #include <conio.h> #include <string.h> <iomanip.h> #include <dos.h> #include <stdlib.h> <stdio.h> #include <math.h> #include <values.h> <ctype.h> #include <graphics.h> #include <fstream.h>

1.8 SEPARADORES DE INSTRUCCIONES Cada lenguaje utiliza alguna convencin para separar las diferentes instrucciones del mismo; en el lenguaje C el separador es el smbolo de punto y coma ;. Se debe colocar el punto y coma al final de cada instruccin (statement). En C/C++ el punto y coma marca el fin de una instruccin, es decir es su terminador. Se exceptan las instrucciones del preprocesador (define, include, etc.), las cuales no llevan punto y coma al final. En tiempo de compilacin el "compilador" revisar la sintaxis de las diferentes instrucciones y en caso de encontrar alguna con terminador inadecuado, esto es sin punto y coma, dar un error de sintaxis: " ; expected", es decir que

esperaba un punto y coma y encontr otro caracter, en general este otro caracter lo encuentra en la instruccin siguiente, donde marcar el error y confundiendo al recin iniciado. Observe los punto y comas en los programas presentados en este captulo. 1.9 COMENTARIOS En todo lenguaje hay la posibilidad de colocar comentarios, estos son lneas en el cdigo fuente adicionales al algoritmo propio del programa; estos comentarios no se tendrn en cuenta en el momento en que el compilador produzca el cdigo objeto(archivo *.obj), es decir no ocuparn espacio en l. Es buena prctica de programacin colocar abundantes comentarios, y de esta forma guardar el programa adecuadamente documentado. En el lenguaje C se utilizan los caracteres /* y */ para el inicio y la terminacin de comentarios, estos pueden ocupar una o tantas lneas como se desee, ejemplo: /* <---- aqu comienzan mis comentarios en esta lnea tambin siguen .... aqu terminan los comentarios ----> */ Adicionalmente en C++ existe el comentario de lnea, o ms exactamente desde la columna donde se coloque hasta el fin de lnea, este comentario inicia con una doble barra inclinada //, ejemplo: // este es un comentario de una sola lnea. // este es otro comentario // etc. 1.10 OPERACIONES DE ENTRADA/SALIDA Un programa para que pueda trabajar, entre otras cosas, debe poder operar los datos que se proporcionan mediante un dispositivo de entrada y poder enviar los resultados despus de procesados con la ayuda de un algoritmo a un dispositivo de salida. En la forma estndar o por defecto (default) el dispositivo de entrada ser el teclado y el dispositivo de salida la pantalla o monitor. Figura 1.1 instrucciones bsicas de entrada/salida en C++. PC PANTALLA cout << << Insercin en Flujo de salida MEMORIA RAM TECLADO cin >> >> Extraccin en Flujo de entrada

1.11 INSTRUCCIN DE ESCRITURA EN PANTALLA Para transferir valores de constantes, variables, expresiones algebraicas, o expresiones delimitadas como cadenas de caracteres de la memoria del computador a la pantalla, emplearemos la instruccin (en realidad es un objeto) del lenguaje C++: cout <<, en su forma por defecto, y la cual se encuentra en el archivo a incluir iostream.h. El operador << es llamado en este contexto un insertor, ya que inserta datos en el flujo de salida hacia la pantalla. Esta instruccin despliega o muestra los valores que se le indiquen en pantalla, teniendo la posibilidad de formatearlos. Figura 1.2 Fragmento de cdigo en C++ y lo que aparecera en pantalla: clrscr(); //Borrar pantalla cout << "ESTO ES SOLO UNA PRUEBA...\n"; N = 0; cout << "El contador N = " << N << "\n"; cout << "\n\n\nArriba hay tres lneas en blanco\n"; cout << "\n1+ 2 + 3 = " << 1+2+3 << "\n"; N++; cout << "El contador N = " << N << "\n\n"; cout << "El cursor est aqu"; PANTALLA ESTO ES SOLO UNA PRUEBA El contador N = 0 Arriba hay tres lneas en blanco 1 + 2 + 3 = 6 El contador N = 1 El cursor est aqu_

1.12 El siguiente ejemplo presenta en pantalla un texto compuesto de varias lneas, cpielo, tal cual, complelo y ejectelo. Luego modifquele los saltos de lnea. Las tildes digtelas pulsando la tecla ALT y simultneamente, en el teclado numrico, el cdigo ASCII correspondiente. #include <iostream.h> // cout #include <conio.h> // clrscr() y getch() //COUT01.CPP main(){ clrscr(); cout << " ... Prevalece la supersticin pattica de que sabiendo ms \n"; cout << "y ms hechos es posible llegar a un conocimiento de la \n"; cout << "realidad. De este modo se descargan en la cabeza de los \n"; cout << "estudiantes centenares de hechos aislados e inconexos; todo \n"; cout << "su tiempo y toda su energa se pierden en aprender cada vez \n"; cout << "ms hechos, de manera que les queda muy poco lugar para \n"; cout << "ejercitar el pensamiento. Es cierto que el pensar carente \n"; cout << "de un conocimiento adecuado de los hechos sera vaco y \n"; cout << "ficticio; pero la 'informacin' sin teora puede representar \n"; cout << "un obstculo para el pensamiento tanto como su carencia. ... \n"; cout << "\n\n"; cout << " ERICH FROMM \n"; cout << " \"EL MIEDO A LA LIBERTAD\""; getch(); } Figura 1.3 Efecto de la ejecucin del Programa COUT01.CPP en pantalla ... Prevalece la supersticin pattica de que sabiendo ms y ms hechos es posible llegar a un conocimiento de la realidad. De este modo se descargan en la cabeza de los estudiantes centenares de hechos aislados e inconexos; todo su tiempo y toda su energa se pierden en aprender cada vez ms hechos, de manera que les queda muy poco lugar para ejercitar el pensamiento. Es cierto que el pensar carente de un conocimiento adecuado de los hechos sera vaco y ficticio; pero la 'informacin' sin teora puede representar un obstculo para el pensamiento tanto como su carencia. ...

ERICH FROMM "EL MIEDO A LA LIBERTAD"_

1.13 ESCRITURA DE UN PROGRAMA EN EL EDITOR DEL TURBO C++ Despus de asistir a la clase magistral correspondiente a esta segunda leccin estudie las explicaciones dadas en este captulo sobre operaciones de entrada y salida y luego deber dirigirse a la sala de cmputo, donde el profesor explicar los pasos para lograr editar, compilar, enlazar y ejecutar un programa en el Lenguaje C. Copie, en el editor, uno por uno todos los programas que se presentan en esta leccin, compilndolos y ejecutndolos cada uno de ellos. Figura 1.4 Editor del Turbo C++ File Edit Search Run Compile Debug Project Options Window Help [_] NONAME00.CPP [_] Open a File Name C:\TC\ALGORIT.MOS\*.CPP Open Files COUT00.CPP COUTIN03.CPP Replace COUT01.CPP COUTIN04.CPP COUT02.CPP COUTIN05.CPP COUT03.CPP COUTIN06.CPP COUT04.CPP COUTIN07.CPP COUTIN00.CPP COUTIN08.CPP Cancel COUTIN01.CPP COUTIN09.CPP COUTIN02.CPP COUTIN10.CPP Help C:\TC\ALGORIT.MOS\*.CPP COUT00.CPP 630 Sep 17,1995 8:06am 1:1 F1 Help Type for incremental search: lower for files, upper for directories 1.14 Para lograr ejecutar un programa se debern utilizar varias secuencias de teclas, las principales a necesitar e ir "memorizando" son las contenidas en la siguiente Tabla:

Tabla 1.4 Secuencias de teclas ms utilizadas. TECLA ORDEN DEL MENU F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F10 F10 F10 F10 Ayuda del editor Grabar en disco Cargar desde disco Ejecutar programa hasta el cursor Hace zoom en la ventana activa Cambia de ventana activa Rastreo del programa con llamado de funciones Rastreo del programa saltando funciones Compila y enlaza el programa Activa el men principal File New Comenzar un programa nuevo File Change Dir Cambiar directorio actual Window Close All Cerrar todas las ventanas Help Index ndice alfabtico de ayuda + + + + F8 Marca punto en el cual detenerse ejecucin F9 Compilar y ejecutar(correr) Y Borrar una lnea T Borrar una palabra o espacios Teclas Mover Marcar bloque DelBorrar bloque marcado InsRestaurar bloque borrado KV Mover bloque marcado KC Copiar bloque marcado KR Leer un archivo como bloque KW Grabar un bloque como archivo KP Imprimir bloque marcado

CTRL CTRL CTRL CTRL

Shift Shift Shift CTRL CTRL CTRL CTRL CTRL ALT ALT ALT ALT ALT ALT ALT ALT ALT + + + + + + + + +

+ + + + + + + +

0 Lista ventanas abiertas 1 al 9 Activa ventana 1 al 9 F1 Pantalla ayuda anterior F3 Elimina ventana activa F4 Abre ventana de depuracin F5 Cambia a ventana de ejecucin del programa F7 Error anterior F8 Error siguiente F9 Compilar a archivo .OBJ

ALT + X Salir(eXit) del editor del C++

10

Figura 1.5 Ejemplo de funcin main() en editor del Turbo C++ File Edit Search Run Compile Debug Project Options Window Help [_]1[_] //El siguiente ejemplo Run Ctrl+F9 o compuesto de varias lne //cpielo, tal cual, c Program reset Ctrl+F2 odifquele los saltos de l Go to cursor F4 #include <iostream.h> Trace into F7 #include <conio.h> // Step over F8 Arguments... main(){ clrscr(); cout << " ... Prevalece la supersticin pattica de que sabiendo ms \n"; cout << "y ms hechos es posible llegar a un conocimiento de la \n"; cout << "realidad. De este modo se descargan en la cabeza de los \n"; cout << "estudiantes centenares de hechos aislados e inconexos; todo \n"; cout << "su tiempo y toda su energa se pierden en aprender cada vez \n"; cout << "ms hechos, de manera que les queda muy poco lugar para \n"; cout << "ejercitar el pensamiento. Es cierto que el pensar carente \n"; cout << "de un conocimiento adecuado de los hechos sera vaco y \n"; cout << "ficticio; pero la 'informacin' sin teora puede representar \n"; cout << "un obstculo para el pensamiento tanto como su carencia. ... \n"; cout << "\n\n"; cout << " ERICH FROMM \n"; cout << " \"EL MIEDO A LA LIBERTAD\""; 1:1 F1 Help Make and run the current program 1.15 CUERPO DEL PROGRAMA Los programas en C/C++ debern estar compuestos de al menos una funcin, la funcin main(), sin esta el programa no trabajar por s solo. Cada funcin del programa, consta de la secuencia de instrucciones o algoritmo que la computadora deber realizar. El algoritmo debe incluir identificadores, operadores y palabras claves. Todo algoritmo se desarrollar con tres tipos de instrucciones: Secuenciales, Selectivas y Repetitivas; el entendimiento de estas tres es el objetivo principal de este curso. De esta forma el algoritmo es simplemente la secuencia de pasos que interpretan un problema especfico, en algn campo del saber, y que la computadora podr ejecutar y de esta forma nosotros obtener los resultados deseados. El C++ es un lenguaje de formato libre. Los espacios en blanco adicionales y los caracteres de salto de lnea no son relevantes para el compilador, excepto cuando se requieren para conservar identificadores y las palabras claves o dentro de variables de tipo de cadena. Las lneas del programa pueden tener una longitud mxima de hasta 127 caracteres, siendo preferible utilizar menos de los primeros 80 por motivos de presentacin en las impresiones del cdigo fuente. Recordar que la pantalla tiene en modo de texto 80 columnas.

11

Figura 1.6 Ejemplo de funcin main() en editor del Turbo C++ File Edit Search Run Compile Debug Project Options Window Help \TC\ALGORIT.MOS\COUT01.CPP 1-[ ] // New presenta en pantalla un texto compuesto de varias lnea // Open... F3 mpilelo y ejectelo. Luego modifquele los saltos de l Save F2 //COUT01.CPP #i Save as... // cout #i Save all lrscr() y getch() ----------------- ma Change dir... Print DOS shell alece la supersticin pattica de que sabiendo ms \n"; ----------------- hos es posible llegar a un conocimiento de la \n"; Quit Alt+X De este modo se descargan en la cabeza de los \n"; s centenares de hechos aislados e inconexos; todo \n"; cout << "su tiempo y toda su energa se pierden en aprender cada vez \n"; cout << "ms hechos, de manera que les queda muy poco lugar para \n"; cout << "ejercitar el pensamiento. Es cierto que el pensar carente \n"; cout << "de un conocimiento adecuado de los hechos sera vaco y \n"; cout << "ficticio; pero la 'informacin' sin teora puede representar \n"; cout << "un obstculo para el pensamiento tanto como su carencia. ... \n"; cout << "\n\n"; cout << " ERICH FROMM \n"; cout << " \"EL MIEDO A LA LIBERTAD\""; 1:1 F1 Help Save the file in the active Edit window

1.16 EXPRESIONES Una expresin es un conjunto de datos compuesto de operandos unidos operadores. Los operandos pueden ser constantes, variables o funciones. 1.17 OPERADORES Los operadores se utilizan para procesar adecuadamente los operandos de acuerdo a sus tipos de datos. Por la caracterstica de operacin que realizan, los operadores tambin se dividen en: aritmticos, relacionales, lgicos, a nivel de bits, el operador sizeof, el operador coma. En la siguiente tabla de operadores, los operadores del Turbo C++ son divididos en 16 categoras. La categora #1 tiene la ms alta prioridad de precedencia; la categora #2 (operadores unarios) tiene la segunda prelacin, y as sucesivamente hasta el operador coma que tiene la ms baja prelacin. Operadores dentro de la misma categora tienen la misma prelacin. Los operadores unarios (categora #2), los condicionales (categora #14) y los de asignamiento (categora #15) son asociados de derecha a izquierda, todos los dems son asociados de izquierda a derecha. De mayor precedencia quiere decir que se ejecuta primero. por

12

Tabla 1.5 Operadores del C++ y Precedencia # Categora Operador Qu es (o qu hace) 1. Mayor () Invocacin de funcin [] Suscritos de arreglos -> Selector de indireccin :: Resolucin de mbito . Selector de componentes 2. Unarios ! Negacin lgica (NOT) ~ Complemento en binario + Ms Menos ++ Preincremento o postincremento - Predecremento o postdecremento & Direccin * Valor en la direccin de sizeof Tamao del operando en bytes new Espacio en memoria dinmica delete Desasigna espacio en memoria 3. Multipli- * Multiplicacin cativos / Divisin % Resto en divisin entera 4. Acceso . Separador campo a miembros -> Separador campo 5. Aditivos + Ms binario Menos binario 6. Desplaza- << Izquierda miento bits >> Derecha 7. Relacional < Menor que <= Menor o igual que > Mayor que >= Mayor o igual que 8. Igualdad == Igual a != No igual a 9. y & AND para bits 10. o exclusivo ^ XOR para bits 11. o | OR para bits 12. y && AND lgico Contina...

13

Tabla 1.5 Operadores del C++ y Precedencia (Continuacin) # Categora Operador Que es (o que hace) 13. o || OR lgico 14. Condicional ?: a ? x : significa: "Si a Entonces x, SI_NO y" 15. Asignacin = Asignamiento simple *= Producto /= Divisin %= Resto += Suma -= Diferencia &= AND sobre bits ^= XOR sobre bits |= OR sobre bits <<= Desplazamiento a la izquierda >>= Desplazamiento a la derecha 16. Coma , Separador de expresiones NOTA: muchos de estos operadores no sern utilizados en el presente manual. Las expresiones numricas estn formadas por operadores aritmticos y con operandos enteros o reales. Ejemplos de expresiones con operadores aritmticos vlidas, dentro de un algoritmo, son las siguientes: Numero = 24 / 2 - 36 % 6; cout << "60 = " << 60 * 3.14159 / 180 << " radianes"; Valor = (123.54 - 544.1232/8 + (34.6632*54.21) + Numero; y = 3.2 * Pow(2, 12) - 4.1 * x + 69; cout<< "Resultado expresin algebraica = " << (y-x)/(a*x-b); Energa = Masa * Pow(VelocidadLuz, 2); El primer paso para traducir una expresin algebraica a su equivalente de computador es verificar que cada operacin est indicada, como es el caso en la expresin algebraica: 13X + 31Y donde la multiplicacin la entendemos tcitamente, esta debe codificarse como 13*X + 31*Y, los espacios en blanco son opcionales, empero, mejoran la presentacin de la expresin. En la tabla siguiente se presenta una evaluacin "manual" de expresiones aritmticas:

14

Tabla 1.6. Evaluacin secuencial de expresiones aritmticas 65.0 / 2 32.5 65 / 2 32 65 % 2 1

5 + 3 * 3 - 4 + 12 * 10 5 + 9 - 4 + 120 14 - 4 + 120 10 + 120 130

6 + 9 * 8 / 2 * 4 - 2 * 3 6 + 72 / 2 * 4 - 2 * 3 6 + 36 * 4 - 2 * 3 6 + 144 - 2 * 3 6 + 144 - 6 150 - 6 144

(63 -20) /(35 -15) 43 / 20 2 (63 -20.0) /(35 -15) 43.0 / 20 2.0

4.2 / 2 + 3.9 / 3 2.1 + 3.9 / 3 2.1 + 1.3 4.4

3 3 3 3 3 5

+ + + + +

sqrt(8 % 6 * 10 / 5) sqrt( 2 * 10 / 5) sqrt(20 / 5) sqrt(4) 2

(60 - 20) /35.0 -15 40 /35.0 - 15 1.142 - 15 -13.858

4.2 + 2 * 3.9 - 3 4.2 + 7.8 - 3 12 - 3 9

6 * 9 54 54 54 54 86 83

+ 8 * 2 * 4 / 2 - 3 + 8 * 2 * 4 / 2 - 3 + 16 * 4 / 2 - 3 + 64 / 2 - 3 + 32 - 3 - 3

(60 - 20) / 35 - 15 40 / 35 - 15 1 - 15 -14

60 - 20 / 35 - 15 60 0 - 15 60 - 15 45

2 + 3 * 4 % 7 / 3 + 21 / 2 + 12 % 7 / 3 + 21 / 2 + 5 / 3 + 21 / 2 + 1 + 21 / 2 + 1 + 7 3 + 7 10

3 3 3 3

60 - 20.0 / 35 - 15 60 - 0.571 - 15 59.429 - 15 44.429

Como ejercicio algebraicas.

escriba

las

expresiones

anteriores

como

expresiones

15

Tabla 1.7 Ejemplos de codificacin de expresiones algebraicas EXPRESIN ALGEBRAICA 60 - 20 --------35 - 15 20 60 - --------35 - 15 20 60 - ---- - 15 35 60 - 20 -------- - 15 35 a2 + b2 - 54 ------------3.4X - 2.1Y (b2 + a) -------ac ---------------3 4.5 - c --- - ------X+Y 567 (aX5 +bY4 -0.3534)(a-b) 90 - 40 35 13 ------- + ---- - --30 - 12 -47 69 a + b ------36 (1 + seno(x))2 cos2(x) + sen2(x) a2 + b2 ------3.4X 54 -----2.1Y EXPRESIN ALGORTMICA (60 - 20) / (35 - 15)

60 - 20 / (35 - 15)

60 - 20 / 35 - 15

(60 - 20) / 35 - 15

(a*a + b*b - 54)/(3.4*X - 2.1*Y)

(b*b+a)/(a*c)/(3/(X+Y)-(4.5-c)/567)

(a*pow(X,5)+b*pow(Y,4)-0.3534)*(a-b)

(90-40)/(30-12) + 35/(-47) -13/69

(sqrt(a) + sqrt(b)) / pow(3,6) (1 + sin(x)) * (1 + sin(x)) cos(x)*cos(x) + sin(x)*sin(x)

(a*a + b*b)/(3.4*X) - 54/(2.1*Y)

16

1.18 Copie, compile y ejecute el siguiente programa el cual presenta un ejemplo de diferentes agrupaciones con parntesis en expresiones algebraicas. Escriba expresin algebraica para cada caso y calclela "manualmente" comparndola con la obtenida en el computador. #include <iostream.h> #include <conio.h> //COUT02.CPP main(){ clrscr(); cout << "1.0 + 2.0 * 3.0 / 4.0 = " << 1.0 + 2.0 * 3.0 / 4.0; cout << "\n\n( 1.0 + 2.0 * 3.0 ) / 4.0 = " << (1.0 + 2.0 * 3.0) / 4.0; cout << "\n\n1.0 + ( 2.0 * 3.0 ) / 4.0 = " << 1.0 + (2.0 * 3.0) / 4.0; cout << "\n\n( 1.0 + 2.0 ) * 3.0 / 4.0 = " << (1.0 + 2.0) * 3.0 / 4.0; cout << "\n\n(1.0 + 2.0) * (3.0 / 4.0) = " << (1.0 + 2.0) * (3.0 / 4.0); cout << "\n\n1.0 + ( 2.0 * 3.0 / 4.0 ) = " << 1.0 + (2.0 * 3.0 / 4.0); cout << "\n\n1.0 + ( (2.0 * 3.0)/ 4.0) = " << 1.0 + ( (2.0 * 3.0) / 4.0); cout << "\n\n\n\nDigite cualquier tecla para terminar..."; getch(); } Figura 1.7 Efecto de la ejecucin del programa COUT02.CPP en pantalla Error! Marcador no definido.1.0 + ( 1.0 + 2.0 * 3.0 ) / 4.0 = 1.75 1.0 + ( 2.0 * 3.0 ) / 4.0 = 2.5 ( 1.0 + 2.0 ) * 3.0 / 4.0 = 2.25 (1.0 + 2.0) * (3.0 / 4.0) = 2.25 1.0 + ( 2.0 * 3.0 / 4.0 ) = 2.5 1.0 + ( (2.0 * 3.0)/ 4.0) = 2.5 2.0 * 3.0 / 4.0 = 2.5

Digite cualquier tecla para terminar..._

1.19 ACTIVIDADES PARA REALIZAR PERSONALMENTE 1. Codifique computador. 10 expresiones algebraicas en expresiones entendibles por el

2. Codifique las expresiones anteriores como un programa de computador escrito en lenguaje C/C++.

17

CAPTULO 2 INSTRUCCIONES SECUENCIALES


2.1 METODOLOGA El profesor en clase magistral explicar algunos de los algoritmos, de esta leccin, codificados en lenguaje C. A continuacin dirjase al computador y solicitando la ayuda del monitor o de compaeros "ms avanzados", compile y corra los programas presentados. Resuelva la tarea personalmente y luego lleve aportes a su Grupo de estudio. Los algoritmos deben ser resueltos con lpiz, papel, borrador y principalmente con sus neuronas. No pretenda que el computador se los resuelva, paradjicamente l solo le ocasionar mayor confusin, en un principio, y se agrava si no tiene un dominio del teclado. Cuando estn seguros de que los algoritmos estn bien, vaya al computador y cpielos en el editor del lenguaje, complelos, crralos y disfrute el mundo de la programacin. Si sufre un poco le dir que eso nos pasa a todos, y no solo a los recin iniciados, y le recomiendo se lea "Elogio a la Dificultad" de nuestro maestro Estanislao Zuleta, est en una lectura ms adelante. 2.2 LOS IDENTIFICADORES Al escribir programas de computadora en cualquier lenguaje de alto nivel es necesario utilizar nombres para identificar los objetos que se desean manipular. La palabra, o secuencia de caracteres, que forma el nombre de uno de estos objetos se llama identificador. Todos los identificadores deben comenzar con una letra o un caracter de subrayado(_) y seguir con caracteres alfanumricos y subrayados, en especial no deben contener espacios en blanco; las palabras reservadas no se pueden utilizar como identificadores. Los identificadores no admiten espacios intercalados. Con un identificador definiremos variables, constantes, tipos de datos, nombres de funciones, nombres de archivos incluidos y parmetros en definicin de funciones. Los identificadores deben no solo ser vlidos sino que deben autodocumentar su programa, por ejemplo si necesitamos una variable para el clculo de un rea ser mucho ms claro llamarla: Area y no solamente A. El lenguaje C hace diferencia entre minsculas y maysculas, de esta forma si dentro del algoritmo escribe AREA no reconocer este identificador si inicialmente lo defini como Area. Adicionalmente a los identificadores que definamos podemos encontrar otros, de otros archivos con la directiva #include y de esta forma tener acceso a gran cantidad de libreras que vienen adicionadas al lenguaje, y las cuales podemos conseguir de diversas formas y tambin irlas diseado nosotros mismos a travs de nuestra prctica como programadores. Ejemplos de identificadores vlidos son los siguientes: SumaTotal MoleSolvente I_V_A _identificador Max Pi Voltaje Esta_es_una_variable Acidez CiudadCapital MARIA Costo_de_la_vida Arbol AreaCuadrado VelocidadLuz Sumatoria Maria

19

Los siguientes son identificadores no vlidos: Suma Total maximo valor while rbol 1_variable cantidad_en_$ do eta VariableNoVlida MximoValor Nombre&Apellido I.V.A. x+y if 454 C U A O

Cules de los siguientes identificadores son vlidos, y cules no? Para los identificadores no vlidos proponga uno vlido. Abc While Cali aREa abc TotNomina Univalle Valle Apellido totalSumas acumulado integral I _contador CUAO Ms MiAlgoritmo ABC serie 1 contador rea xxxx 15 Quince Uno_A Pascal ms UNIVALLE

2.3 VARIABLES Las variables son objetos los cuales pueden cambiar de valor durante la ejecucin de un programa por medio de una asignacin. Deben ser identificadores vlidos y no ser palabras reservadas. Cada variable debe ser declarada como de alguno de los tipos primitivos, tipos estructurados incorporados al lenguaje o tambin de tipos definidos por el usuario como variables estructuradas. Todos los nombres de variables deben comenzar obligatoriamente por un caracter alfabtico, a - z, A Z, o el signo de subrayado(_). No se admiten espacios en blanco en medio de un identificador. Ejemplos de definicin de variables en base a tipos primitivos son los siguientes: int I, contador=0; float Sumatoria=0; int edad, AlturaEnMetros; float VoltajeDelColector, VoltajeEmisor, VoltajeBase; char letra, numero, caracter, nueve='9'; Ejemplo de definicin de variables de tipo estructurado: char modulo[20], nombre[30], cadena[256]; char *Apellidos, *codigo; char Ciudad[20]="Palmira Valle"; char *Nombre = "Tania Carolina"; int VectorEnteros[1000], A[210]; float VectorReales[100], X[100]; char VectorCadena[32]; int MatrizEnteros[3][3]; float MatrizReales[5][4]; struct Registro{ char Nombre[10]; int edad; float CxC; } Cliente; struct Registro Persona; En el ltimo ejemplo, Cliente y Persona son variables del tipo estructurado Registro, este tema ser de los ltimos del presente curso.

20

Las variables pueden ser declaradas globalmente, es decir fuera de las funciones (ver captulo 3) que compongan el programa; o locamente, es decir dentro del mbito de una funcin en particular. 2.4 CONSTANTES Las constantes son objetos las cuales estarn representadas por identificadores vlidos y se les asigna un valor, el cual no puede ser cambiado durante el transcurso del programa. Ejemplos de definicin de constantes son los siguientes: const int MaxFila = 100; const float PI = 3.14159 const char *CAPITAL = "Bogot"; Las constantes pueden ser declaradas globalmente, es decir fuera de las funciones que compongan el programa; o locamente, es decir dentro del mbito de una funcin en particular. Otra forma de definir constantes en el antiguo C es la siguiente: #define MaxFila 100 #define PI 3.14159 #define CAPITAL "Bogot" 2.5 TIPOS DE DATOS La computadora es capaz de manejar y almacenar datos e informacin de varios tipos. La computadora almacena datos tanto en memoria como en dispositivos externos en cdigo binario. La cantidad de espacio que se asigna a cada dato depende de su tipo, de la implantacin de cada compilador de lenguaje y de la computadora utilizada. En casi todos los casos el almacenamiento es transparente para el programador y con mayor razn para el usuario, ya que los datos son referidos mediante sus identificadores y el compilador del lenguaje hace la transferencia en forma automtica. Los tipos pueden ser numricos o de caracter, y en base a estos se pueden definir tipos de datos estructurados, ya sea que el lenguaje en particular los traiga predefinidos o el usuario los defina. El C++ no es un lenguaje "fuerte" en declaracin de tipos, como por ejemplo lo es el lenguaje Pascal, en vez de esto permite una gran flexibilidad al programar, dejndolo a entera responsabilidad del programador. Lo recomendado es no mezclar tipos no compatibles al asignar valores a una variable, esto podra ocasionar resultados indeseados y hasta en algunos casos el bloqueo del sistema operativo y la consecuente perdida de la informacin en memoria RAM. Resumiendo: en las sentencias de asignacin, los valores de la expresin a la derecha deben ser de tipos compatibles con el de la nica variable de la izquierda. Los objetos los cuales estn compuestos de un solo caracter se definen con el tipo predefinido char, estos pueden contener uno cualquiera de los 256 caracteres del cdigo ASCII ampliado. Los caracteres deben ir delimitados con comillas sencillas al ser asignados a variables de tipo char. Un valor de tipo char ocupa un byte de memoria. Ejemplos de declaracin de este tipo de variables son: char letra='A'; char opcion, terminar='N';

21

char numero, a, A, caracter, etc; char digito; De esta forma se han declarado las variables letra, opcion, terminar, numero, a, A, caracter, digito y etc; a las cuales se les podr luego asignar valores ya sea por asignacin dentro del algoritmo, por lectura desde el teclado o lectura desde un archivo en disco. Los objetos los cuales estn compuestos por nmeros y con los cuales se piensa efectuar operaciones aritmticas se definirn de los tipos primitivos int(entero) o float(real) o de alguno de sus tipos derivados. Los diferentes tipos numricos con su correspondiente longitud en Bytes, es decir el espacio que ocupa cada uno en memoria, y el rango de valores numricos en cual maneja se presentan en la siguiente Tabla. Tabla 2.1 TIPO unsigned char char enum unsigned int short int int unsigned long long float double long double Tipos de Datos Primitivos del C++. LONGITUD 8 8 16 16 16 16 32 32 32 64 80 bits bits bits bits bits bits bits bits bits bits bits RANGO DE VALORES 0 -128 -32,768 0 -32,768 -32,768 0 -2,147,483,648 3.4 * (10**-38) 1.7 * (10**-308) 3.4 * (10**-4932) a a a a a a a a a a a 255 127 32,767 65,535 32,767 32,767 4,294,967,295 2,147,483,647 3.4 * (10**+38) 1.7 * (10**+308) 1.1 * (10**+4932)

Si se pretende asignar a una variable un valor numrico que no corresponda al rango de valores se producirn resultados impredecibles que pueden llegar hasta el bloqueo del sistema operativo o la terminacin del programa(por ejemplo en la divisin por cero). Ejemplos de definiciones de variables de tipos numricos son los siguientes: int a, N=100; float X, Total=0; float real; short int EnteroCorto; long EnteroLargo; double DoblePresicion; unsigned int EnteroSinSigno; unsigned long EnteroLargoSinSigno; int Vector[100]; float Matriz[10][20]; De esta forma se han definido las siguientes variables de tipo numrico: a, N, X, Total, real, EnteroCorto, EnteroLargo, DoblePresicion, EnteroSinSigno, EnteroLargoSinSigno, Vector, y Matriz. Los nombres de objetos que estn compuestos de secuencias de caracteres se definirn con el tipo de datos predefinido char y de una de dos formas:

22

dimensionando la variable con el tamao adecuado a la necesidad o definiendo la variable como un puntero(*). El C++ en realidad no tiene predefinido un tipo de datos para este menester. Ejemplos de la declaracin de variable de este tipo son los siguientes: char char char char char Nombre[20], Apellido[25]; Ciudad[15]= "Palmira Valle"; Linea_Texto_en_Pantalla[80]; *NombreCompleto="Carolina Alexandra Mazuera Bravo"; *EstaEsUnaVariableDeCadenaDeCaracteres;

Se han declarado de esta forma las variables de tipo cadena de caracteres: Nombre, Apellido, Ciudad, Linea_Texto_en_Pantalla, NombreCompleto, y EstaEsUnaVariableDeCadenaDeCaracteres. 2.6 ASIGNACIN La asignacin es una operacin que coloca un valor en una direccin de la memoria RAM. El lenguaje C/C++ utiliza como smbolo de asignacin el igual(=). La direccin de memoria corresponder a una nica variable que se ha definido inicialmente como de un tipo de datos especfico y que en la expresin de asignacin se coloca al lado izquierdo del smbolo igual(=). El valor que tomar la variable es el resultado de la evaluacin de la expresin que se coloque al lado derecho del igual(=) en la expresin de asignacin. El valor de la expresin a la derecha debe ser de un tipo de datos compatible con la nica variable a la izquierda, en caso contrario se producirn resultados inesperados e inclusive el bloqueo de la mquina. Repitiendo, en una instruccin de asignacin, el proceso es el siguiente: El compilador evala la expresin a la derecha del smbolo de asignacin(=), obteniendo un resultado; este lo asigna a la variable que est a la izquierda, borrando el contenido previo que tuviera; por esto la asignacin es una operacin destructiva. A diferencia del smbolo igual en matemtica, que es como hasta ahora lo a manejado, las asignaciones en un algoritmo de computador, son procesos en una sola direccin. El valor de la expresin de la derecha se asigna al de la nica variable a la izquierda. La expresin: X = X + 13; que no tendra significado matemtico, ya que no se cumple para ningn X, es completamente vlida, y significa que a la variable X se le suma el nmero 13, este nuevo valor obtenido es asignado a la misma variable X(en la memoria RAM), borrando el inicial. En resumen el efecto es el incremento de la variable X en 13. Los siguientes son ejemplos de asignaciones vlidas: fila = 25; contador = contador + 1; valor = 4.5E12; opcion = 'B'; valor = sqrt(144); VectorEntero[2] = 13; VectorReal[0] = 7.6; Matriz[0][0] = VectorEntero[I] * fila;

23

24

2.7 INSTRUCCIN DE LECTURA DESDE TECLADO Para transferir datos desde el teclado a la memoria RAM de la computadora utilizaremos la instruccin(en realidad es un objeto) del C++: cin >>; la cual se encuentra en el archivo a incluir iostream.h. La instruccin cin >> en tiempo de ejecucin detiene al computador y espera a que se digite un valor, el valor que puede ser cualquier secuencia de caracteres ASCII terminados con la tecla de <ENTRAR>, ser almacenado en la direccin de memoria de la variable que utilice la instruccin, despus de esto el control lo devuelve a la siguiente instruccin del programa. Solamente por efectos de presentacin en pantalla, debera ir previamente acompaada de una instruccin de impresin en pantalla, para nuestro caso cout <<, donde se le dijera al usuario lo que debe digitar a continuacin, por ejemplo: clrscr(); cout << "Digite un nmero: "; cin >> N; La instruccin cout insertar en el flujo de salida hacia la pantalla la frase que est entre delimitadores y har que la despliegue. A continuacin el programa sigue secuencialmente en la instruccin del cin >> N, el programa se detendr, se ver el cursor titilando, en espera de que el usuario digite, en este caso nmeros; la entrada se terminar cuando se digite la tecla de <ENTRAR>. La presentacin en pantalla sera la de la derecha de la siguiente figura: Figura 2.1 Efecto en pantalla de la instruccin de lectura cin >>. Se detiene el programa con cin Digite un nmero: _ nota: observe el cursor _ Luego de digitar el # y dar <ENTRAR> Digite un nmero: 13

A continuacin el valor digitado se almacena en la variable N y el programa sigue secuencialmente en la siguiente instruccin. La presentacin en pantalla sera mostrada en la figura mostrada ms abajo. Y si, adicionalmente, secuencialmente siguieran las dos instrucciones siguientes, el efecto se muestra en la misma prxima figura: cout << "Nombre de ciudad: "; cin >> ciudad;

25

Figura 2.2 Efecto en pantalla de la instruccin de lectura cin >>. Se detiene el programa con cin Digite un nmero: 13 Nombre de ciudad: _ nota: observe el cursor _ Luego de digitar el # y dar <ENTRAR> Digite un nmero: 13 Nombre de ciudad: Palmira _

2.8 El siguiente algoritmo calcula el volumen de un cilindro, a partir de la lectura del radio de la base y su altura por teclado. #include <iostream.h> #include <conio.h> #include <math.h> // constante para el nmero main(){ float radio, altura, volumen; cout << " CALCULO DEL VOLUMEN DE UN CILINDRO \n"; cout << "\n\n"; cout << "Digite el radio de la base del cilindro en centmetros: "; cin >> radio; cout << "Digite la altura del cilindro en centmetros: "; cin >> altura; // volumen = area base( *r) multiplicada por la altura volumen = M_PI* radio*radio * altura; cout << "\nEl volumen es de " << volumen << " centmetros cbicos."; cout << "\n\n"; } Figura 2.3 Efecto de la ejecucin del programa COUTIN00.CPP en pantalla CALCULO DEL VOLUMEN DE UN CILINDRO Digite el radio de la base del cilindro en centmetros: 2.58 Digite la altura del cilindro en centmetros: 78.9 El volumen es de 1649.932861 centmetros cbicos. _ Clculos manuales de la secuencia que debi seguir el computador para el clculo del Volumen: volumen volumen volumen volumen volumen = = = = = M_PI* radio*radio * altura; 3.14159 * 2.58 * 2.58 * 78.9 8.10530994 * 2.58 * 78.9 20.911699840 * 78.9 1649.933036

: M_PI //COUTIN00.CPP

observe la diferencia que se presenta en los decimales.

26

2.9 Ejemplo de operaciones de divisin en expresiones algebraicas. Se introduce un reforzador de tipo en la divisin de las variables enteras a y b: (float). #include <iostream.h> #include <conio.h> //COUTIN01.CPP main(){ int a, b; clrscr(); cout<<"Digite dos nmeros enteros separados por al menos un espacio:\n"; cin >> a >> b; // simule este error: dele a "b" un valor de cero cout << "\nDivisin entera = " << a / b; cout << "\nDivisin real = " << (float) a / b; //ensaye a borrar el reforzador cout << "\nResiduo divisin= " << a % b; getch(); } Figura 2.4 Efecto de la ejecucin del programa COUTIN01.CPP en pantalla Digite dos nmeros enteros separados por al menos un espacio: 13 4 Divisin entera = 3 Divisin real = 3.25 Residuo divisin= 1_

2.10 El siguiente cdigo presenta la evaluacin de la expresin algebraica: 2a - 3(b + 2a) + 3X [ X - 2(Y -2) ] los valores reales para X y Y son ledos desde teclado. Los valores para las constantes son: a=2 y b=-3 #include <iostream.h> #include <conio.h> // cout y cin

//COUTIN02.CPP main(){ const int a=2, b=-3; float X, Y; clrscr(); cout << " Digite un valor real para X: "; cin >> X; cout << " Digite un valor real para Y: "; cin >> Y; cout << "\n2a-3(b+2a)+3X[X-2(Y-2)] = " << 2*a-3*(b+2*a)+3*X*(X-2*(Y-2)); }

27

2.11 El siguiente algoritmo evala la expresin cuadrtica: Y = aX-bX+c para valores de los coeficientes: a, b, c, y de la variable X pedidos por teclado. #include <iostream.h> #include <conio.h> //COUTIN03.CPP main(){ float a, b, c, X, Y; clrscr(); cout << "Digite cin >> a; cout << "Digite cin >> b; cout << "Digite cin >> c; cout << "Digite cin >> X; Y = a * X * X cout << "\n\nEl getch(); } Figura 2.5 Efecto de la ejecucin del programa COUTIN03.CPP en pantalla Digite Digite Digite Digite el el el la coeficiente coeficiente coeficiente variable X: a: 2 b: 1 c: -1 3 el coeficiente a: "; el coeficiente b: "; el coeficiente c: "; la variable X: "; b * X + c; valor de la variable Y es " << Y;

El valor de la variable Y es 14.00000

La evaluacin de la expresin algebraica la efecto el computador de la siguiente forma: Y Y Y Y Y Y Y Y = = = = = = = = a * X * X - b * X + c; 2 * 3 * 3 - 1 * 3 + (-1) 6 * 3 - 1 * 3 + (-1) 18 - 1 * 3 + (-1) 18 - 3 + (-1) 15 + (-1) 15 -1 14

28

2.12 Se lee un nmero por teclado y se redondea a la decena ms prxima. #include <iostream.h> #include <conio.h> //COUTIN04.CPP main(){ int numero; clrscr(); cout << "Digite cin >> numero; numero = numero numero = numero numero = numero un nmero entero para redondearlo:\n"; + 5; / 10; * 10;

cout << "El nmero redondeado es: " << numero; cout << "\n\nDigite cualquier tecla para terminar..."; getch(); } Figura 2.6a Efecto de la ejecucin del programa COUTIN04.CPP en pantalla Digite un nmero entero para redondearlo: 879 El nmero redondeado es: 880 Digite cualquier tecla para terminar..._

Figura 2.6b Efecto de la ejecucin del programa COUTIN04.CPP en pantalla Digite un nmero entero para redondearlo: 844 El nmero redondeado es: 840 Digite cualquier tecla para terminar..._

29

2.13 Conversin de escala termomtrica centgrada a fahrenheit. #include <iostream.h> #include <conio.h> //COUTIN05.CPP main(){ float Centigrados, Fahrenheit; clrscr(); cout << " Conversin grados centgrados a fahrenheit \n"; cout << " \n\n"; cout << "Digite grados centgrados: "; cin >> Centigrados; Fahrenheit = 9.0 / 5.0 * Centigrados + 32; // observe los reales 9.0 y 5.0 en la lnea anterior, // cmbielos por 9 y 5 y ejecute el programa de nuevo porqu no da? cout << "\nLa temperatura en fahrenheit es: " << Fahrenheit << " "; gotoxy(1,25); cout << "Digite cualquier tecla para terminar el programa"; getch(); } Figura 2.7 Efecto de ejecucin programa COUTIN04.CPP. Compltelo Usted Conversin grados centgrados a fahrenheit Digite grados centgrados: 100 La temperatura en fahrenheit es: 212

Digite cualquier tecla para terminar el programa_

30

2.14 El siguiente algoritmo encuentra la distribucin de como un cajero de un banco tiene que distribuir una dada cantidad de dinero en la menor cantidad de billetes y monedas. Solo funciona para cantidades enteras. #include <iostream.h> #include <iomanip.h> #include <conio.h> //COUTIN10.CPP main(){ long int cantidad, saldo, b20000, b10000, b5000, b2000, // billetes m1000, m500, m200, m100, m50, m20, m10, m5, m2, m1; //monedas clrscr(); cout << "Cantidad a repartir: "; cin >> cantidad; b20000 = cantidad / 20000; saldo = cantidad % 20000; b10000 saldo b5000 saldo b2000 saldo m1000 saldo m500 saldo m200 saldo m100 saldo m50 saldo m20 saldo m10 saldo m5 saldo m2 m1 cout cout cout cout cout cout cout cout cout cout cout cout = = = = = = = = = = = = = = = = = = = = = = = = saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo saldo / % / % / % / % / % / % / % / % / % / % / % / % 10000; 10000; 5000 ; 5000; 2000; 2000; 1000; 1000; 500; 500; 200; 200; 100; 100; 50; 50; 20; 20; 10; 10; 5; 5; 2; 2;

<< << << << << << << << << << << <<

"\n"; "\nDENOMINACION CANTIDAD TOTAL($)"; "\n"; "\n$20,000 " << "\t" << b20000 << "\t" << "\n$10,000 " << "\t" << b10000 << "\t" << "\n$ 5,000 " << "\t" << b5000 << "\t" << "\n$ 2,000 " << "\t" << b2000 << "\t" << "\n$ 1,000 " << "\t" << m1000 << "\t" << "\n$ 500 " << "\t" << m500 << "\t" << "\n$ 200 " << "\t" << m200 << "\t" << "\n$ 100 " << "\t" << m100 << "\t" << "\n$ 50 " << "\t" << m50 << "\t" <<

setw(10) << 20000*b20000; setw(10) << 10000*b10000; setw(10) << 5000*b5000; setw(10)<< 2000*b2000; setw(10)<< 1000*m1000; setw(10)<< 500*m500; setw(10)<< 200*m200; setw(10)<< 100*m100; setw(10)<< 50*m50;

31

cout << "\n$ 20 " << "\t" << m20 << "\t" << setw(10) << 20*m20; cout << "\n$ 10 " << "\t" << m10 << "\t" << setw(10)<< 10*m10; cout << "\n$ 5 " << "\t" << m5 << "\t" << setw(10)<< 5*m5; cout << "\n$ 2 " << "\t" << m2 << "\t" << setw(10)<< 2*m2; cout << "\n$ 1 " << "\t" << m1 << "\t" << setw(10)<< m1; cout << "\n\n"; cout.width(34); cout.fill('$'); cout << cantidad; cout << "\n"; cout << "\n\n\n Digite cualquier tecla para terminar"; getch(); } Figura 2.8 Efecto de la ejecucin del programa COUTIN10.CPP en pantalla Cantidad a repartir: 95673951 DENOMINACION CANTIDAD TOTAL($) $20,000 4783 95660000 $10,000 1 10000 $ 5,000 0 0 $ 2,000 1 2000 $ 1,000 1 1000 $ 500 1 500 $ 200 2 400 $ 100 0 0 $ 50 1 50 $ 20 0 0 $ 10 0 0 $ 5 0 0 $ 2 0 0 $ 1 1 1 $$$$$$$$$$$$$$$$$$$$$$$$$$95673951 Digite cualquier tecla y terminar_

32

2.15 El siguiente programa muestra la utilizacin de tabuladores predefinidos para alinear en pantalla informacin. As mismo presenta una introduccin al formateo de nmeros con la utilizacin de cout.precision y cout.fixed. Adems es una introduccin al manejo de cadenas de caracteres. #include <iostream.h> #include <conio.h> //COUTIN06.CPP main(){ int c1=10, c2, c3=20; // cantidades de cada fruta float p1=3.2, p2, p3=4.5; // precios de cada fruta char fruta1[10]="lulo", fruta2[10]="", fruta3[10]="papaya"; // nombres clrscr(); cout << "\n"; cout << " MERCADO DE FRUTAS \n"; cout << "\n"; cout << "Digite el nombre de la fruta 2: "; cin >> fruta2; //digite uvas y luego mandarina, observe que falla el tabulado cout << "digite el precio(con centavos) de la fruta 2: $ "; cin >> p2; cout << "digite la cantidad a comprar de la fruta 2: "; cin >> c2; clrscr(); cout<< setprecision(2) //formateo de los nmeros reales << setiosflags(ios::showpoint | ios::fixed) cout << "\n"; cout << "NOMBRE CANTIDAD PRECIO TOTAL \n"; cout << "\n"; cout <<" " << fruta1 << "\t\t" << c1 << "\t\t" << p1 << "\t" << c1*p1 << "\n"; cout <<" " << fruta2 << "\t\t" << c2 << "\t\t" << p2 << "\t" << c2*p2 << "\n"; cout <<" " << fruta3 << "\t\t" << c3 << "\t\t" << p3 << "\t" << c3*p3 << "\n"; cout << "\n\n"; } Figura 2.9 Efecto de la ejecucin del programa COUTIN06.CPP en pantalla MERCADO DE FRUTAS Digite el nombre de la fruta 2: uvas digite el precio(con centavos) de la fruta 2: $ 7.50 digite la cantidad a comprar de la fruta 2: 10; NOMBRE CANTIDAD PRECIO TOTAL lulo 10 3.2 32.00 uvas 10 7.5 75.00 papaya 20 4.5 90.00 _

33

2.16 Demostracin de los valores del cdigo ASCII. ASCII es el acrnimo de: American Standard Code for International Interchange. Se hace lectura de un caracter con las funciones getch() y getche() de conio.h #include <iostream.h> #include <conio.h> //COUTIN07.CPP main(){ char caracter; clrscr(); cout << "Digite un caracter cualquiera del teclado: "; cin >> caracter; cout << "El caracter digitado fue \"" << caracter << "\" su cdigo ASCII es el " << "\"" << (int) caracter << "\" "; // (int) en la lnea anterior es un reforzador de tipo (cast en ingls) cout << "\nDigite otro caracter cualquiera del teclado: "; caracter=getch(); //No hace "eco en pantalla" ni se le dio ENTER cout << "\nEl caracter digitado fue \"" << caracter << "\" su cdigo ASCII es el " << "\"" << (int) caracter << "\" "; cout << "\nDigite otro caracter cualquiera del teclado: "; caracter = getche(); //Si hace "eco en pantalla" y no se le dio ENTER cout << "\nEl caracter digitado fue \"" << caracter << "\" su cdigo ASCII es el " << "\"" << (int) caracter << "\""; cout << "\nDigite otro caracter cualquiera del teclado: "; caracter = getche(); //Si hace "eco en pantalla" y no se le dio ENTER cout << "\nEl caracter digitado fue \"" << caracter << "\" su cdigo ASCII es el " << "\"" << (int) caracter << "\""; getch(); } Figura 2.10 Efecto de la ejecucin del programa COUTIN07.CPP en pantalla Digite un caracter cualquiera del teclado: A El caracter digitado fue "A" su cdigo ASCII es el "65" Digite otro caracter cualquiera del teclado: El caracter digitado fue "a" su cdigo ASCII es el "97" Digite otro caracter cualquiera del teclado: * El caracter digitado fue "*" su cdigo ASCII es el "42" Digite otro caracter cualquiera del teclado: El caracter digitado fue "" su cdigo ASCII es el "165"_

34

2.17 A partir de la lectura de un nmero en base hexadecimal, se presentan operaciones matemticas elementales, tanto en decimal como en hexadecimal, y por medio de su conversin con los MANIPULADORES DE FLUJO siguientes: hex para base diez y seis hexadecimal dec para base diez decimal #include #include #include <iostream.h> <iomanip.h> <conio.h> //COUTIN12.CPP void main(void){ long int a, b; clrscr(); cout << "Digite operandos en hexadecimal, anteponiendo 0x cada vez\n"; cout << "Primer operando(Digite 0x primero): "; cin >> a; cout << "Segundo operando(Digite 0x primero): "; cin >> b; cout << "En decimal a = " << a << " b = " << b << endl << endl << "OPERACION HEXADECIMAL DECIMAL \n\n" << " a + b = " <<setw(15) <<hex <<a+b <<setw(15) <<dec <<a+b <<endl << " a - b = " <<setw(15) <<hex <<a-b <<setw(15) <<dec <<a-b <<endl << " a * b = " <<setw(15) <<hex <<a*b <<setw(15) <<dec <<a*b <<endl << " a / b = " <<setw(15) <<hex <<a/b <<setw(15) <<dec <<a/b <<endl << " a % b = " <<setw(15) <<hex <<a%b <<setw(15) <<dec <<a%b <<endl; getch(); } Figura 2.11 Complete el efecto de la ejecucin del programa COUTIN12.CPP.

35

2.18 ACTIVIDADES PARA EFECTUAR PERSONALMENTE 2.18.1 Efecte lectura de todos los algoritmos presentados anteriormente en este captulo. Anote las preguntas que crea conveniente efectuar al profesor. Recuerde que cada lenguaje de programacin trae gran cantidad de instrucciones, y que sera imposible explicarslas todas en el limitado espacio de un manual como el presente, tenga presente que si las ve ejecutndose deber entender que es lo que hacen, recuerde el dicho: "una imagen vale ms que mil palabras". 2.18.2 Un conductor lleva registros, tanto de cuantos galones de gasolina a tanqueado como de cuantos kilmetros a recorrido en su vehculo. Efecte programa el cual le permita digitar esta informacin por teclado y a continuacin que le conteste con el nmero de galones/kilmetro del vehculo. 2.18.3 Una compaa paga a los vendedores un salario bsico ms un porcentaje por comisiones por las ventas efectuadas. Para un vendedor efecte programa el cual le permita digitar el nombre del vendedor, su cdula, y la cantidad en pesos de sus ventas, y la mquina le responda con el salario bsico, las comisiones, y el total a pagar a este vendedor. 2.18.4 Calcule la presin de un gas, dados su volumen, nmero de moles y temperatura, por medio de la Ley de los gases ideales: PV = nRT, donde R = 0.082054 (atm litro)/(mol K). 2.18.5 Determinar la cantidad de calor Q en caloras a proporcionar a un cuerpo, para obtener un aumento de temperatura desde Ti hasta Tf. Leer desde teclado las temperaturas inicial y final, la masa del cuerpo y el calor especfico. Utilice la ecuacin Q = m C (Tf - Ti). Corra el programa para cada uno de los siguientes valores de calor especfico en caloras/(gramo C) siguientes: Agua = 1.0, Plomo=0.03, Aluminio=0.2 y Cobre = 0.10. 2.18.6 Digite una cantidad que representar dinero(pesos($)), a continuacin un nmero real que representar un porcentaje. El programa debe responderle con la cantidad en pesos correspondiente al porcentaje digitado. 2.18.7 Calcule la conductancia total Gt(Siemens) y la resistencia total Rt(ohmios), de resistores R1, R2, R3 y R4 dados en ohmios, y conectados en paralelo, segn las siguientes expresiones: 1 Rt = --R1 + 1 --R2 + 1 --R3 + que 1 --- ; R4 permita Gt = efectuar 1 --Rt las siguientes conversiones de

2.18.8 Realice unidades: Longitud: Masa: Potencia Presin Temperatura Volumen Densidad Informacin 1 1 1 1 1 1 1 1

programa

pulgada = 2.54 centmetros libra = 453.6 gramos Kw = 58.87 BTU/minuto atm = 14.69 psi F = 1.8( C) + 32 pulgada cbica = 16.39 centmetros cbicos gramo/cm cbico = 62.43 libras/pie cbico Kbyte = 1024 bytes

lea desde el teclado el valor de la primera unidad y conteste con el correspondiente a la segunda. Por ejemplo: Aparece en pantalla: "Digite el nmero

36

de pulgadas: ", a continuacin el usuario digita el nmero 10, debe aparecer como respuesta: "Son 25.4 centmetros". 2.18.9 Consultando la tabla de caracteres presente en pantalla el siguiente cuadro: ASCII, escribir un programa que

Para poder obtener cada caracter debe simultneamente tener undida la tecla de ALT(alternate) y en el teclado numrico digitar el cdigo ASCII correspondiente. 2.18.10 El frmula: inters simple de un prstamo se calcula mediante la siguiente

Inters = Capital x rata x das/365 La frmula anterior supone que rata en la tasa de inters anual y, por lo tanto, incluye la divisin entre 365 das. Codifique un programa en C el cual permita capturar el Capital, la rata de inters y los das para el prstamo de un solo cliente de una entidad prestamista, y que calcule y muestre en pantalla el Inters simple para el mismo. 2.18.11 Estudie todos los ejemplos que se ha "saltado", o ha dejado para un mejor momento, de las lecciones anteriores.

37

CAPTULO 3 "DIVIDE Y VENCERS": FUNCIONES


3.1 METODOLOGA El profesor explicar en clase magistral en qu consisten las funciones, definiendo su sintaxis general. Todos los programas del presente captulo estn en el disquete anexo, estdielos inicialmente y luego complelos y ejectelos para verificar sus expectativas. Ms sobre las funciones incorporadas en el C++, encontrar en el nivel de ayuda del compilador. 3.2 FUNCIONES INCORPORADAS AL C++ A TRAVS DE LIBRERAS La principal estrategia de la programacin estructurada al resolver un problema complejo es la de dividirlo en subproblemas cuya resolucin sea mucho ms sencilla. Estos subproblemas se pueden dividir a su vez en otros ms pequeos, y as sucesivamente, segn la conveniencia. Esta estrategia tambin se llama diseo descendente, debido a que se parte de lo general y se disean soluciones especficas para sus subproblemas. Estos subproblemas los podemos implementar en el lenguaje C mediante la codificacin de funciones. Una funcin es sitio del programa el lenguaje y las definirlas nosotros simplemente un algoritmo el cual devuelve un nico valor al en que fue invocada o llamada. Hay funciones predefinidas en cuales vienen en los archivos incluidos y tambin podemos mismos.

Tabla 3.1 Funciones y constantes incorporadas en el archivo a incluir math.h Funciones abs acos, acosl atan, atanl atan2, atan2l cabs, cabsl ceil, ceill cosh, coshl exp, expl floor, floorl fmod, fmodl hypot, hypotl labs log, logl log10, log101 modf, modfl poly, polyl pow10, pow10l sin, sinl sqrt, sqrtl tan, tanl Constantes: M_PI M_PI_2 M_1_PI M_2_PI M_2_SQRTPI M_SQRT2

asin, atof, cos, fabs, frexp, ldexp, matherr, pow, sinh, tanh,

asinl _atold cosl fabsl frexpl ldexpl _matherrl powl sinhl tanhl

M_PI_4 M_1_SQRTPI M_SQRT_2

39

3.3

Este programa emplea funciones matemticas del archivo de cabecera "math.h" <iostream.h> <conio.h> <math.h> <values.h> // MAXINT

#include #include #include #include

//COUTIN_6.CPP void main(){ int a; float x,y; clrscr(); cout <<""; cout << "\nFUNCIONES VARIAS INCORPORADAS EN <MATH.H>\n"; cout <<""; cout << "\nNmero para calcularle la raz cuadrada: "; cin >> x; cout << "Raz cuadrada de " << x << " = " << sqrt(x); cout<<"\n\nA continuacin ejemplo de exponenciacin: \n"; cout << "Digite un nmero como base: "; cin >> x; cout << "Digite el exponente: "; cin >> y; cout<<" " <<x << " ^ " <<y << " = "<< pow(x,y); cout << "\n\n x "; cout << "\nDigite un valor real x para obtener e : "; cin >> x; cout << " " << x << "\ne = " << exp(x); cout << "\n\nEl nmero e = " << exp(1); cout << "\n\nDigite un nmero real: "; cin >> x; clrscr(); cout<<""; cout << "\nFUNCIONES VARIAS INCORPORADAS EN <MATH.H>\n"; cout<<""; cout << "\nNmero real: " << x; cout << "\nLogaritmo natural = " << log(x); cout << "\nLogaritmo decimal = " << log10(x); cout << "\n\nRecuerde el mximo entero es " << MAXINT; cout << "\n\nDigite un entero negativo: "; cin >> a; cout << "su valor absoluto es " << abs(a); cout << "\n\nDigite un real negativo: "; cin >> x; cout << "su valor absoluto es " << fabs(x); cout << "\n\nDigite un nmero con decimales: "; cin >> x; cout<<"Mayor entero, menor que " <<x << " = " <<floor(x); cout<<"\nMenor entero, mayor que "<< x << " = "<<ceil(x); cout << "\n\nHipotenusa de un tringulo rectngulo: "; cout << "\nDigite un cateto: "; cin >> x; cout << "\Digite el otro cateto: "; cin >> y; cout << "\nLa hipotenusa es " << hypot(x, y); }

40

3.4 El siguiente programa emplea archivo de cabecera "math.h" #include <iostream.h> #include <conio.h> #include <math.h>

funciones

trigonomtricas

contenidas

en

el

//COUT03.CPP void main(){ double angulo = 0.0; //real de doble precisin, 8 bytes = 64 bits clrscr(); cout << " = " << M_PI;

cout.precision(7); // se formatean los nmeros con 7 decimales cout.setf(ios::fixed); // se utiliza notacin fija en nmeros cout << "\n\nSeno ( " << angulo <<" ) = " << sin(angulo * M_PI/180); angulo += 30.0; cout << "\nCoseno (" << angulo <<" ) = " << cos(angulo * M_PI/180); angulo += 30.0; cout << "\nTangente (" << angulo << " ) = " << sin(angulo*M_PI/180) / cos(angulo*M_PI/180); angulo += 30.0; cout << "\nCotangente(" << angulo << " ) = " << cos(angulo*M_PI/180)/sin(angulo*M_PI/180); angulo -= 30.0; cout << "\nSecante (" << angulo << " ) = " << 1/cos(angulo* M_PI/180); angulo -= 30.0; cout << "\nCosecante (" << angulo << " ) = " << 1/sin(angulo * M_PI/180); cout << "\n = " << M_PI; cout.precision(1); // se formatean los nmeros con 1 decimal cout.setf(ios::scientific); // se utiliza notacin cientfica cout << "\n = " << M_PI; cout << "\n\n Digite cualquier tecla y terminar..."; getch(); } Figura 3.2 Efecto de la ejecucin del programa COUT03.CPP = 3.141593 Seno ( 0 Coseno (30 Tangente (60 Cotangente(90 Secante (60 Cosecante (30 = 3.1415927 = 3.1e+00 ) ) ) ) ) ) = = = = = = 0 0.8660254 1.7320508 0 2 2

Digite cualquier tecla y terminar..._

41

3.5 Algunas funciones para el manejo de cadenas de caracteres incluidas en string.h #include #include #include #include <iostream.h> <conio.h> <string.h> // para efectuar asignacin de cadenas utilizar: strcpy() <stdio.h> // para leer espacios en blanco utilizar: gets() //COUTIN09.CPP const int LargoCadena=15; //para efectuar dimensionamiento de las variables de cadena void main(){ char cadena1[LargoCadena], cadena2[LargoCadena]; //variables de tipo cadena clrscr(); cout << "Digite una frase para almacenar en la variable cadena1:\n"; cin >> cadena1; cout << "La frase digitada fue: " << cadena1; cout << "\n\nDigite otra frase para almacenar en la variable cadena2:\n"; gets(cadena2); cout << "La frase digitada fue: " << cadena2; cout << "\n\nen este momento cadena1 = " << cadena1; cout << "\na continuacin se asigna la cadena2 a la cadena1\n"; strcpy(cadena1, cadena2); cout << "ahora la variable cadena1 = " << cadena1; //En conclusin debe observar que cin<< solo lee hasta el primer espacio //para leer varias palabras tiene que hacerlo con gets(). cout << "\n\nDigite una frase con mucho ms de " << LargoCadena << " caracteres\n"; gets(cadena1); cout << "\nlos caracteres almacenados son: " << cadena1; cout << "\n\n es probable que con lo anterior se le bloquee el computador"; cout << "\n\n\n\n\n\ncualquier tecla y seguir"; getch(); } Figura 3.3 Ejecucin programa COUT03.CPP en pantalla. Compltelo...

42

3.6 El siguiente programa permite or notas musicales entre 260 Hz y 520 Hz, a travs de la utilizacin de funciones incorporadas en <dos.h>: sound() y nosound(). #include <iostream.h> #include <conio.h> #include <dos.h> //COUT04.CPP const Tempo=1000; // aproximadamente 1000 milisegundos void main(){ clrscr(); sound(260); sound(290); sound(322); sound(342); sound(390); sound(440); sound(494); sound(520);

cout cout cout cout cout cout cout cout

<< << << << << << << <<

"Do "Re "Mi "Fa "Sol "La "Si "Do

"; "; "; "; "; "; "; ";

delay(Tempo); delay(Tempo); delay(Tempo); delay(Tempo); delay(Tempo); delay(Tempo); delay(Tempo); delay(Tempo);

nosound(); cout << "\nSilencio\n"; delay(Tempo); sound(260); sound(290); sound(322); sound(342); sound(390); sound(440); sound(494); sound(520); cout cout cout cout cout cout cout cout << << << << << << << << "Do "Re "Mi "Fa "Sol "La "Si "Do "; "; "; "; "; "; "; "; delay(Tempo/2); delay(Tempo/2); delay(Tempo/2); delay(Tempo/2); delay(Tempo/2); delay(Tempo/2); delay(Tempo/2); delay(Tempo/2);

nosound(); cout << "\nSilencio\n"; delay(Tempo/2); sound(520); sound(494); sound(440); sound(390); sound(342); sound(322); sound(290); sound(260); getch(); nosound(); } cout cout cout cout cout cout cout cout << << << << << << << << "Do "Si "La "Sol "Fa "Mi "Re "Do "; "; "; "; "; "; "; "; delay(Tempo/4); delay(Tempo/4); delay(Tempo/4); delay(Tempo/4); delay(Tempo/4); delay(Tempo/4); delay(Tempo/4); delay(Tempo/4);

43

3.7 El siguiente programa presenta una introduccin a las funciones bsicas primitivas de dibujo del modo grfico del Turbo C. #include <graphics.h> #include <conio.h> //GRAFICA1.C IniciaModoGrafico(){ int ManejadorGrafico, ModoGrafico; ManejadorGrafico = DETECT; initgraph(&ManejadorGrafico, &ModoGrafico, "C:\\TC\\BGI"); } main(){ int X, Y; IniciaModoGrafico(); X = getmaxx(); Y = getmaxy(); setbkcolor(BLACK); cleardevice(); putpixel(40,40,WHITE); putpixel(42,42,WHITE); putpixel(48,48,WHITE); putpixel(44,44,WHITE); putpixel(46,46,WHITE); putpixel(50,50,WHITE); setcolor(LIGHTMAGENTA); line( 0, 0, X, Y); setcolor(WHITE); rectangle(10,10,X-10,Y-10); setfillstyle(1,CYAN); setcolor(YELLOW); sector(X/2,Y/8,45,300,X/6,Y/10); setfillstyle(1,YELLOW); pieslice(X-X/4,Y-Y/4,40,360,X/6); setcolor(GREEN); setfillstyle(1,LIGHTBLUE); fillellipse(X/2,Y/2,X/20,Y/4); setcolor(BLUE); ellipse(X/2,Y-Y/8,0,360,X/6,Y/10); setcolor(RED); circle(X/4, Y/2, 50 ); setcolor(BROWN); circle(X/4, Y/2, 100 ); setcolor(DARKGRAY); circle(X/4, Y/2, 150 ); setcolor(BLUE); arc(X/2,Y/2,90,270,150); setcolor(LIGHTGREEN); arc(X/2,Y/2,90,270,100); setfillstyle(1,RED); setcolor(WHITE); bar3d(X/2+50,Y/4,X/2+90,Y/2,X/20,1); setfillstyle(1,GREEN); bar(X-20,15,X-50,Y-15); getch(); closegraph(); } Figura 3.5 Ejecucin programa GRAFICA1.C en pantalla. Compltelo...

44

45

3.8 NUESTRAS PROPIAS FUNCIONES Como habamos visto, una funcin es simplemente un algoritmo el cual devuelve un nico valor al sitio del programa en que fue invocada o llamada. En este captulo se presentan ejemplos de funciones definidas por nosotros mismos en nuestro propio algoritmo. A continuacin se codifica algoritmo para el clculo del volumen de un cilindro. Primero observemos que el algoritmo hace bsicamente tres cosas: primero la lectura de datos desde el teclado; en segundo lugar efecta unos clculos y en tercer lugar muestra en pantalla los resultados. Sabido esto podramos trabajar las tres situaciones como entidades separadas y al final unirlas en un solo programa, en un diagrama de bloques se vera como en la Figura siguiente: Figura 3.6 Diseo Descendente del Clculo de un Volumen. Programa Clculo Volumen de un Cilindro Lectura de Clculo Escritura radio y altura del Volumen del Volumen desde teclado con la frmula en pantalla

El algoritmo y explicaciones correspondientes siguen a continuacin: #include <iostream.h> #include <conio.h> #include <math.h> // constante para el nmero LecturaDesdeTeclado(); CalculoConFormula(); EscrituraEnPantalla();

: M_PI

//FUNCION0.CPP //Definicin de prototipos de las funciones

46

float radio, altura, volumen; main(){

//Definicin de variable globales //Funcin principal

clrscr(); cout << " CALCULO DEL VOLUMEN DE UN CILINDRO \n"; cout << "\n\n"; LecturaDesdeTeclado(); CalculoConFormula(); EscrituraEnPantalla(); getch(); } LecturaDesdeTeclado(){ cout << "Digite el radio de la base del cilindro en centmetros: "; cin >> radio; cout << "Digite la altura del cilindro en centmetros: "; cin >> altura; } CalculoConFormula(){ // volumen = area base( *r) multiplicada por la altura volumen = M_PI * radio*radio * altura; } EscrituraEnPantalla(){ cout << "\nEl volumen es de " << volumen << " centmetros cbicos."; cout << "\n\n"; } Obsrvese, en el algoritmo anterior, que las instrucciones empleadas en la funcin principal, main(), consisten a su vez, de funciones. Cuando se ejecuta una instruccin de este tipo decimos que se est invocando o llamando a la funcin en cuestin, esto ocasiona la transferencia de la secuencia del programa a este bloque de cdigo y su seguida ejecucin. Cuando la funcin termina la secuencia del programa "retorna" a la instruccin siguiente a la de la invocacin. Ejecute el programa anterior paso a paso con la tecla de F7, para ver en pantalla digite Alt+F5. El profesor explicar paso a paso en clase magistral este algoritmo. No en todos los programas son necesarias las funciones. Una de las razones ms obvias para escribir una secuencia de proposiciones como una funcin es que la secuencia se utiliza varias veces en diferentes partes del programa. Sin duda, el programa seguir siendo correcto si se escriben estas proposiciones en cada punto del programa donde se necesiten. Sin embargo esta estrategia presenta varios problemas. En primer lugar el programa ser ms grande de lo necesario. Esto dificultar la lectura, escritura y posterior mantenimiento del programa. Adems, los programas fuentes grandes // invocacin de funciones // instruccin de retardo

47

requieren una porcin mayor de la memoria de la computadora en tiempo de ejecucin. En segundo lugar, se ver con menor claridad la naturaleza del clculo que realiza el programa. Es de esperar que un clculo determinado se lleve a cabo de la misma manera en todos los puntos del programa en que se necesita. Si esto no se hace as, el lector del programa abrigar sospechas y se preguntar por qu se repite este cdigo, tiene alguna diferencia? La agrupacin de instrucciones a travs de funciones sugiere que ellas tienen un objetivo en particular, esto aumentar la legibilidad del programa, y ms an, permitir el dividir el programa descendentemente y dedicarnos al trabajo de bloques de cdigo determinados (por separado y an por varias personas, sin perder la abstraccin de totalidad del programa), para luego unirlos como piezas de un rompecabezas en un solo programa fuente. En la seccin siguiente se presentan algunos algoritmos ya resueltos en el captulo anterior. La primera impresin ser la de Para qu todo esto si era ms corto antes?, empero, es solo por motivos didcticos de apredizaje que se presenta as, y no complicar con mayores detalles la presentacin inicial de las funciones. La verdadera importancia solo se vendr "a sentir" cuando se desarrollen programas ms grandes, en prximos semestres. Efecte pruebas de ejecucin manual a cada uno de ellos. 3.9 El siguiente algoritmo presenta el intercambio del valor de dos variables en la memoria RAM del computador. #include <iostream.h> #include <conio.h> //FUNCION1.CPP float a,b; // Variables globales IntercambioEnMemoria(){ float aux; //variable local aux = a; a = b; b = aux; } main(){ clrscr(); cout << "Digite un real para almacenar en variable A: "; cin >> a; cout << "Digite un real para almacenar en variable B: "; cin >> b; IntercambioEnMemoria(); cout << "\nDespus de intercambiadas, A ahora es igual a " << a; cout << "\ny la variable B ahora es igual a " << b; }

48

3.10 El siguiente algoritmo soluciona un sistema lineal de tres incgnitas con tres variables, por el mtodo de Cramer. #include <iostream.h> #include <conio.h> float a,b,c,d,e,f,g,h,i,j,k,l, X, Y, Z; //FUNCION2.CPP // coeficientes y trminos independientes // incgnitas a encontrar.

void LeerCoeficientes(){ clrscr(); cout << "Digite trminos de la Primera Ecuacin: \n"; cout << "----------------------------------------\n"; cout << "Coeficiente de X : "; cin >> a; cout << "Coeficiente de Y : "; cin >> b; cout << "Coeficiente de Z : "; cin >> c; cout << "Trmino independiente: "; cin >> d; cout << "\nDigite trminos de la Segunda Ecuacin: \n"; cout << "----------------------------------------\n"; cout << "Coeficiente de X : "; cin >> e; cout << "Coeficiente de Y : "; cin >> f; cout << "Coeficiente de Z : "; cin >> g; cout << "Trmino independiente: "; cin >> h; cout << "\nDigite trminos de la Tercera Ecuacin: \n"; cout << "----------------------------------------\n"; cout << "Coeficiente de X : "; cin >> i; cout << "Coeficiente de Y : "; cin >> j; cout << "Coeficiente de Z : "; cin >> k; cout << "Trmino independiente: "; cin >> l; } void CalculoIncognitas(){ float DetX, DetY, DetZ, DetSistema; DetSistema = a*f*k + e*j*c + i*b*g DetX = d*f*k + h*j*c + l*b*g - l*f*c DetY = a*h*k + e*l*c + i*l*g - i*h*c DetZ = a*f*l + e*j*d + i*b*h - i*f*d X = DetX / DetSistema; Y = DetY / DetSistema; Z = DetZ / DetSistema; } // Variables locales i*f*c - j*g*a - k*e*b; - j*g*d - k*h*b; - l*g*a - k*e*d; - j*h*a - l*e*b;

void EscribirResultados(){ cout << "\n\n"; cout << "X = " << X << " Y = " << Y << " Z = " << Z; cout << "\n\nDigite cualquier tecla para terminar..."; getch(); } void main(){ LeerCoeficientes(); CalculoIncognitas(); EscribirResultados(); }

49

3.11 El siguiente algoritmo descompone una cantidad entera en decenas de mil, unidades de mil, centenas, decenas y unidades. #include <iostream.h> #include <conio.h> #include <values.h> //MAXINT //FUNCION4.CPP int entero; //variable entera a descomponer void DescomponerEntero(){ int resto, X=25, Y=12; // (X,Y) sern coordenadas en pantalla para gotoxy() gotoxy(X,Y); cout << "Decenas de mil resto = entero % 10000; = " << entero / 10000;

Y--; gotoxy(X,Y); cout << "Unidades de mil = " << resto / 1000; resto = resto % 1000; Y--; gotoxy(X,Y); cout << "Centenas resto = resto % 100; Y--; gotoxy(X,Y); cout << "Decenas Y--; gotoxy(X,Y); cout << "Unidades } main(){ clrscr(); cout << "Recuerde que el mximo entero es: \a" << MAXINT; cout << "\nDigite un entero: "; cin >> entero; DescomponerEntero(); getch(); }

= " << resto / 100;

= " << resto / 10;

= " << resto % 10;

50

3.12 ACTIVIDADES PARA REALIZAR EN GRUPO DE ESTUDIO 3.12.1 Expresiones algebraicas: Evale manualmente, como lo hara el computador, las siguientes expresiones. Muestre clculos paso a paso hasta llegar al resultado final. (16 - 2 * 4 + 7) % 4 * 11 - pow(3, 4) (16 - 2 * 4) + ( 7 % 4 * 11 ) - pow(3, 4) 16 - 2 * 4 * 7 / 3 * ( 18 - pow(2, 3) ) * 7) / 3 * 18 - pow(2, 3)

(16 - 2) * (4 3.12.2 debidos pagarlo el pago

En economa se dispone de frmulas para calcular los pagos mensuales a un prstamo. Supngase que se desea pedir un prstamo de P pesos para en n pagos mensuales, con una tasa de inters i. La frmula para calcular mensual, M es: M = i ( 1 + i )n P ----------------( 1 + i )n - 1

Codifique la anterior frmula como una expresin entendible por el computador y dentro de un programa escrito en lenguaje C++. 3.12.3 Solucione un sistema de ecuaciones lineales, compuesto de tres ecuaciones y tres incgnitas, por el mtodo de Cramer. Lea inicialmente los coeficientes (a, b, c, d, e, f, g, h, i, j, k, l) y calcule los valores de las incgnitas X, Y, Z. El sistema general a solucionar, recuerde que son tres rectas en el espacio, es el siguiente: aX + bY + cZ = d eX + fY + gZ = h iX + jY + kZ = l Mtodo de Cramer: calcule inicialmente el determinante del sistema dado, y luego los determinantes particulares para cada variable, as: a S = e i b f j c g k d X = h l b f j c g k a Y = e i d h l c g k Z = a e i b f j d h l

finalmente calcule cada valor de las tres variables como la divisin entre el determinante particular de cada variable y el determinante del sistema, as: X X = ---S Y Y = ---S Z Z = ---S

3.12.4 Cul es la conductancia Gt(Siemens) y resistencia equivalente Rt( ) para cuatro resistores de 4 , 10 , 24 y 26 conectados en serie?. Cul es la cada de voltaje Vi(Voltios) para cada resistencia, si pasa una corriente I de 10 Amperios por el circuito:

51

Rt = R1 + R2 + R3 + R4; 1 Gt = ---- ; Rt Vi = I

Resistencia equivalente

conductancia

Ri ; cada de voltaje en cada resistencia

3.12.5 Digite un ngulo en grados sexagecimales; a continuacin convirtalo a radianes y por medio de las funciones trigonomtricas incorporadas en la librera <MATH.H> muestre los valores correspondientes a las funciones seno, coseno, tangente, cotangente, secante y cosecante. 3.12.6 Cree sendas funciones para el clculo de determinantes de grado: 2x2 y 3x3, y resuelva los siguientes ejemplos con el programa diseado: a) 2 4 d) 3 2 -1 4 8 -4 2 1 b) 1 4 0 1 -1 3 12 e) 3 -2 5 6 c) 1 4 1 3 0 2 f) 3 -4 0 2 3 -2 5

3.12.7 Digite las coordenadas rectangulares de dos puntos (x1, y1) y (x2,y2), obtenga la pendiente m, la ecuacin de la lnea recta que los une, el ngulo que forma la recta con el eje X, y la distancia D entre ellos, y2 - y1 y - y1 = --------x2 - x1 (x - x1); y - y1 = m (x - x1)

despejando la expresin anterior obtenemos la ecuacin de la recta: y = m x - m x1 + y1 Si el trmino -m x1 + y1 es positivo el signo + no aparecer en pantalla, de lo contrario, es decir si es negativo, s aparecer. La falta del + dar mala presentacin a la expresin de la lnea recta. D = ( (x2 - x) + (y2 - y1) ) = arctg m 3.12.8 Un avin del ejrcito deja caer una bomba exactamente encima de un objetivo militar de la "subversin". Como comprendern ustedes seores Bachilleres, la bomba seguir desplazndose en el sentido (eje X) del movimiento del avin en el momento en que fue soltada, y caer (Eje Y) debido a la accin de la fuerza de atraccin gravitacional a razn de 9.8 m/s. Calcule el ngulo de elevacin con que los sobrevivientes, de un palenque cercano donde cay, a este lamentable y no intencionado incidente reportaran que vieron al avin cuando dejo caer la bomba. Para lo anterior lea por teclado la altura sobre el terreno que en el momento de soltar la bomba, midi el piloto en los instrumentos del avin. Lea por teclado la distancia que esta(estaba) el palenque del objetivo militar, distancia que inteligencia militar haba reportado

52

con exactitud al piloto y evitar de esta forma desgracias que lamentar. Con estos dos datos y utilizando sus conocimientos de trigonometra, calcule el ngulo pedido. Sugerencia: dibuje un grfico de lo acontecido. 3.12.9 Un tecnlogo industrial tiene que controlar la produccin de tres clases, 1, 2 y 3, de un determinado producto, el cual est compuesto de tres materiales diferentes: A, B y C; y de los cuales dispone de 1200Kg, 3000Kg y 2564Kg respectivamente. Determinar las cantidades ptimas a producir de cada uno de los modelos, si cada clase del producto es fabricado segn la siguiente tabla: clase 1 2 3 A (kg) 2 7 1 B (kg) 2 10 12 C (kg) 16 5 13

Determine la cantidad a producir de cada uno de las clases de producto resolviendo el siguiente sistema de tres ecuaciones con tres incgnitas. De las respuestas debe tomar solo los valores enteros: Balance para el material 1: Balance para el material 2: Balance para el material 3: 1200 = 3000 = 2 * clase1 + 7 * clase2 + clase3

2 * clase1 + 10 * clase2 + 12 * clase3 5 * clase2 + 13 * clase3

2564 = 16 * clase1 +

donde clase1, clase2 y clase3 son las cantidades de cada clase de producto solicitadas. 3.12.10 En un almacn se va a efectuar una factura. Para esto leer por teclado el nombre de el cliente, la cantidad total de artculos a comprar por el cliente, el precio unitario de venta al pblico (PVP), el descuento que se le efectuar por ser "buen cliente". Se debe borrar a continuacin la pantalla y que aparezca lo siguiente: Nombre del cliente, total bruto de la factura, total del descuento, el 16% del IVA y el total neto a cancelar. 3.12.11 Sea una matriz A de 2x2: A = entonces: A es invertible ( tiene inversa) s y solo s determinante de A diferente a cero. El determinante de A es la multiplicacin de la diagonal principal menos la multiplicacin de la diagonal secundaria. y se cumple que la matriz inversa es igual a: A-1 = 1 ----Det A a22 -a21 -a12 a11 -a12 b12 = -----Det A suponga que: A-1 = b11 b21 b12 b22 a11 b22 = -----Det A a11 a21 a12 a22

de donde: b11

a22 = ---Det A

b21

-a21 = ---Det A

53

Lea cada uno de los cuatro trminos de la matriz A por teclado. Calcule el determinante de A. Calcule cada trmino b11, b12, b21, b22 y muestre en pantalla adecuadamente, es decir en filas y columnas. NOTA: La validacin de si el determinante de A es cero la dejamos para el siguiente captulo sobre instrucciones selectivas, mientras tanto, si ese fuera el caso (de malas), el programa se nos "caer". 3.12.12 Leer N nmeros reales por teclado, y a continuacin muestre en pantalla lo siguiente: sumatoria, media o promedio, la varianza y la desviacin estndar. En la siguiente frmula Xi es cada uno de los N nmeros a digitar (Xi - Media) Varianza = -----------------N suponga que N es igual a 4 para efectuar su algoritmo en lenguaje C++. La desviacin estndar est dada por la raz cuadrada de la varianza.

54

3.12.13 Efecte prueba de ejecucin manual al siguiente algoritmo. Considere los dos casos: cuando if es verdadero y cuando es falso. Muestre exactamente en pantalla. #include <conio.h> #include <iostream.h> #include <math.h> //IF_MANUA.CPP int p, q=15, r; void Calculos(){ int x; cout << "\nDigite un nmero entero: "; r = 25 + p * 2 - pow(x,2); } void main(){ clrscr(); cout << "Q = " << q; cout << "\n\nDigite un nmero entero: "; cin >> p; r = q + p * 2; if (q <= p) cout << q << " es menor o igual a " << p; else Calculos(); cout << "\nP = " << p; cout << "\nR = " << r; } Efecte a continuacin prueba de ejecucin manual del algoritmo del anterior programa IF_MANUA.CPP. Llene el siguiente tabulado, "pantalla" y los clculos necesarios: Variables en forma tabular p q r x "PANTALLA" cin >> x;

Escriba aqu los clculos necesarios: r = 25 + p * 2 - pow(x,2); r = q + p * 2;

55

CAPTULO 4 INSTRUCCIN SELECTIVA IF


4.1 METODOLOGA Estudie el tema presentado en esta leccin antes de ir a la correspondiente clase magistral. Ya en ella efecte las preguntas que considere necesarias al profesor. El Profesor explicar en la clase magistral algunos de los algoritmos de esta leccin, recuerde que es "obligatorio" el llevar este mdulo a todas las clases. Luego dirjase al computador y del disquete anexo cargue los archivos de los programas correspondientes a este captulo. Despus de ejecutarlos efecteles todas las modificaciones que se le ocurran; a este trabajo debe dedicarle mnimo 10 horas, hasta que le queden "los ojos cuadrados", ya a estas alturas debe sentir el trabajo en computador como un "chicle", en caso contrario efecte seria reflexin de sus intereses. Efecte pruebas de ejecucin manual a los programas que el profesor no explic en la clase magistral, en forma personal y luego en Grupo de estudio. Poco a poco debe irse independizando de la ejecucin en la mquina para estar seguro y "creer" que es los que hace un determinado algoritmo sin ejecutarlo en ella. Dogmticamente podramos decir que "llegar a tener fe" en que determinadas instrucciones producen determinados resultados y no otros. 4.2 INSTRUCCIN Si - Entonces DIAGRAMA DE FLUJO 4.1 Instruccin Si-Entonces

Viene el algoritmo secuencialmente Si Expresin Falso (0) booleana Verdad? o Falso? Verdad (<>0) Entonces(then) Ejecutar instrucciones Contina el algoritmo secuencialmente ...

57

Un programa, basndose en los datos que reciba, puede elegir entre distintas acciones a seguir. Sin embargo si se quiere que tome decisiones, se le debe indicar especficamente qu informacin debe utilizar, cmo evaluarla y que acciones seguir. Este tipo de accin se denomina bifurcacin, y se ejecuta basndose en la evaluacin lgica de los datos. La forma ms sencilla de bifurcacin condicional es la sentencia Si-Entonces, la cual hace que un programa ejecute el bloque de cdigo el cual esta a continuacin, si es cierta la condicin, en caso contrario no lo ejecutar. En el lenguaje C la instruccin Entonces(Then) est tcita, y no se debe colocar. Lo primero que hace una instruccin Si(if) es evaluar la informacin que se le ha proporcionado en forma de expresin booleana. Esta evaluacin produce uno de dos resultados posibles: cierto (True) o falso (False). Si la evaluacin es cierta el algoritmo seguir en el bloque de instrucciones que est inmediatamente despus, si el resultado es falso, la secuencia del algoritmo se salta este bloque de instrucciones. En el C/C++ el bloque de instrucciones a continuacin estar delimitado por la pareja de corchetes: { } para abrir y cerrar respectivamente. En caso de que el bloque de cdigo a efectuar, si es verdadera la evaluacin, conste de una sola instruccin, no es necesario utilizar los delimitadores: { }. Sea la evaluacin de la instruccin Si(if) verdadera o falsa, en cualquiera de los dos casos, el flujo del algoritmo continuar secuencialmente. TABLA 4.1 Sintaxis de la instruccin Si (If) en la forma ms simple: Lenguaje C/C++ ... if (expresin lgica){ ... ; instruccin(es); ... ; } ... ; ... ; ... ; if (expresin lgica) instruccinUnica; ... ; ... ; ... ;

Pseudocdigo en Espaol ... Si (expresin lgica) Entonces ... instruccin(es) ... Fin_Si ... ... ... ...

4.3 El siguiente ejemplo utiliza la instruccin selectiva if, de la forma ms elemental. #include <iostream.h> #include <conio.h> //IF_0.CPP main(){ int numero; clrscr(); cout << "Digite un nmero: ";

58

cin >> numero; if (numero > 100) cout << "Se digit un nmero mayor a 100"; getch(); } FIGURA 4.1 Pantalla del programa IF_0.CPP. Al correr el programa Digite un nmero:

FIGURA 4.2 Pantalla del programa IF_0.CPP. Se digita un entero Digite un nmero: 159_

FIGURA 4.3 Pantalla del programa IF_0.CPP. Se da la tecla de ENTRAR Digite un nmero: 159 Se digit un nmero mayor a 100_

FIGURA 4.4 Pantalla del programa IF_0.CPP. Otra corrida Digite un nmero: _

FIGURA 4.5 Pantalla del programa IF_0.CPP. Entero digitado y ENTRAR Digite un nmero: 50 _

59

4.4 El siguiente algoritmo utiliza la instruccin selectiva if, con un bloque de cdigo, delimitado con { }. #include <iostream.h> #include <conio.h> //IF_00.CPP main(){ int numero; clrscr(); cout << "Digite un nmero: "; cin >> numero; if (numero > 100){ numero = numero + 10; cout << "Se digit un nmero mayor a 100 \n"; cout << "y a continuacin se incrementa en 10 para dar "; } cout << numero; getch(); } FIGURA 4.6 Pantalla del programa IF_00.CPP. El IF es verdadero. Digite un nmero: 236 Se digit un nmero mayor a 100 y a continuacin se incrementa en 10 para dar 246_

En la figura anterior se ve el efecto de correr el programa con un valor que produce la evaluacin de la expresin lgica (numero > 100) como verdadera. Observe que la variable nmero tom inicialmente el valor de 236, al ser digitado por teclado, y luego se incremento en 10 para tomar el valor de 246, que es el que finalmente muestra en pantalla. FIGURA 4.7 Pantalla del programa IF_00.CPP. El IF es falso. Digite un nmero: 93 93_

En la figura anterior se ve el efecto de correr el programa con un valor que produce la evaluacin de la expresin lgica (numero > 100) como falsa. Observe que la variable nmero tomo inicialmente el valor de 93, al ser digitado por teclado. El IF al ser falso, el algoritmo contina en la instruccin: cout << numero, mostrando de esta forma, la variable numero, el mismo valor que se digit.

60

4.5 El siguiente algoritmo detectar ningn error. #include <iostream.h> #include <conio.h>

presenta

un

error

de

lgica,

el

compilador

no

//IF_000.CPP main(){ int numero; clrscr(); cout << "Digite un nmero: "; cin >> numero; if (numero > 100); // punto y coma da a entender que el if termina cout << "Se digit un nmero mayor a 100"; getch(); } FIGURA 4.8 Pantalla del programa IF_000.CPP. El IF es verdadero. Error! Marcador no definido. Digite un nmero: 214 Se digit un nmero mayor a 100_ FIGURA 4.9 Pantalla del programa IF_000.CPP. El IF es falso. OJO CON ESTE ERROR Error! Marcador no definido. Digite un nmero: 39 Se digit un nmero mayor a 100_

4.6 El siguiente algoritmo calcula el nmero medio entre tres enteros, no es el promedio. #include <iostream.h> #include <conio.h> //IF_01.CPP main(){ int a, b, c; clrscr(); cout << "Digite entero: "; cin >> a; cout << "Digite entero: "; cin >> b; cout << "Digite entero: "; cin >> c; if ( (b<a && cout << a if ( (a<b && cout << b if ( (a<c && cout << c } a<c) << " b<c) << " c<b) << " || es || es || es (c<a && a<b) ) el del medio"; (c<b && b<a) ) el del medio"; (b<c && c<a) ) el del medio";

61

4.7 INSTRUCCIN SI - ENTONCES - SINO TABLA 4.2 Sintaxis general de la instruccin Si (If) es: Lenguaje C/C++ ... If (expresin lgica){ ... ; instruccin(es); ... ; } Else{ ... ; instruccin(es) ... ; } ... ; ... ;

Error! Marcador no definido. Pseudocdigo en Espaol ... Si (expresin lgica) Entonces ... instruccin(es) ... Si_No ... instruccin(es) ... Fin_Si ... ... ...

DIAGRAMA DE FLUJO 4.2 Error! Marcador no definido. secuencialmente

instrucciones Si-Entonces-Si_No. Viene el algoritmo

Si Expresin Falso (0) booleana Verdad? o Falso? Verdad <>0 Entonces (then) Si_No (else) Ejecutar Ejecutar instrucciones instrucciones Contina el algoritmo secuencialmente

Hasta ahora con la instruccin SI solo tenemos una escogencia, en el caso de verdadero, ahora veremos la forma completa de la misma instruccin. De esta forma y teniendo en cuenta los datos que reciba a evaluar el Si, puede elegir entre dos distintas acciones a seguir: una en el caso de que la evaluacin lgica sea verdadera (como antes) y otra en el caso de que sea falsa.

62

De esta forma se efectuar una bifurcacin condicional en la sentencia Si(if) de la siguiente forma: si es cierta la condicin se ejecuta el bloque de cdigo a continuacin, en caso contrario, es decir cuando la condicin es falsa, se ejecutar el bloque de cdigo que est a continuacin de la instruccin SINO(else). Repitiendo una vez ms, lo primero que hace una instruccin Si(if) es evaluar la informacin que se le ha proporcionado en forma de expresin booleana. Esta evaluacin produce uno de dos resultados posibles: cierto (True) o falso (False). Si la evaluacin es cierta el algoritmo seguir en el bloque de instrucciones que est inmediatamente despus, si el resultado es falso, la secuencia del algoritmo seguir a continuacin del SINO(else). En el C/C++ el bloque de instrucciones a continuacin, ya sea de la parte que evale cuando sea verdadero el Si o la parte que evale cuando sea falsa, deber estar delimitada por los corchetes: { } para abrir y cerrar respectivamente. Lo mismo que para el caso de verdadero, si el bloque de cdigo a efectuar, cuando la evaluacin sea falsa, conste de una sola instruccin, no es necesario utilizar los delimitadores: { }. Sea la evaluacin de la instruccin Si(if) verdadera o falsa, en cualquiera de los dos casos, el flujo del algoritmo continuar secuencialmente, en la siguiente instruccin.

63

4.8 El siguiente algoritmo utiliza la instruccin selectiva if en su forma completa y de la forma ms elemental, es decir sin bloques de cdigo delimitados. #include <iostream.h> //IF_000.CPP main(){ int numero; cout << "Digite un nmero: "; cin >> numero; if (numero > 100) cout << "Se digit un nmero mayor a 100"; else cout << "Se digit un nmero menor o igual a 100"; } FIGURA 4.10 Efecto en pantalla del programa IF_000.CPP. Caso verdadero.

Error! Marcador no definido. Digite un nmero: 154 Se digit un nmero mayor a 100 FIGURA 4.11 Efecto en pantalla del programa IF_000.CPP. Caso de falso

Error! Marcador no definido. Digite un nmero: 65 Se digit un nmero menor o igual a 100

64

4.9 El siguiente algoritmo utiliza la instruccin selectiva if en su forma completa y con bloques de cdigo delimitados entre { }. #include <iostream.h> //IF_0000.CPP main(){ int numero; clrscr(); cout << "Digite un nmero: "; cin >> numero; if (numero > 100){ cout << "Se digit un nmero numero = numero + 10; cout << "y a continuacin se } else{ cout << "Se digit un nmero numero = numero - 10; cout << "y a continuacin se } cout << numero; } FIGURA 4.12 Pantalla del programa IF_0000.CPP. El IF es verdadero. Error! Marcador no definido. Digite un nmero: 236 Se digit un nmero mayor a 100 y a continuacin se incrementa en 10 para dar 246_ En la figura anterior se ve el efecto de correr el programa con un valor que produce la evaluacin de la expresin lgica (numero > 100) como verdadera. Observe que la variable numero tom inicialmente el valor de 236 al ser digitado por teclado y luego se increment en 10 para tomar el valor de 246, que es el que finalmente muestra en pantalla. FIGURA 4.13 Pantalla del programa IF_0000.CPP. El IF es falso. Error! Marcador no definido. Digite un nmero: 93 Se digit un nmero menor o igual a 100 y a continuacin se decrementa en 10 para dar 83_

mayor a 100 \n"; incrementa en 10 para dar " ; menor o igual a 100 \n"; decrementa en 10 para dar " ;

En la figura anterior se ve el efecto de correr el programa con un valor que produce la evaluacin de la expresin lgica (numero > 100) como falsa. Observe que la variable numero tomo inicialmente el valor de 93 al ser digitado por teclado. El IF al ser falso contina el algoritmo despus de la correspondiente instruccin else y efectuando lo que tiene encerrado entre llaves. Al salir de ellas muestra el valor que tiene numero que es ahora de 83.

65

4.10 Este programa tiene un error de tipo lgico en las llaves { } del if. El compilador no dar ningn error. Explique este error. #include <iostream.h> #include <conio.h> main(){ int numero; clrscr(); cout << "Digite un nmero menor o igual a 100: "; cin >> numero; if (numero > 100) numero = numero + 10; cout << "Se digit un nmero mayor a 100 \n"; cout << "y a continuacin se incrementa en 10 para dar " << numero; getch(); } 4.11 Este programa presenta un error de sintaxis en la instruccin else, debido a la falta de delimitadores { }. Corrjalo. El compilador no lo dejar ejecutar. #include <iostream.h> //IF0ERROR.CPP main(){ int numero; cout << "Digite un nmero: "; cin >> numero; if (numero > 100) cout << "Se digit un nmero mayor a 100 \n"; numero = numero + 10; cout << "y a continuacin se incrementa en 10 para dar " ; else{ cout << "Se digit un nmero menor o igual a 100 \n"; numero = numero - 10; cout << "y a continuacin se decrementa en 10 para dar " ; } cout << numero; getch(); }

66

4.12 El siguiente algoritmo calcula el nmero medio entre tres enteros, no es el promedio. Segunda versin. #include <iostream.h> #include <conio.h> //IF_02.CPP main(){ int a, b, c; clrscr(); cout << "Digite entero: "; cin >> a; cout << "Digite entero: "; cin >> b; cout << "Digite entero: "; cin >> c; if ( (b<a && a<c) || (c<a && a<b) ) cout << a << " es el del medio"; else if ( (a<b && b<c) || (c<b && b<a) ) cout << b << " es el del medio"; else cout << c << " es el del medio"; getch(); } 4.13 El siguiente programa permite leer desde el teclado dos nmeros y mostrar comentarios que muestren uno de los siguientes mensajes: "los dos son positivos" o "los dos son negativos" o "tienen diferente signo". //IF_03.CPP #include <iostream.h> #include <conio.h> main(){ float a, b; clrscr(); cout << "Digite real: "; cin >> a; cout << "Digite real: "; cin >> b; if ( a > 0 && b > 0) cout << "\nLOS DOS SON POSITIVOS"; else if (a < 0 && b < 0) cout << "\nLOS DOS SON NEGATIVOS"; else cout << "\nTIENEN DIFERENTE SIGNO"; getch(); }

67

4.14 Se digitan tres palabras y a continuacin se ordenan alfabticamente. #include <iostream.h> #include <conio.h> #include <string.h> //IF_04.CPP void main(){ char p1[25], p2[25], p3[25]; clrscr(); cout << "Digite tres palabras separadas por espacios en blanco: \n"; cin >> p1 >> p2 >> p3; if (strcmp(p1,p2)<0 && strcmp(p2,p3)<0) cout << p1 << " " << p2 << " " << p3; else if (strcmp(p1,p3)<0 && strcmp(p3,p2)<0) cout << p1 << " " << p3 << " " << p2; else if (strcmp(p2,p1)<0 && strcmp(p1,p3)<0) cout << p2 << " " << p1 << " " << p3; else if (strcmp(p2,p3)<0 && strcmp(p3,p1)<0) cout << p2 << " " << p3 << " " << p1; else if (strcmp(p3,p1)<0 && strcmp(p1,p2)<0) cout << p3 << " " << p1 << " " << p2; else cout << p3 << " " << p2 << " " << p1; getch(); } 4.15 Dados dos enteros ledos desde teclado, uno es divisor del otro? //IF_05.CPP #include <iostream.h> #include <conio.h> main(){ int x, y; clrscr(); cout << "Digite separados por un espacio dos nmeros enteros: "; cin >> x >> y; if (x % y cout else if (y % cout else cout } == 0) << y << " es divisor de " << x; x == 0) << x << " es divisor de " << y; << "No son divisores entre si\a";

68

4.16 Se calcula el valor de Y en funcin de X, teniendo en cuenta los siguientes intervalos: Y = X^2 - 4 si X<=4 Y = X^3 + 2X - 31 si X>4 y X<=10 Y = 3X^2 - 10.5X - 3 si X>10 #include <iostream.h> #include <conio.h> #include <math.h> //IF_06.CPP main(){ float x, y; clrscr(); cout << "Digite valor de la variable independiente X: "; cin >> x ; if (x <= 4) y = x*x - 4; else if (x <= 10) y = pow(x,3) + 2*x - 31; else y = 3*x*x - 10.5*x - 3; cout << "\nVariable dependiente Y = " << y; getch(); }

69

4.17 Una pizzera vende pizzas de tres tamaos: pequea, mediana y grande. En ella se determina el precio de venta al pblico(PVP), as: + Un costo fijo igual para todos los tamaos + Un costo variable, dependiente del tamao, el cual se determina multiplicando un factor, obtenido empricamente, para cada tamao por su correspondiente costo fijo. ------------------------------------------------------------------= Costo de cada pizza * 20% utilidad sobre cada pizza ------------------------------------------------------------------= Precio de Venta al Pblico En el programa se debe leer inicialmente el tamao de la pizza y a continuacin aparece el PVP correspondiente. Se supone un costo fijo de $1000 para cada uno de los tamaos y unos factores para el clculo del costo variable dependiendo del tamao, de la siguiente forma: pequea=1.5, mediana=2.0 y grande=3.0. Mostrar finalmente el PVP en pantalla de la pizza solicitada. #include <iostream.h> #include <conio.h> //IF_11.CPP main(){ const int CostoFijo = 1000; const float FactorPequena = 1.5; const float FactorMediana = 2.0; const float FactorGrande = 3.0; float CostoVariable, PVP; char Tamano; clrscr(); cout << "Tipos de pizza: Pequea Mediana Grande\n"; cout << "Digite inicial de tamao de pizza a comprar: "; cin >> Tamano; if (Tamano == 'P' || Tamano == 'p') CostoVariable = FactorPequena * CostoFijo; else if (Tamano == 'M' || Tamano == 'm') CostoVariable = FactorMediana * CostoFijo; else CostoVariable = FactorGrande * CostoFijo; PVP = (CostoFijo + CostoVariable) * 1.2; cout << "Precio de Venta al Pblico = $ " << PVP; getch(); }

70

4.18 Dados tres valores numricos por teclado, a, b c: se imprime el mayor, el menor y se calcula su promedio. //IF_07.CPP #include <iostream.h> #include <conio.h> main(){ float a, b, c, menor, mayor, promedio; clrscr(); cout << "Digite valor para a: "; cin >> a; cout << "Digite valor para b: "; cin >> b; cout << "Digite valor para c: "; cin >> c; if (a > b && a > c) cout << "Mayor es " << a; else if (b > a && b > c) cout << "Mayor es " << b; else cout << "Mayor es " << c; if (a < b && a < c) cout << " Menor es " << a; else if (b < a && b < c) cout << " Menor es " << b; else cout << " Menor es " << c; promedio = (a + b + c) / 3; cout << " Promedio de los tres nmeros = " << promedio; getch(); } 4.19 El siguiente programa permite leer la hora, minutos y segundos en un instante de tiempo; y a continuacin presenta la hora un segundo despus. La hora aparecer en el formato HH:MM:S, debiendo aparecer los seis dgitos an cuando sean ceros. //IF_09.CPP #include <iostream.h> #include <conio.h> main(){ int hora, minuto, segundo; clrscr(); cout << "Digite hora(1-12): "; cin >> hora; cout << "Digite minutos (0-59): "; cin >> minuto; cout << "Digite segundos (0-59): "; cin >> segundo; segundo = segundo + 1;

71

if (segundo == 60){ segundo = 0; minuto = minuto + 1; if (minuto == 60){ minuto = 0; hora = hora + 1; if (hora == 13) hora = 1; } } if ( hora < 10) cout << "0" << hora << ":"; else cout << hora << ":"; if (minuto < 10) cout << "0" << minuto << ":"; else cout << minuto << ":"; if (segundo < 10) cout << "0" << segundo; else cout << segundo; getch(); } Efecte a continuacin prueba de ejecucin manual del algoritmo del anterior programa IF_09.CPP. Llene el siguiente tabulado, con los valores correspondientes y coloque simultneamente en pantalla lo que "cree" aparece en ella: Variables en forma tabular Error! Marcador no definido . segundo minuto hora "PANTALLA"

72

4.20 Dado el nmero de un mes, digitado desde teclado, y si el ao es bisiesto, se determina el nombre y el nmero de das del mes correspondiente. #include <iostream.h> #include <conio.h> #include <string.h> // strcpy(cadena1,cadena2): asigna cadena2 a cadena1 // strcmp(cadena1,cadena2): si cadena1==cadena2 devuelve cero //IF_10.CPP main(){ int Mes, NumeroDias; char NombreMes[10], Bisiesto; clrscr(); cout << "Digite el nmero de un mes(1 - 12): "; cin >> Mes; if (Mes == 1){ strcpy(NombreMes, " Enero "); NumeroDias = 31; } else if (Mes == 2){ strcpy(NombreMes, " Febrero "); cout << "Es el ao bisiesto? (S/N): "; cin >> Bisiesto; if (Bisiesto == 'S' || Bisiesto == 's') // || operador lgico O NumeroDias = 29; else NumeroDias = 28; } else if (Mes == 3){ strcpy(NombreMes, " Marzo "); NumeroDias = 31; } else if (Mes == 4){ strcpy(NombreMes, " Abril "); NumeroDias = 30; } else if (Mes == 5){ strcpy(NombreMes, " Mayo "); NumeroDias = 31; } else if (Mes == 6){ strcpy(NombreMes, " Junio "); NumeroDias = 30; } else if (Mes == 7){ strcpy(NombreMes, " Julio "); NumeroDias = 31; } else if (Mes == 8){ strcpy(NombreMes, " Agosto "); NumeroDias = 31;

73

} else if (Mes == 9){ strcpy(NombreMes, " Septiembre "); NumeroDias = 30; } else if (Mes == 10){ strcpy(NombreMes, " Octubre "); NumeroDias = 31; } else if (Mes == 11){ strcpy(NombreMes, " Noviembre "); NumeroDias = 30; } else if (Mes == 12){ strcpy(NombreMes, " Diciembre "); NumeroDias = 31; } else strcpy(NombreMes, " Error "); if (strcmp(NombreMes, " Error ") == 0) cout << "Se equivoc al digitar nmero del 1 al 12\a\a"; else cout << NombreMes << "tiene " << NumeroDias << " das"; }

74

4.21 Se lee desde teclado el nombre de un empleado, su salario bsico por hora y el nmero de horas trabajadas durante una semana. Se calcula el salario neto, teniendo en cuenta si el nmero de horas trabajadas en la semana es mayor a 48, esas horas de ms se consideran como extras y tienen un 35% de recargo. Al final se muestra el nombre y el salario neto a cancelar al empleado en pantalla. #include <iostream.h> #include <conio.h> #include <stdio.h> //IF_12.CPP main(){ char NombreEmpleado[23]; float BasicoPorHora, HoraSemanales, HorasExtras, SalarioSemanal; clrscr(); cout << "Digite el nombre y apellido del empleado: "; gets(NombreEmpleado); cout << "\nDigite el salario bsico por hora: "; cin >> BasicoPorHora; cout << "\nDigite el nmero de horas laboradas en esta semana: "; cin >> HoraSemanales; if (HoraSemanales <= 48) SalarioSemanal = BasicoPorHora * HoraSemanales; else{ HorasExtras = HoraSemanales - 48; SalarioSemanal = BasicoPorHora*48 + HorasExtras*BasicoPorHora*1.35; } cout <<"\n" <<NombreEmpleado <<" devengar esta semana $" << SalarioSemanal; getch(); }

75

4.22 Se desarrolla un algoritmo para leer desde el teclado el nombre de un empleado, su salario bsico por mes y el nmero de horas trabajadas durante el mismo. Se debe calcular el salario bruto, la retencin en la fuente y el salario neto. Para el calculo de la retencin en la fuente se debe tener en cuenta lo siguiente: Para salarios brutos hasta $890,000 no hay retencin en la fuente mayores a $890,000 y menores o iguales a $2'000,000 retencin del 5% desde $2'00,001 y menores o iguales a $4'000,00 retencin del 8% mayores a $4'000,000 retencin del 12% IF_13.CPP*/ #include <iostream.h> #include <conio.h> #include <stdio.h> main(){ char NombreEmpleado[32]; float BasicoMensual, HorasMensuales, ReteFuente, SalarioBruto, SalarioNeto, BasicoHora; clrscr(); cout << "Digite el nombre y apellido del empleado: "; gets(NombreEmpleado); cout << "\nDigite el salario bsico Mensual: "; cin >> BasicoMensual; cout << "\nDigite el nmero de horas laboradas en este mes: "; cin >> HorasMensuales; BasicoHora = BasicoMensual / 30 / 8; // 30 das al mes, 8 horas diarias SalarioBruto = BasicoHora * HorasMensuales; if (SalarioBruto <= 890000) ReteFuente = 0; else if (SalarioBruto <= 200000) ReteFuente = SalarioBruto*5.0/100; else if (SalarioBruto <= 400000) ReteFuente = SalarioBruto*8.0/100; else ReteFuente = SalarioBruto*12.0/100; SalarioNeto = SalarioBruto - ReteFuente; clrscr(); cout << "Nombre Empleado: " << NombreEmpleado; cout << "\nSalario Bsico mensual: " << BasicoMensual; cout << "\nSalario Bsico por hora: " << BasicoHora; cout << "\nHoras trabajadas en el mes: " << HorasMensuales; cout << "\nSalario Bruto: " << SalarioBruto; cout << "\nRetencin en la fuente: " << ReteFuente; cout << "\nSalario Neto A cancelar: $ " << SalarioNeto; }

76

4.23 Se calcula el jornal a pagar, a destajo, a un trabajador, el cual labora en una empresa que tiene dos turnos: diurno y nocturno. La tarifa por hora diurna es de $1,000 y la nocturna de $1,500. Si es festivo la tarifa se incrementar en $500 el turno diurno y en $1,000 el nocturno. #include <iostream.h> #include <conio.h> #include <stdio.h> //IF_14.CPP main(){ char NombreTrabajador[30]; float Jornal, Horas; char Turno, Festivo; clrscr(); cout << "Digite el nombre y apellido del trabajador: "; gets(NombreTrabajador); cout << "Turno Diurno o Nocturno (D/N): "; cin >> Turno; cout << "Es festivo? (S/N): "; cin >> Festivo; cout << "Nmero de horas laboradas en el da: "; cin >> Horas; if (Turno == 'D' || Turno == 'd') if (Festivo == 'S' || Festivo == 's') Jornal = Horas * (1000 + 500); else Jornal = Horas * 1000; else if (Festivo == 'S' || Festivo == 's') Jornal = Horas * (1500 + 1000); else Jornal = Horas * 1500; cout << "\n\nJornal a cancelar a " << NombreTrabajador << " $" << Jornal; getch(); } FIGURA 4.14 Pantalla del programa IF_14.CPP. Compltela usted mismo Error! Marcador no definido.

77

4.24 Se lee el nombre, edad, sexo y estado civil de una persona y luego se muestra en pantalla si esta persona es mujer mayor de 40 aos y casada, si es un menor de edad, si es menor de edad casado y si es un hombre mayor de 60 aos y soltero. #include <iostream.h> #include <conio.h> #include <stdio.h> //IF_15.CPP main(){ char Nombre[20]; int Edad; char Sexo, EstadoCivil; clrscr(); cout << "Digite el nombre del encuestado: "; gets(Nombre); cout << "Sexo (M/F): "; cin >> Sexo; cout << "Edad: "; cin >> Edad; cout << "Estado Civil (Casado, Soltero, Otro): "; cin >> EstadoCivil; if((Sexo=='M' || Sexo=='m')&&(Edad>60) &&(EstadoCivil=='S' || EstadoCivil=='s')) cout << Nombre << " hombre soltern mayor de 60 aos"; else if ( (Sexo == 'F' || Sexo == 'f') && (Edad> 40) && (EstadoCivil == 'C' || EstadoCivil == 'c') ) cout << Nombre << " es una Mujer Casada mayor de 40 aos"; else if (Edad < 18){ cout << Nombre << " es un menor de edad "; if (EstadoCivil == 'C' || EstadoCivil == 'c') cout << " casado"; } else cout << "\n\aNo cumple ninguna de las condiciones solicitadas"; getch(); }

78

4.25 Se desarrolla un algoritmo el cual permite leer desde teclado los datos siguientes de una persona: nombre, edad, sexo y estado civil; se imprime el nombre solo si corresponde a un hombre casado menor de 30 aos o a una mujer soltera menor de 50 aos. #include #include #include #include <iostream.h> <conio.h> <stdio.h> <ctype.h> // toupper() pasa a mayscula //IF_16.CPP main(){ int Edad; char Sexo, EstadoCivil; char Nombre[25]; clrscr(); cout << "Digite el nombre del encuestado: "; gets(Nombre); cout << "Sexo (M/F): "; cin >> Sexo; Sexo = toupper(Sexo); cout << "Edad: "; cin >> Edad; cout << "Estado Civil (Casado, Soltero, Otro): "; cin >> EstadoCivil; EstadoCivil = toupper(EstadoCivil); if ( ( Sexo=='M' && Edad<30 ) || ( Sexo=='F' && Edad<50 ) )

cout << "\n" << Nombre << " Cumple una de las condiciones"; else cout << "\n\aNo cumple ninguna de las condiciones solicitadas"; getch(); } FIGURA 4.15 Complete prueba de ejecucin manual del programa IF_16.CPP.

Error! Marcador no definido.

79

4.26 ACTIVIDADES PARA REALIZAR EN GRUPO DE ESTUDIO 4.26.1Desarrolle un algoritmo el cual lea desde teclado el nombre, edad, sexo y estado civil de una persona, e imprima el nombre solo si corresponde a un hombre casado mayor de 30 aos o a una mujer soltera menor de 50 aos. 4.26.2 Lea un registro desde teclado compuesto de los siguientes tres campos: nombre, salario mensual y porcentaje de retencin en la fuente. Si la persona gana ms de $590,000 calcular y escribir la cantidad a retener segn la siguiente frmula: Retencin = Salario mensual * porcentaje de retencin adicionalmente si gana menos o igual a mensaje: "NO EFECTUAR RETENCIN EN LA FUENTE". 4.26.3 grs. y nmero enviar $890,000 presentar el siguiente

El costo de enviar por correo es de $300 para cartas que pesan menos de 30 $5 por cada gramo adicional para cartas que pesan ms de 30 grs. Leer un real el cual representar el peso de la carta y luego muestre el costo de la carta.

4.26.4 Desarrolle un programa el cual determine si un tringulo es equiltero, issceles o escaleno por medio de la lectura desde teclado de sus ngulos interiores, valide previamente que la suma sea 180 . 4.26.5 Simule emitir el total de una factura considerando lo siguiente: leer la cantidad, el nombre del artculo y el precio unitario. Si el total bruto da mayor de $150,000 hacer un descuento del 2%, si es mayor a $300,000 hacer un 3% de descuento adicional de descuento. Finalmente agregar el 14% de IVA. 4.26.6 Dado un nmero entero, presentarlo en pantalla con formato monetario con separacin de miles y precedido por el signo $. Ejemplo: Entrada 32420 debe producir en pantalla: $32,420.00. Sugerencia: Descomponga el nmero como unidades, decenas, centenas, etc. Suponga hasta un mximo valor para los enteros de 32678. 4.26.7 Rehaga el algoritmo sobre la regla de Cramer, para solucionar un sistemas de tres ecuaciones con tres incgnitas. Si el sistema no tiene solucin, y esto ocurre cuando el determinante del sistema es cero, muestre en pantalla: "EL SISTEMA NO TIENE SOLUCIN". 4.26.8 Rehaga el algoritmo el cual permite leer dos puntos desde el teclado y calcular la pendiente, el ngulo de inclinacin, y la ecuacin de la lnea recta. Se debe recordar que cuando el trmino independiente de la ecuacin de la lnea recta es positivo, el + no aparece en pantalla. Hgalo aparecer con la utilizacin de la instruccin Si. 4.26.9 Una Compaa al recibir el pago de las facturas pendientes, a cada uno de sus cliente, efecta los siguientes pasos: Inicia leyendo por teclado el nombre del cliente, nmero de cdula de ciudadana, el total de la factura y el nmero del da(0-31) en que est cancelando. Si el cliente paga dentro de los diez primeros das, de cada mes, se le descuenta sobre la factura un 3% y hasta un mximo (de descuento) de $20,000, por pronto pago. Debe aparecer en pantalla un aviso que diga: "CANCELANDO ANTICIPADAMENTE".

80

Si paga dentro de los diez das(11-20) siguientes paga el total factura. Debe aparecer en pantalla un aviso que diga: "CANCELANDO AL DA".

de

la

Si paga dentro de los ltimos das(21-31) se le cobra un recargo sobre la factura del 3.5% y unos gastos administrativos por cobranza a morosos de $5,000. En este caso debe aparecer un aviso de advertencia en pantalla que diga: "CANCELANDO TARDAMENTE". Se deben efectuar los clculos necesarios para mostrar en pantalla los resultados pedidos a continuacin: el nombre del cliente con su cdula de identidad, valor original de la factura, el descuento o recargos, y el neto a cancelar en efectivo.

81

CAPTULO 5Error! Marcador no definido.. INSTRUCCIN SELECTIVA SWITCH


5.1 METODOLOGA Estudie el tema presentado en esta leccin antes de ir a la correspondiente clase magistral. Ya en ella efecte las preguntas que considere necesarias al profesor. El Profesor explicar en la clase magistral algunos de los algoritmos de esta leccin, incluyendo lo mnimo necesario para el manejo de cadenas de caracteres. Recuerde que es "obligatorio" el llevar este mdulo a todas las clases. En la parte de taller el profesor le pondr a efectuar pruebas de ejecucin manual a algunos de los algoritmos y le pondr a realizar otros tomados de la tarea asignada al final de esta leccin. Luego dirjase al computador y del disquete anexo cargue los archivos de los programas correspondientes a este captulo. Despus de ejecutarlos realcele todas las modificaciones que se le ocurran, a este trabajo debe dedicarle mnimo 5 horas. Efecte pruebas de ejecucin manual a los programas que el profesor no explic en la clase magistral, en forma personal y luego en Grupo de estudio; efecte los algoritmos de tarea asignados al final de esta leccin. Debe dedicarle a esto unas tres horas. 5.2 INSTRUCCIN SWITCH DEL C/C++ Si se utilizan a menudo tipos simples de datos como de caracter o enteros y adicionalmente hay mltiples condiciones a cumplir, se puede utilizar esta instruccin. La instruccin switch proporciona una forma clara de bifurcacin mltiple. TABLA 5.1 Sintaxis general de la instruccin En Caso de (switch): Lenguaje C/C++ ... ; switch (variable) { case v1: instruccin(es); break; case v2: instruccin(es); break; ... case vN: instruccin(es); break; default: instruccin(es) } ... ; ... ;

Error! Marcador no definido. Pseudocdigo en Espaol ... SegnSea (variable) hacer valor1: instruccin(es) valor2: instruccin(es) ... valorN: instruccin(es) Si_No: instruccin(es) FinSegnSea ... ...

83

5.3 Dado el nmero de un da de la semana, hacer aparecer el nombre del da correspondiente: #include <iostream.h> #include <conio.h> //SWITCH_1.CPP void main(){ int Dia; clrscr(); cout << "Digite el nmero de un da de la semana(1 - 7): "; cin >> Dia; switch (Dia) { case 1: cout << "Es da es LUNES"; break; case 2: cout << "El da es MARTES"; break; case 3: cout << "El da es MIERCOLES"; break; case 4: cout << "El da es JUEVES"; break; case 5: cout << "El da es VIERNES"; break; case 6: cout << "El da es SABADO"; break; case 7: cout << "El da es DOMINGO"; break; default: cout << "\aERROR, no es un entero vlido"; } getch(); }

84

5.4 Dado el nmero de un mes, digitado desde teclado, y si el ao es bisiesto, se determina el nombre y el nmero de das del mes correspondiente. //SWITCH_4.CPP #include <iostream.h> #include <conio.h> #include <string.h> // strcpy(cadena1,cadena2): asigna cadena2 a cadena1 //strcmp(cadena1,cadena2): si cadena1==cadena2 devuelve cero main(){ int Mes, NumeroDias; char NombreMes[10]; char Bisiesto; clrscr(); cout << "Digite el nmero de un mes(1 - 12): "; cin >> Mes; switch (Mes) { case 1: strcpy(NombreMes, " Enero "); NumeroDias = 31; break; case 2: strcpy(NombreMes, " Febrero "); cout << "Es el ao bisiesto? (S/N): "; cin >> Bisiesto; if (Bisiesto == 'S' || Bisiesto == 's') NumeroDias = 29; else NumeroDias = 28; break; case 3: strcpy(NombreMes, " Marzo "); NumeroDias = 31; break; case 4: strcpy(NombreMes, " Abril "); NumeroDias = 30; break; case 5: strcpy(NombreMes, " Mayo "); NumeroDias = 31; break; case 6: strcpy(NombreMes, " Junio "); NumeroDias = 30; break; case 7: strcpy(NombreMes, " Julio "); NumeroDias = 31; break; case 8: strcpy(NombreMes, " Agosto "); NumeroDias = 31; break; case 9: strcpy(NombreMes, " Septiembre "); NumeroDias = 30; break; case 10:strcpy(NombreMes, " Octubre "); NumeroDias = 31; case 11:strcpy(NombreMes, " Noviembre "); NumeroDias = 30; case 12:strcpy(NombreMes, " Diciembre "); NumeroDias = 31; break; default: strcpy(NombreMes, " Error ");

// || operador lgico O

85

} if (strcmp(NombreMes, " Error ") == 0) cout << "Se equivoc al digitar nmero del 1 al 12\a\a"; else cout << NombreMes << "tiene " << NumeroDias << " das"; }

86

5.5 Se lee un nmero entero entre 1 y 999, y a continuacin se redondea a la decena ms prxima. //SWITCH_2.CPP #include <iostream.h> #include <conio.h> void main(){ int numero, resto, centena, decena, unidad; clrscr(); cout << "Digite un nmero entero para redondearlo:\n"; cin >> numero; centena = numero resto = numero % decena = resto / unidad = resto % switch { case case case case case case case case case case } cout << numero; getch(); } (unidad) 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: ; ; ; ; numero = centena*100 + decena*10; break; ; ; ; ; numero = centena*100 + (decena+1)*10; / 100; 100; 10; 10;

87

5.6 El siguiente programa presenta un men en pantalla. Le servir como plantilla para disear sus programas. Se efecta invocacin recursiva de la funcin main(). //SWITCH_5.CPP #include <iostream.h> #include <conio.h> void funcion1(){ clrscr(); cout << "Funcin 1"; getch(); } void funcion2(){ clrscr(); cout << "Funcin 2"; getch(); } void funcion3(){ clrscr(); cout << "Funcin 3"; getch(); } void main(){ char opcion; clrscr(); cout << "\t\t\tESTE ES EL MENU PRINCIPAL"; cout << "\n\n\n\t\t\tA. Funcin 1.....\n"; cout << "\n\t\t\tB. Funcin 2.....\n"; cout << "\n\t\t\tC. Funcin 3.....\n"; cout << "\n\t\t\tS. Salir\n"; cout << "\n\n\t\tDigite una opcin: "; opcion = getch(); switch ( opcion ) { case 'A': case 'a': funcion1(); break; case 'B': case 'b': funcion2(); break; case 'C': case 'c': funcion3(); break; } if ( ! (opcion=='S' || opcion=='s') ) main(); // se invoca, la funcin main(), a s misma (recursin) }

88

5.7 Se digita un nmero menor o igual a 1000 y a continuacin se muestra su representacin en nmeros romanos. //SWITCH_3.CPP #include <iostream.h> #include <conio.h> #include <string.h>//strcat(cadena1, cadena2) agrega la cadena2 a la cadena1 main(){ int numero, unidades, decenas, centenas, resto; char und[5], dec[5], cent[5]; clrscr(); cout << "Digite nmero (1 - 1000): "; cin >> numero; centenas = numero / 100; resto = numero % 100; decenas = resto /10; unidades = resto % 10; switch { case case case case case case case case case case case } switch { case case case case case case case case case case } switch { case case case case case case case (centenas) 0: strcpy(cent, 1: strcpy(cent, 2: strcpy(cent, 3: strcpy(cent, 4: strcpy(cent, 5: strcpy(cent, 6: strcpy(cent, 7: strcpy(cent, 8: strcpy(cent, 9: strcpy(cent, 10:strcpy(cent, (decenas) 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: strcpy(dec, strcpy(dec, strcpy(dec, strcpy(dec, strcpy(dec, strcpy(dec, strcpy(dec, strcpy(dec, strcpy(dec, strcpy(dec, ""); break; "X"); break; "XX"); break; "XXX"); break; "XL"); break; "L"); break; "LX"); break; "LXX"); break; "LXXX");break; "XC"); break; ""); break; "C"); break; "CC"); break; "CCC"); break; "CD"); break; "D"); break; "DC"); break; "DCC"); break; "DCCC");break; "CM"); break; "M"); break;

(unidades) 0: 1: 2: 3: 4: 5: 6: strcpy(und, strcpy(und, strcpy(und, strcpy(und, strcpy(und, strcpy(und, strcpy(und, ""); break; "I"); break; "II"); break; "III"); break; "IV"); break; "V"); break; "VI"); break;

89

case 7: strcpy(und, "VII"); break; case 8: strcpy(und, "VIII");break; case 9: strcpy(und, "IX"); break; } cout << cent << dec << und; } 5.8 ACTIVIDADES PARA REALIZAR EN GRUPO DE ESTUDIO 5.8.1 Leer un nmero desde teclado inferior o igual a mil, a continuacin muestre en pantalla la misma cantidad pero en palabras. 5.8.2 Estudie todos los algoritmos que no ha estudiado, por falta de tiempo, y efecte las actividades no resueltas an. La prxima semana es el primer parcial. 5.8.3 Recodifique al menos 5 de los algoritmos vistos en el curso anterior de pseudocdigo en espaol.

90

CAPTULO 6Error! Marcador no definido.. INSTRUCCIN REPETITIVA WHILE


6.1 METODOLOGA Estudie el tema presentado en esta leccin antes de ir a la correspondiente clase magistral. Ya en ella efecte las preguntas que considere necesarias al profesor. El Profesor explicar en esta algunos de los algoritmos de esta leccin, recuerde que es "obligatorio" el llevar este mdulo a todas las clases. En la parte de taller el profesor le pondr a efectuar pruebas de ejecucin manual a algunos de los algoritmos y le pondr a realizar otros tomados de la tarea asignada al final de esta leccin. Luego dirjase al computador y del disquete anexo cargue los archivos de los programas correspondientes a este captulo. Despus de ejecutarlos efecteles todas las modificaciones que se le ocurran, a este trabajo debe dedicarle mnimo 5 horas. Efecte pruebas de ejecucin manual a los programas que el profesor no explic en la clase magistral, en forma personal y luego en Grupo de estudio; efecte los algoritmos de tarea asignados al final de esta leccin. Debe dedicarle a esto unas tres horas. 6.2INSTRUCCIN WHILE DEL C/C++ La mayora de programas requieren que una determinada cantidad de instrucciones se ejecuten ms de una vez. Hasta el momento la nica forma de hacerlo sera o copindolas varias veces, las instrucciones, o copiarlas dentro de una funcin e invocarla repetidamente. La instruccin Mientras(while) soluciona este problema, permitiendo ejecutar reiteradamente iteraciones (ciclos, bucles, lazos, rizos). De esta forma ser posible "devolvernos" en la secuencia lgica del algoritmo. Tabla 6.1 Sintaxis general de la instruccin Mientras(while) Error! Marcador no definido. Pseudocdigo en Espaol .... Mientras <Exp. booleana> hacer .... Instruccin(es) .... Fin_Mientras .... Lenguaje C/C++

.... while (Exp. booleana){ .... Instruccin(es); .... } ....

El ciclo que produce la instruccin Mientras (while) se efectuar, ejecutando las instrucciones que contiene, mientras sea verdadera la expresin booleana que lo est controlando.

91

DIAGRAMA DE FLUJO 6.1. Instruccin Mientras (while) Error! Marcador no definido. viene el algoritmo secuencialmente Expresin Falso > booleana > Cierto/Falso? Cierto Ejecutar < instrucciones < contina el algoritmo secuencialmente La expresin booleana que controla el ciclo debe producir un resultado de verdadero o de falso, en C/C++, un valor numrico de 0 es considerado como falso, y cualquier otro valor numrico como verdadero. Cuando la instruccin mientras (while) evale la expresin booleana que controla el ciclo como falsa, la ejecucin lgica del algoritmo continuar secuencialmente despus de la instruccin que marca el fin del mbito de la instruccin, o sea el Fin_Mientras en el Pseudocdigo en Espaol o la llave de cerrar } del C/C++. La instruccin while es una palabra reservada del lenguaje C/C++, la cual debe ir seguida de una expresin lgica o relacional encerrada entre parntesis. La expresin al ser evaluada, si es verdadera decimos que entra la secuencia del algoritmo dentro del mbito de la instruccin while, y secuencialmente ir ejecutando el cdigo hasta encontrar el terminador }, en este momento el flujo del algoritmo de "devuelve" trasladndose "arriba" a la instruccin while, nuevamente; aqu la expresin es evaluada de nuevo, si es verdadera entra la secuencia otra vez al mbito de la instruccin, y as sucesivamente hasta que en un momento y dados los cambios ocasionados dentro del mbito del while, la condicin que controla el ciclo se vuelve falsa, en este momento el flujo del programa se traslada despus de la llave de cerrar } y el algoritmo seguir secuencialmente; debido a esto decimos que la instruccin while se sale por arriba. Debe estar bien claro que la expresin lgica la cual controla el ciclo while es evaluada en la parte superior y si es evaluada como falsa se "sale por arriba" buscando la llave terminal } y de all seguir secuencilmente. Si la instruccin de control no toma nunca el valor de falso se producir un ciclo infinito, y habra que interrumpir el programa con la secuencia de teclas Ctrl+Break, o con alguna otra instruccin que lo obligar a salir, lo cual no es lo ms recomendado segn los tericos de la programacin estructurada. Si al evaluarse la primera vez la condicin de control, esta llegare a ser falsa, no se ejecutaran las instrucciones contenidas en el mbito del while, sino que seguira secuencialmente el programa.

92

A continuacin se presenta un algoritmo para sumar los 10 primeros nmeros: main (){ int numero = 0, suma = 0; while (numero < 10){ numero = numero + 1; suma = suma + numero; } cout << "Sumatoria del 1 al 10 = " << suma; } En forma tabular las variables del algoritmo anterior tomarn los siguientes valores: numero suma numero<10 0 0 0<10 Verdad 1 1 1<10 Verdad 2 3 2<10 Verdad 3 6 3<10 Verdad 4 10 4<10 Verdad 5 15 5<10 Verdad 6 21 6<10 Verdad 7 28 7<10 Verdad 8 36 8<10 Verdad 9 45 9<10 Verdad 10 55 10<10 Falso En pantalla, al ejecutarlo se ver as: Error! Marcador no definido.Sumatoria del a al 10 = 55_

6.3 Se presenta la serie de los nmeros pares entre 2 y 10 //WHILE_.CPP #include <iostream.h> #include <conio.h> void main(){ int x = 0, suma = 0; clrscr(); while (x < 10 ) { x = x + 2; cout << x << " "; suma = suma + x; } cout << "\n\nLA SUMA DE LOS NUMEROS PARES ES: " << suma; }

93

6.4 Se presenta algoritmo para el clculo de la sumatoria de los n primeros trminos de la siguiente serie: 1*2*3 + 2*3*4 + 3*4*5 + 4*5*6 //WHILE_1.CPP #include <iostream.h> #include <conio.h> main(){ int i=0, n; float termino, suma=0; clrscr(); cout << "Digite el valor de N: "; cin >> n; cout << "\n"; while( i<n ){ i = i + 1; termino = i * (i+1) * (i+2); suma = suma + termino; cout << i << " * " << i+1 << " * " << i+2 << " = " << termino << endl; } cout << "\nSumatoria = " << suma; } 6.5 Se presenta un ciclo infinito. Digite Ctrl+break para terminar. //WHILE_2.CPP #include <iostream.h> const int Verdad=1; main(){ while (Verdad) cout << " Digite las teclas de CONTROL + BREAK para terminar \n"; } Se muestra en pantalla la siguiente serie: #include <iostream.h> #include <conio.h> main(){ int i=0, n; float suma=0; clrscr(); cout << "DIGITE N:"; cin >> n; while ( i < n ){ i = i + 1; if (i % 2 == 0){ cout << i << " "; suma = suma + i; } else { cout << -i << " "; suma = suma - i; } } cout << "\n\nSumatoria = " << suma; } S = - 1 + 2 - 3 + 4 -5 ... //WHILE_3.CPP

94

6.6 Se despliega en pantalla y calcula sumatoria de la siguiente serie: S = -2 +4 -6 +8 -10 +12 -14 ... //WHILE_4.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> main(){ int n, suma=0, termino, i=0, potencia; clrscr(); cout << "Digite la cantidad de trminos en la serie: "; cin >> n; while ( i < n ){ i = i + 1; if (i % 2 == 0) termino = 2 * i; else termino = 2 * (-i); suma = suma + termino; cout << setw(5) << termino ; } cout << "\n\n LA SUMA ES: " << suma; getch(); } 6.7 Se suman los N primeros trminos de la siguiente serie: 1 1 1 1 1 1 ---- + ---- + ---- + ---- + ---- + .... + ---1 3 5 7 9 N! //WHILE_5.CPP #include #include #include #include <math.h> <conio.h> <iostream.h> <iomanip.h>

main(){ float suma = 0, termino; int i = 0, N = 50; clrscr(); while (i < N){ i = i + 1; termino = 1 / pow(2*i-1, 2); cout << setw(10) << termino; suma = suma + termino; } cout << "\n\nSumatoria = " << suma; getch(); }

95

6.8 Ejemplo de graficar crculos concntricos. //WHILE_6.CPP #include <graphics.h> #include <iostream.h> #include <conio.h> main(){ int radio=0, Xo, Yo, Color; int ManejadorGrafico = DETECT, ModoGrafico; initgraph( &ManejadorGrafico, &ModoGrafico, "..\\" ); cout << "Mximas coordenadas en esta pantalla (" << getmaxx() << "," <<getmaxy() << ")\n"; cout << "Digite valor Xo del centro de los crculos: "; cin >> Xo; cout << "Digite valor Yo del centro de los crculos: "; cin >> Yo; cout << "Digite nmero del 0 al 16 para el color: "; cin >> Color; setcolor(Color); while (radio <= 200){ radio = radio + 10; circle(Xo, Yo, radio); } getch(); closegraph(); } 6.9 Ejemplo de movimiento de un crculo en la pantalla. //WHILE_7.CPP #include <graphics.h> #include <iostream.h> main(){ unsigned int Radio=40, X=0, Y=200, Color, Fondo; int ManejadorGrafico = DETECT, ModoGrafico; cout << "Digite nmero del 0 al 16 para el color del crculo: "; cin >> Color; cout << "Digite nmero del 0 al 7 para el color del fondo: "; cin >> Fondo; initgraph( &ManejadorGrafico, &ModoGrafico, "..\\" ); setbkcolor(Fondo); while (X <= getmaxx() ){ setcolor(Color); circle(X, Y, Radio); setcolor(Fondo); circle(X, Y, Radio); X = X + 2; } closegraph(); }

96

6.10 El siguiente algoritmo, para el clculo del valor del nmero e a travs de una serie, emplea en concepto de recurrencia: 2 3 N X X X 1 + --- + --- + ... + --2! 3! N! 2 X X --- le falta --2! 3 4 X --4! 3 X para obtener --3!

observe que, por ejemplo, al trmino 3 X X --- . --3! 4

as mismo:

debido a esto, y analizando ms casos, se desprende que para cada nueva iteracin que se efecte para calcular cada nuevo trmino, se tendr que multiplicar el termino anterior por X/i, donde i es el nmero de la iteracin respectiva o lo que es lo mismo el nmero de trmino. //WHILE7.CPP #include <iostream.h> #include <conio.h> main(){ float x, int i=0; termino, eX;

cout << "Digite valor de X: "; cin >> x; eX = termino = 1; while ( termino > 0E-04){ //10 elevado a la -4 en notacin cientfica i++; termino = termino * x / i; eX = eX + termino; } cout << "\n\n e elevado a la " << x << " = " << eX; getch(); }

97

6.11 ACTIVIDADES PARA REALIZAR PERSONALMENTE Y EN GRUPO DE ESTUDIO 6.12.1 Efecte prueba de ejecucin manual a todos los algoritmos del presente captulo. Muestre lo que aparece en pantalla. Disee tabulados adecuados para cada uno de los programas. 6.12.2 Rehaga algunos de los ejercicios de la Segunda Parte, pero de tal suerte que aparezca al final el siguiente mensaje: "Desea continuar (Si/No)?. E programa debe detenerse y permitir digitar "S" o "N", en caso afirmativo el programa debe pedirle nuevamente datos, y as sucesivamente hasta que digite "N" para terminar. 6.12.3 Se desea leer todas las calificaciones de una clase de Algoritmos y contar el nmero total de aprobados y reprobados. Escribir al final el promedio de el curso. 6.12.4 Calcule la nota promedio de un saln de clase y la nota mayor con el nombre del alumno. Suponga que cada alumno tiene un nmero diferente de calificaciones. Muestre para cada alumno su nota definitiva. 6.12.5 Determinar la suma y promedio de una positivos, terminados con un nmero negativo. lista indefinida de nmeros

98

CAPTULO 7Error! Marcador no definido.. INSTRUCCIN WHILE(Continuacin)


7.1 METODOLOGA Estudie el tema presentado en esta leccin antes de ir a la correspondiente clase magistral. Ya en ella efecte las preguntas que considere necesarias al profesor. El Profesor explicar en esta algunos de los algoritmos de esta leccin, recuerde que es "obligatorio" el llevar este mdulo a todas las clases. En la parte de taller el profesor le pondr a efectuar algunos algoritmos a partir de los ejercicios asignados al final del presente captulo y le pondr de tarea el resto de ellos para su casa. Luego dirjase al computador y del disquete anexo cargue los archivos de los programas correspondientes a este captulo. Despus de ejecutarlos efecteles todas las modificaciones que se le ocurran, a este trabajo debe dedicarle mnimo 5 horas. Efecte pruebas de ejecucin manual a los programas que el profesor no explic en la clase magistral, en forma personal y luego en Grupo de estudio; Debe dedicarle al estudio al menos unas seis horas. 7.2 En el siguiente programa se hace sonar el parlante del computador a varias frecuencia, segn valores digitados desde teclado. //WHILE_8.CPP #include <iostream.h> #include <conio.h> #include <dos.h> main(){ unsigned int F, Ff, Deltaf, tiempo; clrscr(); cout << "Digite frecuencia inicial en herz: "; cin >> F; cout << "Digite frecuencia final en herz: "; cin >> Ff; cout << "Digite incremento de la frecuencia:"; cin >> Deltaf; cout << "Digite milisegundos para que cada frecuencia suene: "; cin >> tiempo; while (F <= Ff ){ sound(F); cout << "\n" << F; delay(tiempo); F = F + Deltaf; } nosound(); }

99

7.3 Se imprimen en pantalla los nmeros primos entre 2 y 2000. //WHILE8.CPP #include #include #include #include <iostream.h> <iomanip.h> <conio.h> <math.h>

const int Verdad=1; const int Falso=0; main(){ int n=2, divisor, EsPrimo; clrscr(); cout << " cout << " n = 1; NUMEROS PRIMOS ENTRE 2 Y 2000 \n\n"; " << n ; //El 2 es el nico primo par

while (n < 2000){ n = n + 2; // se generan solo nmeros impares EsPrimo = Verdad; divisor = 3; while ( ( divisor <= sqrt(n) ) && EsPrimo ){ if (n % divisor == 0) EsPrimo = Falso; else divisor = divisor + 2; }//while if (EsPrimo) cout << setw(5) << n; }//while gotoxy(1,25); cout << "Digite cualquier tecla para terminar"; getch(); return 0; }

100

7.4 Se generan nmeros al azar hasta "adivinar" el nmero digitado por teclado. Adicionalmente para cada nmero generado se genera esa misma frecuencia por el altoparlante. //WHILE9.CPP #include <iostream.h> #include <conio.h> #include <stdlib.h> #include <dos.h> const int Max=1000; void main(){ int N, NumeroAlAzar=0, intentos=0; clrscr(); cout << "Digite un nmero entero entre 1 y " << Max << ": "; cin >> N; randomize(); //genera una semilla para nmeros aleatorios while (NumeroAlAzar != N){ intentos = intentos + 1; NumeroAlAzar = random(Max+1); cout << NumeroAlAzar << " "; sound(NumeroAlAzar); } nosound(); cout <<"\n\nAdivin el " <<NumeroAlAzar <<" en " <<intentos << " intentos"; } 7.5 Obtenga la sumatoria de los N primeros trminos de la siguiente serie: 1 1 1 1 1 + ---- + 3 + ---- + 5 + ---- + 7 + ---- + .... 2! 4! 6! 8! //WHILE13.CPP #include <conio.h> #include <iostream.h> void main(){ int N, Factorial=1, i=0; float SumatoriaSerie=0; clrscr(); cout << "\tn = "; cin >> N; while (i < N){ i++; SumatoriaSerie = SumatoriaSerie + i; Factorial = Factorial * i; i++; if (i <= N){ Factorial = Factorial * i; SumatoriaSerie = SumatoriaSerie + 1.0 / Factorial; } } cout << "\n\t\tSumatoria Serie = " << SumatoriaSerie; }

101

7.6 Descomposicin de un nmero en sus factores primos. //WHILE_9.CPP #include <iostream.h> #include <conio.h> #include <math.h> main(){ int numero, impar=3; clrscr(); cout << "Digite un Nmero para calcularle sus factores primos: "; cin >> numero; cout << "\n"; while ((numero % 2) == 0 ){ cout << 2 << endl; numero = numero / 2; } while (impar <= (sqrt(numero)+1) ){ while (numero % impar == 0 ){ cout << impar << endl; numero = numero / impar; } impar = impar + 2; } if ( numero > 1 ) cout << numero; } 7.7 ALGORITMO DE EUCLIDES PARA EL MAXIMO COMN DIVISOR entre dos nmeros m y n //WHILE10.CPP #include <iostream.h> #include <conio.h> main(){ int m, n, aux, diferencia; clrscr(); cout << "Digite m: "; cin >> m; cout << "Digite n: "; cin >> n; while (m != n){ if (m < n){ aux = m; m = n; n = aux; } diferencia = m - n; m = n; n = diferencia; } cout << "\n\n\tM.C.D. = " << m; }

102

7.8 La corriente en un circuito elctrico est dada por: i(t) = i(t) = -t/T 10 e Seno( 2 t/T ) 0 para 0 <= t <= T/2 para T/2 < t <= T

calclese i(t) e i(t) para intervalos de t de 0.005 segundos desde t=0 hasta t=T. #include #include #include #include <iostream.h> <iomanip.h> <conio.h> <math.h> Suponga que T=1 segundo //WHILE11.CPP

const float Pi=3.14159; main(){ float t=0, T = 1, i=0, i2, intervalo = 0.05; /* /* /* /* tiempo en segundos */ periodo, tiempo de un ciclo */ corriente instantnea, Amperios */ intensidad corriente al cuadrado */

clrscr(); cout << "\n\n tiempo i(t) i(t)"; cout << "\n-\n"; cout << setw(8) << t << setw(14) << i << setw(14) << i*i << endl; while( t <= T/2 ){ t = t + intervalo; i = 10 * exp(-t/T) * sin(2 * Pi * t/T); cout << setw(8) << t << setw(14) << i << setw(14) << i*i << endl; } cout << "\n-"; getch(); }

103

7.9 Un nmero es perfecto si la suma de sus divisores excepto l mismo es igual al propio nmero. Ejemplos: -----------------------------------------numero: 6 28 36 -----------------------------------------divisores---> 1 1 1 2 2 2 3 4 3 7 4 14 6 9 12 18 -----------------------------------------sumatoria: 6 28 55 -----------------------------------------De lo anterior el 6 y el 28 son nmeros perfectos, el 36 no lo es. //WHILE14.CPP #include <iostream.h> #include <conio.h> main(){ int numero=1, i, suma; clrscr(); cout << "Espere un momento!\n\n"; while (numero <= 2000){ suma = 0; i = 1; while ( i <= (numero / 2) ){ if (numero % i == 0) suma = suma + i; i = i + 1; } if (suma == numero) cout << "\n\t\t" << numero; numero = numero + 1; } cout << "\n\n\nHasta el 2000 estos son solamente. Digite cualquier tecla"; getch(); }

104

7.10 Leer un nmero en cualquier base, desde el 2 al 9, y obtener una respuesta en base diez. nota: no hace validaciones de si el nmero es de esa base o no Ejemplo: convertir el nmero 1110 en base 2 a base 10 0 1 2 3 1110 => en decimal: 0*2 + 1*2 + 1*2 + 1*2 = 0 + 2 + 4 + 8 = 14 para esto se debe descomponer el nmero en sus dgitos dividiendo sucesivamente entre 10, as: 1110 10 0 111 10 1 11 10 1 1 10 0

<--- se hacen divisiones entre 10 hasta obtener un cociente de cero //WHILE15.CPP

#include <iostream.h> #include <conio.h> main(){ int numero, base_origen, cociente, digito, decimal, potencia; clrscr(); cout << "\nDigite nmero en base del 2 al 9(cero para terminar): "; cin >> numero; while ( numero > 0 ){ cout << "base del nmero digitado: "; cin >> base_origen; potencia = 1; cociente = numero / 10; digito = numero % 10; decimal = digito * potencia; while (cociente > 0){ digito = cociente % 10; cociente = cociente / 10; potencia = potencia * base_origen; decimal = decimal + potencia * digito; } cout <<("en base 10 = %d\n", decimal); getch(); clrscr(); cout << "\nDigite nmero en base del 2 al 9(cero para terminar): "; cin >> numero; } }

105

7.11 ACTIVIDADES PARA REALIZAR EN GRUPO DE ESTUDIO 7.11.1 Suponga se tiene un conjunto de calificaciones, del 0 al 5, de un estudiante, construya un algoritmo para calcular la calificacin definitiva. El nmero 9 ser incluido como la calificacin centinela y se usa para verificar el fin de la introduccin de los datos, por consiguiente no deber intervenir en los clculos. Adicionalmente se deber mostrar la calificacin mayor y la menor. 7.11.2 Una partcula se mueve en una recta de acuerdo a la siguiente expresin: e = 130 + 100t - 20t2 + 2.5t3 donde e es la distancia en metros y t es le tiempo en segundos. Tabule desde un tiempo de 0 segundos con intervalo de 1 segundo hasta un tiempo de 15 segundos, el correspondiente desplazamiento e, la velocidad(primera derivada) y la aceleracin(segunda derivada). 7.11.3 Se leen desde teclado dos tiempos diferentes en horas, minutos y segundos. Calcule la diferencia entre estos dos tiempos?. Lea varios pares de valores. 7.11.4 Calcule el valor de las siguientes series efectundolas con recurrencia y sin ella: * X2 X3 e = 1 + X + ---- + ---2! 3!
X

+ .... +

XN ---N!

a) para N dado desde teclado b) hasta que N sea tal que

XN ----N!

menor a 10-4

Seno(X) =

X3 X5 ---- + ---- 3! 5! X2 X3 ---- + ---- 2! 3!

X7 ---7! X4 ---4!

+ ....

Ln(1+X) =

+ ....

7.11.5 Aceptar como entrada una serie de N valores enteros. Calcular e imprimir: A)Cuntos son pares y mltiplos de 13; B) Cuntos son divisibles por siete?; C) El mayor y el menor de la serie. 7.11.6 Coldeportes est interesada en promover el basquetball y para ello desea encontrar personas con las siguientes caractersticas: edad menor a 18, estatura mnima 1.80 m, peso mximo 90 Kg. Elabore un algoritmo en el cual se lea el nombre, la edad, estatura y el peso del deportista, verifique si cumple las condiciones impuestas. Al final diga cuntos cumplieron las condiciones. Como condicin de terminacin de lectura de datos debe colocar en pantalla: Desea continuar(s/n)?. 7.11.7 Se efectu una encuesta de poblacin, en la cual a cada persona se le pidi la siguiente informacin: SEXO, EDAD, ESTADO CIVIL, NUMERO DE HIJOS, TRABAJA, NACIONALIDAD, TIENE CASA PROPIA?. La informacin para un nmero

106

indeterminado de encuestados debe ser introducida por teclado. Elabore un algoritmo que a travs de la utilizacin de funciones, para cada caso, calcule: - Porcentaje de colombianos que tienen casa propia - Nmero de menores de edad extranjeros - Los porcentajes de mujeres que trabajan sobre el total de mujeres en la muestra y sobre el total de la poblacin. - Porcentaje de hombres que trabajan entre 19 y 25 aos. Tome como poblacin el nmero de hombres con edad en el mismo intervalo. - Porcentaje de mujeres solteras. Tome como poblacin el total de mujeres en la muestra. - Invente otras dos preguntas que se adapten a la muestra encuestada. 7.11.8 Se tiene un registros con los datos de los estudiantes de una universidad as: cdigo del estudiante, nombre y apellido, valor por materia, nmero de materias a matricular, valor del recargo por matrcula; Se requiere leer los registros de todos los estudiantes(suponga un cdigo de 0 como condicin de terminacin) e imprimir un listado con la siguiente informacin por estudiante: cdigo, nombre y apellido, valor por materia, nmero de materias, valor del recargo, total matricula; al final se debe mostrar el total a recibir por matrculas y el nmero total de estudiantes matriculados. 7.11.9 Calcular el valor de las siguientes series: S S S S S = - 1 + 2 = 1 + 2 + = 1 - 2 + = - 2 + 4 = 1 + 3 3 3 3 6 5 + + + + 4 4 4 8 7 + + 5 + 6 - 7 + 8 + ... + 100 5 + 6 + 7 - 8 + 9 + 10 + 11 - 12 + ... 5 + 6 + 7 + 8 - 9 + 10 + 11 + 12 + .... 10 + 12 - 14 + ... 9 - 11 + 13 + 15 - 17 + 19 + ...

Con la frmula N-N+41 se obtienen gran cantidad de nmeros primos, determine para qu valor de N la ecuacin falla, es decir se obtiene un nmero compuesto, y escriba todos los nmeros primos encontrados.

107

CAPTULO 8Error! Marcador no definido.. PASO POR VALOR Y RETORNO EN FUNCIONES


8.1 METODOLOGA Estudie el tema presentado en esta leccin, sobre el paso de parmetros por valor y el retorno de valores de las mismas, antes de ir a la correspondiente clase magistral. El Profesor explicar la mecnica del paso de parmetros por valor en en cualquier lenguaje en general y en el C++ en particular. A la clase magistral algunos de los algoritmos de esta leccin, recuerde que es "obligatorio" el llevar este mdulo a todas las clases. En la parte de taller el profesor le pondr a efectuar pruebas de ejecucin manual a algunos de los algoritmos y le pondr a realizar otros tomados de la tarea asignada al final de esta leccin. Luego dirjase al laboratorio de computadores y del disquete anexo cargue los archivos de los programas correspondientes a esta leccin. Despus de ejecutarlos efecteles todas las modificaciones que se le ocurran, a este trabajo debe dedicarle mnimo 5 horas. Efecte pruebas de ejecucin manual a los programas que el profesor no explic en la clase magistral; efecte los algoritmos de tarea asignados al final de esta leccin. 8.2 PASO DE PARMETROS POR VALOR EN FUNCIONES. Las funciones pueden ser utilizadas para pasar parmetros al ser invocadas; este paso de parmetros es de dos formas: paso de parmetros por valor y paso de parmetros por referencia. En el caso de parmetros por valor: el valor de la variable que se est pasando, es asignado a la variable local que es declarada al definir la funcin. Tanto la variable que se utilice al efectuar la invocacin como la que la recibe "por valor" deben ser del mismo tipo, en caso contrario se presentar un error de tipo. 8.3 El siguiente ejemplo, SONIDO1.CPP, debe copiarlo en el computador y ejecutarlo para poder seguir adecuadamente las explicaciones(no copie los nmeros de la izquierda): 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: #include <dos.h> NOTA(int Herz){ sound(Herz); delay(1000); } main(){ int frecuencia=260; NOTA(frecuencia); frecuencia=440; NOTA(frecuencia); nosound(); } //SONIDO1.CPP

109

Al ejecutar el programa anterior, iniciando por la funcin main(), se define la variable frecuencia en la lnea 8 y simultneamente se inicializa con el valor de 260; En la lnea 10 se efecta invocacin de la funcin NOTA() y se pasa el parmetro frecuencia el cual tiene almacenado el valor de 260. El flujo del programa se traslada a la lnea 2 en la cual est definida la funcin NOTA(), aqu el valor que la variable frecuencia a pasado "por valor" es asignado a la variable local Herz() la cual tomar el valor de 260; la variable Herz solo es definida despus de la invocacin de la funcin NOTA(). Continuar, el programa secuencialmente en la instruccin de la lnea 3, en la cual la funcin sound() har sonar el altoparlante del computador en el valor que tenga almacenado Herz, es decir 260. Contina inmediatamente en la lnea 4, donde la funcin delay detendr al computador por 1000 milisegundos, despus de esto, en la lnea 4, termina la funcin NOTA() y de esta forma se retorna a la instruccin siguiente a la que efecto la invocacin, en este caso la instruccin de la lnea 12. Es de sealar que cuando la funcin NOTA() termina, la variable local frecuencia es desasignada de la memoria, vale decir "no existir ya". En la lnea 12 se asigna a la variable local a la funcin main() frecuencia el valor de 440. A continuacin en la lnea 13 se efecta una nueva invocacin de la funcin NOTA(), pasando el valor que tiene frecuencia a la variable local Herz, lnea 2, la cual es asignada a la memoria nuevamente y recibe el valor de 440. Debido a la lnea 3 sonar el altoparlante ahora a esta nueva frecuencia, almacenada en la variable local Herz, y debido a la instruccin delay() de la lnea 4 por espacio de 1000 milisegundos; terminando la funcin NOTA() en la lnea 5. Se retorna a la instruccin de la lnea 14: nosound() la cual har que deje de sonar el altoparlante del computador, terminando el programa en la lnea 15. Es de mucha importancia tener en cuenta que las variables locales solo tienen mbito dentro de su correspondiente funcin. Se les asigna un lugar en memoria cuando son definidas dentro de la funcin, cuando la correspondiente funcin termina y se retorna a donde fue invocada, todas las variables locales "desaparecern". En el programa anterior si dentro de la funcin NOTA() utilizramos el identificador frecuencia nos dara un error de identificador desconocido, ya que este es local a la funcin main(). Y viceversa, si dentro de la funcin main() utilizramos el identificador Herz nos dara un error de identificador desconocido, ya que este es local a la funcin NOTA(). Simule estos dos ltimos errores y todo los que se le ocurra en este momento en el computador.

110

8.4 El siguiente programa permite or sonidos en Herzios. Mediante funciones: sound() y nosound(), incorporadas en la unidad <dos.h>. Este programa no corre en las versiones de C++ para Windows. #include <iostream.h> #include <conio.h> #include <dos.h> //SONIDO3.CPP Sonido(int f, int ms){ sound(f); delay(ms); nosound(); } main(){ int Frecuencia, Segundos; clrscr(); cout << "Digite una frecuencia en Herz(ciclo/segundo): "; cin >> Frecuencia; cout << "Segundos que desea suene: "; cin >> Segundos; Sonido(Frecuencia, Segundos*1000); Sonido(Frecuencia*2, Segundos*1000); }

111

8.5 El siguiente algoritmo utiliza una funcin, la cual es invocada por valor y devuelve a su vez otro. Especficamente efecta una conversin de unidades termomtricas. #include <iostream.h> #include <conio.h> //FUNCION3.CPP float Fahrenheit(float grados){ float F; F = 9.0 / 5 * grados + 32; cout << "\nson " << F << " Fahrenheit"; } void main(){ float centigrados; clrscr(); cout << "Digite temperatura en grados centgrados: "; cin >> centigrados; // se invoca a continuacin funcin Fahrenheit(): Fahrenheit(centigrados); getch(); } En el anterior algoritmo al ejecutarlo, se detendr inicialmente debido al efecto de la instruccin de lectura: cin >> centgrados; presentando el siguiente aspecto en pantalla: Error! Marcador no definido.Digite temperatura en grados centgrados: _

Al digitar una temperatura, un nmero, y dar la tecla de <ENTRAR>, el algoritmo continuar secuencialmente, efectuar la invocacin de la funcin Fahrenheit, esta retornar un resultado, el cual ser escrito en pantalla, se detendr nuevamente en la instruccin getch(), presentando el siguiente aspecto: Error! Marcador no definido.Digite temperatura en grados centgrados: 100 son 212 Fahrenheit_

112

8.6 El siguiente programa permite or notas musicales entre 260 Hz y 520 Hz, mediante funciones: sound() y nosound(), incorporadas en la unidad <dos.h>. #include <iostream.h> #include <conio.h> #include <dos.h> //SONIDO2.CPP Do(int Tempo){ sound(260); cout << "Do "; delay(Tempo); } Re(int Tempo){ sound(290); cout << "Re "; delay(Tempo); } Mi(int Tempo){ sound(322); cout << "Mi "; delay(Tempo); } Fa(int Tempo){ sound(342); cout << "Fa "; delay(Tempo); } Sol(int Tempo){ sound(390); cout << "Sol "; delay(Tempo); } La(int Tempo){ sound(440); cout << "La "; delay(Tempo); } Si(int Tempo){ sound(494); cout << "Si "; delay(Tempo); } DO(int Tempo){ sound(520); cout << "Do "; delay(Tempo); } Silencio(int Tempo){ nosound(); cout << "\nSilencio\n"; delay(Tempo); } main(){ int ms; // milisegundos clrscr(); cout << "Milisegundos que desea suene cada nota: "; cin >> ms; Do(ms); Re(ms); Mi(ms); Fa(ms); Sol(ms); La(ms); Si(ms); DO(ms); Silencio(ms); ms/=2; Do(ms); Re(ms); Mi(ms); Fa(ms); Sol(ms); La(ms); Si(ms); DO(ms); getch(); nosound(); }

113

8.7 RETORNO DE VALORES EN FUNCIONES Hasta ahora todas las funciones que hemos utilizado no han devuelto nada(void), empero, con la palabra reservada return podemos hacer que la secuencia de ejecucin de la funcin se interrumpa y devuelve o retorne "al sitio" en el que fue invocada un valor. Una funcin puede tener ms de una instruccin de retorno(return), empero por la primera que pase la secuencia de ejecucin del programa, la funcin terminar retornando el valor correspondiente. El profesor el siguiente ejemplo: 8.8 El siguiente algoritmo calcula el nmero medio entre tres enteros, no es el promedio. Ver el programa IF_01.CPP como comparacin. //RETURN_1.CPP #include <iostream.h> #include <conio.h> CalculaMedio(int a, int b, int c){ int Medio; if ( (b<a Medio = if ( (a<b Medio = if ( (a<c Medio = } main(){ int a, b, c; clrscr(); cout << "Digite entero: "; cin >> a; cout << "Digite entero: "; cin >> b; cout << "Digite entero: "; cin >> c; cout << CalculaMedio(a, b, c) << " es el del medio"; } 8.9 El siguiente algoritmo utiliza una funcin, la cual es invocada por valor y devuelve a su vez otro. Especficamente efecta una conversin de unidades termomtricas. Comparar con el programa FUNCION3.CPP. //RETURN_2 #include <iostream.h> #include <conio.h> float Fahrenheit(float grados){ float F; F = 9.0 / 5 * grados + 32; return (F); //la funcin retorna el valor de F, a donde fue invocada && a<c) || (c<a && a<b) ) a; && b<c) || (c<b && b<a) ) b; && c<b) || (b<c && c<a) ) c;

return Medio;

114

} void main(){ float centigrados; clrscr(); cout << "Digite temperatura en grados centgrados: "; cin >> centigrados; //se invoca funcin cout << "\nson " << Fahrenheit(centigrados) << " Fahrenheit"; getch(); } 8.10 El siguiente programa permite leer desde el teclado dos nmeros y a continuacin desplegar en pantalla comentarios con uno de los siguientes mensajes: "los dos son positivos" o "los dos son negativos" o "tienen diferente signo". Comparar con el programa IF_03.CPP. RETURN_3.CPP #include <iostream.h> #include <conio.h> #include <string.h> char *CompararValores(int valor1, int valor2){ char *mensaje;//Observe que es otra forma de manejar cadenas de caracteres //la cual utilizaremos en prximos cursos. if ( valor1 > 0 && valor2 > 0) strcpy(mensaje, "\nLOS DOS SON POSITIVOS"); else if (valor1 < 0 && valor2 < 0) strcpy(mensaje, "\nLOS DOS SON NEGATIVOS"); else strcpy(mensaje, "\nTIENEN DIFERENTE SIGNO"); return mensaje; } void main(){ float a, b; clrscr(); cout << "Digite real: "; cin >> a; cout << "Digite real: "; cin >> b; cout << CompararValores(a, b); getch(); }

115

8.11 Encontrar races de funcin entre intervalos dados por error y ensayo: Evaluar la funcin: y = x^3 - 9x^2 + 23x - 15 entre el intervalo a = - 1 y b = 7 con incrementos de x de 0.5. Las tres races se obtienen donde la y = 0. Cambie la lnea donde esta evaluada la funcin con otras expresiones y corra el programa repetidamente con nuevos intervalos e incrementos y determine las races en cada caso. //WHILE12.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <math.h> float F(float x){ return (pow(x,3) - 9*pow(x,2) + 23*x - 15); } main(){ float a, b, X, Y, DeltaX; clrscr(); cout << "Digite valor inicial intervalo (a): "; cin >> a; cout << "Digite valor inicial intervalo (b): "; cin >> b; cout << "Digite incremento de X: "; cin >> DeltaX; X = a; cout << "" << endl; cout << " X Y " << endl; cout << "" << endl; while (X <= b) { Y = F(X); //Invoca funcin F() cout << setw(12) << X << setw(12) << Y; if (Y == 0) cout << " Raz exacta" << endl; else cout << endl; X = X + DeltaX; } cout << ""; } 8.12 Obtener el ensimo trmino de la serie de Fibonacci y decir si es primo. Observe hasta que N se puede ejecutar este programa, sin que cometa error. //WHILE16.CPP #include <iostream.h> #include <conio.h> int Fibonacci (int N){ // Calcula el ensimo trmino de la serie de Fibonacci int ultimo = 1, penultimo = 0, Fib, i=2; switch (N){ case 1: return (0); case 2: return (1); default:

116

while ( i < N ) { i++; Fib = penultimo + ultimo; penultimo = ultimo; ultimo = Fib; } return (Fib); } } EsPrimo (int numero){ int impar = 3; if (numero == 2) //Si es 2 devuelve 1. El 2 es el nico par primo return(1); if (numero % 2 == 0) // Si es par devuelve 0(falso). No es primo return (0); while (numero % impar != 0) //Prueba si da divisin exacta entre impares impar = impar + 2; if (numero == impar) //Si impar es igual a numero es primo return (1); else return (0); //El nmero evaluado no es primo } FibonacciEsPrimo (int N){ int F; F = Fibonacci (N); //Calcula el ensimo trmino de la serie de fibonacci if ( EsPrimo (F) ) cout << "Fibonacci = " << F << " es primo\n"; else cout << "Fibonacci = " << F << " no primo\n"; } main(){ int N; clrscr(); cout << "Calcula ensimo trmino serie Fibonacci y se dice si es primo\n\n"; cout << "Digite un N(0 para terminar): "; cin >> N; while (N > 0){ FibonacciEsPrimo (N); cout << "Digite un N(0 para terminar): "; cin >> N; } }

117

CAPTULO 9Error! Marcador no definido.. INSTRUCCIN REPETITIVA DESDE


9.1 METODOLOGA Estudie el tema presentado en esta leccin antes de ir a la correspondiente clase magistral. El Profesor explicar en la clase magistral algunos de los algoritmos de esta leccin, recuerde que es "obligatorio" el llevar este mdulo a todas las clases. En la parte de taller el profesor le pondr a efectuar pruebas de ejecucin manual a algunos de los algoritmos y le pondr a realizar otros tomados de la tarea asignada al final de esta leccin. Luego dirjase al laboratorio de computadores y del disquete anexo cargue los archivos de los programas correspondientes a esta leccin. Despus de ejecutarlos efecteles todas las modificaciones que se le ocurran, a este trabajo debe dedicarle mnimo 5 horas. Efecte pruebas de ejecucin manual a los programas que el profesor no explic en la clase magistral; efecte los algoritmos de tarea asignados al final de esta leccin. 9.2 INSTRUCCIN DESDE O PARA La estructura repetitiva Desde(FOR) permite que las instrucciones las cuales contiene en su mbito, se ejecuten un nmero de veces determinado. DIAGRAMA DE FLUJO 10.1 Instruccin repetitiva Para(FOR) Error! Marcador no definido. viene secuencialmente el algoritmo contador = ValorInicial falso contador <= ValorFinal? cierto Ejecutar instrucciones contador = contador + incremento (esto lo hace "automticamente") sigue secuencialmente el algoritmo ... ...

Una variable de control, que llamamos contador, se incrementa o decrementa desde un valor inicial hasta un valor final, dado por el incremento o decremento correspondiente.

119

TABLA 9.1 Sintaxis general de la instruccin FOR del C/C++ Error! Marcador no definido. for(Contador=ValorInicial; Contador<=ValorFinal; contador=contador+incremento){ ...; Instruccin(es); ...; } Nota: La anterior solo es la forma general del FOR, tenida en cuenta por la mayora de lenguajes de programacin. El C/C++ permite otras caractersticas que lo hacen muy flexible, potente y extrao para los dogmticos.

9.3 Efecte prueba de ejecucin manual del siguiente algoritmo. //FOR_01.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> main(){ int N, i; float suma = 0; clrscr(); cout << "Introducir un nmero entero: "; cin >> N; for( i = 1; i <= N; i++){ cout << setw(5) << i; suma = suma + i; } cout << "\n\nla suma del 1 al " << N << " es " << suma; getch(); } Efecte prueba manual al siguiente algoritmo, el cual cuenta de dos en dos, desde el 0 al 400 //FOR_02.CPP #include <oistream.h> #include <conio.h> main(){ int x, y; clrscr(); for(x=0, y=0 ; x + y <= 400; x++, y++) cout << "\t" << x + y; getch(); }

120

9.4 Cuenta del 1 al 50 varias veces, con variantes de la instruccin FOR. //FOR_7.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> main(){ int i=1; clrscr(); for( ; i<=50; i++) cout << setw(5) << i; cout << "\n\n"; for(i=1; i<=50; i++) cout << setw(5) << i; cout << "\n\n"; i = 0; for( ; i<50; ) { i++; cout << setw(5) << i; } cout << "\n\n"; for(i=1 ; i<=50; ) { cout << setw(5) << i; i++; } cout << "\n\n"; i = 0; for( ; ; ) { i ++; if (i > 50) break; else cout << setw(5) << i; } getch(); }

121

9.5 Se calcula la siguiente serie: S = 1 + 2 + 3 - 4 + 5 + 6 + 7 - 8 +... //FOR_3.CPP #include <iostream.h> #include <conio.h> main(){ int n, suma=0, i=1; clrscr(); cout << "DIGITE UN VALOR PARA N:"; cin >> n; gotoxy(1,4); for ( ; i <= n ; i++){ if ( i % 4 == 0 ){ cout << "\t" << -i; suma = suma - i; } else { suma = suma + i; cout << "\t " << i; } } cout << "\n\nSumatoria = " << suma; getch(); } 9.6 Efecte prueba de ejecucin manual del siguiente algoritmo. //FOR_4.CPP #include <iostream.h> #include <conio.h> main(){ int i, j, termino=0; clrscr(); for( i = 1; i <= 6; i++ ) { for( j = i; j <= 6; j++ ) { termino = termino + i; cout << termino << "\t"; } cout << "\n"; } }

122

9.7 Expansin binomial: n n-i i (a+b)_ = ( n! / (i! (n-i)!)) a b i=0 El siguiente algoritmo muestra en pantalla los coeficientes de la expansin binomial para un N dado por teclado: //FOR_5.CPP #include <iostream.h> #include <conio.h> float factorial(int numero){ int i; float f=1; for(i=1; i<=numero; i++) f = f * i; return f; } main(){ int n, i, a, b, coeficiente; clrscr(); cout<<"Digite exponente(n) para calcular coeficientes del binomial (a+b)_: "; cin >> n; cout <<"\n"; for(i=0; i<=n; i++) { coeficiente = factorial(n) / (factorial(i)*factorial(n-i)); cout << coeficiente << " "; } getch(); return 0; }

123

9.8 Expansin binomial y tringulo de Pascal. n n-i i (a+b)_ = ( n! / (i! (n-i)!)) a b i=0 El siguiente algoritmo muestra en pantalla los coeficientes de la expansin binomial para un N dado por teclado. Por ejemplo para N=10: 1 1 1 1 1 1 5 1 6 4 10 3 6 10 2 3 4 5 1 1 1 1

1 1

1 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 9 36 84 126 126 84 36 9 1 10 45 120 210 252 210 120 45 10

1 //FOR5.CPP

#include <iostream.h> #include <iomanip.h> #include <conio.h> float factorial(int numero){ int i; float f=1; for(i=1; i<=numero; i++) f = f * i; return f; } main(){ int n, i, a, b, coeficiente, espacio; clrscr(); for(n=0; n<=10; n++){ for(espacio=1; espacio <=40-2*n; espacio++) cout << " "; for(i=0; i<=n; i++) { coeficiente = factorial(n) / (factorial(i)*factorial(n-i)); cout << setw(5) << coeficiente ; } cout << endl; } getch(); return 0; }

124

9.9 El siguiente algoritmo presenta las equivalencias de centgrados y fahrenheit entre un valor inicial y uno final. #include <iostream.h> #include <conio.h> float Centigrado_A_Fahrenheit(float Centigrados){ float Fahrenheit; Fahrenheit = 32 + 9 * Centigrados / 5; return Fahrenheit; } main(){ float C, Co, Cf, Delta, F;

temperatura

entre

//FOR_6.CPP

clrscr(); cout << "Digite temperatura inicial en centgrados: "; cin >> Co; cout << "Digite temperatura final en centgrados: "; cin >> Cf; cout << "Digite intervalo de temperatura en centgrados: "; cin >> Delta; cout << "\nCENTIGRADOS FAHRENHEIT\n"; cout << " --------------------------"; for(C = Co; C <= Cf; C = C + Delta) { F = Centigrado_A_Fahrenheit(C); cout << "\n\t" << C << "\t" << F; } cout << "\n--------------------------"; } 9.10 Se presentan en pantalla las dimensiones de diversos tipos de papel de la serie A de la norma DIN: #include <iostream.h> #include <iomanip.h> #include <conio.h> //FOR_12.CPP void main(){ int ancho= 841, largo=1188, serie, aux; clrscr(); cout << "------------------------------------------- \n"; cout << " FORMATOS DE PAPEL DIN CLASE A \n"; cout << "------------------------------------------- \n"; cout << "SERIE ANCHO(mm) LARGO(mm) \n"; cout << "------------------------------------------ \n"; for (serie=0; serie<=8; serie++){ cout << serie << setw(15) << ancho << setw(15) << largo << endl; aux = ancho; ancho = largo / 2; largo = aux; } }

125

9.11 Efecte prueba Escriba enunciado. #include <iostream.h> #include <conio.h>

de

ejecucin

manual al siguiente algoritmo. Qu hace? //FOR_08.CPP

total( int x ){ int suma = 0, i, contador; for( i = 0; i <= x; i=i+1) { suma = suma + i; for(contador = 0 ; contador < 10; contador++) cout << "."; cout << "la suma del 0 al " << i << " es " << suma << "\n"; } } main(){ int t; clrscr(); cout << "Digitar un nmero: "; cin >> t; total(t); getch(); } 9.12 El siguiente algoritmo genera un "cuadrado de nmeros". //FOR_9.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> main(){ int N, i, j; clrscr(); cout << "Digite un nmero entero entre 1 y 20: "; cin >> N; for (i=1; i<=N; i++){ for (j=1; j<=N; j++){ cout << setw(3) << j; } cout << endl; } getch(); }

126

9.13 Se genera un "cuadrado de nmeros". Efecte prueba manual de ejecucin. //FOR10.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> const int N=5; main(){ int f, c, MayorFila = N; clrscr(); for (f=1; f<=N; f++){ for (c=f; c<=MayorFila; c++) cout << setw(10) << c; cout << endl; MayorFila++; } getch(); } 9.14 Se generan combinaciones desde la variable "inicial" hasta la variable "final" tomados de a tres. Ensaye con las siguientes parejas: 1 y 3, 4 y 6, 1 y 9 como valores inicial y final respectivamente. //FOR11.CPP #include <iostream.h> #include <conio.h> main(){ int i, j, k, inicial, final, combinaciones=0; clrscr(); cout << "Digite valor inicial: "; cin >> inicial; cout << "Digite valor final: "; cin >> final; cout << endl; for (i=inicial; i<=final-2; i++) for (j=i+1; j<=final-1; j++) for (k=j+1; k<=final; k++){ combinaciones++; cout << i << "\t" << j << "\t" << k << endl; } cout << "\nTotal de combinaciones: " << combinaciones; getch(); }

127

9.15 Se digita una frase y luego se centra en la pantalla. //FOR_11.CPP #include #include #include #include <string.h> <iostream.h> <conio.h> <stdio.h>

void main(){ char cadena[20]; int longitud; clrscr(); cout << "Digite frase para luego centrarla en pantalla: \n"; gets(cadena); clrscr(); gotoxy(1,12); for(longitud = (80- strlen(cadena)) / 2;longitud >0; longitud--) cout << " "; cout << cadena; } 9.16 Se digita un nmero entero y se determina si es primo. //FOR13.CPP #include <iostream.h> #include <conio.h> #include <math.h> const int verdad=1; const int falso=0; main(){ int N, impar, EsPrimo=verdad; clrscr(); cout << "Digite un entero: "; cin >> N; if (N < 2) EsPrimo = falso; else if (N > 2) if (N % 2 == 0) EsPrimo = falso; else for(impar = 3; impar <= sqrt(N) && EsPrimo; impar = impar + 2 ) if (N % impar == 0 ) EsPrimo = falso; if (EsPrimo) cout << " Es primo"; else cout << " No es primo"; }

128

9.17 Se encuentra el valor aproximado de la funcin trigonomtrica Seno con la siguiente serie: 3 5 X X Seno( X ) = X - ---- + ---- 3! 5! 7 9 11 N X X X X ---- + ---- - ---- + .... ---7! 9! 11! N!

el ngulo X est en radianes. Y se compara con la funcin Sin() incorporada en la librera math.h //FOR12.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <math.h> const int N=20; //Son los trminos en la serie. Entre ms, mejor la precisin const float Pi=3.14159; main(){ int i, angulo; float termino, senX, X; clrscr(); cout << "----------------------------------------------- \n"; cout << " CALCULO DE FUNCIN TRIGONOMETRA SENO\n"; cout << "-----------------------------------------------\n"; cout << "ANGULO SERIE math.h DIFERENCIA\n"; cout << "-----------------------------------------------\n"; for (angulo=0; angulo<=180; angulo = angulo + 10){ X = angulo * Pi / 180; termino = X; senX = termino; for (i=2; i<=N; i++){ termino = - termino * pow(X,2)/((2*i-1)*(2*i-2)); senX = senX + termino; } cout << angulo; cout <<setw(15)<<senX<<setw(15) <<sin(X) <<setw(15) <<senX-sin(X)<<endl; } getch(); }

129

9.18 ACTIVIDADES PARA EFECTUAR EN GRUPO DE ESTUDIO 9.18.1Calcular el ensimo trmino de la serie de Fibonacci, dada por: 0 9.18.2 La infinita: funcin 1 1 2 3 se 5 8 13 21 34 55 89 ... la suma de la serie

EXP(x)

puede

calcular

mediante

x2 x3 xn e = 1 + x + ---- + ---- + ... + ---2! 3! n!


x

9.18.3 se desea calcular el valor EXP(x) para x entre 0.0 y 1.0 con incrementos de 0.1, Calcule dicho valor tomando solamente los 10 primeros trminos de la serie. 9.18.4 Si se suman los nmeros impares se obtienen los cuadrados as: 1 1 + 3 1 + 3 + 5 1 + 3 + 5 + 7 = = = = 1 4 9 16 = = = = 12 22 32 42

empleando esta curiosidad matemtica, calcular y escribir el cuadrado de los N primeros nmeros naturales. 9.18.6 Una produccin: Erro r! Marca dor no defin ido.M ESES-> AO 1994 1995 1996 1997 1998 1 empresa tiene para los ltimos aos el siguiente cuadro de

10

11

12

234 4 532 1 567 345 3 635 3

454 3 655 543 654 4 653 3

567 56 234 345 5 764 3

454 5 754 5 665 123 4 864 3

434 454 5 976 753 3 875 5

345 2 454 4 345 4 345 4 913 4

454 2 123 4 554 754 4 956 6

123 3 186 6 545 3 744 3 966 5

454 5 665 4 453 2 343 2 965 4

5454 234 3322 6543 1045 4

5453 434 5332 3466 9544

2321 678 2345 6543 9555

Calcular:

130

1) El promedio de produccin de cada uno de los aos. 2) El mes de mayor produccin de 1993. 3) El ao de menos produccin. 9.18.5 El nmero de combinaciones, C, de N objetos tomados M cada vez, est dado por: N! C = ------------M! (N - M)! calcule el nmero de combinaciones, C, para N objetos de M en M cada vez. Elaborar dos algoritmos por separado de la siguiente forma: 1) Defina una funcin para el clculo del factorial. 2) Elabore algoritmo con una expresin recurrente.

131

CAPTULO 10. INSTRUCCIN REPRTITIVA DO...WHILE


10.1 METODOLOGA Estudie el tema presentado en esta leccin antes de ir a la correspondiente clase magistral. Ya en ella efecte las preguntas que considere necesarias al profesor. El Profesor explicar en la clase magistral algunos de los algoritmos de esta leccin, recuerde que es "obligatorio" el llevar este mdulo a todas las clases. En la parte de taller el profesor le pondr a efectuar pruebas de ejecucin manual a algunos de los algoritmos y le pondr a realizar otros tomados de la tarea asignada al final de esta leccin. Luego dirjase al computador y del disquete anexo cargue los archivos de los programas correspondientes a este captulo. Despus de ejecutarlos efecteles todas las modificaciones que se le ocurran, a este trabajo debe dedicarle mnimo 5 horas. Efecte pruebas de ejecucin manual a los programas que el profesor no explic en la clase magistral, en forma personal y luego en Grupo de estudio; efecte los algoritmos de tarea asignados al final de esta leccin. Debe dedicarle a esto unas tres horas. 10.2 INSTRUCCIN DO...WHILE Tabla 10.1 Sintaxis general de la instruccin Hacer...Mientras Error! Marcador no definido. Pseudocdigo en Espaol .... Hacer .... Instruccin(es) .... Mientras <Exp. booleana> .... Lenguaje C/C++

.... do{ .... Instruccin(es); .... }while (Exp. booleana); ....

El ciclo que produce la instruccin Mientras (while) se efectuar, ejecutando las instrucciones que contiene, mientras sea verdadera la expresin booleana que lo est controlando. La expresin booleana que controla el ciclo debe producir un resultado de verdadero o de falso, en C/C++, un valor numrico de 0 es considerado como falso, y cualquier otro valor numrico como verdadero. Cuando la instruccin mientras (while) evale la expresin booleana que controla el ciclo como falsa, la ejecucin lgica del algoritmo continuar secuencialmente en la siguiente instruccin.

133

DIAGRAMA DE FLUJO 1O.1. Instruccin Hacer...Mientras (do...while) Error! Marcador no definido. viene el algoritmo secuencialmente Ejecutar instrucciones < Expresin booleana > Cierto/Falso? Verdadera Falso contina el algoritmo secuencialmente ... ...

A continuacin se presenta un algoritmo para sumar los 10 primeros nmeros: main (){ int numero = 0, suma = 0; do{ numero = numero + 1; suma = suma + numero; }while (numero < 10); cout << "Sumatoria del 1 al 10 = " << suma; } El resultado es idntico al presentado con la intruccin while, en lecciones anteriores, el usuario dira que es el mismo programa, se dice que es transparente el cambio para l, solo para el programador sera evidentemente diferente.

134

10.3 Algoritmo de Euclides sobre el mximo comn divisor. //DO_1.CPP #include <iostream.h> #include <conio.h> void main(){ int m, n, aux, resto; clrscr(); cout << "Digite m: "; cin >> m; cout << "Digite n: "; cin >> n; do { if (m < n) { aux = m; m = n; n = aux; } resto = m - n; m = n; n = resto; } while (m != n); cout << "\nEl m.c.d = " << m << "\n"; } 10.4 El siguiente programa permite mostrar los cdigos de las teclas y secuencias de teclas del teclado. Tengalo muy pendiente, ya que le ser de gran utilidad en el trabajo de sus proyectos de software. Verifique los cdigos producidos con las tablas presentadas en el apndice, para cdigos ASCII, y para secuencias de ESC cdigos extendidos. #include <iostream.h> #include <conio.h> main(){ int c; clrscr(); cout << "Digite ESC para terminar el programa\n" do{ c=getch(); if(c==0){ cout << c << " "; c=getch(); cout << c << "\n"; } else cout << c << "\n"; } while(c!=27); } //TECLADO.CPP

135

10.5 Plantilla del diseo de un men con invocacin de funciones. //DO_3.CPP #include #include #include #include <iostream.h> <conio.h> <dos.h> <ctype.h>

void funcion1(void){ clrscr(); cout << "Funcin 1"; delay(1000); } void funcion2(void){ clrscr(); cout << "Funcin 2"; delay(1000); } void funcion3(void){ clrscr(); cout << "Funcin 3"; delay(1000); } void main(){ char opcion; int terminar=0; do{ clrscr(); cout << "\n\t\tA. .....\n"; cout << "\n\t\tB. .....\n"; cout << "\n\t\tC. .....\n"; cout << "\n\t\tS. Salir\n"; opcion = toupper(getch()); switch (opcion) { case 'A' : funcion1(); break; case 'B' : funcion2(); break; case 'C' : funcion3(); break; case 'S' : terminar = 1; } } while (!terminar); }

136

10.6 El siguiente programa convierte las teclas ASDFGHJK en teclas musicales. //DO_5.CPP #include <iostream.h> #include <conio.h> #include <dos.h> #include <ctype.h> main(){ char nota='A'; int tiempo=0; clrscr(); cout << "DIGITE EN EL TECLADO LAS LETRAS A S D F G H J K"; cout << "\n en cualquier orden, y oir las notas musicales"; cout << "\npara terminar digite cualquier otra tecla\n"; do{ tiempo++; if(kbhit() || tiempo>2000){ if (tiempo>2000) nosound(); nota = toupper(getch()); tiempo=0; switch ( nota ){ case 'A':cout << "Do "; sound(260); break; case 'S':cout << "Re "; sound(290); break; case 'D':cout << "Mi "; sound(322); break; case 'F':cout << "Fa "; sound(342); break; case 'G':cout << "Sol "; sound(390); break; case 'H':cout << "La "; sound(440); break; case 'J':cout << "Si "; sound(494); break; case 'K':cout << "Do "; sound(520); break; } } } while ( nota=='A' || nota =='S' || nota=='D' || nota=='F' || nota=='G' || nota =='H' || nota=='J' || nota=='K' ); nosound(); }

137

10.7 ACTIVIDADES PARA EFECTUAR EN GRUPO DE ESTUDIO Y/O PERSONALMENTE 10.7.1 Suponer que la administracin de impuestos calcula la retencin en la fuente(R) por trabajador; para salarios brutos(SB) mayores a tres salarios mnimos en la siguiente forma: R = SB/5 - 40000 * NH, (NH:Nmero de Hijos). Cada empleado tiene una tarjeta as: Cdigo del empleado, nmero de hijos, salario bsico, total de retencin pagado hasta el momento. Calcular e imprimir la retencin de este mes y la retencin acumulada por cada trabajador. 10.7.2 Calcular la cantidad a pagar de matrcula por cada estudiante de la siguiente forma: El total a pagar es igual a los cargos fijos ms los cargos variables. Los Cargos fijos son iguales a un salario mnimo. Los Cargos Variables se calculan como un 0.2 del patrimonio ms un 0.15% de la renta gravable, tomados estos datos de la correspondiente declaracin de renta de los acudientes del estudiante. En cada registro a leer encontraremos los siguientes campos: cdigo del estudiante, monbre y apellido, patrimonio, renta, y se debe obtener una impresin en papel del nombre y apellido del estudiante, renta, patrimonio, cargos fijos, cargos variables y el total de la matrcula a cancelar. 10.7.3 Suponga que la Administracin de Impuestos calcula la retencin en la fuente, segn la siguiente tabla (es solo un ejemplo ficticio): a. b. c. d. Hasta sueldos de $ 700.000 y ms de 2 hijos no pagan. Hasta sueldos de $ 700.000 y 1 2 hijos un 1%. Ms de $ 900.000 y menos de $1'850.000 pagan un 2%. Ms de $1'850.000 pagan un 4%.

Se debe leer informacin, para un nmero indeterminado de personas, la cual contenga: Nmero de Cdula, Sueldo Mensual, Nmero de Hijos, para una empresa cualquiera y a continuacin producir los clculos correspondientes. 10.7.4 Una universidad est interesada en elaborar una relacin de los estudiantes que estando casados trabajen. Se tienen registros con los datos de la facultad, nombre del estudiante, edad, estado civil (casado, soltero), situacin laboral (trabaja, no trabaja). El listado debe darse a nivel de Facultad, Universidad y ciudad, para lo cual los datos entran ordenados por esta clave. 10.7.5 Se tienen en una empresa cementera registros con los siguientes campos: ao de produccin, desde 1970 a 1996, toneladas producidas, toneladas vendidas localmente, toneladas exportadas, precio de venta por tonelada. Calcular lo siguiente: - Inventario acumulado(stock) al 01 de enero de 1997 - Ingresos, en pesos $, para cada uno de los aos - Total toneladas exportadas.

138

CAPTULO 11. ARREGLOS UNIDIMENSIONALES


11.1 INTRODUCCIN En ciencias de la computacin un arreglo lineal, o vector, es una coleccin de elementos del mismo tipo, en donde cada uno, puede ser accesado o referido en forma directa, y es la implementacin de la idea de sucesin en la matemtica. Es posible formar arreglos de los tipos de datos simples como int, float, char y de sus modificadores de tipo y de tipos estructurados. Cada arreglo de esta forma ser una coleccin de elementos del mismo tipo. Un arreglo puede concebirse como un grupo de celdas o contenedores, cada una con la capacidad de albergar un elemento de datos. Para accesar un elemento especfico del arreglo se hace referencia a su nmero de celda o valor del ndice. El ndice para un arreglo debe ser de tipo entero. Cuando se declara un arreglo, se declara el tipo de datos del arreglo y su tamao. A manera de ejemplo, podramos hacer las siguientes declaraciones de arreglos: int X[7], Numeros[100], cantidades[100]; float Precio[250], costo[250], utilidad[250]; float Anualidades[max]; char nombres[20], apellidos[25]; char letras[26]; Como se ve, el nmero de elementos del arreglo estar dado por el nmero colocado entres [ y ] al declararlo, esto se llama dimensionamiento. Este, el dimensionamiento, es obligatorio, a menos que se d implicitamente el tamao del arreglo por medio de la inicializacin del mismo como en: char Operador[] = {'+', '-', '*', '/'}; int Enteros[] = { 4, 13, 0, 5, 6, -23, 7, 345, 45, -12}; En el primer ejemplo, Operador ser un arreglo de cuatro posiciones, y queda inicializado con los correspondientes carateres dados entre llaves. El segundo ejemplo el vector Enteros tendr 10 posiciones. Los elementos de una variable arreglo, no reciben valores cuando el arreglo se declara(tendrn "basura"). Por esto es conveniente inicializar o efectuar lectura, asignndoles valores antes de efectuar ninguna otra operacin con ellos. A los componentes de un arreglo se asignan valores de forma similar que a cualquier otra variable. Ya dentro del algoritmo podramos presentar las siguientes instrucciones: Numeros[3] = 4569; Numeros[I] = pow(2,10); Anualidades[I] = Anualidades[I-1] * 1.3; Precio[artculo] = costo[articulo] + utilidad[articulo]; cout << "Precio mximo = $" << Precio[articulo];

139

cin >> Numeros[i]; gets(nombres[persona]); En los arreglos anteriores, los ndices: I, articulo y persona, deben tener valores enteros, los cuales coincidan con las posiciones vlidas del arreglo correspondiente. Recuerde si el arreglo es de N elementos, las posiciones vlidas van desde el cero hasta N menos uno. Los arreglo unidimensionales son ms comunmente conocidos como vectores. La representacin grfica o abstraccin que debemos tener de un vector o arreglo unidimensional es la siguiente: Vector X 126 47 -4 0 10 -99 69 El vector X ha sido declarado como: int X[7]; y nos lo podemos "imaginar" vertical u horizontal vector X 126 47 -4 0 10 -99 69 X[0] X[1] X[2] X[3] X[4] X[5] X[6] ndice o subndice encerrado entre [ ]

X[0] X[1] X[2] X[3] X[4] X[5] X[6]

X es el nombre, o identificador del arreglo unidimensional o vector. X[0] se refiere al primer elemento del vector y tiene almacenado el entero 126, el nmero 0 es el ndice. El valor de 126 a podido, por ejemplo, ser asignado directamente en el cdigo del algoritmo por medio de la instruccin: X[0] = 126; X[3] es el cuarto elemento del vector y tiene almacenado un valor de 0, el nmero 3 es el ndice. El valor de 0 en la posicin 3 a podido ser leido, por ejemplo por teclado con la siguiente instruccin: cin >> X[3]; En general si I es un entero, tendremos que X[I], ser el valor que ocupa la posicin I del vector; este valor puede ser asignado directamente, leido por teclado, desde disco, etc. como veremos en los ejemplos siguientes de este captulo. Cada elemento del vector X, al ser tipo int, ocupa en memoria 2 byte, por lo tanto, el arreglo X ocupar 2 * 7 = 14 bytes en la memoria RAM del computador. Similarmente podramos hablar para vectores de otros tipos de datos.

140

11.2 Se lee un vector por teclado y luego se muestra en pantalla. //VECTOR_1.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> const int Max=10; void main(){ int i; float vector[Max]; clrscr(); for (i=0; i<Max; i++){ cout << "Real para posicin " << i << ": "; cin >> vector[i]; } cout << endl << endl; for (i=0; i<Max; i++){ cout << setw(4) << vector[i]; } while(!kbhit()); } 11.3 Se generan los N primeros trminos de la serie de Fibonacci. //VECTOR_2.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> const int N=64; void main(){ float F[N]; int i; clrscr(); F[0] = 0; F[1] = 1; for(i=2;i<N;i++) F[i] = F[i-1] + F[i-2]; for(i=0;i<N;i++){ cout.setf(ios::fixed); cout << setw(20) << F[i]; } while(!kbhit()); }

141

11.4 Se genera un vector, de la cantidad de posiciones "deseadas", aleatoriamente mostrndolo en pantalla. Finalmente se pide buscar un elemento en el vector. //VECTOR1.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> const int Max=200; void main(){ int i, N; float vector[Max]; do{ clrscr(); cout << "\aElementos a generar al azar en vector(Mximo " << Max << "): "; cin >> N; } while (N<1 || N>Max); //Vlida el valor de N en el rango adecuado randomize(); for (i=0; i < N; i++){ vector[i] = random(100); cout << setw(4) << vector[i]; } //ALGORITMO DE BUSQUEDA SECUENCIAL EN ARREGLO UNIDIMENSIONAL float item; cout << "\n\nDigite un nmero para encontrar su posicin en vector: "; cin >> item; i = 0; while( i<N && item != vector[i]) i++; if (item == vector[i]) cout << "\Encontrado en posicin " << i; else cout << "\n\aNo encontrado en vector"; while(!kbhit()); }

142

11.5 Se inserta un elemento en una posicin dada en vector en memoria. //VECTOR2.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include<stdlib.h> const int Max=100; main(){ int i, N; float VECTOR[Max]; do{ clrscr(); cout << "\aElementos a generar al azar en VECTOR(Mximo " << Max << "): "; cin >> N; } while (N<1 || N>Max); //Vlida el valor de N en el rango adecuado randomize(); for (i=0; i < N; i++){ VECTOR[i] = random(100); cout << setw(4) << VECTOR[i]; } //ALGORITMO DE INSERCION DE ELEMENTO EN POSICION DADA DE UN VECTOR float item; int pos; if (N==Max) cout << "\n\n\aNo se pueden insertar ms elementos en el VECTOR"; else{ cout << "\n\nDigite un nmero para INSERTAR en el VECTOR: "; cin >> item; do{ cout << "\nDigite posicin en la que desea insertarlo(0-" << N <<"): "; cin >> pos; } while (pos<0 && pos>N); i = N; //observe que la posicin N en el VECTOR, no est ocupada //ahora se "corren" los elementos a la derecha de pos, una posicin while(i > pos){ VECTOR[i] = VECTOR[i-1]; i--; } VECTOR[pos] = item; // Oserve que sera lo mismo: VECTOR[i] = item N++; // La cantidad de elementos en el VECTOR aumenta en uno //Se lista el VECTOR, con los valores actuales for (i=0; i < N; i++) cout << setw(4) << VECTOR[i]; cout << "\nAhora el VECTOR tiene " << N << " elementos"; } }

143

11.6 Se elimina un elemento de un vector a partir de su posicin. //VECTOR3.CPP #include #include #include #include <iostream.h> <iomanip.h> <conio.h> <stdlib.h>

const int Max=50; main(){ int i, N; float X[Max]; do{ clrscr(); cout << "\aElementos a generar al azar en vector(Mximo " << Max << "): "; cin >> N; } while (N<1 || N>Max); //Vlida el valor de N en el rango adecuado randomize(); for (i=0; i < N; i++){ X[i] = random(100); cout.width(4); cout << X[i]; } //ALGORITMO DE ELIMINACION DE ELEMENTO EN UNA DADA POSICION DE VECTOR float item; int pos; do{ cout<<"\nDigite posicin de nmero que desea eliminar(0-" << N-1 <<"): "; cin >> pos; } while(pos<0 || pos>N-1); item = X[pos]; while(pos < N){ X[pos] = X[pos+1]; pos++; } N--; // La cantidad de elementos en el X se decrementa en uno //Se lista el X, a continuacin, sin item eliminado cout << endl << "Eliminado: " << item << " del vector siguiente: \n"; for (i=0; i < N; i++) cout << setw(4) << X[i]; cout << "\n\nAhora el vector tiene " << N << " elementos"; while(!kbhit()); return 0; }

144

11.7 Se genera un vector, de la cantidad de posiciones "deseadas", aleatoriamente mostrndolo en pantalla. Finalmente se elimina un elemento a partir de su bsqueda. //VECTOR4.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> const int Max=10; main(){ int i, N; float A[Max]; do{ clrscr(); cout << "\aElementos a generar al azar en A(Mximo " << Max << "): "; cin >> N; } while (N<1 || N>Max); //Vlida el valor de N en el rango adecuado randomize(); for (i=0; i < N; i++){ A[i] = random(1000)/13.0; //Se generan nmeros reales de esta forma cout << setiosflags(ios::fixed) << setw(8) << A[i]; } //ALGORITMO DE ELIMINACION DE ELEMENTO EN VECTOR CON PREVIA BUSQUEDA float item; int pos; cout << "\nDigite valor del elemento que desea eliminar: "; cin >> item; pos = 0; while( pos < N && A[pos] != item ){ //Bsqueda secuencial del elemento pos++; } if(item == A[pos]){ //se encontr elemento y se procede a eliminarlo i = pos; while (i < N-1){ A[i] = A[i+1]; i++; } N--; //Se decrementa en uno la cantidad de elementos en el vector A //Se lista el vector A, a continuacin, sin item eliminado for (i=0; i < N; i++) cout << setw(4) << A[i]; cout << "\nAhora el vector tiene " << N << " elementos"; } else cout << "\nNo se encontr el elemento \a"; }

145

11.8 ACTIVIDADES PARA REALIZAR EN GRUPOS 11.8.1 Se tiene un arreglo unidimensional, de N posiciones, en el cual cada uno de sus componentes puede ser solo un dgito. Determinar el nmero de veces (frecuencia) que aparece cada uno de los (diez) dgitos en el vector. 11.8.2 Leer un vector A de N elementos y un vector B de M elementos (pueden ser repetidos en cada vector). Cuntas veces se encuentra presente cada elemento de A en B, no incluya elementos repetidos?. 11.8.3 Lea un vector A de N elementos todos diferentes y un vector B de M elementos los cuales pueden ser repetidos. Cuntas veces se encuentra presente cada elemento de A en B? 11.8.4 Se tiene un vector de N posiciones de tipo entero. Generar a partir de l otros otros tres vectores A, B y C de suerte que en A estn solo los nmeros pares, en B los impares y en C los mltiplos de 10. 11.8.5 Leer valores numricos en un vector en desorden, a continuacin mostrarlo en la misma secuencia pero ignorando los elementos repetidos y diciendo cuntos se imprimieron?. 11.8.6 Generar por medio de la funcin random() vector de 100 elementos en desorden. A continuacin clasificar en orden ascendente los nmeros pares y en orden descendente los impares. 11.8.7 Una Universidad exige a los estudiantes aspirantes a los planes de Ingeniera los siguientes puntajes en cada uno de tres examenes para ser aceptados. EXAMENES PUNTAJES 1 80 - 100 2 78 - 100 3 85 - 100 Cada estudiante tiene un registro con la siguiente informacin: CODIGO PLAN PUNTAJE PUNTAJE PUNTAJE EXAMEN 1 EXAMEN 2 EXAMEN 3 Solamente se tienen los planes de estudio 747 al 751. Elabore un algoritmo que permita calcular, por medio de la utilizacin de arreglos unidimensionales paralelos, lo siguiente: El El El El El El nmero de aspirantes aceptados en el plan 751. nmero de aspirantes aceptados en el plan 748. nmero de aspirantes que presentaron exmenes en el plan 749. plan que ms aspirantes tuvo. promedio de calificaciones por plan. nmero total de Estudiantes.

11.8.8 Lea un vector de N elementos y luego imprima cuntos y cules elementos son mltiplos del elemento siguiente. 11.8.9 Leer un vector, y luego invertirlo sobre l mismo. (El que estaba de primero quedar de ltimo y viceversa).

146

11.8.10 Leer un nmero en base 10 y a continuacin presentarlo, adecudamente escrito, en base 2. Utilice vector de enteros para almacenar cada uno de los residuos que se calculan repetidamente al dividir entre 2. Al final escriba el vector en orden inverso. 11.8.11 Una lnea area desea controlar las reservas de vuelo de un avin. El nmero de cupos disponible para el vuelo es de 25. Se debe presentar un men el cual cual permita invocar las siguientes funciones: RESERVAR CUPO: El algoritmo debe pedir, al pasajero, Su nombre y en que silla quiere la reserva. En esa posicin se debe asignar un UNO (1), siempre y cuando est en el estado 0, es decir vaca, si ya est reservada, es decir en Estado 1 no se podr efectuar reserva. (Este es el estado 1). Observe, de lo anterior que el nmero de la silla lo dar la posicin respectiva en el vector. CANCELAR RESERVA: Se pide el nmero de silla que tiene reservada y se debe asignar a esa posicin un CERO (0). (Vuelve al estado 0). CONFIRMAR RESERVA: Cuando el pasajero se presenta al aeropuerto se le debe solicitar el nmero de silla y marcarla como "ocupada" en el vector, para esto asgnele un nmero DOS(2). (Este ser el estado 2). CERRAR EL VUELO(y terminar el programa): Cuando producir un listado con la siguiente estadstica: el avin vaya a despegar,

a) Nmeros de sillas que van ocupadas(Estado 2); b) Total sillas reservadas y que no viaj el pasajero(Estado 1); c) Sillas totales vacas (Estado 0 + Estado 1). d)Listado de los nombres de todos los pasajeros que viajaron, en orden alfabtico. Para lo anterior debe definir dos vectores "paralelos", uno para los nombres de los pasajeros y otro, de tipo entero, para el estado de cada una de las sillas, recuerde: cuando una silla est vaca debe tener un cero, cuando se reserve un uno, y cuando se aborda el avin (recibe el "pasabordo") debe quedar con un dos. Inicie definiendo variables tipo vector y globales para el nombre y el estado de la silla. En la funcin principal, main(), haga lo siguiente: Inicializar el vector de el estado de las sillas, cuyos elementos representen los nmeros de cada una de las sillas, con Cero, (este es el estado 0) de la siguiente forma: vector que representa cada una de las 25 sillas 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 A continuacin disee un men el cual permita invocar iterativamente a las funciones: Reservar(), Cancelar(), Confirmar() y Cerrar(). En Reservar() debe pedir el nombre del pasajero y el nmero de la silla en la cual quiere viajar. Se supone que al pasajero se le est mostrando un plano del avin con las sillas numeradas. En la posicin del nmero de la silla asignarle un 1.(Estado 1 de reservada).

147

En cancelar() se debe digitar el nmero de la silla que el pasajero quiere cancelar y se le debe asignar un 0, volviendo al estado de vaca. En Confirmar() se debe pedir al pasajero el nmero continuacin asignarle un 2, quedando en estado de ocupada. de la silla, y a

En Cerrar() presentar en pantalla la estadstica pedida y a continuacin terminar el programa. Al cerrar el vector podra ser que estuviera en el siguiente estado: vector que representa cada una de las 25 sillas 2 0 1 2 0 2 0 2 2 2 2 0 0 0 0 2 0 1 0 2 2 2 0 0 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 11.8.12 Efectue prueba de ejecucin manual al siguiente algoritmo: //VECTOR10.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> const int Max=500; void main(){ int i, j, N, Menos; float Vector[Max]; clrscr(); cout << "\aElementos a generar al azar en vector(Mximo " << Max << "): "; cin >> N; i = Menos = 0; while( i < N ){ Menos++; j=0; while(j < Menos && i < N){ j++; i++; Vector[i-1] = -i; } if ( i < N ){ i++; Vector[i-1] = i; } } for (i=0; i < N; i++) cout << setw(5) << Vector[i]; }

148

CAPTULO 12.Error! Marcador no definido. ALGORITMOS DE CLASIFICACIN DE VECTORES


12.1 Se digitan N nmeros se almacenan en vector y luego se ordenan. //VECTOR_3.CPP #include <iostream.h> #include <conio.h> const int N=5; main(){ int vector[N], i=0, j, aux ; clrscr(); cout << "Digite " << N << " enteros\n"; while (i < N){ cout << i+1 << ": "; cin >> vector[i]; i++; } for (i = 0; i < N-1; i++) for (j = i+1; j < N; j++) if (vector[i] > vector[j]) { aux = vector[j]; vector[j] = vector[i]; vector[i] = aux; } cout << "\nLos nmeros ordenados en orden ascendente son:\n\n"; for(i=0; i<N; i++) cout << i+1 << ": " << vector[i] << "\n"; } Prueba de ejecucin manual del programa anterior, ordenamiento, se presenta a continuacin para un N=5: en su fragmento de

for (i = 0; i < N-1; i++) for (j = i+1; j < N; j++) if (vector[i] > vector[j]) { aux = vector[j]; vector[j] = vector[i]; vector[i] = aux; } La variable ndice i toma el valor inicial de cero, a continuacin el ndice j, se hace igual a i+1 o sea que a j se le asigna 1, como se muestra al comienzo de la siguiente tabla:

149

VECTOR ORIGINAL EN DESORDEN POSICIONES A COMPARAR INTERCAMBIO 0 1 2 3 4 (N=5) i i<N-1 j j<N vector[i] > vector[j] 8 4 2 3 1 0 0<5-1 1 1<5 8>4 SI 4 8 2 3 1 2 8 4 3 1 2 8 4 3 1 0 2 2<5 4>2 SI

3<5

2>3 NO

4<5

2>1 SI

5 5<5 Falso --------------------------------------------------------------- 1 8 4 3 2 1 1<5-1 2 2<5 8>4 SI 1 4 8 3 2 1 3 8 4 2 1 3 3<5 4>3 SI

4<5

3>2 SI

5 5<5 falso --------------------------------------------------------------- 1 2 8 4 3 2 2<5-1 3 3<5 8>4 SI 1 2 4 8 3 2 4 4<5 4>3 SI

5 5<5 Falso --------------------------------------------------------------- 1 2 3 8 4 3 3<5-1 4 4<5 8>4 SI 5 5<5 Falso --------------------------------------------------------------- 1 2 3 4 8 4 4<5-1 Falso POSICIN FINAL, VECTOR EN ORDENAMIENTO ASCENDENTE

150

12.2 Se digitan N nmeros se almacenan en vector y luego se ordenan, en forma descendente, por el algoritmo de la burbuja. (versin 1). //VECTOR_4.CPP #include <iostream.h> #include <conio.h> const int N=5; int vector[N]; //variable global Leer(){ int i=0; cout << "Digite " << N << " enteros\n"; do{ cout << i+1 << ": "; cin >> vector[i]; i++; } while (i < N); } Ordenar(){ //ALGORITMO DE CLASIFICACIN POR EL MTODO DE LA BURBUJA int i, j, aux ; for (i = 1; i < N; i++) for (j = 0; j < N-i; j++) if (vector[j] < vector[j+1]) { aux = vector[j]; vector[j] = vector[j+1]; vector[j+1] = aux; } } Escribir(){ int i=0; cout << "\nLos nmeros en orden descendente son:\n\n"; while (i < N){ cout << i+1 << ": " << vector[i] << "\n"; i++; } } main(){ clrscr(); Leer(); Ordenar(); Escribir(); while (!kbhit()); }

151

12.3 Se efecta insercin de elemento en un vector clasificado ascendentemente. //VECTOR5.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> const int Max=10; void main(){ int i, N, j, pos_menor, menor; float vector[Max]; do{ clrscr(); cout << "\aElementos a generar al azar en vector(Mximo " << Max << "): "; cin >> N; } while (N<1 || N>Max); //Valida el valor de N en el rango adecuado randomize(); for (i=0; i < N; i++){ vector[i] = random(100)+100; cout << setw(5) << vector[i]; } cout << endl; //Algoritmo de clasificacin por seleccin directa(straigh selection)(versin1): for (i = 0; i < N-1; i++) { menor = vector[i]; pos_menor = i; for (j = i+1; j < N; j++){ if (vector[j] < menor) { menor = vector[j]; pos_menor = j; } } vector[pos_menor] = vector[i]; vector[i] = menor; } for (i=0; i < N; i++) cout << setw(5) << vector[i]; //A CONTINUACIN ALGORITMO DE INSERCIN EN UN VECTOR ORDENADO ASCENDENTEMENTE: //VECTOR5.CPP float item; int pos; if (N==Max) cout <<"\n\aNo se pueden insertar elementos en vector. Tiene el mximo"; else{ cout << "\n\nDigite valor del item a insertar: "; cin >> item; pos = 0; //Se busca posicin donde se debe insertar el nuevo elemento while (pos < N && item > vector[pos]) pos++;

152

//A continuacin se "corren" todos los elementos a la derecha de pos, //en una posicin a la derecha i = N; while (i > pos){ vector[i] = vector[i-1]; i--; } vector[pos] = item; //Se inserta el item N++; // El nmero de elementos en el vector aumenta en uno cout << endl; for (i=0; i < N; i++) cout << setw(5) << vector[i]; cout << "\n\nAhora el vector tiene " << N << " elementos"; } }

153

12.4 Se digitan N nmeros se almacenan en vector y luego se ordenan por el algoritmo de la burbuja.(versin 2) //VECTOR_5.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> const int Max=5; main(){ float vector[Max]; int i=0, j, aux ; clrscr(); randomize(); cout << "Vector generado aleatoriamente: \n"; for(i=0; i< Max ;i++){ vector[i] = rand(); cout.width(8); cout << vector[i] ; } for (i=Max-1; i>=1; i--) for (j=0; j<i; j++) if (vector[j] > vector[j+1]) { aux = vector[j]; vector[j] = vector[j+1]; vector[j+1] = aux; } cout << "\n\nAhora clasificado:\n"; for(i=0; i<Max ;i++) cout << setw(8) << vector[i]; } A continuacin se presenta prueba de ejecucin manual del ordenamiento del programa anterior: for (i= Max-1; i>=1; i--) // Max=5 posiciones(0-4) para el vector for (j=0; j<i; j++) if (vector[j] > vector[j+1]) { aux = vector[j]; vector[j] = vector[j+1]; vector[j+1] = aux; } La variable i toma el valor de Max-1 = 5-1 = 4, como se muestra en la siguiente tabla:

154

PRUEBA DE EJECUCIN MANUAL DEL PROGRAMA VECTOR_5.CPP VECTOR ORIGINAL EN DESORDEN POSICIONES QUE SE COMPARAN INTERCAMBIO 0 1 2 3 4(Max=5) i i>=1 j j+1 j<i Vector[j]>vector[j+1] 8 4 2 3 1 4 4>=1 0 1 0<4 8>4 SI 4 8 2 3 1 4 2 8 3 1 4 2 3 8 1 1 2 1<4 8>2 SI

2<4

8>3 SI

3<4

8>1 SI

4 4<4 Falso ------------------------------------------------------------------- Observe que el mayor qued en su sitio 4 2 3 1 8 3 3>-1 0 1 0<3 4>2 SI 2 4 3 1 8 2 3 4 1 8 1 2 1<3 4>3 SI

2<3

4>1 SI

3 3<3 Falso ------------------------------------------------------------------- el segundo mayor qued en su sitio 2 3 1 4 8 2 2>=1 0 1 0<2 2>3 NO 2 3 1 4 8 1 2 1<2 3>1 SI

2 2<2 Falso ------------------------------------------------------------------- 2 1 3 4 8 1 1>=1 0 1 0<1 2>1 SI 1 1<1 Falso 1 2 3 4 8 0 0>=1 Falso POSICIN FINAL, VECTOR EN ORDEN ASCENDENTE

155

12.5 Se efecta eliminacin de elemento en vector clasificado a partir de su bsqueda (versin 1). //VECTOR6.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> const int Max=10; void main(){ int i, N, j, PosMayor; int Arreglo[Max], Mayor; do{ clrscr(); cout << "Elementos a generar al azar en Vector(Mximo " << Max << "): "; cin >> N; } while (N<1 || N>Max); //Valida el valor de N en el rango adecuado randomize(); for (i=0; i < N; i++){ Arreglo[i] = random(32767); cout << setw(10) << Arreglo[i]; } //Clasificacin por seleccin directa(straigh selection)versin 2 for (i = N-1; i >=0; i--) { Mayor = Arreglo[i]; PosMayor = i; for (j = 0; j < i; j++){ if (Arreglo[j] > Mayor) { Mayor = Arreglo[j]; PosMayor = j; } } Arreglo[PosMayor] = Arreglo[i]; Arreglo[i] = Mayor; } cout << endl; for (i=0; i < N; i++){ cout << setw(10) << Arreglo[i]; } //ALGORITMO DE ELIMINACIN EN VECTOR ORDENADO CON PREVIA BSQUEDA: float item; int pos; cout << "\n\nDigite valor del item a eliminar: "; cin >> item; pos = 0; //Se busca posicin donde se encuentra el elemento while (item > Arreglo[pos] && pos < N) pos++; if (item == Arreglo[pos]){ //A continuacin se "corren" todos los elementos a la derecha de pos, //en una posicin a la izquierda

156

i = pos; while (i < N){ Arreglo[i] = Arreglo[i+1]; i++; } N--; // El nmero de elementos en el Vector se decrementa en uno cout << endl; for (i=0; i < N; i++) cout << setw(10) << Arreglo[i]; cout << "\n\nAhora el Vector tiene " << N << " elementos"; } else cout << "\n\nElemento no se encuentra en el Vector\a\a"; } Del programa anterior, explique el algoritmo de clasificacin como ejercicio. Ahora, supongamos que, despus de efectuar la clasificacin el vector est as: 0 1 2 3 4 1 2 3 4 8

VECTOR EN ORDEN

a continuacin eliminaremos el item 2; despus de la bsqueda la variable pos tendr el valor de 1, y luego se le asigna a la i; en el ciclo while los valores del arreglo variaran, debido a la instruccin: Arreglo[i] = Arreglo[i+1], de la siguiente forma para cada i: 0 1 2 3 4 1 3 3 4 8 para i = 1. Arreglo[1] = Arreglo[1+1] 1 3 4 4 8 para i = 2. Arreglo[2] = Arreglo[2+1] 1 3 4 8 8 para i = 3. Arreglo[3] = Arreglo[3+1] para i=4 el while(i<N-1) se vuelve falso. A continuacin la variable N se decrementa en uno, y de esta forma tendremos eliminado el item deseado: 0 1 2 3 1 3 4 8

157

12.6 Se digitan N palabras, se almacenan en vector y luego se ordenan //VECTOR_7.CPP #include <iostream.h> #include <conio.h> #include <string.h> const int N=5; const int LargoCadena=20; char cadena[N][LargoCadena]; //observe que es un arreglo bidimensional Leer(){ int i=0; gotoxy(10,2); cout << "Digite " << N << " palabras"; for(i=0; i < N; i++){ gotoxy(10,4+i); cin >> cadena[i]; } } Ordenar(){ int i,j; char aux[LargoCadena]; for (i = 0; i < N-1; i++) for (j = i+1; j < N; j++) if (strcmp(cadena[i], cadena[j]) > 0) { strcpy(aux, cadena[j]); strcpy(cadena[j], cadena[i]); strcpy(cadena[i], aux); } } Escribir(){ int i; cout << "\n\tLas palabras ordenadas son:\n\n"; for (i = 0; i < N; i++){ gotoxy(10,12+i); cout << cadena[i]; } } main(){ clrscr(); Leer(); Ordenar(); Escribir(); while (!kbhit()); }

158

12.7 Se digitan N nmeros se almacenan en vector y luego se ordenan por el algoritmo de determinar el mayor y colocarlo en su posicin. (Versin 2. ver vector6.cpp) El programa fuente: #include <iostream.h> #include <conio.h> const int N=5; int vector[N]; //variable global Leer(){ int i=0; clrscr(); cout << "Digite " << N << " enteros:\n\n"; while (i < N){ cout << i << ": "; cin >> vector[i]; i++; } } Ordenar(){ int i, j, pos, Mayor; for (i = 0; i < N-1; i++) { Mayor = vector[i]; pos = i; for (j = i+1; j < N; j++){ if (vector[j] > Mayor) { Mayot = vector[j]; pos = j; } } vector[pos] = vector[i]; vector[i] = Mayor; } } Escribir(){ int i=0; cout << "\nOrdenados descendentemente:\n\n"; do{ cout << i << ": " << vector[i] << "\n"; i++; } while (i < N); } void main(){ Leer(); Ordenar(); Escribir(); } A continuacin se programa VECTOR_6.CPP //VECTOR_6.CPP

presenta

prueba

de

ejecucin

manual

para

el

anterior

El programa inicia su ejecucin en la funcin main(), en ella inicialmente se borra la pantalla, clrscr(), y a continuacin se invoca una tras otra las

159

funciones programa.

Leer(),

Ordenar()

Escribir()

para

de

esta

forma

terminar

el

La primera funcin invocada es Leer(), en ella se propone al usuario que digite N nmeros enteros, en este caso 5, por teclado, los cuales son almacenados en posiciones sucesivas, i, de la variable global Vector; para esto se utiliza la instruccin repetitiva while la cual es controlada por la variable i, cuando la i toma el valor igual a N se termina el ciclo y luego la funcin retorna a la funcin main(). La funcin Ordenar() produce la clasificacin del vector por el mtodo de encontrar el mayor elemento y colocarlo en "su sitio", es decir en la posicin ms a la izquierda; esto se repite sucesivamente, dando como resultado el ordenamiento del vector en forma descendente. La funcin Escribir() nos muestra en pantalla los valores del vector en orden descendente, por medio de la instruccin repetitiva do...while, la cual se vuelve falsa cuando la variable local i se iguala con N, en este caso 5. Se muestra a continuacin la presentacin en pantalla y los valores en memoria despus de invocarse la funcin Leer(): Pantalla Vector (en RAM) i Digite 5 enteros 13 7 27 6 58 0 0: 13 1 1: 7 0 1 2 3 4 2 2: 27 3 3: 6 la variable local i toma sucesiva- 4 4: 58 ente los siguientes valores: 0, 1, 5 2, 3, 4, 5.

160

En la invocacin de la funcin Ordenar() se produce clasificacin descendente del vector, segn la siguiente prueba tabular de ejecucin: i i<N-1VectorMayorPosJ J< N if VECTOR i< 4 [i] J< 5 Vector[J]>M 0 1 2 3 4 13 7 27 6 58 0 0<4 V 13 13 0 1 V 7>13:falso 2 V 27>13:verd. 27 2 3 V 6>13:falso 4 V 58>13:verd. 58 4 5 F 58 7 27 6 58 58 7 27 6 13 1 1<4 V 7 7 1 2 V 27>7:verdad 27 2 3 V 6>27:falso 4 V 13>27:falso 5 F 58 7 7 6 13 58 27 7 6 13 2 2<4 V 7 7 2 3 V 6>7:falso 4 V 13>7:verdad 13 4 5 F 58 27 7 6 7 58 27 13 6 7 3 3<4 V 6 6 3 4 V 7>6:verdad 7 4 5 F 58 27 13 6 6 58 27 13 7 6 En orden 4 4<4:F

161

Se muestra a continuacin la presentacin en pantalla y los valores en memoria despus de ejecutarse la invocacin a la funcin Escribir(): Pantalla Digite 5 enteros: 0: 13 1: 7 2: 27 3: 6 4: 58 Ordenados Descendentemente: 0: 58 1: 27 2: 13 3: 7 4: 6

Vector (en RAM) 58 27 13 7 6 0 1 2 3 4

i 0 1 2 3 4

12.8 ACTIVIDADES PARA REALIZAR EN GRUPOS Y PERSONALMENTE 12.8.1 Efecte prueba de ejecucin manual al siguiente fragmento, del programa VECTOR12.CPP, en el cual se ordenan por medio de el algoritmo de Insercin Binaria. Ver "Algoritmos y Estructuras de Datos" de Niklaus Wirth. for (i = 1; i < N; i++){ Aux = Vector[i]; Izq = 0; Der = i; while(Izq < Der){ Medio = (Izq + Der)>>1; if (Vector[Medio] <= Aux) Izq = Medio + 1; else Der = Medio; } for (j=i; j>=Der+1; j--) Vector[j] = Vector[j-1]; Vector[Der] = Aux; } 12.8.2 Se tienen dos vectores ordenados y sin elementos repetidos cada uno en memoria; producir a partir de ellos uno tercero tambin ordenado(fusin). Copiar los elementos que estn en ambos solo una vez. 12.8.3 Dado un vector que almacene los nombres de pila de los estudiantes de la Universidad, calcule la frecuencia de cada nombre. Una forma de resolver podra ser clasificando en orden ascendente los nombres. 12.8.4 Efecte prueba de ejecucin manual al siguiente fragmento, del programa VECTOR11.CPP, en el cual se ordenan nmero por el algoritmo de intercambio directo burbuja. Ver "Algoritmos y Estructuras de Datos" de Niklaus Wirth.

162

for (i = 1; i < N; i++) for (j = N-1; j >=i; j--) if (Vector[j-1] > Vector[j]) { Aux = Vector[j-1]; Vector[j-1] = Vector[j]; Vector[j] = Aux; } 12.8.5 Efecte prueba de ejecucin manual al siguiente fragmento, del programa VECTOR13.CPP, en el cual se ordenan por intermedio del algoritmo de Vibracin (shakesort). Ver "Algoritmos y Estructuras de Datos" de Niklaus Wirth. Izq = 0; Der = N-1; k = N-1; do{ for (j = Der; j >= Izq; j--) if (Vector[j-1] > Vector[j]){ Aux = Vector[j-1]; Vector[j-1] = Vector[j]; Vector[j] = Aux; k = j; } Izq = k+1; for (j=Izq; j<=Der; j++) if (Vector[j-1] > Vector[j]){ Aux = Vector[j-1]; Vector[j-1] = Vector[j]; Vector[j] = Aux; k = Der; } Der = k-1; } while (Izq < Der);

163

Error! Marcador no definido.CAPTULO 13. ALGORITMOS CON VECTORES (Continuacin)


13.1 Clculo de nmeros primos por la Criba de Eratstenes. //VECTOR8.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> const int Max=2000; void main(){ int i, multiplo, A[Max]; for (i=2 i < Max; i++) A[i] = i; for (i=4; i < Max; i=i+2) A[i] = 0;

//Se "eliminan" todos los pares

i = 3; while ( i < (Max/2) ){ //Se eliminan todos los mltiplos de impares multiplo = i*2; while (multiplo < Max){ A[multiplo] = 0; multiplo = multiplo + i; } i += 2; } clrscr(); for (i=2; i < Max; i++) if (A[i]!=0) cout << setw(5) << A[i]; } El algoritmo anterior sigue la siguiente secuencia: en la primera instruccin FOR se asigna a cada posicin, iniciando en 2, el valor de su posicin:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25... 2 3 4 5 6 7 8 910111213141516171819202122232425..

En el segundo FOR se eliminan todos los pares, con excepcin del 2, el cual es un nmero primo, por medio de la asignacin de un nmero cero:
2 3 0 5 0 7 0 9 011 013 015 017 019 021 023 025..

A continuacin se eliminan todos los mltiplos de 3, observe que el algoritmo "pierde tiempo" borrando de nuevo a los pares que ya estaban en el paso anterior:
2 3 0 5 0 7 0 0 011 013 0 0 017 019 0 0 023 025..

165

Se incrementa el contador en dos para obtener 5 y se procede a borrar los mltiplos del mismo, as:
2 3 0 5 0 7 0 0 011 013 0 0 017 019 0 0 023 0 0..

y as sucesivamente. 13.2 Se efecta la fusin de dos vectores, A de tamao M y B de Tamao N, clasificados en un tercer vector C de tamao M+N. //VECTOR7.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> const int Max=10; main(){ int i, j, k, l, M, N; float A[Max], B[Max], C[Max*2], aux; do{ clrscr(); cout << "\aElementos a generar al azar en A(Mximo " << Max << "): "; cin >> M; } while (M<1 || M>Max); //Valida el valor de M en el rango adecuado do{ clrscr(); cout <<"\aElementos a generar al azar en A(Mximo " <<Max << "): " << M; cout <<"\n\aElementos a generar al azar en B(Mximo " << Max << "): "; cin >> N; } while (N<1 || N>Max); //Valida el valor de N en el rango adecuado randomize(); for (i=0; i < M; i++) //Se genera "al azar" el vector A A[i] = random(100); for (i=0; i < N; i++) //Se genera "al azar" el vector B B[i] = random(100); for (i = 0; i < M; i++) //Clasificacin vector A for (j = i; j < M; j++) if (A[i] > A[j]) { aux = A[j]; A[j] = A[i]; A[i] = aux; } for (i = 0; i < N; i++) //Clasificacin vector B for (j = i; j < N; j++) if (B[i] > B[j]) { aux = B[j]; B[j] = B[i]; B[i] = aux;

166

} clrscr(); cout << "Vector A:\n"; for(i=0; i<M; i++) cout << setw(5) << A[i]; cout << "\nVector B:\n"; for(i=0; i<N; i++) cout << setw(5) << B[i]; //ALGORITMO DE FUSIN DE DOS VECTORES CLASIFICADOS EN UNO TERCERO //VECTOR7.CPP cout << "\n\nFUSION DE LOS DOS VECTORES:\n"; i = j = k = 0; while(i < M && j < N ){ if (A[i] <= B[j]){ C[k] = A[i]; i++; } else{ C[k] = B[j]; j++; } k++; } if(i==M) //Se trmino primero el vector A for (l=j; l<N; l++){ C[k]=B[l]; k++; } else //Se trmino primero el vector B for (l=i; l<M; l++){ C[k]=A[l]; k++; } for (i=0; i < M+N; i++) cout << setw(4) << C[i]; }

167

13.3 Se digitan N nmeros se almacenan en vector luego se ordenan y finalmente se presenta el algoritmo de bsqueda binaria. //VECTOR_8.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> //funciones para generar al azar #include <values.h> //MAXINT main(){ const falso=0, verdad=1, N=10; int vector[N] j, aux, HaHabidoIntercambio, pasada, item, izq=0, der=N-1, medio; clrscr(); cout << N << " NMEROS GENERADOS AL AZAR\n\n"; randomize(); for (j=0; j<N; j++){ vector[j] = random(MAXINT); cout << setw(8) << vector[j]; } pasada=0; HaHabidoIntercambio=verdad; while (pasada<N && HaHabidoIntercambio){ HaHabidoIntercambio=falso; for (j = 0; j < N-pasada-1; j++) if (vector[j] > vector[j+1]){ aux = vector[j+1]; vector[j+1] = vector[j]; vector[j] = aux; HaHabidoIntercambio=verdad; } pasada++; } cout << "\n\nLOS MISMOS NMEROS AHORA EN ORDEN ASCENDENTE:\n\n"; for (j=0; j<N; j++) cout << setw(8) << vector[j]; // ALGORITMO DE LA BSQUEDA BINARIA cout << "\n\nDigite un nmero para encontrarlo en el vector: "; cin >> item; medio = (izq+der)/2; while (vector[medio] != item && izq < der){ if (item > vector[medio]) izq=medio+1; else if (item < vector[medio]) der=medio-1; medio = (izq+der)/2; } if (vector[medio] == item) cout << "\nEncontrado en posicin " << medio; else cout << "No encontrado \a"; }

168

13.4 El siguiente programa permite leer palabras en un vector de cadena(matriz de caracteres) y a continuacin invertirlo, el primero quedar de ltimo y viceversa. //VECTOR9.CPP #include <iostream.h> #include <conio.h> #include <string.h> const int Max=5; const int LargoCadena=20; char cadena[Max][LargoCadena]; //cambie para Max igual a un nmero par

void Leer(){ gotoxy(10,2); cout << "Digite " << Max << " palabras"; for(int i=0; i < Max; i++){ gotoxy(10,4+i); cin >> cadena[i]; } } Intercambiar(){ int i,j; char aux[LargoCadena]; for (j = 1; j < Max; j++) for (i = 0; i < Max-j; i++) { strcpy(aux, cadena[i]); strcpy(cadena[i], cadena[i+1]); strcpy(cadena[i+1], aux); } } void Escribir(){ cout << "\n\tEste es ahora el orden de las palabras:\n\n"; for (int i = 0; i < Max; i++){ gotoxy(10,12+i); cout << cadena[i]; } } void main(){ Leer(); Intercambiar(); Escribir(); }

169

13.5 ACTIVIDADES PARA REALIZAR EN GRUPOS 13.5.1 Lea un vector de N elementos de tipo real. Almacene en otro vector los elementos mayores que el nmero pi. 13.5.2 Dado un vector "cantidad" de N posiciones, donde cada elemento contiene las unidades vendidas de un determinado artculo durante una semana y el vector "Precio-unitario" donde cada elemento contiene el precio en pesos al cual se vende el artculo. Calcular el volumen de ventas semanal en pesos en otro vector "ventas" para cada uno de los artculos. Finalmente calcule el total vendido en la semana. 13.5.3 Leer un nmero entero y utilizando el vector obtenido en el programa VECTOR8.CPP por medio del algoritmo de la Criba de Eratstenes, encontrar todos sus factores primos. Por ejemplo si se digita el 960 se debe imprimir en pantalla: 960 = 2x2x2x2x2x2x3x5. 13.5.4 Se tendrn cuatro vectores A, B, C y D de MAX elementos. Se deben leer por teclado N elementos para el vector A y m elementos para el B. 13.5.5 Obtenga vector C que almacene el doble de cada elemento del vector con menos cantidad de elementos y un vector D que almacene la raz cuadrada de cada elemento del vector con mayor cantidad de elementos. 13.5.6 Si los vectores A y B tienen igual cantidad de elementos, se debe obtener un vector C que guarde en cada posicin la suma de los correspondientes de A y B. 13.5.7 Lea dos vectores A y B de igual nmero de elementos. Obtenga un vector C con aquellos elementos en posicin impar de A y que son menores que el respectivo elemento en posicin impar de B. 13.5.8 Calcule el producto escalar de dos vectores A y B, teniendo en cuenta que: A = (a1, a2, .... an) B = (b1, b2, ... bn) y de esta forma el producto escalar A B, est dado por: A B = a1b1 + a2b2 + ... + anbn recuerde que el resultado de esta expresin es un escalar. 13.5.9 Debe digitar por teclado los n componentes de cada uno de los dos vectores, a continuacin efectuar el clculo correspondiente al producto escalar y luego presentarlo en pantalla adecuadamente. 13.5.10 Lea un vector de N elementos de tipo entero y luego muestre solo los que son mltiplos de un nmero M el cual debe ser digitado previamente por teclado.

170

13.5.11 Efecte prueba de ejecucin manual a cada una de las funciones, la variable cadena est en memoria y se ha definido as: char cadena[Max][LargoCadena];

siguientes

//Max y LargoCadena son constantes globales

void Intercambio1(){ int i=0, j=Max-1; char aux[LargoCadena]; while(i<j) { strcpy(aux, cadena[i]); strcpy(cadena[i], cadena[j]); strcpy(cadena[j], aux); i++; j--; } } void Intercambio2(){ int i=0; char aux[Max][LargoCadena]; do{ strcpy(aux[i], cadena[i]); strcpy(cadena[i], cadena[Max-i-1]); i++; } while(i<=Max/2); for(i=Max/2; i<Max; i++) strcpy(cadena[i], aux[Max-i-1]); } void Intercambio3(){ int i,j = Max; char aux[LargoCadena]; for (i = 0; i < Max/2; i++) { j--; strcpy(aux, cadena[i]); strcpy(cadena[i], cadena[j]); strcpy(cadena[j], aux); } } void Intercambio4(){ int i; char aux[LargoCadena]; for (i = 0; i < Max/2; i++) { strcpy(aux, cadena[i]); strcpy(cadena[i], cadena[Max-1-i]); strcpy(cadena[Max-1-i], aux); } }

//observe que aux es un vector de cadenas

171

CAPTULO 14. Error! Marcador no definido.ARREGLOS BIDIMENSIONALES


14.1 INTRODUCCIN Los arreglos pueden tener mltiples dimensiones, aqu trataremos solamente los de dos dimensiones, mejor conocidos como matrices o tablas. En los arreglos multidimensionales el nmero de ndices especficos que se requieren para accesar un elemento, corresponde al nmero de dimensiones, por esto en los arreglos bidimensionales o matrices necesitaremos dos ndices; un ndice para las filas y otro para las columnas. El dimensionamiento en lenguaje C/C++ se efectuar de la siguiente forma: se coloca el tipo, a continuacin el identificador correspondiente para el nombre de la variable y luego encerrado entre llaves [ ] el tamao de las filas y el tamao de las columnas, as por ejemplo se podra dar esta definicin: int Matriz[5][4]; esta sera una variable estructurada compuesta por 5 filas y 4 columnas, de la cual nos hacemos la siguiente idea o abstraccin: E rr or ! Ma rc ad or no de fi ni do . 0 1 2 3 4 0 1 2 3

34 0 76 53 19

23 -5 15 69 23

67 45 13 -7 0

123 87 111 73 33

las cinco filas se numeran desde el 0 hasta el 4, las cuatro columnas se numerarn desde el 0 hasta el 3. De esta forma en la fila 0 columna 0 est almacenado el nmero entero 34, est posicin se denotar como Matriz[0][0], y se lee como "Matriz su cero cero". En la posicin Matriz[0][1], que se lee "Matriz su cero uno", est almacenado un 23, el cero corresponde a la fila y el uno a la columna.

173

En la posicin Matriz[4][1], el 4 corresponde a la fila y el 1 corresponde a la columna, est almacenado un 23. En la posicin Matriz[3][4], el 3 corresponde a la fila y el 4 corresponde a la columna, est almacenado un 73.

174

14.2 Se lee un arreglo bidimensional por teclado y luego se muestra en pantalla adecuadamente. //MATRIZ1.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> const int MaxFilas=5; const int MaxColumnas=4; void main(){ int fila, columna, MATRIZ[MaxFilas][MaxColumnas]; clrscr(); for ( fila = 0; fila < MaxFilas; fila++) for ( columna = 0; columna < MaxColumnas; columna++) { cout << "Posicin: (" << fila << "," << columna << "): "; cin >> MATRIZ[fila][columna]; } clrscr(); for ( fila = 0; fila < MaxFilas; fila++) { for ( columna = 0; columna < MaxColumnas; columna++) cout << setw(6) << MATRIZ[fila][columna]; cout << endl; } } 14.3 Se genera al azar un arreglo bidimensional y luego se muestra en pantalla adecuadamente. //MATRIZ2.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> const int MaxFilas=24; const int MaxColumnas=13; main(){ int fila, columna, MATRIZ[MaxFilas][MaxColumnas]; clrscr(); randomize(); for ( fila = 0; fila < MaxFilas; fila++) { for ( columna = 0; columna < MaxColumnas; columna++) { MATRIZ[fila][columna] = random(100)+100; cout << setw(6) << MATRIZ[fila][columna]; } cout << endl; } }

175

14.4 Se dan valores a un arreglo bidimensional al definirlo, se muestra en pantalla con su sumatoria. Luego se presenta suma de cada una de sus filas. Finalmente y "recorriendo la matriz por columnas" se suman sus columnas. //MATRIZ3.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> const int MaxFilas=4; const int MaxColumnas=5; main(){ int fila, columna; float MATRIZ[MaxFilas][MaxColumnas] = {14, 8, 54, 43, }; float Suma = 0;

26, 12, 34, 67,

90, 0, -30, 32, 54, 12, -5, 23, 75, 98, 12, -10

clrscr(); for ( fila = 0; fila < MaxFilas; fila++) { for ( columna = 0; columna < MaxColumnas; columna++) { cout << setw(4) << MATRIZ[fila][columna]; Suma += MATRIZ[fila][columna]; } cout << endl; } cout << "\nSumatoria de la matriz = " << Suma << endl; for ( fila = 0; fila < MaxFilas; fila++) { Suma = 0; for ( columna = 0; columna < MaxColumnas; columna++) Suma += MATRIZ[fila][columna]; cout << "\nSumatoria de la fila " << fila << " = " << Suma; } cout << endl; for ( columna = 0; columna < MaxColumnas; columna++){ Suma = 0; for ( fila = 0; fila < MaxFilas; fila++) Suma += MATRIZ[fila][columna]; cout << "\nSumatoria de la columna " << columna << " = " << Suma; } while (!kbhit()); }

176

14.5 Asigna a una matriz los nmeros desde uno hasta filas*columnas, es decir se numeran las posiciones de izquierda a derecha y de arriba hacia abajo. //MATRIZ4.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> const int MaxFilas=24; const int MaxColumnas=15; main(){ int fila, Filas, columna, Columnas, MATRIZ[MaxFilas][MaxColumnas]; clrscr(); cout << "Digite el nmero de filas deseado (Mximo " << MaxFilas << "): "; cin >> Filas; cout << "Nmero de columnas deseado (Mximo " << MaxColumnas << "): "; cin >> Columnas; gotoxy(1,3); for ( fila = 0; fila < Filas; fila++) { for ( columna = 0; columna < Columnas; columna++) { MATRIZ[fila][columna] = fila * Columnas + columna + 1; cout << setw(5) << MATRIZ[fila][columna]; } cout << endl; } } 14.6 Se generan las tablas de multiplicar del 1 al 10. //MATRIZ5.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> main(){ int i, j, Tabla[10][10];

clrscr(); for ( i = 0; i < 10; i++) for ( j = 0; j < 10; j++) Tabla[i][j] = (i+1)*(j+1); cout << " "; for ( i = 0; i < 10; i++) cout << setw(4) << i+1; cout << endl << endl; for ( i = 0; i < 10; i++) { cout << setw(4) << i+1 << " "; for ( j = 0; j < 10; j++) cout << setw(4) << Tabla[i][j]; cout << endl; } }

177

14.7 Una matriz de orden NxN es generada al azar y luego se intercambian los valores en las posiciones [i][j] con los valores en la posicin [j][i], es decir en relacin a la diagonal principal. Se produce un intercambio alrededor de la diagonal principal o sea intercambio de filas por columnas. //MATRIZ6.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> const int N=10; void main(){ int fila, columna, n; float MATRIZ[N][N], AUX; do{ clrscr(); cout << "Digite dimensin de matriz deseada (Mximo " << N << "): "; cin >> n; } while (n<1 && n>N); randomize(); // Se genera al azar la matriz for ( fila = 0; fila < n; fila++) { for ( columna = 0; columna < n; columna++) { MATRIZ[fila][columna] = random(100); cout << setw(5) << MATRIZ[fila][columna]; } cout << endl; } for ( fila = 1; fila < n; fila++) //Se produce intercambio en relacin a la diagonal principal for ( columna = 0; columna < fila; columna++) { AUX = MATRIZ[fila][columna]; MATRIZ[fila][columna] = MATRIZ[columna][fila]; MATRIZ[columna][fila] = AUX; } cout << "\nIntercambio de Filas por Columnas: \n"; for ( fila = 0; fila < n; fila++) { for ( columna = 0; columna < n; columna++) cout << setw(5) << MATRIZ[fila][columna]; cout << endl; } getch(); }

178

14.8 Una matriz A de orden MxN es generada al azar y luego se intercambian sus filas y columnas en otra matriz B de orden NxM. //MATRIZ7.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> const int MaxM=10; const int MaxN=8; void main(){ int i, M, j, N; float A[MaxM][MaxN], B[MaxN][MaxM]; clrscr(); do{ cout << "Digite el nmero para M deseado (Mximo " << MaxM << "): "; cin >> M; } while (M<1 && M>MaxM); do{ cout << "Nmero para N deseado (Mximo " << MaxN << "): "; cin >> N; } while (N<1 && N>MaxN); randomize(); cout << "\nMATRIZ A:\n"; for ( i = 0; i < M; i++) { for ( j = 0; j < N; j++) { A[i][j] = random(100); cout << setw(5) << A[i][j]; } cout << endl; } for ( i = 0; i < M; i++) for ( j = 0; j < N; j++) B[j][i] = A[i][j]; cout << "\nMATRIZ B:\n"; for ( j = 0; j < N; j++) { // j recorre las filas for ( i = 0; i < M; i++) // i recorre las columnas cout << setw(5) << B[j][i]; cout << endl; } getch(); }

179

14.9 Se dan valores a una matriz al definirla, luego se muestra en pantalla con su correspondiente sumatoria. Posteriormente se efecta la suma de las filas asignando el resultado a correspondientes posiciones de un vector. Luego se recorre la matriz por columnas efectuando la sumatoria de las mismas en correspondientes posiciones de otro vector. Finalmente se presentan las sumas de filas y columnas de la matriz contenidas en los sendos vectores. //MATRIZ8.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> const int MaxFilas=4; const int MaxColumnas=5; main(){ int f, c; float Matriz[MaxFilas][MaxColumnas] = {14, 76, 91, 0, -3, 8, 12, 32, 54, 12, 54, 34, -5, 23, 75, 43, 67, 98, 12, 65}; float SumaMatriz=0, VectorFila[MaxFilas], VectorColumna[MaxColumnas]; for ( f = 0; f < MaxFilas; f++) { VectorFila[f] = 0; for ( c = 0; c < MaxColumnas; c++) VectorFila[f] += Matriz[f][c]; } for ( c = 0; c < MaxColumnas; c++){ VectorColumna[c] = 0; for ( f = 0; f < MaxFilas; f++){ VectorColumna[c] += Matriz[f][c]; SumaMatriz += Matriz[f][c]; } } clrscr(); cout << " "; for ( c = 0; c < MaxColumnas; c++) cout << setw(4) << c; cout << "\n\n"; for ( f = 0; f < MaxFilas; f++) { cout << f << ": "; for ( c = 0; c < MaxColumnas; c++) cout << setw(4) << Matriz[f][c]; cout << " " << VectorFila[f] << endl; } cout << endl << " "; for ( c = 0; c < MaxColumnas; c++) cout << setw(4) << VectorColumna[c]; cout << " " << SumaMatriz; }

180

14.10 El siguiente programa presenta un sencillo algoritmo el cual permite jugar al tres en raya o "triqui". #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<iostream.h> main(){ char matriz[3][3], ganador; int i,j,x,y; //inicializar la matriz con un espacio en blanco en cada posicin for (i=0;i<3;i++) for (j=0;j<3;j++) matriz[i][j]=' '; do{ clrscr(); //mostrar la matriz for(i=0;i<3;i++){ cout<<" "<<matriz[i][0]<<" | "<<matriz[i][1]<<" | "<<matriz[i][2]; if(i!=2) cout<<"\n---|---|---\n"; } cout<<"\n\n"; do{ //turno del jugador do{ cout<< "USTED JUEGA CON LA X. EL COMPUTADOR CON 0\n" << "Teclee sus coordenadas separadas por un espacio en blanco: "; cin >> x >> y; } while ( (x<1 || x>3) || (y<1 || y>3) ); x--; y--; if (matriz[x][y]!=' ') cout<<"no se puede, intenta otra coordenada\n"; } while (matriz[x][y]!=' '); matriz[x][y]='X'; //verificacin de triunfo del jugador for(i=0;i<3;i++) if(matriz[i][0]==matriz[i][1] && matriz[i][0]==matriz[i][2]) ganador=matriz[i][0]; for(i=0;i<3;i++) if(matriz[0][i]==matriz[1][i] && matriz[0][i]==matriz[2][i]) ganador=matriz[0][i]; if(matriz[0][0]==matriz[1][1] && matriz[1][1]==matriz[2][2]) ganador=matriz[0][0]; if(matriz[0][2]==matriz[1][1] && matriz[1][1]==matriz[2][0]) ganador=matriz[0][2]; if (ganador==' '){ //verifica si gano el jugador //turno del computador

181

for(x=0;x<3;x++){ for(y=0;y<3;y++) if(matriz[x][y]==' ')break; if(matriz[x][y]==' ')break; } if(x*y==9){ cout << "Tablas.\n"; getch(); exit(0); } else matriz[x][y]='O'; } //verificacion de triunfo del computador for(i=0; i<3; i++) if(matriz[i][0]==matriz[i][1] && matriz[i][0]==matriz[i][2]) ganador=matriz[i][0]; for(i=0; i<3; i++) if(matriz[0][i]==matriz[1][i] && matriz[0][i]==matriz[2][i]) ganador=matriz[0][i]; if(matriz[0][0]==matriz[1][1] && matriz[1][1]==matriz[2][2]) ganador=matriz[0][0]; if(matriz[0][2]==matriz[1][1] && matriz[1][1]==matriz[2][0]) ganador=matriz[0][2]; } while (ganador==' '); //presentacin del tablero final clrscr(); for(i=0;i<3;i++){ cout<<" "<<matriz[i][0]<<" | "<<matriz[i][1]<<" | "<<matriz[i][2]; if(i!=2) cout<<"\n---|---|---\n"; } //Escribe el mensaje de triunfo segn el ganador if (ganador=='X') cout<<"\nfelicitaciones, usted acaba de ganar"; else cout<<"\nlo siento, el computador gano"; getch(); }

182

14.11 El siguiente programa presenta la multiplicacin de dos matrices A y B. Ver la primera pregunta en los ejercicios asignados, para refrescar la memoria sobre esta multiplicacin. //MATRIZ9.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> const int M=2, N=3, P=4; void main(){ int A[M][P], B[P][N], C[M][N], i, j, k; clrscr(); cout << "Digite valores de la matriz A for ( i = 0; i < M; i++) for ( j = 0; j < P; j++) { cout << "Posicin: (" << i << "," } clrscr(); cout << "\nDigite valores de la matriz for ( i = 0; i < P; i++) for ( j = 0; j < N; j++) { cout << "Posicin: (" << i << "," } de " << M << "x" << P << ":\n"; << j << "): "; cin >> A[i][j]; B de " << P << "x" << N << ":\n"; << j << "): "; cin >> B[i][j];

// ALGORITMO: MULTIPLICACIN DE DOS MATRICES for ( i = 0; i < M; i++) for ( j = 0; j < N; j++){ C[i][j] = 0; for ( k = 0; k < P; k++) C[i][j] = C[i][j] + A[i][k] * B[k][j]; } clrscr(); for ( i = 0; i < M; i++) { for ( j = 0; j < P; j++) cout << setw(10) << A[i][j]; cout << endl; } cout << endl; for ( i = 0; i < P; i++) { for ( j = 0; j < N; j++) cout << setw(10) << B[i][j]; cout << endl; } cout << endl; for ( i = 0; i < M; i++) { for ( j = 0; j < N; j++) cout << setw(10) << C[i][j]; cout << endl; } }

183

14.12 ACTIVIDADES PARA RESOLVER POR GRUPOS DE ESTUDIO 14.12.1 Estudie el algoritmo de multiplicacin de matrices, C = A x B, dado en el programa MATRIZ11.CPP, para esto tenga en cuenta lo siguiente: La matriz Aij debe ser de orden m x o y en la cual su i-sima fila la denotamos por ai. La matriz Bij debe ser de orden p x m y en la cual su j-sima columna la denotamos por bj. El producto de A y B es una matriz Cij de orden m x n y en la cual cada uno de sus cij trminos son iguales a ai bj. Esto es, el ij-simo elemento de C es el producto escalar de la i-sima fila de A, y la j-sima columna de B. Para obtenerse la expresin final: cij = ai1b1j + ai2b2j + ... + ainbnj NOTA: Dos matrices pueden multiplicarse slo si el nmero de columnas de la primera es igual al nmero de filas de la segunda. De otra forma, los vectores ai y bj tendran diferente nmero de componentes y el producto escalar correspondiente no estara definido. 14.12.2 Efecte lectura del siguiente algoritmo. //MATRIZ_1.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> #define MaxFilas 20 #define MaxColumnas 15 void main(){ int fila, Filas, columna, Columnas, MATRIZ[MaxFilas][MaxColumnas]; clrscr(); cout << "Digite el nmero de filas deseado (Mximo " << MaxFilas << "): "; cin >> Filas; cout << "Nmero de columnas deseado (Mximo " << MaxColumnas << "): "; cin >> Columnas; gotoxy(1,4); for ( fila = 0; fila < Filas; fila++) { for ( columna = 0; columna < Columnas; columna++) { MATRIZ[fila][columna] = fila * Columnas + columna + 1; cout << setw(5)<< MATRIZ[fila][columna]; } cout << endl; } getch(); }

184

14.12.3 Solucione un sistema de ecuaciones lineales, ecuaciones y tres incgnitas, por el mtodo de Cramer.

compuesto

de

tres

Lea inicialmente los coeficientes (a, b, c, d, e, f, g, h, i, j, k, l) y calcule los valores de las incgnitas X, Y, Z. El sistema general a solucionar, recuerde que son tres rectas en el espacio, es el siguiente: aX eX iX + + + bY fY jY + + + cZ gZ kZ = = = d h l

Lea los coeficientes y los trminos independientes en una matriz de 3x4 y efecte a partir de ella los clculos correspondientes al mtodo de Cramer, as: E r r o r ! M a r c a d o r n o d e f i n i d o . a e i b c d

f j

g k

h l

14.12.4 Estudie y mejore el juego de "triqui" o tres en raya presentado en el programa TRIQUI.CPP anterior. Observe que es muy fcil ganarle al computador y no debiera ser as. 14.12.5 Una produccin:
Error! Marcado r no definid o.MESES --> 1

empresa

tiene

para

los

ltimos

aos

el

siguiente

cuadro

de

10

11

12

185

AO 1994 1995 1996 1997 1998 234 4 532 1 567 345 3 635 3 454 3 655 543 654 4 653 3 567 56 234 345 5 764 3 4545 7545 665 1234 8643 434 4545 976 7533 8755 3452 4544 3454 3454 9134 4542 1234 554 7544 9566 1233 1866 5453 7443 9665 4545 6654 4532 3432 9654 5454 234 3322 6543 10454 5453 434 5332 3466 9544 2321 678 2345 6543 9555

Defina una matriz de 5 filas y 12 columnas de tipo float, y calcule lo siguiente: a) El promedio de produccin de cada uno de los aos. b) El mes de mayor produccin de 1996. c) El ao de menos produccin. d) Invente dos preguntas ms, similares.

186

CAPTULO 15 PUNTEROS Y PASO POR REFERENCIA


15.1 INTRODUCCIN Los punteros son variables las cuales guardan direcciones de memoria RAM. En memoria un puntero ocupa 2 bytes. La direccin de memoria RAM la cual almacena un puntero(p) corresponder a la direccin base de otra variable(var) que est en memoria, decimos entonces que el puntero "apunta" a esta variable, de la siguiente forma: P 1000 VAR 1000

"P apunta a VAR"

1000 es una direccin(ficticia en nuestro ejemplo, la verdadera la dar el sistema operativo por intermedio del compilador, cuando est ejecutndose el programa) en memoria, la variable P almacena un valor de 1000. La variable VAR se encuentra en la direccin de memoria 1000(inicia desde hay). La abstraccin que se debe hacer es la de que P apunta o seala a VAR. Se puede definir un puntero de cualquier tipo bsico o de tipos estructurados; al efectuar su declaracin se debe anteponer un asterisco, *, al identificador del mismo. 15.2 PUNTERO A ENTERO El siguiente es un ejemplo con un puntero que apuntar a un entero(recuerde que un entero ocupa 2 bytes en memoria): int *p, entero=13; p entero 1 3 1500 1501

1500 es la direccin base de la variable entero, entero al ocupar 2 bytes estamos suponiendo que ocupar las direcciones 1500 y 1501, estos dos bytes son el desplazamiento(offset) de la variable entero. Observe que el 13 almacenado en la variable entero no est en base 10 como es mostrado, sino en binario, empero lo supondremos de esta forma por facilidad. A continuacin el puntero p tomar la direccin de la variable entero: p = &entero; se lee esta instruccin as: "la direccin(&) de la variable entero se asigna a la variable puntero p"; en memoria el efecto es el siguiente:

187

p 1500

entero 1 3 1500 1501

Si se quiere visualizar el valor de la variable entero a travs del puntero escribiremos la siguiente instruccin: cout << *p; Est mostrar el valor de 13 en pantalla; *p debe ser ledo como: "el valor al cual apunta p", y para saber cual es el valor al cual apunta p, debemos "saber" la direccin que tiene almacenada p y a qu tipo de datos apunta, en este caso la variable p, sabemos, ha sido definida como un puntero a un entero. A travs del puntero podemos, adems y es lo ms importante, modificar el valor de la variable a la cual est apuntando, esto se efecta as: *p = 21; se leer "al valor al que apunta p se le asigna 21", otra vez, para saber cual es el valor al que apunta p, debemos conocer la direccin que almacena, de esta forma en memoria las variables quedarn as: p 1500 entero 2 1 1500 1501

el 13 ha sido destruido al efectuarse la asignacin *p = 21. De similar forma podremos efectuar una lectura por teclado y asignrselo a la variable entero a travs del puntero con la instruccin: cin >> *p; 15.3 PUNTERO A VARIABLE DE PUNTO FLOTANTE Los punteros pueden apuntar a variables de cualquier tipo; en el siguiente ejemplo un puntero, pf, apuntarar a una variable, real, de punto flotante, como sabemos este ltima tipo de variables ocupan 4 bytes en memoria, la sintaxis de la declaracin ser: float *pf, real=4.67; pf real 4.67 2500 2501 2502 2503

2500 es la direccin base de la variable real, real ocupa 4 bytes en RAM, y estamos suponiendo que ocupar las direcciones 2500 a la 2503, estos cuatro bytes son el desplazamiento(offset) de la variable real. A continuacin el puntero pf tomar la direccin de la variable real: pf = &real;

188

se lee esta instruccin as: "la direccin(&) de la variable real se asigna a la variable puntero pf"; en memoria nos no imaginaremos as: pf 2500 real 4.67 2500 2501 2502 2503

Para mostrar el valor de la variable real por medio puntero pf, escribiremos la siguiente instruccin: cout << *pf; Mostrar el valor de 4.67 en pantalla; *pf debe ser ledo como: "el valor al cual apunta pf", y para saber cual es el valor al cual apunta pf, debemos "saber" la direccin que tiene almacenada pf y a qu tipo de datos apunta, en este caso p sabemos ha sido definido como un puntero a un float. A travs del puntero podemos modificar el valor de la variable a la cual est apuntando: *pf = -23.56; se leer "al valor al que apunta pf se le asigna -23.56", otra vez, para saber cual es el valor al que apunta pf, debemos conocer la direccin que almacena, de esta forma en memoria las variables quedarn as: pf 2500 real -23.56 2500 2501 2502 2503

el 4.67 ha sido destruido al efectuarse la asignacin *pf = -23.56. De similar forma podremos efectuar una lectura por teclado y asignrselo a la variable entero a travs del puntero con la instruccin: cin >> *pf; 15.4 PUNTERO A UN VECTOR Supongamos tenemos la siguiente declaracin de variables: int *pv, vector[5] = {17,2,-6,3,28}; la cual corresponde a la siguiente abstraccin: vector pv 0 1 2 3 4 <---ndices 17 2 -6 3 28 direcciones---> 500 501 502 503 504 505 506 507 508 509 Para hacer que el puntero, pv, tome la direccin base del vector se debe escribir la siguiente instruccin:

189

pv = vector; observe que no se coloca el operador de direccin &. La abstraccin que debemos tener quedar: vector pv 0 1 2 3 4 <---ndices 500 17 2 -6 3 28 direcciones---> 500 501 502 503 504 505 506 507 508 509 Los arreglos tienen gran relacin con los punteros y deben ser vistos como punteros a los cuales no se les puede cambiar la direccin(la direccin base que almacenan) es decir como punteros constantes. En este caso la variable vector tiene una direccin base de 500 y un desplazamiento de 2 bytes*5=10 bytes, desde la direccin 500 hasta 509. El anterior arreglo, vector, se puede recorrer con el puntero, segn el siguiente fragmento: for(i=0; i<5; i++) cout << setw(4) << pv[i]; que nos mostrar en pantalla los valores: 17 2 -6 3 28. Es decir que el puntero, pv, se puede indexar de igual forma que se hace con los identificadores de los arreglos. Al ejecutar el fragmento anterior el valor en memoria de pv es de 500, es decir apunta todo el tiempo a la direccin base, el ndice es el que "avanza" en el arreglo. Diferente ser si queremos avanzar en el vector, cambiando la direccin del puntero, es decir que de 500 pase a 502, 504, 506, 508 las cuales son las posiciones base de cada uno de los elementos enteros del vector: vector[0], vector[1], vector[2], vector[3] y vector[4], esto se codificar as: pv = vector; while (*pv && i<5){ cout << setw(4) << *pv; pv++; i++; } En pantalla el efecto sera idntico que en el caso anterior, aparecern: 17 2 -6 3 28. En memoria sera muy diferente, la variable pv cada que se le "suma uno" se incrementar segn el tipo de datos al que apunta, al ser un entero se desplazar en dos bytes, para entenderlo, veamos prueba de ejecucin manual del anterior fragmento en el siguiente tabulado:

190

pv *pv while(*pv) cout<<setw(4)<<*pv pv++ 500 17 verdad 17 502 502 2 verdad 2 504 504 -6 verdad -6 506 506 3 verdad 3 508 508 28 verdad 28 510 510 ??? ??? La abstraccin de lo que ocurre en memoria, despus de esto, quedara as: vector pv 0 1 2 3 4 <---ndices 510 17 2 -6 3 28 ??? direcciones-> 500 501 502 503 504 505 506 507 508 509 510 El puntero pv apuntara a un valor de "basura", mostrado como ???, y por esto mostrara, eventualmente, en pantalla, algo inesperado, si no se coloca la instruccin i<5 para que termine. 15.5 Esta es una demostracin del manejo de un puntero a un nmero real. #include <iostream.h> #include <conio.h> //PUNTERO1.CPP void main(){ float N=5, *p; clrscr(); cout << "N = " << N; p = &N; cout << "\nA la variable p se le asign el valor: " << p; cout << "\nN = " << *p; cout << "\nDigite un valor para la variable N: "; cin >> *p; cout cout cout cout } << "\nN = " << N; <<"\n\nVariable N est en la direccin de memoria: " <<p; <<"\n\nVariable N est en la direccin de memoria: "<<&N; <<"\n\nPuntero p est en la direccin de memoria: " <<&p;

getch();

191

15.6 Esta es una demostracin del manejo de los punteros. #include <iostream.h> #include <conio.h> #include <stdio.h> //PUNTERO2.CPP main(){ int *pE, i, j, entero=234, vectorE[] = {3,45,23,67,9}, matrizE[][3] = {4, 7, 8, 9, 2, 0, 6, 2, 9}; char *pC = "Esta es una demostracin\n\n", caracter = ' ', Cadena[] = {'C','a','l','i','\0'}, *Cad[] = {'\0'}, *Cadenas[] = {"Palmira ", "Valle ","Colombia" }; float *pR, real = 7.5, vectorR[] = {3.2, 4.5, -5.7, 0, 0.2}, matrizR[][3] = {4.3, 6.5, 7.8, 9.8, 1.2, 0.4, 6.4, 2.3, 9.6}; clrscr(); cout << "VARIABLE VALOR DIRECCION\n\n"; pE = &entero; cout << "entero \t" << *pE << "\t" << pE << "\n\n"; pE = vectorE; for (i=0; i<5; i++) { cout <<"\nvectorE[" << i << "]\t" << *pE << "\t" << pE; pE++; } cout <<"\n"; pE = (int *) matrizE; for (i=0; i<3; i++) for (j=0; j<3; j++){ cout <<"\nmatrizE[" <<i <<"][" <<j <<"]\t" <<*pE<<"\t" <<pE; pE++; } getch(); clrscr(); cout << "VARIABLE pR = &real; cout <<"real VALOR DIRECCION\n\n";

\t" << *pR << "\t" << pR << "\n\n";

pR = vectorR; for (i=0; i<5; i++) { cout <<"\nvectorR[" << i << "]\t" << *pR << "\t" << pR; pR++;

192

} cout << "\n"; pR = (float *) matrizR; for (i=0; i<3; i++) for (j=0; j<3; j++){ cout <<"\nmatrizR[" <<i <<"][" <<j <<"]\t" <<*pR <<"\t"<<pR; pR++; } getch(); clrscr(); cout <<"VARIABLE VALOR DIRECCION\n\n";

pC = &caracter; cout <<"caracter\t"<<*pC<<"\t"<<pC<<"\n\n";//No d la direccin cout <<"Cadena \t" << Cadena <<"\t" << &Cadena << "\n\n";

*Cad = Cadena; cout <<"*Cad\t"<< *Cad<< "\t"<<Cad<<"\n\n";//No d la direccin pC = Cadena; i=0; while (*pC) { cout<<"\nCadena["<<i<<"]\t"<<*pC <<"\t"<<pC;//No d direccin pC++; i++; } cout <<"\n"; for (i=0; i<3; i++) cout<<"\n*Cadenas["<<i<<"]\t"<<Cadenas[i]<<"\t"<<&Cadenas[i]; getch(); return 0; }

193

15.7 El siguiente es un ejemplo en el cual un puntero "apunta" a un registro(struct). Ver el siguiente captulo para la definicin de este tipo de datos estructurado. //PUNTERO3.CPP #include <iostream.h> #include <stdio.h> typedef struct persona PERSONA; struct persona{ char nombre[20]; int edad; float alto; } main(){ PERSONA amigo, *p; p = &amigo; cout << "Nombre: "; gets(p->nombre); cout << "Edad: "; cin >> p->edad; cout << "Altura: "; cin >> p->alto; cout << p->nombre << " " << p->edad << " " << p->alto; } 15.8 El siguiente algoritmo presenta el intercambio del valor de dos variables en la memoria RAM del computador, por medio de una invocacin de una funcin por referencia al estilo del C. //FUNCION8.CPP #include <iostream.h> #include <conio.h> IntercambioEnMemoria(int *a, int *b){ int *aux; //variable local *aux= *a; *a = *b; *b = *aux; } main(){ int a,b; clrscr(); cout << "Digite un real para almacenar en variable A: "; cout << "Digite un real para almacenar en variable B: "; IntercambioEnMemoria(&a, &b); cout <<"\nDespus de intercambiadas, A ahora es igual a "<<a; cout << "\ny la variable B ahora es igual a " << b; }

cin >> a; cin >> b;

194

15.9 Ejemplo de paso de parmetro por referencia al nuevo estilo del C++. Convierte un nmero en base 10 a base binaria #include <iostream.h> #include <conio.h> //REFEREN2.CPP leer(int &N){ cout << "Digite: "; cin >> N; } CalcularBinario(int &N){ int c, r; c = N >> 1; // divide entre dos r = N % 2; cout << "\n" << r << " Leer de abajo hacia arriba"; while(c){ r = c % 2; c >>= 1; cout << "\n" << r; } } main(){ int decimal; leer(decimal); //invocacin por referencia CalcularBinario(decimal); //invocacin por valor } 15.10 El siguiente algoritmo presenta el intercambio del valor de dos variables en la memoria RAM del computador, por medio de una invocacin de una funcin con parmetros por referencia. //FUNCION9.CPP #include <iostream.h> #include <conio.h> IntercambioEnMemoria(int &a, int &b){ //Esto dara error en C, y no en C++ int aux; //variable local aux = a; a = b; b = aux; } void main(){ int a,b; cout << "Digite un real para almacenar en variable A: "; cin >> a; cout << "Digite un real para almacenar en variable B: "; cin >> b; IntercambioEnMemoria(a, b); cout <<"\nAhora A = " <<a << " y B = " << b << " despus del intercambio"; } //observe que N al ser puntero se coloca sin &

195

15.12 Este programa convierte un decimal a binario. //PUNTERO6.CPP #include <iostream.h> #include <conio.h> int leer(){ int N; clrscr(); cout << "Digite un entero para convertirlo a binario: "; cin >> N; return (N); } void CalcularBinario(int N, int *r){ int c; c = N >> 1; *r = N % 2; while(c){ r++; *r = c % 2; c >>= 1; } r++; *r = 2; //se utiliza el dos como terminador } void main(){ int b=0, j, decimal, binario[20]; decimal = leer(); CalcularBinario(decimal, binario); cout << "\n\nbinario = " ; while(binario[b]==1 || binario[b]==0) b++; for(j=b-1; j>=0; j--) cout << binario[j]; } // busca el final de la cadena

// escribe el binario adecuadamente

196

15.13 El siguiente algoritmo en lenguaje C ordena alfabticamente, en forma ascendente, cadena de caracteres. //PUNTERO7.CPP #include <iostream.h> #include <string.h> #include <conio.h> #include <stdio.h> void main(){ char *cadena, aux; int i, j; cout << "Digite una frase: "; gets(cadena); cout << "Longitud cadena = " << strlen(cadena) << "\n\n"; for(i=0; i<strlen(cadena); i++) for(j = i+1; j<strlen(cadena); j++) if(cadena[i] > cadena[j]){ aux = cadena[i]; cadena[i] = cadena[j]; cadena[j] = aux; } cout << "\"frase ordenada alfabticamente\": \n" ; puts(cadena); } 15.14 A continuacin se presenta una demostracin de como el lenguaje C maneja cada posicin de un arreglo bidimensional por medio de punteros. Recuerde que un arreglo bidimensional es solamente un arreglo de arreglos. //MATRIZ10.CPP #include <iostream.h> #include <iomanip.h> #include <conio.h> const int MaxFila=5, MaxCol=4; void main(){ int Matriz[MaxFila][MaxCol], Fila, Col; clrscr(); for ( Fila = 0; Fila < MaxFila; Fila++){ for ( Col = 0; Col < MaxCol; Col++){ Matriz[Fila][Col]= Fila*Col+1; cout << setw(10) << Matriz[Fila][Col]; } cout << endl; } getch(); for ( Fila = 0; Fila < MaxFila; Fila++) { for ( Col = 0; Col < MaxCol; Col++) cout << setw(10) << *( *(Matriz+Fila) + Col) ; cout << endl; } }

197

15.15 Se digitan N nmeros se almacenan en vector y luego se ordenan. Este programa no funciona si se le da a alguna posicin del vector el valor de cero, debido a que la instruccin while lo evaluar como falso, terminando el ciclo repetitivo. El profesor efectuar taller de lectura con este algoritmo. //PUNTERO8.CPP #include <iostream.h> #include <conio.h> const int N=5; Leer(int *v){ int i=0; gotoxy(10,2); cout << "Digite " << N << " nmeros"; while (i < N) { gotoxy(10,4+i); cin >> v[i]; i++; } } Ordenar(int *p){ int *q, aux; while(*p){ q = p+1; while(*q){ if (*p > *q){ aux = *p; *p = *q; *q = aux; } q++; } p++; } } Escribir(int *p){ cout <<"\n\tLos nmeros ordenados son:\n\n"; while(*p){ cout.width(4); cout << *p; p++; } } void main(){ int vector[N]; Leer(vector); Ordenar(vector); Escribir(vector); }

198

15.16 Se digitan N nmeros se almacenan en vector y luego se ordenan. //PUNTERO9.CPP #include <iostream.h> #include <conio.h> #define N 10 Leer(int *v){ int i=0, num; gotoxy(10,2); cout << "Digite " << " nmeros"; while (i < N){ gotoxy(10,4+i); cin >> v[i++]; } } Ordenar(int *v){ int i,j,aux ; for (i = 0; i < N; i++) for (j = i+1; j < N; j++) if (v[i] > v[j]){ aux = v[j]; v[j]= v[i]; v[i] = aux; } } Escribir(int *v){ int i; cout << "\n\tLos nmeros ordenados son:\n\n"; for (i = 0; i < N; i++){ cout.width(5); cout << v[i]; } } main(){ int numeros[N]; clrscr(); Leer(numeros); Ordenar(numeros); Escribir(numeros); while (!kbhit()); }

199

15.17 Programa de estadstica bsica //ESTADIST.CPP #include #include #include #include #include #include #include #include <iostream.h> <iomanip.h> <fstream.h> <graphics.h> <math.h> <conio.h> <ctype.h> <stdlib.h>

const int MaxArreglo = 20; int intro_datos(float *datos) { int t, max; gotoxy(38,1); cout << "Digite nmero de tems?: "; gotoxy(63,1); cin >> max; for(t=0; t<max; ++t) { gotoxy(40, 2+t); cout << "Introduzca Item " << t+1 << ": "; cin >> datos[t]; } gotoxy(40, 3+t); cout << "Cualquier tecla y seguir..." ; getch(); return max; } void marco(){ int indice; window(1,1,80,25); clrscr(); cout<<""; cout<<" EJEMPLO DE ESTADSTICA BSICA "; cout<<""; for(indice = 5; indice < 25; ++indice) cout<<" "; cout<<""; window(2,7,70,23); } char CaracterEstaEn(char ch, char *s){ while(*s) { if(ch == *s) return ch; else s++; } return 0; } float CalcularPromedio(float *datos, int N){ register int t; float med=0; for(t = 0; t < N; ++t) med += datos[t]; med /= N; return med; }

200

void Clasificar(float *datos, unsigned int N){ register int i,j; float aux; for (i = 0; i < N; i++) for (j = i; j < N; j++) if (datos[i] > datos[j]){ aux = datos[j]; datos[j]= datos[i]; datos[i] = aux; } } float CalcularMediana(float *datos, unsigned int N){ register int t; float temporal[MaxArreglo]; for (t=0; t<N; ++t) temporal[t] = datos[t]; /* copiar datos*/ Clasificar(temporal, N); return (temporal[(N-1)/2]); } float EncontrarModa(float *datos, int N){ register int t, w; float md, AnteriorModa; int cont, antcont; AnteriorModa=0; antcont=0; for (t=0; t< N; ++t) { md = datos[t]; cont = 1; for(w=t+1; w < N; ++w) if(md == datos[w]) cont++; if(cont > antcont) { AnteriorModa = md; antcont = cont; } } return AnteriorModa; } float BuscarMenor(float *datos, int N){ register int t; float minimo; for(minimo = datos[0], t=1; t < N; ++t) if(datos[t] < minimo) minimo = datos[t]; return minimo; } float BuscarMayor(float *datos, int N){ register int t;

201

float max; for(max = datos[0], t = 1; t < N; ++t) if(datos[t] > max) max = datos[t]; return max; } void mostrar(float *datos, int max){ register int t; float total=0, porcentajes[MaxArreglo]; for (t = 0; t < max; t++) total += datos[t]; for (t = 0; t < max; t++) porcentajes[t] = datos[t] / total; for(t = 0; t < max; ++t) { gotoxy(32,1+t); cout << setfill('.') << setw(2) << t+1 << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setiosflags(ios::right) << setprecision(2) << setw(10) << datos[t] << setw(10) << porcentajes[t]*100 << "%"; } gotoxy(35,4+t); cout <<"Cualquier tecla y seguir... "; getch(); } float DesviacionEstandard(float *datos, int max){ register int t; float DesvStd=0, Promedio; double aux; Promedio = CalcularPromedio(datos,max); for(t = 0; t < max; ++t) DesvStd += ((datos[t] - Promedio) * (datos[t] - Promedio)); if(max) DesvStd /= max; DesvStd = sqrt(DesvStd); return DesvStd; } void GraficarPorcentajes(float *datos, int max){ int ManejadorGrafico, ModoGrafico; int i, izquierda, arriba, ancho, abajo, profundidad; float total=0; float porcentajes[MaxArreglo]; if (max){ for (i = 0; i < max; i++) total += datos[i]; for (i = 0; i < max; i++) porcentajes[i] = ((float) datos[i]) / total; detectgraph(&ManejadorGrafico, &ModoGrafico); initgraph(&ManejadorGrafico, &ModoGrafico, "c:\\tc\\bgi"); ancho = (int)( (getmaxx()) / ((max * 2 ) + 1) ); abajo = getmaxy() - 10; profundidad = (int) (ancho / 4); izquierda = ancho;

202

setbkcolor(WHITE); for (i = 0; i < max; i++) { arriba=(abajo) - ((int)(porcentajes[i] * (getmaxy() - 25))); setcolor(RED); //color de las lneas de cada barra setfillstyle(i+1, i+1); bar3d(izquierda,arriba,(izquierda+ancho),abajo,profundidad,1); izquierda += (ancho * 2); } getch(); closegraph(); marco(); } } void Impresora(float *datos, int max){ register int t; float total=0, porcentajes[MaxArreglo]; ofstream Imprimir("PRN"); for (t = 0; t < max; t++) total += datos[t]; for (t = 0; t < max; t++) porcentajes[t] = datos[t] / total; gotoxy(35,4); cout <<"Imprimiendo... "; Imprimir<<"\n Registro Datos Porcentajes \n\n"; for(t = 0; t < max; ++t) { Imprimir << setfill('.') <<setw(5) << t+1 << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setiosflags(ios::right) << setprecision(2) << setw(15) << datos[t] << setw(15) << porcentajes[t]*100 << "%" << endl; } Imprimir << "\f"; } void LeerArchivoYCargarEnDatos(float *datos, int &N){ int IDArchivo; fstream Archivo; N=0; Archivo.open("Estadist.ica", ios::in | ios::binary); if(Archivo){ while( Archivo.read( (char *)&datos[N], sizeof(float) ) ) N++; Archivo.close(); cout << "Ledos desde disco: " ; mostrar(datos, N); } else cout << "Archivo no existe"; } void GrabarDatosEnArchivo(float *datos, int N){ int i; fstream Archivo; Archivo.open("Estadist.ica", ios::out|ios::binary|ios::trunc); //borra archivo si existe if (!Archivo)

203

cout << "Error en la apertura del archivo \a"; else{ for(i=0; i<N; i++) Archivo.write((char *)&datos[i], sizeof(float)); Archivo.close(); } } void Regresion(float *datos, int max){ clrscr(); cout << "TAREA: IMPLEMENTE ESTE MODULO. DIGITE TECLA "; getch(); } char OpcionMenu(){ char entrada; clrscr(); do { gotoxy( 3, 1); cout << "MEN PRINCIPAL"; gotoxy( 3, 2); cout << "=============="; gotoxy( 3, 3); cout << "Capturar datos"; gotoxy( 3, 4); cout << "Estadsticas bsicas"; gotoxy( 3, 5); cout << "Ordenar de menor a mayor"; gotoxy( 3, 6); cout << "Mostrar datos"; gotoxy( 3, 7); cout << "Graficar en barras"; gotoxy( 3, 8); cout << "Imprimir en papel"; gotoxy( 3, 9); cout << "Terminar"; gotoxy( 3,13); cout<<"Elija letra inicial (C E O M G I T): "; gotoxy(39,13); entrada = toupper(getch()); } while (!CaracterEstaEn(entrada, "CEOMGIT")); return entrada; } void main(){ //ESTADSTICA BSICA FUNCIN PRINCIPAL float datos[MaxArreglo]; // almacena valores de la muestra int N=0; //Nmero verdadero de elementos float Promedio=0,Mediana=0,DesvStd=0, Varianza=0, Moda=0, Mayor=0, Menor=0; marco(); LeerArchivoYCargarEnDatos(datos, N); for(;;) { switch( OpcionMenu() ) { case 'C':N = intro_datos(datos); break; case 'E':Promedio = CalcularPromedio(datos, N); Mediana = CalcularMediana(datos, N); Moda = EncontrarModa(datos, N); Menor = BuscarMenor(datos, N); Mayor = BuscarMayor(datos, N); DesvStd = DesviacionEstandard(datos, N); Varianza = DesvStd*DesvStd; gotoxy(30, 1); cout << "Promedio : " gotoxy(30, 2); cout << "Mediana : " gotoxy(30, 3); cout << "Desviacin Std : " gotoxy(30, 4); cout << "Varianza : "

<< << << <<

Promedio; Mediana; DesvStd; Varianza;

204

case case case case case } } }

gotoxy(30, 5); cout << "Moda : " << Moda; gotoxy(30, 6); cout << "Mximo : " << Mayor; gotoxy(30, 7); cout << "Mnimo : " << Menor; gotoxy(30, 9); cout << "Cualquier tecla y seguir... "; getch(); break; 'M':mostrar(datos, N); break; 'O':Clasificar(datos, N); mostrar(datos, N); break; 'G':GraficarPorcentajes(datos, N); break; 'I':Impresora(datos, N); break; 'T':GrabarDatosEnArchivo(datos, N); exit(0);

205

CAPTULO 16. MEN DE CONMUTADORES EN MODO GRFICO


El siguiente programa es una demostracin de un men de conmutadores horizontales y de varias primitivas de dibujo en modo grfico. El profesor en clase magistral explicar paso a paso la construccin de un programa como este. Adicionalmente compile y ejecute el programa de demostracin de la Borland, BGIDEMO.C, el cual est en el directorio \tc\bgi, observe que tiene extensin *.C, es decir est escrito en lenguaje C, y no en C++. \\MENU_HV.CPP #include <graphics.h> #include <stdlib.h> #include <ctype.h> #include <bios.h> #include <conio.h> #include <dos.h> #include <stdio.h> //Definicin de constantes globales: const DesActivo=0, Activo=1; //Definicin de algunos prototipos de funciones: void CentrarXCad(int Fila, char *Cad); void RealzaCuadro(int x1,int y1,int x2,int y2,int color1,int color2); void ReCuadro(int X, int Y, char *Cad, int Color, int Oprimido); void PulsadoCuadro(int X,int Y,char *Cad,int Color); void Presentacion0(); void Presentacin(); /************************************************************************/ /* Funcin : CentrarxCad */ /* Objetivo : Esta funcin se encarga de escribir una cadena */ /* centrada en la pantalla en modo grfico */ /************************************************************************/ void CentrarXCad(int Fila, char *Cad) { int largo = textwidth(Cad); outtextxy((getmaxx() -largo)/2,Fila,Cad); } /*******************************************************************/ /* Funcin : RealzaCuadro */ /* Objetivo : Muestra un rectangulo en pantalla, el cual significa */ /* una de las opciones del men */ /*******************************************************************/ void RealzaCuadro(int x1,int y1,int x2,int y2,int color1,int color2){ setcolor(color1); line(x1,y1,x2,y1); line(x1,y1,x1,y2); setcolor(color2); line(x1,y2,x2,y2); line(x2,y2,x2,y1); } /*************************************************************************/ /* Funcin : ReCuadro */ /* Objetivo : Realiza recuadro, con una cadena centrada en su interior, */ /* da a significar una de las opciones de un men */ /*************************************************************************/ void ReCuadro(int X, int Y, char *Cad, int Color, int Oprimido) { register int AltoCuadro, LargoCuadro; char c[2]; settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);

207

AltoCuadro = textheight("H") + 7; LargoCuadro = textwidth(Cad) + 7; setfillstyle(SOLID_FILL, Color); setcolor(DARKGRAY); bar3d(X, Y, X+LargoCuadro,Y+AltoCuadro, 4, 1); if (Oprimido) { setcolor(DARKGRAY); line(X+1, Y+1, X+1, Y+AltoCuadro-1); line(X+1, Y+1, X+LargoCuadro-1, Y+1); setcolor(WHITE); } else { setcolor(WHITE); line(X+1, Y+1, X+1, Y+AltoCuadro-1); line(X+1, Y+1, X+LargoCuadro-1, Y+1); setcolor(DARKGRAY); } line(X+LargoCuadro-1, Y+1, X+LargoCuadro-1, Y+AltoCuadro-1); line(X+1, Y+AltoCuadro-1, X+LargoCuadro-1, Y+AltoCuadro-1); outtextxy(X+5, Y+5, Cad); setcolor(RED); c[0] = Cad[0]; c[1] = '\0'; outtextxy(X+5,Y+5,c); } /****************************************************************/ /* Funcin : PulsadoCuadro */ /* Objetivo : Realiza ReCuadro con una cadena centrada en su */ /* interior y da la sensacin de que se oprime */ /****************************************************************/ void PulsadoCuadro(int X,int Y,char *Cad,int Color) { ReCuadro(X,Y,Cad,Color,DesActivo); delay(100); ReCuadro(X,Y,Cad,Color,Activo); delay(100); ReCuadro(X,Y,Cad,Color,DesActivo); } /*************************************************************************/ /* Funcin : Presentacin */ /* Objetivo : presentar el nombre de la funcin y logo del estudiante */ /*************************************************************************/ void PresentacionSubMenu(char *SubtituloMenu) { clearviewport(); setcolor(MAGENTA); rectangle(0,0, getmaxx(), getmaxy()); RealzaCuadro(10,10,520,437,DARKGRAY,WHITE); RealzaCuadro(20,20,510,430,WHITE,DARKGRAY); setcolor(YELLOW); settextstyle(TRIPLEX_FONT, HORIZ_DIR,5); outtextxy(100,50, "PROYECTO"); settextstyle(TRIPLEX_FONT, HORIZ_DIR,4); setcolor(14); outtextxy(100, 140, "SUBMEN"); setcolor(13); outtextxy(100, 250, SubtituloMenu); settextstyle(DEFAULT_FONT, HORIZ_DIR, 1); } /************************************************************************* */ /* Funcin : subMenu */ /* Objetivo : Implementar men para el manejo de funciones en la lista. */ /************************************************************************* */ void SubMenu(char *SubtituloMenu) { const int Arb =72, Abj =80, Entrar =13, MaxOp=8; int i, Col=550, c, pos = 0, Invocar=1, Yo=20, DeltaY=25;; char *Opcion[MaxOp] = { "Listar ",

208

"Capturar ", "Eliminar ", "Imprimir ", "Buscar ", "Graficar ", "Recursin", "Salir " }; for(;;) { if(Invocar){ PresentacionSubMenu(SubtituloMenu); Invocar=0; for(i=0; i<MaxOp; i++) { ReCuadro(Col, Yo+DeltaY*i, Opcion[i], LIGHTGRAY, DesActivo); } ReCuadro(Col, Yo+DeltaY*pos, Opcion[pos], LIGHTGRAY, Activo); } c = getch(); while (c==0) { c = getch(); switch (c) { case Abj: ReCuadro(Col,Yo+DeltaY*pos,Opcion[pos],LIGHTGRAY,DesActivo); pos++; if(pos==MaxOp) pos=0; ReCuadro(Col,Yo+DeltaY*pos,Opcion[pos],LIGHTGRAY,Activo); break; case Arb: ReCuadro(Col,Yo+DeltaY*pos,Opcion[pos],LIGHTGRAY,DesActivo); pos--; if(pos== -1) pos= MaxOp -1; ReCuadro(Col,Yo+DeltaY*pos,Opcion[pos],LIGHTGRAY,Activo); break; case 45: exit(0);//Alt-X case 59: break;// F1 } c = getch(); } if (c==27) return; if( isalpha(c) ){//Se digit letra inicial? c=toupper(c); i=0; while( c!=Opcion[i][0] && i<MaxOp) i++; if(i<MaxOp){// Se digit letra inicial de opcin pos = i; Invocar=1; } } else if (c==Entrar) Invocar=1; else Invocar = 0; if(Invocar){ PulsadoCuadro(Col,Yo+DeltaY*pos,Opcion[pos],LIGHTGRAY); switch(pos) { case 0 : break; case 1 : break; case 2 : break; case 3 : break;

209

case case case case } } } }

4 5 6 7

: : : :

break; break; break; return;

void PresentacionMain() { clearviewport(); setcolor(DARKGRAY); rectangle(0,0, getmaxx(), getmaxy()); RealzaCuadro(10,40,620,470,DARKGRAY,WHITE); RealzaCuadro(20,50,610,460,WHITE,DARKGRAY); settextstyle(DEFAULT_FONT, HORIZ_DIR,6); setcolor(LIGHTRED); CentrarXCad(60, "C.U.A.O"); setcolor(YELLOW); CentrarXCad(100, "Plantilla Proyecto"); settextstyle(DEFAULT_FONT, HORIZ_DIR,3); setcolor(WHITE); CentrarXCad(200, "Graficacin en Lenguaje C"); setcolor(WHITE); CentrarXCad(300, "Profesor"); setcolor(GREEN); CentrarXCad(350, "Humberto Mazuera Prraga"); } /************************************************************************ */ /* Funcin : Principal */ /* Objetivo :Men para el manejo de funciones. */ /************************************************************************ */ void main() { const Der =77, Izq =75, Entrar =13, MaxOp =5; int i, fila =10, c, pos = 0, Invocar=1, Ancho=0, Margen=14; char *Opcion[MaxOp]={"Pelculas","Usuarios","Alquiler","Balance" ,"Salir"}; int PosX[MaxOp]; int Manejador=DETECT, modo; initgraph(&Manejador, &modo, "c:\\tc\\bgi"); for(i=0; i<MaxOp; i++) Ancho= Ancho+textwidth(Opcion[i])+Margen; PosX[0]= (getmaxx()-Ancho)/2; for(i=1; i<MaxOp; i++) PosX[i]= PosX[i-1]+textwidth(Opcion[i-1])+Margen; for(;;) { if (Invocar){ PresentacionMain(); for(i=0; i<MaxOp; i++) { ReCuadro(PosX[i],fila,Opcion[i],LIGHTGRAY,DesActivo); } ReCuadro(PosX[pos],fila,Opcion[pos],LIGHTGRAY,Activo); Invocar = 0; } c = getch(); while (c==0) { c = getch(); switch (c) { case Der: ReCuadro(PosX[pos],fila,Opcion[pos],LIGHTGRAY,DesActivo); pos++;

210

if(pos==MaxOp) pos=0; ReCuadro(PosX[pos],fila,Opcion[pos],LIGHTGRAY,Activo); break; case Izq: ReCuadro(PosX[pos],fila,Opcion[pos],LIGHTGRAY,DesActivo); pos--; if(pos== -1) pos= MaxOp -1; ReCuadro(PosX[pos],fila,Opcion[pos],LIGHTGRAY,Activo); break; case 45: exit(0);//Alt-X case 59: break;// F1 } c = getch(); }//while if (c==27) return; if (c== Entrar) Invocar = 1; else if( isalpha(c) ){//Se digit letra inicial? c=toupper(c); i=0; while( c!=Opcion[i][0] && i<MaxOp) i++; if(i<MaxOp){// Se digit letra inicial de opcin pos = i; Invocar=1; } } if(Invocar){ PulsadoCuadro(PosX[pos],fila,Opcion[pos],LIGHTGRAY); switch(pos) { case 0 : SubMenu("Pelculas"); break; case 1 : SubMenu("Usuarios"); break; case 2 : SubMenu("Alquiler"); break; case 3 : SubMenu("Balance"); break; case 4 : closegraph(); return; } } } }

211

CAPTULO 17. ESTRUCTURA DE DATOS REGISTRO


17.1 ESTRUCTURA DE DATOS REGISTROS(STRUCT) En C/C++ un registro se representa por medio de el identificador struct. De esta forma una estructura es un conjunto de campos(fields) o miembros que se citan y manejan con el mismo nombre y que permite adems la utilizacin individual de sus elementos, y que pueden ser declarados en forma global o local. La sintaxis general de este tipo de datos cumple con el siguiente formato: struct NombreDeRegistro{ TipoDeDatos NombreCampo1; TipoDeDatos NombreCampo2; ...; TipoDeDatos NombreCampoN; }; o tambin: struct NombreDeRegistro{ TipoDeDatos NombreCampo1; TipoDeDatos NombreCampo2; ...; TipoDeDatos NombreCampoN; } NombreVariable1, NombreVariable2, ..., NombreVariableN; En la primera forma presentada, se debe tener mucho cuidado en no omitir el punto y coma como terminador; en caso de omitirlo se presentan una serie de errores, que el recin iniciado, es probable, atribuir a otras cosas. En cualquiera de las dos formas, se podrn definir variables, posteriormente en el programa, segn la siguiente sintaxis: struct NombreDeRegistro NombreVariable1, NombreVariable2, ..., NombreVariableN; Los tipos de datos de cada uno de los campos pueden ser de cualquiera de los tipos primitivos o estructurados, incluyndose al mismo tipo struct. En los casos en que se pretendan definir todas las variables de tipo, struct, en la misma instruccin, se puede omitir el nombre de el registro, utilizando el siguiente formato: struct { TipoDeDatos NombreCampo1; TipoDeDatos NombreCampo2; ...; TipoDeDatos NombreCampoN; } NombreVariable1, NombreVariable2, ..., NombreVariableN; quedar claro que posteriormente no se podrn definir variables de este mismo tipo.

213

Ejemplos de definicin de tipos de datos "estructura" son los siguientes: struct Punto{ int X, Y, Color, Atributo; } MiPuntico; struct Nacion{ char Nombre[20]; char Capital[25]; float KilmetrosCuadrados; float Poblacin; char Lenguaje[15]; } Pais; struct Registro{ char Nombre[Max]; int edad; float salario; } Vector[N];

La utilizacin de cada uno de los miembros dentro de las estructuras anteriores se efectuar de las siguientes y respectivas formas: MiPuntico.X, MiPuntico.y, MiPuntico.Color, MiPuntico.Atributo.

Pais.Nombre, Pais.Capital, Pais.KilometrosCuadrados, Pais.Poblacion, Pais.Lenguaje. Vector[0].nombre, Vector[0].edad, Vector[1].salario Vector[1].nombre, Vector[1].edad, Vector[1].salario ... Vector[N-1].nombre, Vector[N-1].edad, Vector[N-1].salario Las expresiones anteriores se utilizarn como cualquier otro identificador de variable de las vistas hasta ahora, referente a las operaciones de lectura, escritura, asignacin y formar parte de expresiones al lado derecho de asignaciones, como pueden observar en los programas que se muestran a continuacin en este y siguientes captulos. En la memoria RAM, las anteriores definiciones de variables debemos abstraerlas de la siguiente forma: VARIABLE MiPuntico: Error! Marcador no definido. X VARIABLE Pais:
Error! Marcador no definido. Nombre Capital KilometrosCuadrados Poblacion Lenguaje

Color

Atributo

VARIABLE: Vector: Vector[0] Vector[1]


Error! Marcador no definido.Vector[0]. nombre Vector[0].edad Vector[0].salario Vector[1].nombre

Vector[...]
Vector[...].nombre

Vector[N-1]
Vector[N-1].nombre

Vector[1].edad Vector[1].salario

Vector[...].edad Vector[...].salario

Vector[N-1].edad Vector[N-1].salario

En las anteriores tablas se muestra el nombre de cada campo correspondiente a las tres variables, se sobreentiende que en su lugar irn datos en la memoria RAM.

214

17.2 Se utiliza la estructura de datos incorporada registro del C: struct. Se efecta ejemplo de lectura y escritura de un registro. #include <iostream.h> //STRUCT0.CPP main(){ const int Max=20; struct registro { char nombre[Max]; int edad; float salario; } amigo; cout cout cout cout } 17.3 Se utiliza la estructura de datos incorporada registro del C: struct. Se muestra ejemplo de utilizacin de vector de registros. #include <iostream.h> #include <conio.h> const int Max=20; //STRUCT1.CPP struct registro { char nombre[20]; int edad; float salario; } amigos[Max]; main(){ int num_reg = 0, i; cout <<"Cuntos amigos desea introducir? (mximo " <<Max <<") "; cin >> num_reg; for (i=0;i<num_reg;++i) { cout << "Registro : " << i << "\n"; cout << " Salario: "; cin >> amigos[i].salario; cout << " Nombre : "; cin >> amigos[i].nombre; cout << " Edad : "; cin >> amigos[i].edad; } clrscr(); cout << "-----------------------------------------------------\n"; for (i=0; i<num_reg; ++i) cout << i+1 << " " << amigos[i].nombre << " " << amigos[i].edad << " " << amigos[i].salario << endl; cout << "-----------------------------------------------------\n"; } << "Digite su nombre: "; cin >> amigo.nombre; << "Digite su edad: "; cin >> amigo.edad; << "Digite su salario: "; cin >> amigo.salario; << "\n\nNombre: " << amigo.nombre << "\nSalario: $ " << amigo.salario << "\nedad: " << amigo.edad << " aos";

215

Error! Marcador no definido.CAPTULO 18. ESTRUCTURA DE DATOS ARCHIVO


18.1 ARCHIVOS Y REGISTROS Un archivo o fichero es una estructura de datos que reside en memoria auxiliar, por ejemplo en disco duro, consistente en un conjunto de informacin estructurada en unidades de acceso denominadas registros, todas del mismo tipo y en nmero limitado solo por la capacidad del medio de almacenamiento. Un registro lgico, artculo o simplemente registro es cada una de las componentes del archivo. Cada uno de estos registros est constituido por uno o ms elementos denominados campos o miembros, que pueden ser de diferentes tipos, segn ya vimos, en la seccin anterior de este captulo. Si un archivo contiene la informacin de un conjunto de individuos u objetos, sus registros contienen la informacin de cada uno de ellos, individuo u objeto, y los campos los diferentes datos que componen a cada registro. Por ejemplo, en el archivo de personal de una Empresa, cada registro contiene la informacin de un empleado y los campos contienen su nmero de cdula, nombre, direccin, fecha de ingreso, etc. El nombre ser un campo y el campo clave puede ser el nmero de Cdula. Las principales caractersticas que diferencian esta estructura de datos de las restantes son las siguientes: - Residencia en soportes de informacin externos, tambin denominados memorias secundarias o auxiliares, como son las cintas y discos. Para hacer desaparecer un archivo ser necesario realizar explcitamente una operacin de borrado. - Independencia respecto de los programas. Significa que la vida del archivo no est limitada por la vida del programa que lo cre, y tambin que en diferentes momentos pueden utilizar el mismo archivo diferentes programas. - Gran capacidad de almacenamiento, dependiendo solo del tamao del disco. En C++ para abrir un archivo, se debe enlazar con un flujo(stream). Habiendo tres clases de flujos: de entrada, de salida y de entrada/salida. Para abrir un flujo de entrada utilizaremos, del archivo a incluir fstream.h, la clase ifstream. Para uno de salida est la clase ofstream, y para uno de entrada/salida se declarara una variable de la clase fstream. Por ejemplo las siguientes seran declaraciones vlidas para flujos(stream): #include <FStream.H> ifstream LecturaArchivo; //Define un buffer para operaciones de entrada (in) ofstream EscrituraArchivo; //Define un buffer para operaciones de salida (out) fstream LectoEscrituraArchivo; //Define un buffer para operaciones de entrada/salida (in/out) A continuacin de ser declarada una variable que maneja un flujo, este debe asociarse con un archivo fsico (recuerde las reglas de nombres de archivo del DOS), por ejemplo con la funcin open(), la cual es miembro de cada una de las tres clases sealadas antes en el prrafo anterior. Recordar que todo archivo para su correcto procesamiento, debe inicialmente ser abierto. Adicionalmente la funcin open(), en caso de no existir el archivo con el cual se est asociando, ella lo crear, no siendo necesario crearlo expresamente, como ocurre con otras familias de funciones del C o de otros lenguajes.

216

Al efectuarse la apertura del archivo, internamente el C++, maneja dos apuntadores al inicio del archivo, es decir al primer registro de el mismo, uno de ellos para operaciones de lectura y otro para operaciones de escritura, sobre esto de los punteros consultar la bibliografa o consultar con el profesor si cree necesario. Por ejemplo los tres flujos definidos antes por medio de sendas variables, pueden ser abiertos de la siguiente forma: LecturaArchivo.open("c:\directorio\NombreAr.Ext", ios::binary); EscrituraArchivo.open("ASCII.COD"); LectoEscrituraArchivo.open(NombreArchivo, ios::binary|ios::trunc); En el primer ejemplo se abre un archivo fsico llamado NombreAr.Ext el cual est en la trayectoria c:\directorio\ del disco duro C:, para solo lectura. A continuacin se puede proceder a efectuar operaciones de lectura con las instrucciones adecuadas. Este archivo, NombreAr.Ext, debe tener formato binario para poder ser realizada la operacin con satisfaccin. El formato binario no puede ser ledo fcilmente desde cualquier programa de editor, pero tiene la ventaja de que es ms compacto que el de texto. El operador :: es llamado el operador de resolucin de mbito, y en este caso permite definir los diferentes modos que nos son posibles para la apertura de un archivo, este operador es propio de la programacin orientada a objetos. En el segundo ejemplo se abre un archivo para solo escritura, por medio del flujo EscrituraArchivo. El archivo se llama ASCII.COD y ser grabado en la trayectoria actual del disco actual, en formato de tipo texto, por defecto, este tipo de archivos puede ser ledo con facilidad por cualquier editor o procesador de texto. Finalmente, el tercer ejemplo, abre un archivo para lectura y escritura, cuyo nombre, pudiendo incluir trayectoria, est almacenado en la variable de cadena NombreArchivo. El archivo ser de formato binario. El valor de modo trunc har que si existe el archivo con anterioridad, ser irremediablemente "borrado", entre comillas debido a que usted an lo podra recuperar con el comando undelete del sistema operativo DOS si no realiza ninguna otra operacin sobre l, la cual lo pueda borrar en parte o totalmente. Para efectos prcticos del usuario, digamos que trunc produce el borrado del correspondiente archivo fsico al cual est asociado el flujo. A continuacin y dependiendo si es un archivo de texto o binario se realizarn las operaciones de lectura y escritura correspondientes, esto se explica en las dos siguientes secciones. Para finalizar, todo archivo que ha sido abierto, debe ser cerrado por disciplina del programador, segn los siguientes ejemplos de los flujos que venimos estudiando: LecturaArchivo.close(); EscrituraArchivo.close(); LectoEscrituraArchivo.close(); variable NombreArchivo //Cierra el archivo NombreAr.Ext //Cierra el archivo ASCII.COD //Cierra el archivo cuyo nombre esta en la

Las explicaciones anteriores, estn sobre-simplificadas, empero son suficientes para el presente curso; para un mayor aprovechamiento de la potencia del manejo de la biblioteca de E/S del C++, referirse a la bibliografa.

217

18.2 ARCHIVOS DE DATOS DE TEXTO Para este tipo de archivos utilizaremos los operadores de extraccin, >>, y de insercin, <<, ya vistos desde los dos primeros captulos, y de forma enteramente similar a como se utilizan con cin >> y con cout <<. Veamos a continuacin algunos ejemplos:

218

18.3 El siguiente programa graba en disco en el archivo MiArch.ivo, en formato de texto, el valor de varias variables de diversos tipos de datos. //ARCTXT_O.CPP #include <iostream.h> #include <fstream.h> void main(){ int n=13; float X= 123.45e-23; char c = ' ', cadena[15]={"LENGUAJE C++"}; ofstream Escribir; Escribir.open("MiArch.ivo"); Escribir << "Entero= " << n << "\nReal= " << X << "\nCaracter= " << c << "\nCadena= " << cadena; Escribir.close(); cout << "Se grab en disco el siguiente mensaje: \n\n"; cout << "Entero= " << n << "\nReal= " << X << "\nCaracter= " << c << "\nCadena= " << cadena; cin.get(); } 18.4 El siguiente programa lee de disco, en formato de texto, el valor de varias variables. //ARCTXT_I.CPP #include <iostream.h> #include <fstream.h> void main(){ int n; float X; char c, cadena[15]; ifstream Leer; Leer.open("MiArch.ivo"); Leer Leer Leer Leer >> >> >> >> n; X; c; cadena;

Leer.close(); cout << "Se ley del disco el valor de las variables, as: \n\n"; cout << "Entero= " << n << "\nReal= " << X << "\nCaracter= " << c << "\nCadena= " << cadena; //Observe que la lectura de la cadena qued truncada en el espacio //en blanco anterior a C++, omitindola. cin.get(); }

219

18.5 Este programa escribe el cdigo ASCII en un archivo de texto en disco y simultneamente lo presenta en pantalla. El archivo producido ASCII.CPP, es el utilizado en este manual para mostrar la tabla del cdigo ASCII en el Apndice al final de este manual, y en el primer captulo. //ARCASCII.CPP #include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <conio.h> void main(void){ ofstream archivo; //Define un buffer para operaciones de salida (out) int ascii; archivo.open("ASCII.COD", ios::out | ios::trunc); clrscr(); for (ascii = 32; ascii < 256; ascii++){ archivo << setw(3) << ascii << " " << (char) ascii << " cout << setw(3) << ascii << " " << (char)ascii << " "; if(ascii % 10 == 1){ archivo << "\n\n"; cout << endl; } } archivo.close(); // cierra el archivo } 18.6 ARCHIVOS DE DATOS BINARIO De entre las varias posibilidades que tiene el C/C++ para manejo de archivo binarios, utilizaremos, para este curso, las funciones miembro read() y write(). Estas funciones permiten leer y escribir, respectivamente, bloques de datos binarios. La sintaxis, simplificada, con la que trabajaremos es la siguiente y suponiendo que Archivo es una variable vlida definida como un flujo: ARCHIVO.read( (char *)&VariableALeer, sizeof(VariableALeer) ); ARCHIVO.write( (char *)&VariableAEscribir, sizeof(VariableAEscribir) ); En el primer ejemplo se efectuar lectura, va buffer, del archivo al cual est asociado la variable ARCHIVO, de un la cantidad de bytes especificados por el operador sizeof, y colocndose o mejor asignando, lo ledo a la variable VariableALeer. La anterior asignacin se efecta byte tras byte a la direccin(&) de la variable VariableAEscribir, debido al reforzador de tipo de puntero a caracter: (char*); este reforzador es obligatorio colocarlo para un correcto funcionamiento. En el segundo se efectuar escritura, va buffer, de lo contenido en la direccin(&) de la variable VariableAEscribir, y en una cantidad de bytes especificados por el operador sizeof, es decir el tamao de la variable en RAM. La anterior escritura se efecta byte tras byte, siendo obligatorio colocar el reforzador de tipo de puntero a caracter: (char*).

";

220

18.7 En siguiente programa le servir de plantilla para realizar su proyecto final. Estudie este programa VECTORST.CPP en todos sus detalles, el profesor en clase magistral y en el laboratorio de computadores explicar lo ms relevante, observe que incluye gran mayora del tema estudiado en todo el curso. Este programa maneja registros, struct, en un vector, en memoria RAM. Es el programa que deber utilizar como plantilla para poder desarrollar su proyecto final. Estudie en detalle cada uno de los algoritmos presentados. //VECTORST.CPP #include <IOStream.h> #include <IOManip.h> #include <FStream.h> #include <ConIO.h> #include <StdIO.h> #include <ProceS.h> #include <String.h> #include <DOS.h> #include <CType.h> #include <Graphics.h> const int Completo=25; const int Max=100; const char *NombreArchivo = "AMIGO.PER"; typedef struct PERSONA PERSONA; struct PERSONA{ char Nombre[Completo]; //Nombre y apellido int Edad; //aos float Alto; //metros struct time Hora; struct date Dia; } Amigo[Max]; int NumReg=0; //Contador para el nmero de registros void Captura(){ if(NumReg < Max){ cout <<"\n\nReg: " << NumReg; getdate(&Amigo[NumReg].Dia); cout << " Dia: " << (int) Amigo[NumReg].Dia.da_day << " Mes: " << (int) Amigo[NumReg].Dia.da_mon << " Ao: " << Amigo[NumReg].Dia.da_year; gettime(&Amigo[NumReg].Hora); cout << " HORA: " << (int) Amigo[NumReg].Hora.ti_hour << ":" << (int) Amigo[NumReg].Hora.ti_min << ":" << (int) Amigo[NumReg].Hora.ti_sec << endl; cout <<"Nombre: "; cout <<"Edad: "; cout <<"Estatura(metros): "; NumReg++; gets(Amigo[NumReg].Nombre); cin >> Amigo[NumReg].Edad; cin >> Amigo[NumReg].Alto;

} else cout << "Vector de registros est lleno\a\a"; }

221

void ListarVector(){ clrscr(); if(NumReg){ cout <<"Registro Nombre Edad estatura\n"; for(int i=0; i < NumReg; i++){ cout << setiosflags(ios::right) << setw(8) << i << " " << setiosflags(ios::left) << setw(Completo) << Amigo[i].Nombre << setiosflags(ios::right) << setw(3) << Amigo[i].Edad << setiosflags(ios::right | ios::showpoint | ios::fixed) << setprecision(2) << setw(15) << Amigo[i].Alto << endl; } } } void OrdenarRegistros(){ register int i, j; PERSONA aux; if(NumReg){ for (i = 0; i < NumReg-1; i++) for (j = i+1; j < NumReg; j++) if (Amigo[i].Edad > Amigo[j].Edad){ aux = Amigo[i]; Amigo[i] = Amigo[j]; Amigo[j] = aux; } } else cout << "No hay registros en memoria \a\a"; } void EliminarRegistro(){ char Clave[Completo]=""; int i, pos; if(NumReg){ cout <<"\nDigite Nombre de Amigo a BORRAR: "; gets(Clave); pos = 0; while(pos<NumReg && strcmp(Amigo[pos].Nombre,Clave) != 0) pos++; if (pos==NumReg){ cout << "Clave no encontrada"; delay(1000); } else { for( ; pos<NumReg-1; pos++) Amigo[pos] = Amigo[pos+1]; NumReg--; } } else cout << "No hay registros en memoria"; }

222

void EncontrarRegistro() { char Clave[Completo]=""; int i=0; if(NumReg){ cout <<"\nDigite Nombre de Amigo a encontrar: "; gets(Clave); while( i<NumReg && strcmp(Clave,Amigo[i].Nombre) ) i++; if (i<NumReg){ cout <<"\n\nRegistro Nombre Edad estatura\n"; cout << setiosflags(ios::right) << setw(6) << i << " " << setiosflags(ios::left) << setw(Completo) << Amigo[i].Nombre << setiosflags(ios::right) << setw(2) << Amigo[i].Edad << setiosflags(ios::right | ios::showpoint | ios::fixed) << setprecision(2) << setw(7) << Amigo[i].Alto << endl; } else cout <<"\n\n NO Encontrado \a"; } else cout << "No hay registros en memoria"; getch(); } void ModificarRegistro(){ int registro;; if (!NumReg){ cout <<"\n\nNo existen registros en memoria \a"; delay(1000); } else { cout <<"\nDigite nmero de registro a modificar: "; cin >> registro; if( registro >= 0 && registro < NumReg) { cout <<"\nDigite nueva informacin para Registro: " << registro; cout <<"\nNombre: "; gets(Amigo[registro].Nombre); cout <<"Edad: "; cin >> Amigo[registro].Edad; cout <<"Estatura(metros): "; cin >> Amigo[registro].Alto; } } } void LeerArchivoYCargarEnVector(){ fstream Archivo; clrscr(); Archivo.open(NombreArchivo,ios::in|ios::binary); if(Archivo){ NumReg=0; while( Archivo.read( (char *)&Amigo[NumReg], sizeof(Amigo[NumReg]) ) ) NumReg++; Archivo.close(); } else cout << "No se pudo abrir el archivo"; }

223

void GrabarVectorEnArchivo(){ fstream Archivo; Archivo.open(NombreArchivo, ios::out|ios::binary|ios::trunc); if (!Archivo) cout << "Error en la apertura del archivo \a"; else{ for(int i=0; i<NumReg; i++) Archivo.write((char *)&Amigo[i], sizeof(Amigo[i])); Archivo.close(); } } //A continuacin algunas macros que le servirn para cambiar el tipo de letra en impresora Epson de matriz //de punto. Consulte el manual de su impresora en otros casos. #define Condensado(f) f<<(char)15; #define CancelaCondensado(f) f<<(char)0x12; #define DobleAlto(f) f<<(char)27<<(char)0x77<<(char)1; #define CancelaDobleAlto(f) f<<(char)27<<(char)0x77<<(char)0; #define DobleAncho(f) f<<(char)27<<(char)0x57<<(char)1; #define CancelaDobleAncho(f) f<<(char)27<<(char)0x57<<(char)0; #define EspacioEntreLineas1_8pulgadas(f) f<<(char)27<<(char)0x30<<(char)0; #define EspacioEntreLineas7_72pulgadas(f) f<<(char)27<<(char)0x31<<(char)1; #define EspacioEntreLineas1_6pulgadas(f) f<<(char)27<<(char)0x32<<(char)2; #define CPI10(f) f<<(char)0x27<<(char)0x50; #define CPI12(f) f<<(char)0x27<<(char)0x4d; #define SaltaPagina(f) f<<"\f"; void ImprimirEnPapelRegistros(){ int Linea=0; PERSONA registro; fstream Impresora; if(NumReg==0) cout << "No hay registros en memoria \a\a"; else{ Impresora.open("LPT1", ios::out); // LPT1 es igual a PRN cout << "\n\nIMPRIMIENDO..."; DobleAncho(Impresora) Impresora <<"\n\nRegistro Nombre Edad Estatura\n\n"; CancelaDobleAncho(Impresora) Condensado(Impresora) for(int i=0; i<NumReg; i++){ Impresora << setiosflags(ios::right) << setw(20) << ++Linea << " << setiosflags(ios::left) << setw(25) << Amigo[i].Nombre << setiosflags(ios::right) << setw(15) << Amigo[i].Edad << setiosflags(ios::right | ios::showpoint | ios::fixed) << setprecision(2) << setw(25) << Amigo[i].Alto << endl; } CancelaCondensado(Impresora) SaltaPagina(Impresora); Impresora.close(); } }

"

224

void Graficarbarras(){ int ManejadorGrafico = DETECT, ModoGrafico; int izquierda, arriba=20, arribabar, ancho, abajo, profundidad, eje=10; float fraccion, MayorEdad=0, Delta; initgraph( &ManejadorGrafico, &ModoGrafico, "c:\\tc\\bgi" ); setbkcolor(BLUE); setcolor(YELLOW); rectangle(0, 0, getmaxx(), getmaxy()); if( NumReg ){ MayorEdad=Amigo[0].Edad; for(int i=1; i<NumReg; i++) if(Amigo[i].Edad>MayorEdad) MayorEdad = Amigo[i].Edad; ancho = (int)( (getmaxx()-eje) / ((NumReg * 2 ) + 1) ); abajo = getmaxy() - 30; profundidad = (int)(ancho / 8); izquierda = ancho+eje; setcolor(YELLOW); settextstyle(DEFAULT_FONT, HORIZ_DIR, 2); outtextxy(5, abajo+10 , "EDADES"); Delta= (float)(abajo-arriba+1)/MayorEdad; line(eje/2, arriba, eje/2, abajo); //eje y for(float rayita=abajo; rayita>=arriba-Delta; rayita-=Delta) line(3, (int)rayita, 7, (int)rayita); for( i=0; i<NumReg; i++){ fraccion = (float) Amigo[i].Edad / MayorEdad; arribabar = (int)(abajo - fraccion * (abajo-arriba) ); setcolor(RED); setfillstyle(SOLID_FILL, MAGENTA); bar3d(izquierda,arribabar,(izquierda+ancho), abajo, profundidad, 1); setcolor(CYAN); settextstyle(SMALL_FONT,HORIZ_DIR, 0);//(tipo letra, direccion, tamao ) outtextxy(izquierda+ancho/3, arribabar, Amigo[i].Nombre); izquierda += (ancho * 2); } } else{ setcolor(RED); settextstyle(TRIPLEX_FONT, VERT_DIR, 7); outtextxy(getmaxx()/2-10, 10, "NO HAY DATOS"); } getch(); closegraph(); }

225

void main(){ LeerArchivoYCargarEnVector(); for(;;) { ListarVector();

cout <<"\n\nCaptura Imprimir Ordenar eNcontrar Eliminar Modificar Graficas Borrar Salir: ";

switch ( toupper( getch() ) ){ case 'C': Captura(); break; case 'I': ImprimirEnPapelRegistros(); break; case 'O': OrdenarRegistros(); break; case 'N': EncontrarRegistro(); break; case 'E': EliminarRegistro(); break; case 'M': ModificarRegistro(); break; case 'G': Graficarbarras(); break; case 'B': unlink(NombreArchivo); NumReg=0; break; case 'S': GrabarVectorEnArchivo(); return; } } } // main()

226

18.8 ACTIVIDADES PARA RESOLVER POR GRUPOS COMO PROYECTO FINAL. 18.8.1 El proyecto debe, para todos los grupos, incluir al menos lo siguiente: Rehacer enunciado entregado de forma resumida y clara. Presentar pulcramente el sangrado de todo el cdigo fuente. Dejar separacin adecuada entre funciones, y colocarle a cada una de ellas su objetivo. Presentar logotipo adecuado al tema escogido. Utilizar men de conmutadores horizontal en el principal y verticales en los submens. los identificadores que utilice, defnalos autodocumentados, en ningn momento en clave o abreviaturas que no se entiendan rpidamente. Utilizar operaciones de archivo tanto de lectura como de escritura, con los registros con los que se trabaje. No utilizar la librera string.h, en vez de ella construir una librera que incluya las funciones para manejo de cadenas necesarias. Presentar niveles de ayuda con la tecla F1 en varias partes del programa, donde crea necesario. Presentar estadsticas adecuadas con la ayuda del programa estadist.cpp. Utilizar en algunas funciones paso de parmetros por valor y por referencia. Presentar la informacin adecuadamente tabulada en pantalla, y con los colores que crea ms agradables. Presentar los registros clasificados por ms de una clave en pantalla y/o papel. 18.8.2 Suponga va a elaborar un programa para calcular la nmina de empleados de una compaa, los pagos se efectan mensualmente. Se debe utilizar un registro(struct) para conservar la informacin de cada empleado en memoria (No utilizar vectores) y con los siguientes campos: Nombre, Apellidos, Cdula de identidad, salario mensual bsico, porcentaje de retencin en la fuente y porcentaje de retencin del Seguro Social. Escribir funcin principal(main) la cual permita presentar en pantalla un men y efectuar, iterativamente, invocacin de las siguientes funciones: CAPTURA: Se debe leer en esta funcin la informacin bsica de cada uno de los empleados(campos). Solo un registro cada vez que se invoque. Se debe a continuacin proceder a grabarlo en disco. LISTAR: Abrir el archivo en el cual estn los registros, leerlo e ir presentando los campos en pantalla. CLASIFICAR: Se deber efectuar un ordenamiento, directamente sobre el disco, por la clave Apellido, en orden ascendente, recuerde que como es cadena de caracteres debe utilizar strcmp. BUSCAR: a partir de digitar la cdula de un empleado se debe proceder a la bsqueda de su registro en el archivo en disco. Si se encuentra debe mostrarse en pantalla el nombre, apellido, y salario bsico del mismo. Si no se encuentra la cdula debe mostrar aviso que entere de esta situacin. NOMINA: La impresora debe listar comprobantes de pago para cada uno de los empleados y la nmina mensual.

227

18.8.3 En un juego del popular "Concntrese", se tendrn 52 cartas de la baraja francesa representadas en memoria de la siguiente forma: struct carta{ char pinta; // La inicial de: Diamante, Trbol, Corazn, Pica char color; // Rojo, Negro int numero; // del 1 al 13 char tapada;//Si esta Tapada o si ya se Retir del juego } Baraja[52]; Construir el juego del concntrese, utilizando el modo de texto del vdeo. El programa debe permitir suspender la partida y poderla recuperar posteriormente en otro momento, es decir se debe grabar en disco el estado del juego. 18.8.4 Se tienen en unos registros los siguientes datos: Ao de produccin (desde 1970 a 1995); toneladas producidas de caf para cada ao, valor promedio($) en el ao por libra vendida en el exterior, toneladas exportadas. Calcular el promedio de produccin de caf para cada uno de los aos. Calcular el promedio de toneladas exportadas para cada uno de los aos. Para cada ao calcular los dlares en exportacin y efectuar un grfico de barras. Calcular la cantidad a pagar de matrcula por cada estudiante de la siguiente forma: El total a pagar es igual a los cargos fijos ms los cargos variables. Los Cargos fijos son de $100,000. Los Cargos Variables se calculan como un 0.1 del patrimonio + 0.15% de la renta gravable, tomados estos datos de la correspondiente declaracin de renta de los acudientes del estudiante. Se debe calcular el valor de los cargos fijos, los cargos variables y el total a cancelar por concepto de matrcula. En cada registro, a leer inicialmente desde teclado y posteriormente grabar en disco, para luego poder ser recuperados del mismo y de esta forma estar disponibles en cualquier momento, encontraremos al menos los siguientes campos: cdigo del estudiante, nombre, apellido, patrimonio y renta Representar globalmente el vector de registros que pueda representar la informacin del estudiante. Considerar el mximo de estudiantes que manejar el programa como una constante y una variable global que manipular la cantidad de estudiantes inscritos para efectuar matrcula en un momento dado. El programa presentar inicialmente un men principal de conmutadores, el cual permita invocar funciones que hagan lo siguiente: CAPTURAR: Leer los campos de cada registro de estudiante por teclado, cada vez la correspondiente variable global debe incrementarse en uno. LISTAR: presentar en pantalla un submen el cual permita listar la informacin clasificada por las claves: cdigo del estudiantes, por apellido. El listado debe obtener una impresin por impresora de cdigo, estudiante, renta, patrimonio, cargos fijos, cargos variable y total de matrcula. BUSCAR: se debe presentar un submen el cual permita invocar sendas funciones las cuales permitan:- Digitar el cdigo del estudiante y a continuacin, y si existe, debe aparecer en pantalla toda su informacin sobre la matrcula. Digitar el nombre de un estudiante y a continuacin, y si existe, debe aparecer

228

en pantalla toda su informacin sobre la matrcula. Digitar un apellido o nombre y a continuacin presentar todos los nombres completos de estudiantes que lo contengan. TOTAL MATRICULA: submen que permita presentar en pantalla o escrito en papel. Presentar listado de el total de matrculas, totalizando al final. Se debe permitir tener la opcin de escoger varios tipos de letra para imprimir en papel. ESTADSTICA: presentar estadsticas de el total de matrcula, con la ayuda del programa ESTADIST.CPP. 18.8.5 En una encuesta de un indeterminado nmero de jefes de hogar, se les pregunta a cada uno Cul es su ingreso mensual? Cul es la renta que paga por su casa de habitacin?. Presentar algoritmo pulcramente con sangrado adecuado en lenguaje C++. Debe utilizar adecuadas operaciones de archivo. ESTADSTICA: Presente submen con las cuatro opciones siguientes: presentar estadsticas sobre los ingresos mensuales y sobre el pago de renta y el nmero de hijos. y cuarta opcin que permita calcular y mostrar el salario promedio por hogar, dividiendo la sumatoria de los ingresos mensuales entre el nmero de jefes de hogar. Se debe calcular cantos hogares tienen ingresos superiores a tres salarios mnimos, cuntos mayores o igual al mnimo y menores a tres salarios mnimos y cuntos tienen ingresos inferiores al mnimo. CAPTURA: leer los campos Cdula jefe de hogar, salario, renta, nmero de hijos y efectuando ciclo repetitivo capturar la edad de cada uno de sus hijos, acumularlas, para finalmente asignar a campo de edad promedio su respectivo valor. LISTADOS: En submens presente listados clasificados por salario, renta, promedio de hijos y cdula de identificacin. BUSCAR: Submens que permitan encontrar los ciudadanos que estn en cada uno de los rangos de salario mnimo sealados anteriormente; a partir de una cdula mostrar los datos de la correspondiente persona. Digitar un valor de renta y mostrar todos los registros que cumplen con que la de ellos en mayo o igual. Una editorial tiene un conjunto de registros para cada uno de los ttulos de libros existentes, cada uno de los cuales contiene: cdigo del libro, ttulo de la obra, nombre completo del autor, nmero de pginas, existencia en bodega de cada ttulo. Efectuar funciones que permitan: CAPTURAR: la captura de estos registros y mantenerlos en memoria en un vector de registros. PRECIO UNITARIO: A partir de digitar el cdigo de un libro, efectuar su bsqueda y mostrar su precio teniendo en cuanta lo siguiente: El precio bsico de un libro es de $2.000, ms 35 pesos por pgina; empero, si el nmero de pginas excede de 300, el precio sufrir un recargo adicional de $10; si el nmero de pginas excede de 550, el precio se incrementar $8, y esto debido al mayor costo de la compaginacin y empastado. LISTAR: Por medio de un submen mostrar en pantalla o en papel lo siguiente. Calcular e imprimir el cdigo y el precio para cada uno de los libros, clasificados por el cdigo del libro. Imprimir el total, en pesos, del inventario de libros. Mostrar el mismo inventario de libros clasificados por autor. Mostrar tambin clasificado por ttulo.

229

BUSCAR: Por medio de submens conteste cada uno de los siguientes interrogantes: Se debe digitar un cdigo de libro y si existe en el inventario decir su precio. Digitar un valor de libro y listar a continuacin todos los libros que tienen igual o mayor precio. Digitar el nombre de un autor y a continuacin mostrar todos los libros que le pertenezcan de entre el inventario. Digitar un ttulo de un libro y a continuacin decir cuantos ejemplares de ese ttulo hay en existencia en el momento. Digitar un apellido o nombre y a continuacin presentar todos los nombres completos de autores que lo contengan. Digitar una palabra y mostrar en pantalla todos los ttulos que la contengan. CLASIFICAR: Por medio de submens clasificar por: cdigo, valor de cada libro, titulo y autor. Escoja al gusto si prefiere ordenes descendentes o ascendentes. ESTADSTICA: presente estadsticas de el valor de los libros, con la ayuda del programa ESTADIST.CPP 18.8.6 Cierta Universidad est interesada en saber estadsticamente la calificacin promedio de los estudiantes que recibieron matemtica durante un semestre. Desea saber tambin el nmero total de estudiantes y el nmero de estudiantes reprobados, en matemtica, por plan y en total. CAPTURAR: Calcular lo anterior teniendo en cuenta que se leen: la calificacin definitiva de matemticas, cdigo y nmero de plan, de todos los estudiantes que cursaron matemtica. La informacin de los registros debe permanentemente estar clasificada por el nmero del cdigo de cada uno de los estudiantes. LISTAR y CLASIFICAR: Listar por medio de submens, informacin clasificada por plan de estudios, y dentro de cada plan de estudios listar clasificado por cdigo de cada estudiante, como clave secundaria. BUSCAR: Se digita un cdigo y a continuacin se muestra la nota de el estudiante correspondiente. Se digita un plan de estudios y a continuacin se muestran todos los estudiantes que corresponden a ese plan y su promedio de nota en matemtica. GRABAR Y CARGAR: Todos los registros deben estar en disco. ESTADSTICA: presente estadsticas de las calificaciones de matemtica, con la ayuda del programa ESTADIST.CPP 18.8.6 Una compaa le encarga un informe para comprar mercanca, y por esto le entreg unos registros con los siguientes datos, los cuales debe capturar por teclado y posteriormente mantener en disco:- Cdigo del artculo (clave).Nombre del artculo.- Existencia actual en inventario, en unidades.- Existencia mnima en unidades.(Cantidad de reorden).- Valor unitario. LISTAR: Debe producir un informe de los artculos que hay que comprar de acuerdo a las siguientes condiciones: - Listado de artculos con existencia menor a la existencia mnima. Cantidad en pesos($) del total de artculos a comprar.- Listado de artculos sin existencia en inventario.- Listado de artculos con existencia superior a un 50% de la existencia mnima. Mostrar el total del inventario representado en pesos($). Permitir la impresin en cada oportunidad en papel.

230

BUSCAR: por medio de submens contestar lo siguiente: Digitar un cdigo de artculo y mostrar la informacin correspondiente a l, si es que existe. Digitar un nombre de artculo y contestar con su cantidad en inventario, si es que existe. Digitar una palabra y a continuacin mostrar todos los nombres de productos que la contienen. CLASIFICAR: Por medio de submens. Mantener clasificado por la clave Cdigo de artculo. Clasificar por medio de la clave nombre de el artculo. ESTADSTICA: presente estadsticas de el existencias multiplicadas por el valor unitario de cada artculo, y con la ayuda del programa ESTADIST.CPP 18.8.7 Se debe elaborar un informe de cartera con base a una serie de registros con los datos de: cdigo, nombre del cliente, Nmero de factura, valor original de la factura, plazo del crdito para cancelar la obligacin; y los cuales hay que capturar por teclado, y mantener adecuadamente actualizados en disco. LISTAR: Utilizando submen listar en pantalla adecuadamente y por impresora en papel utilizando diversas claves de ordenamiento. BUSCAR: Utilizar submens para contestar lo siguiente: Se debe elaborar un informe a nivel de plazo es hasta de 30 das se liquida 1% de 60 das se liquida un 2%; si el plazo est 2,5%; y para plazos mayores de 120 das se cliente teniendo en cuenta que si el inters; si el plazo esta entre 30 y entre 60 y 120 das se liquida un liquida un 3%.

Digitar el nombre de un cliente y a continuacin mostrar todas las facturas que tiene pendientes de pago, con el plazo correspondiente en das. Digitar un nmero de factura y mostrar toda la informacin disponible y por calcular de la misma. ESTADSTICA: presente estadsticas de el total de las facturas, con la ayuda del programa ESTADIST.CPP 18.8.8 La Secretara de Trnsito decidi cobrar multas por exceso del lmite de velocidad as: Una cantidad de dinero llamada "Multa bsica" ms la multiplicacin del nmero de kph en exceso sobre el lmite de velocidad por un factor dado en la siguiente tabla de tarifas, as: Lmite de velocidad de 60 kph en avenidas. Por cada kilmetro de exceso se le cobran $2,000 adicionales. El lmite de velocidad en calles es de 40 kph. Por cada kilmetro de exceso se le cobran $3,000 adicionales. El lmite de velocidad en autopista es de 80 kph. Por cada kilmetro de exceso se le cobran $4,000 adicionales.

Se desea saber cuntos autos han sobrepasado cada lmite en un determinado tiempo de muestreo y cunto pagan de multa en total. CAPTURAR: Se deben leer los siguientes campos por cada registro de vehculo infractor: Placa del carro, Velocidad del vehculo infractor, tipo de va. Se deben tener en disco actualizados los registros. LISTAR: Presentar por medio de submen las multas de todos los infractores, y clasificada por el nmero de placa. Presentar tanto en papel como en pantalla.

231

BUSCAR: Por medio de submen. Digitar un tipo de va y mostrar a continuacin todos los registros de multa que coincida con l. Digitar un nmero de placa y mostrar en pantalla el registro de multa correspondiente, si es que existe. Digitar un real que representar kph y a continuacin mostrar todos los registros que tengan infraccin por este kilometraje y mayor. CLASIFICAR: Presentar listados en pantalla y en papel clasificados por tipo de va, placa de carro, y de velocidad de infraccin. ESTADSTICA: presente estadsticas de el total de multas cobradas, con la ayuda del programa ESTADIST.CPP 18.8.9 Un banco quiere calcular los intereses que tiene que cobrar al final del ao a sus clientes con base a los datos de: Cdula y Nombre del cliente, Valor del prstamo, Tasa de inters convenida en %, nmero del da del ao en que fue hecho el prstamo(del 1 al 365). Se deben capturar los anteriores datos y mantenerlos tanto en RAM como en disco. Para el clculo de los intereses a cancelar al final del ao se aplica la siguiente frmula: Valor intereses es igual al valor prstamo * (inters/100) * (360 - da del prstamo)/360. Se debe imprimir el valor del inters pagado por cada cliente y el total para todos ellos. Este listado debe aparecer clasificado por la clave Cdula. BUSCAR: Por medio de submen mostrar lo siguiente: Digitando un nombre de cliente debe aparecer el registro correspondiente con la cantidad de intereses a cancelar. Digitar cdula y de igual forma aparecer en pantalla toda la informacin del cliente correspondiente. Digitar un nombre o apellido y mostrar en pantalla todos los nombres completos de clientes que lo contienen. CLASIFICAR: utilizando submens mostrar en pantalla clasificaciones ascendentes y descendentes por las claves: cdula, nombre cliente, valor prestamos, tasas de inters. ESTADSTICA: presente estadsticas de el total de intereses a cancelar, con la ayuda del programa ESTADIST.CPP 18.8.10 Se requiere condensar algunas estadsticas sobre los estudiantes de la Universidad. Para cada registro se tiene: Cdigo, Edad, Sexo(Masculino, Femenino), y Facultad (Psicologa, Ingeniera, Comercio), los cuales deben capturar y mantener almacenados en disco. LISTAR: Se debe calcular e imprimir en pantalla y en papel: Promedio de edad de los estudiantes, porcentaje de hombres y mujeres por cada facultad y en la Universidad. Mantener clasificado por Cdigo de estudiante. BUSCAR: Digitar un cdigo y a continuacin debe aparecer el registro correspondiente de es estudiante, si es que existe. Digitar un sexo y mostrar todos los registros que coinciden con l. Digitar un nombre de facultad y a continuacin digitar todos los registros que la contengan. Digitar dos edades y a continuacin mostrar todos los registros que estn en el correspondiente intervalo de edades. CLASIFICAR: utilizando submen presente listados clasificados por edad, sexo y de facultad, en forma ascendente y descendente. ESTADSTICA: presente estadsticas respecto a la edades, con la ayuda del programa ESTADIST.CPP

232

18.8.11 La Compaa AXZ tiene un registro por cada empleado con: Cdula de identificacin, edad, meses trabajados en la compaa, cantidad en dinero a cancelar por hora trabajada, horas regulares trabajadas, horas extras(se cancela 50 adicional sobre el valor regular), los cuales debe capturar y mantener en disco. LISTAR: Por medio de submen. Se desea saber si los nuevos empleados(menos de un ao) tienden a trabajar ms horas extras que los antiguos. Se desea saber qu cantidad de empleados tienen menos de un ao en la compaa, de uno a menos de tres aos, de tres a cinco aos, de cinco a diez aos y ms de diez aos. Por cada grupo se desea saber el promedio de horas trabajadas por empleado. Mantener clasificado por el nmero de cdula al mostrar lo anterior. Mostrar la cantidad a cancelar a cada uno de los empleados. BUSCAR: Utilizando submen. Se digita cdula y de debe mostrar el registro correspondiente si es que existe, incluyendo la cantidad total que hay que cancelar a este empleado. Digitar dos edades y a continuacin mostrar todos los registros que estn en el correspondiente intervalo de edades. Digitar dos enteros que representarn meses y a continuacin mostrar todos los registros que estn en el correspondiente intervalo de meses. CLASIFICAR: Mostrar en pantalla clasificado por cdula de identidad, edad, meses de antigedad en la compaa en ordenes ascendentes y descendentes. ESTADSTICA: presente estadsticas de el total pagado a cada empleado, con la ayuda del programa ESTADIST.CPP 18.8.12 En un almacn de cadena se tienen unos registros de inventario con los siguientes datos: cdigo del almacn, cdigo del departamento, cdigo del artculo, saldo anterior, entradas, salidas, stock mnimo y costo unitario, los cuales se debe capturar por teclado y mantener adicionalmente en disco. LISTAR: Se debe imprimir un informe en donde se muestre por cada registro el valor y cantidad del saldo actual con su stock mnimo y un aviso de "Compra", cuando el saldo actual sea inferior al stock mnimo y un aviso de "alerta" cuando el saldo vare en un 40% por encima del stock mnimo. Deben darse totales de los valores por cada departamento de almacn, por cada almacn y para toda la cadena. BUSCAR: digite un cdigo de almacn y a continuacin mostrar todos los registros que lo contengan. Lo mismo para el cdigo del departamento. y finalmente igual para el cdigo de artculo. CLASIFICAR: Por las claves cdigo de departamento, de almacn y de artculo en forma ascendente y descendente. ESTADSTICA: presente estadsticas de el valor de las mercancas en inventario, teniendo en cuenta que para cada tem de inventario, su total est dado por el saldo anterior ms las entradas, menos las salidas y, este guarismo resultante, multiplicado por el costo unitario, con la ayuda del programa ESTADIST.CPP 18.8.13 Una asociacin de universidades est interesada en elaborar una de estudiantes que sean casados y que trabajen. Se tienen registros con datos de la ciudad, Universidad, Facultad, nombre del estudiante, edad, civil(casado, soltero), situacin laboral (trabaja, no trabaja), campos que deben ser capturados y mantenidos en disco. relacin los estado estos

233

LISTAR: Debe presentarse un listado clasificado por Ciudad como primera clave, Universidad como segunda clave, y Facultad como tercera clave, para lo cual los datos deben mantenerse clasificados de esta forma en memoria RAM. enlazada. BUSCAR: Digitar nombre de estudiante y a continuacin mostrar los correspondientes campos del registro correspondiente. Digitar nombre de universidad y mostrar a continuacin todos los registros de estudiantes que la contienen. Digitar nombre de ciudad y a continuacin mostrar todos los registros correspondiente. CLASIFICAR: Mostrar listados por separado clasificados por edad, estado civil y situacin laboral. ESTADSTICA: presente estadsticas de edades de los estudiantes de las universidades, con la ayuda del programa ESTADIST.CPP. 18.8.14 PROGRAMA PARA UNA LNEA AREA: Una lnea area desea controlar las reservas de vuelo de un avin. El nmero de cupos disponible para el vuelo es de MAX sillas. Representar en memoria por medio de un vector de registros. Cada registro en la lista representa una silla, habr un nmero prefijado de sillas. Cada registro debe tener al menos los siguientes campos: Nombre pasajero, edad, telfono, cdula, estado de la silla(Vaca, Reservada, Ocupada) Representar globalmente el vector de registros y variable que cuente las reservas efectuadas. Al iniciar el programa debe inicializar los campos que corresponden al estado de la silla con vaco (podra ser un cero o una letra V). A continuacin, presentar un men principal de conmutadores, el cual permita invocar funciones que hagan lo siguiente: RESERVAR CUPO: En caso de estar llenos los cupos que aparezca el aviso "CUPO COMPLETO. POR FAVOR CIERRE EL VUELO". En caso de haber disponibilidad se le asigna el nmero de silla marcando como "Reservada" en el campo "Estado de la silla". De esta forma el nmero de reservas aumentar en una cada vez que sea invocada esta funcin. CANCELAR RESERVA: Se pide al pasajero el nmero de silla que tiene reservada, y se debe dejar marcada como "vaca" en el campo "Estado de la Silla" correspondiente. De esta forma el nmero de reservas se decrementar en una. CONFIRMAR RESERVA: Cuando el pasajero se presenta al aeropuerto se le debe solicitar el nmero de silla(se supondr que se la sabe) y marcarla como "ocupada". LISTAR: presentar en pantalla un submen el cual permita listar la informacin clasificada por: cdula, y otro por apellido, y otra opcin que permita imprimir en papel. CERRAR EL VUELO(y terminar el programa): Cuando el avin vaya a despegar, producir un listado con la siguiente estadstica:

234

a) Nmeros de sillas ocupadas y sillas vacas (las vacas son las marcadas como "vacas" ms las reservadas que no viaj nadie en ellas). b) Listado de todos los nombres de pasajeros clasificados en orden alfabtico, con su respectivo telfono y cdula. c) Estadsticas de las edades de los pasajeros, con la ayuda del programa ESTADIST.CPP.

235

APNDICE A. LAS TRADICIONALES PRINTF Y SCANF DEL VIEJO C


Las instrucciones de lectura y escritura ms utilizadas en el lenguaje C, hasta el momento, son scanf y printf respectivamente, las cuales son reemplazadas, con gran ventaja como ya vimos, por el cout y el cin en el C++. A.1 El siguiente programa muestra la utilizacin de las instrucciones de lectura scanf y de escritura printf. As mismo presenta una introduccin al formateo de nmeros. Ver programa COUTIN06.CPP, en el Captulo 2, el cual realiza lo mismo con las instrucciones cin >> y cout <<. C_7.C*/ #include <stdio.h> #include <conio.h> main(){ int c1=10, c2, c3=20; // cantidades de cada fruta float p1=3.2, p2, p3=4.5; // precios de cada fruta char fruta1[10]="lulo", fruta2[10]="", fruta3[10]="papaya"; // nombres clrscr(); printf( "\n"); printf( " MERCADO DE FRUTAS \n"); printf( "\n"); printf( "Digite el nombre de la fruta 2: "); scanf("%s", fruta2); printf( "\ndigite el precio(con centavos) de la fruta 2: $ "); scanf("%f", &p2); printf( "\ndigite la cantidad a comprar de la fruta 2: "); scanf("%d", &c2); printf( printf( printf( printf( printf( printf( printf( "\n\n\n"); "NOMBRE CANTIDAD PRECIO TOTAL \n"); "\n"); " %-10s %8d %15.2f %10.2f\n", fruta1, c1, p1, c1*p1); " %-10s %8d %15.2f %10.2f\n", fruta2, c2, p2, c2*p2); " %-10s %8d %15.2f %10.2f\n", fruta3, c3, p3, c3*p3); "\n\n");

getch(); return 0; }

237

A.2 SE ESCRIBEN LOS N PRIMEROS MLTIPLOS DE 11 Y 15 /*C_1.C*/ main(){ int n, i, j, s11=0, s15=0, M11, M_15; clrscr(); printf ("Valor de n:"); scanf ("%d",&n); printf("\n\n"); for (i = 1; i < n; i++){ M11 = i * 11; printf("%4d", M11); s11 += M11; } printf("\n\nLA SUMA DE LOS %d PRIMEROS MLTIPLOS DE 11 ES :%d", n, s11); printf("\n\n"); for (j = 1; j < n ; j++ ){ M_15 = j * 15; printf ("%4d", M_15); s15 += M_15; } printf("\n\nLA SUMA DE LOS %d PRIMEROS MLTIPLOS DE 15 ES :%d", n, s15); getch(); } A.3 Se calcula la siguiente serie: S = 1 + 2 + 3 - 4 + 5 + 6 + 7 - 8 +... /*C_3.C*/ main(){ int n, suma=0, i=1; clrscr(); printf("DIGITE UN VALOR PARA N:"); scanf("%d", &n); gotoxy(1,4); for( ; i <= n ; i++){ if ( i % 4 == 0 ){ printf("%5d", -i); suma -= i; } else { suma += i; printf("%5d", i); } } printf("\n\nSumatoria = %d", suma); getch(); }

238

A.4 Efecte prueba de ejecucin manual al siguiente algoritmo. /* main(){ int t; clrscr(); printf("introducir un nmero: "); scanf("%d", &t); total(t); } total(int x){ int suma = 0, i, contador; for( i = 0; i < x; i++) { suma += i; for(contador = 0 ; contador < 10; contador++) printf("."); printf ("la suma del 0 al %2d es %4d\n", i, suma); } getch(); } A.5 Se desarrolla un algoritmo el cual lee desde teclado los datos de una persona los cuales vienen en tarjetas: nombre, edad, sexo y estado civil; se imprime el nombre solo si corresponde a un hombre casado menor de 30 aos o a una mujer soltera menor de 50 aos. /* C_5.C*/ #include <stdio.h> main(){ int Edad; char Sexo, EstadoCivil; char Nombre[20]; clrscr(); printf("Digite el nombre del encuestado: "); gets(Nombre); fflush(stdin); printf("Sexo (M/F): "); scanf("%c", &Sexo); fflush(stdin); Sexo = toupper(Sexo); printf("Edad: "); scanf("%d", &Edad); fflush(stdin); printf("Estado Civil (Casado, Soltero, Otro): "); scanf("%c", &EstadoCivil); fflush(stdin); EstadoCivil = toupper(EstadoCivil); if ( ( Sexo=='M' && Edad<30 ) || ( Sexo=='F' && Edad<50 ) ) printf( "\n % s Cumple una de las condiciones", Nombre); else printf( "\n\aNo cumple ninguna de las condiciones solicitadas"); } C_4.C */

239

A.6 Se digitan los valores de dos vectores del mismo tamao y luego se produce su intercambio por medio de punteros. /*PUNTERO2.*/ #define Max 10 intercambio(int *va, int *vb){ int auxiliar, i; while (i<Max) { i++; auxiliar = *va; *va = *vb; *vb = auxiliar; va++; vb++; } } main(){ int a[Max], b[Max]; register int indice; clrscr(); printf("Digite %d valores para el vector A: \n", Max); for(indice = 0; indice < Max; indice++){ printf("A[%2d] = ", indice + 1); scanf("%d", &a[indice]); } printf("\n\nDigite %d valores para el vector B: \n", Max); for(indice = 0; indice < Max; indice++){ printf("B[%2d] = ", indice + 1); scanf("%d", &b[indice]); } clrscr(); printf("-----------------------------------------\n"); printf("Vectores originales A B \n"); printf("-----------------------------------------\n"); for(indice = 0; indice < Max; ++indice) printf("%30d%10d\n", a[indice], b[indice]); printf("-----------------------------------------\n\n"); intercambio(a, b); printf("Vectores intercambiados A B \n"); printf("-----------------------------------------\n"); for(indice = 0; indice < Max; ++indice) printf("%30d%10d\n", a[indice], b[indice]); getch(); }

240

APNDICE B. CDIGO ASCII Y SECUENCIAS DE ESC


El cdigo ASCII(American Standard Committed for Information Interchange), es el cdigo con el cual operan los microcomputadores que trabajan bajo el sistema operativo MS-DOS y Windows. Se compone de un conjunto de caracteres de control, y caracteres imprimibles, numerados del 0 al 255. Ocupa cada uno de ellos un Byte de memoria, es decir ocho bit. Tabla de Caracteres ASCII imprimibles. 32 42 * 52 4 62 > 72 H 82 R 92 \ 102 f 112 p 122 z 132 142 152 _ 162 172 182 192 202 212 222 232 242 252 _ 33 43 53 63 73 83 93 103 113 123 133 143 153 163 173 183 193 203 213 223 233 243 253 ! + 5 ? I S ] g q { 34 " 44 , 54 6 64 @ 74 J 84 T 94 ^ 104 h 114 r 124 | 134 144 154 164 174 184 194 204 214 224 234 244 254 35 45 55 65 75 85 95 105 115 125 135 145 155 165 175 185 195 205 215 225 235 245 255 # 7 A K U _ i s } 36 46 56 66 76 86 96 106 116 126 136 146 156 166 176 186 196 206 216 226 236 246 $ . 8 B L V ` j t ~ 37 47 57 67 77 87 97 107 117 127 137 147 157 167 177 187 197 207 217 227 237 247 % / 9 C M W a k u 38 48 58 68 78 88 98 108 118 128 138 148 158 168 178 188 198 208 218 228 238 248 & 0 : D N X b l v _ 39 49 59 69 79 89 99 109 119 129 139 149 159 169 179 189 199 209 219 229 239 249 ' 1 ; E O Y c m w _ 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 ( 2 < F P Z d n x 41 51 61 71 81 91 101 111 121 131 141 151 161 171 181 191 201 211 221 231 241 251 ) 3 = G Q [ e o y

A continuacin se presentan los cdigos de exploracin de varias teclas y combinacin de teclas. Las combinaciones de teclas las cuales tienen un 0 en primer lugar en realidad producen dos cdigos los cuales deben ser ledos adecuadamente, por ejemplo al pulsar simultneamente las teclas ALT y M se produce un cdigo 0 el cual es ledo inicialmente y el siguiente cdigo 50 es dejado en el buffer de memoria del teclado, sino es ledo con otra instruccin de lectura, l 50 se perder, vemoslo con un pequeo fragmento en C: cout << "digite Combinacin de teclas: "; c = getch(); supongamos el usuario hasta aqu digita ALT M, para ver qu qued en la variable c: cout << " la variable c tiene el valor de " << c; se presentar el valor de 0. Para leer el cdigo siguiente o cdigo extendido:

241

c = getch(); cout << " el cdigo extendido es " << (int) c; se coloca el reforzador de tipo, (int), para evitar que nos escriba en pantalla el ASCII correspondiente al 50 Teclas que producen cdigos extendidos al digitarlas solas: HOME 0 71 FLECHA ARRIBA 0 72 PAGE UP 0 73 FLECHA IZQUIERDA 0 75 FLECHA DERECHA 0 77 END 0 79 FLECHA ABAJO 0 80 PAGE DOWN 0 81 INSERT 0 82 DELET 0 83 F1 al F10 0 59 al 0 68 F11 0 133 F12 0 134 Cdigos extendidos de teclas al pulsarlas simultneamente con la tecla de cambio SHIFT: SHIFT A a la Z 65 al 90 F1 al F10 0 84 al 0 93 F11 0 135 F12 0 136

242

A continuacin los cdigos extendidos de teclas al ser pulsadas simultneamente con las teclas CTRL y ALT respectivamente: Error! Marcador no definido.CTRL A ... Y F1 ... F10 IZQUIERDA DERECHA END PAGE DOWN HOME PAGE UP F11 F12 ARRIBA + ABAJO INSERT DELETE / * 1 ... 25 0 94 ... 0 103 0 0 0 0 0 115 116 117 118 119 ALT ESC RETROCESO Q W E R T Y U I O P ENTER A S D F G H J K L ; ' ` \ Z X C V B N 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 16 17 18 19 20 21 22 23 24 25 28 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 47 48 49 ALT M , . / F1...F10 1 2 3 4 5 6 7 8 9 0 = F11 F12 HOME FLECHA ARRIBA PAGE UP FLECHA IZQUIERDA FLECHA DERECHA END FLECHA ABAJO PAGE DOWN INSERT DELETE TAB ENTER 0 0 0 0 50 51 52 53

0 104-113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 120 121 122 123 124 125 126 127 128 129 130 131 139 140

0 132 0 137 0 138 0 141 0 142 0 0 0 0 144 145 146 147

0 151 0 152 0 153 0 155 0 157 0 0 0 0 0 159 160 161 162 163

0 149 0 150

0 165 0 166

243