elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / [C++] Resultado extraño en una clase Matriz en: 8 Abril 2011, 19:38 pm
Saludos. A día de hoy me encuentro realizando un programilla que realice operaciones sencillas con matrices. Concretamente, sumas, restas y multiplicaciones. Como todos sabemos, para sumar o restar matrices, deben ser del mismo tamaño, y para multiplicarlas, el número de columnas de la primera debe ser igual al número de filas de la segunda. En este programa en concreto, si no se dan esas características, la operación debe devolver una matriz nula, de 0x0 elementos. Pongo la parte interesante del código y sigo con el problema:
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <time.h>
  5.  
  6. using namespace std;
  7.  
  8. //Clase Matriz
  9. class Matriz{
  10. protected:
  11.    int **M;
  12.    int NF,NC;
  13. public:
  14.    //Constructor por defecto
  15.    Matriz (){
  16.        NF=0;
  17.        NC=0;
  18.        M=NULL;
  19.    }
  20.    //Constructor de copia
  21.    Matriz (const Matriz &matriz){
  22.        NF=matriz.NF;
  23.        NC=matriz.NC;
  24.        M=new int *[NF];
  25.        for(int i=0;i<NF;i++){
  26.            M[i]=new int[NC];
  27.        }
  28.    }
  29.    //Constructor con parametros
  30.    Matriz (int nf, int nc){
  31.        M=new int *[nf];
  32.        for(int i=0;i<nf;i++){
  33.            M[i]=new int[nc];
  34.        }
  35.        for(int i=0;i<nf;i++){
  36.            for(int j=0;j<nc;j++){
  37.                M[i][j]=rand()%51;
  38.            }
  39.        }
  40.        return;
  41.    }
  42.    //Destructor
  43.    ~Matriz(){
  44.        for(int i=0;i<NF;i++){
  45.            delete M[i];
  46.        }
  47.        return;
  48.    }
  49.    //Operador asignacion
  50.    Matriz operator = (Matriz m){
  51.        if(NF!=m.NF){
  52.            for(int i=0;i<NF;i++){
  53.                delete M[i];
  54.            }
  55.        }
  56.        NF=m.NF;
  57.        NC=m.NC;
  58.        M=new int *[NF];
  59.        for(int j=0;j<NF;j++){
  60.            M[j]=new int [NC];
  61.        }
  62.        return(*this);
  63.    }
  64.    //Sobrecarga de operador de salida
  65.    friend ostream& operator <<(ostream &medio, Matriz matriz){
  66.        for(int i=0;i<matriz.NF;i++){
  67.            for(int j=0;j<matriz.NC;j++){
  68.                cout<<matriz.M[i][j]<<" ";
  69.            }
  70.            cout<<endl;
  71.        }
  72.        return(medio);
  73.    }
  74.    //Sobrecarga de operador suma
  75.    Matriz operator + (Matriz m){
  76.        Matriz resul;
  77.        if(NF==m.NF&&NC==m.NC){
  78.            for(int i=0;i<NF;i++){
  79.                for(int j=0;j<NC;j++){
  80.                    resul.M[i][j]=M[i][j]+m.M[i][j];
  81.                }
  82.            }
  83.        }
  84.        return(resul);
  85.    }
  86.    //Sobrecarga de operador resta
  87.    Matriz operator - (Matriz m){
  88.        Matriz resul;
  89.        if(NF==m.NF&&NC==m.NC){
  90.            for(int i=0;i<NF;i++){
  91.                for(int j=0;j<NC;j++){
  92.                    resul.M[i][j]=M[i][j]-m.M[i][j];
  93.                }
  94.            }
  95.        }
  96.        return(resul);
  97.    }
  98.    //Sobrecarga de operador producto
  99.    Matriz operator * (Matriz m){
  100.        Matriz resul;
  101.        if(NC==m.NF){
  102.            int N=NC;
  103.            for(int i=0;i<N;i++){
  104.                for(int j=0;j<N;j++){
  105.                    resul.M[i][j]=0;
  106.                    for(int k=0;k<N;k++){
  107.                        resul.M[i][j]=resul.M[i][j]+M[i][k]*m.M[k][j];
  108.                    }
  109.                }
  110.            }
  111.        }
  112.        return(resul);
  113.    }
  114. };
  115.  
  116. int main(void){
  117.    //Reinicio de semilla
  118.    srand(time(0));
  119.    //Prueba de codigo
  120.    Matriz m1(5,5),m2(5,5);
  121.    cout<<"Matriz 1 + Matriz 2 ="<<endl<<m1+m2;
  122.    getche();
  123.    return(0);
  124. }

Como se puede observar, el constructor con parámetros crea una matriz de NFxNC elementos, los cuales son valores aleatorios entre 0 y 50. El caso es que al probar la suma, y a pesar del getche(), el programa se ejecuta y se cierra automáticamente, y lo más extraño de todo, me devuelve 3. Es curioso, porque aunque no se realizara bien la operación, debería devolver 0, ya que compila sin problemas, pero devuelve 3. Por otro lado, si las matrices declaradas en main no llevan parámetros, el programa se ejecuta con normalidad, mostrando el texto del cout sin matriz (porque es nula), espera que pulse una tecla para continuar y devuelve 0. Por tanto, puedo suponer que el problema está, bien en el envío de parámetros, en el constructor de copia, o incluso en la sobrecarga del operador suma, pero no acabo de verlo. Por si sirve de algo, el compilador que utilizo es el QtCreator de Nokia.

Gracias por vuestra paciencia ;)
2  Programación / Programación C/C++ / [C++] Reordenar vector dinámico de objetos en: 16 Marzo 2011, 19:34 pm
Saludos. Liado ando con un gestor de agenda, en el que he de reordenar por nombre los contactos cada vez que añado uno nuevo. Por supuesto, pensé en la burbuja, pero, a pesar de que compila sin problemas, no reordena nada. He aquí mi código:
Código
  1. //Clase Agenda
  2. class Agenda{
  3. private:
  4.    Contacto *lista;
  5.    int N;
  6. public:
  7.    //Constructor por defecto
  8.    Agenda(){
  9.        N=0;
  10.        lista=NULL;
  11.        return;
  12.    }
  13.    //Destructor
  14.    ~Agenda(){
  15.        if(lista){
  16.            delete[]lista;
  17.        }
  18.    }
  19.    //Metodo aniadir contacto
  20.    void NuevoContacto(void){
  21.        //Creacion vector Contacto auxiliar
  22.        Contacto *aux=new Contacto[N+1];
  23.        //Recoleccion de datos anteriores
  24.        for(int i=0;i<N;i++){
  25.            aux[i]=lista[i];
  26.        }
  27.        //Peticion de dato nuevo
  28.        cin>>aux[N];
  29.        cin>>aux[N].fnac;
  30.        cin>>aux[N].dir;
  31.        //Eliminacion de vector Contacto obsoleto
  32.        if(lista!=NULL){
  33.            delete[]lista;
  34.        }
  35.        //Recreacion de vector Contacto util
  36.        lista=aux;
  37.        N++;
  38.        Ordenar(lista,N);
  39.        return;
  40.    }
  41.  
  42. //.........
  43.  
  44.    //Metodo reordenacion de contactos
  45.    void Ordenar(Contacto listado[], int n){
  46.        Contacto aux;
  47.        bool centinela;
  48.        for(int i=0;i<n&&centinela==true;i++){
  49.            centinela=false;
  50.            for(int j=0;j<n;j++){
  51.                if(listado[j-1].VerNombre()>listado[j].VerNombre()){
  52.                    aux=listado[j-1];
  53.                    listado[j-1]=listado[j];
  54.                    listado[j]=aux;
  55.                    centinela=true;
  56.                }
  57.            }
  58.        }
  59.        return;
  60.    }
  61. };
¿Dónde está el fallo?
3  Programación / Programación C/C++ / [C++] Buscar un dato privado en un vector de clase en: 5 Marzo 2011, 21:19 pm
Saludos. Puede que el título no esté muy claro, así que explicaré cuál es el problema que me ha traído:

En una clase Agenda he de crear un método mediante el cual el usuario introduzca un nombre y el programa muestre todos los datos del vector en los que se encuentre ese nombre. El caso es que el nombre se encuentra en otra clase distinta, y no podemos hacer amigos. Busqué información y descubrí que es posible hacerlo con los métodos get y set, pero no sé cómo aplicarlos.

Aquí pongo parte del código:
Código
  1. class Contacto
  2. {
  3. private:
  4.    string nombre, apellidos;
  5.    FechaNacimiento fnac1;
  6.    Direccion dir1;
  7. public:
  8.    void Mostrar(void)
  9.    {
  10.        cout<<"Nombre: "<<nombre<<endl;
  11.        cout<<"Apellidos: "<<apellidos<<endl;
  12.        fnac1.Mostrar();
  13.        dir1.Mostrar();
  14.    }
  15.    void Solicitar(void)
  16.    {
  17.        cout<<"Nombre: ";
  18.        getline(cin,nombre);
  19.        cout<<"Apellidos: ";
  20.        getline(cin,apellidos);
  21.        fnac1.Solicitar();
  22.        dir1.Solicitar();
  23.    }
  24. };
  25.  
  26. class Agenda
  27. {
  28. private:
  29.    int N;
  30.    Contacto lista1[NMAX];
  31.    string buscar;
  32.    bool exito;
  33. public:
  34.    Agenda(void)
  35.    {
  36.        N=-1;
  37.        exito=false;
  38.    }
  39.    void NuevoContacto(void)
  40.    {
  41.        N++;
  42.        lista1[N].Solicitar();
  43.    }
  44. //...
  45. //Codigo entre medias
  46. //...
  47.    void BuscarContacto(void)
  48.    {
  49.        cout<<"Nombre a buscar: ";
  50.        getline(cin,buscar);
  51.        for(int j=0;j<N;j++)
  52.        {
  53.            if(lista1[j].nombre==buscar)//Esta condicion no es correcta
  54.            {
  55.                lista1[j].Mostrar();
  56.                exito=true;//Centinela de contacto encontrado
  57.            }
  58.        }
  59.        if(exito==false)
  60.        {
  61.            cout<<"Contacto no encontrado"<<endl;
  62.        }
  63.    }
  64. };
4  Programación / Programación C/C++ / [C] Mostrando datos de un vector de enteros en: 5 Diciembre 2010, 20:44 pm
Saludos. Sigo con el black jack avanzando a mi ritmo, pero con otra traba. Y si resuelvo esto, el resto del programa lo doy por solucionado.

Bien, resulta que el formato de salida debe ser algo como:

"BLACK JACK

Tus cartas: 1 3 J 2 8

Valor total: 25

Deseas otra carta?"

Según este ejemplo, la primera jugada debe mostrar las dos primeras cartas, el valor total y la pregunta de coger otra carta, y al decir que sí, lo mismo, pero con la siguiente. En definitiva, que mientras aparece el texto de alrededor, primero se muestran dos cartas y luego de una en una.

Mi idea al hacer el código fue poner el primer texto de modo forzado, directamente con printf y punto, y las siguientes cartas ya en un do while. Esto es lo que tengo hecho de momento:

Código
  1.        system("cls");
  2.        printf("**************");
  3.        printf("\n* BLACK JACK *");
  4.        printf("\n**************");
  5.        printf("\nTus cartas: ");
  6.        if(baraja[0]==11){
  7.            printf("J ");
  8.            val=10;
  9.        }else if(baraja[0]==12){
  10.            printf("Q ");
  11.            val=10;
  12.        }else if(baraja[0]==13){
  13.            printf("K ");
  14.            val=10;
  15.        }else{
  16.            printf("%d ",baraja[0]);
  17.            val=baraja[0];
  18.        }
  19.        cartas=cartas+val;
  20.  
  21.        for(i=1;cartas<21;i++){
  22.            if(baraja[i]==11){
  23.                printf("J ");
  24.                val=10;
  25.            }else if(baraja[i]==12){
  26.                printf("Q ");
  27.                val=10;
  28.            }else if(baraja[i]==13){
  29.                printf("K ");
  30.                val=10;
  31.            }else{
  32.                printf("%d ",baraja[i]);
  33.                val=baraja[i];
  34.            }
  35.            cartas=cartas+val;
  36.            printf("\n\nEl valor de tus cartas es: %d",cartas);
  37.        }

La teoría es buena, obviando el hecho de que de este modo no se muestre el resto del texto, sin embargo, lo que me sale es algo como:

"BLACK JACK

Tus cartas: 1 3

J lor total: 4

2 lor total: 14

Valor total: 16"

Es decir, que sobreescribe la línea de valor total de la anterior tirada.

Una cosa que se me ocurrió fue meter todo el texto en un for o un do while, que borrase todo y lo volviera a escribir, aunque se me presentaban dos problemas: el primero, no saldrían las dos primeras cartas de golpe, y el segundo, que probablemente sólo saliera la última carta, pese a que cambie el valor total.
5  Programación / Programación C/C++ / [C] Entremezclar valores de un vector en: 4 Diciembre 2010, 18:42 pm
Saludos. Traigo un fragmento de programa en el cual he de crear un juego de black jack. Bien, más o menos tengo una idea de cómo montármelo, sin embargo, al ir probando poco a poco obtengo un problema curioso, y es que el código compila bien, sin embargo, el programa se queda colgado. Concretamente, creo que el problema está al barajar el vector en el que están contenidos los valores de las cartas, ya que es a partir de ahí donde se bloquea, aunque el prompt siga parpadeando.
Código
  1.    for(i=0,j=0;i<4;i++){
  2.        for(val=1;val<=13;j++,val++){
  3.            baraja[j]=val;
  4.        }
  5.    }//Creacion de la baraja
  6. .....................
  7. .....................
  8.        for(it=0;it<500;i++){
  9.            i=rand()%52;
  10.            do{
  11.                j=rand()%52;
  12.            }while(i==j);
  13.            temp=baraja[i];
  14.            baraja[i]=baraja[j];
  15.            baraja[j]=temp;
  16.        }//Barajando la baraja

Al principio pensé que eran demasiadas iteraciones al barajar, pero ni con 5 se resolvía. Hay un printf seguido de un getche tras barajar a modo de comprobación, y al no aparecer es lo que me hace sospechar que pueda haber algún error en ese bucle. ¿Alguna idea?
6  Programación / Programación C/C++ / [C] Cadena de caracteres "sucia" en: 6 Noviembre 2010, 20:29 pm
Muy buenas de nuevo. Aquí vengo con un nuevo programa, esta vez 100% resuelto por mí. Explico de qué va:

Es un juego en el que 4 jugadores deben recorrer un tablero de 30 casillas con tiradas aleatorias de 0 a 6 casillas por turno, con posibilidad de empate. El programa está hecho de modo que el tablero sea una cadena de 60 caracteres, \0 incluido, que alterna puntos y espacios, empezando por punto en la posición 0 y terminando en espacio en la posición 59 (a pesar de que efectivamente sustituya a \0 ).

Bien, el caso es que la primera vez que se ejecuta el programa, el tablero tiene 30 puntos con espacios entre ellos, y el movimiento de las fichas es perfecto, ya que sustituyen a los puntos como se espera. Todo funciona bien. Sin embargo, al repetir la partida, al final del tablero me aparecen simbolos extraños, en este caso, una 's', a la que le sigue un ';' tras la primera actualización hasta el final del bucle.

Alguno me dirá, "no pongas un espacio en la posición del \0". Si no lo pongo, en lugar de la 's', me aparece una '#'.

Otro me contestará, "aumenta el tamaño de la cadena una posición más". Si lo hago así, me aparece de nuevo la '#' pero más a la derecha.

Por tanto, deduzco que de algún modo debo limpiar mejor la cadena del tablero para que reinicie sin fallos. ¿Alguna idea? Aquí dejo el código:

Código:
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
//Librerías

/*Carrera de dados, por Rockmore*/

int main(void){
    char pista[60],res;
    int i,a,b,c,d,dado1,dado2,dado3,dado4;
    //Declaración de variables

    srand(time(0));//Reinicio de semilla

    do{
        for(i=0;i<=58;i+=2){
            pista[i]='.';
        }
        for(i=1;i<=59;i+=2){
            pista[i]=' ';
        }
        i=0;
        a=0;
        b=0;
        c=0;
        d=0;//Reinicio del tablero

        do{
            system("cls");
            printf("----------------");
            printf("\nCarrera de dados");
            printf("\n----------------\n\n");
            printf("%s\n",pista);
            printf("\n------------------------------------");
            printf("\nPulsa una tecla para tirar los dados");
            printf("\n------------------------------------");
            getche();//Muestra de tablero a mitad de carrera

            dado1=rand()%7;
            dado2=rand()%7;
            dado3=rand()%7;
            dado4=rand()%7;//Tiradas de dados

            printf("\nJugador 1 (x): %d",dado1);
            printf("\nJugador 2 (o): %d",dado2);
            printf("\nJugador 3 (*): %d",dado3);
            printf("\nJugador 4 (&): %d",dado4);
            printf("\n\n\n------------------------------");
            printf("\nPulsa una tecla para continuar");
            printf("\n------------------------------");//Muestra de tiradas

            a=a+dado1*2;
            b=b+dado2*2;
            c=c+dado3*2;
            d=d+dado4*2;//Reajuste para movimiento

            if(a>58){
                a=58;
            }if(b>58){
                b=58;
            }if(c>58){
                c=58;
            }if(d>58){
                d=58;
            }//Reajuste para meta sobrepasada

            for(i=0;i<=58;i+=2){
                pista[i]='.';
            }
            for(i=1;i<=57;i+=2){
                pista[i]=' ';
            }//Limpieza de tirada anterior

            pista[a]='x';
            pista[b]='o';
            pista[c]='*';
            pista[d]='&';//Actualización de tablero
            getche();
        }while(pista[58]=='.');
        system("cls");
        printf("----------------");
        printf("\nCarrera de dados");
        printf("\n----------------\n\n");
        printf("%s\n\n\n",pista);//Condición final del tablero

        if(a==58){
            printf("El jugador 1 ha llegado a la meta!\n");
        }if(b==58){
            printf("El jugador 2 ha llegado a la meta!\n");
        }if(c==58){
            printf("El jugador 3 ha llegado a la meta!\n");
        }if(d==58){
            printf("El jugador 4 ha llegado a la meta!\n");
        }//Anuncio del ganador

        if(a==b||a==c||a==d||b==c||b==d||c==d){
            printf("EMPATE");
        }//Condición de empate

        printf("\nVolver a jugar (s/n)?");
        scanf("%s",&res);//Pregunta de repetición

    }while(res=='s');//Condición de repetición
}
7  Programación / Programación C/C++ / Comparar cadenas sin usar strcmp en: 23 Octubre 2010, 21:13 pm
Saludos a todos. Llevo días con sus noches dándole mil vueltas a esto y en todos los lados que encuentro, leo que la alternativa es hacerlo a mano, pero no sé qué es a mano en este caso.

Mi caso es que tengo que escribir dos nombres con sus dos apellidos, unirlos en una cadena con espacios y ordenarlos lexicográficamente sin utilizar strcmp.

Este es el código que tengo hecho:

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<conio.h>
  4. //Librerías
  5.  
  6. int main(void){
  7. int nombre1,nombre2,let,primero=1,segundo=1,iguales=0;
  8. char nom1[50],apuno1[50],apdos1[50],nom2[50],apuno2[50],apdos2[50],esp[1];
  9. //Declaración de variables cadena
  10.  
  11. strcpy(esp," ");
  12. //Cadena espacio
  13.  
  14. printf("Nombre de la primera persona: ");
  15. gets(nom1);
  16. printf("\nPrimer apellido de la primera persona: ");
  17. gets(apuno1);
  18. printf("\nSegundo apellido de la primera persona: ");
  19. gets(apdos1);
  20. printf("\nNombre de la segunda persona: ");
  21. gets(nom2);
  22. printf("\nPrimer apellido de la segunda persona: ");
  23. gets(apuno2);
  24. printf("\nSegundo apellido de la segunda persona: ");
  25. gets(apdos2);
  26. //Petición de datos
  27.  
  28. strcat(nom1,esp);
  29. strcat(nom1,apuno1);
  30. strcat(nom1,esp);
  31. strcat(nom1,apdos1);
  32. strcat(nom2,esp);
  33. strcat(nom2,apuno2);
  34. strcat(nom2,esp);
  35. strcat(nom2,apdos2);
  36. //Concatenación de cadenas
  37.  
  38. nombre1=strlen(nom1);
  39. nombre2=strlen(nom2);
  40. //Contador de caracteres
  41.  
  42. if(nombre1<=nombre2){
  43. for(let=0;primero!=0||segundo!=0||iguales!=nombre1;let++){
  44. if(nom1[let]<nom2[let]){
  45. primero=0;
  46. }
  47. else if(nom1[let]>nom2[let]){
  48. segundo=0;
  49. }
  50. else if(nom1[let]==nom2[let]){
  51. iguales++;
  52. }
  53. }
  54. }else{
  55. for(let=0;primero!=0||segundo!=0||iguales!=nombre2;let++){
  56. if(nom1[let]<nom2[let]){
  57. primero=0;
  58. }
  59. else if(nom1[let]>nom2[let]){
  60. segundo=0;
  61. }
  62. else if(nom1[let]==nom2[let]){
  63. iguales++;
  64. }
  65. }
  66. }//Comparación de letras
  67.  
  68. if(primero==0||iguales==nombre1){
  69. printf("\nLos nombres ordenados son:\n%s\n%s",nom1,nom2);
  70. }else if (segundo==0||iguales==nombre2){
  71. printf("\nLos nombres ordenados son:\n%s\n%s",nom2,nom1);
  72. }else{
  73. printf("\nLos nombres ordenados son:\n%s\n%s",nom2,nom1);
  74. }//Resultado
  75.  
  76. getche();
  77. return(0);
  78. }

Los nombres los coge bien, y al final están bien unidos en la cadena, pero no los ordena, el primer nombre que escribo es el primero que aparece, y si pongo dos nombres exactamente iguales, me salta un error en la ejecución, aunque compila bien. El compilador que utilizo es el Qt Creator de Nokia, que es el que se utiliza en la universidad.

Espero y agradezco sobremanera cualquier tipo de ayuda.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines