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

#471
Programación C/C++ / Re: matriz de adyacencia
8 Noviembre 2018, 05:08 AM
'n' es  el dato ya que esta declarado como un solo char.
#472
Programación C/C++ / Re: Grafos
8 Noviembre 2018, 04:56 AM
Los grafos como tal son bastante enredados, y mas si todavia tienes dudas de estructuras mas basicas como listas ligadas, doblemente ligadas, circulares, y demás.

Pero si entiendes los grafos avanzaras mucho en tu entendimiento del la programación en cualquier lenguaje.

básicamente se utiliza la lista ligada para mantener un control sobre el numero total de nodos creados, pero no indica que la estructura de Lista ligada necesariamente tenga que ser parte de grafo.

saludos
#473
Excelente!  ;-)

Ahhhh!, arreglo de Enteros. si convertirlos mediante atoi esta bien. Suponiendo que siempre sea un numero valido. La otra funcion mas rubusta es strtol().

Saludos
#474
Pues técnicamente el "arreglo" es un Arrglo,

Es un arreglo de apuntadores que apuntan valga la redundancia a donde estan guardados los valores leídos

Si ves en las lineas


arreglo[i] = calloc(len+1,sizeof(char));
memcpy(arreglo[i],token,len);
printf("Numero %i: %s\n",i+1,arreglo[i]);


Siempre se hace referencia a arreglo.



Tal vez lo que necesitas es un arreglo Fijo, pero al no conocer que te van a dar como N , no podras por metodos de arreglos fijos prevenir correctamente el valor de N

char arreglo[N][30];

Supongamos un N = 1000


Ejemplo:


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

int main() {
int  N,i = 0,len;
char *buffer;
char *token = NULL;
char temporal[5000];
fgets(temporal,1000,stdin);
N = strtol(temporal,NULL,10);
char arreglo[N][30];
token = strtok(buffer," ");
fgets(temporal,5000,stdin);
token = strtok(temporal," ");
do {
//arreglo[i] = token; // Esta linea esta bien, pero realmente recomiendo moverl el contenido de esta posicion de memoria a uno que si controlemos nosotros
len = strlen(token);
memcpy(arreglo[i],token,len);
printf("Numero %i: %s\n",i+1,arreglo[i]);
token = strtok(NULL," ");
i++;
}while(i < N && token != NULL);
}


Salida para N = 10


C:\codigos>ts1.exe
10
1 2 3 4 5 6 7 8 9 0
Numero 1: 1
Numero 2: 2
Numero 3: 3
Numero 4: 4
Numero 5: 5·a
Numero 6: 6
Numero 7: 7fúw~
Numero 8: 8
Numero 9: 9ÖÖ
Numero 10: 0



Salida para N=1000


Numero 961: 1
Numero 962: 2w╕τa
Numero 963: 3æ╝w Φa
Numero 964: 4
Numero 965: 5τa
Numero 966: 6w
Numero 967: 7@8
Numero 968: 8⌠
Numero 969: 9
Numero 970: 0µ
Numero 971: 1
Numero 972: 2
Numero 973: 3
Numero 974: 4
Numero 975: 5Θa
Numero 976: 6
Numero 977: 7
Numero 978: 8
Numero 979: 9ó╛wƱOuÉ
Numero 980: 0
Numero 981: 1
Numero 982: 2
Numero 983: 3
Numero 984: 4
Numero 985: 5
Numero 986: 6
Numero 987: 7
Numero 988: 8
Numero 989: 9Ωa
Numero 990: 0
Numero 991: 1Ωa
Numero 992: 2w
Numero 993: 3Ēw
Numero 994: 4
Numero 995: 5╝íw
Numero 996: 6
Numero 997: 7
Numero 998: 8
Numero 999: 9
Numero 1000: 0



Le memoria se podria limpiar con

char arreglo[N][30] = {0};

pero se me hace ineficiente hacerlo de esta forma.

Saludos
#475
 :¬¬

Técnicamente la pagina también a descargo torrents por lo menos la metadata de los mismos para poder realizar las consultas pertinentes a la red de torrent (Los trackers) y poder recopilar la información ahi existente, Es un golpe a la privacidad de ciertas IP, pero por lo menos la mayoría de las IPs son dinámicas.

Solo falta que se empiece a usar esa información para encarcelar personas. :silbar:

Saludos
#476
Muy buen dia, la mayoria de los sistemas de pagos de este estilo, que utilizan su propia moneda mantienen su valor en bas que?, supuestamente la "fe" de la gente en que sus "Activos" mantienen el valor.

Características Genéricas del Dinero

Aceptación.- Que sea un bien aceptado por TODOS.
Poder adquisitivo.- Adquirir la máxima cantidad de bienes, capacidad de compra
Estabilidad.- Que consiste en su poca fluctuación u oscilación de su valor
Divisibilidad.- Que tenga buena cantidad de múltiplos y submúltiplos especialmente éstos denominados dinero fraccionario
Homogeneidad.- Que reúna características uniformes de peso, tamaño, color, inscripciones etc, que eviten su confusión y falsificación
Durabilidad.- Para que no se deteriore pronto con el uso, por eso se emplean metales duros que resisten mejor a la acción del tiempo o del uso y si es de papel deberá elegirse uno de calidad especial
De fácil transporte.- De pequeña dimensión y poco peso, que permite llevarla en el bolsillo

Actualmente y al igual que todo el dinero Fiduciario mantienen valor por que hay un gobierno que lo "Respalda" a excepcion de venezuela donde el gobierno no puede mantener el valor de su propia moneda y recurre a sistemas Fancy-shit como las criptodivisas, que de cripto no tiene nada, lo unico destacable es que medienta el sistema de block-chain mantienen una base de datos inquebrantable de cuanto dinero existe.

Si bien es cierto que el dinero "electrónico" es de facil transporte y es divisible, realmente le falta la aceptación de todos, ademas en la mayoria de los casos su valor esta Indefinido y sujeto a EXCLUSIVAMENTE a la ESPECULACIÓN.

Por ejemplo yo acepto Transferencias Bancarias, Paypal, Bitcoin etc mientras lo pueda mover para comprar cosas o pogar con el, no tengo problema con aceptarlo, sin embargo nadie me a pagado con Bitcoin, Solo me han pagado devez en cuando con Paypal y esto solo por que no esta la persona en el mismo pais que yo, si no optaría por una transferencia bancaria y/o deposito directo a cuenta.

El principal problema es que la gente comun y que  no es tan apegada a la tecnologia, no acepta con facilidad el dinero electronico, Por ejemplo aqui en mexico 2/3 de la poblacion NO ESTA BANCARIZADA, le tienen miedo a que el Fisco les cobre impuestos, y de hecho hasta un 95% de la economia esta basada en dinero en FISICO. por lo cual veo muy dificil que se llegue a aceptar de forma General una Moneda virtual.

Saludos

#477
Programación C/C++ / Re: Grafos
7 Noviembre 2018, 17:12 PM
Cita de: MAFUS en  7 Noviembre 2018, 17:07 PM
Una imagen vale mas que mil palabras:
https://www.youtube.com/watch?v=X5hR5iLWBeU

Que pasa MAFUS.

Yo crei que si el usuario estaba preguntando por grafos, ya conocía el concepto de listas enlazadas.

Volviendo a mi ejemplo hice la siguiente generacion de nodos creados aleatoriamente, y al final el programa llego a utilizar 53 MB de memoria.


int main() {
int i,j;
Grafo grafo,temp;
srand(time(NULL));
grafo  = crear_nodo(rand());
i = 0;
while(i < 1000000) {
agregar_nodo(grafo,crear_nodo(rand()));
i++;
}

i = 0;
while(i < 1000) {
temp = grafo->nodos[rand() % grafo->n_nodos];
j = 0;
while(j < 200) {
agregar_nodo(temp,crear_nodo(rand()));
j++;
}
i++;
}
getc(stdin);// Solo para que no se cierre el programa pero no me gusta usar getc
return 0;
}



Entonces si quisieramos elimintar todos los Nodos de forma Rapida para liberar la memoria,
¿Cual seria la forma mas facil de eliminarlos?

Respuesta:  ir guardando los nodos en una lista para posteriormente poder recorrerlos facilmente.

Saludos!
#478
Programación C/C++ / Re: Grafos
7 Noviembre 2018, 16:50 PM
Realmente es una forma muy conveniente de tener una lista de todos los nodos de forma accesible

Imaginemos el siguiente problema

Digamos que te dejan crear un Grafo con un 10 Millones de Nodos, imagina tu que haces todo perfectamente, los enlaces entre nodos, los pesos de las aristas etc...

En ese mismo problema te indican que  tienes que hacer limpieza de X cantidad de Nodos ya sea algunos cuantos o todos.
Supongamos que es el mejor de los casos y que te piden borrar el grafo, para crear uno nuevo.

Lo mas facil seria crear un nuevo grafo y olvidarnos del anterior verdad?

pero son 10 Millones de nodos que siguen en la memoria  :rolleyes: :rolleyes:

Lo logico es borrar todos los nodos y liberar la memoria que se utilizo en el momento.

¿Como lo harias sin tener una lista de todos los nodos?

En caso de no tener una lista con todos los nodos, lo mas seguro es que tengas que recorrer el grafo nodo por nodo creando una lista de los nodos que ya liberastes y los que te faltan por liberar, lo cual podria llegar a ser un poco ineficiente.

Entonces mejor tener una lista que puedas recorrer de forma facil y sencilla para ir eliminándolos de uno por uno.


Veamos el siguiente codigo con una aproximaacion a generar un grado de forma muy sencilla.

Siendo el "Grafo" realmente un simple apuntador a un nodo, y cada nodo puede apuntar a mas nodos.


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

typedef struct str_nodo *Nodo;

typedef struct str_nodo {
int valor;
Nodo *nodos; //Nodos con los que esta unido el nodo actual
int n_nodos;
}*Grafo;

Nodo crear_nodo(int valor);
void agregar_nodo(Nodo inicial,Nodo final); //Esta funcion une ambos nodos

int main() {
Grafo grafo;
grafo  = crear_nodo(10);
agregar_nodo(grafo,crear_nodo(5)); //Aqui tenemos el nodo 10 <-> 5 Que apunta al nodo 5
agregar_nodo(grafo,crear_nodo(15));
agregar_nodo(grafo,crear_nodo(800));
agregar_nodo(grafo,crear_nodo(100));
//En este punto parece sencillo recorrer todos los nodos existentens, pero las cosas se podrian complicar un poco si agregamos nodos a los nodos ya existententes de forma aleatoria
return 0;
}

Nodo crear_nodo(int valor) {
Nodo nodo;
nodo = calloc(1,sizeof(struct str_nodo));
nodo->valor = valor;
nodo->nodos = NULL;
nodo->n_nodos = 0;
return nodo;
}

void agregar_nodo(Nodo inicial,Nodo final) {
inicial->nodos = realloc(inicial->nodos,(inicial->n_nodos +1 )*sizeof(struct str_nodo*)); //Incrementamos el espacio para (inicial->n_nodos +1) Apuntadores
final->nodos = realloc(final->nodos,(final->n_nodos +1 )*sizeof(struct str_nodo*)); //Incrementamos el espacio para (final->n_nodos +1) Apuntadores

inicial->nodos[inicial->n_nodos] = final;
final->nodos[final->n_nodos] = inicial;

printf("%i <-> %i\n",inicial->valor,final->valor);
inicial->n_nodos++;
final->n_nodos++;
}
#479
Programación C/C++ / Re: Grafos
7 Noviembre 2018, 02:13 AM
Tiene que ser necesariamente con lista enlazada?

Saludos
#480
Salida:


C:\codigos>tsss.exe
10
1 2 3 5 5 5 5 5 5 5
Numero 1: 1
Numero 2: 2
Numero 3: 3
Numero 4: 5
Numero 5: 5
Numero 6: 5
Numero 7: 5
Numero 8: 5
Numero 9: 5
Numero 10: 5



Codigo


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

int main() {
int  N,i = 0,len;
char **arreglo = NULL;
char *buffer;
char *token = NULL;
char temporal[1000];
fgets(temporal,1000,stdin);
N = strtol(temporal,NULL,10);
token = strtok(buffer," ");
fgets(temporal,1000,stdin);
token = strtok(temporal," ");
do {
arreglo = realloc(arreglo, sizeof(char*) * (i +1));

//arreglo[i] = token; // Esta linea esta bien, pero realmente recomiendo moverl el contenido de esta posicion de memoria a uno que si controlemos nosotros
len = strlen(token);
arreglo[i] = calloc(len+1,sizeof(char));
memcpy(arreglo[i],token,len);
printf("Numero %i: %s\n",i+1,arreglo[i]);
token = strtok(NULL," ");
i++;
}while(i < N && token != NULL);
}


Saludos!