Ayuda C++ (Heap dinámico)
Hola chicos/as; necesito urgentemente para antes del día 11 cómo se hace un heap (árbol) dinámico; es para ordenar una lista que posee distintos campos. El comando se utilizará de la siguiente forma:
Order <campo> <tipoOrdenacion>
El tipoOrdenacion será ascendente o descendente.
Espero que alguien pueda ayudarme.
Besitos.
Order <campo> <tipoOrdenacion>
El tipoOrdenacion será ascendente o descendente.
Espero que alguien pueda ayudarme.
Besitos.
Bueno Ludi, comoesto de los foros no se trata de resolver tareas sino más bien de ayudarnos con las dudas te paso un ejemplo que viene en libro "El Lenguaje de Programación C" de los autores Brian W. Kernighan y Dennis M. Ritchie (este último creador del lenguaje C), en la sección 6.5. El programa lee del teclado (o de un archivo, pasándole este en la línea de comandos redireccionándolo) una lista de palabras y las va contando. Al final las imprime en orden alfabético con un número indicando cuántas veces se repitieron. Para hacer esto usan un árbol binario creado dinámicamente en memoria. Puedes modificarlo para que haga lo que tu quieres. La dificultad para hacer esto depende de qué tantos conocimientos tengas del lenguaje. Necesitas tener conocimiento de cómo se manejan las estructuras, los apuntadores, los bucles y comprender las funciones recursivas. Si tienes alguna duda me puedes escribir a mi correo o en este foro. Suerte
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#include <malloc.h>
struct tnode { // el nodo del árbol
char *word; // apunta hacia el texto
int count; // número de ocurrencias
struct tnode *left; // hijo a la izquierda
struct tnode *right; // hijo a la derecha
};
#define MAXWORD 100
#define ENDOFFILE '_'
struct tnode *addtree (struct tnode *p, char *w);
void treeprint (struct tnode *p);
int getword (char *word, int lim);
struct tnode *talloc (void);
char *strdup (char *s);
// conteo de frecuencia de palabras
main ()
{
struct tnode *root;
char word[MAXWORD];
root = NULL;
while (getword (word, MAXWORD) != ENDOFFILE)
if (isalpha (word[0]))
root = addtree (root, word);
treeprint (root);
return 0;
}
// agrega un nodo con w, en o bajo p
struct tnode *addtree (struct tnode *p, char *w)
{
int cond;
if (p == NULL) { // llegó una nueva palabra
p = talloc (); // crea un nuevo nodo
p->word = strdup (w);
p->count = 1;
p->left = p->right = NULL;
} else if ((cond = strcmp (w, p->word)) == 0)
p->count++; // palabra repetida
else if (cond < 0) // menor que el contenido del subárbol izquierdo
p->left = addtree (p->left, w);
else // mayor que el contenido del subárbol derecho
p->right = addtree (p->right, w);
return p;
}
// impresión del arbol p en orden
void treeprint (struct tnode *p)
{
if (p != NULL) {
treeprint (p->left);
printf ("%4d %sn", p->count, p->word);
treeprint (p->right);
}
}
// obtiene la siguiente palabra o caracter de la entrada
int getword (char *word, int lim)
{
int c;
char *w = word;
while (isspace (c = getchar ()))
;
if (c != ENDOFFILE)
*w++ = c;
if (!isalpha (c)) {
*w = ' ';
return c;
}
for ( ; --lim > 0; w++)
if (!isalnum (*w = getchar ())) {
ungetch (*w);
break;
}
*w = ' ';
return word[0];
}
// crea un tnode
struct tnode *talloc (void)
{
return (struct tnode *)malloc (sizeof (struct tnode));
}
char *strdup (char *s) // crea un duplicado de s
{
char *p;
p = (char *)malloc (strlen (s) + 1); // +1 para ' '
if (p != NULL)
strcpy (p, s);
return p;
}
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#include <malloc.h>
struct tnode { // el nodo del árbol
char *word; // apunta hacia el texto
int count; // número de ocurrencias
struct tnode *left; // hijo a la izquierda
struct tnode *right; // hijo a la derecha
};
#define MAXWORD 100
#define ENDOFFILE '_'
struct tnode *addtree (struct tnode *p, char *w);
void treeprint (struct tnode *p);
int getword (char *word, int lim);
struct tnode *talloc (void);
char *strdup (char *s);
// conteo de frecuencia de palabras
main ()
{
struct tnode *root;
char word[MAXWORD];
root = NULL;
while (getword (word, MAXWORD) != ENDOFFILE)
if (isalpha (word[0]))
root = addtree (root, word);
treeprint (root);
return 0;
}
// agrega un nodo con w, en o bajo p
struct tnode *addtree (struct tnode *p, char *w)
{
int cond;
if (p == NULL) { // llegó una nueva palabra
p = talloc (); // crea un nuevo nodo
p->word = strdup (w);
p->count = 1;
p->left = p->right = NULL;
} else if ((cond = strcmp (w, p->word)) == 0)
p->count++; // palabra repetida
else if (cond < 0) // menor que el contenido del subárbol izquierdo
p->left = addtree (p->left, w);
else // mayor que el contenido del subárbol derecho
p->right = addtree (p->right, w);
return p;
}
// impresión del arbol p en orden
void treeprint (struct tnode *p)
{
if (p != NULL) {
treeprint (p->left);
printf ("%4d %sn", p->count, p->word);
treeprint (p->right);
}
}
// obtiene la siguiente palabra o caracter de la entrada
int getword (char *word, int lim)
{
int c;
char *w = word;
while (isspace (c = getchar ()))
;
if (c != ENDOFFILE)
*w++ = c;
if (!isalpha (c)) {
*w = ' ';
return c;
}
for ( ; --lim > 0; w++)
if (!isalnum (*w = getchar ())) {
ungetch (*w);
break;
}
*w = ' ';
return word[0];
}
// crea un tnode
struct tnode *talloc (void)
{
return (struct tnode *)malloc (sizeof (struct tnode));
}
char *strdup (char *s) // crea un duplicado de s
{
char *p;
p = (char *)malloc (strlen (s) + 1); // +1 para ' '
if (p != NULL)
strcpy (p, s);
return p;
}
porfavor necesito que me agais esta practica antes de la fecha limite si puede ser ponerme suficientes comentarios para entenderla ya que tengo que explicarla. porfavor os necesito para aprobar
PRÁCTICA 3 SUMAR EN COMPLEMENTO A DOS
El programa deberá:
Preguntar al usuario un número entero.
Mostrar por pantalla su representación en complemento a dos.
Preguntar al usuario otro número entero.
Mostrar por pantalla la representación en complemento a dos de ese otro número.
Mostrar por pantalla la suma en decimal de ambos números.
Mostrar por pantalla la suma en complemento a dos de ambos números.
Condiciones de realización del programa:
No se permite realizar al vuelo1 la suma en complemento a dos ni tampoco convertir a
complemento a dos la suma en decimal: los números deberán ser convertidos a complemento a dos
nada más ser leídos, almacenados en arrays de enteros (un bit en cada elemento del array) y la suma
se realizará trabajando con esos arrays.
Se puede asumir que los enteros se representan con 32 bits. Eso implica que los arrays tienen que
tener 32 elementos.
La práctica se puntuará sobre 1.5 puntos y DEBE funcionar correctamente. Excepcionalmente, se
corregirán prácticas que, aun no funcionando, tengan fallos menores. Se valorarán:
Su correcto funcionamiento (0.5 puntos).
La eficiencia en las operaciones (0.3 puntos).
El uso de variables locales frente a variables globales (0.1 puntos).
El uso de nombres significativos para las variables (0.1 puntos).
La correcta indentación del código fuente (0.1 puntos).
La existencia de comentarios (0.1 puntos).
La estructuración del código fuente en funciones (0.3 puntos).
Las condiciones de entrega son las siguientes:
La fecha LÍMITE es el domingo 29 de mayo.
Se entregará un documento IMPRESO con el código fuente y los datos del alumno al PRINCIPIO
1 Es decir, no se permite realizar la suma al mismo tiempo que se convierten los números a formato complemento a dos.
Esta exigencia es para obligar a utilizar la representación deseada de arrays de enteros, donde en cada elemento del array
se guardará un bit de la representación en complemento a dos de un número.
del documento: nombre, DNI y grupo de prácticas (ej: lunes 8:00-10:00). Si consta de varias hojas,
éstas deberán estar grapadas (ni dobladas, ni con clip). No se admitirán ni documentos redactados a
mano ni disquetes. No es necesario ni deseable que el documento impreso tenga portada.
Se enviará el código fuente a la dirección [email protected] junto con los datos del alumno (nombre,
DNI y grupo de prácticas).
Bien el documento impreso, bien el correo electrónico, tendrá que llegar / entregarse necesariamente
a más tardar el día de la fecha límite. Se admitirá que el otro llegue / entregue más tarde siempre y
cuando sean EXACTAMENTE iguales.
A partir del momento de entrega, todos los alumnos serán preguntados acerca de detalles referentes a
la implementación de la práctica en clase de prácticas o en horas de tutorías.
Se recuerda a los alumnos que las prácticas son de realización INDIVIDUAL. Si el alumno no es
capaz de explicar satisfactoriamente cualquier detalle de la práctica tendrá automáticamente un cero
en ella.
PRÁCTICA 3 SUMAR EN COMPLEMENTO A DOS
El programa deberá:
Preguntar al usuario un número entero.
Mostrar por pantalla su representación en complemento a dos.
Preguntar al usuario otro número entero.
Mostrar por pantalla la representación en complemento a dos de ese otro número.
Mostrar por pantalla la suma en decimal de ambos números.
Mostrar por pantalla la suma en complemento a dos de ambos números.
Condiciones de realización del programa:
No se permite realizar al vuelo1 la suma en complemento a dos ni tampoco convertir a
complemento a dos la suma en decimal: los números deberán ser convertidos a complemento a dos
nada más ser leídos, almacenados en arrays de enteros (un bit en cada elemento del array) y la suma
se realizará trabajando con esos arrays.
Se puede asumir que los enteros se representan con 32 bits. Eso implica que los arrays tienen que
tener 32 elementos.
La práctica se puntuará sobre 1.5 puntos y DEBE funcionar correctamente. Excepcionalmente, se
corregirán prácticas que, aun no funcionando, tengan fallos menores. Se valorarán:
Su correcto funcionamiento (0.5 puntos).
La eficiencia en las operaciones (0.3 puntos).
El uso de variables locales frente a variables globales (0.1 puntos).
El uso de nombres significativos para las variables (0.1 puntos).
La correcta indentación del código fuente (0.1 puntos).
La existencia de comentarios (0.1 puntos).
La estructuración del código fuente en funciones (0.3 puntos).
Las condiciones de entrega son las siguientes:
La fecha LÍMITE es el domingo 29 de mayo.
Se entregará un documento IMPRESO con el código fuente y los datos del alumno al PRINCIPIO
1 Es decir, no se permite realizar la suma al mismo tiempo que se convierten los números a formato complemento a dos.
Esta exigencia es para obligar a utilizar la representación deseada de arrays de enteros, donde en cada elemento del array
se guardará un bit de la representación en complemento a dos de un número.
del documento: nombre, DNI y grupo de prácticas (ej: lunes 8:00-10:00). Si consta de varias hojas,
éstas deberán estar grapadas (ni dobladas, ni con clip). No se admitirán ni documentos redactados a
mano ni disquetes. No es necesario ni deseable que el documento impreso tenga portada.
Se enviará el código fuente a la dirección [email protected] junto con los datos del alumno (nombre,
DNI y grupo de prácticas).
Bien el documento impreso, bien el correo electrónico, tendrá que llegar / entregarse necesariamente
a más tardar el día de la fecha límite. Se admitirá que el otro llegue / entregue más tarde siempre y
cuando sean EXACTAMENTE iguales.
A partir del momento de entrega, todos los alumnos serán preguntados acerca de detalles referentes a
la implementación de la práctica en clase de prácticas o en horas de tutorías.
Se recuerda a los alumnos que las prácticas son de realización INDIVIDUAL. Si el alumno no es
capaz de explicar satisfactoriamente cualquier detalle de la práctica tendrá automáticamente un cero
en ella.