Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-05-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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;


Última edición por aguml fecha: 21-05-2017 a las 12:56:02.
Responder Con Cita
  #2  
Antiguo 22-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 22-05-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Cuando digo bucles me refiero a for y while. ¿entonces es imposible que funcione con goto? ¿estoy obligado a usar funciones?
Responder Con Cita
  #4  
Antiguo 22-05-2017
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
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".
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #5  
Antiguo 22-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por aguml Ver Mensaje
¿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 Ver Mensaje
¿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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 22-05-2017 a las 21:35:15.
Responder Con Cita
  #6  
Antiguo 23-05-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 23-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por roman Ver Mensaje
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 ... se me escapó ese "pequeño detalle" sin el cuál se me han quemado los papeles de como hacerlo


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 23-05-2017 a las 07:10:21.
Responder Con Cita
  #8  
Antiguo 23-05-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 23-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por aguml Ver Mensaje
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 23-05-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Bueno pero, en resumen, ¿es posible la solución sin usar ciclos, condicionales ni funciones?

LineComment Saludos
Responder Con Cita
  #11  
Antiguo 23-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por roman Ver Mensaje
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #12  
Antiguo 31-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #13  
Antiguo 31-05-2017
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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?
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 31-05-2017 a las 10:44:34.
Responder Con Cita
  #14  
Antiguo 31-05-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #15  
Antiguo 01-06-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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 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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #16  
Antiguo 01-06-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Interesante. Se lo mostraré a ver que dice el profesor.
Responder Con Cita
  #17  
Antiguo 01-06-2017
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #18  
Antiguo 01-06-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Ñuño Martínez Ver Mensaje
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.
Responder Con Cita
  #19  
Antiguo 01-06-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por ecfisa Ver Mensaje
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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Cual es la diferencia entre Find Key y Goto Key? Jere_84 Varios 5 09-04-2012 19:32:52
Como usar los operadores logicos con los IF ctronx Varios 4 16-02-2012 20:13:01
Error con goto en excel. Gaim2205 Servers 0 19-03-2009 00:47:19
Error de goto afuera mjjj Varios 2 28-07-2008 22:35:30
sobrecarga de operadores zuriel_zrf Varios 1 11-09-2003 14:08:36


La franja horaria es GMT +2. Ahora son las 23:30:58.


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
Copyright 1996-2007 Club Delphi