1 program PolinomiosEnTermino;
\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 degito (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 = '0.0.1a (TERM_0)'; { 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
54 Vector = array [0..TAM_MAX-1] of Termino; { vector para almacenar los polinomios }
\r
57 {########################################################}
\r
59 procedure muestraVector(var v: Vector; s: String);
\r
60 { procedimiento que imprime el polinomio v en pantalla con un titulo s }
\r
62 {########################################################}
\r
64 function exponente(exp: integer): String;
\r
67 s: String; { variable temporal }
\r
71 0: exponente := ''; { si el exponente es nulo, mustra solo el coeficiente }
\r
72 1: exponente := 'X'; { si el exponente es 1, mustra el coeficiente y X }
\r
73 2: exponente := 'Xý'; { si el exponente es 2, mustra el coeficiente y Xý }
\r
75 str(exp, s); { convierte al exponente en string }
\r
76 exponente := 'X^' + s; { si el exponente es mayor que 1, mustra el coeficiente y X^exp }
\r
81 {########################################################}
\r
85 i: integer; { indice para usar en el ciclo for }
\r
87 begin { muestraVector }
\r
88 writeln; { separacion de una linea }
\r
89 write(s); { mustra el mensaje }
\r
90 for i := TAM_MAX - 1 downto 0 do { recorre el vector de atras para adelante }
\r
91 if v[i].coef <> 0 then break; { si el coeficiente no es nulo, termina el for dejando a i en ese indice }
\r
92 if (v[i].exp = 0) and (v[i].coef = 0) then { si el primer exponente que encuentra es 0 y el coeficiente es 0, entonces }
\r
93 begin { muestra el resultado como 0 y sale del procedimiento }
\r
94 write('0'); { imprime que el resultado es cero }
\r
95 writeln; { separacion de una linea }
\r
96 writeln; { separacion de una linea }
\r
97 exit; { sale de este procedimiento }
\r
99 if (abs(v[i].coef) <> 1) or (v[i].exp = 0) { si el modulo del coeficiente es distinto de 1 o si el exp. es 0 }
\r
100 then if abs(v[i].coef) - trunc(abs(v[i].coef)) = 0 then write(trunc(v[i].coef):1, ' ') {imprime si es un numero entero}
\r
101 else write(v[i].coef:1:2, ' ') { imprime si es un numero real }
\r
102 else if v[i].coef = -1 then write('-'); { si es -1 entonces solo escribe el signo del termino }
\r
103 write(exponente(v[i].exp));
\r
104 for i := i - 1 downto 0 do { recorre el vector de atras para adelante }
\r
105 if v[i].coef <> 0 then { si el coeficiente no es nulo, termina el for dejando a i en ese indice }
\r
107 if v[i].coef < 0 { si el coeficiente en negativo }
\r
108 then write(' - ') { le agrega el signo - }
\r
109 else write(' + '); { si no, le agrega el signo + }
\r
110 if (abs(v[i].coef) <> 1) or (i = 0) then { si el modulo del coeficiente es distinto de 1 o si el exp. es 0 }
\r
111 if abs(v[i].coef) - trunc(abs(v[i].coef)) = 0
\r
112 then write(trunc(abs(v[i].coef)):1, ' ') { imprime si es entero }
\r
113 else write(abs(v[i].coef):1:2, ' '); { imprime si es un real }
\r
114 write(exponente(v[i].exp));
\r
116 writeln; { separacion de una linea }
\r
117 writeln; { separacion de una linea }
\r
118 end; { muestraVector }
\r
120 {########################################################}
\r
122 procedure inicializaVector(var v: Vector);
\r
123 { procedimiento que inicializa un vector de tama¤o tam }
\r
125 var i: integer; { indice para usar en el ciclo for }
\r
127 begin { inicializaVector }
\r
128 for i := 0 to TAM_MAX - 1 do { recorre el vector }
\r
130 v[i].coef := 0.0; { inicializa la variable actual en 0 }
\r
131 v[i].exp := 0; { inicializa la variable actual en 0 }
\r
133 end; { inicializaVector }
\r
135 {########################################################}
\r
137 function ObtenerNombreArchivo: String;
\r
138 { funcion que obtiene un nombre de archivo valido (es decir, el nombre
\r
139 de un archivo que exista) }
\r
141 {########################################################}
\r
143 function fileExists(FileName: String): Boolean;
\r
144 { funcion extraida de la ayuda del Turbo Pascal 7
\r
145 indica si el archivo existe }
\r
152 Assign(F, FileName);
\r
153 FileMode := 0; { Set file access to read only }
\r
157 FileExists := (IOResult = 0) and (FileName <> '');
\r
158 end; { FileExists }
\r
160 {########################################################}
\r
162 { Continuacion de la funcion ObtenerNombreArchivo }
\r
164 DEFAUL_FILE_NAME = 'datos.txt'; { nombre del archivo por defecto }
\r
167 tmp: String; { cadena para almacenar el resultado temporal }
\r
169 begin { ObtenerNombreArchivo }
\r
170 { mensaje para entrada del nombre de archivo }
\r
171 writeln('Ingrese el nombre del archivo con los datos (ENTER = ', DEFAUL_FILE_NAME, '):');
\r
172 readln(tmp); { entrada del nombre de archivo }
\r
173 if tmp = '' then tmp := DEFAUL_FILE_NAME; { se fija si no se ingreso nada y reasigana el nombre }
\r
174 while not fileExists(tmp) do { repite el proceso hasta que el archivo exista }
\r
176 write('El archivo ', tmp, ' no existe. Ingrese un nombre correcto');
\r
177 if tmp = DEFAUL_FILE_NAME { si es el nombre de archivo predeterminado }
\r
178 then { entonces, elije un mensaje apropiado }
\r
181 begin { si no es el predeterminado, muestra otro mensaje }
\r
183 write('(ENTER = ', DEFAUL_FILE_NAME, '): ');
\r
185 readln(tmp); { vuelve a leer el nombre del archivo para ser verificado }
\r
186 if tmp = '' then tmp := DEFAUL_FILE_NAME; { asigna como nombre de archivo al predeterminado
\r
187 si no se escribio nada }
\r
188 end; { fin del loop de verificacion }
\r
189 ObtenerNombreArchivo := tmp; { asigna el nombre correcto al valor de salida de la funcion }
\r
190 end; { ObtenerNombreArchivo }
\r
192 {########################################################}
\r
194 function trans(c: char; e: Estado): Estado;
\r
195 { establece el estado en el que se encuentra la lectura }
\r
196 { c es el caracter que se leyo, e es el estado actual de la lectura }
\r
199 case e of { acciona segun es estado actual de la lectura }
\r
200 INICIO: { estado de inicio de la lectura }
\r
201 case c of { acciona segun el caracter leido }
\r
202 '-', '0'..'9': trans := COEF; { si es un numero (o negativo), empieza a leer el coeficiente }
\r
203 SPACE, TAB, CR, LF: trans := COEF_BUSCA; { si es un caracter tipo "espacio", busca el prox. coef. }
\r
204 else trans := ERROR; { si es otro, da ERROR }
\r
206 COEF_BUSCA: { estado de busqueda del primer ceoficiente del polinomio }
\r
207 case c of { acciona segun el caracter leido }
\r
208 '-', '0'..'9': trans := COEF; { si es un numero (o negativo), empieza a leer el coeficiente }
\r
209 SPACE, TAB, CR, LF: trans := COEF_BUSCA; { si es un caracter tupo "espacio", sigue buscando }
\r
210 ENDF: trans := FIN; { si es el caracter de fin de archivo, pasa al estado de tarea finalizada }
\r
211 else trans := ERROR; { si es otro, da ERROR }
\r
213 COEF: { estado de lectura del coeficiente del termino del polinomio (sin punto decimal) }
\r
214 case c of { acciona segun el caracter leido }
\r
215 '0'..'9': trans := COEF; { si es un numero sigue con el mismo estado }
\r
216 '.': trans := COEF_PUNTO; { si es punto cambia al estado COEF_PUNTO }
\r
217 SPACE, TAB: trans := COEF_FIN; { si es un espacio o un tabulador, finaliza la lectura del coeficiente }
\r
218 else trans := ERROR; { si es otra cosa, pasa a estado de error }
\r
220 COEF_PUNTO: { estado de lectura del coeficiente del termino del polinomio (con punto decimal) }
\r
221 case c of { acciona segun el caracter leido }
\r
222 '0'..'9': trans := COEF_PUNTO; { si es un numero sigue con el mismo estado }
\r
223 SPACE, TAB: trans := COEF_FIN; { si es un espacio o un tabulador, finaliza la lectura del coeficiente }
\r
224 else trans := ERROR; { si es otra cosa, pasa a estado de error }
\r
226 COEF_FIN: { estado de fin de la lectura del coeficiente del termino del polinomio }
\r
227 case c of { acciona segun el caracter leido }
\r
228 '0'..'9': trans := EXP; { si el caracter es un numero establece el estado en EXP (exponente) }
\r
229 SPACE, TAB: trans := EXP_BUSCA; { si es un espacio o tabulador, pasa a buscar el proximo exponente }
\r
230 else trans := ERROR; { si no es ninguno de los anteriores, el estado pasa a ERROR }
\r
232 EXP_BUSCA: { estado de busqueda del proximo exponente }
\r
233 case c of { acciona segun el caracter leido }
\r
234 '0'..'9': trans := EXP; { si el caracter es un numero, empieza a leer el exponente }
\r
235 SPACE, TAB: trans := EXP_BUSCA; { si es un espacio o tabulador, sigue buscando }
\r
236 else trans := ERROR; { si no es ninguno de los anteriores, el estado pasa a ERROR }
\r
238 EXP: { estado de lectura del exponente del termino actual del polinomio }
\r
239 case c of { acciona segun el caracter leido }
\r
240 '0'..'9': trans := EXP; { si es un digito, sigue en el mismo estado }
\r
241 CR: trans := EXP_FIN; { si es un ratorno de carro, finaliza el exponente
\r
242 (quiere decir que hubo un <ENTER>) }
\r
243 ENDF: trans := FIN; { si es el final del archivo, se indica que termino su tarea }
\r
244 else trans := ERROR; { si es otra cosa, devuelve ERROR }
\r
246 EXP_FIN: { estado de fin de la lectura del exponente del termino actual del polinomio }
\r
247 if c = LF then trans := EXP_FIN_BUSCA { debe ser un caracter de nueva linea (para completar el <ENTER>) }
\r
248 else trans := ERROR; { si no lo es, devuelve ERROR }
\r
249 EXP_FIN_BUSCA: { estado de fin de lectura de la nueva linea (luego de finalizar el exponente
\r
250 ahora decide si termino el polinomio o si sigue leyendo el proximo coeficiente }
\r
251 case c of { acciona segun el caracter leido }
\r
252 '-', '0'..'9': trans := COEF; { si es un digito (o negativo), pasa a leer en proximo coeficiente }
\r
253 CR: trans := POLI_FIN; { si es un ratorno de carro o nueva linea, finaliza el polinomio }
\r
254 else trans := ERROR; { si es otra cosa, devuelve ERROR }
\r
256 POLI_FIN: { estado de finalizacion del polinomio actual }
\r
257 if c = LF then trans := COEF_BUSCA { debe ser un caracter de nueva linea (para completar el <ENTER>),
\r
258 entonces pasa a buscar el primer coeficiente del nuevo polinomio }
\r
259 else trans := ERROR; { si no lo es, devuelve ERROR }
\r
260 FIN: { estado que adquiere cuando se finalizo la tarea }
\r
261 trans := FIN; { se queda en este estado avisando que termino su tarea }
\r
262 else { otro estado, no deberia ocurrir, salvo que se le pase a la funcion un estado de ERROR }
\r
263 trans := ERROR; { si es otro, da ERROR }
\r
267 {########################################################}
\r
269 function cargarVectores(var v1, v2: Vector): boolean;
\r
270 { Funcion que abre el archivo de texto con los datos, lo carga en el vector procesandolo debidamente a medida
\r
271 que lo lee y, al finalizar, cierra el archivo de texto.
\r
272 v1 es el primer vector a cargar
\r
273 v2 es el segundo vector a cargar
\r
274 devuelve true si la lectura fue hecha con exito, false si hubo un error }
\r
277 f: Text; { archivo de texto con los datos }
\r
278 c: char; { caracter que se extrae del archivo de texto }
\r
279 nombreArchivo: String; { nombre del archivo de datos }
\r
280 est: Estado; { Indicador del estado actual de la lectura }
\r
281 seguir: boolean; { indicador para saber si debe seguir con el proceso }
\r
282 i, { indice del vector del polinomio para ser inicializado }
\r
283 iExp, { valor temporal para almacenar al exponente }
\r
284 code, { almacena el resultado de la funcion val (no se usa porque los
\r
285 datos ya estan validados }
\r
286 poliN: integer; { numero del polinomio que se esta leyendo }
\r
287 rCoef: real; { valor temporal para almacenar al coeficiente }
\r
288 exponente, { string que representa al exponente leido }
\r
289 coeficiente: String; { string que representa al coeficiente leido }
\r
291 begin { cargarVectores }
\r
292 rCoef := 0.0; { inicializacion de variable }
\r
293 iExp := 0; { inicializacion de variable }
\r
294 coeficiente := ''; { inicializacion de variable }
\r
295 exponente := ''; { inicializacion de variable }
\r
296 est := INICIO; { empieza con el estado de INICIO }
\r
297 poliN := 1; { establece que se procesara el primer polinomio }
\r
298 inicializaVector(v1); { inicializacion del vector 1 (primer polinomio) }
\r
299 inicializaVector(v2); { inicializacion del vector 2 (segundo polinomio) }
\r
300 nombreArchivo := ObtenerNombreArchivo; { obtiene el nombre del archivo }
\r
301 assign(f, nombreArchivo); { asigna la variable al nombre del archivo }
\r
302 reset(f); { abre el archivo para leerlo desde el principio }
\r
303 seguir := true; { inicializa seguir e true para comenzar el bucle }
\r
304 while seguir do begin { continua mientras seguir sea true }
\r
305 read(f, c); { lee un caracter del archivo de texto }
\r
306 est := trans(c, est); { establece el nuevo estado de lectura }
\r
307 case est of { toma una desicion dependiendo del estado en que se encuentre }
\r
308 INICIO: ; { No hace nada, nunca toma este valor. Solo incica que empezo el proceso }
\r
309 COEF_BUSCA: ; { No hace nada, solo espera hasta que hayan datos significativos }
\r
310 COEF, COEF_PUNTO: { Si esta leyendo el coeficiente ... }
\r
311 coeficiente := coeficiente + c; { concatena el caracter a la representacion
\r
312 de texto del coeficiente }
\r
313 COEF_FIN: ; { Si termino de leer el coeficiente, no hace nada, la asignacion
\r
314 se realiza cuando termina de leer el exponente (es necesario
\r
315 para establecer el indice del vector }
\r
316 EXP_BUSCA: ; { No hace nada, solo espera hasta que hayan datos significativos }
\r
317 EXP: { Si esta leyendo el exponente ... }
\r
318 exponente := exponente + c; { concatena el caracter a la representacion
\r
319 de texto del exponente }
\r
320 EXP_FIN: { Si termino de leer el exponente, hace las asignaciones correspondientes }
\r
321 begin { convirtiendo las cadenas de texto en real e integer, segun el caso }
\r
322 val(coeficiente, rCoef, code); { convierte el coeficiente en real }
\r
323 val(exponente, iExp, code); { convierte el exponente en integer }
\r
324 if iExp < TAM { si el exponente es menor que el tama¤o maximo permitido ... }
\r
325 then if poliN = 1 then
\r
327 v1[n].coef := rCoef { asigna el valor correspondiente }
\r
328 v1[n].exp := iExp { asigna el valor correspondiente }
\r
332 v1[n].coef := rCoef { asigna el valor correspondiente }
\r
333 v1[n].exp := iExp { asigna el valor correspondiente }
\r
335 else est := ERROR; { si no es menor, pone el estado en ERROR }
\r
336 coeficiente := ''; { una vez asignados, vacia los valores del coeficiente y el }
\r
337 exponente := ''; { exponente para poder realizar las lecturas de los proximos }
\r
339 EXP_FIN_BUSCA: ; { No hace nada, solo espera hasta que hayan datos significativos }
\r
340 POLI_FIN: { Si termino la lectura de un polinomio ... }
\r
341 if poliN = 1 then poliN := 2 { si se leyo el 1er polinomio, se indica que se leera el 2do }
\r
342 else est := FIN; { si no (ya se leyo el segundo), pone el estado en FIN }
\r
343 FIN: { Si se finalizaron las tareas ... }
\r
345 { este codigo es el mismo que el de EXP_FIN, se repite aca solo por si el final del
\r
346 archivo esta pegado al fin del ultimo exponente, en cuyo caso no pasa por el estado
\r
347 de EXP_FIN (y, por ende, no se pueden hacer las asignaciones correspondientes }
\r
348 val(coeficiente, rCoef, code); { convierte el coeficiente en real }
\r
349 val(exponente, iExp, code); { convierte el exponente en integer }
\r
350 if iExp < TAM { si el exponente es menor que el tama¤o maximo permitido ... }
\r
351 then if poliN = 1 then
\r
353 v1[n].coef := rCoef { asigna el valor correspondiente }
\r
354 v1[n].exp := iExp { asigna el valor correspondiente }
\r
358 v1[n].coef := rCoef { asigna el valor correspondiente }
\r
359 v1[n].exp := iExp { asigna el valor correspondiente }
\r
361 else est := ERROR; { si no es menor, pone el estado en ERROR }
\r
362 coeficiente := ''; { una vez asignados, vacia los valores del coeficiente y el }
\r
363 exponente := ''; { exponente para poder realizar las lecturas de los proximos }
\r
364 { fin del codigo identico a EXP_FIN }
\r
365 if poliN = 2 then cargarVectores := true { si se leyeron los 2 polinomios, devuelve true }
\r
366 else cargarVectores := false; { si no se leyeron los dos, devuelve false }
\r
367 seguir := false; { poner seguir en false para que se termine el bucle }
\r
369 ERROR: { Si hubo un error ... }
\r
371 cargarVectores := false; { Se devuelve false (hubo un ERROR, no se leyeron bien los vectores) }
\r
372 seguir := false; { seguir se pone en false para que termine el bucle }
\r
376 close(f); { se cierra el archivo de lectura de datos }
\r
377 end; { cargarVectores }
\r
379 {########################################################}
\r
381 procedure suma(v1, v2: Vector; var vr: Vector);
\r
382 { procedimiento que suma dos polinomios.
\r
383 v1: vector que contiene el primer polinomio a sumar
\r
384 v2: vector que contiene el segundo polinomio a sumar
\r
385 vr: vector donde se almacenara el resultado de la suma }
\r
388 i: integer; { indice para usar en el ciclo for }
\r
391 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
392 for i := 0 to TAM - 1 do { recorre el vector (de tama¤o maximo TAM) }
\r
393 vr[i] := v1[i] + v2[i]; { suma los coeficientes de los terminos con igual exponente }
\r
396 {########################################################}
\r
398 procedure resta(v1, v2: Vector; var vr: Vector);
\r
399 { procedimiento que resta dos polinomios.
\r
400 v1: vector que contiene el primer polinomio
\r
401 v2: vector que contiene el polinomio para restarle al primero
\r
402 vr: vector donde se almacenara el resultado de la resta }
\r
405 i: integer; { indice para usar en el ciclo for }
\r
408 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
409 for i := 0 to TAM - 1 do { recorre el vector (de tama¤o maximo TAM) }
\r
410 vr[i] := v1[i] - v2[i]; { resta los coeficientes de los terminos con igual exponente }
\r
413 {########################################################}
\r
415 procedure producto(v1, v2: Vector; var vr: Vector);
\r
416 { procedimiento que multiplica dos polinomios.
\r
417 v1: vector que contiene el primer polinomio a multiplicar
\r
418 v2: vector que contiene el segundo polinomio a multiplicar
\r
419 vr: vector donde se almacenara el resultado de la multiplicacion }
\r
422 i, j: integer; { indices para usar en los ciclos for }
\r
425 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
426 for i := 0 to TAM - 1 do { recorre el 1er vector (de tama¤o maximo TAM) }
\r
427 for j := 0 to TAM - 1 do { recorre el 2do vector (de tama¤o maximo TAM) }
\r
428 vr[i+j] := vr[i+j] + (v1[i] * v2[j]);
\r
429 { multiplica los coeficientes de los terminos y lo almacena en la posicion del exponente }
\r
430 { igual a la suma de los exponentes de v1 y v2, sumando el valor previo de dicha posicion }
\r
433 {########################################################}
\r
435 function division(v1, v2: Vector; var vr, vResto: Vector): boolean;
\r
436 { procedimiento que divide dos polinomios.
\r
437 v1: vector que contiene el polinomio denominador
\r
438 v2: vector que contiene el polinomio divisor
\r
439 vr: vector donde se almacenara el resultado de la division
\r
440 vResto: vector donde se almacenara el resto de la division
\r
441 devuelve true si el segundo polinomio no es 0 y se efectua la division y
\r
442 devuelve false si segundo polinomio es 0 y no se puede efectuar la division }
\r
445 i, j: integer; { indices para usar en los ciclos for }
\r
446 vRTmp, { vector auxuliares para almacenar el termino actual del resultado }
\r
447 vTmp: Vector; { vector auxuliares para almacenar el polinomio que es la multiplicacion del
\r
448 termino actual del resultado por el divisor }
\r
451 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
452 inicializaVector(vResto); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
453 inicializaVector(vTmp); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
454 inicializaVector(vRTmp); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
455 for i := TAM - 1 downto 0 do { recorre el 1er vector (de tama¤o maximo TAM) de atras para adelante }
\r
456 if v1[i] <> 0 then break;
\r
457 { busca empezando por el indice (exponete) mas alto el primer coeficiente no nulo }
\r
458 { si lo encuentra sale del for dejando al valor de i como el de dicho inidice }
\r
459 for j := TAM - 1 downto 0 do { recorre el 2do vector (de tama¤o maximo TAM) de atras para adelante }
\r
460 if v2[j] <> 0 then break;
\r
461 { busca empezando por el indice (exponete) mas alto el primer coeficiente no nulo }
\r
462 { si lo encuentra sale del for dejando al valor de j como el de dicho inidice }
\r
463 if (j = 0) and (v2[j] = 0) { si el no se encontro ningun coeficiente no nulo, entonces }
\r
464 then { el polinomio 2 es nulo y no se puede efectuar la division }
\r
465 begin { se devuelve false y se quedan los vectores resultado en 0 }
\r
466 division := false; { devuelve false }
\r
467 exit; { sale del procedimiento }
\r
469 while i >= j do { si el primer exponente es mayor o igual que el segundo empieza a dividir }
\r
471 vr[i-j] := v1[i] / v2[j]; { almacena el resultado de la division entre los coeficientes en
\r
472 la posicion de la resta de ambos }
\r
473 vRTmp[i-j] := vr[i-j]; { almacena ese resultado en un polinomio temporal cuyo unico termio
\r
474 no nulo es el del exponente i-j, para luego multiplicarlo }
\r
475 producto(vRTmp, v2, vTmp);{ multiplica este polinomio por el segundo almacenado el resultado
\r
476 en otro temporal, para luego hacer la resta }
\r
477 resta(v1, vTmp, v1); { resta al primer polinomio, v1, (en su estado actual, no el original)
\r
478 el temporal vTmp y lo almacena en v1, para poder volver a operarlo de
\r
480 vRTmp[i-j] := 0; { resetea el termino del temporal vRTmp que se asigno para los calculos }
\r
481 for i := i downto 0 do { recorre el vector v1 (de tama¤o maximo TAM) de atras para adelante }
\r
482 if v1[i] <> 0 then break;
\r
483 { busca empezando por el indice (exponete) i el primer coeficiente no nulo
\r
484 si lo encuentra sale del for dejando al valor de i como el de dicho inidice }
\r
486 vResto := v1; { asigna el vector v1 (que ya no se procesara mas al resto }
\r
487 division := true; { devuelve true indicando que se finalizo con exito }
\r
490 {########################################################}
\r
492 { Continuacion del programa principal }
\r
495 i: integer; { variable auxiliar }
\r
496 v1, v2, vResult, vResto: Vector; { vectores para hacer las operaciones }
\r
497 continua: boolean; { valor para obtener los resultados de algunas funciones }
\r
499 begin { Comienzo del programa principal }
\r
500 continua := cargarVectores(v1, v2);
\r
503 muestraVector(v1, 'Polinomio 1 = ');
\r
504 muestraVector(v2, 'Polinomio 2 = ');
\r
505 suma(v1, v2, vResult);
\r
506 muestraVector(vResult, 'Polinomio 1 + Polinomio 2 = ');
\r
507 resta(v1, v2, vResult);
\r
508 muestraVector(vResult, 'Polinomio 1 - Polinomio 2 = ');
\r
509 producto(v1, v2, vResult);
\r
510 muestraVector(vResult, 'Polinomio 1 * Polinomio 2 = ');
\r
511 continua := division(v1, v2, vResult, vResto);
\r
515 muestraVector(vResult, 'Polinomio 1 / Polinomio 2 = ');
\r
516 muestraVector(vResto, 'Resto = ');
\r
518 else writeln('El segundo polinomio es nulo, por lo tanto no se puede efectuar la division');
\r
522 writeln('ERROR: No se pudieron cargar los datos. Revise que el formato del archivo');
\r
523 writeln(' sea correcto y que no este siendo usado por otro programa.');
\r