Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - DarkSorcerer

#1
Dentro del curso es aprender Lisp, pero el lenguaje fue propuesto, es decir, tengo que investigarlo y exponerlo en una presentación.

Por ahora, solamente me he propuesto empezar desde lo mas sencillo, con la ayuda de la pagina "compileonline" para ver mis resultados, por lo que ahora lo único que quiero hacer es un programa que resuelva las 4 operaciones básicas matemáticas, como lo es la suma, resta, multiplicación y división, me ha costado un poco por que es muy difícil encontrar información de LISP y aún más en español.

Mi gran problema es el uso de funciones, me gustaría poder imprimir por pantalla los resultados que devuelven las funciones, o sea, en una funcion se hace una operación matemática, y este lo devuelve para que pueda ser desplegada por pantalla, pero no puedo lograrlo, no lo encuentro como si fuera Java o C++ donde tengo experiencia, en Lisp no puedo entender aún el uso de las funciones.

Bueno, directo al grano, pondré mi código, lo que yo espero de mi programa es que pueda imprimir por pantalla los resultados de las operaciones básicas, algo que no puedo lograr aún.
También pondré lo que sala en la pantalla de consola.

Código (lisp) [Seleccionar]
;Este programa prueba las 4 operaciones matematicas basicas, utilizando ademas
;seleccian de variables y funciones.

;Asignando valores enteros a las variables X e Y.
(defvar x 5)
(defvar y 10)

;Definiendo las funciones.
(defun saludar() (write-line "Bienvenidos a mi programa.")) ;Saluda al usuario.
(defun instruir() (write-line "Mi programa calcula las 4 operaciones matematicas.")) ;Explica al usuario de que trata el programa.
(defun espaciar() (write-line "") (write-line "")) ;Crea espaciado en el texto.
(defun despedirse() (write-line "Hasta pronto!"))
(defun valordeX() (write-line "El valor de X es: 10"))
(defun valordeY() (write-line "El valor de Y es: 5"))
(defun sumar(x y) (+ x y))
(defun restar(x y) (- x y))
(defun multiplicar(x y) (* x y))
(defun dividir(x y) (/ x y))

;Iniciando el programa con un saludo al usuario.

(saludar)
(espaciar)
(instruir)
(espaciar)
(valordeX)
(valordeY)
(espaciar)

;Resolviendo las 4 operaciones matematicas basicas.

(write-line "La suma de los 2 numeros es: ")
(print (sumar (x y)))
(espaciar)

(write-line "La resta de los 2 numeros es: ")
(print (restar (x y)))
(espaciar)

(write-line "La multiplicacion de los 2 numeros es: ")
(print (multiplicar (x y)))
(espaciar)

(write-line "La division de los 2 numeros es: ")
(print (dividir (x y)))
(espaciar)

;Antes de cerrar, el programa se despide del usuario.

(despedirse)


Y esto es lo que se ve por pantalla cuando ejecuto mi programa, o sea, falla cuando llega el momento de usar las operaciones matemáticas.

Executing the program....
$clisp main.lisp
Bienvenidos a mi programa.


Mi programa calcula las 4 operaciones matemáticas.


El valor de X es: 10
El valor de Y es: 5


La suma de los 2 numeros es:
*** - EVAL: undefined function X
#2
ACTUALIZACIÓN: Ya pudo resolver mis problemas, logré codificar 100% los métodos

Llevo muchas horas fraccionada en algunos días sin poder solucionar mi problema, resulta que estoy teniendo serios problemas con la implementación de los métodos para eliminar nodos de un arbol binario de búsqueda, tanto de forma recursiva o iterativa, también tengo un serio problema agregando nuevos valores pero de manera ITERATIVA, de la forma recursiva no tengo problema.

Acerca del metodo de eliminacion, yo solo tengo la teoría, pero la práctica es donde estoy perdiendo a tal punto que me están dando ganas de tirar la computadora por la ventana, ojalá me puedan ayudar.

Bueno, lo que tengo entendido que para la eliminación de un arbol binario de busqueda, se pueden presentar 3 casos

1 - Que el nodo sea una hoja, lo cual es sencillo de eliminar (directamente)

2 - Que el nodo solo tenga un hijo, donde será necesario conectar el padre de ese nodo con el hijo del nodo eliminado.

3 - Si no se cumplen los 2 casos anteriores, se puede remplazar por el menor del subarbol derecho, por lo que cree una funcion que buscara el menor segun el nodo señalado.

Pongo el codigo del Arbol y del Nodo, ojala puedan ayudarme, no pondre todo el codigo del programa por que es muy grande, solo los que tengo problemas

Código (cpp) [Seleccionar]
#ifndef NODO_H
#define NODO_H
#include <iostream>

using namespace std;

class Nodo {
public:
   
   int dato;
   Nodo *izquierdo;
   Nodo *derecho;
   
   Nodo(int d);
   virtual ~Nodo();
   
private:

};

#endif /* NODO_H */



Código (cpp) [Seleccionar]
#include "Nodo.h"

Nodo::Nodo(int d) {
   
   this->dato = d;
   this->izquierdo = NULL;
   this->derecho = NULL;
   
}

Nodo::~Nodo() {
   
   cout << "\n\nEliminando nodo " << dato << ".\n\n";
   
}



Código (cpp) [Seleccionar]
#ifndef ARBOLBINARIO_H
#define ARBOLBINARIO_H
#include "Nodo.h"
#include <iostream>

using namespace std;

class ArbolBinario {
public:
   
   Nodo *raiz;
   
   ArbolBinario(); //Implementado.
   virtual ~ArbolBinario(); //Implementado.
   void insertarRecursivo(int d); //Implementado exitosamente.
   void insertarIterativo(int d); //Preguntar como resolverlo.
   void eliminarRecursivo(int d);
   void eliminarIterativo(int d);
   bool buscarRecursivo(int d); //Implementado exitosamente.
   bool buscarIterativo(int d); //Implementado exitosamente.
   void preordenRecursivo(); //Implementado exitosamente.
   void preordenIterativo(); //Implementado exitosamente.
   void inordenRecursivo(); //Implementado exitosamente.
   void inordenIterativo(); //Implementado exitosamente.
   void posordenRecursivo(); //Implementado exitosamente.
   void posordenIterativo();
   void recorrerNiveles(); //Implementado exitosamente.
   int contarNodos(); //Implementado exitosamente.
   int contarHojas(); //Implementado exitosamente.
   int alturaArbol1(); //Implementado exitosamente.
   int alturaArbol2(); //Implementado exitosamente.
   Nodo* buscarMenor(); //Implementado exitosamente.
   Nodo* buscarMayor(); //Implementado exitosamente.
   Nodo* buscarMenor(Nodo *p); //Implementado exitosamente
   Nodo* buscarMayor(Nodo *p); //Implementado exitosamente
   Nodo* obtenerNodo(int d); //Implementado exitosamente.
   void copiar(ArbolBinario *a); //Implementado exitosamente.
   bool comparar(ArbolBinario *a); //Implementado exitosamente.
   void destruir(); //Implementado exitosamente.
   
private:
   
   Nodo* insertarRecursivo(int d, Nodo *p);
   void eliminarRecursivo(int d, Nodo *q, Nodo *p);
   bool buscarRecursivo(int d, Nodo *p);
   void preordenRecursivo(Nodo *p);
   void inordenRecursivo(Nodo *p);
   void posordenRecursivo(Nodo *p);
   int contarNodos(Nodo *p);
   int contarHojas(Nodo *p);
   int alturaArbol1(Nodo *p);
   int alturaArbol2(Nodo *p);
   Nodo* obtenerNodo(int d, Nodo *p);
   Nodo* copiar(Nodo *p);
   bool comparar(Nodo *p, Nodo *q);
   void destruir(Nodo *p);
   void cortarNodo(Nodo *p, Nodo *q);

};

#endif /* ARBOLBINARIO_H */


Código (cpp) [Seleccionar]
#include "ArbolBinario.h"
#include <queue>
#include <stack>

ArbolBinario::ArbolBinario() {
   
   this->raiz = NULL;
   
}

ArbolBinario::~ArbolBinario() {
   
   cout << "\n\nEliminando arbol binario.\n\n";
   destruir();
   
}

void ArbolBinario::insertarRecursivo(int d){
   
   this->raiz = insertarRecursivo(d,raiz);
   
}

Nodo* ArbolBinario::insertarRecursivo(int d, Nodo *p){
   
   if(p == NULL){
       
       p = new Nodo(d);
       return p;
       
   }else{
       
       if(p->dato == d){
           
           return p;
           
       }
       
       if(d < p->dato){
           
           p->izquierdo = insertarRecursivo(d,p->izquierdo);
           
       }else{
           
           p->derecho = insertarRecursivo(d,p->derecho);
           
       }
       
       return p;
       
   }
   
}

void ArbolBinario::insertarIterativo(int d){
   
   if(raiz == NULL){
       
       this->raiz = new Nodo(d);
       
   }else{
       
       Nodo *actual;
       Nodo *detras;
       
       while(actual != NULL){
           
           if(actual->dato == d){
               
               return;
               
           }
           
           detras = actual;
           
           if(d < actual->dato){
               
               actual = actual->izquierdo;
               detras->izquierdo = actual;
               
           }else{
               
               actual = actual->derecho;
               detras->derecho = actual;
               
           }
           
       }
       
       actual = new Nodo(d);
       
   }
   
}

void ArbolBinario::eliminarRecursivo(int d){
   
   eliminarRecursivo(d,raiz,raiz);
   
}

void ArbolBinario::eliminarRecursivo(int d, Nodo *q, Nodo *p){
   
   if(p != NULL){
       
       if(p->dato == d){
           
           cortarNodo(q,p);

           
       }else{
           
           q = p;
           
           if(d < p->dato){
               
               p = p->izquierdo;
               eliminarRecursivo(d,q,p);
               
           }else{
               
               p = p->derecho;
               eliminarRecursivo(d,q,p);
               
           }
           
       }
       
   }
   
}

void ArbolBinario::cortarNodo(Nodo *q, Nodo *p){
   
   //Si el nodo a eliminar es una hoja, se borra sin problemas.  
   
   if(p->izquierdo == NULL && p->derecho == NULL){
       
       delete p;
       return;
       
   }
   
   //Si el nodo tiene solo un hijo izquierdo, se remplaza por su nieto.
   
   if(p->izquierdo != NULL && p->derecho == NULL){
       
       if(p->dato < q->dato){
           
           q->izquierdo = p->izquierdo;
           delete p;
           
       }else{
           
           q->derecho = p->izquierdo;
           delete p;
           
       }
       
       return;
       
   }
   
   //Si el nodo tiene un solo hijo derecho, se remplaza por su nieto.
   
   if(p->izquierdo == NULL && p->derecho != NULL){
       
       if(p->dato < q->dato){
           
           q->izquierdo = p->derecho;
           delete p;
           
       }else{
           
           q->derecho = p->derecho;
           delete p;
           
       }
       
       return;
       
   }
   
   //De lo contrario, se encuentra en lo profundo de las ramas. Remplazar por
   //el menor del subarbol derecho.
   
   Nodo *menor = buscarMenor(p->derecho);    
   p->dato = menor->dato;
   delete menor;
   return;
   
}


#3
Empiezo con mi caso, fue a los 5 años cuando estaba en el kinder, recuerdo que en la escuela lanzaron un proyecto de alfabetización digital y nos llevaron un día a la sala de computación, las computadoras tenían Windows 98, no me acuerdo de las especificiaciones técnicas como capacidad de disco duro o memoria RAM, pero recuerdo que por curiosidad movía el mouse, apretaba las teclas del teclado y de a poco fui descubriendo como funcionaba, cuando llegaba las clases de computación prendía y apagaba yo solo el PC sin que la profesora la encendiera xD (ella tenía que encenderla), sabía ingresar Diskettes o CD ROMS, instalar programas, desintalarlos, cosas sencillas que todo el mundo sabe hoy, después como a los 8 años mi papá me regaló mi primera computadora, era un HP Pavillion con 10 GB de disco duro, procesador Intel Pentium III 550 Mhz y 64 MB de RAM, y fue mi sueño cumplido xD, al año siguiente pusieron Internet, yo lo había escuchado en la tele lo que se podía hacer, como nadie en mi casa sabía como entrar, recuerdo que en mi PC habpia un icono que decía Internet Explorer, hice click, me abrió el navegador y decía "Haga click aquí para acceder al tutorial", hice click y ahí aprendí a como navegar.
Como dije anteriormente, mi maestra fue la curiosidad.
#4
Estoy buscando libros o en su defecto "manuales" de Estructura de Datos en C++, busco un libro que explique tanto con teoría como con ejercicios resueltos y su implementación del código, pero me he pasado toda la tarde buscando en Google, Duck Duck Go o Ixquick y no encuentro ningún libro, bueno, si he encontrado, pero están para la venta y lamentablemente no tengo dinero como para comprarlos y mis padres no quieren comprarmelo por Ebay o Amazon No puedo encontrar alguna página donde alguien se haya dado el trabajo de escanear el libro y publicarlo.

Me citaron el libro "Fundamentals of Data Structures in C++" por Ellis Horowitz pero no lo puedo encontrar el libro escaneado, solo encontré un PDF incompleto y otro que está para la venta

Lo ideal es poder estudiar las siguientes estructuras de datos.

1 - Listas enlazadas
2 - Pilas
3 - Colas
4 - Arboles binarios y Arboles Binarios de Busqueda
5 - Arboles Enhebrados
6 - Listas generalizadas
7 - Heaps (monticulos) y su aplicación para el ordenamiento (Heap Sort)

Bueno, estaría muy agradecido si me pudieran ayudar dandome algún link para descargar algún libro o un manual, puede ser tanto en Español como en Inglés´, porfavor .

PD: Estoy de vacaciones y me gustaría aprovechar mi tiempo estudiando esas estructuras de datos xD.

Saludos y que tengan buen día.
#5
Para repasar en programación en C, quise crear un programa que consiste en escribir un fichero de texto, para despues leerlo, tengo unas advertencias que tienen que ver con el comando exit(1), además, ¿ Existe alguna forma de escribir en el fichero cada vez que se teclea el caracter sin apretar ENTER ?, me gustaría poder escribir en el fichero a medida que tecleo el caracter y si hay una equivocacón, borrarlo del fichero, además había propuesto que el fichero pudiera escribir cadenas de tal manera que incluya los espacios en blanco. Un pequeño problema es cuando se lee el fichero, al final de la ultima linea aparece un caracter extraño, por ejemplo, me aparece esto

Escriba su oracion: Hola soy Goku, y esta sera mi gran batalla.


Fichero escrito exitosamente.

Comenzando lectura del fichero:

Hola soy Goku, y esta sera mi gran batalla.ÿ

RUN SUCCESSFUL (total time: 17s)



Y otro problema estético que tengo es que cuando escribo mi oración por medio del teclado, si me equivoque en una palabra, al momento de borrar aveces no me borrar de la pantalla las letras que quiero eliminar, si no que el cursor se desplaza hacia atras sin borrar, solo para sobrescribir.

/*
* File:   main.c
* Author: Rodrigo Pizarro
*
* Este programa permite escribir y leer ficheros de texto.
*
* Created on 23 de enero de 2014, 09:55 PM
*/

#include <stdio.h>
#include <ctype.h>

FILE *ficheroEscritura;
FILE *ficheroLectura;

/**
* Funcion que permite preparar y abrir el fichero para su lectura.
*/

void prepararLectura(){
 
   ficheroLectura = fopen("fichero.txt","r");
   
   if(ficheroLectura == NULL){
       
       printf("\n\nError: Fichero de lectura no encontrado o roto, se cerrara el programa.");
       exit(1);
       
   }
   
}

/**
* Funcion que permite preparar y abrir el fichero para su escritura.
*/

void prepararEscritura(){
   
   ficheroEscritura = fopen("fichero.txt","w");
   
   if(ficheroEscritura == NULL){
       
       printf("\n\nNo se pudo crear el archivo de lectura, se cerrara el programa.");
       exit(1);
       
   }
   
}

/**
* Funcion que permite leer caracter por caracter un fichero e imprimirlo por
* la pantalla.
*/

void leerFichero(){
   
   char letra;
   
   printf("\n\nComenzando lectura del fichero:\n\n");
   
   while(!feof(ficheroLectura)){
       
       letra = getc(ficheroLectura);
       
       if(isspace(letra)){
           
           printf(" ");
           
       }else{
           
           printf("%c",letra);
           
       }
       
   }
   
   fclose(ficheroLectura);
   
}

/**
* Funcion que permite escribir caracter a caracter en el fichero.
*/

void escribirFichero(){
   
   printf("Escriba su oracion: ");
   
   char cadena[140];
   gets(cadena);
   
   fputs(cadena,ficheroEscritura);
   
   if(fclose(ficheroEscritura) == 0){
       
       printf("\n\nFichero escrito exitosamente.");

   }else{
       
       printf("\n\nError: No se pudo cerrar el fichero.");
       
   }
   
}

int main(){
   
   prepararEscritura();
   escribirFichero();
   prepararLectura();
   leerFichero();
   
   getchar();
   return 0;
   
}
#6
En mi país (que es sudamericano) a los jefes de proyectos o los que tienen cargos de jefatura donde no ven casi ninguna línea de código son los que los tratan como verdaderos dioses o "gurus", y se refleja también en su sueldo, pero en cambio, a los programadores los tratan como fracasados, "albañiles" y escuche un refrán respectivo por ahí donde decían que "cualquier mono sentado en una computadora puede programar" y los sueldos que les pagan son tan miserables que apenas alcanza para vivir o mantener una familia, en otros países a los programadores los tratan como gurus a los que son muy buenos.

No se si en sus países será así, ¿ alguien escuchó ese refrán de que los monos pueden programar ? (pareciera ser un insulto)
#7
Yo cuando estuve estudiando el lenguaje C, vi que se podía pasar parámetros a una función de diferentes formas, están por "valor" y por "referencia", a sí que quise repasar haciendo un pequeño programa que usa la clásica función swap que sirve para cambiar valores a 2 números, me complicó mas el de pasar por referencia, les dejo el código, la función swap1 y swap3 no tuve problemas, mi problema es el swap2, yo he visto que algunos pone el & en los parametros, a mi me acomodaba mas por punteros, pero igual quiero saber de la otra forma, también les dejo lo que me salió de error, uso Netbeans 7.3, compilador cygwin.

#include <stdio.h>

void swap1(int *x, int *y){
   
   int aux = *x;
   *x = *y;
   *y = aux;
   
}

void swap2(int &x, int &y){
   
   int aux = x;
   x = y;
   y = aux;

}

void swap3(int x, int y){
   
   int aux = x;
   x = y;
   y = aux;
   
}

int main(){
   
   int x = 2;
   int y = 3;
   
   printf("El valor de X e Y respectivamente en el main es %i y %i.\n\n",x,y);
   
   swap1(&x,&y);
   printf("El valor de X e Y despues de la funcion swap1 es %i y %i.\n\n",x,y);
   
   swap2(x,y);
   printf("El valor de X e Y despues de la funcion swap2 es %i y %i.\n\n",x,y);
   
   swap3(x,y);
   printf("El valor de X e Y despues de la funcion swap3 es %i y %i.\n\n",x,y);
     
   getchar();
   return 0;
   
}


"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory '/cygdrive/c/Users/Rodrigo Pizarro/Desktop/Archivos Varios/Ejercicios/Ejemplo06'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin_4.x-Windows/ejemplo06.exe
make[2]: Entering directory '/cygdrive/c/Users/Rodrigo Pizarro/Desktop/Archivos Varios/Ejercicios/Ejemplo06'
mkdir -p build/Debug/Cygwin_4.x-Windows
rm -f build/Debug/Cygwin_4.x-Windows/main.o.d
gcc    -c -g -MMD -MP -MF build/Debug/Cygwin_4.x-Windows/main.o.d -o build/Debug/Cygwin_4.x-Windows/main.o main.c
main.c:11:16: error: expected ';', ',' or ')' before '&' token
void swap2(int &x, int &y){
               ^
nbproject/Makefile-Debug.mk:66: recipe for target 'build/Debug/Cygwin_4.x-Windows/main.o' failed
make[2]: Leaving directory '/cygdrive/c/Users/Rodrigo Pizarro/Desktop/Archivos Varios/Ejercicios/Ejemplo06'
nbproject/Makefile-Debug.mk:59: recipe for target '.build-conf' failed
make[1]: Leaving directory '/cygdrive/c/Users/Rodrigo Pizarro/Desktop/Archivos Varios/Ejercicios/Ejemplo06'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
make[2]: *** [build/Debug/Cygwin_4.x-Windows/main.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2


BUILD FAILED (exit value 2, total time: 1s)


Saludos a todos
#8
Llevo una buena cantidad de tiempo buscando información y ejemplos para lo que quiero investigar que es cálculo del tiempo de ejecución de un algoritmo, sobretodo, lo que más estoy buscando son ejercicios resueltos (escrito en pseudocódigo) ya que yo aprendo más por medio de ejemplos que de teoría y buscando por google encontré solamente muchos sitios donde se abusa de la teoría y casi nada de ejemplos, ando buscando en la notación "O", solamente busco aprender por medio del "conteo de número de instrucciones" y no usando fórmulas matemáticas monstruosas que aveces dan ganas de tirar la computadora por la ventana, eso quiero evitarlo por ahora. He buscado en muchas partes, incluso buscando en otro idioma como en Inglés, pero igual no puedo encontrar ejemplos. También puede ser mucho texto pero evitando complejas fórmulas matemáticas.

En resumen, me gustaría recibir ayudar de expertos y que me recomienden material para poder investigar sobre la complejidad temporal de un algoritmo, usando la notación "Big O", evaluando el peor y mejor caso y solamente consistiendo en contar el numero de instrucciones y evitar a toda costa fórmilas matemáticas monstrousas. Por ejemplo, quiero aprender a identificar cuando el algoritmo es tipo O(log n), O(2^n), O(nlogn), etc.

Les dejo un ejemplo de que tipo de material me estoy refiriendo y ando buscando (lo que he encontrado hasta ahora)

http://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/

http://discrete.gr/complexity/?es

http://latecladeescape.com/t/Qué+es+la+complejidad+de+un+algoritmo

Y lo que trato de evitar a toda costa es este tipo de material

http://www.lcc.uma.es/~av/Libro/CAP1.pdf

Si se fijan y si van al fondo del apunte, hay muchas fórmilas matemáticas, sumatorias, ecuaciones, límites, etc.

Estaría agradecido que me puedan ayudar a buscar material, ya que no encuentro material para dummies xD.

#9
Saludos comunidad, tengo un error muy gordo acerca de los structs en C, resulta que quiero crear personas usando structs en vez de crear una clase (paradojicamente, empecé al revés, es decir, de C++ a C)

La cosa es que cree una estructura que representa a una persona, tiene un nombre, apellido paterno, apellido materno, edad y rut (numero de identificación), la cosa es que en el main quiero crearlos y através de una función es la que imprime por pantalla los valores de cada persona para ahorrar lineas de código, pero no me funciona, me vi obligado a hacerlo en el main y también me sale error, les pongo mi código para que me puedan ayudar porfavor. Estoy usando DevC++. En el fondo del post se encuentra una captura del error.

#include <stdio.h>
#include <windows.h>

struct persona{

    char nombre[20];
    char apellidoP[20];
    char apellidoM[20];
    char rut[10];
    int edad;       
       
}

void desplegarValores(struct persona p){
     
    printf("Nombre: %s\n",p.nombre);
    printf("Apellido paterno: %s\n",p.apellidoP);
    printf("Apellido materno: %s\n",p.apellidoM);
    printf("Rut: %s\n",p.rut);
    printf("Edad: %i\n\n",p.edad);     
     
}

int main(){
   
    struct persona persona1;
    struct persona persona2;
    struct persona persona3;
   
    persona1.nombre = "Rodrigo";
    persona1.apellidoP = "Saavedra";
    persona1.apellidoM = "Pizarro";
    persona1.rut = "ASDF-1";
    persona1.edad = 23;
   
    persona2.nombre = "Jorge";
    persona2.apellidoP = "Muñoz";
    persona2.apellidoM = "Cardenas";
    persona2.rut = "QWERT-1";
    persona2.edad = 27;
   
    persona3.nombre = "Francisco";
    persona3.apellidoP = "Sanchez";
    persona3.apellidoM = "Villagra";
    persona3.rut = "ZXCV-3";
    persona3.edad = 56;
   
    desplegarValores(persona1);
    desplegarValores(persona2);
    desplegarValores(persona3);
   
    printf("Nombre: %s\n",persona1.nombre);
    printf("Apellido paterno: %s\n",persona1.apellidoP);
    printf("Apellido materno: %s\n",persona1.apellidoM);
    printf("Rut: %s\n",persona1.rut);
    printf("Edad: %i\n\n",persona1.edad);
   
    printf("Nombre: %s\n",persona2.nombre);
    printf("Apellido paterno: %s\n",persona2.apellidoP);
    printf("Apellido materno: %s\n",persona2.apellidoM);
    printf("Rut: %s\n",persona2.rut);
    printf("Edad: %i\n\n",persona2.edad);
   
    printf("Nombre: %s\n",persona3.nombre);
    printf("Apellido paterno: %s\n",persona3.apellidoP);
    printf("Apellido materno: %s\n",persona3.apellidoM);
    printf("Rut: %s\n",persona3.rut);
    printf("Edad: %i\n\n",persona3.edad);
   
    system("PAUSE");
    return 0;   
   
}


#10
Este es un problema que ocurre al ingresar por error un caracter no numerico.

Tengo un programa en que desde el main se despliega un menu (dentro de un ciclo infinito), para que el usuario pueda elegir la opcion que necesito, yo decidi usar un switch para ir a los submenus, la cosa es que el switch solo acepta numeros enteros, ademas, dentro del while hay un bloque try/catch, por que decidi implementar una forma de lanzar una excepcion cuando detecte el problema y para que el programa no se detenga. La excepcion se envia a una funcion "indentificarExcepcion", que no es nada mas que imprimir por pantalla el tipo de error , por ejemplo, cuando se ingrese mal en el menu, mandara un 1 y al procesar la excepcion, saldra por pantalla "Error: Ingrese caracteres no numericos".
El problema que mas me complica es que si ingreso una letra, pareciera ser que el ciclo while se vuelve loco e imprime el menu infinitas veces, por ahi lei que es necesario usar el clear para restablecer "cin" y tambien usar el flag cin.fail(), pero no tengo los resultados esperados. Les dejo mi codigo.


Código (cpp) [Seleccionar]


#include <cstdlib>
#include <iostream>
#include <windows.h>
#include "Operaciones.h"

using namespace std;
using namespace operaciones;

void opcion1(){
   
    cout <<"\e[2J";
    cout <<"\n::::: MATRIZ TRASPUESTA :::::\n";   
    continuar();
   
}

void opcion2(){
   
    cout <<"\e[2J";
    cout <<"\n::::: ELIMINAR VALOR :::::\n";     
    continuar();
   
}

void opcion3(){
   
    cout <<"\e[2J";
    cout <<"\n::::: ELIMINAR COLUMNA :::::\n";
    continuar();
   
}

void opcion4(){
   
    cout <<"\e[2J";
    cout <<"\n::::: ELIMINAR MATRIZ :::::\n"; 
    continuar();
   
}

void opcion5(){
   
    cout <<"\e[2J";
    cout <<"\n::::: SUMA ESPECIAL DE UNA MATRIZ :::::\n";
    continuar();
   
}

void opcion6(){
   
    cout <<"\e[2J";
    cout <<"\n::::: AGREGAR VALOR :::::\n";   
    continuar();
   
}

void opcion7(){
   
    cout <<"\e[2J";
    cout <<"\n::::: INGRESAR NUEVA MATRIZ :::::\n";
    continuar();
   
}

void opcion8(){
   
    cout <<"\e[2J";
    cout <<"\n::::: TODAS LAS MATRICES DEL SISTEMA :::::\n";
    continuar();
   
}

int main(int argc, char** argv) {
   
    int opcion;
   
    while(true){
       
        desplegarMenu();
       
        try{
           
            cin >> opcion;
           
            if(cin.fail()){
               
                cin.clear();
                throw 1;
               
            }

            switch(opcion){
               
                case 1:
                   
                    opcion1();
                   
                    break;
                   
                case 2:
                   
                    opcion2();
                   
                    break;
                   
                case 3:
                   
                    opcion3();
                   
                    break;
                   
                case 4:
                   
                    opcion4();
                   
                    break;
                   
                case 5:
                   
                    opcion5();
                   
                    break;
                   
                case 6:
                   
                    opcion6();
                   
                    break;
                   
                case 7:
                   
                    opcion7();
                   
                    break;
                   
                case 8:
                   
                    opcion8();
                   
                    break;
                   
                case 9:
                   
                    salir();
                   
                    break;
            }
           
        }catch(int e){
           
            identificarExcepcion(e);
           
        }
       
       
    }

    return 0;
}

#11
Tengo un problema, tengo que hacer un programa que lea la informacion de unas matrices contenidas en un fichero, en el fichero esta el nombre de la matriz, cantidad de filas, cantidad de columnas y la forma de la matriz.
La informacion se encuentra separada por comas, a si que se me ocurrio usar fstream e ifstream por ser un archivo de entrada, y uso el metodo getline(fichero,palabra), pero al momento de bajar una linea (una vez que llega al final de una linea), el programa se desfasa y pareciera ser que toma el espacio en blanco, por que cuando mando a imprimir los datos leidos por el fichero, me imprime ademas de los numeros, los espacios en blanco, y no he podido encontrar solucion

El formato del fichero es asi

MATRIZ 1,
3,
3,
4,0,6
2,0,1
0,8,1
MATRIZ 2,
2,
2,
6,2,
0,4,
MATRIZ 3,
4,
2,
1,2,
3,0,
0,6,
7,0,
MATRIZ 4,
2,
4,
1,0,0,4,
5,6,0,8,
MATRIZ 5,
5,
5,
1,0,0,0,2,
0,3,0,4,5,
0,0,0,6,0,
7,8,0,0,0,
9,0,0,7,4,


#12
Estaba haciendo un ejercicio con uso de punteros, arreglos y asignación dinámica, todo marchaba perfectamente pero con un pequeño error en la última parte y no se por que sera.

Mi ejercicio consiste en esto: Quiero crear una "lista" llamada Carpeta que contiene un arreglo de punteros a Alumno, cada alumno tiene nombre, rut (número de identificación en mi pais) y edad.

En el main cree en un ciclo for que solo agregue 3 alumnos, se pide ingresar por teclado el nombre, rut y edad y se agrega a la carpeta, todo marcha bien, el problema sucede cuando es hora de mostrar los resultados, una vez que termino de ingresar los datos, la última instrucción es desplegar los datos, pero hay un problema con el ciclo for, por que dentro de la función "desplegar" de Carpeta, hay un título que dice "Datos de los alumnos", eso lo imprime correctamente, pero llega al for y comienza el problema y no se por que sera. Ojalá me puedan ayudar.

Les pongo lo que me sale en la pantalla de comandos y el código.

Ingresando datos

Individuo 1
Ingrese nombre: Juan
Ingrese RUT: 1234
Ingrese edad: 15

Individuo 2
Ingrese nombre: Simon
Ingrese RUT: 4321
Ingrese edad: 17

Individuo 3
Ingrese nombre: Rodrigo
Ingrese RUT: 5678
Ingrese edad: 16

Datos de los alumnos

RUN FAILED (exit value 1,, total time: 36s)


Código (cpp) [Seleccionar]
#ifndef CARPETA_H
#define CARPETA_H
#include "Alumno.h"
#include <string>

using namespace std;

class Carpeta {
public:
    Carpeta();
    Carpeta(const Carpeta& orig);
    virtual ~Carpeta();
    void agregarAlumno(Alumno *a);
    Alumno* getAlumno(string n);
    void desplegar();
    bool isFull();
    bool isEmpty();
private:
    Alumno **alumnos;
    int cantAlumnos;
};

#endif /* CARPETA_H */



Código (cpp) [Seleccionar]
#include "Carpeta.h"
#include <iostream>
#include <string>

using namespace std;

/*
* Constructor por defecto de la carpeta, planeado para un curso de 40 alumnos.
*/

Carpeta::Carpeta() {
   
    this->alumnos = new Alumno*[40];
    this->cantAlumnos = 0;
   
}

Carpeta::Carpeta(const Carpeta& orig) {   
}

/*
* Destructor.
*/

Carpeta::~Carpeta() {
   
    cout << "\nEliminando carpeta";
    delete []alumnos;
   
}

/*
* Funcion que agrega un puntero a Alumno a la lista.
*/

void Carpeta::agregarAlumno(Alumno *a){
   
    if(isFull()){
       
        cout << "\nEsta lleno";
       
    }else{
       
        alumnos[cantAlumnos];
        cantAlumnos++;
       
    }
   
}

/*
* Funcion que devuelve un puntero a Alumno
*/

Alumno* Carpeta::getAlumno(string nombre){
   
    if(isEmpty()){
       
        cout << "\nEsta vacio\n";
       
    }else{
       
        for(int i=0; i<cantAlumnos; i++){
           
            if(alumnos[i]->getNombre() == nombre){
               
                return alumnos[i];
               
            }
        }
    }
   
}

/*
* Funcion que verifica si la lista esta vacia.
*/

bool Carpeta::isEmpty(){
   
    if(cantAlumnos == 0){
       
        return true;
       
    }else{
       
        return false;
       
    }
   
}

/*
* Funcion que verifica si la lista esta llena.
*/
bool Carpeta::isFull(){
   
    if(cantAlumnos == 40){
       
        return true;
       
    }else{
       
        return false;
       
    }
   
}

/*
* Funcion que despliega todos los alumnos de la lista.
*/

void Carpeta::desplegar(){
   
    cout <<"\nDatos de los alumnos\n";
   
    for(int i=0; i<cantAlumnos; i++){
       
        cout <<"\nNombre: " << alumnos[i]->getNombre();
        cout <<"\nRut: " << alumnos[i]->getRut();
        cout <<"\nEdad: " << alumnos[i]->getRut();
       
    }
}



Código (cpp) [Seleccionar]
#ifndef ALUMNO_H
#define ALUMNO_H
#include <string>

using namespace std;

class Alumno {
public:
    Alumno();
    Alumno(string n, string r, int e);
    Alumno(const Alumno& orig);
    virtual ~Alumno();
    string getNombre();
    string getRut();
    int getEdad();
private:
    string nombre;
    string rut;
    int edad;
};

#endif /* ALUMNO_H */



Código (cpp) [Seleccionar]
#include "Alumno.h"
#include <string>
#include <iostream>

using namespace std;

Alumno::Alumno() {
}

Alumno::Alumno(string n, string r, int e){
   
    this->nombre = n;
    this->rut = r;
    this->edad = e;
   
}

Alumno::Alumno(const Alumno& orig) {
   
    // Sin implementar.
   
}

Alumno::~Alumno() {
   
    cout << "\nEliminando alumno";
   
}

string Alumno::getNombre(){
   
    return nombre;
   
}

string Alumno::getRut(){
   
    return rut;
   
}

int Alumno::getEdad(){
   
    return edad;
   
}



Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>
#include "Alumno.h"
#include "Carpeta.h"
#include <string>

using namespace std;

Carpeta carpetaAlumnos;

int main(int argc, char** argv) {
   
    string nombre;
    string rut;
    int edad;
   
    cout << "Ingresando datos\n";
   
    for(int i=0; i<3; i++){
       
        cout << "\nIndividuo " << i+1 << "\n";
       
        cout <<"Ingrese nombre: ";
        getline(cin,nombre);
       
        cout <<"Ingrese RUT: ";
        getline(cin,rut);
       
        cout <<"Ingrese edad: ";
        cin >> edad;
       
        Alumno *alumno = new Alumno(nombre,rut,edad);
        carpetaAlumnos.agregarAlumno(alumno);
       
        cin.ignore();
       
    }
   
    carpetaAlumnos.desplegar();

    return 0;
}

#13
Solo hago esta pregunta para saber si esta bien, ya que soy novato aun, cree una lista enlazada simple, utilizando punteros para apuntar al nodo siguiente, utilizando POO.

El esquema de la lista es la siquiente

Head
  l
\/
O - O - O - ......................... - O - O - O - NULL

Ahora, cada vez que creo un nodo, lo hago de manera dinamica, sabiendo que no solamente debo borrar la lista cuando termine, si no tambien debo borrar todos los nodos de manera manual, pero no se si estara bien mi forma de borrar.

Todo funciona bien, pero no se si el metodo de eliminacion estara bien , mi objetivo es que se libere todo, y no queden en la memoria cuando termine el programa.

Código (cpp) [Seleccionar]
#ifndef LISTA_H
#define LISTA_H
#include "Nodo.h"

class Lista {
public:
    Lista();
    Lista(const Lista& orig);
    virtual ~Lista();
    void setHead(int d);
    Nodo* getHead();
    bool isEmpty();
private:
    Nodo *head;
};

#endif /* LISTA_H */



Código (cpp) [Seleccionar]
#include "Lista.h"
#include "Nodo.h"
#include <iostream>

using namespace std;

Lista::Lista() {
   
    head = NULL;
   
}

Lista::Lista(const Lista& orig) {   
}

/*
* Destructor de la lista. Borra uno por uno todos los Nodos que se asigno de for
* ma dinamica.
*
*/

Lista::~Lista() {
   
    cout <<"\nBorrando lista, borrando todos los elementos...\n";
   
    Nodo *aux;
   
    while(head != NULL){
       
        aux = head->getSiguiente(); //Guardando la posicion del nodo siguiente
        delete head; //Borrando lo que hay en la posicion de head
        head = aux; //Head apunta al siguiente del Head anterior
       
    }
   
}

/*
* Funcion que agrega un nuvo Nodo en la lista, colocandolo en la cabeza.
*/

void Lista::setHead(int d){
   
    Nodo *nuevo = new Nodo(d);
   
    if(isEmpty()){
       
        head = nuevo;
       
    }else{
       
        nuevo->setSiguiente(head);
        head = nuevo;
       
    }
   
}

/*
* Funcion que obtiene el primer Nodo de la lista.
*/

Nodo* Lista::getHead(){
   
    if(isEmpty()){
       
        cout << "\nLa pila esta vacia\n";
       
    }else{
       
        return head;
       
    }
   
}

/*
* Funcion que determina si la lista esta vacia o no lo esta.
*/

bool Lista::isEmpty(){
   
    if(head == NULL){
       
        return true;
       
    }else{
       
        return false;
       
    }
   
}


Código (cpp) [Seleccionar]
#ifndef NODO_H
#define NODO_H

class Nodo {
public:
    Nodo(int d);
    Nodo(const Nodo& orig);
    virtual ~Nodo();
    void setSiguiente(Nodo *s);
    int getDato();
    Nodo* getSiguiente();
private:
    int dato;
    Nodo *siguiente;
};

#endif /* NODO_H */



Código (cpp) [Seleccionar]
#include "Nodo.h"
#include <iostream>

using namespace std;

Nodo::Nodo(int d) {
   
    dato = d;
    siguiente = NULL;
}

Nodo::Nodo(const Nodo& orig) {
}

Nodo::~Nodo() {
   
    cout <<"\nDestruyendo nodo...\n";
   
}

/*
* Funcion que agregar el nodo siguiente
*/

void Nodo::setSiguiente(Nodo *s){
   
    siguiente = s;
   
}

/*
* Funcion que obtiene el valor contenido del nodo.
*/

int Nodo::getDato(){
   
    return dato;
   
}

/*
* Metodo que obtiene un puntero al siguiente Nodo.
*/

Nodo* Nodo::getSiguiente(){
   
    return siguiente;
   
}



Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>
#include "Lista.h"
#include "Nodo.h"

using namespace std;

int main(int argc, char** argv) {
   
    Lista lista;
   
    lista.setHead(10);
    lista.setHead(9);
    lista.setHead(8);
    lista.setHead(7);
    lista.setHead(6);
    lista.setHead(5);
    lista.setHead(4);
    lista.setHead(3);
    lista.setHead(2);
    lista.setHead(1);
    lista.setHead(0);
   
    //Obteniendo el primer nodo de la lista.
   
    Nodo *cabeza = lista.getHead();
   
    //Imprimiendo por pantalla los valores contenidos en cada nodo.
   
    while(cabeza != NULL){
       
        cout << cabeza->getDato() << endl;
        cabeza = cabeza->getSiguiente();
       
    }
   
    return 0;
}


#14
Estoy tratando de crear un Pila Generica, que me pueda almacenar todo tipo de datos, por ejemplo, poder crear una pila de enteros, otra de doubles, otra de floats, etc, vi que es necesario usar templates, estaba siguiendo el ejemplo de un libro cuyo autor se llama "Ellis Horowitz" pero la verdad que no lo veo muy explicativo, se salta muchos pasos, estaba buscando en otro sitio pero no puedo resolver la duda, ojala alguien me ayude.
Se me olvido decir que en la clase Pila no me deja mensajes con el "cout", me detecta error, ¿ a que se debera ? Lo deje como comentario.

Bueno, en este foro mucha gente me ha sacado de apuros, se los agradezco, ojala tambien en esta pueda salir, saltar de Java a C++ me fue un poco dificil, ahora pongo el codigo

Lo que me sale en la ventana de comandos:

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin_4.x-Windows/repaso39.exe
make[2]: Entering directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39'
mkdir -p build/Debug/Cygwin_4.x-Windows/_ext/931385675
rm -f build/Debug/Cygwin_4.x-Windows/_ext/931385675/Pila.o.d
g++    -c -g -MMD -MP -MF build/Debug/Cygwin_4.x-Windows/_ext/931385675/Pila.o.d -o build/Debug/Cygwin_4.x-Windows/_ext/931385675/Pila.o ../Repaso39/Pila.cpp
mkdir -p dist/Debug/Cygwin_4.x-Windows
g++     -o dist/Debug/Cygwin_4.x-Windows/repaso39 build/Debug/Cygwin_4.x-Windows/_ext/931385675/Pila.o  build/Debug/Cygwin_4.x-Windows/main.o
build/Debug/Cygwin_4.x-Windows/main.o: In function `main':
/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39/main.cpp:8: undefined reference to `Pila<int>::Pila(int)'
/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39/main.cpp:10: undefined reference to `Pila<int>::~Pila()'
collect2: error: ld returned 1 exit status
nbproject/Makefile-Debug.mk:63: recipe for target `dist/Debug/Cygwin_4.x-Windows/repaso39.exe' failed
make[2]: *** [dist/Debug/Cygwin_4.x-Windows/repaso39.exe] Error 1
make[2]: Leaving directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39'
nbproject/Makefile-Debug.mk:60: recipe for target `.build-conf' failed
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory `/cygdrive/c/Documents and Settings/Administrador/Escritorio/C++/Repaso39'
nbproject/Makefile-impl.mk:39: recipe for target `.build-impl' failed
make: *** [.build-impl] Error 2


BUILD FAILED (exit value 2,, total time: 5s)


Ahora el codigo

Código (cpp) [Seleccionar]
#include <cstdlib>
#include "Pila.h"

using namespace std;

int main(int argc, char** argv) {
   
   Pila<int> pila(10); //Creando una pila de enteros de 10 espacios

   return 0;
}



Código (cpp) [Seleccionar]
#ifndef PILA_H
#define PILA_H

template <class T>
class Pila {
public:
   
   Pila(int t);
   Pila(const Pila& orig);
   virtual ~Pila();
   void push(T e);
   T pop();
   bool isEmpty();
   bool isFull();
   
private:
   
   int tam; // El tamanio del arreglo
   int top; // La posicion del ultimo elemento
   T *arreglo;

};

#endif /* PILA_H */



Código (cpp) [Seleccionar]
#include "Pila.h"
#include <iostream>

template <class T>
Pila<T>::Pila(int t) {
   
   this->tam = t;
   this->top = -1;
   this->arreglo = new T[tam];
   
}

template <class T>
Pila<T>::Pila(const Pila& orig) {
   
   // Por implementar
   
}

template <class T>
Pila<T>::~Pila() {
   
   delete []arreglo;
   
}

/*
* Funcion que agrega un elemento a la pila.
*/

template <class T>
void Pila<T>::push(T e){
   
   if(isFull()){
       
       //cout << "\nLa pila esta llena\n";
       
   }else{
       
       arreglo[++top] = e;
       
   }
   
}

/**
* Funcion que obtiene un elemento de la pila.
* @return El elemento que esta el tope de la pila.
*/

template <class T>
T Pila<T>::pop(){
   
   if(isEmpty()){
       
       //cout << "\nLa pila esta vacia\n";
       
   }else{
       
       return arreglo[top--];
       
   }
}

/*
* Funcion que revisa si la pila esta vacia
*/

template <class T>
bool Pila<T>::isEmpty(){
   
   if(top == -1){
       
       return true;
       
   }
   
}

/*
* Funcion que revisa si la pila esta llena
*/

template <class T>
bool Pila<T>::isFull(){
   
   if(top == tam){
       
       return true;
       
   }
   
}

#15
Bueno, soy novato, espero que me puedan ayudar.

Estoy haciendo algunos ejercicios con punteros, cree una clase llamado "Auto" cuyos atributos son la marca, su patente (matricula) y el kilometraje, y en el main hice lo siguiente, cree 2 autos con asignacion automatica y 1 de forma dinamica, pero al momento de que se deben destruir al final del programa, me sale "RUN FAILED", ¿ a que se debera ?, yo en el destructor implemente de tal manera que informe de que se esta destruyendo el objeto.

Les dejo el codigo. Es probable que use este mismo tema para hacer consultas, mi proximo objetivo es practicar con listas enlazadas, ya tengo experiencia pero en Java, pero ahora quiero practicar con punteros.

NOTA 1: Cuando vean el codigo cuando el puntero auto3 apunta a auto2, ¿que sucede con los datos donde apuntaba auto3? , ¿ quedan para siempre en la memoria (a no ser que se reinicie) y tengo que usar delete ?

NOTA 2: Si tengo algun error o tienen una sugerencia, estaria agradecido que me lo dijeran.

Datos del auto 1

Marca:
Patente:
Kilometraje: 0

Datos del auto 2

Marca: Chevrolet
Patente: ASDF
Kilometraje: 300

Datos del auto3

Marca: Nissan
Patente: QWERT
Kilometraje: 500

Las direcciones de memoria de los autos son:

La direccion de memoria de auto 1 es: 0x22abe8
La direccion de memoria de auto 2 es: 0x22abd0
La direccion de memoria de auto 3 es: 0x22abcc

Ahora, auto3 va a apuntar a la direccion de auto2

La direccion de memoria de auto 3 es: 0x22abd0
La marca es: Chevrolet

Ahora, auto3 va a apuntar a la direccion de auto1

La direccion de memoria de auto 3 es: 0x22abe8
La marca es:


RUN FAILED (exit value 1,, total time: 734ms)





Código (cpp) [Seleccionar]
#include "Auto.h"
#include <string>
#include <iostream>

using namespace std;

Auto::Auto() {
   
   marca = "";
   patente = "";
   kilometraje = 0;
   
}

Auto::Auto(string m, string p, double k){
   
   marca = m;
   patente = p;
   kilometraje = k;
   
}

Auto::Auto(const Auto& orig) {
}

Auto::~Auto() {
   
   cout <<"\nDestruyendo el auto ...";
   
}

string Auto::getMarca(){
   
   return marca;
   
}

string Auto::getPatente(){
   
   return patente;
   
}

double Auto::getKilometraje(){
   
   return kilometraje;
   
}



Código (cpp) [Seleccionar]
#ifndef AUTO_H
#define AUTO_H
#include <string>
#include <iostream>

using namespace std;

class Auto {
public:
   Auto();
   Auto(string m, string p, double k);
   Auto(const Auto& orig);
   virtual ~Auto();
   string getMarca();
   string getPatente();
   double getKilometraje();
private:
   string marca;
   string patente;
   double kilometraje;
};

#endif /* AUTO_H */



Código (cpp) [Seleccionar]
#include <cstdlib>
#include "Auto.h"
#include <iostream>

using namespace std;

int main(int argc, char** argv) {
   
   Auto auto1;
   Auto auto2("Chevrolet","ASDF",300);
   Auto *auto3 = new Auto("Nissan","QWERT",500);
   
   cout <<"Datos del auto 1\n";
   cout <<"\nMarca: " << auto1.getMarca();
   cout <<"\nPatente: " << auto1.getPatente();
   cout <<"\nKilometraje: " << auto1.getKilometraje();
   cout <<"\n\n";
   
   cout <<"Datos del auto 2\n";
   cout <<"\nMarca: " << auto2.getMarca();
   cout <<"\nPatente: " << auto2.getPatente();
   cout <<"\nKilometraje: " << auto2.getKilometraje();
   cout <<"\n\n";
   
   cout <<"Datos del auto3\n";
   cout <<"\nMarca: " << auto3->getMarca();
   cout <<"\nPatente: " << auto3->getPatente();
   cout <<"\nKilometraje: " <<auto3->getKilometraje();
   
   cout <<"\n\nLas direcciones de memoria de los autos son:\n";
   cout <<"\nLa direccion de memoria de auto 1 es: " << &auto1;
   cout <<"\nLa direccion de memoria de auto 2 es: " << &auto2;
   cout <<"\nLa direccion de memoria de auto 3 es: " << &auto3;
   
   cout <<"\n\nAhora, auto3 va a apuntar a la direccion de auto2\n";
   auto3 = &auto2;
   cout <<"\nLa direccion de memoria de auto 3 es: "<< auto3;
   cout <<"\nLa marca es: "<< auto3->getMarca();
   
   cout <<"\n\nAhora, auto3 va a apuntar a la direccion de auto1\n";
   auto3 = &auto1;
   cout <<"\nLa direccion de memoria de auto 3 es: "<< auto3;
   cout <<"\nLa marca es: "<< auto3->getMarca();
   cout <<"\n";
   
   delete auto3;
   
   return 0;
   
}

#16
Primero que nada, soy novato en C++, espero poder surgir con la ayuda :D

Bueno, resulta que estoy practicando lo que he aprendido en C++, aun tengo que dominar los punteros y la asignacion dinamica. Tambien en la creacion de arreglos, donde les explicare mi problema.

Cree una clase llamada "Persona", que tiene como atributos su nombre, su rut (en mi pais se refiere al numero de identificacion) y la edad.

Yo quiero crear un arreglo de personas, desde el main creo 3 personas y ademas, llamo a un metodo para que imprima los datos de cada persona, me funciona, pero no exactamente como queria, en el destructor yo implemente de tal manera que imprimiera un mensaje que confirmara que se esta borrando cada vez que se usa delete, es aqui donde sale mi problema, una vez que llene mi arreglo con personas, mando el arreglo a la funcion "desplegarDatos" para que imprimiera los datos de cada persona, pero me sale lo que escribi en el destructor justo al llamar a imprimir el arreglo, y ya cuando termino de imprimir, vuelve a imprimir el mensaje del destructor

¿ por que se imprimio al principio "borrando datos..." si no llame a delete, si el delete lo llamo cuando terminara de imprimir ?

Esto es lo que me sale en la ventana de comandos

Creando un arreglo de 3 personas
Borrando datos ...
Borrando datos ... // ¿ Por que sale esto al principio cuando deberia ser al final ?
Borrando datos ...

Desplegando datos de las personas


Nombre: Rodrigo
Rut: 132-K
Edad: 23

Nombre: Francisco
Rut: 342-L
Edad: 20

Nombre: Samuel
Rut: 345-P
Edad: 21

Borrando datos ...
Borrando datos ...
Borrando datos ...
RUN SUCCESSFUL (total time: 703ms)


Ahora lees dejo mi codigo

Código (cpp) [Seleccionar]
#include "Persona.h"
#include <string>
#include <iostream>

using namespace std;

Persona::Persona(string n, string r, int e) {
   
    nombre = n;
    rut = r;
    edad = e;
   
}

Persona::Persona(const Persona& orig) {
}

Persona::Persona(){
   
}

Persona::~Persona() {
   
    cout <<"\nBorrando datos ...";
   
}

string Persona::getNombre(){
   
    return nombre;
   
}

string Persona::getRut(){
   
    return rut;
   
}

int Persona::getEdad(){
   
    return edad;
   
}



Código (cpp) [Seleccionar]
#ifndef PERSONA_H
#define PERSONA_H
#include <string>

using namespace std;

class Persona {
public:
    Persona(string nom, string r, int e);
    Persona();
    Persona(const Persona& orig);
    virtual ~Persona();
    string getNombre();
    string getRut();
    int getEdad();
private:
    string nombre;
    string rut;
    int edad;
};

#endif /* PERSONA_H */



Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>
#include "Persona.h"

using namespace std;

void desplegarDatos(Persona *arreglo){
   
    cout <<"\n\nDesplegando datos de las personas\n\n";
   
    for(int i=0; i<3; i++){
       
        cout <<"\nNombre: " << arreglo[i].getNombre();
        cout <<"\nRut: " << arreglo[i].getRut();
        cout <<"\nEdad: " << arreglo[i].getEdad();
        cout <<"\n";
       
    }
   
}

int main(int argc, char** argv) {
   
    cout <<"Creando un arreglo de 3 personas";
   
    Persona *personas = new Persona[3];
   
    personas[0] = Persona("Rodrigo","132-K",23);
    personas[1] = Persona("Francisco","342-L",20);
    personas[2] = Persona("Samuel","345-P",21);
   
    desplegarDatos(personas);
   
    delete []personas;

    return 0;
}


#17
Hola gente, soy novato en C++, me gustaría que me pudieran ayudar a como mandar por parametro un fichero que abro desde el main.
Lo que quiero es abrir el fichero desde el main, primero comprobar si todo marcha bien, si el fichero no se abrio, el programa avisa que fallo, de lo contrario, manda como parametro a una funcion que se encargara de leer el fichero dentro de un ciclo infinito hasta que no haya mas que extraer del archivo. El fichero tiene este formato

palabra1,palabra2,palabra3,..................................,palabraN

y quiero imprimir cada palabra x cada linea, por eso use getline(fichero,palabra,',');

Pero me salio un error gigante y no pudo funcionar como queria

Les dejo el codigo, estoy usando NetBeans 7.3

Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void leerFichero(ifstream fichero){
   
    string palabra;
   
    while(!fichero.eof()){
       
        getline(fichero,palabra,',');
        cout <<palabra;
       
    }
   
}

int main(int argc, char** argv) {
   
    ifstream fichero("personal.txt");
   
    if(fichero.is_open()){
       
        leerFichero(fichero);
       
    }else{
       
        cout <<"\nNo se pudo abrir el fichero";
       
    }

    return 0;
}

#18
La pregunta es clara.

¿ Que tan importante son las matematicas en el hacking ?

Unos me dicen que es ideal para la criptografía, pero, ¿ que otros usos más tienen ?

Por ejemplo, quiero citar algunas matemáticas para que me ayuden en que se usan, supongo que muchos son expertos en el area, espero que me ayuden porfavor.

- Algebra Lineal

- Calculo

- Probabilidades y estadística

- Lenguajes formales

- [[Ingrese otra aquí]]

#19
Estoy creando un juego que simula el Mario World, lo hice por medio de clases (por el momento no quiero poner el codigo todavia), el programa consta de una clase que se llama Mario (el jugador), otra que se llama Control que hereda de un JFrame, es aqui donde se implementa el control por teclado y el menu, y tambien una superclase Escenario que hereda de JPanel y dentro de cada Escenario tiene un wallpaper y "agrega" objetos de la clase Tile (que contiene un sprite y un booleano que indica si es solido o no, para que Mario camine).

Bueno, el problema es lo siguiente, yo implemente en la clase Control un Timer que llama a actionPerformed cada 1 segundo, la razon de esto es para que funcione el cronometro del juego, pero el problema es que cuando llamo a repaint para que actualice, la pantalla "pestañea", y aun no encuentro la solucion, se ve realmente molesto para la vista estar jugando mientras la pantalla pestañea.

Tambien tengo otra duda ¿Como podria "correr" la pantalla cada vez que Mario avanza hacia adelante ? Por que "mas al fondo" cree unas montañas pero no se como correr la vista hacia las montañas.

Aqui una imagen del juego, aun tengo que corregir el sprite de mario

#20
Hola, viendo que muchos son expertos en el area, me gustaría que me ayudaran, lo que pasa es que yo he programado en C, se lo relacionado a la programación estructurada, uso de punteros, direccion de memoria, etc, pero ahora quiero dar un paso hacia adelante, me gustaría programar en esas consolas de Nintendo, como la NES, SNES y Nintendo 64, estuve investigando y en NES y SNES se usa lenguaje Ensamblador dependiendo de la arquitectura de la consola, pero el año pasado encontre un blog de que existe una libreria para programar en C para el NES y SNES, pero lamentablemente se me perdio ese blog, por eso, si hay un experto o lo haya hecho antes, me gustaría que me guiaran por donde empezar y aprender.
#21
Siempre he tenido esa duda, quizas sea a mis 16 años que aun no me de cuenta, pero de curioso, estaba revisando la pagina linkedin de los programadores de videojuegos de grandes empresas (ejemplos, Rockstar, Naughty Dog, DICE, Pyro Studios, etc), muchos estudiaron, investigue sobre los planes de estudios de las universidades que ellos estudiaron y me di cuenta que en los primeros cursos le dan durisimo a esto, vi cosas como "Calculos", "Algebra Lineal", "Fisicas", "Teoria de Grafos", "Calculo Vectorial" y despues de pasar eso, viene las Programaciones, Estructura de Datos, Arquitectura de Computadoras, Inteligencia Artificial, Compiladores, Automatas y Lenguajes Formales, Programacion de Bajo Nivel, etc.

¿ Por que le dan duro con ramos matematicos al principio y no empiezan de inmediato con lo que se debe ?

#22
ACTUALIZACION: Ya encontre la solucion, implemente ActionListener

De todas maneras, dejo el codigo de mi error anterior, si alguien me dice si es posible tambien hacerlo por mouse, se los agradeceria.

Mi problema (que ya fue solucinado :D)


Estoy creando un programa que se trata de imitar al Paint, el programa es simple, consta de un Lienzo heredado de JPanel y una Ventana que contiene las herramientas, quize ponerle JMenu dentro de un JMenuBar que los contiene, y cada menu tiene diferentes tipos de JMenuItem, pero el problema es que no me escucha el llamado de mouseClicked, pero curiosamente, si me obedece otros, por ejemplo, le puse una barra inferior que muestra las coordenadas del puntero en el panel y si me hace caso .

Les dejo el codigo de la clase Ventana, ojala puedan ayudarme.

Código (java) [Seleccionar]
package programa1;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import java.awt.BorderLayout;

public class Ventana extends JFrame {
   
   private JMenuBar barraSuperior;
   private JPanel panelInferior;
   private JLabel barraInferior;
   
   private JMenu archivo;
   private JMenu editar;
   private JMenu colores;
   private JMenu formas;
   private JMenu achurado;
   private JMenu ayuda;
   
   private JMenuItem nuevo;
   private JMenuItem salir;
   
   private JMenuItem deshacer;
   private JMenuItem rehacer;
   
   private Lienzo pizarron;
   
   public Ventana(){
       
       super("Paint v2.0");

       //Creando el pizarron y las barras
       
       pizarron = new Lienzo();
       barraSuperior = new JMenuBar();
       panelInferior = new JPanel();
       panelInferior.setLayout(new BorderLayout());
       barraInferior = new JLabel("Dibuje en el panel blanco");
       panelInferior.add(barraInferior);
       
       //Creacion de los menus
       
       archivo = new JMenu("Archivo");
       editar = new JMenu("Editar");
       colores = new JMenu("Colores");
       formas = new JMenu("Formas");
       achurado = new JMenu("Achurado");
       ayuda = new JMenu("Ayuda");
       
       //Creacion de los items de cada menu
       
       nuevo = new JMenuItem("Nuevo");
       salir = new JMenuItem("Salir");
       deshacer = new JMenuItem("Deshacer");
       rehacer = new JMenuItem("Rehacer");
       
       //Agregando items a los menus respectivos
       
       archivo.add(nuevo);
       archivo.add(salir);
       
       editar.add(deshacer);
       editar.add(rehacer);
       
       //Construyendo la barra de menus

       barraSuperior.add(archivo);
       barraSuperior.add(editar);
       barraSuperior.add(colores);
       barraSuperior.add(formas);
       barraSuperior.add(achurado);
       barraSuperior.add(ayuda);
       
       //Agregando las barras y lienzo.
       
       setJMenuBar(barraSuperior);
       add(pizarron,BorderLayout.CENTER);
       add(panelInferior,BorderLayout.SOUTH);
       
       EventoMouse evento1 = new EventoMouse();
       salir.addMouseListener(evento1);
       pizarron.addMouseListener(evento1);
       pizarron.addMouseMotionListener(evento1);
       
       setSize(500,500);
       setResizable(false);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setVisible(true);
       
   }
   
   private class EventoMouse extends MouseAdapter implements MouseMotionListener {
       
       public void mouseClicked(MouseEvent e){
           
           if(salir.isSelected()){
               
               System.exit(0);

           }
           
       }
       
       public void mouseEntered(MouseEvent e){
           
           if(e.getSource().equals(pizarron)){
               
               barraInferior.setText(String.format("%d , %d",e.getX(),e.getY()));
               
           }
           
       }

       public void mouseMoved(MouseEvent e){
           
           if(e.getSource().equals(pizarron)){
               
               barraInferior.setText(String.format("%d , %d",e.getX(),e.getY()));
               
           }
       }
       
       public void mouseDragged(MouseEvent e){
           
           if(e.equals(pizarron)){
               
               barraInferior.setText(String.format("%d , %d",e.getX(),e.getY()));
               
           }
       }

   }
   

}
#23
Voy a crear un videojuego similar al Space Invaders, para eso, quiero que el jugador controle la nave por medio del teclado, la cosa es que el juego consiste en una Ventana (JFrame) y varios niveles que tengo pensado en hacerlo dentro de un JPanel donde es el lugar que se dibuja los enemigos, la nave del heroe, y otros obstaculos como meteoritos, agujeros negros, tormentas solares, etc, intente implementar la interfaz KeyListener en JPanel pero no los escucha, hice lo correcto y registre el evento, pero lo mas curioso es que si me escucha los eventos del Mouse, pero no del Teclado.

Una solucion que encontre fue implementarlo en JFrame y de ahi usar los metodos para mover la nave accediendo a Jpanel y me funciono, pero no es lo que quiero, yo quiero mover la nave implementando KeyListener en JPanel, en otros foros me decian que intente usando el metodo "setFocusable(true)", pero igual no me funciono.

Por ahora, no les mostrare el codigo del juego, pero si de un programa que hice especialmente para mostrar mi duda, es similar a mi problema. Use el compilador Netbeans 7.3

Clase Principal

package ejercicio47;

import javax.swing.JFrame;

public class Ejercicio47 {

   public static void main(String[] args) {
       
       JFrame ventana = new JFrame();
       Panel panel = new Panel();
       
       ventana.add(panel);
       ventana.setDefaultCloseOperation(Ventana.EXIT_ON_CLOSE);
       ventana.setSize(500,500);
       ventana.setTitle("Testeo de eventos");
       ventana.setFocusable(true);
       ventana.setResizable(false);
       ventana.setVisible(true);

   }
}




Clase Panel

package ejercicio47;

import javax.swing.JPanel;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.Graphics;
import java.awt.Color;

public class Panel extends JPanel implements KeyListener, MouseListener {
   
   public Panel(){
       
       setBackground(Color.WHITE);
       addMouseListener(this);
       addKeyListener(this);
       
   }
   
   public void mouseClicked(MouseEvent e){
       
       System.out.println("Hola mundo");
       
   }
   
   public void mouseEntered(MouseEvent e){
       
       System.out.println("Hola mundo");
       
   }
   
   public void mousePressed(MouseEvent e){
       
       System.out.println("Hola mundo");
       
   }
   
   public void mouseExited(MouseEvent e){
       
       System.out.println("Adios mundo");
       
   }
   
   public void mouseReleased(MouseEvent e){
       
       System.out.println("Adios mundo");
       
   }
   
   public void keyTyped(KeyEvent e){
       
       System.out.println("Hola mundo");
       
   }
   
   public void keyPressed(KeyEvent e){
       
       System.out.println("Hola mundo");
       
   }
   
   public void keyReleased(KeyEvent e){
       
       System.out.println("Adios mundo");
       
   }
   
   public void paintComponent(Graphics g){
       
       super.paintComponent(g);
       
   }
   
}




#24
Para poner en practica mis conocimientos, me anime en crear un pequeño videojuego, que consiste en un Space Invaders, donde las naves alienigenas se mueven horizontalmente (por ahora, despues pienso si moverlo verticalmente, solo es un prototipo), se mueven de tal manera que no se salga de la vista del jugador, cuando toca los bordes de la ventana, cambia de direccion, por ahora solo tiene naves enemigas, pronto le agregare la Nave Heroe (el que el jugador lo controla por teclado) y un contador de puntaje y barras de estado.

Mi juego constate por ahora de 3 clases, la clase principal obviamente con su respectivo main, una clase Panel que consiste en el escenario espacial, donde se mueven las naves enemigas y la nave heroe, y por ultimo la clase Nave, que representan a las naves enemigas.

Bueno, AQUI VA MI GRAN PROBLEMA, quise implementar ActionListener en la clase JPanel y utilizar la clase Timer de (javax.swing.Timer) que llama a actionPerformed para actualizar en un tiempo determinado, para que las naves se muevan con respecto al tiempo, lo cree en el constructor (por si acaso, esto lo aprendi en el libro "Como programar en Java" por Deitel), Y AQUI VIENE LO QUE QUIERO SOLUCIONAR, pues si bien, las naves se mueven a la velocidad que quiero, solamente lo hace en unos instantes, por que hay momentos que las naves "aceleran" mas de lo normal por unas milesimas o centesimas de segundo pero despues vuelve a su velocidad normal, despues vuelve a acelerar y despues vuelve a su velocidad normal y asi sucesivamente, y lo que yo quiero es que ande siempre a la misma velocidad, no se si sera problema de la velocidad de mi computadora o quizas sea algun error que cometi en la codificacion, por eso les pido ayuda, les dejo mi codigo, una captura del juego, el sprite de la nave y el fondo espacial.

Solamente llevo 1 año y 3 meses programando en Java, pero si me ayudan, podre surgir mas rapido :D

NOTA 1: El compilador que use es el Netbeans 7.2

NOTA 2: Si el programa les lanza una excepcion, es por que las imagenes que les acabo de mandar no tiene el mismo nombre a como sale especificado en el programa, o por que quizas no lo guardaron en donde se almacenan las clases (Ya que esta programado para que las imagenes las obtengan en la carpeta donde se guardan las clases)

LA CLASE PRINCIPAL

package ejercicio267;

import javax.swing.JFrame;

public class Ejercicio267 {

   public static void main(String[] args) {
       
       JFrame ventana = new JFrame("Naves espaciales");
       Panel panel = new Panel();
       
       ventana.add(panel);
       ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       ventana.setSize(panel.getWidth(),panel.getHeight());
       ventana.setResizable(false);
       ventana.setVisible(true);
       
   }
}


LA CLASE PANEL

package ejercicio267;

import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.ImageIcon;
import java.awt.Image;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Panel extends JPanel implements ActionListener {
   
   private Image fondoEspacial;
   private Nave naves[] = new Nave[5];
   private int contadorNaves = 0;
   
   /* Constructor del Panel, inicializa su dimension, su fondo espacial y crea
    * las naves
    */
   
   public Panel(){
       
       setSize(500,500);
       fondoEspacial = (new ImageIcon(getClass().getResource("espacio.gif"))).getImage();
       
       naves[0] = new Nave(210,20);
       naves[1] = new Nave(80,75);
       naves[2] = new Nave(420,130);
       contadorNaves += 3;
       
       Timer temporizador = new Timer(1,this);
       temporizador.start();
       
   }
   
   // Metodo llamado por Timer para actualizar y mover las naves
   
   public void actionPerformed(ActionEvent evento){
       
       for(int i=0; i<contadorNaves;i++){
           
           if(naves[i].getCoordenadaX() == getWidth() - 45){
               
               naves[i].setDireccion(-1);
               
           }else{
               
               if(naves[i].getCoordenadaX() == 0){
                   
                   naves[i].setDireccion(-1);
                   
               }
           }
           
           if(naves[i].getDireccion() == 1){
               
               naves[i].setCoordenadaX(1);
               naves[i].setCoordenadaY(0);
               repaint();
               
           }else{
               
               if(naves[i].getDireccion() == -1){
                   
                   naves[i].setCoordenadaX(-1);
                   naves[i].setCoordenadaY(0);
                   repaint();
                   
               }
           }

       }
       
       
   }
   
   // Metodo que actualiza y dibuja en el Panel
   
   public void paintComponent(Graphics g){
       
       super.paintComponent(g);
       
       g.drawImage(fondoEspacial,0,0,getWidth(),getHeight(),this);
       
       for(int i=0; i<contadorNaves; i++){
           
           naves[i].moverNave(g,this);
           
       }
       
   }
   
}


LA CLASE NAVE

package ejercicio267;

import javax.swing.ImageIcon;
import java.awt.Image;
import java.awt.Graphics;

public class Nave {
   
   //Posicion X de la nave en el espacio
   private int coordenadaX;
   
   //Posicion Y de la nave en el espacio
   private int coordenadaY;
   
   //Puntos de salud de la nave    
   private int hpNave;
   
   //Puntos de ataque de la nave
   private int apNave;
   
   //La direccion que se mueve la nave, 1 a la derecha y -1 a la izquierda
   private int direccionNave;
   
   //El respectivo sprite de la nave
   private Image naveSprite;
   
   /* Constructor de la clase, inicializa sus coordenadas de partida, su respec
    * tivo sprite, ademas de su direccion de movimiento
    */  
   public Nave(int coordenadaX, int coordenadaY){
       
       this.coordenadaX = coordenadaX;
       this.coordenadaY = coordenadaY;
       naveSprite = (new ImageIcon(getClass().getResource("nave.png"))).getImage();
       direccionNave = 1;
       
   }
   
   // Metodo que establece una nueva coordenada X
   public void setCoordenadaX(int coordenadaX){
       
       this.coordenadaX += coordenadaX;
       
   }
   
   // Metodo que establece una nueva coordenada Y  
   public void setCoordenadaY(int coordenadaY){
       
       this.coordenadaY += coordenadaY;
       
   }
   
   // Metodo que obtiene la coordenada X
   public int getCoordenadaX(){
       
       return coordenadaX;
       
   }
   
   // Metodo que obtiene la coordenada Y
   public int getCoordenadaY(){
       
       return coordenadaY;
       
   }
   
   // Metodo que establece una nueva direccion de movimiento de la nave
   public void setDireccion(int dir){
       
       direccionNave = direccionNave * dir;
       
   }
   
   // Metodo que obtiene la direccion de la nave
   public int getDireccion(){
       
       return direccionNave;
       
   }
   
   // Metodo que dibuja la nave con su nueva posicion en el panel
   public void moverNave(Graphics g, Panel panel){
       
       g.drawImage(naveSprite,coordenadaX,coordenadaY,45,45,panel);
       
   }
   
}








#25
Mi programa es sencillo, es aprovechar de usar las librerias Swing y AWT para crear un pizarrón que dibuje solamente lineas, se me ocurrio crear una clase que extienda a JPanel con color blanco, le puse una barra de estado en la parte inferior del panel para que vaya indicando la posición del puntero, ademas, a JPanel le agregue eventos del mouse, de tal manera que se implementara mouseMoved para que indique la coordenada del puntero al moverse, tambien el mouseDragged con la intencion de que la linea se alargara mientras la estiro con el mouse, es ahi el gran problema, yo quiero que mi programa se vea como la linea se estira cuando se este moviendo el Mouse con el boton presionado y al momento de soltar el boton que quede dibujado en la pizarra, pero no me funciona, lo unico que hace es que la linea se muestra una vez que se solto el boton y yo quiero que en todo momento se vea como se alarga, pondre unas capturas y el codigo, ojala me puedan ayudar, he investigado en muchas partes pero no encuentro la solucion.

LA CLASE PRINCIPAL

package ejercicio210;

import javax.swing.JFrame;

public class Ejercicio210 {

    public static void main(String[] args) {
       
        JFrame ventana = new JFrame("Panel de dibujo");
        Panel panel = new Panel();
       
        ventana.add(panel);
        ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ventana.setSize(300,300);
        ventana.setResizable(false);
        ventana.setVisible(true);
       
    }
}



LA CLASE PANEL(LA PIZARRA)

package ejercicio210;

import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Graphics;

public class Panel extends JPanel {
   
    private JLabel etiquetaInferior;
    private JPanel panelInferior;
    private Linea linea;
    private Linea lineasDibujadas[] = new Linea[100];
    private int contadorLineas = 0;
   
    public Panel(){
       
        setLayout(new BorderLayout());
        setBackground(Color.WHITE);
       
        panelInferior = new JPanel();
        etiquetaInferior = new JLabel("Puntero fuera del panel");
        panelInferior.setLayout(new BorderLayout());
        panelInferior.add(etiquetaInferior,BorderLayout.WEST);
        add(panelInferior,BorderLayout.SOUTH);
        addMouseListener(new EventoMouse());
        addMouseMotionListener(new EventoMouse());
       
    }
   
    private class EventoMouse extends MouseAdapter implements MouseMotionListener {
       
        public void mousePressed(MouseEvent evento){
           
            linea = new Linea(evento.getX(),evento.getY(),evento.getX(),evento.getY());
            repaint();
           
        }
       
        public void mouseDragged(MouseEvent evento){
           
            linea.setFinalX(evento.getX());
            linea.setFinalY(evento.getY());
            etiquetaInferior.setText(String.format("%d,%d",evento.getX(),evento.getY()));
            repaint();
           
        }
       
        public void mouseReleased(MouseEvent evento){
           
            lineasDibujadas[contadorLineas] = linea;
            contadorLineas++;
            repaint();
           
        }
       
        public void mouseMoved(MouseEvent evento){
           
            etiquetaInferior.setText(String.format("%d,%d",evento.getX(),evento.getY()));

        }
       
    }
   
    public void paintComponent(Graphics g){
       
        super.paintComponent(g);
       
        for(int i=0; i<contadorLineas; i++){
           
            lineasDibujadas[i].dibujar(g);
           
        }
       
 

       
    }
   
   
}


LA CLASE LINEA

package ejercicio210;

import java.awt.Graphics;

public class Linea {
   
    private int origenX;
    private int origenY;
    private int finalX;
    private int finalY;
   
    public Linea(int origenX, int origenY, int finalX, int finalY){
       
        this.origenX = origenX;
        this.origenY = origenY;
        this.finalX = finalX;
        this.finalY = finalY;
       
    }
   
    public void setFinalX(int finalX){
       
        this.finalX = finalX;
       
    }
   
    public void setFinalY(int finalY){
       
        this.finalY = finalY;
       
    }
   
    public void dibujar(Graphics g){
       
        g.drawLine(origenX,origenY,finalX,finalY);
       
    }
   
}






#26
Java / Ayuda con Eventos y libreria Swing
5 Febrero 2013, 01:33 AM
Hola, necesito ayuda con eventos, para ejercitar lo aprendido, me decidí programar un conversor de numeros, es decir, el usuario escribe un numero en el campo, despues selecciona en un boton de radio si quiere convertirlo a binario o hexadecimal, si no lo escogio arrojará un mensaje de que seleccione el tipo de numero a convertir, pero el problema que me da es cuando el usuario apreta el boton "Calcular" sin que haya un numero en el campo y se me cae el programa, pese a que programe a que el sistema desplegara un mensaje cuando no ingreso un numero, pero no me hace caso

Les dejo mi codigo y algunas imagenes, ojala me puedan ayudar ya que soy nuevo en esto, por el momento me calcula bien a binario y hexadecimal por que lo comprobe, pero el problema es cuando ejecuto el boton Calcular sin que haya numero y deberia avisar por mensaje de que se debe ingresar un numero

Cualquier recomendacion o correccion de algun errores que haya cometido, bienvenido sean, o si hay una forma mas corta, tambien, asi ganamos todos en este tema xD

Clase Convertidor
[/b]

package ejercicio117;

//Se importa las las clases necesarias para el convertidor

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;
import javax.swing.JOptionPane;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

public class Convertidor extends JFrame {
   
    //Declaracion de variables
   
    private JLabel etiqueta1;
    private JLabel etiqueta2;
    private JTextField campo1;
    private JTextField campo2;
    private JButton botonCalcular;
    private JRadioButton botonBinario;
    private JRadioButton botonHexadecimal;
    private ButtonGroup grupoBotones;
    private boolean esBinario;
    private boolean esHexadecimal;
    private int numeroDecimal;
   
    public Convertidor(){
       
        super("Convertidor");
        setLayout(new FlowLayout());
       
        //Se crean las etiquetas
       
        etiqueta1 = new JLabel("Numero a convertir");
        etiqueta2 = new JLabel("Numero convertido ");
       
        //Se crean los campos, el primero para ingresar y el otro para imprimir
       
        campo1 = new JTextField(10);
        campo2 = new JTextField(10);
        campo2.setEditable(false);
       
        //Se crean los botones de Radio y uno normal
       
        botonCalcular = new JButton("Calcular");
        botonBinario = new JRadioButton("Binario");
        botonHexadecimal = new JRadioButton("Hexadecimal");
       
        //Se crean booleanos necesarios para determinar el tipo de numero a convertir
       
        esBinario = false;
        esHexadecimal = false;
        numeroDecimal = 0;
       
        //Se crea el grupo de botones de radio y se agregan los botones radio a
        //dicho grupo
       
        grupoBotones = new ButtonGroup();
        grupoBotones.add(botonCalcular);
        grupoBotones.add(botonBinario);
        grupoBotones.add(botonHexadecimal);
       
       
        //Se agregan las etiquetas, campos y botones a la ventana
       
        add(etiqueta1);
        add(campo1);
       
        add(etiqueta2);
        add(campo2);
       
        add(botonBinario);
        add(botonHexadecimal);
        add(botonCalcular);
       
        //Se crea instancia AdministradorEventos para controlar los eventos
       
        AdministradorEventos administrador = new AdministradorEventos();
       
        //Se le agregan eventos a los botones a utilizar
       
        botonBinario.addItemListener(administrador);
        botonHexadecimal.addItemListener(administrador);
        botonCalcular.addActionListener(administrador);
       
    }
   
    private class AdministradorEventos implements ActionListener, ItemListener {
       
        /**
         *
         * Metodo que permite calcular el numero numero decimal a binario, hexade
         * cimal o viceversa, segun lo que se haya seleccionado en los botones
         * de radio
         *
         */
       
        public void actionPerformed(ActionEvent evento){
           
            if(esBinario){
               
                if(campo1.getText() == null){
                   
                    JOptionPane.showMessageDialog(null, "No ha ingresado ningun numero", "ERROR", 0);
                   
                }else{
                   
                    numeroDecimal = Integer.parseInt(campo1.getText());
                    String binario = "";
                   
                    while(numeroDecimal != 0){
                       
                        binario += numeroDecimal%2; //Se concatena
                        numeroDecimal = numeroDecimal / 2;
                       
                    }
                   
                    char arregloChar[] = binario.toCharArray();
                    binario = "";
                   
                    for(int i=0; i<arregloChar.length; i++){
                       
                        binario += arregloChar[(arregloChar.length-1)-i];
                       
                    }
                   
                    campo2.setText(binario);
                }
               
            }else{
               
                if(esHexadecimal){
                   
                    if(campo1.getText() == null){
                       
                        JOptionPane.showMessageDialog(null, "No ha ingresado ningun numero", "ERROR", 0);
                       
                    }else{
                       
                       
                        numeroDecimal = Integer.parseInt(campo1.getText());
                        String hexadecimal = "";
                        int resto = 0;
                       
                        while(numeroDecimal != 0){
                           
                            resto = numeroDecimal % 16;
                           
                            switch(resto){
                               
                                case 10:
                                   
                                    hexadecimal += "A";
                                    break;
                                   
                                case 11:
                                   
                                    hexadecimal += "B";
                                    break;
                                   
                                case 12:
                                   
                                    hexadecimal += "C";
                                    break;
                                   
                                case 13:
                                   
                                    hexadecimal += "D";
                                    break;
                                   
                                case 14:
                                   
                                    hexadecimal += "E";
                                    break;
                                   
                                case 15:
                                   
                                    hexadecimal += "F";
                                    break;
                                   
                                default:
                                   
                                    hexadecimal += resto;
                                    break;
           
                            }//Fin del Switch
                           
                            numeroDecimal = numeroDecimal / 16;
                            System.out.println(numeroDecimal);
                           
                        }//Fin del ciclo While
                       
                        char arregloChar[] = hexadecimal.toCharArray();
                        hexadecimal = "";
                       
                        for(int i=0; i<arregloChar.length; i++){
                           
                            hexadecimal += arregloChar[(arregloChar.length-1)-i];
                           
                        }
                       
                        campo2.setText(hexadecimal);
                    }
                   
                   
                   
                }else{
                   
                    JOptionPane.showMessageDialog(null,"Seleccione el tipo de numero a convertir","Error", 0);
                   
                }
            }
           
        }
       
        /**
         * Metodo que permite seleccionar el tipo de numero a convertir
         */
       
        public void itemStateChanged(ItemEvent evento){
           
            if(botonBinario.isSelected()){
               
                esBinario = true;
                esHexadecimal = false;
               
            }
           
            if(botonHexadecimal.isSelected()){
               
                esBinario = false;
                esHexadecimal = true;
               
            }
           
        }
       
    }
   
}


Programa principal
[/b]

package ejercicio117;

public class Ejercicio117 {

    public static void main(String[] args) {
       
        Convertidor convertidor = new Convertidor();
       
        convertidor.setSize(250,150);
        convertidor.setDefaultCloseOperation(Convertidor.EXIT_ON_CLOSE);
        convertidor.setResizable(false);
        convertidor.setVisible(true);
       
    }
}


Esta es la vista normal del programa

Este error ocurre cuando se hace Click en calcular sin haber elegido el tipo de numero a convertir

Este error se produce cuando no hay un numero en el campo una vez que se selecciono el tipo de numero a convertir, yo esperaba que lanzara el mensaje que diga al usuario ingresar un numero
#27
Me anime a programar una calculadora sencilla, se trata de 2 campos de textos donde se ingresa el numero, abajo hay 5 botones, hay para sumar, restar, multiplicar y dividir, mas un boton adicional para borrar todo, los resultados de las operaciones se muestra en un campo inmodificable, pero mi problema es que para que pueda guardar los numeros a operar, hay que apretar el boton Enter  y lo que yo busco es que cuando el usuario escribe el numero en los campos, no tenga que acudir al enter, solo es llegar y escribir los numeros y clickear el boton de la operacion deseada.

Yo estoy leyendo el libro de Deitel 7ma edicion si es que alguien lo leyo para que me pueda ayudar y les dejo mi codigo, yo programé una clase que se llama Calculadora y que hereda todo de JFrame. Por si acaso, estoy usando el Netbeans 7.2


Les dejo la clase calculadora


package ejercicio109;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Calculadora extends JFrame {
   
    private JLabel etiqueta1;
    private JLabel etiqueta2;
    private JLabel etiqueta3;
   
    private JTextField campo1;
    private JTextField campo2;
    private JTextField campo3;
   
    private JButton botonSuma;
    private JButton botonResta;
    private JButton botonProducto;
    private JButton botonDivision;
    private JButton botonBorrar;
   
    private int numero1;
    private int numero2;
    private int resultado;
   
    public Calculadora(){
       
        super("CALCULADORA SIMPLE");
        setLayout(new FlowLayout());
       
        etiqueta1 = new JLabel("Numero 1");
        etiqueta2 = new JLabel("Numero 2");
        etiqueta3 = new JLabel("Resultado");
       
        campo1 = new JTextField(10);
        campo2 = new JTextField(10);
        campo3 = new JTextField(10);
        campo3.setEditable(false);
       
        botonSuma = new JButton("Sumar");
        botonResta = new JButton("Restar");
        botonProducto = new JButton("Multiplicar");
        botonDivision = new JButton("Dividir");
        botonBorrar = new JButton("Borrar");
       
        add(etiqueta1);
        add(campo1);
       
        add(etiqueta2);
        add(campo2);
       
        add(etiqueta3);
        add(campo3);
       
        add(botonSuma);
        add(botonResta);
        add(botonProducto);
        add(botonDivision);
        add(botonBorrar);
       
        numero1 = 0;
        numero2 = 0;
       
        AdministradorEventos administrador = new AdministradorEventos();
       
        campo1.addActionListener(administrador);
        campo2.addActionListener(administrador);
       
        botonSuma.addActionListener(administrador);
        botonResta.addActionListener(administrador);
        botonProducto.addActionListener(administrador);
        botonDivision.addActionListener(administrador);
        botonBorrar.addActionListener(administrador);

    }
   
    private class AdministradorEventos implements ActionListener {
       
        public void actionPerformed(ActionEvent evento){
           
            if(evento.getSource() == campo1){
               
                numero1 = Integer.parseInt(evento.getActionCommand());
               
            }
           
            if(evento.getSource() == campo2){
               
                numero2 = Integer.parseInt(evento.getActionCommand());
               
            }
           
            if(evento.getSource() == botonSuma){
               
                resultado = numero1 + numero2;
                campo3.setText(Integer.toString(resultado));
               
            }
           
            if(evento.getSource() == botonResta){
               
                resultado = numero1 - numero2;
                campo3.setText(Integer.toString(resultado));
               
            }
           
            if(evento.getSource() == botonProducto){
               
                resultado = numero1 * numero2;
                campo3.setText(Integer.toString(resultado));
               
            }
           
            if(evento.getSource() == botonDivision){
               
                resultado = numero1 / numero2;
                campo3.setText(Integer.toString(resultado));
               
            }
           
            if(evento.getSource() == botonBorrar){
               
                numero1 = 0;
                numero2 = 0;
                resultado = 0;
               
                campo1.setText("");
                campo2.setText("");
                campo3.setText("");
               
            }
           
        }
       
    }
   
   
}


Y ahora les dejo el programa principal

package ejercicio109;

public class Ejercicio109 {

    public static void main(String[] args) {
       
        Calculadora calculadora = new Calculadora();
       
        calculadora.setSize(600,100);
        calculadora.setResizable(false);
        calculadora.setDefaultCloseOperation(Calculadora.EXIT_ON_CLOSE);
        calculadora.setVisible(true);
       
    }
}


#28
Investigando por ahi, me di cuenta que Java elimina automaticamente variables primitivas (como int, long, float, etc) y de referencia, pero tambien me di cuenta que System tiene un metodo que ejecuta el recolector de basura, teniendo en cuenta eso, quise hacer un pequeño programa para ponerlo a prueba, se trata de una clase que se llama Empleado que guarda la información de un empleado, ademas de una variable static para ir contando los empleados que tiene la compañia, la cosa es que creo 2 empleados e imprimo los datos por pantalla, ademas de la cantidad de empleados y me salen que son 2, pero cuando al segundo empleado lo convierto en null y llamo al recolector de basura, no me lo borra de la memoria, y sigue marcando como 2 empleados en la compañia en vez de 1, ¿alguien sabe a que se debe esto?, ¿ que no se suponia que el recolector borra de la memoria las variables que son "inutiles"?

Les dejo el codigo

//Clase Empleado

package ejercicio83;

public class Empleado {
   
   private String nombre;
   private String rut;
   private int edad;
   private int sueldo;
   private static int cantEmpleados = 0;
   
   public Empleado(String nombre, String rut, int edad, int sueldo){
       
       this.nombre = nombre;
       this.rut = rut;
       this.edad = edad;
       this.sueldo = sueldo;
       this.cantEmpleados++;
       
   }
   
   public String getNombre(){
       
       return nombre;
       
   }
   
   public String getRut(){
       
       return rut;
       
   }
   
   public int getEdad(){
       
       return edad;
       
   }
   
   public int getSueldo(){
       
       return sueldo;
       
   }
   
   public static int getContratados(){
       
       return cantEmpleados;
       
   }
   
}


//Main

package ejercicio83;

public class Ejercicio83 {

    public static void main(String[] args) {
       
        Empleado empleado1 = new Empleado("Juan", "1234", 22 , 350000);
        Empleado empleado2 = new Empleado("Carlos", "5678", 30, 1200000);
       
        System.out.printf("\n\nNombre: %s\nRut: %s\nEdad: %d\nSueldo: %d", empleado1.getNombre(), empleado1.getRut(), empleado1.getEdad(), empleado1.getSueldo());
        System.out.printf("\n\nNombre: %s\nRut: %s\nEdad: %d\nSueldo: %d", empleado2.getNombre(), empleado2.getRut(), empleado2.getEdad(), empleado2.getSueldo());
       
        empleado2 = null;
        System.gc();
        System.out.printf("\n\n%d empleados\n", Empleado.getContratados());
       
    }
}

#29
Java / Tengo un problema (convertidor a binario)
2 Septiembre 2012, 01:42 AM
ESPEREN, NO LEAN TODAVIA EL CODIGO, TENGO UNOS ERRORES EPICOS PERO LO CORREGI, DESPUES SE LOS MANDO CORREGIDO PARA QUE AYUDEN EN MI PROBLEMA !!!!!!!!!



Quiero programar un conversor de numero decimal a binario de los 30 primeros numeros, a mi se me ocurrio con un String ir amontonando los restos al dividir por 2 (transformados en string eso si), pero me da un error en tiempo de ejecucion, aqui les dejo los errores y el codigo, ojala me puedan ayudar, cualquier sugerencia sera bienvenida ;), no se rian si encuentran algo ridiculo, tengo 15 y soy novato


El error que me sale es:

java.lang.NumberFormatException: For input string: ""
   at java.lang.NumberFormatException.forInputString(Unknown Source)
   at java.lang.Integer.parseInt(Unknown Source)
   at java.lang.Integer.parseInt(Unknown Source)
   at ejercicio10.calcularBinario(ejercicio10.java:25)
   at ejercicio10.main(ejercicio10.java:33)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

public class ejercicio10{
 
 public static int calcularBinario(int numero){
   
   String binario = "";
   int bin;
   boolean flag = true;
   int resto;
   int div;
   
   
   while(flag){
     
     div = numero/2;
     
     if(div != 0){
       numero = div;
       resto = numero%2;
       binario += Integer.toString(resto); //Para ir juntando los 0 o 1, concatenando
     }else{
       flag = false;
     }            
   }
   
   bin = Integer.parseInt(binario);
   
   return bin;
 }
 
 public static void main(String[]Args){
   
   for(int i=0; i<30; i++){
     int binario = calcularBinario(i);
     System.out.println(binario);
   }
   
 }
 
}