Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - LadyWin

#1
Hardware / Pantalla negra al cambiar memoria RAM
14 Octubre 2021, 19:39 PM
Hola gente, tengo una Toshiba Satellite L845-SP4304LA y pensé en aumentar el tamaño de la ram, investigue cual podría ser la correcta para mi notebook y termine comprando una con estas características:  DDR3 DRAM, formato SODIMM, velocidad 1066MHz, linea apple sodimm, capacidad total 4GB. Incluso lei comentarios donde daban buenas referencias y había funcionado en otros dispositivos. El problema es que a mi no me funciona, si lo agrego en el segundo slots que tengo disponible el sistema no lo reconoce y si la agrego en el primer slots la pantalla queda negra, a que se debe? Esas características coincide con la RAM que vino originalmente en la notebook

Cuando quite la ram en la placa base decia MODEL:BY3C, no se si sirve el dato, si me pueden ayudar estaría agradecida!
#2
Buenos días gente, como están? Tengo dos dudas en este tema:

1) Como podría ser la mejor manera de saber cuales serian las funcionalidades publicas correctas para que pueda utilizar el usuario? por ejemplo, tengo un TAD de listas, en ella estarían las operaciones comunes como agregar al final, mostrar, eliminar, etc y tengo una funcionalidad que se llamaría crear donde crearía un nodo que la utilizaría dentro de la funcionalidad agregar al final, esta operación de crear seria una funcionalidad para que también la pueda usar el usuario? Esta duda me surge porque al modularizar una operación no se si esas funcionalidades serian publicas también, o debo dejarlas como privadas, tendría utilidad para el usuario crear un nodo sin el dato?

2) Si tengo un TAD de listas, las funcionalidades se verían comprometidas dependiendo de la estructura que utilice para almacenar los datos no?, aunque en una lista con enlace o un vector se puedan ver como listas (verlo abstractamente) no creo que se puedan reutilizar las funcionalidades con una estructura de datos de tipo, por ejemplo lista enlazada con la de un vector, mi duda surge porque se dice que el usuario no debe conocer que estructura de datos se utiliza, y si es un vector, las funcionalidades deberían recibir, además del vector, también una posición y en esa situación el usuario estaría sabiendo la estructura que se esta utilizando en la implementación del TAD

Disculpa si fui muy extensa pero quería hacerme entender, si me pueden ayudar estaría agradecida, saludos! :laugh:
#3
Programación C/C++ / Arbol binario de busqueda
11 Septiembre 2021, 22:49 PM
Hola! como andan? Queria consultarles si me pueden ayudar a encontrar el error, no me funciona correctamente, lo mas probable es que este a la hora eliminar me estoy salteando algo y no se que es, desde ya muchas gracias! ;D ;D

A la hora de mostrar el arbol resultante se transforma en un bucle infinito, me empieza a mostrar direcciones de memoria
void eliminar (Arbol * ppio, int x)
{ // Busca el elemento que se desea eliminar
if (esVacio(*ppio)) return;
else if (x < (*ppio)->dato)
// Si el valor es menor se recorre por la izquierda
eliminar(&(*ppio)->hizq,x);

else if (x > (*ppio)->dato)
// Si el valor es mayor se recorre por la derecha
eliminar(&(*ppio)->hder,x);

else
// Si ya encontraste el valor
eliminar_elemento (ppio);

}
void eliminar_elemento (Arbol * a)
{ // Elimina el elemento que se desea
if (esHoja(*a))
// Si es una hoja
free(*a);

else if (esPadreCompleto(*a))
{ // Si es padre con dos hijos
Arbol * min = minimo(&(*a)->hder);
(*a)->dato = (*min)->dato;
free(*min);
}
else
// Si tiene solo un hijo
a = reemplazar(a);
}
Arbol * minimo (Arbol * a)
{ // Busca el menor elemento
if (esVacio(*a)) return NULL; // Retornas nulo si el arbol esta vacio
if (!esVacio((*a)->hizq))
// Si tiene hijo izquierdo
return minimo(&(*a)->hizq); // Buscamos la parte mas izq posible
else
// Si no tiene hijo izq
return a; // Retornamos el mismo nodo

}
Arbol * reemplazar (Arbol * a)
{ // Reemplaza los valores padre con hijo
Arbol aux;
if (!esVacio((*a)->hizq))
{
aux = *a;
*a = (*a)->hizq;
free(aux);
} else
{
aux = *a;
(*a) = (*a)->hder;
free(aux);
}
return a;
}
#4
Cita de: MAFUS en 29 Agosto 2021, 12:48 PM
Te he modificado el programa para que funcione y te he escrito en los comentarios el por qué de cada cambio.



Muchisimas gracias, no solo me has ayudado con mi duda sino tambien con otros errores que tenia, mil gracias!   ;-) ;D ;-) ;D
#5
Programación C/C++ / Pasar puntero en recursion
29 Agosto 2021, 06:46 AM
Hola! como andan? Ya he hecho varios post respecto a los punteros y de a poco le estoy agarrando la mano gracias a sus consejos.  ;D
Ahora estoy creando una lista en donde voy agregando los elementos al final de modo recursivo, pero me sale ciertos errores, entiendo que es un problema en los punteros pero he visto varias funcionalidades de otras personas que lo escriben asi y al parecer no les sale el mismo inconveniente, o como seria la correcta forma de escribirlo? si me pueden ayudar seria de gran ayuda!
  ;-)

#include <stdio.h>
#include <stdlib.h>

typedef struct rLista
{
int dato;
struct rNodo * sig;
} * tLista;

tLista * crear_nodo (int nuevo_dato)
{
tLista * nuevo_elemento = (tLista*) malloc (sizeof(tLista));
(*nuevo_elemento)->dato = nuevo_dato;
(*nuevo_elemento)->sig = NULL;
return nuevo_elemento;
}
tLista agregar_final (tLista * ppio, tLista * nuevo_elemento)
{
if (!ppio) ppio = nuevo_elemento;
else
ppio->sig = agregar_final(ppio->sig,nuevo_elemento); //error: '*ppio' is a pointer; did you mean to use '->'?

return *ppio;
}
int contar_elementos (tLista * ppio)
{
int contador;

if (!ppio) return 0;
else contador = contar_elementos(ppio->sig); // error: '*ppio' is a pointer; did you mean to use '->'?

return contador;
}


int main (void)
{
tLista ppio = NULL;

ppio = agregar_final(&ppio,crear_nodo(5));

return 0;
}
#6
Programación C/C++ / Re: Puntero doble
18 Agosto 2021, 04:32 AM

Gracias por el tiempo que se tomaron, pude resolver el tema de la sintaxis en la funcion agregarElemento, cree la variable nuevo pero sin puntero, el problema es que en otros modulos me salen otros problemas que no puedo resolverlo por este metodo, probe infinitas formas pero no avanzo, asi que creo que lo mejor sera repasar el tema en mayor profundidad, de igual manera aprendi bastante, gracias nuevamente  ;-) ;-)  ;-)
#7
Programación C/C++ / Re: Puntero doble
15 Agosto 2021, 20:30 PM
Gracias por responder! Entiendo lo que me dicen, pero entonces no es posible acceder a los campos cuando la sintaxis es hecha de este modo?, aca hice un codigo mas simple, 'ppio' ya no es puntero pero tambien me sale el mismo error:

#include <stdio.h>
#include <stdlib.h>

typedef struct rNodo {
    int numero;
    struct rNodo * siguiente;
} * tNodo;

void inicializar(tNodo * ppio);
void agregarElemento (tNodo * ppio);

int main () {
    tNodo ppio;
    inicializar (&ppio); // Apunta a ppio
    agregarElemento(&ppio);
    printf("%i", ppio->numero );

    return 0;
}
void inicializar(tNodo * ppio) {
    *ppio = NULL;
}
void agregarElemento (tNodo * ppio) { //nuevo es un puntero y, numero y num1 son enteros, pero como tNodo es puntero ahi me genera errores
    int num1 = 23;
    tNodo * nuevo = (struct rNodo*) malloc (sizeof(struct rNodo));  //warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
    nuevo->numero = num1;  //error: '*nuevo' is a pointer; did you mean to use '->'?
    nuevo->siguiente = NULL;  //error: '*nuevo' is a pointer; did you mean to use '->'?
    ppio = nuevo;

}


Lo que quiero evitar es escribir (**) por esta razon quiero buscar otras alternativas, desde ya muchas gracias!
;D
#8
Programación C/C++ / Puntero doble
15 Agosto 2021, 06:30 AM
Buenas noches! como andan? queria consultarles algo que me tiene un poco confundida...


typedef struct tDATO {
int DNI;
char * nombre;
} DATO;
typedef struct tCola {
DATO contenido;
struct tCola *sgte;
} * COLA;

int main (void) {
COLA * ppio = inicializar(ppio);


Como 'COLA' es un puntero entonces 'ppio' seria un doble puntero? si no es asi, como seria su correcta definicion?

Utilizo este modo ya que necesito pasar parametros por referencia para que sus datos se modifiquen en los modulos, pero termina siendo medio engorroso a la hora de acceder a sus campos, siempre me salen muchos errores,por ejemplo este me salio sin ningun problema:


COLA * crearCola (DATO * nuevoDato) {
COLA * nuevo_elemento = (COLA*) malloc (sizeof(COLA));
(*nuevo_elemento)->contenido.DNI = nuevoDato->DNI;
strcpy((*nuevo_elemento)->contenido.nombre,nuevoDato->nombre);
(*nuevo_elemento)->sgte = NULL;
return nuevo_elemento;
}


Pero en este no, me salen un monton de errores siendo que los hice de la misma manera:

void agregarAlFinal (COLA * ppio, COLA * nuevoNodo) {
COLA * aux = ppio;
while (!esVacia(aux)) {
if (esVacia(aux->sgte)) //'*aux' is a pointer; did you mean to use '->'?
(*aux)->sgte = nuevoNodo;//warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
         aux = (*aux)->sgte;  //warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
}
}


Si me pueden ayudar seria de gran ayuda, desde ya muchas gracias!  ;-)
#9
Cita de: MAFUS en 12 Agosto 2021, 02:00 AM
Me he tomado la libertad de modificar tu código y añadir unas cuantas cosas. De igual forma he comentado cambios y añadidos.

Espero que te sirva.


Me ha ayudado un monton los cambios, muchisimas gracias por el tiempo que te tomaste!  ;D ;D ;D ;D
#10
Hola! Hice un codigo de insertar elementos ordenados en una lista enlazada, me funciono perfectamente solo que repetia la asignacion de la variable que iba a ingresar a la lista, asi:
num = 1;
agregar_lista (num);
num = 2; ,
agregar_lista (num); ... etc

ahora quise hacerlo con while, deje todo como estaba solamente modifique ese procedimiento, pero no se por que no funciona, no lee lo que hay dentro del while como tampoco lo que hay fuera, incluso intente mostrar en pantalla mensajes al iniciar el programa y tampoco sirve, a que se debe? Antes funcionaba sin ningun problema  :(

#include <stdio.h>
#include <stdlib.h>

typedef struct rNodo {
    int dato;
    struct rNodo * siguiente;
}tNodo;
typedef struct rLista {
    tNodo * primero;
    tNodo * ultimo;
    int longitud;
}tLista;

typedef tNodo * Nodo;
typedef tLista * Lista;


tLista * inicializar (Lista lista);
tNodo * crear_nodo (int nuevo_dato);
tLista * ins_de_orden_ascen (Lista lista, Nodo nuevo_nodo);


int main(void)
{
    Lista lista = inicializar(lista);
    int nuevo_dato;
    int finalizar = 1;
do {
printf("ingrese un numero:");
        scanf("%i", &nuevo_dato);
        lista = ins_de_orden_ascen(lista, crear_nodo(nuevo_dato));
        printf("Quiere ingresar otro numero? 1(si) o 0(no):");
        scanf("%i", &finalizar);
        } while (finalizar == 1);

    return 0;
}


tLista * inicializar (Lista lista) {
    Lista nueva_lista = (tLista*) malloc (sizeof (tLista));
    nueva_lista->primero = NULL;
    nueva_lista->ultimo = NULL;
    nueva_lista->longitud = 0;
    return nueva_lista;
}
tNodo * crear_nodo (int nuevo_dato) {
    Nodo nuevo_elemento = (tNodo*) malloc (sizeof (tNodo));
    nuevo_elemento->dato = nuevo_dato;
    nuevo_elemento->siguiente = NULL;
    return nuevo_elemento;
}
tLista * ins_de_orden_ascen (Lista lista, Nodo nuevo_nodo) {
    if (lista->longitud == 0) { // Si la lista es vacia
        nuevo_nodo->siguiente = lista->primero;
        lista->primero = nuevo_nodo;
        lista->ultimo = nuevo_nodo;
    } else {
        Nodo aux = lista->primero; // aux apunta al primer elemento
        Nodo sig;
        int encontro = 0;
        while (encontro == 0) {
            sig = aux->siguiente; // sig apunta al siguiente elemento de aux
             if (aux->dato > nuevo_nodo->dato) { // Si el nuevo elemento es menor al elemento actual
                    nuevo_nodo->siguiente = aux;
                    lista->primero = nuevo_nodo;
                    encontro = 1;
             } else
                 if ((aux->dato < nuevo_nodo->dato) && (sig == NULL)) { // Si el nuevo elemento es mayor al ultimo de la lista
                            nuevo_nodo->siguiente = aux->siguiente;
                            aux->siguiente = nuevo_nodo;
                            lista->ultimo = nuevo_nodo;
                            encontro = 1;
                        } else
                            if ((aux->dato < nuevo_nodo->dato) && (sig->dato > nuevo_nodo->dato)) { // Si se encuentra en el medio de la lista
                                nuevo_nodo->siguiente = aux->siguiente;
                                aux->siguiente = nuevo_nodo;
                                encontro = 1;
                            } else
                                aux = aux->siguiente;
        }
    }
    lista->longitud++; // Aumenta la cantidad de elementos
    return lista;
}