|
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 - ProfesorX
Páginas: 1 ... 15 16 [17] 18 19 ... 32
401
« en: Viernes 29 de Enero de 2010, 20:33 »
Yo pensaba que si no poniamos virtual, la funcion de la clase derivada quedaba oculta.
De hecho, si queda oculta, pero eso sucede cuando utilizamos apuntadores genericos para acceder a las clases padre/hijo, es decir, apuntadores de tipo de la clase base. Mas claro, tomado tus clases de ejemplo, prueba lo siguiente, primero sin virtual, y despues añadele virtual, y entonces si veras la difeencia: #include <iostream> using namespace std; class Base{ public: void func(int a) { cout << "Estoy en la clase Base" << endl; } }; class Derivada : public Base{ public: void func(int a) { cout << "Estoy en la clase Derivada" << endl; } }; int main() { Base *a[2]; a[0] = new Base(); a[1] = new Derivada(); for (int i = 0; i < 2; i++) { a[i]->func(0); } for (int i = 0; i < 2; i++) { delete a[i]; } return 0; }
Mas informacion: http://es.wikipedia.org/wiki/Funci%C3%B3n_virtualSaludos
402
« en: Viernes 29 de Enero de 2010, 19:44 »
sprintf (abreviacion de string printf), funciona igual que printf, solo que en lugar de mandar el resultado a pantalla, lo manda a una cadena (string). De esa forma fue posible utilizarlo para generar la cadena de formato dinamicamente, y luego usar esa cadena para mostrarla en pantalla por medio del printf normal.
Tambien existe la funcion fprintf, que es igual que las anteriores salvo que envia el resultado a un archivo en lugar de a la pantalla o a una cadena.
403
« en: Viernes 29 de Enero de 2010, 02:50 »
Puedes usar sprintf para generar tu cadena formateada, y luego la imprimes con printf de la siguiente manera: #include <stdio.h> #include <stdlib.h> int decimales; float numero; char cadena_formateada[256]; int main() { printf("Numero a leer: "); scanf("%f", &numero); printf("Cuantos decimales: "); scanf("%d", &decimales); sprintf(cadena_formateada, "%%.%dfn", decimales); printf(cadena_formateada, numero); system("pause"); return 0; }
Saludos
404
« en: Miércoles 27 de Enero de 2010, 03:29 »
Antes que nada, cuando publiques codigo, usa las etiquetas [ code][ /code] (sin espacios entre corchetes) para que tu codigo sea mas legible. No es gran ciencia, tu variable m es de tipo int** (apuntador a apuntador de entero), por lo tanto asi lo debes declarar en la cabecera de tu funcion. void escribemat(int **t,int nf,int nc)
y la llamada a tu funcion, escribela sin el &, puesto que m ya contiene una direccion al ser apuntador, por lo que no se necesita el & Pero revisando tu codigo, he notado que no liberas de manera correcta tus punteros, debes usar un ciclo adicional para eliminar, igual que usas un ciclo al principio para crear. Lee el siguiente enlace para que veas que te falta: http://c.conclase.net/curso/index.php?cap=017Saludos
405
« en: Martes 26 de Enero de 2010, 01:05 »
mi problema es que me hace la suma de los primos de cada fila y no se como hacer la para que me de la suma pero de todos los numeros primos que estan dentro. Por fin, tienes que hacer la suma de todos los impares? o de todos los primos? Por el codigo que pones, parece que es la suma de todos los pares, de ser asi, solo agrega una variable adicional, llamada suma_total, y ahi guarda la suma. #include<stdio.h> #define COLUMNAS 5 #define FILAS 5 int main() { int Matriz[FILAS][COLUMNAS]; int i, j, suma[FILAS]= {0,0,0,0,0}; // Añade esta variable int suma_total = 0; for(i=0; i<FILAS ;i++) for(j=0; j<COLUMNAS; j++) { printf("Ingrese el elemento FILA:%d y COLUMNA:%d de la matriz.n",i, j); scanf("%d",&Matriz[i][j]); if(Matriz[i][j]%2 ==1) { suma[i]= suma[i] + Matriz[i][j]; // Añade esta suma suma_total = suma_total + Matriz[i][j]; } } printf("La matriz generada es :nn"); for(i=0; i<FILAS; i++) { for(j=0; j<COLUMNAS; j++) { printf(" %d ",Matriz[i][j]); } printf("n"); } for(i=0; i<FILAS; i++) printf("La suma de la fila %d es %d n",i, suma[i]); // Imprimir la suma printf("Suma total de impares de la matriz %d n", suma_total); }
@player_Por tu respuesta, me parece que eres un Trol, aun asi te contestare solo por esta vez. Yo no hice la regla acerca de las tareas, ese es reglamento del foro, si no lo has leido, pasate por aqui: Antes de postearPor otro lado, cuando alguien pide ayuda, yo casi nunca doy codigos completos, la mayoria de las veces solo doy pistas, o fragmentos pequeños de codigo, a menos que la solucion sea tan pequeña que entonces si merezca publicar un codigo entero, aun asi, nunca pasa unas cuantas lineas. Y respecto a cuando alguien pregunta por aplicaciones completas, nunca contesto esos hilos ya que la respuesta en esos casos es mucho mas que una simple "ayuda". Asi que en ningun momento estamos siendo radicales como mencionas. Asi que resumiendo, si quieres, eres libre de darle la respuesta completa a quien tu quieras, aunque corres el riesgo de que algun moderador te borre el mensaje dado que es regla del foro no hacer las tareas. Saludos
406
« en: Sábado 23 de Enero de 2010, 20:40 »
de esto depende que pase la materia si no me van a dar vancaciones 6 meses y no quiero.  Pues entonces comienza a hacerlo, porque aqui no se hacen tareas. Cuando lo comiences a hacer, y si tienes algun problema con la compilacion, entonces publica tu codigo y te ayudaremos, en caso contrario, no te haremos el trabajo. Saludos
407
« en: Martes 19 de Enero de 2010, 20:10 »
Tomando de ejemplo la estructura que pusiste en tu primer mensaje, seria algo como: #include <cstdio> struct info{ char nombre [20]; int numero [10]; }plantilla[10]; void funcion1(info plantilla[]) { } int main() { funcion1(plantilla); return 0; }
408
« en: Martes 19 de Enero de 2010, 19:36 »
No he trabajado con hilos, pero me parece que crear un hilo solamente para mostrar una ventana de "Cargando, espere" es algo excesivo. Por otro lado, aunque dezconozco exactamente que hace tu programa, por lo poco que mencionas, me parece que mientras estas cargando tu informacion, no puedes seguir adelante con el resto de tu programa por lo que el hilo adicional en realidad es inutil. El uso de hilos es generalmente cuando en tu aplicacion tienes dos o mas procesos completamente independientes, y necesitas que se ejecuten simultaneamente para poder ahorrar tiempo, pero en tu caso, mientras no cargues tus datos, no puedes continuar, por lo que no hay ahorro de tiempo. En todo caso, si lo que quieres es solo una ventana de "Cargando, Espere" o quizas una barra de progreso, deberias usar en su lugar Delegados Y Eventos. Entonces, cuando comiences a cargar la base de datos, creas la pantalla de espera, y cuando se genera el evento de carga completa, entonces cierras/destruyes la ventana de espera. Todo sin necesidad de hilos. El mejor ejemplo de delegados y eventos lo tienes con los Controles Comunes de System.Windows.Forms. Cuando tu añades un Button por ejemplo, creas el evento click. Tu programa no se detiene mientras espera a que pulses clck en el boton, sino que sigue adelante y puedes hacer otra cosa dentro de tu mismo formulario. Pero gracias a los eventos, cuando tu haces click en el boton, tu programa deja cualquier cosa que este haciendo y va al codigo de tu evento click. Resumiendo, ese seria mi consejo. Busca informacion sobre delegados y eventos, y utilizalos en lugar de hilos. Saludos
409
« en: Martes 19 de Enero de 2010, 01:17 »
mi pregunta es como puedo pasar ese arreglo de estructura a una función por referencia y por valor.
Los arreglos en C/C++ siempre se pasan por referencia, no es posible pasarlos por valor. Saludos
410
« en: Lunes 18 de Enero de 2010, 20:04 »
Luna, ya te dijeron como: Si con las comillas simples no te va, prueba sin ellas. sin comillas debe funcionar, o sea: SELECT * FROM usuarios WHERE password=SHA1(@contrasena) AND nombre_usuario= @nom LIMIT 0, 1;
411
« en: Lunes 18 de Enero de 2010, 19:33 »
No funcionan los links de los manuales de C++
Alguien podria ponerlos de nuevo?  Juntaron el hilos de los manuales de C++ con los de C, por lo que los manuales estan en el hilo de C: http://foros.solocodigo.com/viewtopic.php?t=20955Saludos
412
« en: Sábado 16 de Enero de 2010, 20:56 »
En el ejemplo que pones desafortunadamente es demasiado pequeño, y no es posible ver cual sea el problema. Aparentemente la sentencia es correcta, pero creo que se necesita una parte mayor de tu codigo mas representativa para poder averiguar el problema. Respecto a rand(), la funcion rand() genera siempre el mismo numero aleatorio (o mas correctamente, pseudo-aleatorio), a menos que utilices al principio de tu programa srand ( time(NULL) ); Saludos
413
« en: Sábado 16 de Enero de 2010, 20:33 »
Primero que nada te dire que tienes que crean un DataGridView nuevo, no se si ya hayas hecho eso. Debe ser uno nuevo, sin nada, no puedes usar uno que ya hayas llenado antes con un DataTable. Luego, añadele manualmente (desde el diseñador) el numero de columnas que quieres que tenga tu rejilla, esto se hace por medio de la Propiedad Colums de tu DataGridView, repito, desde el diseñador. Finalmente, en el codigo del evento click de tu boton Agregar, usa el metodo Add de la propiedad Rows de tu DataGridView, y coloca cada una de tus variables en la lista. Para mayor claridad, suponiendo que tu datagrid se llama dgvDetalleVenta y que quieres añadir 11 valores, tendrias que crear tu rejilla con 11 columnas, y luego usar el siguiente codigo: private void cmdAgregar_Click(object sender, EventArgs e) { dgvDetalleVenta.Rows.Add( id_producto, id_proveedor, descripcion, tipo, color, ancho, largo, pc, pv, marca, stock ); }
Espero te sirva y me hayas entendido. P.D.: Leete la documentacion completa en MSDN del control DataGridView, revisa los ejemplos de cada una, porque me parece que no te los has leido completos. Saludos
414
« en: Miércoles 13 de Enero de 2010, 21:26 »
415
« en: Lunes 11 de Enero de 2010, 21:33 »
Me parece que estas definiendo mal tus dependencias, ya que si la dependencia como mencionaste en tu primer post va asi: Bancos <------------ Reglas <------------- Datos. Entonces en Datos no deberias referenciar clases que tienes en Reglas (en este caso Cuentas), ya que Reglas depende de Datos, no Datos de Reglas. Elimina la clase Cuentas del namespace Reglas, y pasala al namespace Datos. Si crees que Cuentas en realidad pertenece a Reglas y no a Datos, quizas debas rediseñar tu modelo y tus clases. Solo estoy suponiendo, ya que desconozco totalmente la manera en como lo estas implementando, pero quizas si lo que quieres es tener un acceso de bajo nivel a Cuentas, quizas debas una Clase Padre adicional Cuentas, y de ahi, heredar a segun los Tipos de Cuenta que quieras tener (Ahorros, Cheques, Inversiones), no se, es solo una idea, en ese caso la clase Cuenta iria en Datos y las clases CuentaAhorros, CuentaCheques, CuentaInversiones si irian en Reglas. Saludos
416
« en: Sábado 9 de Enero de 2010, 22:28 »
Bueno, la solucion que te mencionaba antes seria algo como: b = 0; a = 1; while (a < longitud_c) { while (array_c[b] == array_c[a] && a < longitud_c) { for (int i = a; i < longitud_c - 1; i++) { array_c[i] = array_c[i+1]; } longitud_c--; } b++; a++; }
Ahora, debo decir que este algoritmo no es muy eficiente, ya que en el peor de los casos, (que los repetidos esten al principio) tienes que recorrer casi todos los elementos del vector. La solucion que plantea Aragorn_montaraz de ir juntado los dos vectores en unos solo, pero pasando solamente los no repetidos, realmente creo que es mas eficiente, aun cuando su implementacion es mas compleja. En programacion siempre te encontraras casos asi, ya que casi siempre hay mas de una forma de resolver un mismo problema. La solucion que elijas dependera de que es mas importante para ti, la eficiencia o la simplicidad. Habra casos en que no requieras ser muy eficiente, y te vayas por la solucion mas simple de entender e implementar, otros en que la eficiencia es lo primordial, entonces deberas hacer un esfuerzo para hacerlo mas eficiente. Eso es lo bonito de la programacion, solo eso queria añadir  Saludos
417
« en: Sábado 9 de Enero de 2010, 22:04 »
Desafortunadamente, hacer lo que dices no es tan facil como "copiar de una hoja de excel, y pasarlo a otra hoja de excel" ya que aunque un datagridview pareciera una hoja de excel no lo es, un datagridview no contiene funcionalidad para "copiar y pegar", es simplemente un control que muestra datos en forma de tabla, pero como dije antes no es una tabla en si, y tu como programador eres el que debe programar la funcionalidad que quieres que tenga el datagridview. La forma de pasar los datos de excel a un datagridview, seria "importando" los datos de excel dentro de tu programa por medio de ADO.NET a un DataSet o un DataTable, y entronces enlazar el DataSet/DataTable a tu datagridview, como si la hoja de excel fuera una base de datos. Te dejo enlaces para cadenas de conexion de Excel por medio de ADO.NET: http://www.connectionstrings.com/excel-2007http://www.connectionstrings.com/excelSaludos
418
« en: Sábado 9 de Enero de 2010, 03:49 »
Hola ermiguel1979, te dire que vas bien con tu algoritmo solo tienes un error en la linea 49: 1 No necesitas incrementar "a", ya que al salir del ciclo anterior, "a" ya tiene el valor de la siguiente posicion del vector, cuando lo incrementas en esta linea te estas saltando una posicion del vector_c, y esa posicion es probable que contenga basura, por eso al imprimir vector_c te muestra ese valor basura. Tampoco necesitas hacer b = 0 ya que en la siguiente linea en tu ciclo for ya tienes b = 0. Ademas deberias colococar un espacio vacio en tus printf despues del %i de la siguiente manera: printf("%i ", array_c[a]);
para que los numeros no te aparezcan pegados y parezcan que son un mismo numero cuando en realidad son varios numeros. Ahora, para eliminar los duplicados, una vez que ya tengas ordenado el vector, necesitas un ciclo que recorra todo el vector, comparando cada elemento con el siguiente ( array_c == array_c[i+1]), cuando sean iguales, haces un corrimiento de todo el vector hacia adelante ( array_c = array_c[i+1]), mediante otro ciclo, para que elimines el elemento, cuando termines el corrimiento, disminuyes la variable que te guarda el total de elementos de vector_c (o sea si el total de elementos de tu vector es de 10, le quitas 1 para que quede en 9, ya que eliminaste un elemento al hacer el corrimiento) y vuelves a hacer la comparacion desde el principio de cada elemento con el siguiente, asi hasta que no encuentres elementos iguales. Atento al tamaño del vector, para que al hacer la comparacion no sobrepases sus indices, o sea, si tu vector tiene 10 elementos, no puedes hacer una comparacion del elemento 10 con el 11, ya que el 11 no existe. Si le quitas un elemento es lo mismo, cuidado con pasarte de los indices, en este ejemplo, si quitas 1, te queda 9, entonces ya no puedes compara el elemento 9 con el 10 porque el 10 ya no existe (aunque fisicamente si exsita, pero tu deberas hacer como si no existiera). Con esas pistas supongo que lo podras terminar. Saludos
419
« en: Viernes 8 de Enero de 2010, 00:27 »
El error es esta linea: int[] valores = Convert.ToInt32(a);
Estas tratando de guardar un valor int en una variable de tipo int[], cuando deberias de guardar elemento por elemento, pero ademas, antes de comenzar a guardar los elementos, debes asignar espacio de memoria para tu arreglo int. La manera correcta seria: string[] nummac = mac.Split(separador); // Asignas espacio de memoria para el array int, // el tamaño debe ser el numero de cadenas (Lenght) // que hay en el arreglo nummac int[] valores = new int[nummac .Length]; int i = 0; foreach (string a in nummac) { // Guardas un valor en cada posicion valores[i] = Convert.ToInt32(a); i++; }
Saludos
420
« en: Jueves 7 de Enero de 2010, 03:43 »
Aqui no se hacen tareas. Necesitas comenzar a resolverlo tu mismo, y entonces, si tienes algun problema en especifico con la compilacion/ejecucion del programa en C/C++, puedes preguntar, de otra forma, aqui nadie hara tu trabajo. Saludos
421
« en: Miércoles 6 de Enero de 2010, 06:12 »
1. si un puntero solo almacena una direccion de memoria ¿por que al ejecutarse el el codigo la linea cout<<cadena2 no muestra una direccion de memoria sino que muestra una cadena de caracter? R.- Esto es debido a la forma en como funciona el metodo cout, el metodo cout verifica el tipo de sus parametros, y segun el tipo que sea, llama a la subrutina adecuada para mostrar esa variable en pantalla. si detecta que la variable es de tipo int, llama a la rutina para imprimir int, si detecta que es de tipo float, llama a la rutina para imprimir float, si detecta que quieres imprimir un char* o un char[], llama a la rutina de impresion de cadenas. Esto funciona asi gracias a algo lamado sobrecarga de funciones en C++. De hecho es posible crear nuevos "tipos de datos", y decirle a cout la manera en como queremos que se impriman esos datos. Busca mas informacion acerca de Sobrecarga de funciones y operadores. Antes de C++, si era necesario ser especifico en cuanto al tipo de dato a imprimir, si tu utilizas: // Muestra la direccion de la cadena printf("%x", cadena2); // Mustra la cadena printf("%s", cadena2);
El primero si te muestra la direccion en memoria de cadena2 en formato hexadecimal (%x), y el segundo te muestra cadena2 como si fuera una cadena (%s). Como dije antes, cout automaticamente verifica el tipo de parametro y llama a la rutina adecuada, cosa que printf no hacia. 2. ¿por que si en la anterior linea se coloca un * antes de cadena2, se muestra solo el primer caracter osea C?R. Esto es debido al operador *, al hacerlo, cout deja de creer que es un char* y lo toma como char. 3. es posible asignar una cadena de caracteres a un puntero de esa forma fuera de la declaracion (es decir en cualquier parte del codigo)? ¿como?.Esto ultimo no lo entendi, tendrias que replantearlo de una manera mas clara Espero haberte aclarado un poco Saludos y hasta mañana
422
« en: Martes 5 de Enero de 2010, 05:14 »
1. Estas definiendo dos veces la variable TABLA. 2. Como estas utilizando un DataTable y no un DataSet, no es necesario que le pases el nombre de la tabla al metodo Fill, debido a que el DataTable ya es una Tabla. Te dejo el codigo corregido, no lo probe, pero debe de funcionar: private void cmdbuscarf_Click(object sender, EventArgs e) { //busqueda MySqlConnection CANAL; // Elimina la siguiente linea, ya estas definiendo la variable TABLA // mas abajo // DataTable TABLA; MySqlDataAdapter ORDEN; CANAL = new MySqlConnection ("user id=root;database=tucuman;server=localhost"); string q = "select Apellido, nombre from t_empleados where id_empleado = @id_empleado"; ORDEN = new MySqlDataAdapter (q, CANAL ); ORDEN .SelectCommand.Parameters.Add(new MySqlParameter ("@Id_empleado",MySqlDbType .Int64)); ORDEN.SelectCommand.Parameters["@Id_empleado"].Value = t_legajo.Text; // Aqui estabas definiendo de nuevo a la variable TABLA, solo se permite // definirlo una vez dentro de un mismo bloque DataTable TABLA = new DataTable (); // No es necesario pasar el nombre de la tabla, ya que la variable TABLA // ya es una tabla, y no un DataSet, que es un conjunto de tablas //ORDEN.Fill(TABLA, "t_empleados"); ORDEN.Fill(TABLA); if (TABLA.Rows.Count > 0) { // Cargando el datagridview MessageBox.Show("Se encontro"); datosFamiliar.DataSource = TABLA; datosFamiliar.DataMember = "t_empleados"; } else { MessageBox.Show("no hay que mostrar"); } CANAL.Close(); }
423
« en: Lunes 4 de Enero de 2010, 22:05 »
y como se hace . . . . Creas un archivo cambiar.bat (o con cualquier otro nombre que quieras, siempre y cuando tenga la extencion .bat) con el bloc de notas, o algun otro editor de texto, pegas el comando que te puse arriba, con todo y comillas, y lo guardas en algun directorio que este en tu path, por ejemplo c:windows, para que asi lo puedas llamar no importando en que directorio estes. O tambien puedes utilizar esta forma que se me ocurrio para comenzar directamente en el directorio que quieras, simplemente crea una copia del acceso directo de simbolo de sistema, y cambia el valor que aparece en "Iniciar En:" por el valor del directorio en donde quieres comenzar, tal como lo puedes ver en la imagen siguiente, y listo:  Saludos
424
« en: Lunes 4 de Enero de 2010, 21:38 »
MySQL contiene algunas funciones de encriptacion como AES_ENCRYPT, MD5() Y SHA1(), podrias utilizar esas. Por ejemplo para encriptar con SHA1(), que genera claves de 40 caracteres, añade una columna varchar(40) a tu tabla de usuarios, y luego simplemente inserta la clave de la siguiente manera: INSERT INTO usuarios (nombre_usuario, password) VALUES ('nombre_usuario', SHA1('password'));
y despues para comprobar la clave simplemente la lees, la encriptas de nuevo, y comparas la cadena recien encriptada, con el valor guardado, por ejemplo: SELECT nombre_usuario, password FROM usuarios WHERE nombre_usuario = 'nombre_usuario' AND password = SHA1('password');
Consulta la documentacion de MySQL en la parte de "Encryption and Compression Functions" para ver la sintaxis de las otras funciones y su uso. Saludos
425
« en: Lunes 4 de Enero de 2010, 20:48 »
Utiliza un DataTable en lugar de un DataSet DataTable TABLA = new DataTable ();
Y luego utilizar la propiedad Rows.Count del DataTable: if (TABLA.Rows.Count > 0) { // Cargando el datagridview MessageBox.Show("Se encontro"); datosFamiliar.DataSource = TABLA; datosFamiliar.DataMember = "t_empleados"; } else { MessageBox.Show("no hay que mostrar"); }
Páginas: 1 ... 15 16 [17] 18 19 ... 32
|
|
|