Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





reverse

Iniciado por G+10, 31 de Julio de 2008, 05:06:25 PM

« anterior - próximo »

G+10

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?.
ual es el colmo de un puntero?? que sea de argentina jaja

G+10

no gracias, ya encontre la respuesta era el signo > lo tenia que cambiar por >=
ual es el colmo de un puntero?? que sea de argentina jaja

G+10

jojojo pero eso todavia no di
ual es el colmo de un puntero?? que sea de argentina jaja

Pogacha

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;
}

Pogacha

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;}

Prompt

STL de gorkin +1

:) Saludos

Vicente

Todos a usar XOR para dar la vuelta a la cadena leches :p

tamat

Cita de: "Vicente"Todos a usar XOR para dar la vuelta a la cadena leches :p
Tuvo que venir el abuelo a contarnos batallitas...
Por un stratos menos tenso

davur

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";
}

Zaelsius

 std::cout << rs << endl;

:wink:

davur

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>.

Zaelsius

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;
}


Estamos enfermos.

davur

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).

ethernet

Si hacemos las cosas bien:

>>> raw_input()[::-1]
123456789
'987654321'

Zaelsius

Eso ha sido un auténtico pythowned

@Davur: Tiene sentido lo que dices, tampoco conocía lo del return 0 implícito.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.