Duda con programa que imprime palabra al reves

Iniciado por Blaster, 1 Julio 2013, 19:35 PM

0 Miembros y 1 Visitante están viendo este tema.

Blaster

Buenas!!

Alguien podria ayudarme a compreder este codigo se trata de un programa que imprime una
palabra ingresada al reves

#include<stdio.h>
#include<ctype.h>

int g( int n )
{
    int c, d = !EOF;
    while( d != EOF && (c = getchar()) != '\n' && c != EOF )
    {
       if(!isspace( c ) )
       {
          d = g( n+1 );
          putchar( c );
       }
       else d = c;
       if( n > 0 )
        return d;

       if(isspace( d ) ) putchar( d );
    }
    return EOF;
}

int main( void )
{
    g( 0 );
    putchar('\n');

    return 0;
}


Gracias  :)

engel lex

a "comprender"? XD pero todo está ahí... si no sobes que hacen las funciones, la ventaja de las etiquetas queshi es que si haces click en una funcion que posteaste, te abren un link a su definicion :P

por cierto EOF = End Of File

explica puntualmente que no comprendes...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Blaster

Especificamnete en esta linea como funciona eso

d = g( n+1 );

Saludos

engel lex

esa pregunta es mucho mejor :P

es una función autorecursiva... es decir, se llama a si misma y su código se corre como si hubiera llamado cualquier otra función y luego le ingresa el valor a d... por eso se maneja con EOF... para controlar el flujo de llamarse a si misma y que no sea infinito... te recomiendo usar el debugger del sistema que uses para compilar para que veas paso a paso como se mueve... eso creo que te explicaría más dudas que yo :P

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Blaster

Lo he seguido con gdb, lo que logre entender es que los caracteres se van almacenando en la
pila verdad y luego los recupero pero esta vez al reves, aun me que una duda con los return

Para que sirve este exactamente

return d;

Y el otro

return EOF;

Saludos  :rolleyes:

engel lex

return es la palabra reservada para que una funcion retorne un valor, al llegar a esta palabra la funcion se detiene sin importar si termino o no...


como g es de tiempo int, debe retornar un entero (como EOF o d)

ejemplo

Código (cpp) [Seleccionar]

#include <iostream>
#include <Windows.h>
using namespace std;
int main(){
int a = 1;
if(a==2){
    return 0;
}
cout << "a es diferente de 2, y vale: "<< a << endl;
system("pause");
return 0;
}


mira ese codigo... si a es diferente de 2, llegará hasta el final... si a es 2 el return obligará al programa a salir de la funcion "main" y como es unica, el programa finalizará..
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

SrCooper

Yo te dejo una pequeña versión que escribí hace tiempo en C++, por si te interesa o a alguien le sirve de algo ;D

Código (cpp) [Seleccionar]

#include <iostream>
#include <vector>
using namespace std;

void escribe(vector<char>& a){
  for (int i = 0; i < a.size(); i++){
    cout << a[i];
  }
  cout << endl;
}

int main(){
  string palabra;
  vector<char> espejo;
  cin >> palabra;
  int tam = palabra.size();
  string::reverse_iterator it = palabra.rbegin();
  for (; it != palabra.rend(); it++){
    espejo.push_back(*it);
  }
  escribe(espejo);
 
}


Un saludo