Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Error al usar operadores ternarios con goto (https://www.clubdelphi.com/foros/showthread.php?t=91866)

aguml 21-05-2017 11:48:53

Error al usar operadores ternarios con goto
 
Ya, se que de goto hay que salir corriendo pero una persona preguntaba como saber si un numero es capicuo o no y que no podia usar ni bucles ni condicionales, solo ternarios y lo hice con recursividad con funciones y me dijo que no puede usar funciones tampoco con lo que solo se me ocurrio el uso de goto para emular el mismo funcionamiento y quedó asi:
Código PHP:

#include <iostream.h>

using namespace std;

int main(int argccharargv[])
{
    
int num,aux,numInv=0,capicuo,resto;

    
cout << "Introduce un numero: ";
    
cin >> num;
    
aux=num;

    
InvertirNumero:
    
resto=aux%10;
    
numInv=numInv*10+resto;
    
aux/=10;
    
aux!=? goto InvertirNumero : goto Fin;

    
Fin:
    (
numInv-num==0) ? capicuo=capicuo=0;
    
capicuo==cout << "Es capicuo" cout << "No es capicuo";
    return 
0;


El problema que tengo es que en la parte de InvertirNumero uso operadores ternarios y dentro uso goto y no se lo traga diciendome que hay un error de sintaxis. ¿Alguien me explica como solucionar eso y por que da ese error?
Si lo pongo asi compila y funciona perfectamente pero me obliga a usar condicional y no se puede:
Código PHP:

#include <iostream.h>

using namespace std;

int main(int argccharargv[])
{
    
int num,aux,numInv=0,capicuo,resto;

    
cout << "Introduce un numero: ";
    
cin >> num;
    
aux=num;

    
InvertirNumero:
    
resto=aux%10;
    
numInv=numInv*10+resto;
    
aux/=10;
    if(
aux!=0) goto InvertirNumero; else goto Fin;

    
Fin:
    (
numInv-num==0) ? capicuo=capicuo=0;
    
capicuo==cout << "Es capicuo" cout << "No es capicuo";
    return 
0;



ecfisa 22-05-2017 00:57:11

Hola.

La sintáxis del operador condicional ternario es,
Cita:

expresion1 ? expresion2 : expresion3;
y de ninguna manera funcionará con goto, goto no es una expresión es una declaración. Por otro lado, el condicional ternario arroja el resultado de la operación, como por ejemplo:
Código PHP:

{
  
int a 57x;
  
  
= ( != ) ? a-- : b++;  // --a 
  // -> x = 4 

Pero, ¿ de que tipo es el resultado que debería esperar el compilador en la siguiente sentencia:
Código PHP:

{
  ??? =  (
aux! = 0) ? goto InvertirNumero : goto Fin

por todo lo anterior es que nos muestra el error "Expression sintax"

Además, veo otra dificultad mucho mas compleja y es que mencionas que no se puede usar bucles, pero de echo el uso de goto con un condicional y una etiqueta es un bucle...

Saludos :)

aguml 22-05-2017 07:09:29

Cuando digo bucles me refiero a for y while. ¿entonces es imposible que funcione con goto? ¿estoy obligado a usar funciones?

Ñuño Martínez 22-05-2017 09:39:10

Cita:

Empezado por aguml (Mensaje 516931)
Cuando digo bucles me refiero a for y while. ¿entonces es imposible que funcione con goto? ¿estoy obligado a usar funciones?

Me parece que hay que usar funciones recursivas o no hay manera. O usar bucles o "if" con "goto".

ecfisa 22-05-2017 18:12:51

Hola.
Cita:

Empezado por aguml (Mensaje 516931)
¿entonces es imposible que funcione con goto?

No no es imposible. Lo que no es posible es usar goto en un operador ternario, no hubo error cuando hiciste:
Código PHP:

  if(aux!=0
    goto 
InvertirNumero
  else 
   goto 
Fin

Cita:

Empezado por aguml (Mensaje 516931)
¿estoy obligado a usar funciones?

Si dejamos de lado que el cuerpo de un programa en C++ tambien es una función, otra vez la respuesta es negativa:
Código PHP:

#include <iostream>
#include <string>

int main()
{
  
int numero   10011001;
  
int nn       numero;
  
int inv      0r;
  
bool capicua false;

loop1:
  
nn 10;
  
inv inv 10 r;
  
nn /= 10;
  if ( 
nn ) goto loop1;

loop2:
  
capicua = ( inv 10 == numero 10 );
  
inv /= 10;
  
numero /= 10;
  if ( 
numero && capicua ) goto loop2;

  
std::string msg capicua "es capicua" "no es capicua";
  
std::cout << msg;

  
std::cin.get();
  return 
0;


Saludos :)

roman 23-05-2017 00:00:08

Pero en tu solución, ecfisa, usas condicionales los cuales, por quién sabe qué razón, no están permitidos para la resolución:

Cita:

Empezado por aguml
como saber si un numero es capicuo o no y que no podia usar ni bucles ni condicionales, solo ternarios

LineComment Saludos

ecfisa 23-05-2017 01:03:31

Cita:

Empezado por roman (Mensaje 516974)
Pero en tu solución, ecfisa, usas condicionales los cuales, por quién sabe qué razón, no están permitidos para la resolución:

Aunque el ejemplo fué a fin de demostrar que se podía hacer precindiendo del uso de funciónes auxiliares, es cierto :o... se me escapó ese "pequeño detalle" sin el cuál se me han quemado los papeles de como hacerlo :D


Saludos :)

aguml 23-05-2017 07:35:29

Ok muchas gracias a todos. He aprendido bastante con todo esto. Tengo otra duda, cout << "Es capicuo" no da error colocado cómo expresión usando ternarios. ¿es una expresión? Yo pensaba que era una sentencia.

ecfisa 23-05-2017 17:06:25

Hola.
Cita:

Empezado por aguml (Mensaje 516984)
Ok muchas gracias a todos. He aprendido bastante con todo esto. Tengo otra duda, cout << "Es capicuo" no da error colocado cómo expresión usando ternarios. ¿es una expresión? Yo pensaba que era una sentencia.

cout es un objeto global de la clase std::ofstream.

Saludos :)

roman 23-05-2017 18:29:33

Bueno pero, en resumen, ¿es posible la solución sin usar ciclos, condicionales ni funciones?

LineComment Saludos

ecfisa 23-05-2017 18:44:34

Cita:

Empezado por roman (Mensaje 517034)
Bueno pero, en resumen, ¿es posible la solución sin usar ciclos, condicionales ni funciones?

LineComment Saludos

No conozco la manera de lograrlo respetando esas restricciónes.

Saludos :)

ecfisa 31-05-2017 05:14:27

Hola.

Me estuvo dando vueltas el tema y, si no tomamos al operador ternario como un condicional, tengo que desdecirme del último mensaje por que lo pude lograr operando los términos como cadena:
Código PHP:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
  
string s "1234321";

  
transform(s.begin(), s.end(), s.begin(), toupper);
  
== string(s.rbegin(), s.rend()) ? cout << "capicua" cout << "no capicua";

  
cin.get();
  return 
0;


Pero... considero al operador ternario como un condicional, y por otro lado, es muy probable que las funciones miembros e iteradores implicados en el código hayan sido implementados con el uso de algún bucle.

Saludos :)

Ñuño Martínez 31-05-2017 09:32:18

Veo que mi C++ está oxidado (no lo uso desde antes del C99 así que calcula). ¿Puedes explicar esos métodos de cadena (begin, end, rbegin, rend) y ese transform?

roman 31-05-2017 16:35:57

Pues más allá de lo que signifiquen (*), no cabe duda de que string(s.rbegin(), s.rend()) lo que hace es invertir la cadena y, tal como el mismo ecfisa dice, me temo que éso sólo traslada el problema. A fin de cuentas bastaría definir una función reverse que devuelva la cadena invertida y usarla en el operador ternario. Pero no se pueden usar funciones y, a menos que la intención del profesor haya sido la de que los alumnos descubrieran ese iterador o alguna otra función de inversión, no creo que vaya por ahí la solución.

LineComment Saludos

---------------------
* Supongo que a esto: reverse iterator to reverse beginning

ecfisa 01-06-2017 06:50:19

Hola.

Si roman así es, también opino que se está acarreando el problema. No me caben dudas que en ese codigo existen bucles, funciones y condicionales aunque no se visualicen.
En el mensaje #2 ya había objetado esas restricciones tan singulares, por que apegándonos a la letra del enunciado:
  • Si no se puede usar funciones, no se puede realizar en C/C++. ( int main() {...} también es una función ).
  • Si no se pueden usar bucles, no se puede resolver usando for, while, do ni tampoco goto.
  • Si no se pueden usar condicionales, no se puede usar el operador ternario ( este último es un condicional con tres argumentos ).
Pero como cuando se hablaba de bucles sólo se excluía a for y while quedando goto dentro de lo permitido y cuando se excluía a if () se incluia al operador ternario... seguí buscándole la vuelta :)


Ñuño, básicamente,
  • string::begin() : devuelve un iterador al comienzo de la cadena normal.
  • string::end() : devuelve un iterador al final de la cadena normal.
  • string::rbegin() : devuelve un iterador al comienzo de la cadena inversa (el último caracter de la cadena normal).
  • string::rend() : devuelve un iterador al final de la cadena inversa ( el primer caracter de la cadena normal).
Un ejemplo:
Código PHP:

{
  
string str "Recorrer string con iterators.";

  
string::const_iterator ci;
  
string::reverse_iterator ri;

  
// recorrido normal de la cadena
  
for( ci str.begin(); ci != str.end(); ci++ ) cout << *ci;  
  
cout << endl;

  
// recorrido inverso de la cadena
  
for( ri str.rbegin(); ri != str.rend(); ri++ ) cout << *ri;  
  
cout << endl;
  
// O, con el mismo resultado anterior: 
  
cout << stringstr.rbegin(), str.rend() ); 
  
cout << endl;

  
// entonces si
  
ci str.begin();
  
ri str.rbegin();
  
cout << *ci << " " << *ri << endl;      // se muestra: R .

  // y si
  
ci str.end();
  
ri str.rend();
  
cout << *--ci << " " << *--ri << endl;  // se muestra: . R   (*)
... 

(*) --, por que los iteradores ci y ri están sobre '\0'

Aquí van unos enlaces que te van a ser mas útiles que mi pobre explicación:transform y toda esa linea no es necesaria para el caso de los números, lo había usado para pasar a mayúsculas en una de las pruebas que hice con cadenas. No lo borré y terminé copiándolo/pegándolo con el resto, disculpa el descuido :o el código debería haber quedado así:
Código PHP:

#include <iostream>
#include <string>

using namespace std;

int main()
{
  
string s "1234321";

  
== string(s.rbegin(), s.rend()) ? cout << "capicua" cout << "no capicua";

  
cin.get();
  return 
0;


Saludos :)

aguml 01-06-2017 08:50:31

Interesante. Se lo mostraré a ver que dice el profesor.

Ñuño Martínez 01-06-2017 09:44:39

Tengo muchas lecturas pendientes, pero creo que le voy a echar un tiento a este documento:
Cita:

Empezado por ecfisa (Mensaje 517495)

A ver quién tiene razón: los fanboys que dicen que el C++ de ahora es maravilloso o yo opinando que es la misma ... de siempre.

Casimiro Notevi 01-06-2017 10:13:21

Cita:

Empezado por Ñuño Martínez (Mensaje 517503)
Tengo muchas lecturas pendientes, pero creo que le voy a echar un tiento a este documento:

A ver quién tiene razón: los fanboys que dicen que el C++ de ahora es maravilloso o yo opinando que es la misma ... de siempre.

^\||/^\||/^\||/

roman 01-06-2017 16:47:43

Cita:

Empezado por ecfisa (Mensaje 517495)
Si roman así es, también opino que se está acarreando el problema. No me caben dudas que en ese codigo existen bucles, funciones y condicionales aunque no se visualicen.
En el mensaje #2 ya había objetado esas restricciones tan singulares, por que apegándonos a la letra del enunciado:
  • Si no se puede usar funciones, no se puede realizar en C/C++. ( int main() {...} también es una función ).
  • Si no se pueden usar bucles, no se puede resolver usando for, while, do ni tampoco goto.
  • Si no se pueden usar condicionales, no se puede usar el operador ternario ( este último es un condicional con tres argumentos ).
Pero como cuando se hablaba de bucles sólo se excluía a for y while quedando goto dentro de lo permitido y cuando se excluía a if () se incluia al operador ternario... seguí buscándole la vuelta :)

Creo que lo interesante aquí sería demostrar, si tal es el caso, que no es posible resolver el problema usando sólo goto y el operador ternario y sin funciones que impliquen recursividad o iteración interconstruida. Este operador, como dices, es un condicional, pero un condicional restringido, uno que no permite la bifurcación del flujo del código.

LineComment Saludos


La franja horaria es GMT +2. Ahora son las 00:00:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi