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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6
21  Programación / Programación C/C++ / Re: Sobre el truncamiento - Consulta en: 2 Enero 2019, 21:35 pm
Cuando operas dos variables de tipo <int>, el resultado resulta de tipo <int> aunque lo guardes en un <double/float>. Por ejemplo:
Código
  1. int a = 5, b = 2;
  2. double res = a / b;
  3. cout << res;
Este trozo de código te mostraría por pantalla "2". Esto es porque divides (int)5 / (int)2 entonces el resultado es (int)2. Entonces aunque luego lo guardes en un <double> es como hacer <double res = 2>.

Para evitar esto se puede cambiar el tipo al menos a uno de los operandos, una operación entre dos variables numéricas distintas devuelve el resultado con el tipo más grande de los dos operandos:
- <int> / <int> = <int>
- <double> / <int> = <double> (y al revés igual)

Para no modificar el tipo puedes hacer un casting justo antes de la operación, quedaría algo así:
Código
  1. int a = 5, b = 2;
  2. double res = (double)a / b; // o a / (double)b el resultado es el mismo
Así conviertes la variable <a> en <double> pero sólo para hacer esa operación, después de hacer la división seguirá siendo de tipo <int>.

PD: Los últimos métodos de tu clase (los de comparación) tienen el mismo problema, prueba a comparar dos racionales que uno sea menor que otro pero por menos de una unidad, por ejemplo 1/3 < 1/2, el operador < te va a decir que el primero no es menor que el segundo (porque va a comparar 0 < 0, no 0.3 < 0.5). Suerte :-X

Así que así se hace un casting, la verdad es que no sabía y mire por internet pero no apareció nada, y claro, no van a funcionar los métodos por el tema de los enteros jaja eso lo sabía.

Gracias por la ayuda  ;D
22  Programación / Programación C/C++ / Re: Sobre el truncamiento - Consulta en: 1 Enero 2019, 01:02 am
Puedo intuir qué es Racional, pero ¿Què es exactamente?

No sé si es retorica, así que, acá te adjunto el código:

Código
  1. #include <iostream>
  2. #include <iomanip>
  3. using namespace std;
  4. class Racional{
  5. int num,dem;
  6. public:
  7. Racional(int _num, int _dem): num(_num), dem(_dem){
  8.  
  9. }
  10. int Ver_num(){
  11. return num;
  12. }
  13. int Ver_dem(){
  14. return dem;
  15. }
  16. Racional operator+(Racional _r){
  17. int aux=(this->num*_r.dem)+(this->dem*_r.num);
  18. int aux2=this->dem*_r.dem;
  19. Racional A(aux,aux2);
  20. return A;
  21. }
  22. Racional operator*(int _i){
  23. Racional aux(this->num*_i,this->dem);
  24. return aux;
  25. }
  26. Racional operator*(Racional _r){ //Ahora ya funcionaria
  27. Racional aux(this->num*_r.num,this->dem*_r.dem);
  28. return aux;
  29. }
  30. Racional& operator++(){
  31. num+=dem;
  32. return *this;
  33. }
  34. Racional operator++(int _i){
  35. Racional aux=*this;
  36. num+=dem;
  37. return aux;
  38. }
  39. //Ejercicio 2
  40. bool operator<(Racional _r){
  41. float aux=this->num/this->dem;
  42. float aux2=_r.num/_r.dem;
  43. if(aux<aux2){
  44. return true;
  45. }
  46. return false;
  47. }
  48. bool operator>(Racional _r){
  49. float aux=this->num/this->dem;
  50. float aux2=_r.num/_r.dem;
  51. if(aux>aux2){
  52. return true;
  53. }
  54. return false;
  55. }
  56. bool operator<=(Racional _r){
  57. float aux=this->num/this->dem;
  58. float aux2=_r.num/_r.dem;
  59. if(aux<=aux2){
  60. return true;
  61. }
  62. return false;
  63. }
  64. bool operator>=(Racional _r){
  65. float aux=this->num/this->dem;
  66. float aux2=_r.num/_r.dem;
  67. if(aux>=aux2){
  68. return true;
  69. }
  70. return false;
  71. }
  72. bool operator==(Racional _r){
  73. float aux=this->num/this->dem;
  74. float aux2=_r.num/_r.dem;
  75. if(aux==aux2){
  76. return true;
  77. }
  78. return false;
  79. }
  80. bool operator!=(Racional _r){
  81. float aux=this->num/this->dem;
  82. float aux2=_r.num/_r.dem;
  83. if(aux!=aux2){
  84. return true;
  85. }
  86. return false;
  87. }
  88. };
  89.  
  90. int main(int argc, char *argv[]) {
  91. Racional A(3,5), B(2,3), C(0,1);
  92. C=A+B;
  93. cout<<C.Ver_num()<<" "<<C.Ver_dem()<<endl<<endl;
  94. C=A*B; //Da error porque no esta sobrecargado para multiplicar por racionales...
  95. C=A+B+C;
  96. C=A*B*C;//solo para multiplicar por un entero
  97. B=C++;
  98. A=++C;
  99. cout<<A.Ver_num()<<" "<<A.Ver_dem()<<endl<<endl;
  100. cout<<B.Ver_num()<<" "<<B.Ver_dem()<<endl<<endl;
  101.  
  102. /*Ejercicio 2*/
  103. Racional A2(1,5), B2(3,3);
  104. double aux=A2.Ver_num()/const_cast<double >(A2.Ver_dem());
  105. if(A2<B2){
  106. cout<<"A2 es menor que B2"; //Cómo podría evitar que se trunque el valor?
  107. }
  108. return 0;
  109. }
  110.  
  111.  

Gracias por responder, me estaba olvidando
23  Programación / Programación C/C++ / Re: Sobre el truncamiento - Consulta en: 31 Diciembre 2018, 22:53 pm
Mete el valor en un double y castea uno de los operandos a double.

Mira, aquí te dejo una pequeña parte del código:

Código
  1. Racional A2(1,5), B2(3,3);
  2. double aux=A2.Ver_num()/A2.Ver_dem();

Deberia castear así?

Código
  1. const_cast <double>(A2.Ver_num()) o A2.Ver_dem(), cualquiera de ellos es valido?
24  Programación / Programación C/C++ / Sobre el truncamiento - Consulta en: 31 Diciembre 2018, 17:14 pm
Código
  1. Buenas gente, estaba haciendo un ejercicio de Racionales,
  2. y estaba trabajando con dos int, para representarlo respectivamente,
  3. mi consulta es, como podría evitar que el compilador me trunque los
  4. valores cuando los divido, para verlo con valor decimal?
25  Programación / Programación C/C++ / Re: Qué retornar en una sobrecarga [] - Consulta en: 26 Diciembre 2018, 15:02 pm
Arroja una excepcion.
Cómo sería eso? Una explicación por favor
26  Programación / Programación C/C++ / Qué retornar en una sobrecarga [] - Consulta en: 26 Diciembre 2018, 03:28 am
Buenas, quería saber qué podía retornar en la sobrecarga del operador [] cuando el indice que le paso, es superior al size del puntero, traté de retornar nullptr y el valor -1, pero me dice que el retorno debe ser un valor constante, por ende, qué podría retornar para utilizar ese if en el main?

Aquí le dejo el pequeño código:

Código
  1. int &operator[](int _i){
  2. if(_i<=size){
  3. return p[_i];
  4. }
  5. return -1; /*Que puedo retornar para saber que supere el indice?*/
  6.  
  7. }
  8.  
  9. cout<<"Ingrese la posicion que desea modificar: "; cin>>i;
  10. if(V2[i-1]==/*...*/){
  11. cout<<"Ha superado el tamanio del arreglo"<<endl;
  12. }else{
  13. cin>>v;
  14. V2[i-1]=v;
  15. }

27  Programación / Programación C/C++ / Re: Consulta sobre herencia y cómo proceder en: 25 Diciembre 2018, 17:52 pm
El Piano es un tipo de Instrumento, no es un tipo de tecla y no es un tipo de pedal. No tiene sentido que haya derivación de teclas o.pedales.

En vez de definir el método cargar define y usa el constructor.

Si le pides al usuario el índice de las teclas que van de 1 a 7, por qué le sumas 1?

El método apretar del piano no ejecuta el método apretar de la tecla.

Con respecto al piano, entonces declaro un puntero a Instrumento que apunte a un piano y desde el puntero Instrumento manejo todo? Ya lo probé así y no me deja acceder a los métodos de piano, ya que Instrumento solo tiene el método "Ver_tipo", no te estoy entendiendo.

Si defino el constructor en Piano, ya el programa no me funciona, por eso declaré el método "Cargar", que sí me dejaba ver las teclas ya pre cargadas sin la necesidad de hacer que el usuario ingrese las notas.

No me dí cuenta, tenes razón con lo de sumarle 1 al valor que ingresa el usuario, en realidad tengo que restarle 1 para mostrar la posición correcta, my bad.

Ya acomodé el método apretar de Piano para que apriete la tecla  ;D

Con las otras dudas, me podrías ayudar? Ya que sigo sin entenderte, probé hacer lo que dijiste y eso fueron los resultados que obtuve, lo que te comenté más arriba.

Gracias por la ayuda  ;D
28  Programación / Programación C/C++ / Re: Consulta sobre herencia y cómo proceder en: 25 Diciembre 2018, 00:04 am
Hice esto, no sé si cumple con lo que pide el ejercicio, a ver si me dan el visto bueno.

Código
  1. #include <iostream>
  2. using namespace std;
  3. class Instrumento{
  4. public:
  5. virtual string Ver_tipo(){
  6. return "Sin tipo";
  7. };
  8. };
  9. class Tecla{
  10. int tecla; string nota;
  11. public:
  12. Tecla (){
  13.  
  14. }
  15. Tecla(string _nom){
  16. nota=_nom;
  17. }
  18. string Ver_nota(){
  19. return nota;
  20. }
  21. void Apretar(){
  22. tecla=1;
  23. }
  24. void Soltar(){
  25. tecla=0;
  26. }
  27. bool Esta_apretada(){
  28. if(tecla==1){
  29. return true;
  30. }
  31. return false;
  32. }
  33.  
  34. };
  35. class Pedal{
  36. float presion;
  37. public:
  38. Presion(float _p=0){
  39. presion=_p;
  40. }
  41. void Aumentar_presion(float _f){
  42. presion=_f;
  43. }
  44. void Disminuir_presion(float _f){
  45. presion=_f;
  46. }
  47. float Ver_presion(){
  48. return presion;
  49. }
  50. };
  51. class Piano:public Tecla, public Pedal, public Instrumento{
  52. Tecla *T[7]; Pedal P;
  53. public:
  54. void Cargar_nota(){
  55. T[0]=new Tecla ("Do");
  56. T[1]=new Tecla ("Re");
  57. T[2]=new Tecla ("Mi");
  58. T[3]=new Tecla ("Fa");
  59. T[4]=new Tecla ("Sol");
  60. T[5]=new Tecla ("La");
  61. T[6]=new Tecla ("Si");
  62. }
  63. string Apretar_tecla(int _i){
  64. return T[_i]->Ver_nota();
  65. }
  66. void Soltar_tecla(int _i){
  67. T[_i]->Soltar();
  68. }
  69. void Presionar_pedal(float _f){
  70. P.Aumentar_presion(_f);
  71. }
  72. string Ver_tipo (){
  73. return "Piano";
  74. }
  75. };
  76. int main(int argc, char *argv[]) {
  77. Piano P;
  78. P.Cargar_nota();
  79. cout<<"Estas son las notas de cada tecla [1-7]"<<endl;
  80. cout<<endl;
  81. cout<<"Tecla 1: "<<P.Apretar_tecla(0)<<endl;
  82. cout<<"Tecla 2: "<<P.Apretar_tecla(1)<<endl;
  83. cout<<"Tecla 3: "<<P.Apretar_tecla(2)<<endl;
  84. cout<<"Tecla 4: "<<P.Apretar_tecla(3)<<endl;
  85. cout<<"Tecla 5: "<<P.Apretar_tecla(4)<<endl;
  86. cout<<"Tecla 6: "<<P.Apretar_tecla(5)<<endl;
  87. cout<<"Tecla 7: "<<P.Apretar_tecla(6)<<endl;
  88. cout<<endl<<endl;
  89. int i;
  90. cout<<"¿Que tecla desea presionar? [1-7]"; cin>>i;
  91. cout<<"Mostrando la nota que contiene la tecla nro "<<i<<": "<<P.Apretar_tecla(i+1)<<endl;
  92. cout<<"Su instrumento es de tipo : "<<P.Ver_tipo();
  93. return 0;
  94. }
29  Programación / Programación C/C++ / Consulta sobre herencia y cómo proceder en: 24 Diciembre 2018, 17:03 pm
Buenas, miren en este ejercicio me pide que cree 3 clases, una llamada Tecla, otra llamada Pedal y otra llamada Instrumento (No tengo idea para que sirve esta). Bueno el tema es este, hice el código siguiendo los pasos que me detallaba el ejercicio, pero el tema es que no encuentro manera de hacerlo ya en el main, tengo una manera de hacerlo, pero no estaría siguiendo al pie de la letra el ejercicio, así que, a ver si me pueden orientar un poco por favor.

Consigna:
Código
  1. a. Defina una clase Tecla para representar una tecla de un piano. Cada tecla
  2. puede estar o no apretada, y tiene ademas una nota asociada (cuyo nombre se
  3. representará con un string). Su interfaz debe tener tener entonces:
  4. - un constructor que reciba el nombre de la nota
  5. - un método VerNota que retorne el nombre de la nota
  6. - un método Apretar que cambie el estado de la tecla a apretada.
  7. - un método Soltar que cambie el estado de la tecla a no apretada.
  8. - un método EstaApretada que retorne true si la tecla está apretada, false en caso
  9. contrario
  10. b. Defina una clase Pedal para representar el pedal de un piano. El pedal debe
  11. almacenar un valor (f loat ) que indica la presion que el musico ejerce sobre el pedal.
  12. El constructor debe inicializar la presion en 0 , y la clase debe tener metodos para
  13. modificarla y consultarla.
  14. c. Reutilizando las clases Tecla , Pedal e Instrumento :
  15. class Instrumento{
  16. virtual string VerTipo() { return "sin_nombre"; }
  17. };
  18. defina una clase Piano que modele un instrumento de tipo "piano" con solo 7 teclas
  19. (do”, “re”, “mi”, “fa”, “sol”, “la” y “si” ) y 1 pedal. La clase piano debe tener métodos
  20. para:
  21. - apretar una tecla, indicando el numero de tecla, y que retorne la nota que debería
  22. sonar.
  23. - soltar una tecla, indicando el numero de tecla
  24. - presionar el pedal, indicando la presion que se aplica

Código que hice:
Código
  1. #include <iostream>
  2. using namespace std;
  3. class Tecla{
  4. string nota; int tecla;
  5. public:
  6. Tecla(string _t){
  7. nota=_t;
  8. }
  9. string Ver_nota(){
  10. return nota;
  11. }
  12. void Apretar(){
  13. tecla=1;
  14. }
  15. void Soltar(){
  16. tecla=0;
  17. }
  18. bool Esta_apretada(){
  19. if(tecla!=0){
  20. return true;
  21. }
  22. return false;
  23. }
  24.  
  25. };
  26. class Pedal{
  27. float presion;
  28. public:
  29. Pedal(){
  30. presion=0;
  31. }
  32. void Aumentar_presion(float _x){
  33. presion=_x;
  34. }
  35. void Disminuir_presion(float _x){
  36. presion=_x;
  37. }
  38. float Ver_presion(){
  39. return presion;
  40. }
  41. };
  42.  
  43. class Ver_Tipo{
  44. public:
  45. virtual string Ver_tipo(){
  46. return "sin nombre";
  47. }
  48. };
  49.  
  50. class Piano{
  51. Tecla *T[7]; Pedal P;
  52. public:
  53. string Apretar_una_tecla(int _nro){
  54. T[_nro]->Apretar();
  55. return T[_nro]->Ver_nota();
  56. }
  57. void Soltar_una_tecla(int _nro){
  58. T[_nro]->Soltar();
  59. }
  60. void Presionar(float _f){
  61. P.Aumentar_presion(_f);
  62. }
  63.  
  64. };
  65. int main(int argc, char *argv[]) {
  66. Tecla *T[7]; //No se como proseguir...
  67. T[0]=new Tecla ("Do");
  68. T[1]=new Tecla ("Re");
  69. T[2]=new Tecla ("Mi");
  70. T[3]=new Tecla ("Fa");
  71. T[4]=new Tecla ("Sol");
  72. T[5]=new Tecla ("La");
  73. T[6]=new Tecla ("Si");
  74. return 0;
  75. }

Volví a releer la teoría, para ver si podía entenderlo mejor, pero no le encuentro la vuelta sinceramente
30  Programación / Programación C/C++ / Re: No entiendo este error - Ayuda en: 24 Diciembre 2018, 16:54 pm
Define la(s) variable(s) fuera del switch o.bien
Define un bloque usando {} dentro del case donde vas a usar la(s) variable(s).


Gracias por la ayuda  ;D
Páginas: 1 2 [3] 4 5 6
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines