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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 26
41  Programación / Programación C/C++ / Re: indicar cual es el numero mas grande y pequeño en: 5 Enero 2015, 02:00 am
Hola mort. La mayoría de los libros usa la estrcutura for, tratándose de una cantidad general de "n" números. Pero si sólo son tres, puede calcularse de forma más "primitiva" con if.

Por supuesto, eso no sería práctico para más de tres números, pero al fin y al cabo el propósito de este ejercicio es netamente pedagógico, la idea es que practiques para ganar destreza.
42  Programación / Programación C/C++ / Re: Raíz cuadrada inversa rápida en C++ en: 5 Enero 2015, 01:43 am
¡¡ Interesante !! Eso sí que no lo sabía. Que considerar el float como long produce el logaritmo natural, y lo puesto supongo que produce el exp. Y lo demás ya es sencillo, como sabemos

x^(-1/2) = exp( -1/2 * log(x) )


Tengo que pensar en alguna palicación que se me ocurra utlizando este algoritmo.

Yo particularmente lo que conocía es la fórmula iterativa "de Newton", para calcular la raíz cuadrada de un número "a":

x_(n+1) = (1/2) * ( x_n  + a/x_n )

donde, en la medida que "n" se hace más grande, el valor x_n tiende a sqrt(a).
43  Programación / Programación C/C++ / Re: problema con el especificador de conversion %d en c en: 4 Enero 2015, 02:58 am
Sí, publica el código completo porque la verdad todo está bien, no tendría por qué arrojar un error  :huh:
44  Programación / Programación C/C++ / Re: Raíz cuadrada inversa rápida en C++ en: 4 Enero 2015, 02:57 am
Mmmmm,

Estuve revisando el link y cuenta la historia del asunto, es la verdad muy interesante.

Pero luego te muestra un código fuente que implementa el algoritmo de raíz cuadrada rápida, pero no entiendo que ¡¡Wtf!! es lo que hace ....  :huh:
45  Programación / Programación C/C++ / Re: Ejercicio de monedas en: 4 Enero 2015, 02:51 am
Bueno, tengo una idea más o menos parecida.

Comparas las dos primeras. Si son distintas entonces una de ellas es "igual" a todas las demás, y la otra es la "distinta". Para dilucidar, debes revisar el tercer valor.

Si las dos primeras son iguales, pues buscas de la 3ra en adelante la primera que sea distinta y ya.

Ojo, sólo funcionará si el array tiene los valores correctamente: todos iguales y uno desigual.

Código
  1. int distinto( int *x, int N) {
  2.  
  3. int i;
  4.  
  5. if ( N < 3 ) return -1;
  6.  
  7. if ( x[0] == x[1] ) { /* los dos primeros iguales */
  8. /* repetir desde el tercero en adelante, mientras
  9. * sea igual al primero */
  10. for ( i = 2; i < N && x[i] == x[0]; i++ )
  11. ;
  12. if ( i < N )
  13. return x[i] > x[0] ? i: -i;
  14. else
  15. return -1;
  16. }
  17. else /* los dos primeros distintos, revisar el tercero */
  18. if ( x[0] == x[2] )
  19. return x[1] > x[0] ? 1 : -1;
  20. else
  21. return 0;
  22. }

Esta función la acabo de probar y me funcionó bien en todas las combinaciones.

OBSERVACIONES: (1) Si el distinto es el primero, devuelve el índice cero (no tiene signo). De otro modo, devuelve + o - según el caso.
(2) Si todos los elementos son iguales, o tiene menos de tres elementos, devuelve -1 (condición de error, jeje).
46  Programación / Programación C/C++ / Re: [Solucionado] Parametros desde consola en: 4 Enero 2015, 02:31 am
 ;-) ;-) ;-) Por nada amigo.

Por cierto, esa sintaxis que definiste "test -pass xyz" con el guión antes de la opción se parece a la típica de los comandos de UNIX y derivados. En Windows creo que es más usual el "/" (o sea "/pass" )

Visto que es así, y por lo visto tienes un alma inquieta y ávida de programación, ¿no has pensado en explorar Linux?
47  Programación / Programación C/C++ / Re: Array de estructuras + funciones en: 4 Enero 2015, 02:25 am
maikelowen ...

Eso de "una función que devuelva un array" (un array de cualquier cosa) es delicado en C. Recuerda que las variables que se declaren dentro del cuerpo de una función son locales, es decir, se destruyen al terminar la ejecución de la función, y por lo tando sus valores quedan indefinidos. Esto es, dichos valores pueden conservarse o no, es algo impredecible.

Si vas a construir una función cuyo propósito sea actualizar los valores de los elementos de un array, dicho array ha de ser declarado FUERA de la función. Por ejemplo, sea un código que actualice por teclado los valores de un array de tres elementos. Tal  vez pienses en algo como

Código
  1. int * f ( void );
  2.  
  3. int main() {
  4.  
  5. /* tomar tres valores desde el teclado */
  6. int *x = f();
  7.  
  8. /* imprimir */
  9. cout << "Los numeros son: " << x[0] << ", " << x[1] << ", " << x[2] << endl << endl;
  10.  
  11. return 0;
  12. }
  13.  
  14. /* Lee tres valores enteros del teclado, y los almacena  en vector */
  15. int * f ( void ) {
  16.  
  17. int x[3];
  18.  
  19. cout << "1er numero: ";
  20. cin >> x[0];
  21.  
  22. cout << "2do numero: ";
  23. cin >> x[1];
  24.  
  25. cout << "3er numero: ";
  26. cin >> x[2];
  27.  
  28. cin.ignore();
  29.  
  30. return x;
  31. }

Pues, dicho código es incorrecto y de hecho el compilador podría informarte al respecto con un mensaje como "'warning: address of local variable ‘x’ returned", indicándote que estás devolviendo una variable local como retorno de la función.

Puede que este código funcione bien, o puede que no.  Es lo que llamamos una técnica de programación potencialmente peligrosa. Algo más apropiado sería:

Código
  1. void f( int * );
  2.  
  3. int main() {
  4.  
  5. /* tomar tres valores desde el teclado */
  6. int x[3];
  7.  
  8. f(x);
  9.  
  10. /* imprimir */
  11. cout << "Los numeros son: " << x[0] << ", " << x[1] << ", " << x[2] << endl << endl;
  12.  
  13. return 0;
  14. }
  15.  
  16. /* Lee tres valores enteros del teclado, y almacena  en vector */
  17. void f ( int *x ) {
  18.  
  19. cout << "1er numero: ";
  20. cin >> x[0];
  21.  
  22. cout << "2do numero: ";
  23. cin >> x[1];
  24.  
  25. cout << "3er numero: ";
  26. cin >> x[2];
  27.  
  28. cin.ignore();
  29. }

donde declarar el array x FUERA de la función f, y entonces invocas a f(x) con el nombre del array como argumento de entrada, y no como valor de retorno.

Parece extraño que si la función devuelve el array actualizado, entonces dicho array deba pasarse como argumento de ENTRADA, en lugar de devolverse como SALIDA ¡¡¡Pero así es C   :-\!!!, y la razón es que los arrays son técnicamente apuntadores a una zona de memoria que contiene ciertos datos, en lugar de ser objetos abstractos como en la P.O.O.

En lenguajes de programación orientados a objeto, como MATLAB, sí es permitido tener entidades de objeto como valores de retorno de una función. Tal vez este comportamiento se puede emular en C++ mediante referencias a objeto, pero ese sería otro tema.

============================================================================
Es posible poner a la función a devolver un array "a juro", indicando que devuelva una copia de su propio argumento como valor de retorno (ojo que es una copia de su argumento, no el mismo argumento como tal). Pero eso sería algo redundante, por ejemplo:

Código
  1. int * f( int * );
  2.  
  3. int main() {
  4.  
  5. /* tomar tres valores desde el teclado */
  6. int x[3];
  7. int * y;
  8.  
  9. y = f(x);
  10.  
  11. /* imprimir */
  12. cout << "Los numeros son: " << x[0] << ", " << x[1] << ", " << x[2] << endl << endl;
  13.  
  14. return 0;
  15. }
  16.  
  17. /* Lee tres valores enteros del teclado, y almacena  en vector */
  18. int * f ( int *x ) {
  19.  
  20. cout << "1er numero: ";
  21. cin >> x[0];
  22.  
  23. cout << "2do numero: ";
  24. cin >> x[1];
  25.  
  26. cout << "3er numero: ";
  27. cin >> x[2];
  28.  
  29. cin.ignore();
  30.  
  31. return x;
  32. }

Funciona igual que antes, sólo que ahora devuelve una copia de x como retorno. Ahora, ¿qué sentido tiene tener en main() dos array's, uno x, y otro y, para tener el segundo como copia del primero?
Es lo que te hizo Blaster cuando definió en el main() los arreglos datos e info, ambos serán la misma cosa luego de llamar la función invocarPersonas(), entonces bastaba dejar sólo el primero.
48  Programación / Programación C/C++ / Re: [C] Llamar a un array de punteros a caracteres en un bucle. en: 4 Enero 2015, 01:46 am
Excelente por tu trabajo te felicito.

Sólo un detalle. ¿Te has preguntado por qué requieres dos getchar() para hacer la pausa al final del programa?
Con uno sólo no funciona  :-\

La razón es que
Código
  1. a = getchar();
descarta la tecla ENTER, y sólo almacena en la variable a el carácter introducido antes del mismo. Entonces dicho ENTER debe ser "limpiado", a eso llamamos limpiar el búfer de entrada. Usamos:
Código
  1. while ( getchar() != '\n' ) ; /* limpiar el bufer de entrada */
y listo ya puedes poner un único getchar() al final del programa para producir la pausa.

Es recomendable siempre "limpiar el búfer" tras un getchar(), un gets() o un scanf() pues estas funciones descartan el carácter de nueva línea.

49  Programación / Programación C/C++ / Re: Array de estructuras + funciones en: 3 Enero 2015, 00:34 am
Hola maikelowen

Eso que planteas no presenta ningún problema ya que en C/C++ el nombre de un arreglo no es más que un apuntador al tipo de dato almacenado en el arreglo. Así dicho tipo de dato sea una estructura. Lo comprenderás más plenamente al leer el tema "Apuntadores en C" en un buen libro de texto o alguna buena página web.

Te pongo un ejemplo. El programa siguiente pide al usuario los datos de 2 personas y los almacena en un arreglo de registros de personas. A continuación, y para verificar que los datos han sido guardados correctamente, los muestra en pantalla.

La primera función, pide los datos al usuario registrarPersonas() pide los datos por consola, y los almacena en un arreglo de struct's. La segunda función mostrarPersonas() recibe dicho arreglo como argumento (que como ya dije no es más que un apuntador al primer struct guardado en el vector), e imprime los datos de los primeros 2 elementos (personas) guardados.

Está codificado para C++, ya que vi que en tu código original incluiste la clase string. Si lo quieres estrictamente para C, házmelo saber.

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. struct persona {
  7. int edad;
  8. string nombre;
  9. };
  10.  
  11. void registrarPersonas( struct persona *, int );
  12. void mostrarPersonas( struct persona *, int );
  13.  
  14. int main () {
  15.  
  16. struct persona p[10];
  17.  
  18. /* registra 2 personas */
  19. registrarPersonas( p, 2 );
  20.  
  21. /* muestra los datos de las 2 personas */
  22. mostrarPersonas( p, 2);
  23.  
  24. return 0;
  25. }
  26.  
  27. /* Registra datos de N personas en el arreglo */
  28. void registrarPersonas( struct persona *p, int N ) {
  29.  
  30. int i;
  31.  
  32. for ( i = 0; i < N; i++ ) {
  33. cout << "Persona " << i+1 << ":" << endl;
  34. cout << "   " << "nombre: ";
  35. getline(cin, p[i].nombre );
  36.  
  37. cout << "   " << "edad: ";
  38. cin >> p[i].edad;
  39. cout << endl;
  40.  
  41. while ( cin.get() != '\n' ) ; /* limpiar buffer de entrada */
  42. }
  43. }
  44.  
  45. /* Imprime los datos de las primeras N personas en el arreglo */
  46. void mostrarPersonas( struct persona *p, int N ) {
  47.  
  48. int i;
  49.  
  50. cout << "Imprimiendo datos:" << endl << endl;
  51. for ( i = 0; i < N; i++ ) {
  52. cout << "Persona " << i+1 << ":" << endl;
  53. cout << "   " << "nombre: " << p[i].nombre << endl;
  54.  
  55. cout << "   " << "edad: " << p[i].edad << endl << endl;
  56. }
  57. }

Observa el resultado en la consola:


=========================================================
Persona 1:
   nombre: maria a
   edad: 14

Persona 2:
   nombre: jose e. p.
   edad: 31

Imprimiendo datos:

Persona 1:
   nombre: maria a
   edad: 14

Persona 2:
   nombre: jose e. p.
   edad: 31
=========================================================

50  Programación / Programación C/C++ / Re: [Ayuda] Parametros desde consola en: 2 Enero 2015, 23:43 pm
Excelente !!!  ;D
Páginas: 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 26
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines