|
Mostrar Temas
|
Páginas: [1] 2 3
|
2
|
Programación / Programación C/C++ / Extraño problemas con vector
|
en: 11 Abril 2014, 00:14 am
|
Pues resulta que tenía petadas "aleatorias" en mi programa. Estuve mirando y comprobé que pasaba en la destrucción de un objeto. El objeto tiene pocos atributos, lo unico que puede causar problemas es: std::vector<std::vector<RGB> > Matriz;
RGB es una clase con 3 enteros. Eso no debería causar problemas. Probé a depurar el destructor: ~Image() { for (int i = 0; i < Matriz.size();i++) Matriz[i].clear(); std::cout<<"Destruidas las filas..."<<std::endl; Matriz.clear(); std::cout<<"^^"<<std::endl; };
Falla en el ultimo clear. Pero no entiendo porque. ¿Hay problemas en destruir un vector desde otro vector? Repito que no pasa siempre, solo pasa en X casos (y con la misma entrada y circunstancias  ).
Vale, esque escribía en posiciones negativas del vector *_*
|
|
|
4
|
Programación / Programación C/C++ / Representación de Coordenadas
|
en: 9 Abril 2014, 16:49 pm
|
Buenas. Frecuentemente hay que trabajar con coordenadas en la programación. Actualmente conozco tres formas de pasarlas: 1º A "pelo" con dos variables int: int x = 1; int y = 1; pintar(x,y);
2º Creandote una estructura "Cord": struct Cord { int X,Y; Cord(int x,int y) : X(x),Y(y) {} }; //... pintar(Cord(1,1));
3º Un objeto Cord con su encapsulamiento y su todo: class Cord { int X,Y; public: Cord(int x,int y) : X(x),Y(y) {} int getX() const {return X;} int getY() const {return Y;} void setX(int x){X = x;} void setY(int y){Y = y;} bool operator==(const Cord a) const {return X == a.X && Y == a.Y;} bool operator!=(const Cord a) const {return X != a.X || Y != a.Y;} Cord operator+(const Cord a) const{return Cord(A.X+X,A.Y+Y);} }; //... Pintar(Cord(1,1));]
En vuestra opinión. ¿Cual es la forma más adecuada? Con la primera quizás se escribe menos, aunque se te acumulan los argumentos en la función.
|
|
|
5
|
Programación / Programación C/C++ / Problema extraño
|
en: 13 Marzo 2014, 12:00 pm
|
Buenas. Voy a a hacer un post un poco largo, de modo que los vagos deberían dejar de leer ^^ Estoy haciendo problemas de estos con juez automatico, el problema en el que estoy es el siguiente: E. KaniI LanGuAgeE
Por razones que no vienen al caso, se quiere convertir grandes clásicos de la literatura española (El Quijote,Don Juan Tenorio, Teo va al parque, etc. . . ) a un lenguaje más cercano a la juventud de hoy en día.
Así pues, se está pensando en realizar un programa que utilice una serie de reglas de conversión al lenguaje conocido como kaNiI LanGuAgeE.
A continuación explicamos dichas reglas:
1. Se eliminan las haches (excepto ch que se transformará en x). 2. Cuando existan una o más vocales juntas, se convierten en mayúscula las de las posiciones pares, contando la primera vocal como posición 1. 3. Las consonantes siguen una regla similar, pero no tienen que ser consecutivas para pasarlas a mayúsculas. En este caso, las consonantes se alternan entre mayúsculas y minúsculas dentro de una misma palabra, empezando por mayúscula. (hola caracola!oLaA KaraKolaA) Por simplicidad se puede considerar consonante todo aquello que no es vocal. 4. Si la palabra acaba en vocal se añade la misma vocal (se sigue aplicando la regla de las mayúsculas (regla 2)) (Primo!PriMoO, vivia !BibiAa). 5. Las c con sonido z (ce, ci) se cambian por z, mientras que el resto se cambian por k. 6. Las b cambian por v y las v por b. 7. Las letras ch cambian por x. 8. Las letras que ya están en mayúscula se mantienen: (HOLA CARACOLA!OLAA KARAKOLAA). 9. Una consonante estará en mayúscula si cumple la regla 3 o si la letra original está en mayúscula. Para el caso especial de la ch (al sustituirse por x), seguirá la regla tomando en cuenta si la c de la ch original es mayúscula o no. (revancha!RebaNxaA, rebanCHa!RevaNXaA, reVancHa !ReBaNxaA) 10. Una vocal estará en mayúscula si cumple la regla 2 o si la letra original está en mayúscula. (que ! QuEe, quE!QuEE)
Se recomienda revisar los ejemplos detenidamente para ver como se aplican estas reglas. Y utilizar herramientas como diff para ver con más detalle en qué partes está fallando el programa.
Por simplicidad las frases solo contendrán carácteres de a-z y A-Z y espacios como delimitadores. También, debido al caso especial de la eliminación de la h, no existe ninguna palabra que acabe por h. Y te dan ejemplo la entrada: No es verdad angel de amor que en esta apartada orilla mas pura la luna brilla y acaso se respira mejor En un lugar de la mancha de cuyo nombre no quiero acordarme vivia Con diez canyones por banda viento en popa a toda vela no corta el mar sino vuela un velero bergantil aquel pirata el temido Este es un ejemplo mas corto Para que podais gastar la herramienta diff y os salgan bien las cosas ahi es nada y ahora unas frases tipicas si apruebo todas mi madre me compra la moto sin ser chula ni vacilona soy tu envidia campeona
Y la salida: NoO eS verdad aNgeL DeE aMor QuEe eN eStaA aParTadaA oRilLaA Mas PuraA LaA LunaA VriLlaA Y aKasoO SeE ResPiraA MejoR EN uN LugaR DeE LaA ManXaA DeE KuyoO NomVreE NoO QuIeroO aKorDarMeE BibiAa Kon DiEz KanYoneS Por VanDaA BiEnToO eN PopaA aA TodaA BelaA NoO KorTaA eL Mar SinoO BuElaA uN BeleRoO VerGanTil aQuEl PiraTaA eL TemiDoO ESteE eS uN eJemPloO Mas KorToO ParaA QuEe PodaIS GasTar LaA eRraMiEnTaA DifF Y oS SalGan ViEn Las KosaS aIi eS NadaA Y aORaA uNas FraSes TipiKas SiI aPruEVoO TodaS MiI MadReE MeE KomPraA LaA MotoO Sin Ser XuLaA NiI BaziLonaA Soy TuU eNbiDiAa KamPeOnaA
Total que me pongo a ello y saco este código: #include <iostream> #include <fstream> #include <sstream> using namespace std; string Traducir(string &e); int main() { ifstream fin("Ekani1.in"); ofstream fout("salida.txt"); string palabra,linea; getline(fin,linea); while (fin.good()) { { stringstream Buffer(linea); unsigned int i = 0; while (Buffer.good()) { while (i < linea.size() && linea[i] == ' ') { fout<<' '; i++; } Buffer>>palabra; i += palabra.size(); fout<<Traducir(palabra); palabra.clear(); } fout<<endl; } getline(fin,linea); } return 0; } inline bool esVocal(char a) { return a == 'a' || a == 'e' || a == 'i' || a == 'o' || a== 'u' || a == 'A' || a == 'E' || a == 'I' ||a == 'O' ||a=='U'; } string Traducir(string &e) { string buffer; int consonante = 1; char letra; if (esVocal(e[e.size()-1])) // Si la ultima es vocal, añadimos una vocal al final e += e[e.size()-1]; for (unsigned int i = 0; i < e.size(); i++) { if (esVocal(e[i])) // es vocal? { buffer += e[i]; // la anyadimos bool mayus = 1; i++; // listamos todas las vocales adyacentes (y las h, ya que son "mudas") while (i < e.size() && (esVocal(e[i]) || e[i] == 'h' || e[i] == 'H')) { if (e[i] == 'h' || e[i] == 'H'){i++; continue;} // las haches se descartan if (mayus == 1) buffer += toupper(e[i]); // si toca mayuscula, anyadimos una mayuscula else buffer += e[i]; // sino, la anyadimos tal cual mayus = !mayus; i++; } i--; continue; } // no es vocal if (e[i] == 'h' || e[i] == 'H') // si es h, se ignora { if (i != 0 && (e[i-1] == 'c' || e[i-1] == 'C')) // si la anterior era una c { if (e[i-1] == 'C') letra = 'X'; // la sustituimos por una X else letra = 'x'; // o x minuscula if (consonante % 2 == 0) // si es una posicion par, toca mayuscula { buffer[buffer.size()-1] = toupper(letra); // cambiamos la ultima posicion consonante = 1; } else buffer[buffer.size()-1] = letra; } continue; } letra = e[i]; // la letra se anyade al final, segun resulte ser mayuscula o minuscula consonante++; // else buffer += e[i]; // if (e[i] == 'b') // sustituir b por v { letra = 'v'; } else if (e[i] == 'B') // sustituir B por V { letra = 'V'; } else if (e[i] == 'v') { letra = 'b'; } else if (e[i] == 'V') { letra = 'B'; } else if (e[i] == 'c' || e[i] == 'C') // las c, por z o por k { if (i+1 < e.size() && (e[i+1] =='e' || e[i+1] == 'E' ||e[i+1] == 'i' || e[i+1] == 'I')) { if (e[i] == 'c') letra = 'z'; else letra = 'Z'; // i++; } else { if (e[i] == 'c') letra = 'k'; else letra = 'K'; } } if (consonante % 2 == 0) // si es una consonante en posicion par { buffer += toupper(letra); // se anyade mayuscula consonante = 0; } else buffer += letra; // se anyade tal cual } return buffer; }
Que me genera una salida identica a la anterior. Total que lo subo al juez y me marca WRONG ANSWER. Lo he revisado varias veces pero no entiendo que puede fallar 
|
|
|
6
|
Programación / Programación C/C++ / Sobre la lectura de variables...
|
en: 10 Marzo 2014, 20:49 pm
|
Buenas. Suponte, que quiero leer los números: 2 5 Yo haría: int numero,numero2; cin>>numero>>numero2;
Y perfecto. ¿Pero que pasaría si hubiese una coma en lugar de un espacio? 2,5 ¿Como cambio el delimitador de cin para poder leerlos directamente?
|
|
|
7
|
Programación / Programación C/C++ / (USACO) Problemas de progamación para practicar
|
en: 14 Enero 2014, 15:40 pm
|
Está pagina estaudinense, es la que usan los alumnos de allí para practicar para las olimpiadas de progamación. Son problemas muy interesantes: http://cerberus.delos.com:790/usacogateTienes que subir el código del problema, allí un juez automático comprueba que todo va bien. El juez automático lo que hace es compilar el progama y meterles algunos casos de prueba para ver si da bien el resultado. Puede dar los siguientes errores: - Error de compilación. - Error de ejecución (el SO aborta el progama, mayormente por un mal uso de punteros entre otras cosas). - Respuesta incorrecta (el resultado no coincide con el que él tiene). - Sobrepasado el tiempo de ejecución. Suponeos que teneís que calcular el máximo de un conjunto de números. El juez compila el código y le mete la siguiente entrada al progama: 1 4 2 3 6 5 3 4 8 3 1 0 4 La salida que debería dar tu progama es: 8 Ya que es el número máximo. PD: Decir que la página no está orientada para principiantes, debes tener un mínimo de conocimiento para poder hacer algun problemilla 
|
|
|
8
|
Programación / Programación C/C++ / Problema extraño en constructor
|
en: 14 Diciembre 2013, 14:33 pm
|
Tengo un problemilla muy extraño en un constructor, dado una estructura tal que así: struct Nodo { Nodo* Letra[26]; int ocupados = 0; char Caracter; Nodo(char caracter = 0) : Caracter(caracter) { for (int i = 0; i < 26;i++} Letra[i] = NULL;} ~Nodo(){for (int i = 0; i < 26;i++) if (otro.Letra[i] != NULL) delete Letra[i]; } };
Me salta un error de compilación en el constructor, dice que "Letra" no existe. Lo cual no tiene sentido *_*
|
|
|
9
|
Programación / Programación C/C++ / Memory leak con strings
|
en: 9 Agosto 2013, 14:06 pm
|
#include <iostream> using namespace std; class foo { public: string str; foo() : str(1000000,'a') { } ~foo() { cout<<"Destructor invocado"; } }; int main() { cout << "Presione para construir f"; cin.get(); foo* f = new foo; cout << "Presione para destruir f"; cin.get(); delete f; cout << "Presione para salir del programa"; cin.get(); }
¿Por qué la memoria no se libera al destruir el objeto foo? *_*
|
|
|
10
|
Programación / Programación C/C++ / (C++) Sobre la estructuración del código
|
en: 11 Julio 2013, 00:15 am
|
Tengo un problema que me frie la sangre. Tengo esto en un archivo: HILO(DesplazamientoPersonaje,parametro) { Datos* param = (Datos*) parametro; switch (param->Orientacion) { case ARRIBA: Transicion(param,0,-1); // Transicion, desplazamiento X e desplazamiento Y negativo break; case ABAJO: Transicion(param,0,1); // Transicion, desplazamiento X e desplazamiento Y positivo break; case IZQUIERDA: Transicion(param,-1,0); // Etc break; case DERECHA: Transicion(param,1,0); break; } delete param; } void Transicion(Datos* param,short incrx,short incry) { for (short ini = 1; ini < 21; ini++) { //Blablablabla... } }
Y en otro archivo tengo: HILO(Desplazamiento,parametro) { Datos* param = (Datos*) parametro; switch (param->Orientacion) { case ARRIBA: Transicion2(param,0,-1); // Transicion, desplazamiento X e desplazamiento Y negativo break; case ABAJO: Transicion2(param,0,1); // Transicion, desplazamiento X e desplazamiento Y positivo break; case IZQUIERDA: Transicion2(param,-1,0); // Etc break; case DERECHA: Transicion2(param,1,0); break; } delete param; } void Transicion2(Datos* param,short incrx,short incry) { for (short ini = 1; ini < 21; ini++) { // blablabla if (param->Valor == 1) circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,5,pallete_color[14]); if (param->Valor == 2) circlefill(param->Lienzo,param->X*20+10,param->Y*20+10,7,pallete_color[12]); // blablablabla } }
Son muy parecidas, las unicas diferencia son los dos ifs de la función for. Hay alguna forma (sencilla) de juntar las dos funciones pero conservando los dos ifs? 
|
|
|
|
|
|
|