Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: G+10 en 31 de Julio de 2008, 05:06:25 PM

Título: reverse
Publicado por: G+10 en 31 de Julio de 2008, 05:06:25 PM
Bueno estoy haciendo ejercicios, en uno me pedia que aga que la palabra de una linea se vea al revez entonces yo lo hice así:



#include <stdio.h>
main ()
{
 int i,c,a;
char c1[50];

i=c=a=0;

for (i=0;i<50 && (c=getchar())!='\n';++i)  {
 c1[i]=c;
 c1[i]='\0';

}

i=0;

while (c1[i]!='\0')
 ++i;

for (a=i;a>0;--a)

 printf ("%c",c1[a]);

 return 0;

}

;

Pero a la hora de probarlo y escribo diego, me da vuelta  y me sale ogei
cual puede ser el error?.
Título: reverse
Publicado por: G+10 en 31 de Julio de 2008, 07:33:55 PM
no gracias, ya encontre la respuesta era el signo > lo tenia que cambiar por >=
Título: reverse
Publicado por: G+10 en 31 de Julio de 2008, 09:43:01 PM
jojojo pero eso todavia no di
Título: reverse
Publicado por: Pogacha en 31 de Julio de 2008, 10:35:28 PM
Cita de: "Gorkin"Y otra sin usar la STL con solo recursividad:

#include <stdio.h>
#include <conio.h>

void alreves (void) {
   char c = (char) getchar();
   if(c != '\n') {
       alreves();
       printf("%c", c);
   } else {
       printf("La cadena al revés es: ");
   }
}

int main (void) {
   printf("Mete una cadena: ");
   alreves();
   printf("\n");
}

Curiosa forma de gastar pila a lo chancho!
Además, la recursividad se entiende recién una vez que has entendido la recursividad.

Mi versión:

#include <stdio.h>
main ()
{
 int i;
 char c; // c es un char si bien getchar devuelve un int no podras poner mas que un char en cadena.
 char cadena[50]; // no te cuesta nada utilizar nombres largos que te digan algo de la variable.

 for (i=0;i<50 && (c=getchar())!='\n';++i)  cadena[i]=c;
 // cadena[i]='\0';  // esto no es necesario en este ejemplo pues al salir del bucle i me dice el largo de la cadena y esta no es utlizada como cadena terminada en null sino como un array de chars

 while(i--) printf ("%c",cadena[i]);
// se fija si i es 0 y sino lo decrementa, al salir del bucle estabamos un caracter encima del ultimo de la cadena.
 return 0;
}
Título: reverse
Publicado por: Pogacha en 01 de Agosto de 2008, 03:49:06 AM
OK, pero mi idea no era ofuscarlo sino escribirlo de manera optima, maximo entendimiento, minima cantidad de codigo, sub-optimo rendimiento.
Asi es como lo escribiria en una rutina mia y la idea era para ayudar a G+10 en su aprendisaje.

Lo que si apunta el #define TAM 100, eso es muy util y yo me lo comi cuando deberia haberlo puesto.

Me hizo acordar a un concurso que hubo hace un tiempo ...
#include <stdio.h>
i,main(){char c[99];for(i=0;i<99&&(c[i]=getchar())!=13;++i);while(i--)putchar(c[i]);return 0;}
Título: reverse
Publicado por: Prompt en 01 de Agosto de 2008, 09:36:47 AM
STL de gorkin +1

:) Saludos
Título: reverse
Publicado por: Vicente en 01 de Agosto de 2008, 10:36:21 AM
Todos a usar XOR para dar la vuelta a la cadena leches :p
Título: reverse
Publicado por: tamat en 01 de Agosto de 2008, 12:23:43 PM
Cita de: "Vicente"Todos a usar XOR para dar la vuelta a la cadena leches :p
Tuvo que venir el abuelo a contarnos batallitas...
Título: reverse
Publicado por: davur en 01 de Agosto de 2008, 07:10:12 PM
Si somos idiomáticos, que sea hasta el final:

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

int main()
{
std::string s;
std::getline(std::cin, s);
std::string rs(s.rbegin(), s.rend());

std::cout << rs << "\n";
}
Título: reverse
Publicado por: Zaelsius en 01 de Agosto de 2008, 07:30:25 PM
 std::cout << rs << endl;

:wink:
Título: reverse
Publicado por: davur en 01 de Agosto de 2008, 08:35:02 PM
Cita de: "ZaelSiuS"  std::cout << rs << endl;

:wink:

Ha sido totalmente intencionado, porque en este caso utilizar std::endl es más por estética que por funcionalidad (el flush implícito del stream ocurre de todas maneras al finalizar la ejecución del programa). Y aún así, de cometer el abuso y utilizar std::endl, sería necesario incluir <ostream>.
Título: reverse
Publicado por: Zaelsius en 01 de Agosto de 2008, 08:54:53 PM
En mi máquina con GCC 4.01 compila sin el <ostream>.. aunque se me olvidó anteponer el std:: a endl. Es más, me compila incluyendo únicamente <iostream>.

#include <iostream>

int main()
{
  std::string s;
  std::getline(std::cin, s);
  std::string rs(s.rbegin(), s.rend());
   
  std::cout << rs << std::endl;

  //zOMG! faltaba esto para que no nos suspendiese el profe de Programación I !!!111
  return 0;
}

(http://www.thehuntinglife.com/forums/style_emoticons/default/rocker.gif)
Estamos enfermos.
Título: reverse
Publicado por: davur en 01 de Agosto de 2008, 09:03:32 PM
Es que compila en todas las implementaciones existentes en la actualidad de la librería estándar al incluir <iostream>, porque en todas ellas este fichero indirectamente incluye <ostream>. Según el estándar de C++ (17.4.4.1/2), "a C++ header may include other C++ headers". Pero lo ideal es no escribir código que dependa de este aspecto específico de cada implementación (porque si la implementación cambia...), y en este caso, el estándar explicita que std::endl está definido en <ostream>.

El return 0; no es necesario porque es implícito.

(Perdón por la pedantería, pero creo que estos temas son muy interesantes).
Título: reverse
Publicado por: ethernet en 01 de Agosto de 2008, 09:56:37 PM
Si hacemos las cosas bien:

>>> raw_input()[::-1]
123456789
'987654321'
Título: reverse
Publicado por: Zaelsius en 01 de Agosto de 2008, 10:57:05 PM
Eso ha sido un auténtico  pythowned (http://i128.photobucket.com/albums/p187/Hol_GER/Pythowned.gif)

@Davur: Tiene sentido lo que dices, tampoco conocía lo del return 0 implícito.
Título: reverse
Publicado por: davur en 02 de Agosto de 2008, 09:33:50 AM
En Scheme:

(reverse-string (read-line))
Título: reverse
Publicado por: ethernet en 02 de Agosto de 2008, 11:09:56 AM
Ya solo falta lisp y haskell y ponemos la guinda al post
Título: reverse
Publicado por: AK47 en 02 de Agosto de 2008, 11:24:15 AM
Como se nota que no tenéis visión empresarial: estas cosas las hace el becario, joder! XD
Título: reverse
Publicado por: Mars Attacks en 02 de Agosto de 2008, 05:49:37 PM
En el lenguaje de programación "Do it by yourself":
Imprime("Por favor, introduce la cadena en orden inverso");
LeeCadena(Cadena);
Imprime(Cadena);

Lalala.
Título: reverse
Publicado por: Mars Attacks en 02 de Agosto de 2008, 09:39:30 PM
¿De dónde has sacado lo de que sea implícito? (Pura curiosidad)
Título: reverse
Publicado por: davur en 02 de Agosto de 2008, 10:58:07 PM
Cita de: "Mars Attacks"¿De dónde has sacado lo de que sea implícito? (Pura curiosidad)

Del estándar, sección 3.6.1/5:

"A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing return 0;".
Título: reverse
Publicado por: Mars Attacks en 03 de Agosto de 2008, 12:08:52 AM
Estupendo, gracias :)