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ú

Mensajes - LaiaxanIV

#31
Programación C/C++ / Re: Reloj c++
31 Marzo 2016, 21:20 PM
Mira esto, esta claro que es mejorable pero creo que te puede funcionar para lo que buscas. Si necesitas ayuda o no entiendes alguna cosa, solo lo tienes que decir!

Código (GeSHi) [Seleccionar]

#include <iostream>
using namespace std;

class Reloj{
private:
int time;
bool correctSum(int t);
bool correctSub(int t);
    public:
            Reloj();
            void subHoras(int h);
            void subMin(int m);
            void subSeg(int s);
            void addHoras(int h);
            void addMin(int m);
            void addSeg(int s);
            void printReloj();
};


Reloj::Reloj(){
    time = 0;
    }
   
    void Reloj::addHoras(int h){
    if(!correctSum(h*3600)) cout << "No se ha podido realizar esta operacion con las horas" << endl;
    else time += h*3600;
}

    void Reloj::addMin(int m){
    if(!correctSum(m*60)) cout << "No se ha podido realizar esta operacion con los minutos" << endl;
    time += m*60;
}

    void Reloj::addSeg(int s){
    if(!correctSum(s)) cout << "No se ha podido realizar esta operacion con los segundos" << endl;
    time += s;
}
   
    void Reloj::subHoras(int h){
    if(!correctSub(h*3600)) cout << "No se ha podido realizar esta operacion con las horas" << endl;
    else time -= h*3600;
}

    void Reloj::subMin(int m){
    if(!correctSub(m*60)) cout << "No se ha podido realizar esta operacion con los minutos" << endl;
    time -= m*60;
}

    void Reloj::subSeg(int s){
    if(!correctSub(s)) cout << "No se ha podido realizar esta operacion con los segundos" << endl;
    time -= s;
}

    void Reloj::printReloj(){
int h = time/3600;
int min = (time%3600)/60;
int seg = (time%3600)%60;
cout << h << ":" << min << ":" << seg << endl;
}

    bool Reloj::correctSum(int t){
if((time + t) >= 3600*24) return false;
return true;
}

    bool Reloj::correctSub(int t){
if(time - t < 0) return false;
return true;
}

int main(){
Reloj reloj;
cout << "Introduce la hora inicial del reloj en formato HH:MM:SS" << endl;
int h,m,s;
char c;
cin >> h >> c >> m >> c >> s;
reloj.addHoras(h);
reloj.addMin(m);
reloj.addSeg(s);
int op;
cout << "1->Adelantar reloj 2->Retrasar reloj 3->Ver hora -1-> Salir" << endl;
cin >> op;
while(op != -1){
switch(op){
case 1:
cout << "Introduce el tiempo que quieres adelantar en el siguiente formato HH:MM:SS" << endl;
cin >> h >> c >> m >> c >> s;
reloj.addHoras(h);
reloj.addMin(m);
reloj.addSeg(s);
cout << "Hora:" << endl;
reloj.printReloj();
break;
case 2:
cout << "Introduce el tiempo que quieres retrasar en el siguiente formato HH:MM:SS" << endl;
cin >> h >> c >> m >> c >> s;
reloj.subHoras(h);
reloj.subMin(m);
reloj.subSeg(s);
cout << "Hora:" << endl;
reloj.printReloj();
break;
case 3:
cout << "Hora:" << endl;
reloj.printReloj();
break;
default:
cout << "Opcion no valida" << endl;
}
cin >> op;
}
}
#32
Programación C/C++ / Re: ayuda cola circular
31 Marzo 2016, 20:22 PM
que tiene que hacer exactamente que hacer el rotar? No estoy familiarizado con las colas circulares. Por otra parte, el lleno tendría que ser igualando a 10, no a 9, ya que veo que es de 10 posiciones.
Además, cuando hayas borrado y añadido muchos elementos, cima e inicio se van a salir de rango. No crees que es mejor ir moviendo los elementos de posición?
#33
Cita de: JoseluCross en 30 Marzo 2016, 21:04 PM
Si no los cifro no daría ya la información de donde están? o lo que me propones es que los borre?
JAJAJJAJA
Tienes razón xD Si no los cifras aparecen igual :^D Nada se me ha ido la pinza.
Borrarlos... Bueno, puede que modifiques el texto asi que no me parece una buena opción.
Para mejorar la seguridad yo lo que haría seria modificar el texto de alguna manera, a partir de la clave, para intentar cambiar el patrón de repeticiones.
Por ejemplo, si la palabra es HOLA coges el valor de la primera letra (en este caso H) y añades un valor a esa posición, y así para todos los caracteres. Almenos haces más difícil encontrar patrones y el descifrado es relativamente sencillo.
#34
Además de necesitar las librerias, las funciones se declaran antes del main :D
Prueba asi:

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <time.h>
using namespace std;


void ordena(vector<int>& v) {
    for (int i = 1; i < v.size(); ++i) {
        int x = v[i];
        int j = i;
        while (j > 0 and v[j - 1] > x) {
            v[j] = v[j - 1];
            --j;
        }
        v[j] = x;
    }
}

int main() {
   srand(time(NULL));
   vector<int> v(4);

   for (int i = 0; i < 4; ++i)v[i] = 1 + rand() %  (1 - 9);
   ordena(v);
   for (int i = 0; i < 4; ++i) cout << v[i] << " ";
   cout << endl;

}
#35
Casi parece mejor no cifrar los espacios xD
Si conozco donde van los espacios podré saber la longitud de las palabras. Si las conozco sabre que por ejemplo palabras de 2 de longitud contendrán una vocal, si es solo de 1 es probable que sea una vocal o una y...
Recuerda que cuanta más información me des, más fácil será romper el algoritmo.
#36

#include <iostream>
#include <vector>
using namespace std;


void ordena(vector<int>& v) {
   for (int i = 1; i < v.size(); ++i) {
       int x = v[i];
       int j = i;
       while (j > 0 and v[j - 1] > x) {
           v[j] = v[j - 1];
           --j;
       }
       v[j] = x;
   }
}

int main() {
  srand(time(NULL));
  vector<int> v(4);

  for (int i = 0; i < 4; ++i)v[i] = 1 + rand() %  (1 - 9);
  ordena(v);
  for (int i = 0; i < 4; ++i) cout << v[i] << " ";
  cout << endl;

}


Mira si compila y funciona, lo he hecho de cabeza y no lo he probado
#37
Citar
JoseluCross he de comunicarte que tu cifrado tiene una vulnerabilidad en la forma que cifra los espacios.

Este problema existirá siempre y cuando tu algoritmo de cifrado use operaciones con elementos neutros. Es decir, al sumar 0 siempre tendrás la clave. Lo mismo ocurre en el caso del Vigènere con la A.
No se si eso llega a afectar de gran manera ya que tampoco conoces la posición de los espacios. Lo que, al ser el caracter más repetido, solo haria falta mirar los carácteres mas repetidos en el texto cifrado para tener una idea de los caracteres que forman la clave.
#38
Parece que se haría igual, solo tendrías que modificar el alfabeto que se usa, incluso te podría decir que me lo pones más facil ya que los espacios permiten detectar la longitud de la clave muy facilmente. Ahora solo variaria la frecuencia (no se si el espacio sería más frecuente). Además al diferenciar entre mayúsculas y minúsculas permitiria conocer aún mejor el texto, ya que un punto indica mayúscula y, al detectar una mayúscula se podria saber si el caracter anterior es un punto...
Como ves hay muchas cosas a tener en cuenta.
#39
Aunque se desconociese el número de caracteres aleatorios se podría usar la misma estrategia para descifrar el mensaje, lo único que será más costoso ya que me puedes variar el orden de repeticiones. La única manera de hacerlo completamente seguro es que la longitud de la clave sea la misma longitud que la del texto (esto es un estándar del NIST lo que ahora no me acuerdo bien del nombre).
Te pongo un ejemplo:
Clave: "HOLA"
Mensaje: este es un mensaje super secreto y nadie nunca lo va a descifrar
Cifrado: lgee lg fn tsyshxp sbdpr zsnrlhz y uooil bfnjo wo co l dlgnimflr

A simple vista, se observa como la letra l se repite cada 4 posiciones. Seguro que alomejor otras letras tambien (ten en cuenta que en textos muy largos las repeticiones llegan a ser de mas letras cosa que te asegura más precisión).

lgee
lgfn
tsys
hxps
bdpr
zsnr
lhzy
uooi
lbfn
jowo
cold
lgni
mflr


Supongamos que se que es español, por lo tanto las frecuencias son E,A,O,S,N,R.

Una vez tienes esto, solo tienes que contar por columnas la letra que mas aparece. En el primer caso es la l que aparece 5 veces. Pues para conseguir una E con una L utilizamos la H. Para conseguir la A utilizamos una L.
La segunda columna estamos entre S y G que aparecen tres veces. Vamos a elegir la S porque es la buena (jijijiji) tendrías que probar xD. Por tanto para obtener la E con S... Una O!
Seguiríamos así hasta haber hecho las 4 columnas.

Ten en cuenta que no siempre la E es la letra indicada, tendremos que usar la A, la O, la S... Dependerá un poco del texto. Fíjate que la última columna la letra más repetida es la R que es la 6a letra en el orden de frecuencias, para llegar a obtener la A tendríamos que haber pasado por las otras. Así tendremos que probar con unas cuantas claves, descifraremos el texto con todas las claves y elegiremos el bueno!
#40
Lo has podido ejecutar al menos una vez? O ya des de la instalación falla?
Yo tuve problemas para instalar Linux en windows 8.1, y sé que muchos compañeros de la carrera también.