|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - nicokiki
Páginas: 1 ... 3 4 [5] 6 7 ... 12
101
« en: Viernes 4 de Junio de 2004, 22:24 »
Hola!!!!!!
En tu caso en el q debes ordenar palabras por orden alfabetico, lo q yo haria es crear una clase String para asi poder sobrecargar, el "<", el "=", el ">" para poder ordenar los strings (salvo q el string de la STL tenga sobrecargado el <, > y =, cosa q desconozco). Luego por tu tema en especial, lo q te conviene es parsear el archivo q tiene los datos cargados y cargarlo en memoria en un vector de la STL o lista de la STL o vector tuyo o lista tuya o arbol o lo q sea, pero q este en memoria. Luego lo ordenas al vector y como ultimo paso recorres secuencialmente el vector ordenado y lo volcas al archivo de destino. Tene en cuenta q si tenes 9 mil millones de palabras distintas, dudo q lo puedas mantener en memoria, pero dudo q ese sea tu caso.
Salu2!!!!!!!
102
« en: Viernes 4 de Junio de 2004, 18:43 »
Hola!!!!!! Lo voy a hacer de la manera mas facil posible, q es usando la STL. //Vector de la STL #include <vector> //String de la STL #include <string> typedef std::string TString; typedef std::vector<TString> TVector;
Luego en el main, declaras un vector de tipo TVector y le agregas una cadena. Un ejmplo seria asi: TVector MiVector; MiVector.push_back("Hola Mundo!!!");
Y listo Salu2!!!!!!
103
« en: Viernes 4 de Junio de 2004, 16:44 »
Hola!!!!!
Tambien se puede usar el toString();
Salu2!!!!!
104
« en: Viernes 4 de Junio de 2004, 16:29 »
Hola!!!! Vos sabes de antemano el tamaño maximo de cada linea del archivo por lo q hacete un char* linea = new char(TAMANIO_MAXIMO_LINEA);
Luego haces un FILE* pArchivo; fgets(linea, TAMANIO, pArchivo); //fgets() devuelve cargado "linea" y a parte //devuelve NULL (la funcion fgets devuelve un char*) si hubo error. fgets() carga hasta un fin de linea del archivo
Luego lo q te queda es parser linea y listo!!!!! Lo q si tene en cuenta es q faltan un millon de cosas como el while (!feof(pArchivo)) { blablabla(); }
Salu2!!!!!
105
« en: Viernes 4 de Junio de 2004, 02:33 »
Hola gente!!!!!!!!
Tengo una pregunta bastante larga pero espero q la puedan leer. No pido codigo, pido ideas que mejoren la mia, la cual es bastante ineficiente. Tema: Resolucion de consultas ranqueadas utilizando el metodo del coseno (no lo voy a aplicar en un 100% porque haria q mucha gente q lea este mensaje no entienda mi problema!!!)
Tengo listas de Id(unsigned long) de archivos y frecuencias de palabras en cada archivo teniendo como clave a el Id de archivo asi
13 8 15 2 17 3
9 4 13 1 25 2 39 6
Esta seria una lista de dos posiciones. Esta lista la ordeno antes de llegar a este paso.
Luego tengo un lista de estas listas como nodo. Algo asi: 13 8 9 4 15 2 13 1 17 3 25 2 39 6 El paso q me tiene loco es este: Tengo q generar un vector comun con las frecuencias de cada Id de archivo en la posicion adecuada para cada Id de archivo distinto que tenga. Ejemplo: En la 1º posicion del vector correspondiente a Id = 13 debo poner un 8 y en la segunda debo poner un 1 ya q en la segunda posicion de la lista grande (lista de lista), para el Id = 13 tengo frecuencia = 1. En la 1º posicion del vector correspondiente a Id = 15 debo poner un 2 y en la segunda un 0 porque el Id = 15 solo esta en la primer posicion de la lista grande En la 1º posicion del vector correspondiente a Id = 17 debo poner un 3 y en la segunda un 0 porque el Id = 17 solo esta en la primer posicion de la lista grande Luego, en la 1º posicion del vector correspondiente al archivo Id = 9 (ya estoy en el segundo nodo de la lista grande) y en la segunda pongo un 4. Asi sucesivamente.
Lo q a mi se me ocurrio es a la lista basica agregarle un atributo "Status" que estaria en 0 si no fue utilizado todavia o en 1 si ya lo fue. Entonces, como recorro la lista grande un monton de veces buscando Id's, en caso de encontrar uno, lo marco como leido cambiandole el status y sigo. Esto sirve, para el caso q ultimo comente: el cambio del algoritmo seria: Luego en la 1º posicion del vector correspondiente al archivo de Id = 9 pongo un cero porque su status estaria en 0 (nunca visitado) y en la segunda pongo un 4 y le cambio el status.
El problema de esto, es q tengo q recorrer la lista grande secuencialmente un monton de veces y encima tengo q recorrer las listas pequeñas tambien un monton de veces (aunque para estas, el recorrido seria una busqueda binaria u otra de mejor orden). Eso me puede insumir demasiado tiempo y memoria.
Si a alguien se le ocurre alguna idea para hacer esto de una manera mas eficiente, por favor sere todo oidos. Cualquier sugerencia es buena. Lo unico q pido es q no supongan cambios en lo q plantee porque no son aplicables al problema porque tendria q ahondar en la explicacion de indexacion de archivos, busquedas por esos indices, registros de longitud variable, ablocamientos de memoria, etc.
Salu2!!!!!!!! y esperando mas q nunca una sugerencia
P.D.: Si alguien considera q esto no va en el foro de C/C++ le pido disculpas, pero es el q mas visito yo y lo pongo aca porque lo estoy desarrollando bajo C++.
P.D.2: Alguien sabe cual es el problema q tiene el compilador de Borland q me tira error al compilar un archivo cuando fue hecho en un 100% en ANSI C y compilado con gcc asi: "gcc arch.c -Wall -ansi -pedantic -oexecutable" en un GNU/LINUX MANDRAKE 9.2 y en un DEBIAN sin tirar ni un warning y compilado con Visual Studio 6.0 bajo W98, WMe, W2000, W2003 y WXP????? (quiero remarcar q las opciones de comando pasadas al gcc no permiten siquiera poner un "//" ya q esto es de C++ y no de C)
106
« en: Miércoles 2 de Junio de 2004, 15:20 »
Hola!!!!!! www.java.sun.com es la "PAPA"!!!!! Salu2!!!!!
107
« en: Miércoles 2 de Junio de 2004, 15:17 »
Hola de nuevo!!!!!! if (w_linia05=="MT10") printf("Cadena MT10 ok\n");
El == no funciona para el char*. Es por eso q no entra al "if". Ahi tenes q usar el strcmp() asi: if (strcmp(w_linia05, "MT10") == 0) printf("Cadena MT10 ok\n");
Salu2!!!!!!!
108
« en: Martes 1 de Junio de 2004, 20:04 »
Hola!!!!!
Antes q nada no me parece q sea correcto lo q hiciste. Sinceramente cuando mire tu post y vi demasiadas lineas, no lo lei y la verdad es q dudo q mucha gente lo haya leido. La idea es hacer alguna pregunta puntual, pero para eso deberias haber mandado el codigo de la funcion q recorria de manera distinta a lo q deberia hacer. Igualmente mucho de implementaciones de grafos no se pero muchisima gente q si debe saberlo pero no podes pretender q se respondan todas tus dudas y en un tiempo corto. Hay preguntas y preguntas q llevan mas tiempo q otras y hay algunas q llevarian a q uno se ponga a debuggear lo q otro hizo y no me parece q eso sea justo. Lo q si es justo es q si uno sabe algo q otro no, se lo pueda responder pero no dar codigo asi porque si. Creo q estuviste mal y espero lo hayas entendido. No te trate mal ni nada de eso, como se q habra gente q si lo hara (y con razon). Espero disculpas, no a mi, sino a la gente del foro q se tomo el tiempo en intentar ayudarte y quizas no pudo o no supo. Espero eso de vos, creo q es justo lo q dije.
Salu2!!!!!!!!!
109
« en: Martes 1 de Junio de 2004, 17:58 »
Hola!!!!!!!!
Yo creo q con eso deberias estar bien, pero te recomiendo esto: Como vos trabajas con registros de longitud variable, al comienzo de cada registro podrias reservar 2 bytes (unsigned short) para guardar la longitud del registro y asi sabrias lo q tendrias q levantar en el buffer. Algo asi:
COD1| Longitud Registro |12,23;25,35;45,75;12,11,45,15| COD2| Longitud Registro |14,31;12,26| ............
Entonces, luego de haber levantado la linea entera del archivo con un fgets() y metido en un buffer, verificas q codigo tiene la linea, y luego salteas el lugar donde esta reservado COD1 y geteas la longitud del registro asi:
memcpy(Longitud, Buffer, 2 ); // 2 = tamaño en bytes del unsigned short //(supuestamente!!!!!!!)
Y luego cargas en un buffer auxiliar la cadena hasta la longitud de lo q obtuviste:
unsigned short Long = (unsigned short)atoi(Longitud); memcpy(BufferAux, Buffer, Long); //Tene en cuenta q Buffer tiene toda la linea, y deberias haber salteado los primeros bytes q contienen el COD? y la longitud. Ese proceso te lo dejo a vos. Todo esto lo hice porque vos hiciste un for de 50 corridas y sin saber lo q tenias en el registro, y si hicieras mas de lo q tenes verdaderamente podrias estar usando memoria de otra cosa o si hicieras menos, no obtendrias todos los datos. No se, es una idea q te doy, la cual no es muy facil pero si se q es optima.
Salu2!!!!!!!!
110
« en: Martes 1 de Junio de 2004, 16:44 »
Hola!!!!!! Si vos tenes algo asi como 20 codigos distintos tu idea estaria bien. Podrias usar el strstr(cadena original, cadena a comparar) q dice si la cadena a comparar esta dentro de la original. Ahora, si tenes infinitos codigos, no se si seria una buena idea el uso de un switch() (el case como en Pascal no existe, aca se llama Switch y es algo asi: switch(opcion) { case 'a': algo(); break; case 'b': algodistinto(); break; default: otracosa(); break; };
Espero q haya servido Salu2!!!!!!
111
« en: Martes 1 de Junio de 2004, 15:43 »
Hola!!!!! Estuve ojeando el codigo y vi un par de cosas mal. ListaDoble *Insertar(ListaDoble *L, char *s) { if ( L == NULL ) { L = new ListaDoble; L->largo = strlen(s); strcpy(L->reglon,s); L->sig = NULL; L->ant = NULL; return L; }
Deberia ser asi: L->largo = strlen(s) + 1; //El strlen no cuenta el '\0' int buscar(ListaDoble *L, char *s,int num) {printf("%s",s); if (L=NULL) {printf("%d --> entro a buscar\n",num ); if (L->reglon==s) printf("esta"); return buscar(L->sig,s, num+1);
El (L->renglon == s) no existe salvo q uses string de la STL. Al usar char* deberias usar strcmp() . Esta funcion devuelve 0 si las cadenas son iguales. Salu2!!!!!!!
112
« en: Lunes 31 de Mayo de 2004, 22:07 »
Hola!!!!!
Si queres leer una linea entera, usa fgets() q lee hasta un \n o un \r\n en UNIX (creo q era asi). Para recibir toda esa informacion, usa un char* y listo o un string de la STL. Luego, para separar palabras deberas tener en cuenta los espacios, los signos de puntuacion y demas. Recorda q el \0 lo tendras al fin de la cadena y no a fin de cada palabra. Es por eso q tenes q parser la cadena levantada del archivo.
Salu2!!!!!!!
113
« en: Lunes 31 de Mayo de 2004, 21:34 »
Hola de nuevo!!!!
Las matrices se suman de una sola manera: posicion a posicion y tienen q ser de la misma dimension. Como sumar???, bueno, es recorrer todas las posiciones de las matrices e ir sumando sus coordenadas [Columna][Fila] creando una tercer matriz donde estara el resultado o cargando uno de los dos sumandos con el resultado.
Salu2!!!!!!!!!
114
« en: Lunes 31 de Mayo de 2004, 00:03 »
Hola!!!!!!!!!
Primero pide por pantalla un "n" q deberia ser la dimension de la matriz cuadrada (no se para q lo hace porque la declara como "int a[3][3];" de 3 filas por 3 columnas.
Luego haces esto:
for (j=0;j<n;j++) for (i=0;i<n;i++) { printf("Ingrese numero:"); scanf("%d",&a[j]); }
Aca carga en la matriz lo q el usuario le va ingresando.
Luego para imprimir la matriz hace lo mismo. Tiene q recorrer todo para imprimir por pantalla, es por eso q lo hace otra vez al ciclo. Esto se tiene q hacer, porque nadie te provee una libreria a la cual le digas "imprimirMatiz(a[][n])" (cuando pases una matriz por parametro, no hace falta q pases la primer longitud, pero si las demas en caso de q tenga). Como no existe nada de eso, lo tenes q hacer vos, y esta es la manera de hacerlo:
for (j=0;j<n;j++) for (i=0;i<n;i++) printf("%d",a[j]);
Por ultimo, getch() espera un caracter del usuario para finalizar el programa. Proba de sacarlo y ejecuta el programa. Vas a ver q la ventana se abre y cierra rapidamente cuando tiene q imprimir. Despues ejecutalo otra vez con el getch() y vas a ver q tenes q apretar una tecla paar q se cierre la venta del programa. getch();
Salu2!!!!!!!!
115
« en: Domingo 30 de Mayo de 2004, 23:47 »
De nada!!!!!!!!!
Pero............te sirvio o no????
Salu2!!!!!!!
116
« en: Domingo 30 de Mayo de 2004, 23:44 »
Hola!!!!!!!! Con el metodo charAt(Posicion) creo q se puede hacer todo. No diga q sea simple, pero si q no es algo imposible de hacer. Es mas bien largo y aburrido lo q tenes q hacer, pero deberia salir con un poco de "horas silla". Creo q lo mas feo es lo de los numeros, salvo q si tenes esto: "123" debas sacar por pantalla "uno dos tres". Eso no es dificil, lo dificil seria sacar esto "ciento veintitres". Ahi, la cosa se complica y bastante. Pero hay q empezar por algo, no???? Salu2!!!!!!
117
« en: Viernes 28 de Mayo de 2004, 15:21 »
El NULLPointerException lo devuelve porque no habras instanciado algo pero si compila pero no anda. No entiendo q puede llegar a ser, pero si te puedo pasar un codigo, la respuesta es si, te doy un servlet q tira una consulta, ahi va:
package mcpatos;
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*;
/** * <p>Title: Mc Pato's</p> * <p>Description: Delivery de Comidas Rapidas</p> * <p>Copyright: Copyright © 2004</p> * <p>Company: Gonzalez & Tavasci</p> * @author Gonzalez Nicólas, Tavasci Dozo Pablo * @version 1.0 */
public class ServletLogueo extends ServletBase {
/** Procesa la petición del método post. * @param request * @param response * @throws ServletException * @throws IOException*/ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if ((request.getParameter("AccionServidor")).equals("AccionIngresoUsuarios")) doLogin(request, response); if ((request.getParameter("AccionServidor")).equals("AccionCerrarSesion")) doCloseSession(request, response); }
/** Metodo que despacha a distintas paginas de acuerdo a si el usuario * se encuentra registrado o no * @param request * @param response * @throws ServletException * @throws IOException*/ private void doLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); session = request.getSession(true); session.setMaxInactiveInterval(300); //Seteamos 5 minutos de sesión por default
String Username = request.getParameter("username"); String Password = request.getParameter("password");
//Verifico el nombre de usuario y contraseña //donde username y password son los nombres de los edit text de la //pagina HTML de inicio if (isRegistered(Username, Password)) { GoToPage("/SitioMc/Consultas/Usuario.jsp", request, response); } else GoToPage("/SitioMc/Errores/UsuarioNoRegistrado.html", request, response); }
/** Metodo que verifica si el usuario ingresado esta registrado * @param username * @param password * @returns true o false */ private static boolean isRegistered(String username, String password) { if ((username == null) || (password == null)) return false;
boolean success = false; java.sql.Statement ibLogin = null; java.sql.ResultSet dsLogin = null;
// Ejecuto la consulta en caso de ser posible try { ibLogin = McPatosDataBase.getConnection().createStatement(); dsLogin = ibLogin.executeQuery("select Nombre, Clave, CodigoCliente, Administrador from usuarios where nombre = '" + username + "' and clave = '" + password + "'"); } // Atrapo la excepcion correspondiente a la consulta catch (java.sql.SQLException e) { System.out.println ("Error al tirar el select a Usuarios."); showSQLException (e); } // Analizo los resultados de la consulta y los comparo contra los // recibidos por parámetro try { while (dsLogin.next()) { if ( (username.equals(dsLogin.getString("Nombre"))) && (password.equals(dsLogin.getString("Clave"))) ) { session.setAttribute("Nombre",username); String customerCode = dsLogin.getString("CodigoCliente"); session.setAttribute("Codigo",customerCode); session.setAttribute("Administrador",dsLogin.getString("Administrador"));
if (dsLogin.getInt("CodigoCliente") > 0) { try { dsLogin = ibLogin.executeQuery("select Nombre from Clientes where codigo = '" + customerCode + "'"); dsLogin.next(); session.setAttribute("Nombre", dsLogin.getString("Nombre")); success = true; } catch (java.sql.SQLException e) { System.out.println ("Error al tirar el select a Clientes."); showSQLException (e); } } else { session.setAttribute("Nombre", username + " - Personal del local"); success = false; } } }
try { if (dsLogin!=null) dsLogin.close (); } catch (java.sql.SQLException e) { showSQLException (e); } try { if (ibLogin!=null) ibLogin.close (); } catch (java.sql.SQLException e) { showSQLException (e); }
} // Atrapo la excepcion correspondiente a la navegacion de los resultados catch (java.sql.SQLException e) { System.out.println ("Incapaz de navegar por los resultados de la consulta dsLogin"); showSQLException (e); } // En caso de no existir el registro en la base de datos, el metodo // devuelve false return success; }
/** Metodo que cierra la sesion y despacha al inicio del Sitio * @param request * @param response * @throws ServletException * @throws IOException*/ private void doCloseSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); session.setAttribute("Carrito", null); session = null; GoToPage("/SitioMc/index.html", request, response); }
}
118
« en: Jueves 27 de Mayo de 2004, 17:10 »
Te lo mande y ni un gracias, flojo de tu parte man, me tomo el trabajo de buscarlo, acomodarlo un poco y nada!!
Salu2!!!!!!!!!
119
« en: Jueves 27 de Mayo de 2004, 16:48 »
Hola!!!!!
Proba poniendo a con como miembro static del servlet ConsultaServlet asi:
public class ConsultaServlet extends HttpServlet{ private static Connection con = null; //Puede ser protected en caso q heredes de este //servlet y necesites la conexion en los hijos Un metodo static es un metodo q no "ve" a this, o sea, se lo puede llamar sin instancias de la clase y un atributo static es un atributo q se mantiene durante la vida de la clase.
Luego en el init() instancias "con" usando getConnection() y acordate q eso te va a andar.
En el destroy del servlet, hace un close de la conexion a la base. Fijate en el close de la clase q te mande como se hace!!
Salu2!!!!!
Responde si anduvo o no
120
« en: Jueves 27 de Mayo de 2004, 16:35 »
Qlix=D! : tenes razon en lo q decis. Yo deberia haber explicado lo q pusiste sobre los destructores virtuales y re-coincido con vos q el hecho de tener destructores virtuales no implica clases abstractas.
Salu2!!!!!!
122
« en: Jueves 27 de Mayo de 2004, 15:16 »
Hola!!!!!!
Lo q haces mal creo es cuando llamas al getConnection() porque le pasas un solo parametro y lo otro es q no cargas los drivers de la base de datos. Mira este .java q mando q se conecta a una base de datos de Interbase. Es una clase q maneja eso con un constructor privado. Creo q esta buena, ahi va:
package mcpatos;
/** * <p>Title: Mc Pato's</p> * <p>Description: Delivery de Comidas Rapidas</p> * <p>Copyright: Copyright © 2004</p> * <p>Company: Gonzalez & Tavasci</p> * @author Gonzalez Nicólas, Tavasci Dozo Pablo * @version 1.0 */
public class cDataBase { /** Driver de la base de datos */ private static java.sql.Driver Driver = null; /** Conexion a la base de datos */ private static java.sql.Connection Connection = null; /** Instancia de la clase cDataBase */ private static cDataBase Instance = null;
/** Constructor privado. Llama al metodo Connect()*/ private cDataBase() { this.Connect(); }
/** Metodo static q llama al constructor privado * @returns Instancia unica de la clase */ public static cDataBase getInstance() { if (Instance == null) Instance = new cDataBase(); return Instance; }
/** * @returns Conexion a la base de datos*/ public java.sql.Connection getConnection() { return this.Connection; }
/** Metodo que se conecta a la base de datos de la aplicacion */ private void Connect() { String databaseURL = "jdbc:interbase://localhost/C:/Resin/doc/BaseGDB/base.gdb"; String user = "SYSDBA"; String password = "masterkey"; String driverName = "interbase.interclient.Driver";
try { // Carga del driver en memoria. try { Class.forName(driverName); } catch (java.lang.ClassNotFoundException e) { System.out.println ("InterClient no se encuentra definido en el class path."); System.out.println (e.getMessage ()); return; }
// A esta altura el driver debería estar registrado con el driver manager. try { Driver = java.sql.DriverManager.getDriver (databaseURL); System.out.println ("InterClient version " + Driver.getMajorVersion () + "." + Driver.getMinorVersion () + " registrada con el driver manager."); } catch (java.sql.SQLException e) { System.out.println ("No se ha podido encontrar InterClient entre los drivers registrados."); return; }
// Interclient esta ahora registrado con el driver manager // Ahora se intentara conseguir una conexion con la base de datos try { Connection = java.sql.DriverManager.getConnection (databaseURL, user, password); System.out.println ("Conexion establecida."); } catch (java.sql.SQLException e) { System.out.println ("Error al establecer la conexion."); return; }
// Deshabilitacion del autocommit try { Connection.setAutoCommit (false); System.out.println ("Auto-commit deshabilitado."); } catch (java.sql.SQLException e) { System.out.println ("Error al deshabilitar el auto-commit."); return; } } finally { } }
/** Cierra la conexion a la base de datos*/ public void Close() { try { if (Connection != null) Connection.close(); } catch(java.sql.SQLException e) { System.out.println("No se pudo cerrar la conexion a la base de datos"); } } }
Salu2!!!! y responde si te sirvio o no!!!!!
123
« en: Jueves 27 de Mayo de 2004, 15:07 »
Hola!!!!!
El destructor debe ser virtual siempre q tengas herencia (publica, protegida, privada, virtual) para q se liberen todos los objetos de una forma correcta. Con el tema, de los metodos virtuales, coincido con Qlix=D! .
Salu2!!!!!
124
« en: Miércoles 26 de Mayo de 2004, 19:23 »
Gracias JuanK!!!
Te lo pregunte porque estoy empezando a hacer un mini servidor en JAVA con multiprocesamiento y queria saber si tenia q proteger la memoria compartida por los hilos, o JAVA hace algo como vos decis, o sea, q las clases mismas tienen en cuenta accesos a la memoria al mismo tiempo por dos o mas hilos distintos. Cuando lo hice en C++ tuve q ser cuidadoso en ese tema
Salu2!!!!
125
« en: Miércoles 26 de Mayo de 2004, 16:29 »
Hola Juank!!
Te hago una pregunta de ignorante: no hay Critical Sections en JAVA????
Salu2!!!!!
Páginas: 1 ... 3 4 [5] 6 7 ... 12
|
|
|