• Viernes 19 de Abril de 2024, 11:48

Autor Tema:  Re: POR favor necesito ayuda urgente!!! Trabajo de cadenas d  (Leído 3126 veces)

covman

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: POR favor necesito ayuda urgente!!! Trabajo de cadenas d
« en: Miércoles 6 de Marzo de 2002, 19:36 »
0
El trabajo consiste en montar un traductor de texto normal en español a SMS y viceversa. Para ellos se haran 2 funciones.

La primera recibira una frase en español y la devolvera en SMS. El nombre de la funcion sera normalsms

la segunda cojera una frase en sms y la devolvera en español. Se llamara smsnormal.

SI la frase contuviese algun termino sin correspondencia en el dialecto sms apareceran tantos interrogantes como letras tenga ese termino.

----------------------

Este es el codigo que he hecho pero no funciona. La idea es comparar cada palabra de la frase con las palabras que hay en las tablas globales y si encuentra una palabra coincidente en la tabla 1 cambiarla por la que esta en la tabla 2 en la misma posicion. (esto seria para la funcion normalsms, al reves para la 2 funcion)

Por favor, mañana tengo que entregar este trabajo:( estoy desesperado !!!

#include <stdio.h>
#include <string.h>
#include <conio.h>

char *tab[64]={"hola","adios","quedamos","quedar","te","de","en","el","quiero","casa","como","estas","que","porque","por","menos","mas","calle","beber","caro","tarde","entonces","mañana","tanto","centro","cual","cuando","cubata","alcohol","espero","estoy","este","examen","favor","gente","gracias","lunes","martes","miercoles","jueves","viernes","sabado","domingo","kilo","mil","mensaje","para","parque","hombre","mujer","vale","movil","callate","mucho","risa","donde","es","dedos","quedado","telefono","tele","guapa","acaba","euros"};
char *tab2[64]={"hla","bye","kdamos","kdar","t","d","n","l","kiero","ksa","cm","stas","q","xq","x","-","+","caye","bbr","kro","tard","ntoncs","mñn","tnto","zntro","qal","qndo","qbata","alcol","spero","stoy","st","xam","fvor","gnt","thanx","lu","ma","mi","ju","vi","sab","dom","kg","k","msg","xa","park","h","m","ok","mov","kyat","mxo","rsa","dnd","s","d2","kddo","tlf","tv","wpa","akba","eu"};

void main (void)
{
void normalsms(char frase1[]);
void smsnormal(char frase2[]);

char fras[140],copia[140];
int opcion;

printf("Introduzca una frase (max 140 caracteres) : ");
gets(fras);
strcpy(copia,fras);

printf("n----------------------------------------------------------------------n");
printf("n Seleccione Opcion : ");
printf("n ===================");
printf("n 1. Pasar a lenguaje SMS (la frase debio ser escrita en formato normal");
printf("n 2. Pasar a lenguaje normal (la frase debio ser escrita en formato sms");
printf("n 3. Salir");
printf("n----------------------------------------------------------------------n");
opcion=getch();


switch (opcion)
   {
   case '1': normalsms(copia);break;
   case '2': smsnormal(copia);break;
   case '3': printf("n Finalizando el programa, ¡adios!");break;
   }

}
//----------------------------------------------------------------------
void normalsms(char frase1[])
{
char pal[20];
int i,j=0,k,l,lon,lonpal;
lon=strlen(frase1);

printf("Estamos en la funcion normalsmsn");

for (i=0;i<lon;i++)
   {
   if (frase1!=32)
      {
      pal[j]=pal[j]+frase1;
      printf("%s",pal[j]);
      }
   else
      j++;
      for(k=0;k<64;k++)
         if(strcmp(tab[k],pal)==0)
            printf("%s",tab2[k]);
         else
            {
            lonpal=strlen(pal);
            for(l=0;l<lonpal;l++)
               printf("?");
            }
   }






}
//----------------------------------------------------------------------
void smsnormal(char frase2[])
{
printf("Estamos en la funcion smsnormaln");
puts(frase2);
}

tenesor

  • Miembro activo
  • **
  • Mensajes: 90
    • Ver Perfil
Re: POR favor necesito ayuda urgente!!! Trabajo de cadenas d
« Respuesta #1 en: Jueves 7 de Marzo de 2002, 13:57 »
0
Hola covman

Bueno, lo primero que veo es que al declarar tab y tab2 les estas indicando que contendrán 64 CARACTERES, no palabras:) Para solucionar esto puedes utilizar un archivo que guarde una especie de diccionario. En este archivo podrías meter, por ejemplo, los datos asi:

"diccionario.sms"
-------------------
hola
hla
adios
bye
quedamos
kdamos
...

Utilizando las lineas como separadores. Asi quedarían las palabras "normales" en las lineas impares y las "sms" en pares.

Luego, los prototipos de las funciones se declaran despues de los includes, no dentro de main (no te da error aqui el compilador?) Asi que esto quedaría asi:


#include <stdio.h>
#include <string.h>
#include <conio.h>

void normalsms(char frase1[]);
void smsnormal(char frase2[]);

main(){
...
}


En cuanto a la funcion "normalsms", estaria bien hecho si realmente en tab
  • se guardar una palabra. Si lo haces con un fichero simplemente cargas en tab[] la palabra normal y en tab2 la palabra equivalente en sms, hace el bucle y cuando termina limpias tab y tab2 cargando las siguientes palabras.


Espero que te ayude.

Saludos,
  Tenesor
Que el toro estoque al matador, que el preso enciere al guardián, que solo sean de cerveza los tanques, que el pez pesque al pescador y que el tigre dome al domador, que la television se prohiba y el hachis se legalice, que africa sea tierra mágica y no trágica... cambiando el mundo [NS]

olla

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: POR favor necesito ayuda urgente!!! Trabajo de cadenas d
« Respuesta #2 en: Jueves 7 de Marzo de 2002, 17:56 »
0
Vamos a ver, veo ciertos fallos  que pueden hacer que tu programa falle. No le hagas caso a tenesor (no te enfades, ahora te estás equivocando). Las declaraciones de tab y tab2 están hechas de forma correcta, lo que has hecho es declararte un vector o tabla de caracteres, puesto que has puesto char *tab[64], al poner el asterisco (puntero) le está indicando que vas a tener un matriz de dos dimensiones.
Por ejemplo:
char aux[20]="Tenesor";
char *aux2[20]="Pedro,Juan,Miguel,Alfonso..";
printf("%s",aux[1]);--> Escribiría por pantalla la el carácter 'e'
printf("%s",aux[1]);-->Escribiría por pantalla la cadena 'Juan' correspondiente a la segunda posición del vector. Recuerda que en las cadena de caracteres y/o vectores su índice empieza a contar desde 0 hasta n.
Creo que esta aclaración no iba para tí, porque pienso que lo entendiste a la primera tal como veo en el código, esta aclaración está dirigida a otra persona (jeje).

Lo que debes de hacer:

1º)La cabecera de la función normalsms debe de ser así: void normalsms(char frase1[40]), debes de indicarle en el tipo de datos la longitud de la cadena que le vas a pasar en este caso 40, como hiciste anteriormente con la variable copia(char copia[40]).
2º)Es una locura hacer lo que dice "tenesor" (no me estoy cebando contigo, sólo te corrigo),puesto que es una tontería y no es eficiente utilizar un fichero para algo tan simple. Con las estructuras de datos que estás utilizando vas sobrado, puesto que la busqueda en un fichero es más complicada y más lenta que la busqueda en un vector.
3º)Pasos a seguir en la función normalsms:
- Debes de recorrer la frase de entrada  (frase1) hasta encontrar un espacio en blanco, momento en el cual tendremos una palabra.
- Comparar si esa palabra existe en el vector tab y si es así mostrar en pantalla la palabra correspondiente en el vector tab2.
-Para recorrerte (frase1) hasta encontrar un espacio en blanco, puedes utilizar alguna función de la clase string.h, consulta algún manual o ayuda, ahora mismo no recuerdo ninguna, pero te aseguro que la hay.De todas formas creo que ese recorrido lo tienes bien.

Espero haberte/os sido de ayuda ...
Eres tu John Wayne o lo soy yo?

tenesor

  • Miembro activo
  • **
  • Mensajes: 90
    • Ver Perfil
Re: POR favor necesito ayuda urgente!!! Trabajo de cadenas d
« Respuesta #3 en: Viernes 8 de Marzo de 2002, 03:02 »
0
El hecho de pasar 140 caracteres, ¿ese es el maximo a escribir en un sms? no se como van, solo se que depende de que compañia y movil coje x caracteres. La pregunta es que si 140 es el movil/compañia que mas caracteres acepta.

En cuanto a lo de los ficheros, puede que sean mas lentos y complicados, pero tambien le das al usuario la posibilidad de ampliar y/o modificar el diccionario para una personalización y no ocupas memoria cargando todas las palabras en estructuras, solo ocupas la de 2 palabras (la "normal" y al "sms"). Con pocas palabras se puede almacenar facilmente en vectores pero, que pasaría si llega un momento en el que el diccionario se empieza a crecer y crecer? (en posibles futuras versiones del programa:)) Esto es solo una opinión, cada cual elige lo que mas comodo le resulte.

En cuanto a lo de la funcion del string.h lo unico que se puede hacer es substituir el for con alguna funcion de comparacion de caracteres como strchr o algun asi (al menos, de las que yo conozco). Utilizando strchr (comparaciond de un caracter), podría quedar algo asi:
---------------------------
bucle:
do{
...
j++;
}while(strchr(frase1,32)==NULL) /* mientras no encuentre espacio en blanco... */
j++;
if(frase[j]!='') goto bucle; /* Si no acaba la frase, vuelve al bucle*/
---------------------------

Esto no se si funcionaria... pero es una idea.

Olla:
Ok, gracias por la aclaracion (ya te dije que agradezco aclaraciones como esta.....) Me despistó el *, pero... ¿bidimensional? creo que no... Simplemente es un vector de, en el caso de *tab[64], 65 punteros a caracteres, no? (este "no?" es una pregunta de inseguridad, si me confundo, intenta aclararmelo....)
De todas formas gracias.

Saludos,
  Tenesor
Que el toro estoque al matador, que el preso enciere al guardián, que solo sean de cerveza los tanques, que el pez pesque al pescador y que el tigre dome al domador, que la television se prohiba y el hachis se legalice, que africa sea tierra mágica y no trágica... cambiando el mundo [NS]

olla

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: POR favor necesito ayuda urgente!!! Trabajo de cadenas d
« Respuesta #4 en: Viernes 8 de Marzo de 2002, 09:21 »
0
Aclaraciones:
- char aux[45]-->Vector unidimensional de caracteres, es decir una cadena de caracteres.
- char aux[2][45]-->Vector bidimensional, es decir vector formado por dos palabras, el primer indice [2], nos indica las filas (palabras), y el segundo [45] las columnas (letras que conforman las palabras).
- char *aux[45]-->Idem de anterior, salvo que en esta ocasión al poner el * la primera dimension (filas) del vector nos la estamos declarando de forma dinámica, es decir no conoceremos su tamaño en tiempo de compilación sino en tiempo de ejecución, por lo que habrá que reservar memoría (aunque en nuestro caso no será necesario).
- char **aux-->Idem de anterior, pero en este caso las dos dimensiones estan declaradas dinamicamente (punteros).
- char aux[2][2][23]-->Tridimensional,....
y así sucesivamente.

Para una mayor aclaración podeis realizar un pequeño ejemplo con una estructura como la anterior, y realizarle una inspección (inspect, creo que es ALT-F4) a la variable aux en Borland C 3.11 o superior. Al hacer esta inspección vereis la forma real que tiene el vector.

Respecto al uso de ficheros, en este caso no es recomendable, como ya dije ayer puesto estos están orientados a otros menesteres: información sobre usuarios, agendas, etc, es decir información que pueda llegar a ocupar incluso varios Mb. En nuestro caso por mucho que crezca nuestro vector nunca llegará a ocupar tanta memoria como para realentizar el funcionamiento del programa.
Por otra parte "tenesor" creo que no te has enterado, de como va el programa. Es una simulación, con esto quiero decir que no depende de ninguna compañia de telefonía ni deun tamaño standar de sms, ni nada por el estilo. Han determinado 140 caracteres como podrián haber dicho 345, eso da igual. Fijate en los dos vectores:
tab-->Almacena la frase.
tab2--> El equivalente en SMS a una palabra normal de la lengua. Recuerda que ese equivalente lo han determinado ellos y que se puede cambiar en cualquier momento, porque solo es una simulación.

De todas esto debe de confirmarlo covman, pero creo que está muy claro.
Por último se me olvidaba decir, que en este programa no se contempla la posiblidad de ampliar el diccionario SMS, osea que siempre tendrá un tamaño fijo. De todas formas si quisieramos ampliar el diccionario en cualquier momento, deberíamos de olvidarnos del utilizar vector para almacenar las palabras y utilizar estructuras dinámicas, como por ejemplo listas enlazadas. Pero eso sí nunca ficheros, ya que no es eficiente para casos tan triviales como estos, es más rápido un proceso de búsqueda en una estructura cualquiera que en fichero (abrir fichero, comprobra que existe, cerrar fichero...), no,no.

Espero que todo haya quedado aclarado.

Hasta pronto.
Eres tu John Wayne o lo soy yo?

tenesor

  • Miembro activo
  • **
  • Mensajes: 90
    • Ver Perfil
POR favor necesito ayuda urgente!!! Trabajo de cadenas de ca
« Respuesta #5 en: Viernes 8 de Marzo de 2002, 15:37 »
0
Ok, ya lo probe y entendí:)

En cuanto a lo de ficheros... eso depende de quien lo haga y para que lo hace...
En mi caso, preferiria el uso de ficheros, para darle al usuario la opción de aumentar el diccionario, o editarlo para personalizarlo, etc cosa que con el vector no podrías hacer. Si substituyes el vector por estructuras dinamicas creo que se complica mas de lo necesario... Y tampoco tendrías la posibilidad de almacenar las palabras introducidas por el usuario. Tambien se podría utilizar tanto estructuras como ficheros, cargando los datos del fichero a estructuras si con eso facilita las cosas.

Y creo que si que me he enterado del programa...
Si el programa no lo orientas tambien al envio del mensaje a un movil da igual ponerle al mensaje como tope 140 que no ponerle... Pero 140 es un tope que se ha metido a la mayoria de los moviles en la mayoria de las compañias (o por ahi estaba), por eso dije lo de que se podría mirar que movil/compañia tiene el tope mas alto. Aunque ahora el programa sea lo que es, digamos traductor, cuando alguien hace un programa ha de tener en mente la posibilidad de ampliación de opciones una vez que se queda satisfecho con el funcionamiento de las "opciones basicas" marcadas (al menos eso pienso). Y dentro de las opciones de ampliacion que se podrían meter en este programa podría ser la del envio del mensaje. De ahi viene todo...

Saludos,
  Tenesor
Que el toro estoque al matador, que el preso enciere al guardián, que solo sean de cerveza los tanques, que el pez pesque al pescador y que el tigre dome al domador, que la television se prohiba y el hachis se legalice, que africa sea tierra mágica y no trágica... cambiando el mundo [NS]