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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


  Mostrar Temas
Páginas: [1] 2 3
1  Programación / Ejercicios / [Haskell] Soluciones reales de una ecuación de segundo grado en: 18 Julio 2018, 10:45 am
Buenos días.
Estoy liado con Haskell que me la dejé para verano en la carrera.

El ejercicio dice lo siguiente:

Consideremos la ecuación de segundo grado ax2 + bx + c = 0.
a) Define una función raíces que tome tres parámetros (correspondientes a los coeficientes a, b y c
de la ecuación) y devuelva una tupla con las dos soluciones reales de la ecuación (para calcular la
raíz cuadrada, usa la función predefinida sqrt). Recuerda que el discriminante se define como b2-
4ac y que la ecuación tiene raíces reales si el discriminante no es negativo.


Yo he hecho esto:

Código
  1. raices :: Float-> Float-> Float-> (Float, Float)
  2. raices a b c | discriminante<0 = error "Raices no reales"
  3.             | otherwise = ((-b + raiz)/denominador, (-b - raiz)/denominador)
  4.  where
  5.    discriminante = (b*b - 4*a*c)
  6. raiz          = sqrt discriminante
  7. denominador   = 2*a

Pero me tira el siguiente error:

Código
  1. parse error on input `='
  2.    Perhaps you need a 'let' in a 'do' block?
  3.    e.g. 'let x = 5' instead of 'x = 5'
  4.   |
  5. 91 |         raiz          = sqrt discriminante
  6.   |                       ^


La solución ya la tengo, pero quiero saber que error estoy cometiendo, ya que no es la primera vez que me aparece.

Gracias!
2  Comunicaciones / Android / Diseño de interfaz en una app en: 27 Mayo 2016, 10:41 am
Buenos días a todo.
Hace poco que he terminado un curso de desarrollo de apps Android y me he puesto a toquetear un poco con el Android Studio para hacer una app.

La app la tengo ya lista, pero me a surgido una duda. ¿Cómo me puedo currar más la interfaz? Quiero hacer que la app se vea menos amateur y la cosa es que como tengo Buttons y otros elementos "basicos" por el layout lo parece bastante.

He estado mirando por Google pero no saco nada en claro. Por ejemplo, si quiero diseñar un button o un listView más currado y no ponerlo tal y como se ve por defecto, cómo lo hago?
¿Existen herramientas para diseñar estos recursos gráficos?

Si alguien me pudiera orientar se lo agradecería. He estado buscando libros pero tampoco he visto nada relevante...
3  Programación / Programación C/C++ / Error a acceder a registro en: 23 Febrero 2016, 10:55 am
Buenos días, tengo este registro:

Código
  1. struct TPregunta {
  2.    string pregunta;
  3.    int respuestaCorrecta;
  4.    string resp1, resp2, resp3;
  5. };
  6.  

y estoy intentando pasar de un fichero al registro la información correspondiente controlada por un numero, este número controla el acceso a la pregunta 1,2,3...

Uso:
Código
  1. read>>p.pregunta[num]>>p.respuestaCorrecta[num]>>p.resp1[num]>>p.resp2[num]>>p.resp3[num];
  2.  

Pero el compilador me da error en esta parte "p.respuestaCorrecta[num]"

Estoy accediendo bien al registro?

Gracias.



El enunciado es este, por si os resulta más sencillo:

Implementar un subprograma denominado leePregunta que reciba por parámetro el nombre
de un fichero y un número natural. Este fichero contendrá una serie de preguntas y sus posibles
respuestas en el siguiente formato (cada pregunta o respuesta ocupan una sola línea):
pregunta 1
nº respuesta correcta
respuesta 1
respuesta 2
respuesta 3
pregunta 2.
...

El subprograma también recibirá por parámetro el número de la pregunta que se quiere leer y
devolverá un parámetro de salida con los datos de la pregunta correspondiente en el fichero
almacenado en una estructura del tipo TPregunta.
4  Programación / Programación C/C++ / Añadir un string al final de un fichero en C++ en: 22 Febrero 2016, 14:40 pm
Buenas tardes, estoy haciendo un ejercicio de programación y me encuentro con el problema de que no se introducir un string al final de un fichero.

Básicamente el problema se reduce a:
Código
  1. ofstream write (fichero.c_str());
  2. string palabra;
  3.  
  4. //COMO ANYADIR "PALABRA" AL FINAL DE "FICHERO"?
  5.  
5  Programación / Programación C/C++ / Errores con un ejercicio de registros en el que tengo que crear una agenda. C++ en: 8 Septiembre 2015, 13:03 pm
Buenas, llevo desde ayer dándole vueltas a este ejercicio en el que tengo que crear una agenda.

Os voy a dejar el código de las funciones y lo que se supone que debe hacer cada una.

Código
  1. //- Definiciones de funciones -----------------------------------------
  2.  
  3. void inicializar_agenda(Tagenda& ag){
  4.    ag.numEntradas=0;
  5. }
  6.  
  7. void a_mayusculas(string& str){
  8.    for(int pos=0; pos<str.size(); pos++){
  9.        if(str[pos]>='a' && str[pos]<='z'){
  10.            str[pos]-=32;
  11.        }
  12.    }
  13. }
  14.  
  15. void leer_contacto(Tentrada& ent){
  16.    string nombre, apellido;
  17.    long numero;
  18.    cout<<"Introduce nombre, apellido y numero de contacto: ";
  19.    cin>>ws;
  20.    cin>>nombre>>apellido>>numero;
  21.  
  22.    a_mayusculas(nombre);
  23.    a_mayusculas(apellido);
  24.  
  25.    ent.nombre=nombre;
  26.    ent.apellido=apellido;
  27.    ent.numero=numero;
  28. }
  29.  
  30. void insertar_contacto(Tagenda& ag, const Tentrada& ent, bool& ok){
  31.    if(ag.numEntradas>=DIM-1) ok=false;
  32.    else{
  33.        int pos=0;
  34.        while(pos<=ag.numEntradas){
  35.            if(ag.entradas[pos].nombre==ent.nombre && ag.entradas[pos].apellido==ent.apellido) ok=false;
  36.            else{
  37.                ok=true;
  38.                ag.entradas[pos].nombre=ent.nombre;
  39.                ag.entradas[pos].apellido=ent.apellido;
  40.                ag.entradas[pos].numero=ent.numero;
  41.            }//end else
  42.            ++pos;
  43.        }//end while
  44.  
  45.    }//end else
  46. }
  47.  
  48. //int pos_en_agenda(string nom, string apdo, const Tagenda& ag);
  49.  
  50. void eliminar_contacto(Tagenda& ag, string nom, string apdo, bool& ok){
  51.    a_mayusculas(nom);
  52.    a_mayusculas(apdo);
  53.    int pos=0;
  54.    while(pos<=ag.numEntradas){
  55.        if(ag.entradas[pos].nombre==nom && ag.entradas[pos].apellido==apdo){
  56.            ok=true;
  57.            ag.entradas[pos].nombre=ag.entradas[ag.numEntradas].nombre;
  58.            ag.entradas[pos].apellido=ag.entradas[ag.numEntradas].apellido;
  59.            ag.entradas[pos].numero=ag.entradas[ag.numEntradas].numero;
  60.            --ag.numEntradas;
  61.        }else ok=false;
  62.        ++pos;
  63.    }
  64. }
  65.  
  66. long numero(const Tagenda& ag, string nom, string apdo){
  67.    long n=0;
  68.    a_mayusculas(nom);
  69.    a_mayusculas(apdo);
  70.    int pos=0;
  71.    while(pos<=ag.numEntradas){
  72.        if(ag.entradas[pos].nombre==nom && ag.entradas[pos].apellido==apdo) n=ag.entradas[pos].numero;
  73.        ++pos;
  74.    }//end while
  75.    return n;
  76. }
  77.  
  78. void listar_agenda(const Tagenda& ag){
  79.    int pos=0;
  80.    while(pos<=ag.numEntradas){
  81.         cout<<ag.entradas[pos].nombre<<" "<<ag.entradas[pos].apellido<<" "<<ag.entradas[pos].numero;
  82.         ++pos;
  83.    }//end while
  84. }
  85.  
  86.  
  87.  


ENUNCIADOS:

ara poder utilizar una agenda, primero habrá que inicializarla simplemente poniendo el nº
de entradas a 0. De esto se encargará la función siguiente

void inicializar_agenda(Tagenda& ag).
Para introducir contactos en la agenda se utilizarán las funciones

void leer_contacto(Tentrada& ent),
que se encargará de pedir y leer, de la consola, los datos de un contacto, pasar nombre y
apellido a mayúsculas, y rellenar con ellos los campos de la entrada ent que recibe como
argumento, y

void insertar_contacto(Tagenda& ag, const Tentrada& ent, bool& OK),
que pedirá los datos de un nuevo contacto para agregarlo a la agenda ag; pero si ya existe
una entrada en la agenda con el mismo nombre y apellido o la agenda está llena, no lo
agrega y devuelve false en el parámetro OK, de lo contrario agrega un nuevo registro con
los datos del contacto en la primera posición libre de la agenda y devuelve true en OK.
Recuérdese que los datos de una entrada deberán estar siempre en mayúsculas.
Para eliminar un contacto de la agenda se utilizará la función

void eliminar_contacto(Tagenda& ag, string nom, string apdo,bool& OK),
que buscará la entrada correspondiente al contacto cuyo nombre y apellido se especifican en
los argumentos y, si la encuentra, la elimina de la agenda ag y devuelve true en el
parámetro OK; pero si no lo encuentra, no modifica la agenda y devuelve false en OK. Para
eliminar la entrada bastará con copiar en su lugar del array la entrada situada en la última
posición ocupada y disminuir el número de entradas de la agenda. Se deberá tener cuidado
con las diferencias entre mayúsculas y minúsculas.
Para obtener el número de teléfono de un contacto se utilizará la función

long numero(const Tagenda& ag, string nom, string apdo),
que buscará en la agenda la entrada correspondiente al contacto cuyo nombre y apellido se
especifican en los argumentos y, si lo encuentra, lo devolverá como resultado; pero si no lo
encuentra, devuelve 0. Se deberá tener cuidado con las diferencias entre mayúsculas y
minúsculas.

Para ver en la pantalla el contenido de la agenda se utilizará la función
void listar_agenda(const Tagenda& ag);
que listará cada una de las entradas de la agenda ag en una línea de la pantalla.


He rehecho el ejercicio varias veces, cuando ejecuto el programa me dice que dejó de funcionar.
6  Programación / Programación C/C++ / Duda sobre registros en C++ en: 6 Septiembre 2015, 23:28 pm
Hola a todos, estoy haciendo un ejercicio en el que se me pide hacer una agenda con el nombre, apellidos y número de cada contacto.

En una parte del enunciado se me dice lo siguiente:"
void leer_contacto(Tentrada& ent),
que se encargará de pedir y leer, de la consola, los datos de un contacto, pasar nombre y apellido a mayúsculas, y rellenar con ellos los campos de la entrada ent que recibe como argumento."


No entiendo bien a qué se refiere con " pedir y leer, de la consola".
¿Dónde están esos datos que tengo que pedir y leer?¿Están ya en la entrada o tiene que meterlos el usuario?

Si me está dando en el argumento de la función acceso al registro (Tentrada& ent) y las declaraciones son las siguientes, cómo accedo  a los campos del array entradas para discernir entre cada entrada con sus respectivos contactos?

Código
  1. struct Tentrada {
  2. string nombre;
  3. string apellido;
  4. long numero;
  5. };
  6.  
  7. struct Tagenda {
  8. Tentrada entradas [DIM];
  9. Unsigned numEntradas;
  10. };
  11.  
  12.  


Gracias.
7  Foros Generales / Foro Libre / Duda "Análisis de circuitos". Calcular Vo en este Amplificador operacional. en: 26 Agosto 2015, 14:26 pm
En el ejercicio se me pide calcular Vo en función de los parámetros del circuito.



La verdad es que he intentado varias cosas, el teorema de superposición, representar el modelo circuital con fuentes de tensión dependientes, por tensiones nodales... pero no me aclaro con las 3 resistencias a la izquierda del nodo 1.

Os cuento lo que he razonado:

En el NODO 1 hay Vg2/2 porque lo que tenemos a la patilla positiva del A.O. es un divisor de tensión y por cortocircuito virtual, cómo las tensiones entre terminal positivo y negativo son iguales y las corrientes que circulan son 0, Vp=Vg2/2 =Vn que es la tensión en el NODO 1
En el NODO 2 tenemos Vg1/4, ya que tenemos otro divisor de tensión.
En el NODO 3 observamos que tenemos inmediatamente Vg2.

Ahora empiezo con analizando el AO con los datos que he obtenido.

(Vo-Vi)/2R = (V1-V2)/R + (V1-Vg2)/R

Tengo algún razonamiento erróneo?

Gracias
8  Programación / Programación C/C++ / Pasar una cadena de caracteres a int. C++ en: 18 Agosto 2015, 19:38 pm
Buenas a todos, aquí sigo, peleando con las cadenas de caracteres.
Veréis, se me plantea el siguiente ejercicio: (no puedo usar ninguna función predefinida que haga el trabajo de cadena_a_int)

Código
  1. /*15) Función para producir el valor numérico correspondiente a una cadena de dígitos; p.e.
  2. para la cadena “-234” debe producir el número -234. La función comprobará si todos los
  3. caracteres son dígitos y devolverá el parámetro ok a true o false según haya podido
  4. producir el valor o no.
  5. void cadena_a_int(const TCadena cad, int& num, bool& ok)*/

Pero el programa que he escrito no me funciona, no se por qué, agrego al código explicando algunas cosillas con comentarios a ver si veis lo que pasa.

Código
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4.  
  5. typedef char TCadena[];
  6.  
  7. //---------------------------
  8.  
  9. void cadena_a_int(const TCadena cad, int& num, bool& ok);
  10.  
  11. int  longitud (const TCadena cad);
  12.  
  13. //---------------------------
  14.  
  15. int main (){
  16.    int num=0;
  17.    char cad[]={99};
  18.    bool ok;
  19.    cadena_a_int(cad, num, ok);
  20.    cout<<num;
  21.  
  22.    return 0;
  23. }
  24.  
  25. //---------------------------
  26.  
  27. void cadena_a_int(const TCadena cad, int& num, bool& ok){
  28.    int  pos=longitud(cad)-1;
  29.    int i=0;
  30.    ok=true;
  31.    bool error=false;           //CONTROLA MAS ADELANTE QUE SE ENCUENTRE ALGUN CARACTER QUE NO SEA NUMERO
  32.    bool negativo=false;           //CONTROLA MAS ADELANTE QUE SI HEMOS ENCONTRADO EN PRIMER LUGAR UN '-' SE MULTIPLIQUE NUM*-1
  33.    if(cad[0]=='-') negativo=true;           //CONTROL PARA NUMEROS NEGATIVOS
  34.    while(cad[pos]>=0 && !error){           //MIENTRAS LA POSICION ES MAYOR O IGUAL QUE 0 Y NO HAY ERROR
  35.        if(cad[pos]>=0 && cad[pos]<=9){           //SI LO QUE TENEMOS ES UN NUMERO, ENTONCES NUM+X*10^i= NUM
  36.            num+=cad[pos]*pow(10,i);
  37.            cout<<cad[pos];           //ESTOY COMPROBANDO SI SE EJECUTA EL BUCLE... POR LO VISTO NO SE EJECUTA...
  38.            ++i;
  39.        }else{
  40.        error=true;
  41.        ok=false;
  42.        }//end else
  43.        --pos;
  44.    }//end while
  45.  
  46.    if(negativo) num*-1;          // PARA NUMEROS NEGATIVOS, NUM*-1
  47. }
  48.  
  49. int longitud (const TCadena cad){
  50.    int l=0;
  51.    while(cad[l]!='\0') ++l;
  52.    return l;
  53. }
  54.  
9  Programación / Programación C/C++ / Duda sobre el control de la longitud de una cadena de caracteres en: 16 Agosto 2015, 20:59 pm
Buenas a todos, tengo una duda.

Si tengo las dimensiones de una cadena de caracteres...

Código
  1. char cadena1[80]
  2.  

... e introduzco por ejemplo en cadena1: "El pajaro vuela", el caracter nulo "\0" estaría inmediatamente después de vuela\0 o estaría en la posición 80 de cadena1 por haber definido su tamaño previamente?

PD: Es que en un ejericio me salen datos basura... no se qué estoy haciendo mal.
Os dejo el código. El main ya venía hecho.

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. typedef char TCadena [];
  5.  
  6. // Funciones para modificar cadenas de caracteres ----------------------
  7.  
  8. unsigned longitud (const TCadena cad);
  9.  
  10. void copiar(TCadena destino, const unsigned dim, const TCadena origen,
  11.                                                              bool& ok);
  12. // Copia los caracteres de la cadena origen en la cadena destino de
  13. // tamañoo dim. Devuelve false en ok si no tiene capacidad suficiente
  14.  
  15. void agregar_char(TCadena destino, const unsigned dim, const char c,
  16.                                                           bool& ok);
  17. // Agrega el carácter c al final de la cadena destino.
  18. // Devuelve ok a false cuando no tiene capacidad suficiente
  19.  
  20. void encadenar(TCadena destino, const unsigned dim,
  21.                                 const TCadena origen, bool& ok);
  22. // Agrega todos los caracteres de la cadena origen al final de la cadena
  23. // destino. Devuelve ok a false cuando no tiene capacidad suficiente
  24.  
  25.  
  26. //- Programa de prueba -------------------------------------------------
  27.  
  28. int main(){
  29.    setlocale(LC_ALL, "spanish");
  30.  
  31.    char cadena1[80], cadena2[80];
  32.    char c;
  33.    bool ok;
  34.  
  35.    cout << "Introducir una cadena:\n";
  36.    cin >> ws;
  37.    cin.getline(cadena1,79);
  38.  
  39.    cout << "Introducir un carácter: ";
  40.    cin >> c;
  41.    agregar_char(cadena1, 80, c, ok);
  42.    if(ok){
  43.      cout << "Al agregarle el carácter la cadena queda:\n";
  44.      cout << cadena1 << endl;
  45.    } else {
  46.      cout << "No hay espacio para agregar un carácter\n";
  47.    }
  48.  
  49.    copiar(cadena2, 80, cadena1, ok);
  50.    if (ok){
  51.          cout << "La cadena copiada es: \n";
  52.          cout << cadena2 << endl;
  53.    } else {
  54.          cout << "No hay espacio para la copia" << endl;
  55.    }
  56.  
  57.    cout << "Pegando las dos cadenas resulta: \n";
  58.    encadenar(cadena2, 80, cadena1, ok);
  59.    if (ok){
  60.          cout << cadena2 << endl << endl;
  61.    } else {
  62.          cout << "No hay espacio para encadenar" << endl;
  63.    }
  64.  
  65.    cout<<longitud(cadena2);
  66.    return 0;
  67. }
  68.  
  69. //- Definiciones de funciones ------------------------------------------
  70.  
  71. unsigned longitud (const TCadena cad){
  72.    unsigned pos=0;
  73.    while (cad[pos]!='\0') ++pos;
  74.    return pos;
  75. }
  76.  
  77.  
  78. void copiar(TCadena destino, const unsigned dim, const TCadena origen, bool& ok){
  79.    if(longitud(origen)<=dim){
  80.        ok=true;
  81.        unsigned i=0;
  82.        while(origen[i]!='\0'){
  83.            destino[i]=origen[i];
  84.            ++i;
  85.        }//end while
  86.    }else ok=false;
  87. }
  88.  
  89. void agregar_char(TCadena destino, const unsigned dim, const char c, bool& ok){
  90.        if(longitud(destino)<dim){
  91.            destino[longitud(destino)]=c;
  92.             ok=true;
  93.        }else ok=false;
  94. }
  95.  
  96. void encadenar(TCadena destino, const unsigned dim, const TCadena origen, bool& ok){
  97.    if(longitud(origen)>dim-longitud(destino)){
  98.        unsigned i=longitud(destino)+1;
  99.        unsigned pos=0;
  100.        while(origen[pos]!='\0'){
  101.            destino[i]=origen[pos];
  102.            ++i;
  103.        }//end while
  104.        ok=true;
  105.    }else ok=false;
  106. }
  107.  

10  Programación / Programación C/C++ / Cadenas de caracteres. Función para comparar una cadena ignorando signos. C++ en: 12 Agosto 2015, 13:44 pm
Hola a todos. Esta vez traigo una duda con ejercicios de cadenas de caracteres.
Tengo que hacer una función que compare 2 cadenas ignorando las mayúsculas y minúsculas y me devuelva si son o no iguales.

Había pensado en hacerme una función "void aMayuscula (TCadena cad)" que convirtiera toda la cadena a mayuscula para implementarla en otra función y comparar las 2 cadenas pasadas a mayúscula. Pero para hacer esto tendría o que crear una cadena nueva copiando el contenido de la original  ya en mayúscula o sobrescribir la original, cosa que no puedo porque en la pLantilla que me dan me pasan las cadenas como "const"
Lo que he hecho al final es una función "char aMayuscula (TCadena cad, unsigned pos)" que va dentro de un while que recorre las 2 cadenas y compara una a una las letras devueltas por la función "char aMayuscula".

Código
  1. char aMayuscula(TCadena cad, unsigned pos){
  2.    char a;
  3.    if(cad[pos]!='\0'){
  4.        if(cad[pos]>='a' and cad[pos]<='z'){
  5.            a=cad[pos]-32;
  6.        }//end if
  7.    }//end if
  8.    return a;
  9. }
  10.  

A continuación, la función que compara las cadenas:

Código
  1. bool iguales_ignorando_tipo(const TCadena cad1, const TCadena cad2){
  2.    unsigned i=0;
  3.    bool es=true;
  4.    while(es && cad1[i]!='\0'&& cad2[i]!='\0' ){
  5.        if(aMayuscula(cad1,i)!=aMayuscula(cad2,i)) es=false;
  6.        ++i;
  7.    }
  8.    return es;
  9. }
  10.  


Al compilar me da error "invalid conversion from 'const char*' to 'char*'" Y no entiendo por qué sale.


¿Qué tengo mal?
Páginas: [1] 2 3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines