[ Foro de Pascal ]

Ejercicios varios

27-Apr-2011 13:35
Toms Poveda Retamosa
3 Respuestas

Buenas Nacho, me pongo en contacto contigo para que, cuando tengas algo de tiempo que sé que no dispones de mucho, si puedes me corrigieses unos ejercicios programados en Pascal:

1) En primer lugar, he intentado llevar a cabo el ejercicio propuesto de la página 44 del libro CUPAS, el cual dice: Para los mas osados (y que conozcan el problema),crea un programa de resolución de sistemas de ecuaciones por Gauss. Bueno, estoy cursando 2º de Bachillerato y por tanto, conocía como resolver estos sistemas por eso me decidí hacerlo. Le adjunto el programa el cual funciona correctamente, su funcionamiento es sencillo, introduces los valores de la matriz y el programa te resuelve la ecuación (incluso gráficamente), eso sí, por el momento solo resuelve sistemas compatibles determinados y sistemas incompatibles. Los sistemas incompatibles los detecta pero no los resuelve correctamente, ya algún día de éstos lo solucionaré.

program project1;

var
 m1: array[1..3,1..4] of real; {matriz 3x4 = A}
 x, y, z, val1, val2, val3, val4, val5, val6, val7, val8, val9, val10, val11, val12, val13, val14, val15, total1, total2, total3: real;
 tecla: char;

begin
 writeln('RESOLUCION DE SISTEMAS LINEALES POR GAUSS - TOMAS POVEDA RETAMOSA');
 writeln('');
 writeln('Introduce los datos de una matriz A con los siguientes valores: ');
 writeln('');
 writeln('|a11 a12 a13 a14|');
 writeln('|a21 a22 a23 a24|');
 writeln('|a31 a32 a33 a34|');
 writeln('');
 writeln('Introduce los datos de la primera matriz A: ');
 writeln('');
 write('Introduce el elemento a11 de la matriz A: ');  {Comenzamos a introducir los valores de la matriz A}
 readln(m1[1,1]);
 write('Introduce el elemento a12 de la matriz A: ');
 readln(m1[1,2]);
 write('Introduce el elemento a13 de la matriz A: ');
 readln(m1[1,3]);
 write('Introduce el elemento a14 de la matriz A: ');
 readln(m1[1,4]);
 write('Introduce el elemento a21 de la matriz A: ');
 readln(m1[2,1]);
 write('Introduce el elemento a22 de la matriz A: ');
 readln(m1[2,2]);
 write('Introduce el elemento a23 de la matriz A: ');
 readln(m1[2,3]);
 write('Introduce el elemento a24 de la matriz A: ');
 readln(m1[2,4]);
 write('Introduce el elemento a31 de la matriz A: ');
 readln(m1[3,1]);
 write('Introduce el elemento a32 de la matriz A: ');
 readln(m1[3,2]);
 write('Introduce el elemento a33 de la matriz A: ');
 readln(m1[3,3]);
 write('Introduce el elemento a34 de la matriz A: ');
 readln(m1[3,4]);
 writeln('');
 writeln('La matriz A introducida es: ');                   {Mostramos la matriz introducida como aclaración}
 writeln('');
 writeln('|     ',m1[1,1]:2:1,'     ',m1[1,2]:2:1,'     ',m1[1,3]:2:1,'     ',m1[1,4]:2:1,'     |');
 writeln('|     ',m1[2,1]:2:1,'     ',m1[2,2]:2:1,'     ',m1[2,3]:2:1,'     ',m1[2,4]:2:1,'     |');
 writeln('|     ',m1[3,1]:2:1,'     ',m1[3,2]:2:1,'     ',m1[3,3]:2:1,'     ',m1[3,4]:2:1,'     |');
 writeln('');                                               {Calculamos x e y para poder hacer 0 en la primera columna de la segunda y tercea fila}
 x := -(m1[2,1])/(m1[1,1]);
 y := -(m1[3,1])/(m1[1,1]);
 writeln('');                                               {Operamos}
 writeln('Operamos para conseguir 0 en la primera columna de la segunda y tercera fila:    F1x + F2   |    F2y + F2');
 writeln('');
 writeln('|      ',m1[1,1]:2:1,'     ',m1[1,2]:2:1,'     ',m1[1,3]:2:1,'     ',m1[1,4]:2:1,'     |');
 writeln('|      ',((m1[1,1]*x) + m1[2,1]):2:1,'     ',((m1[1,2]*x) + m1[2,2]):2:2,'     ',((m1[1,3]*x) + m1[2,3]):2:1,'     ',((m1[1,4]*x) + m1[2,4]):2:1,'      |');
 writeln('|      ',((m1[1,1]*y) + m1[3,1]):2:1,'     ',((m1[1,2]*y) + m1[3,2]):2:2,'     ',((m1[1,3]*y) + m1[3,3]):2:1,'     ',((m1[1,4]*y) + m1[3,4]):2:1,'      |');
 z := -((m1[1,2]*y) + m1[3,2])/((m1[1,2]*x) + m1[2,2]);     {Calculamos z para conseguir hacer 0 en la segunda columna de la tercera fila}
 writeln('');                                               {Operamos una vez más}
 writeln('Operamos para conseguir 0 en la segunda columna de la tercera fila: F2z + F3');
 writeln('');
 writeln('|      ',m1[1,1]:2:1,'     ',m1[1,2]:2:1,'     ',m1[1,3]:2:1,'     ',m1[1,4]:2:1,'     |');
 writeln('|      ',((m1[1,1]*x) + m1[2,1]):2:1,'     ',((m1[1,2]*x) + m1[2,2]):2:1,'     ',((m1[1,3]*x) + m1[2,3]):2:1,'     ',((m1[1,4]*x) + m1[2,4]):2:1,'      |');
 writeln('|      ',((m1[1,1]*x) + m1[2,1]):2:1,'     ',(((m1[1,2]*x) + m1[2,2])*z) + ((m1[1,2]*y) + m1[3,2]):2:1,'     ',(((m1[1,3]*x) + m1[2,3])*z) + ((m1[1,3]*y) + m1[3,3]):2:1,'     ',(((m1[1,4]*x) + m1[2,4])*z) + ((m1[1,4]*y) + m1[3,4]):2:1,'      |');
 writeln('');
 if (((m1[1,1]*x) + m1[2,1])=0) and  ((((m1[1,2]*x) + m1[2,2])*z) + ((m1[1,2]*y) + m1[3,2])=0) and  ((((m1[1,3]*x) + m1[2,3])*z) + ((m1[1,3]*y) + m1[3,3]) = 0) and ((((m1[1,4]*x) + m1[2,4])*z) + ((m1[1,4]*y) + m1[3,4])0) then
   begin
   writeln('La ecuacion se nos queda de la siguiente manera: ');
   writeln('');
   writeln('',m1[1,1]:2:1,'x + ',m1[1,2]:2:1,'y + ',m1[1,3]:2:1,'z = ',m1[1,4]:2:1,'');
   writeln('',((m1[1,1]*x) + m1[2,1]):2:1,'x + ',((m1[1,2]*x) + m1[2,2]):2:1,'y + ',((m1[1,3]*x) + m1[2,3]):2:1,'z = ',((m1[1,4]*x) + m1[2,4]):2:1,'');
   writeln('',((m1[1,1]*x) + m1[2,1]):2:1,'x + ',(((m1[1,2]*x) + m1[2,2])*z) + ((m1[1,2]*y) + m1[3,2]):2:1,'y + ',(((m1[1,3]*x) + m1[2,3])*z) + ((m1[1,3]*y) + m1[3,3]):2:1,'z = ',(((m1[1,4]*x) + m1[2,4])*z) + ((m1[1,4]*y) + m1[3,4]):2:1,'');
   writeln('');
   writeln('El sistema es incompatible');
   writeln('');
   writeln('');
   writeln('Pulsa una tecla para finalizar el programa.');
   readln;
   end
 else if (((m1[1,1]*x) + m1[2,1])=0) and  ((((m1[1,2]*x) + m1[2,2])*z) + ((m1[1,2]*y) + m1[3,2])=0) and  ((((m1[1,3]*x) + m1[2,3])*z) + ((m1[1,3]*y) + m1[3,3]) = 0) and ((((m1[1,4]*x) + m1[2,4])*z) + ((m1[1,4]*y) + m1[3,4]) = 0) then
   begin
   writeln('La ecuacion se nos queda de la siguiente manera: ');
   writeln('');
   writeln('',m1[1,1]:2:1,'x + ',m1[1,2]:2:1,'y + ',m1[1,3]:2:1,'z = ',m1[1,4]:2:1,'');
   writeln('',((m1[1,1]*x) + m1[2,1]):2:1,'x + ',((m1[1,2]*x) + m1[2,2]):2:1,'y + ',((m1[1,3]*x) + m1[2,3]):2:1,'z = ',((m1[1,4]*x) + m1[2,4]):2:1,'');
   writeln('',((m1[1,1]*x) + m1[2,1]):2:1,'x + ',(((m1[1,2]*x) + m1[2,2])*z) + ((m1[1,2]*y) + m1[3,2]):2:1,'y + ',(((m1[1,3]*x) + m1[2,3])*z) + ((m1[1,3]*y) + m1[3,3]):2:1,'z = ',(((m1[1,4]*x) + m1[2,4])*z) + ((m1[1,4]*y) + m1[3,4]):2:1,'');
   writeln('');
   writeln('El sistema es compatible indeterminado.');
   writeln('');
   writeln('Al ser el sistema compatible indeterminado, z = $');
   writeln('');
   writeln('Despejamos y sustituimos z para sacar y');
   writeln('');
   val10 := ((m1[1,2]*x) + m1[2,2]);
   val11 := ((m1[1,3]*x) + m1[2,3]);
   val12 := ((m1[1,4]*x) + m1[2,4]);
   writeln('y = /',val12:2:1,' + ',-(val11):2:1,'$) / ',val10:2:1,'');
   writeln('');
   writeln('Ahora sustitumos z e y para calcular x');
   writeln('');
   val13 := m1[1,4];
   writeln('x = ',val13:2:1,' + ',(val11):2:1,'$ + ',-(m1[1,2]):2:1,' * (',val12:2:1,' + ',-(val11):2:1,'$ / ',val10:2:1,')');
   writeln('');
   writeln('LA SOLUCION DEL SISTEMA ES: ');
   writeln('');
   writeln('-----------------------------------------------------------------------------');
   writeln('x = ',val13:2:1,' + ',(val11):2:1,'$ + ',-(m1[1,2]):2:1,' * (',val12:2:1,' + ',-(val11):2:1,'$ / ',val10:2:1,')');
   writeln('y = (',val12:2:1,' + ',-(val11):2:1,'$) / ',val10:2:1,'');
   writeln('z = $');
   write('-------------------------------------------------------------------------------');
   writeln('');
   writeln('');
   writeln('Pulsa una tecla para finalizar el programa.');
   readln;
   end
 else
 begin
 writeln('');                                                {Mostramos como se queda la ecuación}
 writeln('La ecuacion se nos queda de la siguiente manera: ');
 writeln('');
 writeln('',m1[1,1]:2:1,'x + ',m1[1,2]:2:1,'y + ',m1[1,3]:2:1,'z = ',m1[1,4]:2:1,'');
 writeln('',((m1[1,1]*x) + m1[2,1]):2:1,'x + ',((m1[1,2]*x) + m1[2,2]):2:1,'y + ',((m1[1,3]*x) + m1[2,3]):2:1,'z = ',((m1[1,4]*x) + m1[2,4]):2:1,'');
 writeln('',((m1[1,1]*x) + m1[2,1]):2:1,'x + ',(((m1[1,2]*x) + m1[2,2])*z) + ((m1[1,2]*y) + m1[3,2]):2:1,'y + ',(((m1[1,3]*x) + m1[2,3])*z) + ((m1[1,3]*y) + m1[3,3]):2:1,'z = ',(((m1[1,4]*x) + m1[2,4])*z) + ((m1[1,4]*y) + m1[3,4]):2:1,'');
 writeln('');                                                {Para simplificar camos a los valores a operar una serie de variables}
 val1 := (((m1[1,4]*x) + m1[2,4])*z) + ((m1[1,4]*y) + m1[3,4]);
 val2 := (((m1[1,3]*x) + m1[2,3])*z) + ((m1[1,3]*y) + m1[3,3]);
 total1 := val1 / val2;
 writeln('');
 writeln('El sistema es compatible determinado.');                                       {Despejamos z}
 writeln('');
 writeln('Despejamos z.');
 writeln('');
 writeln('',m1[1,1]:2:1,'x + ',m1[1,2]:2:1,'y + ',m1[1,3]:2:1,'z = ',m1[1,4]:2:1,'');
 writeln('',((m1[1,1]*x) + m1[2,1]):2:1,'x + ',((m1[1,2]*x) + m1[2,2]):2:1,'y + ',((m1[1,3]*x) + m1[2,3]):2:1,'z = ',((m1[1,4]*x) + m1[2,4]):2:1,'');
 writeln('z = ',total1:2:1,'');
 writeln('');                                                 {Sustitumos z y operamos para conseguir y}
 writeln('Sustituimos z');
 writeln('');
 writeln('',m1[1,1]:2:1,'x + ',m1[1,2]:2:1,'y + ',m1[1,3]:2:1,'z = ',m1[1,4]:2:1,'');
 writeln('',((m1[1,1]*x) + m1[2,1]):2:1,'x + ',((m1[1,2]*x) + m1[2,2]):2:1,'y + ',((m1[1,3]*x) + m1[2,3])*total1:2:1,' = ',((m1[1,4]*x) + m1[2,4]):2:1,'');
 writeln('');
 writeln('Despejamos y');
 val3 := ((m1[1,4]*x) + m1[2,4]);
 val4 := -(((m1[1,3]*x) + m1[2,3])*total1);
 val5 := ((m1[1,2]*x) + m1[2,2]);
 total2 := (val3 + val4) / val5;
 writeln('');
 writeln('y = ',total2:2:1,'');                               {Mostramos como se nos queda la ecuación una vez hemos despejado z e y}
 writeln('');
 writeln('Se nos queda de la siguiente manera: ');
 writeln('');
 writeln('',m1[1,1]:2:1,'x + ',m1[1,2]:2:1,'y + ',m1[1,3]:2:1,'z = ',m1[1,4]:2:1,'');
 writeln('y = ',total2:2:1,'');
 writeln('z = ',total1:2:1,'');                                {Sustitumos z e y para calcular x}
 writeln('');
 writeln('Sustituimos y se nos queda asi: ');
 writeln('');
 writeln('',m1[1,1]:2:1,'x + ',m1[1,2]*total2:2:1,' + ',m1[1,3]*total1:2:1,' = ',m1[1,4]:2:1,'');
 writeln('y = ',total2:2:1,'');
 writeln('z = ',total1:2:1,'');
 writeln('');
 writeln('Despejamos x');                                      {Despejamos x}
 writeln('');
 val6 := m1[1,4];
 val7 := -(m1[1,3]*total1);
 val8 := -(m1[1,2]*total2);
 val9 := m1[1,1];
 total3 := (val6 + val7 + val8) / val9;
 writeln('x = ',total3:2:1,'');                                {Mostramos la solución}
 writeln('');
 writeln('LA SOLUCION DEL SISTEMA ES: ');
 writeln('');
 writeln('---------');
 writeln('x = ',total3:2:1,' |');
 writeln('y = ',total2:2:1,' |');
 writeln('z = ',total1:2:1,' |');
 write('---------');
 writeln('');
 writeln('');
 writeln('Pulsa una tecla para finalizar el programa.');
 readln;
 end;

  {TOMÁS POVEDA RETAMOSA}      



2) Me gustaría que me explicaras como resolver los dos últimos problemas de la página 60 ya que no entiendo el problema.

3) Por último, me gustaría también que me corrigieras el ejercicio 2  de la página 63, concretamente, el que te pide crear una función que muestre la primera letra y la letra siguiente a los espacios introducidos. He realizado el ejercicio, y funciona correctamente pero no he utilizado parámetros por referencia, por lo tanto, el ejercicio no está correcta ya que el enunciado te pide que utilices parámetros por referencia.

Porgramado en Pascal con Lazarus (Windows 7)

{Ejercicio propuesto: Crear una función "iniciales", que reciba una cadena como
"Nacho Cabanes" y devuelva las letras N y C (primera letra, y letra situada
tras el primer espacio), usando parámetros por referencia}

program project1;   {Nombre del programa}

var                     {variables globales}
  texto: string;

function intercambio(texto: string):string;        {declaramos la funcion}
var
 i, cont: integer;                                 {variables locales de la funcion}
begin
cont := length(texto); {la variable cont tiene un valor igual a la longitud del texto introducido}
for i:=0 to cont do    {for donde i se repite desde 0 hasta el valor de cont, es decir, recorre todo el texto de principio a fin letra por letra}
 begin
 if texto[i] = ' ' then  {cuando encontremos un espcio}
   begin
   writeln('La letra despues del espacio es ',texto[i+1],'.');  {escribimos la letra siguiente}
   end;
 end;
end;

begin
writeln('Introduce un texto, por ejemplo, Tomas Poveda: ');   {pedimos introducir el texto}
readln(texto);
writeln('');
writeln('La primera letra del texto introducido es ',texto[1],'.');   {mostramos la primrea letra del texto}
intercambio(texto);
writeln('');
writeln('Pusla INTRO para finalizar el programa.');                    {pedimos al usuario que pulse INTRO para finalizar el programa.}  


Muchísimas gracias de antemano y enhorabuena por tus grandísimos cursos. :-)


27-Apr-2011 14:31
Nacho Cabanes (+84)

El ejercicio de Gauss tiene buena pinta, pero se puede hacer de forma mucho más compacta. Por ejemplo, para leer los nueve valores no necesitas 18 órdenes (9 write + 9 read), sino que lo puede hacer con un doble for.

Los de la página 60... no sé a cuales te refieres, ten en cuenta que hay varias versiones del curso. Mejor incluye el enunciado o un resumen.

En cuanto al último, el truco está en formar una nueva cadena en la que vayas guardando las iniciales una a una, en vez de escribirlas en pantalla. Algo como

iniciales := '';
iniciales := iniciales + texto[1];
for i := 2 to length(texto)-1 do
 if texto[i] = ' ' then
   iniciales := iniciales + texto[i+1];

Mucho cuidado con esto que haces:

cont := length(texto);
for i:=0 to cont do [...]

Por dos motivos:

- En Pascal, la posición 0 no es parte del contenido de la cadena. Por el contrario, en muchos compiladores almacena la longitud de la cadena.

- Si tu "for" llega hasta la longitud de la cadena, y miras la posición i+1, te estás saliendo de la cadena, y eso será un error en tiempo de ejecución, que abortará el programa (quizá tengas ¿suerte? y el compilador reserve espacio de más y no se interrumpa... pero como mínimo tendrás resultados incorrectos).


01-May-2011 12:55
Toms Poveda Retamosa

Ok. Muchas gracias repasaré lo del último ejercicio y los ejercicios de la página 60 son estos:

Ejercicio propuesto: Crea un programa que sume dos números "grandes", de
30 cifras. Esos números deberemos leerlos como "string" y sumarlos "letra a
letra". Para ello, deberás crear una función "sumar", que reciba como
parámetros dos "strings", y que devuelva su resultado en un nuevo "string".

Ejercicio propuesto: Crea un programa que multiplique dos números "grandes",
de entre 30 y 100 cifras, por ejemplo. Para esos números no nos basta con
los tipos numéricos que incorpora Pascal, sino que deberemos leerlos como
"string" y pensar cómo multiplicar dos strings: ir cifra por cifra en cada uno
de los factores y tener en cuenta lo que "me llevo"...


01-May-2011 13:13
Nacho Cabanes (+84)

Para sumar dos números grandes, piensa cómo se suma "a mano", e imita lo mismo desde Pascal:

5 + 7 = 12 (es decir, 2 y me llevo 1 a la siguiente posición)

34 + 78 =
Ultima cifra: 8 + 4 = 2 y me llevo 1
Penúltima cifra: 3 + 7 + 1 (que me llevaba) = 1 y me llevo 1
Antepenúltima cifra: 1 (que me he llevado)

luego el resultado es 112

Eso mismo podrías hacer tú desde Pascal, usando cadenas de texto (string): tomas cada letra, ves su valor numérico, la sumas con la correspondiente de la otra cadena de texto, y memorizas lo que "te llevas".

En cuanto seas capaz de sumar dos números de 30 cifras usando "string" y analizando letra a letra, pasar a la multiplicación ya no es difícil.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)