1 program PolinomiosEnVector;
\r
2 { Programa que lee 2 polinomios desde un archivo de texto para luego
\r
3 hacer operaciones basicas entre estos (suma, resta, multiplicacion
\r
5 El formato del archivo de texto debe ser de la siguiente manera:
\r
7 * Se ingresan cada polinomio en lineas sucesivas.
\r
8 * El primer polinomio puede comenzar a ingresarse en cualquier lugar
\r
9 del archivo de texto.
\r
10 * El fin del primer polinomio (y comienzo del segundo) se indica por
\r
11 medio de 1 o mas lineas en blanco.
\r
12 * El segundo polinomio puede comenzar a ingresarse en cualquier lugar
\r
13 del archivo de texto a partir de dicha(s) linea(s) en blanco.
\r
14 * Cada termino de un polinomio debe estar en la misma linea y comenzar
\r
15 al principio de esta (excepto el primer termino).
\r
16 * En cada linea se ingresa primero el coeficiente real (puede tener un
\r
17 signo '-' al comenzar y/o un punto, y solamente uno) y luego el
\r
18 exponente entero positivo.
\r
19 * La separacion entre el coeficiente y el exponente debe estar dada por
\r
20 uno o mas espacios o tabuladores.
\r
21 * Cualquier caracter incluido en el texto que no sea un digito (0..9),
\r
22 un punto ('.'), un signo menos ('-'), un espacio (' '), un tabulador
\r
23 o alguno de los caracteres de nueva linea, dara un error en la
\r
25 * El archivo de texto debe tener formato DOS (es decir, el indicador de
\r
26 nueva linea debe ser primero un caracter de retorno del carro
\r
27 seguido inmediatamente por uno de avance de linea).
\r
31 CRT, DOS; { Declaracion de funciones predefinidas
\r
32 para crear la interfaz grafica }
\r
35 VERSION = '1.1.3b (POLI_12)'; { version del programa }
\r
37 TAM_MAX = 100; { Tama¤o maximo del vector que almacena
\r
38 la multiplicacion de polinomios }
\r
39 TAM = TAM_MAX div 2; { Tama¤o maximo (virtual) del vector que contiene
\r
40 los vector con los que se va a operar }
\r
41 CR = chr(13); { caracter de retorno del carro }
\r
42 LF = chr(10); { caracter de nueva linea }
\r
43 ENDF = chr(26); { caracter de fin del archivo }
\r
44 TAB = chr(9); { caracter de tabulacion }
\r
45 SPACE = chr(32); { caracter de espacio }
\r
48 { Tipo de dato para identificar el estado de la entrada de datos }
\r
49 Estado = (INICIO, COEF_BUSCA, COEF, COEF_PUNTO, COEF_FIN, EXP_BUSCA, EXP, EXP_FIN, EXP_FIN_BUSCA, POLI_FIN, FIN, ERROR);
\r
50 Vector = array [0..TAM_MAX-1] of real; { vector para almacenar los polinomios }
\r
53 {########################################################}
\r
55 procedure muestraVector(var v: Vector; s: String);
\r
56 { procedimiento que imprime el polinomio 'v' en pantalla con un titulo 's' }
\r
58 {########################################################}
\r
60 function exponente(exp: integer): String;
\r
63 s: String; { variable temporal }
\r
67 0: exponente := ''; { si el exponente es nulo, mustra solo el coeficiente }
\r
68 1: exponente := 'X'; { si el exponente es 1, mustra el coeficiente y X }
\r
69 2: exponente := 'Xý'; { si el exponente es 2, mustra el coeficiente y Xý }
\r
71 str(exp, s); { convierte al exponente en string }
\r
72 exponente := 'X^' + s; { si el exponente es mayor que 1, mustra el coeficiente y X^exp }
\r
77 {########################################################}
\r
81 i: integer; { indice para usar en el ciclo for }
\r
83 begin { muestraVector }
\r
84 textcolor(lightcyan); { pone el color del texto en cian claro }
\r
85 writeln; { separacion de una linea }
\r
86 write(s); { mustra el mensaje }
\r
87 textcolor(lightmagenta); { pone el color del texto en magenta claro }
\r
88 for i := TAM_MAX - 1 downto 0 do { recorre el vector de atras para adelante }
\r
89 if v[i] <> 0 then break; { si el coeficiente no es nulo, termina el for dejando a i en ese indice }
\r
90 if (i = 0) and (v[i] = 0) then { si el primer exponente que encuentra es 0 y el coeficiente es 0, entonces }
\r
91 begin { muestra el resultado como 0 y sale del procedimiento }
\r
92 write('0'); { imprime que el resultado es cero }
\r
93 writeln; { separacion de una linea }
\r
94 writeln; { separacion de una linea }
\r
95 exit; { sale de este procedimiento }
\r
97 if (abs(v[i]) <> 1) or (i = 0) { si el modulo del coeficiente es distinto de 1 o si el exp. es 0 }
\r
98 then if abs(v[i]) - trunc(abs(v[i])) = 0 then write(trunc(v[i]):1, ' ') { imprime si es un numero entero }
\r
99 else write(v[i]:1:2, ' ') { imprime si es un numero real }
\r
100 else if v[i] = -1 then write('-'); { si es -1 entonces solo escribe el signo del termino }
\r
101 write(exponente(i));
\r
102 for i := i - 1 downto 0 do { recorre el vector de atras para adelante }
\r
103 if v[i] <> 0 then { si el coeficiente no es nulo, termina el for dejando a i en ese indice }
\r
105 if v[i] < 0 { si el coeficiente en negativo }
\r
106 then write(' - ') { le agrega el signo - }
\r
107 else write(' + '); { si no, le agrega el signo + }
\r
108 if (abs(v[i]) <> 1) or (i = 0) then { si el modulo del coeficiente es distinto de 1 o si el exp. es 0 }
\r
109 if abs(v[i]) - trunc(abs(v[i])) = 0 then write(trunc(abs(v[i])):1, ' ') { imprime si es un entero }
\r
110 else write(abs(v[i]):1:2, ' '); { imprime si es un real }
\r
111 write(exponente(i));
\r
113 writeln; { separacion de una linea }
\r
114 writeln; { separacion de una linea }
\r
115 end; { muestraVector }
\r
117 {########################################################}
\r
119 procedure inicializaVector(var v: Vector);
\r
120 { procedimiento que inicializa un vector de tama¤o tam }
\r
122 var i: integer; { indice para usar en el ciclo for }
\r
124 begin { inicializaVector }
\r
125 for i := 0 to TAM_MAX - 1 do { recorre el vector }
\r
126 v[i] := 0; { inicializa la variable actual en 0 }
\r
127 end; { inicializaVector }
\r
129 {########################################################}
\r
131 function ObtenerNombreArchivo: String;
\r
132 { funcion que obtiene un nombre de archivo valido (es decir, el nombre
\r
133 de un archivo que exista) }
\r
135 {########################################################}
\r
137 function fileExists(FileName: String): Boolean;
\r
138 { funcion extraida de la ayuda del Turbo Pascal 7
\r
139 indica si el archivo existe }
\r
146 Assign(F, FileName);
\r
147 FileMode := 0; { Set file access to read only }
\r
151 FileExists := (IOResult = 0) and (FileName <> '');
\r
152 end; { FileExists }
\r
154 {########################################################}
\r
156 { Continuacion de la funcion ObtenerNombreArchivo }
\r
158 DEFAUL_FILE_NAME = 'datos.txt'; { nombre del archivo por defecto }
\r
161 tmp: String; { cadena para almacenar el resultado temporal }
\r
163 begin { ObtenerNombreArchivo }
\r
164 { mensaje para entrada del nombre de archivo }
\r
165 clrscr; { borra la pantalla }
\r
166 textcolor( Yellow ); { establece el color para el texto a amarillo }
\r
167 gotoxy( 25, 3 ); { va a las coordenas de pantalla 25 horizontal, 3 verical }
\r
168 writeln( 'OPERACIONES ENTRE POLINOMIOS' ); { titulo }
\r
169 gotoxy( 25, 4 ); { va a las coordenas de pantalla 25 horizontal, 4 verical }
\r
170 writeln( '~~~~~~~~~~~ ~~~~~ ~~~~~~~~~~' ); { subrayado del titulo }
\r
171 textcolor( LightCyan ); { establece el color para el texto a cian claro }
\r
172 gotoxy( 1, 7 ); { va a las coordenas de pantalla 1 horizontal, 7 verical }
\r
173 writeln(' Ingrese el nombre del archivo con los datos (ENTER = ', DEFAUL_FILE_NAME, '):');
\r
174 gotoxy( 5, 8 ); { va a las coordenas de pantalla 5 horizontal, 8 verical }
\r
175 readln(tmp); { entrada del nombre de archivo }
\r
176 if tmp = '' then tmp := DEFAUL_FILE_NAME; { se fija si no se ingreso nada y reasigana el nombre }
\r
177 while not fileExists(tmp) do { repite el proceso hasta que el archivo exista }
\r
179 clrscr; { borra la pantalla }
\r
180 textcolor( Yellow ); { establece el color para el texto a amarillo }
\r
181 gotoxy( 25, 3 ); { va a las coordenas de pantalla 19 horizontal, 3 verical }
\r
182 writeln( 'OPERACIONES ENTRE POLINOMIOS' ); { titulo }
\r
183 gotoxy( 25, 4 ); { va a las coordenas de pantalla 19 horizontal, 4 verical }
\r
184 writeln( '~~~~~~~~~~~ ~~~~~ ~~~~~~~~~~' ); { subrayado del titulo }
\r
185 textcolor( LightCyan ); { establece el color para el texto a cian claro }
\r
186 gotoxy( 1, 7 ); { va a las coordenas de pantalla 1 horizontal, 7 verical }
\r
187 write(' El archivo ', tmp, ' no existe. Ingrese un nombre correcto');
\r
188 if tmp = DEFAUL_FILE_NAME { si es el nombre de archivo predeterminado }
\r
189 then { entonces, elije un mensaje apropiado }
\r
192 begin { si no es el predeterminado, muestra otro mensaje }
\r
194 write(' (ENTER = ', DEFAUL_FILE_NAME, '): ');
\r
196 gotoxy( 5, 9 ); { va a las coordenas de pantalla 5 horizontal, 9 verical }
\r
197 readln(tmp); { vuelve a leer el nombre del archivo para ser verificado }
\r
198 if tmp = '' then tmp := DEFAUL_FILE_NAME; { asigna como nombre de archivo al predeterminado
\r
199 si no se escribio nada }
\r
200 end; { fin del loop de verificacion }
\r
201 ObtenerNombreArchivo := tmp; { asigna el nombre correcto al valor de salida de la funcion }
\r
202 end; { ObtenerNombreArchivo }
\r
204 {########################################################}
\r
206 function trans(c: char; e: Estado): Estado;
\r
207 { establece el estado en el que se encuentra la lectura }
\r
208 { c es el caracter que se leyo, e es el estado actual de la lectura }
\r
211 case e of { acciona segun es estado actual de la lectura }
\r
212 INICIO: { estado de inicio de la lectura }
\r
213 case c of { acciona segun el caracter leido }
\r
214 '-', '0'..'9': trans := COEF; { si es un numero (o negativo), empieza a leer el coeficiente }
\r
215 SPACE, TAB, CR, LF: trans := COEF_BUSCA; { si es un caracter tipo "espacio", busca el prox. coef. }
\r
216 else trans := ERROR; { si es otro, da ERROR }
\r
218 COEF_BUSCA: { estado de busqueda del primer ceoficiente del polinomio }
\r
219 case c of { acciona segun el caracter leido }
\r
220 '-', '0'..'9': trans := COEF; { si es un numero (o negativo), empieza a leer el coeficiente }
\r
221 SPACE, TAB, CR, LF: trans := COEF_BUSCA; { si es un caracter tupo "espacio", sigue buscando }
\r
222 ENDF: trans := FIN; { si es el caracter de fin de archivo, pasa al estado de tarea finalizada }
\r
223 else trans := ERROR; { si es otro, da ERROR }
\r
225 COEF: { estado de lectura del coeficiente del termino del polinomio (sin punto decimal) }
\r
226 case c of { acciona segun el caracter leido }
\r
227 '0'..'9': trans := COEF; { si es un numero sigue con el mismo estado }
\r
228 '.': trans := COEF_PUNTO; { si es punto cambia al estado COEF_PUNTO }
\r
229 SPACE, TAB: trans := COEF_FIN; { si es un espacio o un tabulador, finaliza la lectura del coeficiente }
\r
230 else trans := ERROR; { si es otra cosa, pasa a estado de error }
\r
232 COEF_PUNTO: { estado de lectura del coeficiente del termino del polinomio (con punto decimal) }
\r
233 case c of { acciona segun el caracter leido }
\r
234 '0'..'9': trans := COEF_PUNTO; { si es un numero sigue con el mismo estado }
\r
235 SPACE, TAB: trans := COEF_FIN; { si es un espacio o un tabulador, finaliza la lectura del coeficiente }
\r
236 else trans := ERROR; { si es otra cosa, pasa a estado de error }
\r
238 COEF_FIN: { estado de fin de la lectura del coeficiente del termino del polinomio }
\r
239 case c of { acciona segun el caracter leido }
\r
240 '0'..'9': trans := EXP; { si el caracter es un numero establece el estado en EXP (exponente) }
\r
241 SPACE, TAB: trans := EXP_BUSCA; { si es un espacio o tabulador, pasa a buscar el proximo exponente }
\r
242 else trans := ERROR; { si no es ninguno de los anteriores, el estado pasa a ERROR }
\r
244 EXP_BUSCA: { estado de busqueda del proximo exponente }
\r
245 case c of { acciona segun el caracter leido }
\r
246 '0'..'9': trans := EXP; { si el caracter es un numero, empieza a leer el exponente }
\r
247 SPACE, TAB: trans := EXP_BUSCA; { si es un espacio o tabulador, sigue buscando }
\r
248 else trans := ERROR; { si no es ninguno de los anteriores, el estado pasa a ERROR }
\r
250 EXP: { estado de lectura del exponente del termino actual del polinomio }
\r
251 case c of { acciona segun el caracter leido }
\r
252 '0'..'9': trans := EXP; { si es un digito, sigue en el mismo estado }
\r
253 CR: trans := EXP_FIN; { si es un ratorno de carro, finaliza el exponente
\r
254 (quiere decir que hubo un <ENTER>) }
\r
255 ENDF: trans := FIN; { si es el final del archivo, se indica que termino su tarea }
\r
256 else trans := ERROR; { si es otra cosa, devuelve ERROR }
\r
258 EXP_FIN: { estado de fin de la lectura del exponente del termino actual del polinomio }
\r
259 if c = LF then trans := EXP_FIN_BUSCA { debe ser un caracter de nueva linea (para completar el <ENTER>) }
\r
260 else trans := ERROR; { si no lo es, devuelve ERROR }
\r
261 EXP_FIN_BUSCA: { estado de fin de lectura de la nueva linea (luego de finalizar el exponente
\r
262 ahora decide si termino el polinomio o si sigue leyendo el proximo coeficiente }
\r
263 case c of { acciona segun el caracter leido }
\r
264 '-', '0'..'9': trans := COEF; { si es un digito (o negativo), pasa a leer en proximo coeficiente }
\r
265 CR: trans := POLI_FIN; { si es un ratorno de carro o nueva linea, finaliza el polinomio }
\r
266 else trans := ERROR; { si es otra cosa, devuelve ERROR }
\r
268 POLI_FIN: { estado de finalizacion del polinomio actual }
\r
269 if c = LF then trans := COEF_BUSCA { debe ser un caracter de nueva linea (para completar el <ENTER>),
\r
270 entonces pasa a buscar el primer coeficiente del nuevo polinomio }
\r
271 else trans := ERROR; { si no lo es, devuelve ERROR }
\r
272 FIN: { estado que adquiere cuando se finalizo la tarea }
\r
273 trans := FIN; { se queda en este estado avisando que termino su tarea }
\r
274 else { otro estado, no deberia ocurrir, salvo que se le pase a la funcion un estado de ERROR }
\r
275 trans := ERROR; { si es otro, da ERROR }
\r
279 {########################################################}
\r
281 function cargarVectores(var v1, v2: Vector): boolean;
\r
282 { Funcion que abre el archivo de texto con los datos, lo carga en el vector procesandolo debidamente a medida
\r
283 que lo lee y, al finalizar, cierra el archivo de texto.
\r
284 v1 es el primer vector a cargar
\r
285 v2 es el segundo vector a cargar
\r
286 devuelve true si la lectura fue hecha con exito, false si hubo un error }
\r
289 f: Text; { archivo de texto con los datos }
\r
290 c: char; { caracter que se extrae del archivo de texto }
\r
291 nombreArchivo: String; { nombre del archivo de datos }
\r
292 est: Estado; { Indicador del estado actual de la lectura }
\r
293 seguir: boolean; { indicador para saber si debe seguir con el proceso }
\r
294 i, { indice del vector del polinomio para ser inicializado }
\r
295 iExp, { valor temporal para almacenar al exponente }
\r
296 code, { almacena el resultado de la funcion val (no se usa porque los
\r
297 datos ya estan validados }
\r
298 poliN: integer; { numero del polinomio que se esta leyendo }
\r
299 rCoef: real; { valor temporal para almacenar al coeficiente }
\r
300 exponente, { string que representa al exponente leido }
\r
301 coeficiente: String; { string que representa al coeficiente leido }
\r
303 begin { cargarVectores }
\r
304 rCoef := 0.0; { inicializacion de variable }
\r
305 iExp := 0; { inicializacion de variable }
\r
306 coeficiente := ''; { inicializacion de variable }
\r
307 exponente := ''; { inicializacion de variable }
\r
308 est := INICIO; { empieza con el estado de INICIO }
\r
309 poliN := 1; { establece que se procesara el primer polinomio }
\r
310 inicializaVector(v1); { inicializacion del vector 1 (primer polinomio) }
\r
311 inicializaVector(v2); { inicializacion del vector 2 (segundo polinomio) }
\r
312 nombreArchivo := ObtenerNombreArchivo; { obtiene el nombre del archivo }
\r
313 assign(f, nombreArchivo); { asigna la variable al nombre del archivo }
\r
314 reset(f); { abre el archivo para leerlo desde el principio }
\r
315 seguir := true; { inicializa seguir e true para comenzar el bucle }
\r
316 while seguir do begin { continua mientras seguir sea true }
\r
317 read(f, c); { lee un caracter del archivo de texto }
\r
318 est := trans(c, est); { establece el nuevo estado de lectura }
\r
319 case est of { toma una desicion dependiendo del estado en que se encuentre }
\r
320 INICIO: ; { No hace nada, nunca toma este valor. Solo incica que empezo el proceso }
\r
321 COEF_BUSCA: ; { No hace nada, solo espera hasta que hayan datos significativos }
\r
322 COEF, COEF_PUNTO: { Si esta leyendo el coeficiente ... }
\r
323 coeficiente := coeficiente + c; { concatena el caracter a la representacion
\r
324 de texto del coeficiente }
\r
325 COEF_FIN: ; { Si termino de leer el coeficiente, no hace nada, la asignacion
\r
326 se realiza cuando termina de leer el exponente (es necesario
\r
327 para establecer el indice del vector }
\r
328 EXP_BUSCA: ; { No hace nada, solo espera hasta que hayan datos significativos }
\r
329 EXP: { Si esta leyendo el exponente ... }
\r
330 exponente := exponente + c; { concatena el caracter a la representacion
\r
331 de texto del exponente }
\r
332 EXP_FIN: { Si termino de leer el exponente, hace las asignaciones correspondientes }
\r
333 begin { convirtiendo las cadenas de texto en real e integer, segun el caso }
\r
334 val(coeficiente, rCoef, code); { convierte el coeficiente en real }
\r
335 val(exponente, iExp, code); { convierte el exponente en integer }
\r
336 if iExp < TAM { si el exponente es menor que el tama¤o maximo permitido ... }
\r
337 then if poliN = 1 then v1[iExp] := rCoef { asigna el valor correspondiente }
\r
338 else v2[iExp] := rCoef { al polinomio correspondiente }
\r
339 else est := ERROR; { si no es menor, pone el estado en ERROR }
\r
340 coeficiente := ''; { una vez asignados, vacia los valores del coeficiente y el }
\r
341 exponente := ''; { exponente para poder realizar las lecturas de los proximos }
\r
343 EXP_FIN_BUSCA: ; { No hace nada, solo espera hasta que hayan datos significativos }
\r
344 POLI_FIN: { Si termino la lectura de un polinomio ... }
\r
345 if poliN = 1 then poliN := 2 { si se leyo el 1er polinomio, se indica que se leera el 2do }
\r
346 else est := FIN; { si no (ya se leyo el segundo), pone el estado en FIN }
\r
347 FIN: { Si se finalizaron las tareas ... }
\r
349 cargarVectores := true; { en principio se establece que la lectura se hizo con exito ) }
\r
350 seguir := false; { poner seguir en false para que se termine el bucle }
\r
351 { este codigo es similar al de EXP_FIN, se hacen las asignaciones por el caso en que el fin
\r
352 del archivo esta pegado al fin del ultimo exponente, en cuyo caso no pasa por el estado
\r
353 de EXP_FIN (y, por ende, no se pueden hacer las asignaciones correspondientes }
\r
354 val(coeficiente, rCoef, code); { convierte el coeficiente en real }
\r
355 val(exponente, iExp, code); { convierte el exponente en integer }
\r
356 if iExp < TAM { si el exponente es menor que el tama¤o maximo permitido ... }
\r
358 then v2[iExp] := rCoef { si es el 2do polinomio, asigna el valor correspondiente }
\r
359 else cargarVectores := false { si es el primero, no se hizo bien la lectura }
\r
360 else cargarVectores := false; { si no es menor, no se hizo bien la lectura }
\r
362 ERROR: { Si hubo un error ... }
\r
364 cargarVectores := false; { Se devuelve false (hubo un ERROR, no se leyeron bien los vectores) }
\r
365 seguir := false; { seguir se pone en false para que termine el bucle }
\r
369 close(f); { se cierra el archivo de lectura de datos }
\r
370 end; { cargarVectores }
\r
372 {########################################################}
\r
374 procedure suma(v1, v2: Vector; var vr: Vector);
\r
375 { procedimiento que suma dos polinomios.
\r
376 v1: vector que contiene el primer polinomio a sumar
\r
377 v2: vector que contiene el segundo polinomio a sumar
\r
378 vr: vector donde se almacenara el resultado de la suma }
\r
381 i: integer; { indice para usar en el ciclo for }
\r
384 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
385 for i := 0 to TAM - 1 do { recorre el vector (de tama¤o maximo TAM) }
\r
386 vr[i] := v1[i] + v2[i]; { suma los coeficientes de los terminos con igual exponente }
\r
389 {########################################################}
\r
391 procedure resta(v1, v2: Vector; var vr: Vector);
\r
392 { procedimiento que resta dos polinomios.
\r
393 v1: vector que contiene el primer polinomio
\r
394 v2: vector que contiene el polinomio para restarle al primero
\r
395 vr: vector donde se almacenara el resultado de la resta }
\r
398 i: integer; { indice para usar en el ciclo for }
\r
401 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
402 for i := 0 to TAM - 1 do { recorre el vector (de tama¤o maximo TAM) }
\r
403 vr[i] := v1[i] - v2[i]; { resta los coeficientes de los terminos con igual exponente }
\r
406 {########################################################}
\r
408 procedure producto(v1, v2: Vector; var vr: Vector);
\r
409 { procedimiento que multiplica dos polinomios.
\r
410 v1: vector que contiene el primer polinomio a multiplicar
\r
411 v2: vector que contiene el segundo polinomio a multiplicar
\r
412 vr: vector donde se almacenara el resultado de la multiplicacion }
\r
415 i, j: integer; { indices para usar en los ciclos for }
\r
418 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
419 for i := 0 to TAM - 1 do { recorre el 1er vector (de tama¤o maximo TAM) }
\r
420 for j := 0 to TAM - 1 do { recorre el 2do vector (de tama¤o maximo TAM) }
\r
421 vr[i+j] := vr[i+j] + (v1[i] * v2[j]);
\r
422 { multiplica los coeficientes de los terminos y lo almacena en la posicion del exponente }
\r
423 { igual a la suma de los exponentes de v1 y v2, sumando el valor previo de dicha posicion }
\r
426 {########################################################}
\r
428 function division(v1, v2: Vector; var vr, vResto: Vector): boolean;
\r
429 { procedimiento que divide dos polinomios.
\r
430 v1: vector que contiene el polinomio denominador
\r
431 v2: vector que contiene el polinomio divisor
\r
432 vr: vector donde se almacenara el resultado de la division
\r
433 vResto: vector donde se almacenara el resto de la division
\r
434 devuelve true si el segundo polinomio no es 0 y se efectua la division y
\r
435 devuelve false si segundo polinomio es 0 y no se puede efectuar la division }
\r
438 i, j: integer; { indices para usar en los ciclos for }
\r
439 vRTmp, { vector auxuliares para almacenar el termino actual del resultado }
\r
440 vTmp: Vector; { vector auxuliares para almacenar el polinomio que es la multiplicacion del
\r
441 termino actual del resultado por el divisor }
\r
444 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
445 inicializaVector(vResto); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
446 inicializaVector(vTmp); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
447 inicializaVector(vRTmp); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
448 for i := TAM - 1 downto 0 do { recorre el 1er vector (de tama¤o maximo TAM) de atras para adelante }
\r
449 if v1[i] <> 0 then break;
\r
450 { busca empezando por el indice (exponete) mas alto el primer coeficiente no nulo }
\r
451 { si lo encuentra sale del for dejando al valor de i como el de dicho inidice }
\r
452 for j := TAM - 1 downto 0 do { recorre el 2do vector (de tama¤o maximo TAM) de atras para adelante }
\r
453 if v2[j] <> 0 then break;
\r
454 { busca empezando por el indice (exponete) mas alto el primer coeficiente no nulo }
\r
455 { si lo encuentra sale del for dejando al valor de j como el de dicho inidice }
\r
456 if (j = 0) and (v2[j] = 0) { si el no se encontro ningun coeficiente no nulo, entonces }
\r
457 then { el polinomio 2 es nulo y no se puede efectuar la division }
\r
458 begin { se devuelve false y se quedan los vectores resultado en 0 }
\r
459 division := false; { devuelve false }
\r
460 exit; { sale del procedimiento }
\r
462 while i >= j do { si el primer exponente es mayor o igual que el segundo empieza a dividir }
\r
464 vr[i-j] := v1[i] / v2[j]; { almacena el resultado de la division entre los coeficientes en
\r
465 la posicion de la resta de ambos }
\r
466 vRTmp[i-j] := vr[i-j]; { almacena ese resultado en un polinomio temporal cuyo unico termio
\r
467 no nulo es el del exponente i-j, para luego multiplicarlo }
\r
468 producto(vRTmp, v2, vTmp);{ multiplica este polinomio por el segundo almacenado el resultado
\r
469 en otro temporal, para luego hacer la resta }
\r
470 resta(v1, vTmp, v1); { resta al primer polinomio, v1, (en su estado actual, no el original)
\r
471 el temporal vTmp y lo almacena en v1, para poder volver a operarlo de
\r
473 vRTmp[i-j] := 0; { resetea el termino del temporal vRTmp que se asigno para los calculos }
\r
474 for i := i downto 0 do { recorre el vector v1 (de tama¤o maximo TAM) de atras para adelante }
\r
475 if v1[i] <> 0 then break;
\r
476 { busca empezando por el indice (exponete) i el primer coeficiente no nulo
\r
477 si lo encuentra sale del for dejando al valor de i como el de dicho inidice }
\r
479 vResto := v1; { asigna el vector v1 (que ya no se procesara mas al resto }
\r
480 division := true; { devuelve true indicando que se finalizo con exito }
\r
483 {########################################################}
\r
485 procedure mensajeSalida; { muestra un mensaje en la salida del programa }
\r
491 {########################################################}
\r
495 i: integer; { variable auxiliar }
\r
496 v1, v2, vResult, vResto: Vector; { vectores para hacer las operaciones }
\r
497 seguir, { indicador para saber si sigue corriendo el programa }
\r
498 noNulo, { indicador para saber si en la division el divisor es nulo }
\r
499 continua: boolean; { indicador para saber si se leyeron bien los polinomios }
\r
500 tecla: char; { entrada de teclado del usuario para elegir una opcion }
\r
502 begin { programa principal }
\r
503 textbackground( Blue ); { establece el color para el fondo a azul }
\r
504 continua := cargarVectores(v1, v2); { carga los vectores del archivo de datos }
\r
505 if continua then { si se leyeron bien ... }
\r
507 seguir := true; { inicializa la variable en true para que entre en el ciclo while }
\r
508 while seguir do { mientras el usuario no salga del programa }
\r
510 clrscr; { borra la pantalla }
\r
511 textcolor(Yellow); { establece el color para el texto a amarillo }
\r
512 gotoxy( 25, 3 ); { va a las coordenas de pantalla 19 horizontal, 3 verical }
\r
513 writeln( 'OPERACIONES ENTRE POLINOMIOS' ); { titulo }
\r
514 gotoxy( 25, 4 ); { va a las coordenas de pantalla 19 horizontal, 4 verical }
\r
515 writeln( '~~~~~~~~~~~ ~~~~~ ~~~~~~~~~~' ); { subrayado del titulo }
\r
516 textcolor(LightCyan); { establece el color para el texto a cian claro }
\r
517 gotoxy( 1, 7 ); { va a las coordenas de pantalla 1 horizontal, 7 verical }
\r
518 writeln( ' Elija que desea hacer:' ); { mensaje }
\r
519 writeln( ' ----- --- ----- ------' ); { mensaje }
\r
520 textcolor(LightGray); { establece el color para el texto a gris claro }
\r
521 writeln; { mensaje con las opciones ... }
\r
523 writeln( ' 1.- Ver el polinomio 1.' );
\r
524 writeln( ' 2.- Ver el polinomio 2.' );
\r
525 writeln( ' 3.- Sumar los polinomios.' );
\r
526 writeln( ' 4.- Restar el polinomio 2 al polinomio 1 (poli1 - poli2).' );
\r
527 writeln( ' 5.- Restar el polinomio 1 al polinomio 2 (poli2 - poli1).' );
\r
528 writeln( ' 6.- Multiplicar los polinomios.' );
\r
529 writeln( ' 7.- Polinomio 1 dividido polinomio 2 (poli1 / poli2).' );
\r
530 writeln( ' 8.- Polinomio 2 dividido polinomio 1 (poli2 / poli1).' );
\r
531 writeln( ' 0.- Salir.' );
\r
532 gotoxy(1, 23); { va a las coordenas de pantalla 1 horizontal, 23 verical }
\r
533 textcolor(White ); { establece el color para el texto a blanco }
\r
534 write(' Ingrese su opci¢n: ');
\r
535 textcolor(Yellow); { establece el color para el texto a amarillo }
\r
536 tecla := readkey; { lee una tecla del usuario indicando la opcion que elijio }
\r
537 if tecla = '0' then { si la opcion fue salir del programa ... }
\r
539 mensajeSalida; { presenta un mensaje de salida }
\r
540 exit; { sale del programa }
\r
542 while (tecla < '1') or (tecla > '8') do { mientras sea una tecla no admitida }
\r
544 textcolor(White); { establece el color para el texto a blanco }
\r
545 gotoxy( 1, 23 ); { va a las coordenas de pantalla 1 horizontal, 7 verical }
\r
546 write(' Ingrese su opci¢n ("1" a "8" o "0"): ' );
\r
547 textcolor(Yellow); { establece el color para el texto a amarillo }
\r
548 tecla := readkey; { lee una tecla del usuario indicando la opcion que elijio }
\r
550 clrscr; { borra la pantalla }
\r
551 textcolor(Yellow); { establece el color para el texto a amarillo }
\r
552 gotoxy(19, 3); { va a las coordenas de pantalla 19 horizontal, 3 verical }
\r
553 writeln( 'OPERACIONES ENTRE POLINOMIOS'); { titulo }
\r
554 gotoxy(19, 4); { va a las coordenas de pantalla 19 horizontal, 4 verical }
\r
555 writeln('~~~~~~~~~~~ ~~~~~ ~~~~~~~~~~'); { subrayado del titulo }
\r
556 textcolor(LightCyan); { establece el color para el texto a cian claro }
\r
557 gotoxy(1, 7); { va a las coordenas de pantalla 1 horizontal, 7 verical }
\r
559 '1': muestraVector(v1, ' Polinomio 1 = ');
\r
560 '2': muestraVector(v2, ' Polinomio 2 = ');
\r
562 suma(v1, v2, vResult);
\r
563 muestraVector(vResult, ' Polinomio 1 + Polinomio 2 = ');
\r
566 resta(v1, v2, vResult);
\r
567 muestraVector(vResult, ' Polinomio 1 - Polinomio 2 = ');
\r
570 resta(v2, v1, vResult);
\r
571 muestraVector(vResult, ' Polinomio 2 - Polinomio 1 = ');
\r
574 producto(v1, v2, vResult);
\r
575 muestraVector(vResult, ' Polinomio 1 * Polinomio 2 = ');
\r
578 noNulo := division(v1, v2, vResult, vResto);
\r
582 muestraVector(vResult, ' Polinomio 1 / Polinomio 2 = ');
\r
583 muestraVector(vResto, ' Resto = ');
\r
585 else writeln('El polinomio 2 es nulo, por lo tanto no se puede efectuar la division');
\r
588 noNulo := division(v2, v1, vResult, vResto);
\r
592 muestraVector(vResult, 'Polinomio 2 / Polinomio 1 = ');
\r
593 muestraVector(vResto, 'Resto = ');
\r
595 else writeln('El polinomio 1 es nulo, por lo tanto no se puede efectuar la division');
\r
597 '0': ; { no hace nada, nunca deberia entrar en este case }
\r
599 writeln; { los siguientes mensajes son para que el usuario pueda ver los datos y luego }
\r
600 writeln; { presione una tecla para continuar }
\r
601 textcolor(white); { pone el color del texto en blanco }
\r
602 writeln(' Presione una tecla para continuar ...');
\r
606 else { si los vectores no se leyeron bien ... }
\r
607 begin { presenta un mensaje de error }
\r
608 writeln('ERROR: No se pudieron cargar los datos. Revise que el formato del archivo');
\r
609 writeln(' sea correcto y que no este siendo usado por otro programa.');
\r
611 end. { procedure menuGenerar }