|
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 ... 9 10 [11] 12 13 ... 32
251
« en: Jueves 21 de Abril de 2011, 19:07 »
No se hacen tareas
252
« en: Viernes 15 de Abril de 2011, 22:45 »
Yo lo que quiero es poder almacenar en el tipo enumerado el valor que coges.
Supongo que tu querias algo como que estado_civil.soltero = "Soltero", y no, no es asi como funciona el enum. Como te dije antes, el enum internamente se guarda como si fuera un valor de tipo entero, con valores que comienzan en cero y aumentan en uno de forma consecutiva (0,1,2,3, etc) a menos que en la declaracion le pongas explicitamente que valores tendra el enum. suponía que así guardaría el estado civil para el objeto que esté usando. ¿Como haría eso?
Bueno, hay varias formas de hacerlo, la forma como yo lo haria seria algo parecido a como lo hizo Leber, usando switch: int main() { int civil; Cliente* cliente; cliente = new Cliente(); cout << "Estado civil (0=Soltero, 1=Casado, 2=Viudo, 3=Divorciado): "; cin >> civil; switch (civil) { case Cliente::soltero: cliente->setEstado_civil(Cliente::soltero); break; case Cliente::casado: cliente->setEstado_civil(Cliente::casado); break; case Cliente::viudo: cliente->setEstado_civil(Cliente::viudo); break; case Cliente::divorciado: cliente->setEstado_civil(Cliente::divorciado); break; } return 0; }
De todas formas, necesitarias validar tu entrada para que en civil no guardes valores fuera del rango, es decir, menores a cero o mayores a 3  Para que sirve entonces el enum? Bueno, tratare de explicar un poco a ver si comprendes mejor, como dije antes el enum internamente se guarda como un valor de tipo entero. Te permite definir constantes de manera consecutiva y de forma mas facil. Si declaras manualmente tus constantes harias algo como esto: const int soltero = 0; const int casado = 1; const int viudo = 2; const int divorciado = 3;
A la vez funciona como tipo, lo cual te permite definir una variable de tipo enum, al usar ese tipo, hace que el compilador genere errores cuando tratas de asignar a la variable un tipo inadecuado, ejemplo: // esta linea generara un error cliente->setEstado_civil(0); // Esta linea compilara correctamente cliente->setEstado_civil(Cliente::soltero);
Aunque puedes hacer un type cast para asignar, ya que un enum y un int son compatibles, pero deberas tener cuidado para no asignar un valor no valido. Ejemplo de type cast (algo rebuscado): Cliente::estado_civil edo_civ; civil = 0; // type cast edo_civ = (Cliente::estado_civil) civil; cliente->setEstado_civil(edo_civ);
En el caso anterior, un valor no valido seria hacer civil = 4. Ojala y te haya quedado un poco mas claro. Saludos
253
« en: Miércoles 13 de Abril de 2011, 04:20 »
El error esta en que estas usando mal el enum, enum funciona como si crearas un nuevo tipo, no como si crearas una variable, cuando defines enum estado_civil{soltero, casado, viudo, divorciado}, estas creando un nuevo tipo llamado estado_civil, este tipo solo podra tomar los valores soltero, casado, viudo, divorciado, que internamente valdran 0, 1, 2, 3. Ademas, necesitas una variable interna a tu clase de tipo privado, que guarde el valor del estado civil, y no, no se puede llamar estado_civil, ya que ese es el nombre del nuevo tipo, tiene que tener un nombre diferente, y debe ser de tipo estado_civil. Entonces debes definir los metodos getEstado_civil() y setEstado_civil() de manera que utilicen el nuevo tipo, y la variable interna que guarda el estado civil. No se si me explique bien, pero te dejo el codigo de como deberia ser, supongo que con eso comprenderas mejor lo que te explique arriba. Ademas, he definido estado_civil de tipo public en lugar de private, para que puedas acceder al nuevo tipo fuera de la clase, que pienso que seria mas correcto. /* EN CLIENTE.H */ class Cliente { public: // enum funciona como si definieras un nuevo tipo enum estado_civil{soltero, casado, viudo, divorciado}; string getDNI() const; unsigned int getEdad() const; string getNombre() const; // Defines el metodo como si regresa un valor de tipo estado_civil estado_civil getEstado_civil() const; void setDNI(string DNI); void setEdad(unsigned int edad); void setNombre(string nombre); // Defines el metodo como si le pasas un parametro de tipo estado_civil void setEstado_civil(estado_civil civil); private: string DNI; /**<DNI sin letra*/ string nombre; /**<Nombre separado por un espacio en blanco si es necesario*/ unsigned int edad; // Variable interna (privada) de tipo estado_civil para guardar el estado civil estado_civil civil; };
/*EN CLIENTE.CPP*/ string Cliente::getDNI() const { return DNI; } unsigned int Cliente::getEdad() const { return edad; } string Cliente::getNombre() const { return nombre; } // Defines el metodo como si regresa un valor de tipo estado_civil Cliente::estado_civil Cliente::getEstado_civil() const { return this->civil; } void Cliente::setDNI(string DNI) { this->DNI = DNI; } void Cliente::setEdad(unsigned int edad) { this->edad = edad; } void Cliente::setNombre(string nombre) { this->nombre = nombre; } // Defines el metodo como si le pasas un parametro de tipo estado_civil void Cliente::setEstado_civil(estado_civil civil) { this->civil = civil; }
Saludos
254
« en: Sábado 9 de Abril de 2011, 02:04 »
Bueno, en mi opinion esta bien, solo añadiria que en mi caso, perfiero comentar una linea antes, a comentar en la misma linea,como en el siguiente ejemplo: //se declara una estructura struct agenda
pero bueno, es preferencia personal, en todo caso, es valido como haces los comentarios. P.D: Por si no lo notaste, tal como te lo hizo notar m0skit0, no se dice "comentariar" ni "comentariadas", el verbo correcto es "comentar", y se conjuga "comentadas". La palabra "Comentario" no es verbo, asi que escribir "comentario" esta correcto Saludos
255
« en: Viernes 8 de Abril de 2011, 16:53 »
Que yo sepa no hay ninguna bliblioteca de .NET que haga eso. Lo que mencionas ya es programacion mas avanzada, creo que podria hacerse mediante llamadas directas a funciones del sistema operativo, aunque nunca he hecho nada parecido, creo que tendras que investigar tu mismo en MSDN. Saludos
256
« en: Viernes 8 de Abril de 2011, 02:23 »
No se hacen tareas amigo. El procedimiento correcto es que tu mismo hagas el ejercicio, y entonces, si tienes problemas con la compilacion o algun error en la ejecucion, publiques el codigo que hayas hecho, explicando en que parte tienes problemas, o cual es el error que te marca el programa. Asi demuestras que estas trabajando y no solo que quieres que te hagan el trabajo de gratis  . Si haces lo que te digo, mas de un compañero del foro te ayudara, en caso contrario, puedes dar por asegurado que este mensaje se ira al olvido. Saludos
257
« en: Jueves 7 de Abril de 2011, 22:32 »
No se hacen tareas amigo. El procedimiento correcto es que tu mismo hagas el ejercicio, y entonces, si tienes problemas con la compilacion o algun error en la ejecucion, publiques el codigo que hayas hecho, explicando en que parte tienes problemas, o cual es el error que te marca el programa. Asi demuestras que estas trabajando y no solo que quieres que te hagan el trabajo de gratis  . Si haces lo que te digo, mas de un compañero del foro te ayudara, en caso contrario, puedes dar por asegurado que este mensaje se ira al olvido. Saludos
258
« en: Jueves 7 de Abril de 2011, 15:52 »
Ese tipo de mascaras se les conoce como Expresiones Regulares (Regular Expresions, RegEx), y la libreria que las maneja se llama System.Text.RegularExpressions Saludos
259
« en: Miércoles 6 de Abril de 2011, 15:41 »
En C/C++, no existe un "copiar y egar". Para poder obtener un funcionamiento parecido, se me ocurren dos formas: 1.Abrir el archivo fuente, crear un nuevo archivo (destino), y pasar el contenido del primer archivo byte por byte al segundo archivo. 2. Si estas bajo windows, podrias usar el comando copy por medio de system, algo asi como system('copy'), tendrias que investigar la sintaxis del comando copy de MS DOS. Saludos
260
« en: Martes 5 de Abril de 2011, 22:39 »
Tienes metdodos dentro de metodos (o metodos anidados), en C#, no puedes tener metodos anidados, cada metodo debe ser independiente uno de otro. Un constructor tambien es un metodo, solo que es de un tipo especial que se ejecuta automaticamente al crear la clase  Si el objetivo de declararlos anidados, es que no tengas acceso a esos metodos fuera de la clase, debes declararlos como privados. public Conexion_BD(String server, String bd, String user, String pwd) { // Variables. srv = server; BD = bd; us = user; pw = pwd; } // FIN Conexion_BD // Metodo para conectar, se le pasa el servidor, la base de datos, el usuario y el password. // Si no deseas accede al metodo fuera de la clase, declaralo privado, // no anidado al metodo Conexion_BD public MySqlConnection conectar() { String datos = "Server=" + srv + ";Port=3306;Database=" + BD + ";Uid=" + us + ";Pwd=" + pw + ";"; abrir(datos); try { con.Open(); return con; } // FIN try catch (MySqlException ex) { return null; } // FIN catch } // FIN conectar // Metodo abrir. public void abrir(string dat) { con = new MySqlConnection (dat ); } // FIN abrir
Saludos
261
« en: Sábado 2 de Abril de 2011, 18:46 »
Hola portirijillo, antes que nada, pediria que no publiques dos veces el mismo mensaje, se considera falta de cortesia, con que lo publiques una vez es suficiente y cualquiera te lee, lo mas recomendable es esperar 24 horas (minimo) por una respuesta, si no la obtienes, es porque o nadie sabe la respuesta, o esta mal formulada la pregunta, o es una tarea, en todo caso, si consideras que esta mal formulada despues de leerla de nuevo, o sientes que olvidaste algo, puedes agregar informacion adicional, demtro del mismo hilo, o modificar el hilo oroginal, pero no hacer uno nuevo. Si es una tarea, no esperes resuesta, ya que por lo regular no se hacen tareas. Aclarado eso, contesto tu duda. Por defecto, printf y el resto de funciones que mandan informacion a la salida estandar, lo hacen a la misma ventana donde el programa esta ejecutandose, y no es posible cambiar ese comportamiento. En teoria creo que si podria ser posible mandar la informacion a una segunda ventana, pero requeriria utilizar llamadas a funciones del sistema operativo, no seria una manera portable de hacerlo, y requiere programacion mas avanzada. Si estas interesado y trabajas sobre windows, recomiendo que visites la pagina de MSDN, alli encontraras informacion sobre la WinApi, que te puede ayudar con eso. Saludos
262
« en: Martes 29 de Marzo de 2011, 21:13 »
Bueno, estuve investigando, y parece que encontre la razon por la cual no te da el resultado correcto, y se debe a la conversion de tipos y al rango de los int en los diferentes compiladores. En C++, cuando multiplicas enteros, el resultado de la multiplicacion es entero, y cuando multiplicas flotantes, el resultado es flotante. Entonces, en la linea: todos los factores son enteros, entonces el resultado de la multiplicacion es entero, pero ademas, en Turbo C++, los enteros (int) son de 16 bits, y el valor de un entero de 16 bits va de − 32,768 a 32,767, y dado que 604800 es una cantidad mucho mayor que la que puede ser almacenada en un entero de 16 bits, ocurre un desborde aritmetico (Arithmetic overflow) y por eso da ese numero. Luego cuando asignas el resultado a semana se convierte de int a float, pero ya es tarde, pues el numero quedo desbordado. En Visual C++ y los otros compiladores no ocurre esto, debido a que los int en estos compiladores son de 32 bits, y su rango va de − 2,147,483,648 a 2,147,483,647, entonces 604800 queda dentro del rango y no hay desborde aritmetico. Pero si el resultado de la multiplicacion quedara fuera de ese rango, incluso en Visual C++ habria desbordamiento aritmetico (recuarda lo que dije, si multiplicas enteros, el resultado es entero, y si multiplicas flotantes, el resultado es flotante), y tambien daria un resultado incorrecto. La solucion a este problema es declarar los factores explicitamente como flotantes, agregando un punto decimal a cada numero, como en el siguiente ejemplo: semana = (24.0*7.0*3600.0);
Si en lugar de usar constantes, usas variables enteras, debes convertirlas explicitamente a flotantes, multiplicando cada variable por 1.0, para que se convierta a flotante, ojo, solo si la variable es entera, si la variable es flotante no es necesario, ejemplo: semana = (horas * 1.0) * (dias * 1.0) * (segundos * 1.0);
Pruebalo asi, y me dices si ahora si te da el resultado correcto. Saludos
263
« en: Lunes 28 de Marzo de 2011, 19:40 »
Bueno, yo agregare a lo que te contestaron una cosa, tu dices que el valor que obtienes no es el correcto, pero nunca mencionas cual es el resultado que obtienes, y cual resultado esperas obtener. Porque como bien te dijeron antes, el resultado de esa multipilicacion es 604800.00, y ese es el mismo resultado que yo obtengo tambien, utilizando Visual C++ 2010, si ese resultado es el que obtienes, entonces es correcto, ya que nunca mencionas que resultado esperas obtener, ya en mi otro mensaje te pregunte si querias obtener semanas (dando los segundos) o segundos (dando las semanas), quizas esperabas otro resultado, en cuyo caso estas equivocado en cuanto a la manera de obtener el resultado que quieres, pero dado que nunca mencionas cual resultado esperas obtener, al final resulta que estamos adivinando el resultado que crees que deberias obtener  Ahora, si no obtienes como resultado 604800.00 (cosa que dudo, pero no puedo comprobarlo, pues ya no uso Turbo C++), entonces si, muy probablemente se deba a que tu compilador es obsoleto, pero como dije antes, dudo mucho que no te de 604800.00, ya que la manera en que los compiladores almacenna los valores de tipo float no ha cambiado mucho. Mi codigo, modificado para Visual C++ 2010 #define _CRT_SECURE_NO_WARNINGS #include <cstdio> int main() { float semana; semana = (24*7*3600); printf("Son %f ",semana); return 0; }
Saludos
264
« en: Viernes 25 de Marzo de 2011, 09:03 »
No se entiende bien que es lo que quieres hacer. 1. ¿Dado "x" segundos, quieres saber el equivalente en semanas? o 2. ¿Dado "x" semanas quieres saber el equivalente en segundos? En todo caso tu formula esta mal. ya que una semana no contiene 12 dias. Las equivalencias son asi: 1 semana = 7 dias 1 dia = 24 horas 1 hora = 60 minutos, 1 minuto = 60 segundos. Por lo tanto, las formulas quedarian: 1. semanas = segundos / (7.0*24.0*60.0*60.0) o 2. segundos = semanas*7.0*24.0*60.0*60.0 ademas, para imprimir valores flotantes con printf, se utiliza %f y no %g Bueno, esos son los errores que note, ojala te sirva. Saludos
265
« en: Miércoles 23 de Marzo de 2011, 05:02 »
cual es la razon para que se ponga using namespace std en lugar de .h saludos! La razon tiene que ver con la antigüedad de los compiladores, y en realidad no es en lugar de, sino ademas de quitar .h En los primeros compiladores de C++ (por ejemplo, las primeras versiones de Turbo C++), el nombre del archivo de libreria era iostream.h, y no existian los espacios de nombre (namespace). En compiladores modernos y actuales, cambiaron el nombre del archivo de iostream.h a solo iostream, ademas se implementaron los namespace, los objetos cin y cout se encuentran dentro del namespace std, es por eso que se pone using namespace std; sin eso, para poder utilizar los objetos necesitarias poner std.cin o std.cout. Saludos
266
« en: Sábado 19 de Marzo de 2011, 20:10 »
Disculpa si pareci rudo y te ofendi, no me rei de ti, sino de la pregunta, es bueno que seas autodidacta, yo tambien lo soy de hecho yo aprendi a programar en C/C++ antes de llevar la materia, por cuestiones de trabajo, lo que me ayudo mucho cuando lleve el curso, pues ya sabia las bases del lenguaje  , tambien aprendi a programar en C#, y Java por mi cuenta, en la escuela no lleve ninguno de esos dos lenguajes, a lo que me referia es que se notaba que nunca llevaste algoritmos, eso no es malo, a menos que no sepas algoritmos por flojera de no haber estudiado bien la materia (conozco muchos casos de gente floja, que no pone empeño en aprender), pero si nunca llevaste algoritmos, solo significa que debes aprender mas. Es bueno que tengas el animo de aprender el porque, sigue asi. Solo rematare con una frase mas, "No hay preguntas tontas, solo hay tontos que no preguntan"  Saludos y suerte
267
« en: Sábado 19 de Marzo de 2011, 17:40 »
Ja ja, esto si me dio risa, nunca habia visto alguien preguntar algo asi de obvio, pero bueno, supongo que nunca llevaste alguna materia de diseño de algoritmos. Bueno, fuera de la risa te dare la respuesta (aunque es obvia), la razon es que en el segundo codigo: // resultado aun no contiene el valor del cubo, lo estas imprimiendo antes de calcularlo printf("El cubo de %.2f es %.2fn", n, resultado); resultado = cubo(n); /* Hacemos la llamada a la función */
la variable resultado aun no contiene el resultado del calculo, ya que estas imprimiendo antes de calcular, de hecho, si tu no le asignas un valor manualmente a la variable resultado despues de crearla, contendra un valor "indederminado" ( basura) pero la razon de que contenga cero es que algunos compiladores "inicializan" automaticamente las variables globales con cero. Puedes comprobarlo si en lugar de declarar resultado como global, la declaras como local, y veras que ahora tendra un valor diferente de cero. En programacion no aplica la regla de la multiplicacion "el orden de los factores no afecta el producto". En programacion, el orden en que se ejecutan las lineas SI puede afectar el resultado final de un programa, es por eso que la programacion es mas delicada, y a veces mas dificl de encontrar y corregir errores (depurar) te encontraras muchisimos mas casos en que si cambias una sola linea de lugar, obtienes resultados totalmente diferentes, es por eso que hay que revisar con cuidado el codigo, pero afortunadamente en los compiladores modernos tenemos muchas herramientas para realizar la ejecucion de codigo linea por linea para depurarlo correctamente. Saludos
268
« en: Viernes 18 de Marzo de 2011, 20:21 »
El error es lo mismo que te mencone arriba, estas entendiendo mal como funciona el typedef, y lo que haces es que al crear alias, los * (operador de direccion) se acumulan, creando los errores de compilacion. ademas como dije esta mal implementada la pila, revisa mi enlace anterior. Saludos
269
« en: Viernes 18 de Marzo de 2011, 20:11 »
Desafortunadamente estas implementando mal la pila y sus funciones, me parece que necesitas leer mas sobre punteros, typedef y C++, basicamente el error de sintaxis que te marca es debido a que typedef lo que hace es crear un "alias" de una declaracion, por lo tanto cuando declaras: es como si escribieras: typedef tipoNodo **pila; // Doble apuntador a tipoNodo
Ya que arriba estas poniendo: typedef tipoNodo *Pila; //Pila es alias de apuntador a tipoNodo
Lo que convierte a PIla en un alias para tipoNodo*, (apuntador a tipoNodo), no se si lo comprendas, puede ser algo confuso de entender si no comprendes que typedef contrario a lo que parece, no "crea tipos" si no en realida crea "alias" como dije arriba. Pero aun cuando corrijas eso, tu codigo no funcionara correctamente ya que esta mal implementado, y explicarte todo y como debes hacerlo excederia el tamaño de una pequeña consulta  , es mas facil que busques en google la manera correcta de hacerlo  Poniendo en google como busqueda "pila usando listas c++", encontre varios enlaces, te dejo el enlace al codigo que me parece es mas adecuado a lo que buscas, por esta vez te hice la busqueda, pero debes aprender a saber hacer busquedas inteligentes tu mismo http://www.lawebdelprogramador.com/codigo/85/Implementacion_de_una_pila_mediante_lista_enlazada_en_C++.htmlEsta escrito para Visual C++, y me parece por la sintaxis de tu codigo que tu usas Turbo C++, aun asi, no creo que te cueste trabajo adaptar el codigo para que funcione en Turbo o el compilador qe utilices. Saludos y suerte
270
« en: Jueves 10 de Marzo de 2011, 16:27 »
Bueno, se agradece el esfuerzo, pero es mejor que si quieres publicar codgos completos, hay una parte de la pagina que te permite hacerlo, puedes colocar el codigo fuente completo, con los archivos de proyecto en un archivo zip y subirlo, si no has visto el enlace, te lo dejo a continuacion: http://www.solocodigo.com/index.php?opt=addresource&node=1Puedes subir archivos de un maximo de 2 Megabytes Saludos
271
« en: Miércoles 9 de Marzo de 2011, 17:58 »
El problema esta en que no le estas asignando un valor a num2 antes de imprimirlo, por lo tanto num2 contiene un valor "basura" y es ese el valor el que te imprime. La solucion me parece que seria asignarle valor antes de imprimirlo, seria algo mas o menos asi: #include <stdio.h> /* Crear un programa calcule cuantas cifras tiene un número entero positivo (pista: se puede hacer dividiendo varias veces entre 10)*/ int main() { int num; int num2; printf("nIntroduce un numero:"); scanf("%d", &num); while (num > 1) { // asignar a num2 un valor antes de imprimir num2 = (num / 10); printf("nEl Número %d tiene %d cifras positivasn", num, num2); num /=10; } getchar(); return; }
Saludos
272
« en: Sábado 26 de Febrero de 2011, 17:09 »
Todo programa en C# necesita una clase con un metodo estatico Main(), que es la parte en donde comienza la ejecucion del programa. Dentro del Main() puedes llamar a las otras clases/metodos de tu programa. Solo puede haber un metodo llamado Main() en todo el programa, si colocas 2, tambien es un error. Ejemplo de la clase con metodo main(): class Program { static void Main() { // Codigo de tu programa } }
Saludos
273
« en: Viernes 25 de Febrero de 2011, 19:30 »
Bueno en realidad si buscas en google "convertir numeros a letras c sharp" encontraras muchas paginas en donde ya te dan el algoritmo y el programa hecho, asi te puede dar una idea de que hacer, es mas, en aqui mismo en solo codigo ya hay un codigo fuente que hace eso, solo que en Visual Basic, pero te puede servir. http://www.solocodigo.com/index.php?opt=viewitem&id=571&type=1&node=1Saludos
274
« en: Viernes 25 de Febrero de 2011, 01:31 »
Bueno mira, respecto a tu pregunta, no se que resultado esperas obtener, ya que solo tu sabes que datos contienen tus tablas, yo no se que dato contiene la columna A, solo te dire que cuando utilizas: SELECT A FROM `estudiantes`;
estas mostrando la columna A de todas las filas de la tabla destudiantes. y cuando uilizas: SELECT `estudiantes.A` FROM `estudiantes` INNER JOIN `docente` ON estudiantes.A = docente.A
estas mostrando la columna A de la tabla estudiantes, pero solo aquellas filas que cumplen la condicion de ser iguales en la columna A en las dos tablas (estudiantes y docente). Si el valor de la columna A en la tabla estudiantes no es igual con algun valor de la columna A de la tabla docente, y viceversa, esa fila no se mostrara. Espero que dicho eso te quede mas claro como funciona el Inner join Saludos
275
« en: Jueves 24 de Febrero de 2011, 04:33 »
El error mismo te lo esta indicando Column 'A' in field list is ambiguous Traducido: La columan A en la lista de campos es ambigua. Esto se debe precisamente a que la columna A se llama igual en las dos tablas, entonces no sabe si desplegar columna A de docentes o columna A de estudiantes. La solucion es especificar, cuando las dos columnas tienen el mismo nombre en tablas diferentes, a que tabla te refieres, retomando tu ejemplo seria algo como: SELECT `estudiantes.A` FROM `estudiantes` INNER JOIN `docente` ON estudiantes.A = docente.A LIMIT 0 , 30
Puede ser al contrario, usando docente.A en lugar de estudiantes.A, en este caso en particular no importa de que tabla tomas la columna. Saludos
Páginas: 1 ... 9 10 [11] 12 13 ... 32
|
|
|