elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Árbol de Expresiones en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Árbol de Expresiones en C  (Leído 2,156 veces)
NericSain

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Árbol de Expresiones en C
« en: 28 Mayo 2018, 19:47 pm »

HOLA A TODOS ESOS BUENOS PROGRAMERS, hoy tengo una super urgencia, estoy construyendo un arbol de expresiones: (a+b) * c, algo parecido a lo anterior, pero ya llegue a un punto de inflexion, pues estoy siguiendo unos pasos que encontre en un libro, pero sigo sin entender como contruir ese arbol, mientras ocupo una pila y vaya guardando los nodos actuales que es en donde ire poniendo los operadores, pero la parte recursiva no la entiendo bien..... ayuda porfa vor
 


Código
  1. void giveMeExpression(char * input)
  2. {
  3. printf(">>> ");
  4. fflush(stdin);
  5. fgets(input,50,stdin);
  6. }
  7.  
  8. int haveARigth(ArbolBinario a)
  9. {
  10. return a->der == NULL;
  11. }
  12.  
  13. int haveALeft(ArbolBinario a)
  14. {
  15. return a->izq == NULL;
  16. }
  17.  
  18. int isOperator(char input)
  19. {
  20. char operators [] = "+-*/^%";
  21. int i;
  22. for(i = 0 ; i< strlen(operators) ; i++)
  23. {
  24. if (operators[i] == input)
  25. return 1;
  26. }
  27. return 0;
  28. }
  29.  
  30. void assignASon(ArbolBinario boy, ArbolBinario father)
  31. {
  32. if ( haveALeft(father))///si el padre no tiene izq, se le asigna.
  33. {
  34. /* code */
  35. father->izq = boy;
  36. }
  37. else
  38. {
  39. if ( haveARigth(father))///si el padre no tiene der, se le asigna.
  40. {
  41. /* code */
  42. father->der = boy;
  43. }
  44. }
  45. }
  46.  
  47. ArbolBinario creatNodeCurrent(Pila *p, int first, ArbolBinario currentNode)
  48. {
  49. ArbolBinario a;
  50. a = creaNodo('\0');
  51. if (first != 0)
  52. assignASon(a,currentNode);
  53. push(p,a);
  54. return a;
  55. }
  56.  
  57. int itIsParentheses(char  *input, int pos)
  58. {
  59. if( input[pos] == '(' )
  60. return 1;
  61. else
  62. return 0;
  63. }
  64.  
  65. ArbolBinario createArbol(char * input, Pila *p, int pos, ArbolBinario raiz, int primerParentesis)
  66. {
  67. ArbolBinario currentNode  = NULL;
  68. if(pos > strlen(input) - 1)
  69. {
  70. printf("no entra y se sale\n");
  71. printf("\ncurrentNode en funcion es: %p\n",currentNode );
  72. return raiz;
  73. }
  74. else
  75. {
  76. if (  itIsParentheses(input,pos) == 1 && primerParentesis == 0) // si es 1, entonces no sera el primer parentesis
  77. {
  78. /* code */
  79. raiz = creaNodo('\0');
  80. currentNode = raiz;
  81. push(p,currentNode);
  82. pos++;
  83. primerParentesis = 1;
  84. //currentNode->elemento = input[pos];
  85. //printf("\nnuevo Nodo: %p, %p\n", currentNode, raiz);
  86. printf("Entro al if 1, pos  despues : %d y currentNode es: %p\n", pos,currentNode);
  87. imprimePila(*p);
  88. return  createArbol(input,p,pos, currentNode, primerParentesis);
  89. }
  90. else
  91. {
  92. if( itIsParentheses(input,pos) == 1 )//////////caso 2
  93. {
  94. currentNode = creatNodeCurrent(p, pos,raiz);
  95. pos++;
  96. primerParentesis = 1;
  97. printf("Entro al  2if, pos  despues : %d y currentNode es: %p\n", pos, currentNode);
  98. return  createArbol(input,p,pos, currentNode, primerParentesis);
  99. }
  100. else
  101. {
  102. if ( isOperating(input,pos) ==1)/////////CASO 3
  103. {
  104. currentNode = creatNodeCurrent(p, pos,raiz);
  105. currentNode->elemento = input[pos] ;
  106. pos++;
  107. primerParentesis = 1;
  108. printf("Entro al 3if, pos  despues : %d, con elemento: %c y currentNode: %p\n", pos, currentNode->elemento, currentNode);
  109. imprimePila(*p);
  110. return  createArbol(input,p,pos, currentNode, primerParentesis);
  111. }
  112. else
  113. {
  114. if ( isOperator(input[pos]) == 1 )/////////CASO 4
  115. {
  116. currentNode =  pop(p);
  117. raiz->elemento = input[pos];
  118. pos++;
  119. primerParentesis = 1;
  120. printf("Entro al 4if, pos  despues : %d, con elemento: %c y current node es: %p\n", pos, currentNode->elemento, currentNode);
  121. imprimePila(*p);
  122. return  createArbol(input,p,pos, currentNode, primerParentesis);
  123. }
  124. }
  125. }
  126. }
  127. }
  128. }//////////FIN FUNCION
  129.  
  130.  


« Última modificación: 29 Mayo 2018, 18:30 pm por NericSain » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.348


Ver Perfil
Re: Árbol de Expresiones en C
« Respuesta #1 en: 29 Mayo 2018, 16:33 pm »

Ayer te respondi... era una respuesta larga, y cuando fuí a publicarla, él foro me había deslogado por inactividad... y al volver atrás, curiosamente no se recuperó el mensaje (supongo que porque antes tenía desactivado javascript, y en algún punto intermedio lo activé)... en fin me dió pereza rescribir todo de nuevo.

Hoy simplifico, y veo más necesario indicarte esto:
Si necesitas aprender a realizar árboles, cíñete a eso... y deja en paz (de momento, hasta que lo domines), el ejercicio.
Si en cambio necesitas realizar el ejercició, cíñete a eso y olvida de momento los árboles...
Lo que no va bien es que ni sepas de la herramienta ni sepas del materíal. Así no sabe uno que es lo más urgente responderte, porque ambas cosas a la vez resultará lioso.


Si quieres avanzar por un árbol, usa de ejemplo tu propia familia (que es algo que conoces y entiendes bien), basta con las iniciales... no te preocupes si no es binario, ese es un caso particular de los árboles, conviene primero aprender lo genérico...

Decide y aprende una sola cosa de cada vez, y cuando lo domines regresas a la otra cuestión. Así plantea ahora qué necesitas, qué te urge más aprender...

A veces los libros traen malos ejemplos, ejemplos más o menos complejos donde se da por hecho que el que lo lee (es el pecado capital más frecuente en los libros técnicos, y el pecado mortal, cuando se trata de las matemáticas, parece que solo escriben para otros matemáticos, si no visita wikipedia), ya tiene un conocimiento más o menos sólido de otras materias... en esos casos conviene remplazar el ejemplo, por algo que uno pueda resolver bien (entenderlo al margen de lo que trata de enseñar), es decir un ejemplo, no puede ser el objeto de estudio por sí mismo, por eso el nivel de dificultad debe elegirse bien, si no torpedea al que intenta ilustrarse con la ayuda de un libro.


En línea

NericSain

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Árbol de Expresiones en C
« Respuesta #2 en: 29 Mayo 2018, 18:28 pm »

Hola NEBIRE, en verdad agradezco tu tiempo para ponerle atención a mis dudas, y lastima wue el código no se haya subid, en fin, te agradezco también el apoyo, las palabras y consejos para mejorar y aprender más, te comento que ya hee, estado estudiando por mi cuenta y creo que voy por buen camino.
En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: Árbol de Expresiones en C
« Respuesta #3 en: 29 Mayo 2018, 20:06 pm »

La parte recursiva en un árbol n-ario va encaminada a la búsqueda de valores en los nodos. Tú puedes hacer un árbol y añadir nodos, algo sencillo, pero el problema es cuando requieres hacer una búsqueda en toda esa red de nodos. Existen diversos métodos para recorrerlos.

https://es.wikipedia.org/wiki/Recorrido_de_%C3%A1rboles

Ejemplo
Código
  1. #include <string>
  2. #include <vector>
  3. #include <iostream>
  4.  
  5. // nodo binario
  6. struct NODO {
  7.    std::string valor;
  8.    NODO * izquierdo;
  9.    NODO * derecho;
  10. };
  11.  
  12. // funcion recursiva
  13. int buscarValor(NODO *nodo, std::string valor)
  14. {
  15.    if (nodo != NULL) std::cout << "Valor nodo = " << nodo->valor << std::endl;
  16.  
  17.    if (nodo == NULL) {
  18.        std::cout << "Aqui ya no hay mas nodos!! " << std::endl;
  19.        return 0;
  20.    } else if (nodo->valor != valor) {
  21.        if (buscarValor(nodo->derecho, valor) == 0); // cuando llegamos al final de la rama
  22.        else return buscarValor(nodo->izquierdo, valor);
  23.    } else {
  24.        std::cout << "Encontrado!! " << std::endl;
  25.        return 1;
  26.    }
  27. }
  28.  
  29. int main(){
  30.  
  31.    NODO arbol;
  32.    NODO izquierdo, derecho;
  33.    NODO izquierdoIzquierdo, izquierdoDerecho;
  34.    NODO derechoIzquierdo, derechoDerecho;
  35.  
  36.    izquierdoIzquierdo.valor     = "El nodo mas a la izquierda";
  37.    izquierdoIzquierdo.derecho   = NULL; // Amputamos, o podamos
  38.    izquierdoIzquierdo.izquierdo = NULL;
  39.    izquierdoDerecho.valor     = "El nodo derecho del nodo de la izquierda de la raiz";
  40.    izquierdoDerecho.derecho   = NULL;
  41.    izquierdoDerecho.izquierdo = NULL;
  42.  
  43.    derechoIzquierdo.valor     = "El nodo izquierdo del nodo de la derecha de la raiz";
  44.    derechoIzquierdo.derecho   = NULL;
  45.    derechoIzquierdo.izquierdo = NULL;
  46.    derechoDerecho.valor     = "El nodo mas a la derecha";
  47.    derechoDerecho.izquierdo = NULL;
  48.    derechoDerecho.derecho   = NULL;
  49.  
  50.    izquierdo.valor     = "El nodo izquierdo";
  51.    izquierdo.izquierdo = &izquierdoIzquierdo;
  52.    izquierdo.derecho   = &izquierdoDerecho;
  53.    derecho.valor     = "nodo derecho";
  54.    derecho.izquierdo = &derechoIzquierdo;
  55.    derecho.derecho   = &derechoDerecho;
  56.  
  57.    arbol.valor     = "raiz o principal";
  58.    arbol.izquierdo = &izquierdo;
  59.    arbol.derecho   = &derecho;
  60.  
  61.    std::cout << "El nodo derecho de la raiz contiene : " << arbol.derecho->valor << std::endl;
  62.  
  63.    // busqueda recursiva
  64.    buscarValor( &arbol, "El nodo mas a la izquierda");
  65.  
  66.    system("PAUSE");
  67.    return 0;
  68. }

PD ¿Por qué cojones lo centrará?
« Última modificación: 29 Mayo 2018, 22:44 pm por srWhiteSkull » En línea

NericSain

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Árbol de Expresiones en C
« Respuesta #4 en: 30 Mayo 2018, 00:23 am »

Muchas gracias por la ayuda srWhiteSkull
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Expresiones regulares
Programación Visual Basic
chrominum 1 2,319 Último mensaje 30 Enero 2008, 23:09 pm
por LeandroA
Expresiones Regulares + Php wtf!
PHP
Shell Root 4 4,462 Último mensaje 29 Marzo 2010, 01:24 am
por Castg!
expresiones Regulares
.NET (C#, VB.NET, ASP)
Choclito 3 5,603 Último mensaje 1 Mayo 2010, 05:09 am
por raul338
Ayuda con expresiones c++
Programación C/C++
l-e-s-t-a-t 4 2,066 Último mensaje 26 Mayo 2010, 00:11 am
por l-e-s-t-a-t
Arbol de expresiones (programación responsable)
Programación General
jotacool 0 1,514 Último mensaje 19 Marzo 2016, 03:28 am
por jotacool
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines