[ Foro de Pascal ]

Equivalencia en pascal ???

27-May-2012 17:58
oscar gomez
14 Respuestas

Cordial saludo a todos, en especial al profesor Nacho Cabanes por permitirnos este espacio y altruista oportunidad.

profesor y compañeros, queria pedir su opinion y su ayuda en cuanto una duda que tengo a una equivalencia para pascal:

en c++ una definicion como:

 char palabra[2][100]; es definir para mi proposito porj, dos cadenas  de caracteres de 100 caracteres cada palabra ( es decir dos palabras de 100 caracteres cada una)


mi idea es porejemplo si tengo dos palabras y quiero recorrerlas mediante un for como podria hacer esto en pascal,?, pues en c++, teniendo la definicion que mencionaba ( char palabra[2][100]; ) podria creo hacer algo como:

 for(i=0;i<2;i++)
   {
     palabra[i]:= ....

     }
...

como seria la definicion  en pascal, para hacer lo mismo es decir poder recorrer dos palabras.quisiera me corrigieran si estoy errado en intentarlo hacer,como lo describo a continuacion utilizando arrays de registros:

tpalabras= record
 palabra:string[100];
 end;

arraypalabras=array[1..2] of tpalabras;

var  
palabras:arraypalabras;

begin
 for i:=1 to 2 do
   palabras[i]:=...

..

espero me ayuden a corregirme si en mi planteamiento con arrays de registros tengo algo mal o mejor aun me indiquen si hay otra manera no se, quiza mas corta de hacer lo mismo sin utilizar arrays de registros, mil gracias por su ayuda.


30-May-2012 20:58
oscar gomez

cordial saludo a todos, es especial al profesor nacho cabanes.

alguien podria hecharme una mano con lo planteado, mil gracias, sera de gran ayuda para mi.


17-Jun-2012 12:41
Nacho Cabanes (+83)

Sí, tu planteamiento es bueno. En Pascal basta con


var 
  palabras: array[1..2] of string;
  i: integer;

begin
  for i:=1 to 2 do
    palabras[i]:=...



pero no tengo claro a dónde pretendes llegar con esa construcción. Si quieres acceder a cada una de las letras de las palabras, necesitarías un segundo "for" anidado dentro de ese y un segundo corchete:



var 
  palabras: array[1..2] of string;
  numPalabra, numLetra: integer;

begin
  for numPalabra:=1 to 2 do
    for numLetra:=1 to length(palabras[numPalabra]) do
      palabras[numPalabra][numLetra] := ...



17-Jun-2012 13:51
oscar gomez

Cordial saludo profesor Nacho, muy agradecido por tu atencion, la verdad la esperaba pues siempre me ayudas a mi y estoy seguro a todos los compañeros, pues nos das explicaciones siempre claras y soluciones muy brillantes.

profesor efectivamente es lo que necesitaba y bueno lo que pretendo es por cada palabra tener la frecuencia de cada letra para luego comparar dichas frecuencias de letras en cada palabra e intentar verificar si son iguales, la parte de las frecuencias en un hilo distinto a este ("como calcular la frecuencia de cada letra en cada palabra...") me ayudaste y lo solucione, lo que deje luego planteado alli y que quiza no se si te diste cuenta pues no he recibido noticia alguna de ello, fue como hacer para una vez que tengo las frecuencias de letras en cada palabra( que como te digo ya me sale), como hago para comparar dichas frecuencias y saber si fueron iguales, yo intento hacer algo que se esta mal por que no me esta  saliendo,¿como podria hacerlo...

yo intento hacer:

identidad:=false;
for l:='a' to 'z' do
 if freculetraspal[1][l] = freculetraspal[2][l] then
   identidad:=true
   else
     identidad:=false;


if identidad = true then
 writeln('sus frecuencias son iguales')
 else
 writeln('sus frecuencias no son iguales');


pero siempre me sale en ejecucion:
" sus frecuencias son iguales", que podre estar haciendo mal ?


La definición de tipos y variables es la que te comente allí:

type

 talfabeto=array[1..26] of char;
 tfrecletraspalabras: array['a'..'z'] of integer;


var
palabra:string[20];
alfabeto:talfabeto;
frecuLetraspal1,frecuLetraspal2:tfrecletraspalabras;
i,j,l:integer;
...

{inicializo a cero los indices para las frecuencias de cada una de las dos palabras}

for l:='a' to 'z' do
 begin
 frecuLetraspal1[l]:=0;
 frecuLetraspal2[l]:=0;
end;

for i:=1 to 26 do {array alfabeto con sus elementos el alfabeto}
 alfabeto[i]:=chr(i+96);

for i:=1 to 2 do
begin
 writeln('escriba la palabra',i,':');
 readln(palabra[i]);
 end;

...

ojala me heches un amano para poder terminar este ejercicio que me propuse a manera de reto personal y que ya en un 80% lo tengo pero me falta esto que te comento de como hacer ahora para verificar que las frecuencias de letras en cada palabra fueron iguales.mil gracias por tu tiempo, amabilidad y ayuda.


17-Jun-2012 17:16
Luis Torres (+18)

La verdad es que es muy extraño el código que estás utilizando, no pareciera que estuvieras programando en Pascal.
En primer lugar, ¿Qué significa esto?:
          freculetraspal[1][l]
según tengo entendido debería ser así: freculetraspal[1,l], ¿no?, si lo que queremos es representar un arreglo de dos dimensiones.

Pero, en la declaración de variables haces esto otro, lo cual no concuerda con lo anterior:
frecuLetraspal1,frecuLetraspal2:tfrecletraspalabras;

Todo esto es muy extraño.

Si pudieras adjuntar el código del programa completo (como archivo adjunto), por favor, para revisarlo.

Saludos.


17-Jun-2012 18:55
oscar gomez

Hola Luis, un fuerte abrazo.

efectivamente como bien dices y preguntas es algo que tambien se lo plantea al profesor nacho cabanes en el hilo:
"como calcular la frecuencia de cada letra en cada palabra..."
que aun quiza por tiempo no haya ppodido responder, y efectivamente esa misma consulta que tu haces:
freculetraspal[1][l]
según tengo entendido debería ser así: freculetraspal[1,l], ¿no?, si lo que queremos es representar un arreglo de dos dimensiones.

se la plantee al profesor nacho quien fue quein me sugirio esa forma de hacerlo y mi pregunta alli fue la misma, e incluso le deje la inquietud si es que asi se estaria trabajando con arreglos pararlelos o matrices la verdad no le entendi esa parte y esta formaulada, estoy al igual que tu esperando que el profesor nos de su explicacion. cuando lo pueda resolver te enviare el codigo sin problema.

ojala el profesor nacho lea este hilo y el referente al que esta sin responderse ("como calcular la frecuencia de cada letra en cada palabra...") en donde esa inquietud que tienes tambien la tengo yo y se la formule en su momentoa l profesor asi como adicionalmente como hacia para validar o comprobar que las frecuencias de letras de las dos palabras sean iguales o distintas.

esperemos luis, se que el profesor nacho siempre esta pendiente.
un saludo y gracias.


17-Jun-2012 20:43
Luis Torres (+18)

Yo ya lo probé y sí funciona. Me refiero al uso de los dos corchetes. Pero hay que tomar en cuenta que se trata de variables definidas como string.
Por ejemplo si declaramos una variable así:
palabra: string;
se puede utilizar el corchete para referirnos a una letra en particular de palabra. Por ejemplo, se permite hacer:
palabra[1] para referirnos a la letra en la posición 1.
Si extrapolamos eso, no a una variable simple tipo string, sino a una varible arreglo string, también se puede utiliza ese corchete extra para referirnos a una letra en particular de una de las varialbes arreblo. Por ejemplo:
palabra: array [1..2] of string,
se permite; palabra[1][2] para referirnos a la letra ubicada en la posición 2 de la palabra palabra[1].
Adjunto te dejo un pequeño código con un ejemplo de que sí se puede hacer así, en caso de arreglos de string, claro está. No lo he probado para arreglos bidimensionales.
Saludos.


17-Jun-2012 21:28
Luis Torres (+18)

Aquí tienes un error. Tienes escrito esto:
var
palabra:string[20];
.
.
.
for i:=1 to 2 do
begin
 writeln('escriba la palabra',i,':');
 readln(palabra[i]);
end;

porque estarías leyendo una letra para palabra[i] para cuando i sea igual a 1 y; una letra para para palabra[i] para cuando i sea igual a 2. O sea, que si introduces primero la palabra "oscar2 y después la palabra "pascal", tendrías lo siguiente en palabra:
palabra[1] sería igual a 'o' y
palabra[2] sería igual a 'p'.
y palabra creo que no tendría una longitud definida. Fíjate que palabra[1] y palabra[2] son dos letras de una misma cadena, NO SON DOS PALABRAS DISTINTAS.

Para solucionar lo anterior y se puedan guardar realmente dos cadenas, deberías declarar palabra de la siguiente manera:
palabra: array [1..2] of string[20];

Saludos.


03-Jul-2012 12:08
oscar gomez

cordial saludo profesor nacho cabanes y agradecerte tambien luis por tu intervencion en la cual tienes toda la razon y te lo agradezco inmensamente.

queria preguntar acerca de lo siguiente:
me gustaria si me puedieran ayudar en como una vez que tengo las frecuencias de letras en cada palabra, como hago para comparar dichas frecuencias y saber si fueron iguales o no , emitiendo un mensaje segun sea el caso,

porejemplo

si tengo para palabra1: carlos

y para palabra2: carlitos

y ya tengo el arreglo con la frecuencias de cada letra para cada palabra, es decir:

para palabra1 el array de frecuencias es como lo indico:

10100000000100100110000000

y  para palabra2 el arreglo seria:

10100000100100100111000000


mi pregunta es ahora como puedo comparar estos dos array de  frecuencias de letras de palabra1 y palabra2 para decir porejemplo que son iguales o no lo son como es este caso de ejemplo que propongo en el que deberia decir las frecuencias de letras para las dos palabras son distintas. yo intento hacer:

identidad:=false;
for l:='a' to 'z' do
 if freculetraspal[1][l] = freculetraspal[2][l] then
   identidad:=true
   else
     identidad:=false;


if identidad = true then
 writeln('sus frecuencias son iguales')
 else
 writeln('sus frecuencias no son iguales');


pero siempre me sale en ejecucion:
" sus frecuencias son iguales", que podre estar haciendo mal ?


La definición de tipos y variables es la que siguiente:

type

 talfabeto=array[1..26] of char;
 tfrecletraspalabras: array['a'..'z'] of integer;


var
palabra:string[20];
alfabeto:talfabeto;
frecuLetraspal1,frecuLetraspal2:tfrecletraspalabras;
i,j,l:integer;
...

{inicializo a cero los indices para las frecuencias de cada una de las dos palabras}

for l:='a' to 'z' do
 begin
 frecuLetraspal1[l]:=0;
 frecuLetraspal2[l]:=0;
end;

for i:=1 to 26 do {array alfabeto con sus elementos el alfabeto}
 alfabeto[i]:=chr(i+96);

for i:=1 to 2 do
begin
 writeln('escriba la palabra',i,':');
 readln(palabra[i]);
 end;


por favor me gustaria su ayuda agradeciendola de antemano.


03-Jul-2012 18:14
Luis Torres (+18)

Si colocas el código completo sería más fácil ayudarte. Creo que tienes un error en la declaración de variables y uso de las mismas, por ejemplo, declaraste l como integer, pero en el ciclo for le asignas valores char (for l:='a' to 'z' do). El problema que tienes no debe ser gran cosa, pero es mejor ver el código completo, al fin y al cabo lo más difícil ya lo tienes resuelto. Saludos.
03-Jul-2012 18:46
Luis Torres (+18)

También tienes un error muy grave, corrigiéndolo creo que solucionarás el problema que tienes. El error está también en la declaración de variables en la forma como declaraste palabra, al tratarse de dos palabras, o más bien un array de dimensión dos de tipo string, debiste declararla de la siguiente manera:
          palabra: array[1..2] of string;
Así, el bloque de declaración de varibles debe quedar así:


program frecuenciaLetrasEnDosPalabras;
type
  talfabeto=array[1..26] of char;
  tfrecletraspalabras: array['a'..'z'] of integer;
var
  palabra: array[1..2] of string[20];
  alfabeto:talfabeto;
  frecuLetraspal1,frecuLetraspal2:tfrecletraspalabras;
  i,j:integer;
  l:char;



Saludos.


03-Jul-2012 20:16
Luis Torres (+18)

No sé con certeza plena lo que buscas que haga el programa, pero me puse a intentarlo y logré un programa que puede que te sirva de modelo para lograr el fin que persigues, este programa tiene como salida aquellos caracteres que tienen la misma frecuencia en ambas palabras. Te lo dejo adjunto, pero también lo tienes escrito aquí:


program frecuenciaCaracteresDosPalabras;
type
  talfabeto=array[1..26] of char;
  tfrecletraspalabras= array['a'..'z'] of integer;
var
  palabra: array [1..2] of string[20];
  alfabeto:talfabeto;
  frecuLetraspal1,frecuLetraspal2:tfrecletraspalabras;
  i,j:integer;
  l: char;

BEGIN
{inicializo a cero los indices para las frecuencias de cada una de las dos palabras}

for l:='a' to 'z' do
  begin
  frecuLetraspal1[l]:=0;
  frecuLetraspal2[l]:=0;
end;

for i:=1 to 26 do {array alfabeto con sus elementos el alfabeto}
  alfabeto[i]:=chr(i+96);

for i:=1 to 2 do
begin
  writeln('escriba la palabra',i,':');
  readln(palabra[i]);
  end;

{Mostramos las dos palabras leidas por el teclado}  
for i:=1 to 2 do
  writeln(palabra[i]);
 
{llenamos las veces que se repite cada letra de la primera palabra} 
for i:=1 to length(palabra[1]) do
 begin
   frecuLetraspal1[palabra[1][i]]:= frecuLetraspal1[palabra[1][i]] + 1;
 end;

{llenamos las veces que se repite cada letra de la segunda palabra} 
for i:=1 to length(palabra[2]) do
 begin
   frecuLetraspal2[palabra[2][i]]:= frecuLetraspal2[palabra[2][i]] + 1;
 end;

{Ahora comparamos cada valor contenido en los arreglos de frecuencias, si son distintos de ceros e iguales...} 
for l:='a' to 'z' do
 if ((freculetraspal1[l]<>0) and (freculetraspal1[l]<>0)) and (freculetraspal1[l]=freculetraspal2[l]) then
  begin
    writeln('La letra ',l,' tiene la misma frecuencia en ambas palabras.');
  end;
  
readln;  
END.  

03-Jul-2012 23:38
Luis Torres (+18)

Ya dí con la razón por la cual siempre aparece el mensaje "Sus frecuencias son iguales". Pongamos el ejemplo que colocas arriba:
carlos      10100000000100100110000000
carlitos    10100000100100100111000000

Si nos fijamos en parte del código que se encarga de evaluar si los arreglos de frecuencia son o no iguales, el cual es:

identidad:=false;
for l:='a' to 'z' do
 if freculetraspal[1][l] = freculetraspal[2][l] then
   identidad:=true
   else
     identidad:=false;

if identidad = true then
 writeln('sus frecuencias son iguales')
 else
 writeln('sus frecuencias no son iguales');

nos damos cuenta que se hace un recorrido para cada índice del arreglo desde la 'a' hasta la 'z', si son iguales "identidad" valdrá true y, si son distintas,valdrá false; pero resulta para que esto resulte, a la primera que encuentre que sean distintos, debería mantener el valor false, pero esto no ocurre, sigue la comparación hasta que alcance el índice 'z'. Si vemos el ejemplo, ¿qué ocurre cuando llegamos a 'z'?, pues que en 'z' son iguales y por lo tanto "identidad" valdrá true. Por eso es que siempre recibes ese mensaje, la única forma en la que aparezca el mensaje de que "sus frecuencias no son iguales" es que una palabra tenga una o más letras 'z' y la otra no tenga o las tenga en candidad diferente. Por ejemplo: carloz y calitos. Es por ello que siempre te ha dado ese mismo mensaje. La solución no la tengo en este momento a la mano; pero por lo menos ya he diagnosticado dónde se encuentra el fallo.
Muchos Saludos.


08-Jul-2012 15:49
Nacho Cabanes (+83)

El error está en este fragmento de código:

identidad:=false;
for l:='a' to 'z' do
 if freculetraspal[1][l] = freculetraspal[2][l] then
   identidad:=true
   else
     identidad:=false;


El error es habitual: siempre que te pidan decir si TODOS los datos cumplen una condición o si NINGÚN dato la cumple, debes hacerlo de la misma forma: no puedes hacer un "if" que dé un valor directamente en un sentido o en otro, sino que debes ayudarte de un "boolean", porque hasta que no recorras todos los datos, no sabes si todos (o ninguno) cumplen esa condición.

En tu caso, eso te afecta en que sobra el "else".

En este problema, lo más razonable es comenzar suponiendo que las dos son iguales, y si encuentras algún valor que no coincida, quiere decir que no eran iguales:

sonIguales := true;
for letra := 'a' to 'z' do
 if frecuencia[1][letra] <> frecuencia[2][letra] then
   sonIguales := false;


08-Jul-2012 17:07
oscar gomez

Gracias profesor Ncho Cabanes por no lvidarte de nosotros y nuestras inquietudes, entendemos tu tiempo por supuesto y valoramos y agradecemos no imaginas cuanto tu valiosa ayuda.
esta muy clara tu explicacion, era una duda vieja que tenia y estaba esperando como siempre tu respuesta mil gracias.






(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.)