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.2.5r (POLI_14)'; { 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( 30, 3 ); { va a las coordenas de pantalla 25 horizontal, 3 verical }
\r
168 writeln( 'PolinomiosEnVector' ); { titulo }
\r
169 gotoxy( 30, 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 readln(tmp); { entrada del nombre de archivo }
\r
175 if tmp = '' then tmp := DEFAUL_FILE_NAME; { se fija si no se ingreso nada y reasigana el nombre }
\r
176 while not fileExists(tmp) do { repite el proceso hasta que el archivo exista }
\r
178 clrscr; { borra la pantalla }
\r
179 textcolor( Yellow ); { establece el color para el texto a amarillo }
\r
180 gotoxy( 30, 3 ); { va a las coordenas de pantalla 25 horizontal, 3 verical }
\r
181 writeln( 'PolinomiosEnVector' ); { titulo }
\r
182 gotoxy( 30, 4 ); { va a las coordenas de pantalla 25 horizontal, 4 verical }
\r
183 writeln( '~~~~~~~~~~~~~~~~~~' ); { subrayado del titulo }
\r
184 textcolor( LightCyan ); { establece el color para el texto a cian claro }
\r
185 gotoxy( 1, 7 ); { va a las coordenas de pantalla 1 horizontal, 7 verical }
\r
186 write(' El archivo ', tmp, ' no existe. Ingrese un nombre correcto');
\r
187 if tmp = DEFAUL_FILE_NAME { si es el nombre de archivo predeterminado }
\r
188 then { entonces, elije un mensaje apropiado }
\r
191 begin { si no es el predeterminado, muestra otro mensaje }
\r
193 write(' (ENTER = ', DEFAUL_FILE_NAME, '): ');
\r
195 readln(tmp); { vuelve a leer el nombre del archivo para ser verificado }
\r
196 if tmp = '' then tmp := DEFAUL_FILE_NAME; { asigna como nombre de archivo al predeterminado
\r
197 si no se escribio nada }
\r
198 end; { fin del loop de verificacion }
\r
199 ObtenerNombreArchivo := tmp; { asigna el nombre correcto al valor de salida de la funcion }
\r
200 end; { ObtenerNombreArchivo }
\r
202 {########################################################}
\r
204 function trans(c: char; e: Estado): Estado;
\r
205 { establece el estado en el que se encuentra la lectura }
\r
206 { c es el caracter que se leyo, e es el estado actual de la lectura }
\r
209 case e of { acciona segun es estado actual de la lectura }
\r
210 INICIO: { estado de inicio de la lectura }
\r
211 case c of { acciona segun el caracter leido }
\r
212 '-', '0'..'9': trans := COEF; { si es un numero (o negativo), empieza a leer el coeficiente }
\r
213 SPACE, TAB, CR, LF: trans := COEF_BUSCA; { si es un caracter tipo "espacio", busca el prox. coef. }
\r
214 else trans := ERROR; { si es otro, da ERROR }
\r
216 COEF_BUSCA: { estado de busqueda del primer ceoficiente del polinomio }
\r
217 case c of { acciona segun el caracter leido }
\r
218 '-', '0'..'9': trans := COEF; { si es un numero (o negativo), empieza a leer el coeficiente }
\r
219 SPACE, TAB, CR, LF: trans := COEF_BUSCA; { si es un caracter tupo "espacio", sigue buscando }
\r
220 ENDF: trans := FIN; { si es el caracter de fin de archivo, pasa al estado de tarea finalizada }
\r
221 else trans := ERROR; { si es otro, da ERROR }
\r
223 COEF: { estado de lectura del coeficiente del termino del polinomio (sin punto decimal) }
\r
224 case c of { acciona segun el caracter leido }
\r
225 '0'..'9': trans := COEF; { si es un numero sigue con el mismo estado }
\r
226 '.': trans := COEF_PUNTO; { si es punto cambia al estado COEF_PUNTO }
\r
227 SPACE, TAB: trans := COEF_FIN; { si es un espacio o un tabulador, finaliza la lectura del coeficiente }
\r
228 else trans := ERROR; { si es otra cosa, pasa a estado de error }
\r
230 COEF_PUNTO: { estado de lectura del coeficiente del termino del polinomio (con punto decimal) }
\r
231 case c of { acciona segun el caracter leido }
\r
232 '0'..'9': trans := COEF_PUNTO; { si es un numero sigue con el mismo estado }
\r
233 SPACE, TAB: trans := COEF_FIN; { si es un espacio o un tabulador, finaliza la lectura del coeficiente }
\r
234 else trans := ERROR; { si es otra cosa, pasa a estado de error }
\r
236 COEF_FIN: { estado de fin de la lectura del coeficiente del termino del polinomio }
\r
237 case c of { acciona segun el caracter leido }
\r
238 '0'..'9': trans := EXP; { si el caracter es un numero establece el estado en EXP (exponente) }
\r
239 SPACE, TAB: trans := EXP_BUSCA; { si es un espacio o tabulador, pasa a buscar el proximo exponente }
\r
240 else trans := ERROR; { si no es ninguno de los anteriores, el estado pasa a ERROR }
\r
242 EXP_BUSCA: { estado de busqueda del proximo exponente }
\r
243 case c of { acciona segun el caracter leido }
\r
244 '0'..'9': trans := EXP; { si el caracter es un numero, empieza a leer el exponente }
\r
245 SPACE, TAB: trans := EXP_BUSCA; { si es un espacio o tabulador, sigue buscando }
\r
246 else trans := ERROR; { si no es ninguno de los anteriores, el estado pasa a ERROR }
\r
248 EXP: { estado de lectura del exponente del termino actual del polinomio }
\r
249 case c of { acciona segun el caracter leido }
\r
250 '0'..'9': trans := EXP; { si es un digito, sigue en el mismo estado }
\r
251 CR: trans := EXP_FIN; { si es un ratorno de carro, finaliza el exponente
\r
252 (quiere decir que hubo un <ENTER>) }
\r
253 ENDF: trans := FIN; { si es el final del archivo, se indica que termino su tarea }
\r
254 else trans := ERROR; { si es otra cosa, devuelve ERROR }
\r
256 EXP_FIN: { estado de fin de la lectura del exponente del termino actual del polinomio }
\r
257 if c = LF then trans := EXP_FIN_BUSCA { debe ser un caracter de nueva linea (para completar el <ENTER>) }
\r
258 else trans := ERROR; { si no lo es, devuelve ERROR }
\r
259 EXP_FIN_BUSCA: { estado de fin de lectura de la nueva linea (luego de finalizar el exponente
\r
260 ahora decide si termino el polinomio o si sigue leyendo el proximo coeficiente }
\r
261 case c of { acciona segun el caracter leido }
\r
262 '-', '0'..'9': trans := COEF; { si es un digito (o negativo), pasa a leer en proximo coeficiente }
\r
263 CR: trans := POLI_FIN; { si es un ratorno de carro o nueva linea, finaliza el polinomio }
\r
264 else trans := ERROR; { si es otra cosa, devuelve ERROR }
\r
266 POLI_FIN: { estado de finalizacion del polinomio actual }
\r
267 if c = LF then trans := COEF_BUSCA { debe ser un caracter de nueva linea (para completar el <ENTER>),
\r
268 entonces pasa a buscar el primer coeficiente del nuevo polinomio }
\r
269 else trans := ERROR; { si no lo es, devuelve ERROR }
\r
270 FIN: { estado que adquiere cuando se finalizo la tarea }
\r
271 trans := FIN; { se queda en este estado avisando que termino su tarea }
\r
272 else { otro estado, no deberia ocurrir, salvo que se le pase a la funcion un estado de ERROR }
\r
273 trans := ERROR; { si es otro, da ERROR }
\r
277 {########################################################}
\r
279 function cargarVectores(var v1, v2: Vector): boolean;
\r
280 { Funcion que abre el archivo de texto con los datos, lo carga en el vector procesandolo debidamente a medida
\r
281 que lo lee y, al finalizar, cierra el archivo de texto.
\r
282 v1 es el primer vector a cargar
\r
283 v2 es el segundo vector a cargar
\r
284 devuelve true si la lectura fue hecha con exito, false si hubo un error }
\r
287 f: Text; { archivo de texto con los datos }
\r
288 c: char; { caracter que se extrae del archivo de texto }
\r
289 nombreArchivo: String; { nombre del archivo de datos }
\r
290 est: Estado; { Indicador del estado actual de la lectura }
\r
291 seguir: boolean; { indicador para saber si debe seguir con el proceso }
\r
292 i, { indice del vector del polinomio para ser inicializado }
\r
293 iExp, { valor temporal para almacenar al exponente }
\r
294 code, { almacena el resultado de la funcion val (no se usa porque los
\r
295 datos ya estan validados }
\r
296 poliN: integer; { numero del polinomio que se esta leyendo }
\r
297 rCoef: real; { valor temporal para almacenar al coeficiente }
\r
298 exponente, { string que representa al exponente leido }
\r
299 coeficiente: String; { string que representa al coeficiente leido }
\r
301 begin { cargarVectores }
\r
302 rCoef := 0.0; { inicializacion de variable }
\r
303 iExp := 0; { inicializacion de variable }
\r
304 coeficiente := ''; { inicializacion de variable }
\r
305 exponente := ''; { inicializacion de variable }
\r
306 est := INICIO; { empieza con el estado de INICIO }
\r
307 poliN := 1; { establece que se procesara el primer polinomio }
\r
308 inicializaVector(v1); { inicializacion del vector 1 (primer polinomio) }
\r
309 inicializaVector(v2); { inicializacion del vector 2 (segundo polinomio) }
\r
310 nombreArchivo := ObtenerNombreArchivo; { obtiene el nombre del archivo }
\r
311 assign(f, nombreArchivo); { asigna la variable al nombre del archivo }
\r
312 reset(f); { abre el archivo para leerlo desde el principio }
\r
313 seguir := true; { inicializa seguir e true para comenzar el bucle }
\r
314 while seguir do begin { continua mientras seguir sea true }
\r
315 read(f, c); { lee un caracter del archivo de texto }
\r
316 est := trans(c, est); { establece el nuevo estado de lectura }
\r
317 case est of { toma una desicion dependiendo del estado en que se encuentre }
\r
318 INICIO: ; { No hace nada, nunca toma este valor. Solo incica que empezo el proceso }
\r
319 COEF_BUSCA: ; { No hace nada, solo espera hasta que hayan datos significativos }
\r
320 COEF, COEF_PUNTO: { Si esta leyendo el coeficiente ... }
\r
321 coeficiente := coeficiente + c; { concatena el caracter a la representacion
\r
322 de texto del coeficiente }
\r
323 COEF_FIN: ; { Si termino de leer el coeficiente, no hace nada, la asignacion
\r
324 se realiza cuando termina de leer el exponente (es necesario
\r
325 para establecer el indice del vector }
\r
326 EXP_BUSCA: ; { No hace nada, solo espera hasta que hayan datos significativos }
\r
327 EXP: { Si esta leyendo el exponente ... }
\r
328 exponente := exponente + c; { concatena el caracter a la representacion
\r
329 de texto del exponente }
\r
330 EXP_FIN: { Si termino de leer el exponente, hace las asignaciones correspondientes }
\r
331 begin { convirtiendo las cadenas de texto en real e integer, segun el caso }
\r
332 val(coeficiente, rCoef, code); { convierte el coeficiente en real }
\r
333 val(exponente, iExp, code); { convierte el exponente en integer }
\r
334 if iExp < TAM { si el exponente es menor que el tama¤o maximo permitido ... }
\r
335 then if poliN = 1 then v1[iExp] := rCoef { asigna el valor correspondiente }
\r
336 else v2[iExp] := rCoef { al polinomio correspondiente }
\r
337 else est := ERROR; { si no es menor, pone el estado en ERROR }
\r
338 coeficiente := ''; { una vez asignados, vacia los valores del coeficiente y el }
\r
339 exponente := ''; { exponente para poder realizar las lecturas de los proximos }
\r
341 EXP_FIN_BUSCA: ; { No hace nada, solo espera hasta que hayan datos significativos }
\r
342 POLI_FIN: { Si termino la lectura de un polinomio ... }
\r
343 if poliN = 1 then poliN := 2 { si se leyo el 1er polinomio, se indica que se leera el 2do }
\r
344 else est := FIN; { si no (ya se leyo el segundo), pone el estado en FIN }
\r
345 FIN: { Si se finalizaron las tareas ... }
\r
347 cargarVectores := true; { en principio se establece que la lectura se hizo con exito ) }
\r
348 seguir := false; { poner seguir en false para que se termine el bucle }
\r
349 { este codigo es similar al de EXP_FIN, se hacen las asignaciones por el caso en que el fin
\r
350 del archivo esta pegado al fin del ultimo exponente, en cuyo caso no pasa por el estado
\r
351 de EXP_FIN (y, por ende, no se pueden hacer las asignaciones correspondientes }
\r
352 val(coeficiente, rCoef, code); { convierte el coeficiente en real }
\r
353 val(exponente, iExp, code); { convierte el exponente en integer }
\r
354 if iExp < TAM { si el exponente es menor que el tama¤o maximo permitido ... }
\r
356 then v2[iExp] := rCoef { si es el 2do polinomio, asigna el valor correspondiente }
\r
357 else cargarVectores := false { si es el primero, no se hizo bien la lectura }
\r
358 else cargarVectores := false; { si no es menor, no se hizo bien la lectura }
\r
360 ERROR: { Si hubo un error ... }
\r
362 cargarVectores := false; { Se devuelve false (hubo un ERROR, no se leyeron bien los vectores) }
\r
363 seguir := false; { seguir se pone en false para que termine el bucle }
\r
367 close(f); { se cierra el archivo de lectura de datos }
\r
368 end; { cargarVectores }
\r
370 {########################################################}
\r
372 procedure suma(v1, v2: Vector; var vr: Vector);
\r
373 { procedimiento que suma dos polinomios.
\r
374 v1: vector que contiene el primer polinomio a sumar
\r
375 v2: vector que contiene el segundo polinomio a sumar
\r
376 vr: vector donde se almacenara el resultado de la suma }
\r
379 i: integer; { indice para usar en el ciclo for }
\r
382 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
383 for i := 0 to TAM - 1 do { recorre el vector (de tama¤o maximo TAM) }
\r
384 vr[i] := v1[i] + v2[i]; { suma los coeficientes de los terminos con igual exponente }
\r
387 {########################################################}
\r
389 procedure resta(v1, v2: Vector; var vr: Vector);
\r
390 { procedimiento que resta dos polinomios.
\r
391 v1: vector que contiene el primer polinomio
\r
392 v2: vector que contiene el polinomio para restarle al primero
\r
393 vr: vector donde se almacenara el resultado de la resta }
\r
396 i: integer; { indice para usar en el ciclo for }
\r
399 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
400 for i := 0 to TAM - 1 do { recorre el vector (de tama¤o maximo TAM) }
\r
401 vr[i] := v1[i] - v2[i]; { resta los coeficientes de los terminos con igual exponente }
\r
404 {########################################################}
\r
406 procedure producto(v1, v2: Vector; var vr: Vector);
\r
407 { procedimiento que multiplica dos polinomios.
\r
408 v1: vector que contiene el primer polinomio a multiplicar
\r
409 v2: vector que contiene el segundo polinomio a multiplicar
\r
410 vr: vector donde se almacenara el resultado de la multiplicacion }
\r
413 i, j: integer; { indices para usar en los ciclos for }
\r
416 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
417 for i := 0 to TAM - 1 do { recorre el 1er vector (de tama¤o maximo TAM) }
\r
418 for j := 0 to TAM - 1 do { recorre el 2do vector (de tama¤o maximo TAM) }
\r
419 vr[i+j] := vr[i+j] + (v1[i] * v2[j]);
\r
420 { multiplica los coeficientes de los terminos y lo almacena en la posicion del exponente }
\r
421 { igual a la suma de los exponentes de v1 y v2, sumando el valor previo de dicha posicion }
\r
424 {########################################################}
\r
426 function division(v1, v2: Vector; var vr, vResto: Vector): boolean;
\r
427 { procedimiento que divide dos polinomios.
\r
428 v1: vector que contiene el polinomio denominador
\r
429 v2: vector que contiene el polinomio divisor
\r
430 vr: vector donde se almacenara el resultado de la division
\r
431 vResto: vector donde se almacenara el resto de la division
\r
432 devuelve true si el segundo polinomio no es 0 y se efectua la division y
\r
433 devuelve false si segundo polinomio es 0 y no se puede efectuar la division }
\r
436 i, j: integer; { indices para usar en los ciclos for }
\r
437 vRTmp, { vector auxuliares para almacenar el termino actual del resultado }
\r
438 vTmp: Vector; { vector auxuliares para almacenar el polinomio que es la multiplicacion del
\r
439 termino actual del resultado por el divisor }
\r
442 inicializaVector(vr); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
443 inicializaVector(vResto); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
444 inicializaVector(vTmp); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
445 inicializaVector(vRTmp); { inicializa al vector resultado en 0 para evitar que quede "basura" }
\r
446 for i := TAM - 1 downto 0 do { recorre el 1er vector (de tama¤o maximo TAM) de atras para adelante }
\r
447 if v1[i] <> 0 then break;
\r
448 { busca empezando por el indice (exponete) mas alto el primer coeficiente no nulo }
\r
449 { si lo encuentra sale del for dejando al valor de i como el de dicho inidice }
\r
450 for j := TAM - 1 downto 0 do { recorre el 2do vector (de tama¤o maximo TAM) de atras para adelante }
\r
451 if v2[j] <> 0 then break;
\r
452 { busca empezando por el indice (exponete) mas alto el primer coeficiente no nulo }
\r
453 { si lo encuentra sale del for dejando al valor de j como el de dicho inidice }
\r
454 if (j = 0) and (v2[j] = 0) { si el no se encontro ningun coeficiente no nulo, entonces }
\r
455 then { el polinomio 2 es nulo y no se puede efectuar la division }
\r
456 begin { se devuelve false y se quedan los vectores resultado en 0 }
\r
457 division := false; { devuelve false }
\r
458 exit; { sale del procedimiento }
\r
460 while i >= j do { si el primer exponente es mayor o igual que el segundo empieza a dividir }
\r
462 vr[i-j] := v1[i] / v2[j]; { almacena el resultado de la division entre los coeficientes en
\r
463 la posicion de la resta de ambos }
\r
464 vRTmp[i-j] := vr[i-j]; { almacena ese resultado en un polinomio temporal cuyo unico termio
\r
465 no nulo es el del exponente i-j, para luego multiplicarlo }
\r
466 producto(vRTmp, v2, vTmp);{ multiplica este polinomio por el segundo almacenado el resultado
\r
467 en otro temporal, para luego hacer la resta }
\r
468 resta(v1, vTmp, v1); { resta al primer polinomio, v1, (en su estado actual, no el original)
\r
469 el temporal vTmp y lo almacena en v1, para poder volver a operarlo de
\r
471 vRTmp[i-j] := 0; { resetea el termino del temporal vRTmp que se asigno para los calculos }
\r
472 for i := i downto 0 do { recorre el vector v1 (de tama¤o maximo TAM) de atras para adelante }
\r
473 if v1[i] <> 0 then break;
\r
474 { busca empezando por el indice (exponete) i el primer coeficiente no nulo
\r
475 si lo encuentra sale del for dejando al valor de i como el de dicho inidice }
\r
477 vResto := v1; { asigna el vector v1 (que ya no se procesara mas al resto }
\r
478 division := true; { devuelve true indicando que se finalizo con exito }
\r
481 {########################################################}
\r
483 procedure mensajeSalida; { muestra un mensaje en la salida del programa }
\r
486 writeln; { linea en blanco }
\r
487 NormVideo; { reestablece los colores a los valores por defecto }
\r
488 clrscr; { borra la pantalla }
\r
489 writeln; { linea en blanco }
\r
490 textcolor(white); { cambia el color del texto }
\r
491 writeln(' PolinomiosEnVector versi¢n ', VERSION); { mensaje con version del programa }
\r
492 NormVideo; { reestablece los colores a los valores por defecto }
\r
493 writeln(' Desarrollado por: JavierGrijalba'); { mensaje con los integrantes del grupo }
\r
494 writeln(' Leandro Lucarella');
\r
495 writeln(' Erasmo Troncovich');
\r
496 writeln(' Diego Wojmicki');
\r
497 writeln(' para la Facultad de Ingenier¡a de la Universidad de Buenos Aires.');
\r
498 writeln(' Consultas y/o sugerencias a:');
\r
500 textcolor(LightMagenta); { cambia el color del texto }
\r
501 write(' lluca@cnba.uba.ar');
\r
502 NormVideo; { reestablece los colores a los valores por defecto }
\r
504 textcolor(LightMagenta); { cambia el color del texto }
\r
505 writeln('grijalba@cvtci.com.ar');
\r
506 NormVideo; { reestablece los colores a los valores por defecto }
\r
508 writeln(' (c) 1999 - Todos los derechos reservados.');
\r
513 {########################################################}
\r
517 i: integer; { variable auxiliar }
\r
518 v1, v2, vResult, vResto: Vector; { vectores para hacer las operaciones }
\r
519 seguir, { indicador para saber si sigue corriendo el programa }
\r
520 noNulo, { indicador para saber si en la division el divisor es nulo }
\r
521 continua: boolean; { indicador para saber si se leyeron bien los polinomios }
\r
522 tecla: char; { entrada de teclado del usuario para elegir una opcion }
\r
524 begin { programa principal }
\r
525 textbackground( Blue ); { establece el color para el fondo a azul }
\r
526 continua := cargarVectores(v1, v2); { carga los vectores del archivo de datos }
\r
527 if continua then { si se leyeron bien ... }
\r
529 seguir := true; { inicializa la variable en true para que entre en el ciclo while }
\r
530 while seguir do { mientras el usuario no salga del programa }
\r
532 clrscr; { borra la pantalla }
\r
533 textcolor(Yellow); { establece el color para el texto a amarillo }
\r
534 gotoxy( 30, 3 ); { va a las coordenas de pantalla 25 horizontal, 3 verical }
\r
535 writeln( 'PolinomiosEnVector' ); { titulo }
\r
536 gotoxy( 30, 4 ); { va a las coordenas de pantalla 25 horizontal, 4 verical }
\r
537 writeln( '~~~~~~~~~~~~~~~~~~' ); { subrayado del titulo }
\r
538 textcolor(LightCyan); { establece el color para el texto a cian claro }
\r
539 gotoxy( 1, 7 ); { va a las coordenas de pantalla 1 horizontal, 7 verical }
\r
540 writeln( ' Elija que desea hacer:' ); { mensaje }
\r
541 writeln( ' ----- --- ----- ------' ); { mensaje }
\r
542 textcolor(LightGray); { establece el color para el texto a gris claro }
\r
543 writeln; { mensaje con las opciones ... }
\r
545 writeln( ' 1.- Ver el polinomio 1.' );
\r
546 writeln( ' 2.- Ver el polinomio 2.' );
\r
547 writeln( ' 3.- Sumar los polinomios.' );
\r
548 writeln( ' 4.- Restar el polinomio 2 al polinomio 1 (poli1 - poli2).' );
\r
549 writeln( ' 5.- Restar el polinomio 1 al polinomio 2 (poli2 - poli1).' );
\r
550 writeln( ' 6.- Multiplicar los polinomios.' );
\r
551 writeln( ' 7.- Polinomio 1 dividido polinomio 2 (poli1 / poli2).' );
\r
552 writeln( ' 8.- Polinomio 2 dividido polinomio 1 (poli2 / poli1).' );
\r
553 writeln( ' 0.- Salir.' );
\r
554 gotoxy(1, 23); { va a las coordenas de pantalla 1 horizontal, 23 verical }
\r
555 textcolor(White ); { establece el color para el texto a blanco }
\r
556 write(' Ingrese su opci¢n: ');
\r
557 textcolor(Yellow); { establece el color para el texto a amarillo }
\r
558 tecla := readkey; { lee una tecla del usuario indicando la opcion que elijio }
\r
559 while ((tecla < '1') or (tecla > '8')) and (tecla <> '0') do { mientras sea una tecla no admitida }
\r
561 textcolor(White); { establece el color para el texto a blanco }
\r
562 gotoxy( 1, 23 ); { va a las coordenas de pantalla 1 horizontal, 7 verical }
\r
563 write(' Ingrese su opci¢n ("1" a "8" o "0"): ' );
\r
564 textcolor(Yellow); { establece el color para el texto a amarillo }
\r
565 tecla := readkey; { lee una tecla del usuario indicando la opcion que elijio }
\r
567 if tecla = '0' then { si la opcion fue salir del programa ... }
\r
569 mensajeSalida; { presenta un mensaje de salida }
\r
570 exit; { sale del programa }
\r
572 clrscr; { borra la pantalla }
\r
573 textcolor(Yellow); { establece el color para el texto a amarillo }
\r
574 gotoxy( 30, 3 ); { va a las coordenas de pantalla 25 horizontal, 3 verical }
\r
575 writeln( 'PolinomiosEnVector' ); { titulo }
\r
576 gotoxy( 30, 4 ); { va a las coordenas de pantalla 25 horizontal, 4 verical }
\r
577 writeln( '~~~~~~~~~~~~~~~~~~' ); { subrayado del titulo }
\r
578 textcolor(LightCyan); { establece el color para el texto a cian claro }
\r
579 gotoxy(1, 7); { va a las coordenas de pantalla 1 horizontal, 7 verical }
\r
581 '1': muestraVector(v1, ' Polinomio 1 = ');
\r
582 '2': muestraVector(v2, ' Polinomio 2 = ');
\r
584 suma(v1, v2, vResult);
\r
585 muestraVector(vResult, ' Polinomio 1 + Polinomio 2 = ');
\r
588 resta(v1, v2, vResult);
\r
589 muestraVector(vResult, ' Polinomio 1 - Polinomio 2 = ');
\r
592 resta(v2, v1, vResult);
\r
593 muestraVector(vResult, ' Polinomio 2 - Polinomio 1 = ');
\r
596 producto(v1, v2, vResult);
\r
597 muestraVector(vResult, ' Polinomio 1 * Polinomio 2 = ');
\r
600 noNulo := division(v1, v2, vResult, vResto);
\r
604 muestraVector(vResult, ' Polinomio 1 / Polinomio 2 = ');
\r
605 muestraVector(vResto, ' Resto = ');
\r
607 else writeln(' El polinomio 2 es nulo, por lo tanto no se puede efectuar la division.');
\r
610 noNulo := division(v2, v1, vResult, vResto);
\r
614 muestraVector(vResult, 'Polinomio 2 / Polinomio 1 = ');
\r
615 muestraVector(vResto, 'Resto = ');
\r
617 else writeln(' El polinomio 1 es nulo, por lo tanto no se puede efectuar la division.');
\r
619 '0': ; { no hace nada, nunca deberia entrar en este case }
\r
621 writeln; { los siguientes mensajes son para que el usuario pueda ver los datos y luego }
\r
622 writeln; { presione una tecla para continuar }
\r
623 textcolor(white); { pone el color del texto en blanco }
\r
624 writeln(' Presione una tecla para continuar ...');
\r
628 else { si los vectores no se leyeron bien ... }
\r
629 begin { presenta un mensaje de error }
\r
630 writeln('ERROR: No se pudieron cargar los datos. Revise que el formato del archivo');
\r
631 writeln(' sea correcto y que no este siendo usado por otro programa.');
\r
633 end. { procedure menuGenerar }