• Viernes 14 de Marzo de 2025, 23:17

Mostrar Mensajes

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 ... 7 8 [9] 10 11 ... 32
201
C/C++ / Re: programa C++
« en: Viernes 24 de Junio de 2011, 04:03 »
No se hacen tareas

202
C# / Re: Como iterar un boton
« en: Miércoles 22 de Junio de 2011, 07:15 »
No se a que te refieres exactamente con eso de "iterar un boton", deberias ser mas explicito.

Si acaso te refieres a que deseas crear un array de botones, quizas te falte definir el array de la siguiente manera:

Código: C#
  1.  
  2.             Button[] button = new Button[10];
  3.  
  4.  

Si no es eso, especifica un poco mejor que quieres hacer.

Saludos :)

203
C/C++ / Re: Problema con fread()
« en: Miércoles 22 de Junio de 2011, 03:27 »
Encontre la fuente de tu problema.

Resulta que bajo windows hay 2 modos de abrir los archivos, en modo binario y en modo texto.

En modo texto la secuencia 0A en este caso se traduce erroneamente como el fin de una linea, entonces al leer/escribir divide el contenido en lineas, y por eso trunca el contenido. De hecho, el tamaño de tu archivo era de 101 bytes y no 100 bytes (25x4) como debia ser, ya que convertia el 0A en 0D 0A al escribir. En windows cada linea lleva un retorno de carro / avance de linea, en linux solo existe el avance de linea 0A, y todos los archivos se manejan como si fueran binarios.

Si no especificas el modo, los archivos se abren por defecto en modo texto.

La solucion es especificar explicitamente que vas a abrir el archivo en modo binario, de esa forma se elimina el problema.

Debes cambiar las siguientes lineas:

Código: C++
  1.     flujo = fopen(archivo, "w");
  2.  

por

Código: C++
  1.     flujo = fopen(archivo, "wb");
  2.  
y

Código: C++
  1.     flujo = fopen(archivo, "r");
  2.  

por

Código: C++
  1.     flujo = fopen(archivo, "rb");
  2.  


Saludos :)

204
C/C++ / Re: Ejemplo Makefile Opencv2.2
« en: Martes 21 de Junio de 2011, 15:18 »
Cita de: "roleiland"
Si me permitis publicar links os subo el código.

El foro bloquea la publicacion de links a los nuevos, para evitar a aquellos que solo publican SPAM.

Despues de que tengas publicados 20 mensajes en el foro, se desbloquea automaticamente la publicacion de links, mientras no se puede hacer mas, asi que te toca esperar.

Saludos :)

205
C/C++ / Re: lista circular simple :3
« en: Martes 21 de Junio de 2011, 07:16 »
Cita de: "yuikoheartless"
lo extraño es que lo compile y ejecute, y hace lo mismo que el mio

Ayer te comentaba que al parecer no lo estabas haciendo de manera correcta, ya que no tuve tiempo de revisarlo todo, hasta te dije que no necesitas el apuntador al ultimo, y ademas te deje enlaces para que los revisaras por ti mismo, pero al parecer hiciste caso omiso, si los hubieras revisado, hubieras comprobado que si, la insercion la haces mal, y al hacer la insercion mal, mostrara los datos mal.

Como consejo, debes ser un poco mas autodidacta, y si alguien te deja enlaces, revisalos, no solo esperes que te hagan el trabajo, no siempre habra gente que haga las cosas por ti.

Dicho eso, te dejo el codigo corregido como deberia ser, revisalo y analizalo. Espero que la siguiente vez si alguien te deja enlaces para leer, lo hagas y puedas corregir los errores por ti mismo.

Saludos :)

Código: C++
  1.  
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <iostream>
  7. //LISTA CIRCULAR
  8. using namespace std;
  9.  
  10. struct listac
  11. {
  12.     int valor;
  13.     listac *sgte;
  14. };
  15.  
  16. bool vacia(listac *inicio)
  17. {
  18.     bool v=false;
  19.     if(inicio==NULL)
  20.         v=true;
  21.     return v;
  22. }
  23.  
  24. void ingresar(listac **inicio)
  25. {
  26.     cout<<"Ingrese un numero: ";
  27.     listac *p;
  28.     p = new listac;
  29.     cin>>p->valor;  
  30.     cout<<endl;
  31.     if(vacia(*inicio)==true)
  32.     {
  33.         *inicio = p;
  34.     }
  35.     else
  36.     {
  37.         p->sgte = (*inicio)->sgte;
  38.     }
  39.     (*inicio)->sgte = p;
  40. }
  41.  
  42. void mostrar(listac *inicio)
  43. {
  44.     listac *recorre;
  45.     if (inicio != NULL)
  46.     {
  47.         recorre =  inicio;
  48.         do {
  49.             cout << recorre->valor << " " << endl;
  50.             recorre = recorre->sgte;
  51.         } while (recorre != inicio);
  52.     }
  53. }  
  54.  
  55. int main(int argc, char *argv[])
  56. {
  57.     listac *inicio;
  58.     inicio=NULL;
  59.     for(int i=1;i<=5;i++)
  60.     {
  61.         ingresar(&inicio);
  62.     }
  63.     mostrar(inicio);
  64.     system("PAUSE");
  65.     return EXIT_SUCCESS;
  66. }
  67.  
  68.  

206
C/C++ / Re: lista circular simple :3
« en: Lunes 20 de Junio de 2011, 06:57 »
Hola yuikoheartless, bueno, revise tu programa de manera rapida (aqui en mexico son las 11:30 pm, ya casi es hora de irme a dormir  :D ), y me parece que no lo estas haciendo de manera correcta. Yo diria que solo necesitas el apuntador del inicio de la lista circular, y no dos como estas manejando, (uno para el inicio y uno para el final), el apuntador al inicio es solo para tener un elemento desde donde poder comenzar a imprimir la lista, y saber donde detenernos pero bueno, como dije antes ya es tarde y no tengo mucho tiempo para revisar todo el programa.

En fin ya que dices que solo te falla el algoritmo mostrar, dire que te falta utilizar un ciclo para recorrer la lista, en tu funcion mostrar solo tienes un if, asi que por eso no puedes imprimir toda la lista. A continuacion te dejo la funcion de mostrar como pienso que deberia ser.

Ademas, al final te dejo 2 enlaces a la teoria de listas enlazadas y circulares, uno en ingles y el otro en español, esto para que le des una leida y te des una mejor idea de como debes implementarlo.

Código: C++
  1.  
  2. void mostrar(listac *inicio)
  3. {
  4.     listac *recorre;
  5.     if (inicio != NULL)
  6.     {
  7.         recorre =  inicio;
  8.         do {
  9.             cout << recorre->valor << " " << endl;
  10.             recorre = recorre->sgte;
  11.         } while (recorre != inicio);
  12.     }
  13. }  
  14.  
  15.  

http://en.wikipedia.org/wiki/Linked_list

http://c.conclase.net/edd/index.php?cap=004#inicio

Saludos y suerte :)

207
C/C++ / Re: Se puede aplicar un memcpy a dos estructuras diferentes
« en: Sábado 18 de Junio de 2011, 01:52 »
En tu ejemplo, estas definiendo struct A dos veces, supongo que la segunda en realidad era struct B, ademas en la primer estructura A, pones dos miembros b, supongo tambien que debio ser miembro d el cuarto, pero bueno dices que lo escribiste a la rapida, sin embargo, te lo aclaro, no sea que te vayas con una idea errada si no esta bien definido.

Ahora, respondiendo a tu pregunta, suponiendo que defines tu estructura A, con sus miembros exactamente del mismo tipo y en el mismo orden que estructura B, de la siguiente manera:

Código: C++
  1.  
  2. typedef struct A
  3. {
  4.     int a;
  5.     float b, c;
  6.     int d;
  7. };
  8.  
  9. typedef struct B
  10. {
  11.     int a;
  12.     float b, c;
  13. };
  14.  
  15.  

dire que SI, tu suposicion es correcta, el contenido de los miembros a, b y c se copiaran de B a A en el primer caso, y el contenido de a y b, en el segundo caso.

Pero cuidado aqui, usar memcpy puede ser peligroso a menos que sepas exactamente lo que estas haciendo, ya que no comprueba la variable destino, para verificar que sea del tamaño adecuado, ni tampoco que lo que estes haciendo sea lo correcto o este en el orden correcto.

Por ejemplo, supongamos que inviertes la definicion de los miembros, de la siguiente manera:

Código: C++
  1.  
  2. typedef struct A
  3. {
  4.     int a;
  5.     float b, c;
  6.     int d;
  7. };
  8.  
  9. typedef struct B
  10. {
  11.     // invierto la definicion
  12.     float b, c;
  13.     int a;
  14. };
  15.  
  16.  

Entonces en este caso, lo que sucederia es que el contenido de struct B float b, se guardaria en struct A int a, y el contenido de struct B float c se guardaria en struct A float b, ya que ambos tipos float e int, se almacenan en 4 bytes. Ocurriria algo mas grave si en lugar de float utilizaras double, ya que double ocupa 8 bytes, entonces no coincidiria el tamaño del tipo origen con el tipo destino, ¿te das cuenta a que me refiero?

Dicho eso, y como dije antes, solo ten cuidado al usar memcpy y asegurate de saber lo que haces.

Saludos :)

208
C/C++ / Re: Escribir NULL en archivo
« en: Viernes 17 de Junio de 2011, 18:37 »
El problema es que estas utilizando fprintf para guardar en el archivo, y fprintf se utiliza para cadenas. Las cadenas en C/C++ terminan con nulo, entonces al querer guardar, interpreta el nulo como el fin de la cadena, y por eso te la pone vacia, ya que tienes el nulo al principio del apuntador a char. Si el nulo estuviera al final, (a[0]='b'; a[1]=0x00;), entonces te guardaria solamente la b, sin el nulo.

La solucion es que utilices fwrite() en lugar de fprintf(), fwrite() escribe bloques de datos, sin importar que contengan, ya que no se basa en el NULL para determinar el final, sino se le pasa como parametro la cantidad de bytes que se van a guardar.

Ademas, recuerda siempre liberar tu memoria cuando termines de utilizarla, para no tener fugas de memoria (memory leaks).

Te dejo el codigo corregido usando fwrite()

Código: C++
  1.  
  2. #include <cstdio>
  3. #include <cstdlib>
  4.  
  5. int main(int argc, char** argv)
  6. {
  7.  
  8.     char* a=(char*)malloc(sizeof(char)*2);
  9.    
  10.     a[0]=0x00;
  11.     a[1]='b';
  12.  
  13.     FILE* fd=NULL;
  14.     fd=fopen("archivo.bla","wb");
  15.     // Utiliza fwrite en lugar de fprintf
  16.     fwrite(a,sizeof(char)*2,1,fd);
  17.     fclose(fd);
  18.     // Recuerda siempre liberar la memoria cuando ya no la utilizes
  19.     free(a);
  20.     return 0;
  21. }
  22.  
  23.  

Saludos :)

209
C# / Re: Consulta rápida
« en: Miércoles 15 de Junio de 2011, 08:44 »
Tienes varias opciones.

1. Puedes declarar el objeto en el formulario en lugar de en Program.
2. Pudes declarar el objeto en la clase Program como de tipo static public, y usar algo dentro de tu formulario como  Program.MiObjeto.
3. Puedes pasarle el objeto por medio de parametros a tu  Formulario.

210
C/C++ / Re: Atof hace cosas distintas!!! ¿Cual es el problema?
« en: Miércoles 15 de Junio de 2011, 07:49 »
Cita de: "tiwanacote"
Lo que no entiendo es porque si yo defino la variable "numero" como DOUBLE en donde podría representar hasta 15 dígitos, cuando convierto 7 dígitos con "atof" y uso "setpresicon(20)  para imprimir el resultado, obtengo basura en el dígito 8,9,10...

Ya te explique el porque, pero vamos de nuevo a aclarar algunos conceptos mas, que quizas te ayude a comprender mejor.

En primer lugar, no es "basura" como la llamas, es como dije antes, un error de redondeo, y esto ocurrira siempre, algunas cantidades pareceran correctas, pero en otras se notara este error de redondeo.

El que puedas representar un numero de 15 digitos, con double, no significa que este numero sera exacto, el formato y el estandar IEEE 754 de los double, no dice nada de que seran 15 digitos significativos sin error. (a diferencia del tipo Decimal que existe en C# como dije antes, que ahi si se garantiza una precision sin error en los digitos significativos de 28). Lee lo siguiente, (en ingles) ahi viene mas explicado el porque:

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

Por ultimo, el compañero su ya te dio una alternativa, si de veras te preocupa la exactitud, utiliza la libreria qe te recomendo.

Saludos :)

211
C/C++ / Re: fgets y línea innecesaria
« en: Domingo 12 de Junio de 2011, 03:18 »
Cita de: "Amphoth3ra"
¿Existe otra manera de que yo pueda guardar el string sin el salto de línea?

Bueno, podrias usar la funcion strchr() para buscar el caracter de salto de linea, y reemplazarlo con el caracter de fin de cadena. De esa manera te evitarias ese problema. A continuacion te dejo el codigo de como hacerlo:

Código: C++
  1.  
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5.  
  6. struct dvd {
  7.     char name[255];
  8.     char genero[50];
  9.     int discs_number;
  10.     int length;
  11. };
  12.  
  13. int main()
  14. {
  15.     struct dvd temporal;
  16.     char discs_number[2];
  17.     char length[4];
  18.     char *pch;
  19.  
  20.     printf("Nombre del DVDn");
  21.     fgets(temporal.name, 255, stdin);
  22.     // Buscas la posicion del caracter nueva linea (10) en la cadena
  23.     pch = strchr(temporal.name, 10);
  24.     // Si la encontro, reemplazas nueva linea con nulo, que es el fin
  25.     // de cadena ('')
  26.     if (pch != NULL)
  27.     {
  28.         *pch = '';
  29.     }
  30.  
  31.     printf("%sn", temporal.name);
  32.  
  33.     printf("Género del DVDn");
  34.     fgets(temporal.genero, 50, stdin);
  35.     pch = strchr(temporal.genero, 10);
  36.     if (pch != NULL)
  37.     {
  38.         *pch = '';
  39.     }
  40.  
  41.     printf("%sn", temporal.genero);
  42.  
  43.     printf("Número de discos del DVDn");
  44.     fgets(discs_number, 2, stdin);
  45.  
  46.     temporal.discs_number = atoi(discs_number);
  47.  
  48.     printf("%dn", temporal.discs_number);
  49.  
  50.     printf("Duración del DVDn");
  51.  
  52.     while(getchar() != 'n');
  53.     fgets(length, 4, stdin);
  54.  
  55.     temporal.length = atoi(length);
  56.  
  57.     printf("%dn", temporal.length);
  58.  
  59.     printf("%s %s %d %d", temporal.name, temporal.genero, temporal.discs_number, temporal.length);
  60.     return(0);
  61. }
  62.  
  63.  

Ojala se adapte a lo que necesitas.

Saludos :)

212
C/C++ / Re: Atof hace cosas distintas!!! ¿Cual es el problema?
« en: Viernes 10 de Junio de 2011, 04:32 »
Haz descubierto el error de redondeo de los numeros en punto flotante. Bienvenido al mundo de los numeros aproximados en computadoras ;)

El problema no esta en la funcion atof(), desafortunadamente el problema esta en la manera como se almacenan los numeros de punto flotante internamente. Dado que al guardar un numero en la computadora no podemos guardar una infinita cantidad de digitos (que seria lo ideal, para poder representar cualquier numero), se elige una cierta cantidad de bytes para representar los digitos, con exponente y la mantisa. Pero ocurre que al estar limitados en cuanto a espacio, al hacer la conversion siempre habra algun error de "redondeo" a la hora de almacenar el numero.

En algunos casos y con algunos numeros no habra error de redondeo, pero en otros casos, como bien acabas de descubrir, el error en el redondeo se hara evidente. Entonces lo que ocurre en tu programa, es que cuando conviertes el numero a doble con atof, aparece el error, y despues cuando le restas el mismo numero, al volverlo a convertir internamente a double, vuelve a ocurrir el mismo error de redondeo, entonces los dos numeros se convierten interna y equivocadamente en el mismo y por lo tanto se anulan. Por eso tu resta da cero.

Puedes comprobar tu mismo como se guarda internamente el digito en el depurador examinando el contenido de las variables, o con el siguiente programa puedes verificar que el numero que se guarda en realidad no es el mismo numero exacto que escribiste, debido al redondeo.

Código: C++
  1.  
  2. #include <fstream>
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <string>
  6. #include <iomanip>
  7.  
  8. int main()
  9. {
  10.     using namespace std;
  11.  
  12.     cout.setf(ios::fixed);
  13.     cout.setf(ios::showpoint);
  14.  
  15.     double numero_salida = 0;
  16.  
  17. // PRIMER NUMERO
  18.     numero_salida = 123.456789;
  19.     cout << "El numero 1 es: " << setprecision(20) << numero_salida << endl;
  20.  
  21. // SEGUNDO NUMERO
  22.     numero_salida = 12.456789;
  23.     cout << "El numero 2 es: " << setprecision(20) << numero_salida << endl;
  24.  
  25. // TERCER NUMERO
  26.     numero_salida = 1.456789;
  27.     cout << "El numero 3 es: " << setprecision(20) << numero_salida << endl;
  28.  
  29.     return (0);
  30.  
  31. }
  32.  
  33.  

Hay que tener este redondeo en cuenta siempre, y es por eso que para programas que requien un alto grado de precision en cuanto a digitos, se ocupan otras alternativas en lugar de usar double. Esa tambien es la razon por la que en C# existe un nuevo tipo llamado Decimal que utiliza 128 bits para almacenar un numero, y que tiene 28-29 digitos de precision, por lo cual es el formato ideal para almacenar numero en los cuales debemos reducir el error de redondeo al minimo, como por ejemplo los calculos financieros, aunque desconozco si en C++ exista un tipo similar a ese.

Saludos :)

213
C# / Re: Separar cadena utilizando Substring en c sharp
« en: Domingo 5 de Junio de 2011, 22:11 »
Cita de: "LenguajeC"
Amigo, tengo 59 años y no soy tu alumno

Eso lo se, pero igual aplica lo que te mencione, fue una sugerencia, en mi caso yo tengo 41 años, y puedo aprender cosas de gente mas joven y mas vieja que yo, la edad en realidad viene a ser irrelevante (conozco gente de  12 años que le da la vuelta a gente mayor, y tambien gente de mas de 50 años que tambien saben mucho, mas que gente de 20 a 30 años, que seria la edad "ideal"). Lo de revisa los metodos de las clases fue mas como consejo, no como orden. Yo siempre reviso los metodos/propiedades de las clases, para ver que me puede servir para hacer mejor mi trabajo. Eso no significa que no puedas preguntar si tienes dudas, sino mas bien que debes investigar un poco mas ;)

Tu tambien puedes hacerlo utilizando el examinador de objetos de Visual C#, veras que te ayuda muchisimo, y asi vas conociendo mas de cada clase de .NET.

Espero no te lo hayas tomado a mal.

Saludos :)

214
C# / Re: Separar cadena utilizando Substring en c sharp
« en: Domingo 5 de Junio de 2011, 04:58 »
Porque tratar de descubrir el hilo negro con Susbstring, cuando me parece que con Split() a mi parecer puedes obtener mas facilmente lo que te propones.

Código: C#
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6.  
  7. public class MyClass
  8. {
  9.     public static void Main()
  10.     {
  11.  
  12.         string encontrado = "07793065000056,0000468,Aceite COSTA del SOL Girasol pvc x1.5Lt.,12x1.5    ,         4.899,  0.000";
  13.         string[] cadenas_separadas;
  14.         cadenas_separadas = encontrado.Split(',');
  15.         foreach (string cadena in cadenas_separadas)
  16.         {
  17.             Console.WriteLine(cadena);
  18.         }
  19.  
  20.         Console.ReadKey();
  21.     }
  22. }
  23.  
  24.  

Creo que se adapta a lo que quieres ¿no?

Recomiendo que siempre revises todos los metodos/propiedades de una clase, para ver si alguno tiene cosas que te puedan servir. En este caso estaba el metodo Split() de la clase string, que no habias visto.

Si no es lo que necesitabs, publica mas detalles de lo que quieres, a ver si te podemos ayudar.

Saludos :)

P.D.: En realidad la cadena se separa en 6 partes, no en 5 como mencionabas, son 5 comas, pero separa 6 cadenas.

215
C/C++ / Re: Recomendaciones para aprender C
« en: Sábado 4 de Junio de 2011, 18:54 »
Hya que buscar un poco en el foro o con google antes amigo.

En el FAQ de C/c++ hay enlaces a manuales en internet de C/C++.

Ademas de esos, te recomiendo:

1.El lenguaje de programacion C (Escrito por los que crearon el el lenguaje C en el sistema operativo Unix, un texto sencillo, y basico, no muy detallado)
Brian W. Kerningham / Dennis M. Ritchie

2. Como Programar en C/C++, (el mas recomendado, tiene muchos ejemplos, y viene bien explicado)
Deitel
Editorial Prentice Hall

3. Programacion En C++ (por si no te gustan los autores que escriben en ingles, un libro escrito por alguien que habla español ;))
Luis Joyanes Aguilar

Hay muchos mas, recomiendo que sigas "googleando" o preguntes en tu libreria/bliblioteca por libros de C/C++. En la libreria pide que te muestren el libro, y ojea el contenido del libro para decidir si te funciona o no.

Saludos :)

216
SQL Server / Crear una tabla con totales
« en: Lunes 30 de Mayo de 2011, 07:10 »
Bueno, ahora es mi turno de pedir ayuda, a ver si alguien me puede ayudar.

Mi problema consiste en lo siguiente, necesito sacar un total de clientes activos e inactivos por colonia, en una sola tabla, de tal forma que quede de la siguiente manera:

Código: Text
  1.  
  2. Colonia Activos Inactivos
  3. A          2         9
  4. B          0         2
  5. C          0         1
  6. D          1         1
  7.  
  8.  

Actualmente saco la informacion de 2 tablas (clientes y contrato), y tengo que crear 3 tablas de la siguiente manera:

Código: SQL
  1.  
  2. -- Creacion de la tabla activos
  3. DROP TABLE colonia_activos
  4. SELECT c1.colonia, COUNT(DISTINCT c1.id) AS activos
  5. INTO colonia_activos
  6. FROM clientes AS c1
  7. INNER JOIN contrato AS c2
  8. ON c1.id = c2.cliente
  9. WHERE c2.cerrado = 0
  10. GROUP BY c1.colonia
  11.  
  12. -- Creacion de la tabla inactivos
  13. DROP TABLE colonia_inactivos
  14. SELECT c1.colonia, COUNT(DISTINCT c1.id) AS inactivos
  15. INTO colonia_inactivos
  16. FROM clientes AS c1
  17. INNER JOIN contrato AS c2
  18. ON c1.id = c2.cliente
  19. WHERE c2.cliente NOT IN
  20. (SELECT cliente FROM contrato WHERE cerrado = 0)
  21. GROUP BY c1.colonia
  22.  
  23. -- Creacion de la tabla totales
  24. DROP TABLE colonia_totales
  25. SELECT DISTINCT c1.colonia, c2.activos, c3.inactivos
  26. INTO colonia_totales
  27. FROM clientes AS c1
  28. LEFT JOIN colonia_activos AS c2
  29. ON c1.colonia = c2.colonia
  30. LEFT JOIN colonia_inactivos AS c3
  31. ON c1.colonia = c3.colonia
  32. ORDER BY c1.colonia
  33.  
  34. UPDATE colonia_totales
  35. SET activos = 0
  36. WHERE activos IS NULL
  37. UPDATE colonia_totales
  38. SET inactivos = 0
  39. WHERE inactivos IS NULL
  40. SELECT * FROM colonia_totales
  41.  
  42.  

Quisiera saber si es posible sacar esta informacion creando esa ultima tabla de totales, de una manera mas simple, sin tener que crear 2 tablas intermedias.

Intente lo siguiente:

Código: SQL
  1.  
  2. SELECT c1.colonia,
  3. COUNT(DISTINCT c2.cliente) AS activos,
  4. COUNT(DISTINCT c3.cliente) AS inactivos
  5. FROM clientes AS c1
  6. INNER JOIN contrato AS c2
  7. ON c1.id = c2.cliente
  8. INNER JOIN contrato AS c3
  9. ON c1.id = c3.cliente
  10. WHERE c2.cerrado = 0
  11. OR
  12. c3.cliente NOT IN
  13. (SELECT cliente FROM contrato WHERE cerrado = 0)
  14. GROUP BY c1.colonia
  15. ORDER BY c1.colonia
  16.  
  17.  

Pero ademas de que la consulta demora 15 segundos, a diferencia de las anteriores, que hace todo en 2 segundos, no me arroja el resultado correcto, sino que me arroja la suma de activos e inactivos, de la siguiente manera:

Código: Text
  1.  
  2. Colonia Activos Inactivos
  3. A          11       11
  4. B          2         2
  5. C          1         1
  6. D          2         2
  7.  
  8.  

Pero eso mismo ya lo obtengo de manera mas eficiente (un segundo) de la siguiente manera:

Código: SQL
  1.  
  2. SELECT c1.colonia, COUNT(DISTINCT c1.id) AS total
  3. FROM clientes AS c1
  4. INNER JOIN contrato AS c2
  5. ON c1.id = c2.cliente
  6. GROUP BY c1.colonia
  7. ORDER BY c1.colonia
  8.  
  9.  

Repito mi pregunta, alguna idea para sacar el resultado de totales que deseo, sin tener que crear 3 tablas intermedias?

Uso SQL Server 2000

Saludos :)

217
C# / Re: Error al declarar una clase...
« en: Martes 24 de Mayo de 2011, 04:55 »
Cita de: "LenguajeC"
Me pudrías decir que criterio debo utilizar para saber cuando utilizar las propiedades en c#,

En realidad es un poco a gusto del programador, y segun lo necesite el programa. cada programa es diferente.

Segun el paradigma de la programacion orientada a objetos, no es bueno tener acceso directo a las variables internas de una clase, para evitar efectos secundarios inesperados, todo acceso debe ser por medio de metodos set/get, parametros y mensajes.

Yo en la practica solo utilizo set y get cuando necesito que la variable sea solo de lectura o solo de escritura. O sea que si necesito leer la variable, pero no escribirla, utilizo get, y omito el get, y si necesito escribir la variable, pero no leerla, utilizo set y omito el get. Si necesito leer y escribir la variable, la hago public directamente. Aun asi, no debes abusar de ello, en lo posible debes tratar de que cada objeto sea independiente del exterior, y evitar las variables public en lo posible. Solo cuando sea de veras necesario

De hecho, tu programa no esta correctamente encapsulado, ya que llamas por fuera a variables de tu clase, y manipulas la clase con metodos externos, lo mas correcto hubiera sido definir los metodos dentro de la misma clase datos, para manipular la variable vec dentro de la clase y evitar manipulacion externa de la clase.

Te dejo un ejemplo de como lo hubiera hecho, eso te lo aclarara un poco mas. Nota como manejo el vector internamente dentro de la clase datos, y no necesito acceder al vector dentro de main(), si esta correctamente encapsulado ;)

Código: C#
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4.  
  5. class datos
  6. {
  7.     private string[] vec;
  8.    
  9.     public datos()
  10.     {
  11.         vec = new String[7];
  12.     }
  13.    
  14.     public void detalle()
  15.     {
  16.         for (byte a = 1; a < 50; a++)
  17.         {
  18.             Console.SetCursorPosition(a, 00); Console.Write("=");
  19.             Console.SetCursorPosition(a, 02); Console.Write("=");
  20.         }
  21.         Console.SetCursorPosition(17, 01);
  22.         Console.Write(" Alta de Clientes ");
  23.         Console.SetCursorPosition(01, 04);
  24.         Console.Write(" Nombre completo....:");
  25.         Console.SetCursorPosition(01, 05);
  26.         Console.Write(" Dirección..........:");
  27.         Console.SetCursorPosition(01, 06);
  28.         Console.Write(" Cód. postal........:");
  29.         Console.SetCursorPosition(01, 07);
  30.         Console.Write(" Ciudad.............:");
  31.         Console.SetCursorPosition(01, 08);
  32.         Console.Write(" Celular............:");
  33.         Console.SetCursorPosition(01, 09);
  34.         Console.Write(" Crédito............:");
  35.         Console.SetCursorPosition(01, 10);
  36.         Console.Write(" Plazo en días......:");
  37.     }
  38.  
  39.     public void ingreso()
  40.     {
  41.         string linea = "";
  42.         for (int cont = 0; cont < vec.Length ; cont++)
  43.         {
  44.             do
  45.             {
  46.                 Console.SetCursorPosition(22, cont + 4);
  47.                 linea = Console.ReadLine();
  48.             } while ((linea == null) || (linea.Length == 0));
  49.             vec[cont] = linea;
  50.         }
  51.     }
  52.  
  53.     public void imprime()
  54.     {
  55.         Console.SetCursorPosition(01, 12);
  56.         Console.WriteLine("Nombre...:" + vec[0]);
  57.         Console.ReadKey();
  58.     }
  59. }
  60.  
  61. class Clientes
  62. {
  63.     static datos _datos;
  64.  
  65.     public static void Main(string[] args)
  66.     {
  67.         Console.Title = " Alta de Clientes";
  68.  
  69.         _datos = new datos();
  70.         _datos.detalle();
  71.         _datos.ingreso();
  72.         _datos.imprime();
  73.  
  74.     }
  75. }
  76.  
  77.  
  78.  

Saludos :)

218
C# / Re: Error al declarar una clase...
« en: Lunes 23 de Mayo de 2011, 03:42 »
Bueno, en el nuevo codigo que publicaste no has hecho las correcciones que te dije. Debiste hacerlo, pero bueno  :rolleyes:

Te dejo el codigo corregido de nuevo, con las correcciones que te mencione anteriormente, ademas de nuevas correcciones con comentarios para que sepas el porque de tu error, espero que lo comprendas mejor.

Código: C#
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4.  
  5. class datos
  6. {
  7.     public string[] vec;
  8.     public datos()
  9.     {
  10.         vec = new String[7];
  11.     }
  12. }
  13.  
  14. class Clientes
  15. {
  16.     // Debes declarar la variable como static, para poder
  17.     // acceder a ella en metodos static
  18.     static datos _datos;
  19.     public static void detalle()
  20.     {
  21.         for (byte a = 1; a < 50; a++)
  22.         {
  23.             Console.SetCursorPosition(a, 00); Console.Write("=");
  24.             Console.SetCursorPosition(a, 02); Console.Write("=");
  25.         }
  26.         Console.SetCursorPosition(17, 01);
  27.         Console.Write(" Alta de Clientes ");
  28.         Console.SetCursorPosition(01, 04);
  29.         Console.Write(" Nombre completo....:");
  30.         Console.SetCursorPosition(01, 05);
  31.         Console.Write(" Dirección..........:");
  32.         Console.SetCursorPosition(01, 06);
  33.         Console.Write(" Cód. postal........:");
  34.         Console.SetCursorPosition(01, 07);
  35.         Console.Write(" Ciudad.............:");
  36.         Console.SetCursorPosition(01, 08);
  37.         Console.Write(" Celular............:");
  38.         Console.SetCursorPosition(01, 09);
  39.         Console.Write(" Crédito............:");
  40.         Console.SetCursorPosition(01, 10);
  41.         Console.Write(" Plazo en días......:");
  42.     }
  43.  
  44.     public static void ingreso()
  45.     {
  46.         string linea = "";
  47.         for (int cont = 0; cont < 7; cont++)
  48.         {
  49.             do
  50.             {
  51.                 Console.SetCursorPosition(22, cont + 4);
  52.                 linea = Console.ReadLine();
  53.             } while ((linea == null) || (linea.Length == 0));
  54.             _datos.vec[cont] = linea;
  55.         }
  56.     }
  57.  
  58.     public static void Main(string[] args)
  59.     {
  60.         Console.Title = " Alta de Clientes";
  61.  
  62.         // Creas un nuevo objeto de tipo "datos"
  63.         _datos = new datos();
  64.         detalle();
  65.         ingreso();
  66.  
  67.         // Esto es incorrecto para lo que creo que quieres hacer.
  68.         // Cada vez que usas new creas un nuevo objeto.
  69.         // por lo tanto, el nuevo objeto d_atos, no es el mismo
  70.         // que _datos, son del mismo tipo, pero NO son el mismo
  71.         // objeto, cada objeto es independiente uno del otro,
  72.         // por lo tanto no puedes esperar que d_atos contenga lo
  73.         // que capturaste en _datos, para obtener lo que capturaste
  74.         // en _datos, debes declarar _datos como static al
  75.         // principio de la clase para poder acceder a el desde los
  76.         // metodos static (Lo que ya hice en esta ejemplo corregido).
  77.         // Si los metodos no fueran static, no seria
  78.         // necesario declarar _datos como static, pero entonces
  79.         // necesitarias crear una instancia (objeto) de
  80.         // la clase clientes para acceder a los metodos no estaticos
  81.         // detalle() e ingreso(). No se si me entiendas.
  82.  
  83.         //datos d_atos = new datos();
  84.        
  85.         Console.SetCursorPosition(01,12);  
  86.         Console.WriteLine(" Nombre...:" + _datos.vec[0]); Console.ReadKey();
  87.     }
  88. }
  89.  
  90.  

Saludos :)

219
C/C++ / Re: Libreria grafica compatible con windows?
« en: Domingo 22 de Mayo de 2011, 21:34 »
No se que problemas te puede dar allegro, pero bueno.

Puedes usar tambien Open GL, o SDL (Simple Directmedia Layer)

Saludos :)

220
C/C++ / Re: como hacer un entrada con valores fraccionarios en c++?
« en: Domingo 22 de Mayo de 2011, 21:31 »
convierte tus valores a decimal antes de caturarlos, por ejemplo, si el valor es 1/2, escribe 0.5, si es un tercio(1/3), escribe 0.33 y asi sucesivamente.

221
Pascal / Re: LISTA DINAMICA DOBLEMENTE ENLAZADA
« en: Domingo 22 de Mayo de 2011, 21:13 »
Si ya lo tienes hecho, publica tu codigo o parte de el, especificando la parte que te da error, y que problemas tienes, mensajes de error en compilacion, errores en la logica de tu programa (o sea, cual resultado esperas obtener, y cual es el resultado que obtienes, no solo decir, no me funciona  :rolleyes: ) y te aseguro que mas de un compañero del foro te ayudara. Ya que no publicas nada, asumimos que quieres que te lo hagan y  como dije antes. aqui no se hacen tareas.

Ademas por favor, no escribas todo en mayusculas, escribir en mayusculas equivale a que nos estuvieras GRITANDO.

Citar
EL K ESTE INTERESADO EN AYUDARME K M DEJE EL CORREO Y LE MANDO LO K TENGO EXO Y LE DIGO DONDE FALLA

Otra regla que rompes, no se contestan correos de manera privada, el foro es publico, para que se beneficien todos, no solo para que te beneficies tu.

Recomiendo que le des una leida a esto:

Antes De Postear

Cómo Hacer Preguntas De Forma Inteligente

Saludos :)

222
C# / Re: Error al declarar una clase...
« en: Domingo 22 de Mayo de 2011, 20:58 »
Bueno, escribi mi respuesta hace 3 horas, pero no pude publicarla antes porque tuve que salir, veo que te contestaron en parte, aun asi, publico mi respuesta, con comentarios a ver si asi te queda mas claro.

Código: C#
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4.  
  5. // Las clases no se anidan una dentro de otra, deben ir separadas.
  6. // Y de preferencia, una clase en cada archivo de codigo, esto
  7. // ultimo no es obligatorio, pero si recomendado.
  8. class datos
  9. {
  10.     // Declara vec de tipo public, no private, para evitar el error que te marca,
  11.     // no se cual era el problema que dices que
  12.     // te da haciendolo public, pero a mi no me da problema. Si te da
  13.     // problema con public, menciona especificamemnte cual es.
  14.     public string[] vec;
  15.     public datos()
  16.     {
  17.         vec = new String[7];
  18.     }
  19.     // Ya que estas declarando vec como public, no es necesario usar
  20.     // set/get, este solo se utilizaria si vec fuera private, pero
  21.     // lo estas haciendo mal de todas formas, ya que no puedes usar
  22.     // this como nombre de propiedad, pues this es palabra reservada
  23.     // de C#. La convencion normal (digo convencion, por que no es
  24.     // obligatorio, pero es algo que casi todo programador de C# hace)
  25.     // es usar nombres de variables con minuscula para variables privadas
  26.     // y nombres de variables con mayuscula para variables publicas.
  27.     // En otro bloque te pondre la manera correcta de hacerlo
  28.     //public string this[int indice]
  29.     //{
  30.     //    set
  31.     //    {
  32.     //        vec[indice] = value;
  33.     //    }
  34.     //    get
  35.     //    {
  36.     //        return vec[indice];
  37.     //    }
  38.     //}
  39. }
  40.  
  41.  
  42. class Clientes
  43. {
  44.  
  45.     public static void detalle()
  46.     {
  47.         for (byte a = 1; a < 50; a++)
  48.         {
  49.             Console.SetCursorPosition(a, 00); Console.Write("=");
  50.             Console.SetCursorPosition(a, 02); Console.Write("=");
  51.         }
  52.         Console.SetCursorPosition(17, 01);
  53.         Console.Write(" Alta de Clientes ");
  54.         Console.SetCursorPosition(01, 04);
  55.         Console.Write(" Nombre completo....:");
  56.         Console.SetCursorPosition(01, 05);
  57.         Console.Write(" Dirección..........:");
  58.         Console.SetCursorPosition(01, 06);
  59.         Console.Write(" Cód. postal........:");
  60.         Console.SetCursorPosition(01, 07);
  61.         Console.Write(" Ciudad.............:");
  62.         Console.SetCursorPosition(01, 08);
  63.         Console.Write(" Celular............:");
  64.         Console.SetCursorPosition(01, 09);
  65.         Console.Write(" Crédito............:");
  66.         Console.SetCursorPosition(01, 10);
  67.         Console.Write(" Plazo en días......:");
  68.     }
  69.  
  70.     public static void ingreso()
  71.     {
  72.         datos _datos = new datos();
  73.         byte ver = 04;
  74.         string linea = "";
  75.         for (int cont = 0; cont < 7; cont++)
  76.         {
  77.             do
  78.             {
  79.                 Console.SetCursorPosition(22, ver);
  80.                 linea = Console.ReadLine();
  81.             } while ((linea == null) || (linea.Length == 0));
  82.             _datos.vec[cont] = linea;
  83.             ver++;
  84.         }
  85.     }
  86.  
  87.     public static void Main(string[] args)
  88.     {
  89.         Console.Title = " Alta de Clientes";
  90.         detalle();
  91.         ingreso();
  92.  
  93.  
  94.         Console.SetCursorPosition(01, 12);
  95.         Console.Write(" Pulse una tecla para finalizar..."); Console.ReadKey();
  96.     }
  97. }
  98.  
  99.  

Clase datos usando set/get, y variables privadas.

Código: C#
  1.  
  2. class datos
  3. {
  4.     // Declara vec con minuscula para la variable private
  5.     private string[] vec;
  6.     // Declara la propiedad vec con mayuscula para la parte public
  7.     // Recuerda que ahora utilizaras _datos.Vec[cont] en lugar de
  8.     // _datos.vec[cont], ya que vec ahora es private
  9.     public string[] Vec
  10.     {
  11.         set
  12.         {
  13.             vec = value;
  14.         }
  15.         get
  16.         {
  17.             return vec;
  18.         }
  19.     }
  20.     public datos()
  21.     {
  22.         vec = new String[7];
  23.     }
  24. }
  25.  
  26.  

Citar
Ahora tengo otro inconveniente, no logro leer el array desde el método principal, si desearan ayudarme yo agradecido.-

No entiendo aqui especificamente que es lo que deseas hacer, si pudieras explicarnos mejor y de manera mas clara, seria excelente.

Si hiciste modificaciones al codigo que publicaste originalmente, publicalo de nuevo, especificando el error que te marca, y en que linea obtienes el error.

Saludos :)

223
Pascal / Re: LISTA DINAMICA DOBLEMENTE ENLAZADA
« en: Domingo 22 de Mayo de 2011, 15:49 »
NO se hacen tareas.

224
C# / Re: ERROR CON CrystalDesicion.CrystalReports.Engine ...en Window
« en: Martes 17 de Mayo de 2011, 16:30 »
Trata de no escribir con mayusculas, y mayusculas resaltadas. Escribir en mayusculas se considera como si estuvieras gritando.

La gente te puede keer correctamente, sin necesitad de gritar ;)

Ahora, los errores de "No se puede encontrar el ensamblado" indican generalmente que te falta alguna dll o libreria para funcionar. En este caso, sospecho que te falta la libreria de Crystal Reports.

Dices que creaste la aplicacion en windows 7, y la ejecutas en windows xp, lo que me hace pensar en que creas la aplicacion en una maquina, y la copias en otra maquina.

Si ese es el caso, tienes varias alternativas-

1. Prueba creando un instalador de tu aplicacion, para generar un archivo que contenga las dependencias (librerias) necesarias para ejecutar tu aplicacion en la otra maquina.

2. Averigua cual es la dll de Crystal Reports, y copiala manualmente al directorio en donde se encuentra el ejecutable de tu aplicacion en la otra maquina.

3. Instala el Crystal Report en la otra maquina.

Ojala y alguna de mis sugerencias te sirva.

Saludos :)

225
C/C++ / Re: Complementos(1 y 2)
« en: Viernes 13 de Mayo de 2011, 16:56 »
Cita de: "Leber"
Quizá simplemente lo he interpretado mal.

Si, me parece que si lo habias interpretado mal.

Es correcto lo que dice wikipedia, el numero de bits que uno elige es arbitrario. Tu puedes elegir representar el numero que quieras con 5, 10 20, 30, 40 bits etc., los que tu desees, aunque ya en la practica los numeros solo pueden estar representados con 8, 16 32 y actualmente hasta 64 bits (multiplos de 8, ya que se toma un byte, 8 bits, como medida). Esto depende de la capacidad del procesador. A mayor cantidad de bits, mayor es el numero que puedes representar. Esta es la razon por la que los primeros procesadores solo podian representar un rango maximo de 0 a  255 para numeros sin signo, -128 a 127 si el numero es con signo, y los actuales de 64 bits el rango va de 0 a 18446744073709551616 sin signo,
-9223372036854775808 a 9223372036854775807 si el numero es con signo.

Citar
Uhm, si por ejemplo yo presentara el numero 10111 a alguien, y no le dijera si esta en complemento 1 o 2, uno tiende a pensar que es un numero binario sin mas, el 23.
Ahora, si yo lo presento como: 00010111, o como 11110111, entonces sabrá por el 1 o 0 del principio si se trata de un número negativo, o un numero positivo. Es correcto?

De nuevo y como te dije antes, esto depende de cuantos bits estas eligiendo para almacenar el numero, y de si quieres representar numeros con signo o sin signo. Si en tu ejemplo, utilizas solo 5 bits, el rango que puedes representar es de 0 a 32 sin signo, y de -16 a 15 con signo. Por lo tanto y como ya notaste, y si no lo notaste te lo recalco, 10111 representa 2 numeros, el 23 si eliges numeros sin signo, y -9 s eliges numeros con signo. Entonces 11110111 tambien representa 2 numeros, -9 (de nuevo, pero ahora con 8 bits) si eliges numeros con signo, y 247 si eliges numeros sin signo. En aquellos numeros cuyo primer bit es cero, como podras notar, el numero es el mismo para numeros con o sin signo.

Citar
Algo que pensaba que tenia claro, pero viendo esto
Citar
Recapitulando, solo se calcula el complemento a 2, si el primer digito es uno
se me tambalea un poco. El complemento a 2  se usa para encontrar el negativo de un numero positivo en binario, no?

Exacto, pero recuerda, solo es una forma de representar el numero negativo que quieras. Pero al final, no te compliques tanto, ya que el compilador hace la conversion por ti, no debes preocuparte por convertir el numero negativo que quieras a complemento a 2. Esto te seria util solamente si trabajas con ensamblador o lenguaje maquina.

Saludos :)

Páginas: 1 ... 7 8 [9] 10 11 ... 32