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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 ... 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [43] 44 45 46 47 48 49 50 51
421  Programación / Programación C/C++ / Re: Tomar datos de un archivo y ponerlos en un vector!!! en: 14 Julio 2012, 14:38 pm
Citar
no se entiende lo que queres decir. En una declaracion de puntero cualquiera de las dos formas se entiende que es un puntero

si, para ti si, pero para alguien que esta aprendiendo puede llegar a confundir. al menos a mi me paso. como he dicho es una tonteria y es lo mismo, pero es quizas mas entendible para el usuario que aprende o al menos a mi me ayudo.

Citar
No, para saber la direccion a la que apunta se usa %p

de eso no tenia ni idea, pero poniendo el especificador de formato como si fuera un int, el compilador te manda un warning pero lo imprime sin problemas.


tan solo era como una introduccion a los punteros, sin tocar temas profundos ni tecnicismos innecesarios.
422  Programación / Programación C/C++ / Re: Tomar datos de un archivo y ponerlos en un vector!!! en: 14 Julio 2012, 04:03 am
yo aun me lio con algunas cosas de apuntadores, pero a ver si consigo explicarme bien:

primero, en vez de declarar un puntero como int *a intenta declararlo como int* a. parece una tonteria, y para el compilador es lo mismo, pero de la segunda manera se ve claramente que a es una variable de tipo puntero a int. en cambio de la primera se puede pensar que *a es un puntero a int.

segundo, imaginate a la variable tipo puntero a int como una variable que almacena 2 datos, una direccion de memoria a la que apunta y el valor que hay en esa direccion. si haces un printf("%d", a), el resultado sera un numero largo que indica la direccion de memoria a la que apunta. en cambio, *a indica el valor almacenado en esa direccion de memoria.

las diferencias entre, por ejemplo, una variable int a y una variable int* b son que:
1. el valor almacenado se saca con: a y con *b
2. la direccion de memoria donde esta almacenada la propia variable se saca con: &a y &b
3. el valor "extra" que indica donde apunta una variable de tipo puntero se saca con: b

quizas te preguntes entonces que para que sirven los punteros ya que aparentemente hacen lo mismo pero de una manera distinta y mas complicada. pues el principal uso de los punteros es poder gestionar la memoria de manera dinamica (poder asignar y liberar memoria despues de haber compilado). algo que, por ejemplo, te permitiria hacer un programa que preguntase al usuario cuantos datos quiere ingresar y entonces tu podrias usar la memoria justa sin riesgo a usar demasiada ni a quedarte corto.

te dejo un pequeño codigo tipico de aprender apuntadores (da algunos warnings al compilar pero corre perfectamente):

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. int a=12, *b;
  6. printf("\nPARA a:\ndireccion propia: &a= %d\nvalor de a: a= %d\n\n", &a, a);
  7. b=&a; //hacemos que el puntero b apunte a la variable a
  8. printf("PARA b:\napunta a la direccion: b= %d\nel valor almacenado ahi es: *b= %d\ndireccion propia: &b= %d\n\n", b, *b, &b);
  9. return 0;
  10. }
  11.  

su salida:

Citar
PARA a:
direccion propia: &a= 1606416780
valor de a: a= 12

PARA b:
apunta a la direccion: b= 1606416780
el valor almacenado ahi es: *b= 12
direccion propia: &b= 1606416768

y ultimo, cuando hagas alguna funcion con parametros tienes que preguntarte si modificaras el valor de algun parametro. si no te interesa hacerlo, puedes pasar el parametro como una "variable normal" y usarla como tal. si necesitas modificar el valor de la variable, entonces le tienes que pasar a la funcion la direccion de memoria donde esta almacenada la variable, para que asi digamos que pueda escribir sobre ella. y para pasar la direccion de memoria entonces tienes que usar punteros.

ultimo codigo de ejemplo:

Código
  1. #include <stdio.h>
  2.  
  3. void funcion(int n, int* p);
  4.  
  5. int main() {
  6. int a=1, b=5;
  7. printf("VARIABLES ANTES DE LA FUNCION:\na= %d\nb= %d\n", a, b);
  8. funcion(a, &b);
  9. printf("VARIABLES DESPUES DE LA FUNCION:\na= %d\nb= %d\n", a, b);
  10. return 0;
  11. }
  12.  
  13. void funcion(int n, int* p) {
  14. // n es una variable de tipo int "normal". n contiene el valor de la variable a. PASO POR VALOR (no se puede modificar)
  15. // p es una variable de tipo puntero a int. p contiende la direccion de memoria de b. PASO POR REFERENCIA (se puede modificar)
  16. printf("VALORES EN LA FUNCION:\nn= %d\n*p= %d\n", n, *p);
  17.        // intentamos modificar las variables
  18. (*p)=3;
  19. n=2;
  20. }

y su salida, donde se ve que 1 variable se ha modificado y la otra no:

Citar
VARIABLES ANTES DE LA FUNCION:
a= 1
b= 5
VALORES EN LA FUNCION:
n= 1
*p= 5
VARIABLES DESPUES DE LA FUNCION:
a= 1
b= 3

espero que sirva de ayuda... si tienes alguna duda no tienes mas que consultar. un saludo!
423  Programación / Programación C/C++ / Re: palindromo en: 13 Julio 2012, 19:41 pm
estoy de acuerdo con durasno, veo mas sencillo recorrer el texto comparando 2 indices que empiezan al principio y al final, y se recorren hasta llegar a la mitad de la cadena. dejo aqui mi codigo, lo he probado y funciona:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define SIZE 256
  5.  
  6. int main(int argc, char** argv)
  7. {
  8. char buffer[SIZE];
  9. int i, j, cond=1;
  10.  
  11. printf("Introduzca la frase: ");
  12. fgets(buffer, SIZE-1, stdin);
  13. buffer[strlen(buffer)-1]='\0';
  14.  
  15. //eliminar espacios en blanco
  16. for (i=0; i<strlen(buffer)-1; i++) {
  17. if (buffer[i] == ' ') {
  18. for (j=i; j<strlen(buffer)-1; j++) {
  19. buffer[j]=buffer[j+1];
  20. }
  21. buffer[strlen(buffer)-1]='\0';
  22. }
  23. }
  24. printf("La frase sin espacios es: %s\n", buffer);
  25.  
  26. //comprobar si es palindromo
  27. for (i=0; i<strlen(buffer)/2 && cond==1; i++) {
  28. if (buffer[i] != buffer[strlen(buffer)-i-1]) {
  29. cond=0;
  30. }
  31. }
  32.  
  33. if (cond == 1) {
  34. printf("Es palindromo.\n");
  35. } else {
  36. printf("No es palindromo.\n");
  37. }
  38.  
  39. return 0;
  40. }
424  Programación / Programación C/C++ / Re: como hacer un generador?? en: 13 Julio 2012, 15:46 pm
me gustaria a mi tambien compartir el codigo que he hecho, seguramente para nada sea el mas eficiente pero me gustaria saber como podria optimizarlo. genera la combinacion de AAAAA00000 a ZZZZZ99999 (no en el orden tipico).

Código
  1. #include <stdio.h>
  2.  
  3. #define NUM 5 //numero de letras
  4.  
  5. void cambiar_letras(char* letras, int* pos);
  6.  
  7. int main(int argc, char** argv)
  8. {
  9. FILE *fd;
  10. char letras[]="AAAAA";
  11. int posLet=0, i;
  12.  
  13. fd=fopen("diccionario.txt", "w");
  14.  
  15. while (posLet < NUM)
  16. {
  17. for (i=0; i<100000; i++)
  18. fprintf(fd, "%s%.5d\n", letras, i);
  19.  
  20. cambiar_letras(letras, &posLet);
  21. }
  22.  
  23. fclose(fd);
  24. return 0;
  25. }
  26.  
  27. void cambiar_letras(char* letras, int* pos)
  28. {
  29. int i;
  30.  
  31. for (i=0; i<=*pos && *pos<=NUM; i++)
  32. {
  33. if (letras[i] < 'Z') {
  34. (letras[i])++;
  35. break;
  36. } else {
  37. letras[i]='A';
  38. if ( i==*pos && (letras[i+1]=='A' || letras[i+1]=='\0') )
  39. (*pos)++;
  40. }
  41. }
  42. }

pd. gracias DickGumshoe por el especificador de formato %.5d en los enteros, no tenia ni idea de que podia representarse el 1 como 00001.
425  Programación / Programación C/C++ / Re: como hacer un generador?? en: 13 Julio 2012, 06:11 am
una pregunta asi por curiosidad... cuanto os dura el programa ejecutandose y cuanto os ocupa el archivo generado?

lo pregunto porque yo para hacer esta combinacion mas corta "AAAA000 hasta ZZZZ9999" llevaba unos 20 minutos o mas y 35GB de archivo cuando le he dado a cancelar. no se si me he liado haciendo el programa o que...

gracias!
426  Programación / Programación C/C++ / Re: Operacion Suma (Vectores) !Duda! en: 11 Julio 2012, 20:55 pm
Citar
pero todavia la operacion que me pasas no resuelve la problematica, a ver si sumas un vector todo sale bien, pero si intentas simular la logistica de una calculadora se te rompe la caveza xDDD !!

explicame eso de la logistica de una calculadora porque no le veo la gracia.

si como has dicho he entendido el problema que tienes, entonces lo que te he dicho SI lo resuelve. lo que no hare sera darte el codigo, llevo 1 hora y media con esto y por la actitud que tienes creo que ya ha sido suficiente.

relee la explicacion que te he hecho arriba y una vez lo entiendas el codigo lo sacaras en 5 minutos. si tambien operas con numeros reales con decimales entonces tendras que cambiar algo, pero deberias poder sacarlo si, repito una vez mas, entiendes lo que te he explicado.

un saludo y suerte
427  Programación / Programación C/C++ / Re: Operacion Suma (Vectores) !Duda! en: 11 Julio 2012, 20:30 pm
quizas soy yo el que esta un poco espeso hoy pero es que si no es lo que te he dicho antes no acabo de entenderlo. podrias poner un ejemplo claro del problema?

con el codigo que has puesto, si un usuario pica los botones: 1, 5, 2, +, 1, 4

entonces tu tendrias esto en ese momento: vector1=[1,5,2], vector2=[1,4]

hasta aqui si? si no es asi, dime como es porque entonces no entiendo lo que pides.

si hasta aqui es asi, entonces tienes que aplicar lo que te he dicho antes:

numero1= 1*10^2 + 5*10^1 + 2*10^0 = 100 + 50 + 2 = 152
numero2= 1*10^1 + 4*10^0 = 10 + 4 = 14
suma=numero1+numero2

la funcion que te pase del vector al numero en decimal se implementa con un sencillo for usando las funciones exponencial tuya o de la biblioteca math y luego otra funcion que te diga el numero de posiciones que tiene un vector dado.
428  Programación / Programación C/C++ / Re: [Duda]Configurar un servidor de conexion inversa. en: 11 Julio 2012, 20:23 pm
ah vale ahora he entendido y antes se me cruzo con lo de la variable xd

para lo primero, pues si yo usaria lo del NoIP, y una vez establezcas conexion siempre puedes editar tu programa (por si te cambias el nombre del NoIP) y pasarselo de nuevo borrando el anterior.

lo de cambiar el valor permanentemente de un programa pues ni idea de como hacerlo sin archivos de configuracion... aunque bueno siempre puedes usar un archivo oculto para ello. el 90% de la gente normal no sabe que existen archivos que no se ven en el explorador de carpetas.

me quedo atento a ver si alguien sabe modificar un valor de un programa permanentemente. un saludo!
429  Programación / Programación C/C++ / Re: Operacion Suma (Vectores) !Duda! en: 11 Julio 2012, 20:15 pm
has leido mi respuesta? porque yo creo que no.
430  Programación / Programación C/C++ / Re: Operacion Suma (Vectores) !Duda! en: 11 Julio 2012, 20:01 pm
imagina que tu tienes el numero en base decimal 123 escrito como un vector de la siguiente manera: vector=[1,2,3]

si quieres pasar del vector a un numero normal, lo que tienes que hacer es multiplicar cada termino del vector por 10 (ya que esta en base decimal) elevado a la posicion que ocupa ese termino en el vector.

en este caso: numero= 1*10^2 + 2*10^1 + 3*10^0 = 100+20+3 = 123

no se explicarme mejor, pero es el mismo sistema que se usa para pasar un numero en base binaria a uno decimal. en este caso, al ser base binaria, en vez de 10 se usa el 2 eleveado a la posicion que ocupe el digito. por ejemplo:

1010 en binario: 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 8+2 = 10 en decimal

edito: solo para decir que es que directamente el sistema numerico es asi. en un numero cualquiera, por ejemplo el 123, el 3 ocupa la posicion de las unidades (del 0 al 9), el 2 el de las decenas (del 0*10 al 9*10), y el 1 el de las centenas (del 0*10^2 al 9*10^2). asi que es esto, pero aplicado a un numero mayor como es tu caso. espero que me haya explicado, un saludo
Páginas: 1 ... 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [43] 44 45 46 47 48 49 50 51
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines