Problema con matriz char

Iniciado por novatus84, 12 Diciembre 2014, 21:51 PM

0 Miembros y 2 Visitantes están viendo este tema.

novatus84

Muy buenas no consigo acabar este programa:
que me saque la matriz de 10*10 con palabras de un archivo y en los espacios me ponga una letra aleatoria me saca las palabras tal cual, llevo un rato volviéndome loco y no doy con el problema.

Código (cpp) [Seleccionar]

#include <vector>
#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <random>

using namespace std;

string filename = "words.txt";
void error(const string&);

vector<string> load_vector(const string& filename) {
   
    vector<string> vi;
   
    ifstream ifile {filename};
    if (!ifile)
        error("load_vector cannot open the file " + filename);
    copy(istream_iterator<string>(ifile), istream_iterator<string>(), back_inserter(vi));
   
    return vi;
}

void error(const string& s) {
    cerr << "Error: " << s << endl;
    exit(EXIT_FAILURE);
}

void aleatorio (int HEIGHT, int WIDTH,const char* puzzle[HEIGHT][WIDTH]) {
   
    srand(time(NULL)); //inicializamos semilla
    string random;
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            random = 'A' + (rand() % 26);
            if (puzzle[i][j] == " ") {
                puzzle[i][j] = random.c_str();
            }
        }
       
    }
}

char wordToMatrix(int HEIGHT, int WIDTH) {
   
    char puzzle[HEIGHT][WIDTH];
    int filarand = 0;
    vector<string> load_vector(const string&);
    vector<string> words = load_vector(filename);
    string aux;
    char empty = ' ';
    const char* aux2;
    char random;
    char espacio = ' ';
   
    //Inicializamos matriz
    for (int i = 0; i < HEIGHT; i++) {
        cout << endl;
        for (int j = 0; j < WIDTH; j++) {
            puzzle[i][j] = '1';
            cout << puzzle[i][j];
        }
    }

   
    filarand = rand() % 10;
    //cout << filarand << endl;
   
    for (int i = 0; i < 10; i++) {
        filarand = rand() % 10;
        cout << "" << endl;
        for (int j = 0; j < words[i].size(); j++) {
            if (words[i].size() < 10) {
                    //aux2 = words[i].substr(j,1);
                    aux = words[i].substr(j,1);
                    puzzle[i][j] = aux[0];
                    cout << puzzle[i][j];
            }
        }
    }
   
    for (int i = 0; i < 10; i++) {
        //cout << endl;
        for (int j = 0; j < 10; j++ ) {
            if (puzzle[i][j] == '1') {
                random = 'A' + (rand() % 26);
                puzzle[i][j] = random;
                //cout << puzzle[i][j];
            }
        }
    }
   
    /*for (int i = 0; i < HEIGHT; i++) {
        cout << endl;
        for (int j = 0; j < WIDTH; j++) {
            random = 'A' + (rand() % 26);
            if (puzzle[i][j] == espacio) {
                puzzle[i][j] = random;
                cout << puzzle[i][j];
            }
        }
       
    }*/
   
    return puzzle[HEIGHT][WIDTH];

   
}


int main() {
   
    int HEIGHT = 10;
    int WIDTH = 10;
   
    char puzzle[HEIGHT][WIDTH];
   
    srand(time(NULL));
    wordToMatrix(10,10);
   
    /*for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            cout << puzzle[i][j] << endl;
        }
    }*/
   
   
   
    return 0;
}

eferion

Código (cpp) [Seleccionar]
void aleatorio (int HEIGHT, int WIDTH,const char* puzzle[HEIGHT][WIDTH])

Esa cabecera está mal. El valor de WIDTH en puzzle[HEIGHT][WIDTH] debe poder conocerse en tiempo de compilación, que no de ejecución, para que el código pueda crear el juego de instrucciones adecuado.

Código (cpp) [Seleccionar]
string random;
// ...
puzzle[i][j] = random.c_str();


Esto también está mal... ahí estás copiando en puzzle[j] el punter interno del string... una vez sales de ese bucle y "random" deja de existir, esa posición de memoria deja de ser válida. Ahí tendrías que copiar el string.

Código (cpp) [Seleccionar]
char wordToMatrix(int HEIGHT, int WIDTH) {
char puzzle[HEIGHT][WIDTH];


Te digo lo mismo que en el primer punto, lo correcto es que, en este caso, tanto HEIGHT como WIDTH sean conocidas en tiempo de compilación, si ambas variables han de ser dinámicas lo lógico es que reserves memoria con "new".

Y bueno, no entro en más detalle porque no tengo ni compilador ni depurador a mano.

A ver si alguien más se anima.

Un saludo.

novatus84

ya lo tengo jejejejej, ahora me faltarían mejorar algún cosilla, meter las palabras en diagonal o en vertical, y mas jodido que seria una función para mostrar u ocultar las palabras usadas para el relleno de tal forma que pueda imprimír la solución sin las palabras aleatorias o con ellas tambien, estoy perdido no doy mas de mi jejejejeje
Código (cpp) [Seleccionar]
#include <vector>
#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <random>

using namespace std;

string filename = "words.txt";
ifstream ifile {filename};
void error(const string&);

vector<string> load_vector(const string& filename) {
   
    vector<string> vi;

    if (!ifile)
        error("load_vector cannot open the file " + filename);
    copy(istream_iterator<string>(ifile), istream_iterator<string>(), back_inserter(vi));
   
    return vi;
}

void error(const string& s) {
    cerr << "Error: " << s << endl;
    exit(EXIT_FAILURE);
}

void aleatorio () {
    int HEIGHT = 15;
    int WIDTH = 15;
    int wordsize = 0;
    int wordPos = 0;
    char puzzle[HEIGHT][WIDTH];
    bool okWord;
   
    srand(time(NULL)); //inicializamos semilla
   
    char random;
    int filarand = 0;
   
    vector<string> load_vector(const string&);
    vector<string> words = load_vector(filename);
    vector<string> auxWords;
    string enteredWord;
    string aux;
   
    //Inicializamos matriz
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            puzzle[i][j] = ' ';
        }
    }
   
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            random = 'A' + (rand() % 26);
            puzzle[i][j] = random;
        }
    }
   
    for (int i = 0; i < HEIGHT; i++) {
        filarand = rand() % 15;
        wordsize = WIDTH - words[i].size() - 1;
        wordPos = rand() % wordsize;
        for (int j = 0; j < words[i].size(); j++) {
            if (words[i].size() < 10) {
                aux = "";
                aux = words[i].substr(j,1);
                puzzle[filarand][wordPos + j] = aux[0];
            }
        }
    }
   
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            cout << puzzle[i][j];
            cout << "  ";
        }
        cout << endl;
    }
   
    auxWords = words;
   
    do {
        cout << "Introduce una palabra: ";
        cin >> enteredWord;
   
        for (int i = 0; i < auxWords.size(); i++) {
            if (enteredWord == auxWords[i]) {
                okWord = true;
                auxWords.erase(auxWords.begin() + i);
                break;
            }
        else {
            okWord = false;
        }
        }
   
        if (okWord == true) {
            cout << "Palabra " << enteredWord << " correcta" << endl;
        }
        else if (enteredWord != "FIN") {
            cout << "Palabra " << enteredWord << " incorrecta" << endl;
        }
    } while (enteredWord != "FIN");
}

/*char wordToMatrix(int HEIGHT, int WIDTH, char puzzle) {
   
    int filarand = 0;
    vector<string> load_vector(const string&);
    vector<string> words = load_vector(filename);
    string aux;
    char empty = ' ';
    const char* aux2;
    char random;
    char espacio = ' ';
    char puzzle[HEIGHT][WIDTH];
   
    filarand = rand() % 10;
    //cout << filarand << endl;
   
    for (int i = 0; i < 10; i++) {
        filarand = rand() % 10;
        cout << "" << endl;
        for (int j = 0; j < words[i].size(); j++) {
            if (words[i].size() < 10) {
                    //aux2 = words[i].substr(j,1);
                    //aux = words[i].substr(j,1);
                    //puzzle[i][j] = aux[0];
                puzzle[i][j] = words[i].substr(j,1).c_str();
                    cout << puzzle[i][j];
            }
        }
    }
   
    for (int i = 0; i < 10; i++) {
        //cout << endl;
        for (int j = 0; j < 10; j++ ) {
            if (puzzle[i][j] == '1') {
                random = 'A' + (rand() % 26);
                puzzle[i][j] = random;
                //cout << puzzle[i][j];
            }
        }
    }
   
    for (int i = 0; i < HEIGHT; i++) {
        cout << endl;
        for (int j = 0; j < WIDTH; j++) {
            random = 'A' + (rand() % 26);
            if (puzzle[i][j] == espacio) {
                puzzle[i][j] = random;
                cout << puzzle[i][j];
            }
        }
       
    }
   
    return puzzle[HEIGHT][WIDTH];

   
}*/


int main() {
       
    int HEIGHT = 10;
    int WIDTH = 10;
   
    char puzzle[HEIGHT][WIDTH];
   
    srand(time(NULL));
    aleatorio();
    //wordToMatrix(10, 10, puzzle[HEIGHT][WIDTH]);
   
    /*for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            cout << puzzle[i][j] << endl;
        }
    }*/
   
   
   
    return 0;
}