Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Onigiri en 26 Abril 2013, 09:00 am



Título: Error con Operadores ternarios ?
Publicado por: Onigiri en 26 Abril 2013, 09:00 am
Hola;
pues estoy practicando con operador ternario.
Y pues aún no logro descubrir cuales son mis errores.

Código
  1. #include <iostream.h>
  2. #include <conio.h>
  3. #define Td 500
  4. #define Tn 800
  5.  
  6. main()
  7. {  char t;
  8. int  d,j,h;
  9.  
  10.      cout<<"\nIngresar Dia de Trabajo (1=Lunes; 2=Martes(..)) : "; cin>>d;
  11.  
  12.      do
  13.      {
  14.         cout<<"\nIngresar Turno (d/n) = "; cin>>t;
  15.         cout<<"\nIngresar Horas de trabajo = "; cin>>h;
  16.  
  17.         j = ((d!=7&&t=='d') ? (h*Td) : (d==7&&t=='d') ? (h*(200+Td)) : (d!=7&&t=='n') ? (h*Tn) : (h*(300+Tn)); )
  18.  
  19.         cout<<"Jornal = "<<j;
  20.      } while (d<0||d>7);
  21.  
  22.   getch();
  23.  
  24. }


Son las 3:00 A.M quizas es una tonteria pero de verdad no logro descubrir donde están mis errores.
//edit; no copie todo el codigo


Título: Re: Error con Operadores ternarios ?
Publicado por: diskontrol en 26 Abril 2013, 11:09 am
A simple vista eso no debe ni compilar... si eso es lo que te falla revisa los errores que te da el compilador

Si no te refieres a errores de compilación indica al menos que pretendes hacer :-)


Título: Re: Error con Operadores ternarios ?
Publicado por: x64core en 26 Abril 2013, 11:38 am

http://en.wikipedia.org/wiki/%3F:

Para comprenderlo.


Título: Re: Error con Operadores ternarios ?
Publicado por: Onigiri en 26 Abril 2013, 14:07 pm
El problema dice ésto.
Código
  1.      Los empleados de una fabrica trabajan en dos turnos, diurno y nocturno.
  2.             Se desea calcular el jornal diario de acuerdo con los siguientes puntos:
  3.              a) la tarifa de las horas diurnas es de 500 pesetas,
  4. b) la tarifa de las horas nocturnas es de 800 pesetas,
  5. c) caso de ser domingo, la tarifa se incrementara en 200 pesetas
  6.                     el turno diurno y 300 pesetas el turno nocturno.
  7.  
  8.  
  9.  
  10.  
  11.  


Si @x64Core ;
Y lo hago asi como esta.

Los errores que me salen son los siguientes por eso no encuentro el error.

Código
  1. Statement missing ;
(normalmente las condiciones else deben terminar en   ;
pero al ponerlas en casi todos los else me aparece Expression syntax, ahora solo le pongo en el último pero me aparece el statement missing)

Código
  1. 'j' is assigned a value that is never used
(esta si, no se porque si le he asumido j como valor int)





Título: Re: Error con Operadores ternarios ?
Publicado por: diskontrol en 26 Abril 2013, 14:31 pm

Código
  1. Statement missing ;
(normalmente las condiciones else deben terminar en   ;
pero al ponerlas en casi todos los else me aparece expression syntax, ahora solo le pongo en el último pero me aparece el statement missing)


No estás usando elses...

te lo dejo más o menos funcional para que compares, aunque ahora que lo has editado está prácticamente bien

Código
  1. #include <iostream>
  2. #define Td 500
  3. #define Tn 800
  4.  
  5. int main () {
  6.  char t;
  7.  int d, h;
  8.  
  9.  std::cout << "\nIngresar Dia de Trabajo (1=Lunes; 2=Martes(..)) : ";
  10.  std::cin >> d;
  11.  
  12.  do
  13.    {
  14.      std::cout << "\nIngresar Turno (d/n) = ";
  15.      std::cin >> t;
  16.      std::cout << "\nIngresar Horas de trabajo = ";
  17.      std::cin >> h;
  18.  
  19.      std::
  20. cout << "Jornal = " << ((d != 7 && t == 'd') ? (h * Td) : (d == 7 && t == 'd') ? (h * (200 + Td)) : (d != 7 && t == 'n') ? (h * Tn) : (h * (300 + Tn))) << std::endl;
  21.  
  22.    }
  23.  while (d < 0 || d > 7);
  24.  return 0;
  25. }
  26.  


Y revisa el do-while, no creo que haga lo que pretendes.

Saludos!


Título: Re: Error con Operadores ternarios ?
Publicado por: Onigiri en 26 Abril 2013, 15:17 pm
Gracias por estar ayudandome diskontrol
tristemente me da un monton de errores (uso borland 5.03)

Lo edite un poco hasta esto;
pero igual siguen saliendo errores

Código
  1. #include <iostream>
  2.    #define Td 500
  3.    #define Tn 800
  4.  
  5.    int main ()
  6.    {
  7.     char t;
  8.     int d, h;
  9.  
  10.     cout << "\nIngresar Dia de Trabajo (1=Lunes; 2=Martes(..)) : ";
  11.     cin >> d;
  12.  
  13.     do
  14.       {
  15.         cout << "\nIngresar Turno (d/n) = ";
  16.         cin >> t;
  17.         cout << "\nIngresar Horas de trabajo = ";
  18.         cin >> h;
  19.  
  20.         cout << "Jornal = "<< ((d != 7 && t == 'd') ? (h * Td) : (d == 7 && t == 'd') ? (h * (200 + Td)) : (d != 7 && t == 'n') ? (h * Tn) : (h * (300 + Tn)))
  21.  
  22.       } while(d<0);
  23.  
  24.     }
  25.  


Lo errores que me da son:

Código
  1. Statement missing ;
y me marca lo que hay en el while.
Código
  1. Code has no effect
me marca lo mismo.
Código
  1. Do statement must have while
me marca el ultimo corchete
Código
  1. Compound statement missing {


Título: Re: Error con Operadores ternarios ?
Publicado por: rir3760 en 26 Abril 2013, 15:47 pm
* Cambia de compilador. Para recomendaciones utiliza el motor de búsqueda de los foros.

* Cuando utilizas el espacio de nombres estándar (std) debes indicarlo o, en el peor de los casos, utilizar la sentencia:
Código
  1. using namespace::std;
Antes de cualquier uso.

* En el calculo del jornal te falta el ';' para indicar el final de esa sentencia.

* La condición del bucle esta mal, esta es:
Código
  1. while (d < 0);
En buen cristiano se traduce a "mientras el día sea menor que cero". Debes cambiarlo para que se ejecute mientras el día sea valido (mayor o igual a 1 y menor o igual a 7):
Código
  1. while (d >= 1 && dia <= 7);

Un saludo


Título: Re: Error con Operadores ternarios ?
Publicado por: Onigiri en 26 Abril 2013, 17:06 pm
Gracias por responder!;
la cuestion es que pese a las modificaciones aun no he podido hacer que funcione.

Por cierto el " ; " siempre va en la úlmo lugar cierto?
o sea solo aqui

Código
  1. cout<<"Jornal = "<<((d!=7&&t =='d')?(h*Td):(d==7&&t=='d')?(h*(200+Td)):(d!=7&&t=='n')?(h*Tn):(h*(300 + Tn))    :huh:  ;  :huh: )

Estoy practicando estas operaciones
porque quiero aprenderlas.
Tengo un folleto pero solo explica en condiciones cortas como:
Código
  1. a = (b>a ? 2.0 : 12;)

Por eso aun no estoy segura de aquello


Título: Re: Error con Operadores ternarios ?
Publicado por: rir3760 en 27 Abril 2013, 02:40 am
la cuestion es que pese a las modificaciones aun no he podido hacer que funcione.
Cuando eso suceda publica el código fuente completo y actualizado, si no lo haces no es posible solucionar el problema.

Por cierto el " ; " siempre va en la úlmo lugar cierto?
Correcto. El carácter ';' indica el final de una sentencia en los lenguajes C y C++.

En cuanto al programa con los cambios que te indique funciona correctamente:
Código
  1. #include <iostream>
  2. using namespace::std;
  3.  
  4. #define Td 500
  5. #define Tn 800
  6.  
  7. int main()
  8. {
  9.   char t;
  10.   char cont;
  11.   int d, h;
  12.  
  13.   do {
  14.      cout << "Ingresar Dia de Trabajo (1=Lunes; 2=Martes(..)) : ";
  15.      cin >> d;
  16.  
  17.      cout << "Ingresar Turno (d/n) = ";
  18.      cin >> t;
  19.  
  20.      cout << "Ingresar Horas de trabajo = ";
  21.      cin >> h;
  22.  
  23.      cout << "Jornal = " << ((d != 7 && t == 'd') ? (h * Td) : (d == 7 && t == 'd') ? (h * (200 + Td)) : (d != 7 && t == 'n') ? (h * Tn) : (h * (300 + Tn)));
  24.      cout << endl << endl;
  25.  
  26.      cout << "Continuar? (S/N)";
  27.      cin >> cont;
  28.   }while (cont == 's' || cont == 'S');
  29.  
  30.   return 0;
  31. }

De nuevo si continúan los problemas debes indicar cuales son.

Un saludo


Título: Re: Error con Operadores ternarios ?
Publicado por: Luz Violeta en 27 Abril 2013, 14:28 pm
1) Cambiame iostream.h por iostream (como corresponde)
2) Evitá conio como la plaga.
3) Siempre posteá la salida del compilador. Ejemplo:

Código:
% clang++ code.cxx
In file included from code.cxx:1:
In file included from /usr/include/c++/4.2/backward/iostream.h:31:
/usr/include/c++/4.2/backward/backward_warning.h:32:2: warning: This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++
      standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
      [-W#warnings]
#warning This file includes at least one deprecated or antiquated header. \
 ^
code.cxx:5:5: error: C++ requires a type specifier for all declarations
    main()
    ^~~~
code.cxx:16:115: error: expected ')'
             j = ((d!=7&&t=='d') ? (h*Td) : (d==7&&t=='d') ? (h*(200+Td)) : (d!=7&&t=='n') ? (h*Tn) : (h*(300+Tn)); )
                                                                                                                  ^
code.cxx:16:18: note: to match this '('
             j = ((d!=7&&t=='d') ? (h*Td) : (d==7&&t=='d') ? (h*(200+Td)) : (d!=7&&t=='n') ? (h*Tn) : (h*(300+Tn)); )
                 ^
code.cxx:16:117: error: expected expression
             j = ((d!=7&&t=='d') ? (h*Td) : (d==7&&t=='d') ? (h*(200+Td)) : (d!=7&&t=='n') ? (h*Tn) : (h*(300+Tn)); )
                                                                                                                    ^
1 warning and 3 errors generated.

4) No abusar el "using namespace", usar "using" o mejor usarlo en un ámbito local ... para algo están los namespaces, piensen un poco // en este caso se perdona, es un código de un ejercicio chiquitito.
5) No anides operadores ternarios de esa manera tan horrenda ...expandí de esta manera:

Código:
(condition) ? (if_true) : (if_false)


if (condition)
    if_true;
else
    if_false;
// [etc]


Saludos.