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

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Temas
Páginas: 1 2 3 4 5 [6] 7 8 9 10
51  Programación / Programación C/C++ / Array de punteros a función <=> FLT_MIN - FLT_MAX [C] en: 7 Mayo 2016, 16:36 pm
Hola, gente.
Tengo un inconveniente en la validación para que no se supere el máximo y el mínimo que soporta el tipo float, en internet no encuentro nada relacionado y modifique el código muchas veces y nada, solo me deja ingresar números negativos.

Código
  1. #include <stdio.h>
  2. #include <float.h>
  3.  
  4. float suma( const float o1, const float o2 );
  5. float resta( const float o1, const float o2 );
  6. float division( const float o1, const float o2 );
  7. float multiplicacion( const float o1, const float o2 );
  8.  
  9.  
  10. int main( void ){
  11. float (*ptrf[]) ( float, float ) = {suma, resta, division, multiplicacion};
  12. int ok, ch, opc;
  13. float opeUno, opeDos, result;
  14.  
  15. printf( "\n ========== Calculadora ==========\n\n" );
  16.  
  17. do{
  18. printf("\n Introduzca el primer operando....:");
  19. ok = scanf("%g", &opeUno) == 1 && opeUno <= FLT_MIN && opeUno <= FLT_MAX;
  20. while ((ch = getchar()) != EOF && ch != '\n');
  21. }while(!ok);
  22.  
  23. do{
  24. printf("\n Introduzca el segundo operando...:");
  25. ok = scanf("%g", &opeDos) == 1 && opeDos <= FLT_MIN && opeDos <= FLT_MAX;
  26. while ((ch = getchar()) != EOF && ch != '\n');
  27. }while(!ok);
  28.  
  29. printf( "\n 1 - Suma \n 2 - Resta \n 3 - Divide \n 4 - Multiplica" );
  30. do{
  31. printf( "\n\n Ingrese una opcion...:" );
  32. ok = scanf("%d", &opc) == 1 && opc >= 1 && opc <= 4;
  33. while ((ch = getchar()) != EOF && ch != '\n');
  34. }while(!ok);
  35.  
  36. result = ( ptrf[opc-1] ) ( opeUno, opeDos );
  37.  
  38. printf( "\n El resultado es %g", result );
  39.  
  40. return 0;
  41. }
  42.  
  43.  
  44. float suma( const float o1, const float o2 ){
  45. return o1 + o2;
  46. }
  47.  
  48. float resta( const float o1, const float o2 ){
  49. return o1 - o2;
  50. }
  51.  
  52. float division( const float o1, const float o2 ){
  53. return o1 / o2;
  54. }
  55.  
  56. float multiplicacion( const float o1, const float o2 ){
  57. return o1 * o2;
  58. }

Saludos a todos y espero puedan ayudarme a encontrar la solución.-
52  Programación / Programación C/C++ / ¿Que es más eficiente, utilizar array o memoria dinámica? [C] en: 4 Mayo 2016, 20:03 pm
Hola a todos.
Copie el código de la siguiente página que me indico Eternal Idol, referente a realloc:
http://www.cplusplus.com/reference/cstdlib/realloc/

Y grande fue mi sorpresa cuando descubrí que utilizando memoria dinámica se podía hacer lo mismo que con un array, digo sorpresa porque considero haber leído bastante sobre punteros y en ninguno hace referencia a esto. -
Si esto es correcto, tengo 1 pregunta para hacerles. -
¿Que es más eficiente, utilizar array o memoria dinámica?, para el caso. -  

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4.  
  5. int main ( void ){
  6. size_t ingresos, n, contador = 0, ok, ch;
  7. int* numeros = NULL;
  8. int* mas_numeros = NULL;
  9.  
  10. do{
  11. do{
  12. printf("\n Ingresa un numero entero(maximo %d  => 0 finaliza )....: ", INT_MAX);
  13. ok = scanf("%u", &ingresos) == 1 && ingresos >= 0 && ingresos <= INT_MAX;
  14. while( (ch = getchar()) != EOF && ch != '\n' );
  15. if( ok == 0 ){
  16. printf( "\n El ingreso es incorrecto, intentelo nuevamente...\n\n\t Pulse una tecla para continuar..." ); getchar();
  17. }
  18. }while(!ok);
  19.  
  20. contador++;
  21.  
  22. mas_numeros = (int*)realloc( numeros, contador * sizeof(int) );
  23.  
  24. if( mas_numeros!=NULL ){
  25. numeros=mas_numeros;
  26. numeros[contador-1]=ingresos;
  27. }
  28. else{
  29. free( numeros );
  30. puts( "Error (re)allocating memory" );
  31. exit(1);
  32. }
  33. }while (ingresos!=0);
  34.  
  35. printf ("\n Numeros introducidos.....: ");
  36. for( n=0; n < contador - 1; n++ )
  37. printf( "%d ",numeros[n] );
  38.  
  39. free (numeros);
  40.  
  41. return 0;
  42. }

Es redundante decir que al código original le efectué bastante modificaciones, pero la esencia es la misma.

Saludos.
53  Programación / Programación C/C++ / [Solucionado] Liberar memoria de 2 punteros apuntando a la misma dirección(C) en: 3 Mayo 2016, 21:43 pm
Hola, gente. -
¿Es necesario liberar los 2 punteros por separado?, como lo hago en el código que dejo a continuación o es suficiente con liberar el puntero que devuelve malloc (tengo claro que malloc retorna un puntero void). -

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main( void ){
  6. char *string1, *string2;
  7. string1 = (char*) malloc(16);
  8. strcpy(string1, "0123456789AB");
  9.  
  10. string2 = realloc(string1, 8);
  11. printf("string1 Valor: %p [%s]\n", string1, string1);
  12. printf("string2 Valor: %p [%s]\n", string2, string2);
  13.  
  14.  
  15. free(string1);
  16. free(string2);
  17.  
  18. return 0;
  19. }

Bueno es todo, espero aclaración.
Un abrazo.
54  Programación / Programación C/C++ / Liberar memoria asignada con malloc, después de salir de la función [C]. en: 27 Abril 2016, 21:23 pm
Hola, gente.
Nuevamente con cositas que no puedo resolver consultando al amigo Google, de la manera como está planteado el programa ¿es imposible liberar la memoria asignada al puntero arr?, el manual aconseja que nunca se reserve memoria de esta manera, pero aunque sea para tener un conocimiento más, es realmente cierta mi pregunta. -

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int *asignar_Array(int size, int valor);
  5.  
  6. int main( void ){
  7. size_t i;
  8. int *vector = asignar_Array(5,45);
  9.  
  10. for( i=0; i<5; i++ ){
  11. printf("\n %d", vector[i]);
  12. }
  13.  
  14. free(vector);
  15.  
  16. return (EXIT_SUCCESS);
  17. }
  18.  
  19. int *asignar_Array(int size, int valor) {
  20. size_t i;
  21. int *arr = (int*)malloc( size * sizeof(int ));
  22.  
  23. for( i=0; i<size; i++ ) {
  24. arr[i] = valor;
  25. }
  26.  
  27. return arr;
  28. }


Saludos.
55  Programación / Programación C/C++ / Reemplazar la función free por una propia. en: 25 Abril 2016, 22:33 pm
Hola, gente.
Lo que me trae en este caso es una duda con la función free, con el libro que estoy estudiando punteros a cada instante remarca que la función free es insegura, no pongo aquí los argumento porque necesitaría 2 post, la pregunta es ¿por su experiencia consideran que esto es cierto?, debería utilizar la función que dejo a continuación o es esto una falacia. -

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define safeFree(p) saferFree((void**)&(p))
  5.  
  6. void saferFree(void **pp);
  7.  
  8. int main( void ){
  9. int *pi;
  10. pi = (int*) malloc(sizeof(int));
  11. *pi = 5;
  12.  
  13. printf("\n Antes.....: %p\n",pi);
  14.  
  15. safeFree(pi);
  16.  
  17. printf("\n Despues...: %p\n",pi);
  18.  
  19. safeFree(pi);
  20.  
  21. return (EXIT_SUCCESS);
  22.  
  23. }
  24.  
  25. void saferFree(void **pp) {
  26. if (pp != NULL && *pp != NULL) {
  27. free(*pp);
  28. *pp = NULL;
  29. }
  30. }

Saludos.
Daniel
56  Programación / Programación C/C++ / Averiguar valor de variable sin utilizar el identificador de la misma.[C] en: 22 Abril 2016, 23:51 pm
Hola gente.
Como veo que por allí MAFUS hizo un desafío, bueno esto es algo parecido solo que yo no tengo suficientes conocimientos para desafiar a nadie, la consulta es ¿conocen otra manera para logrear lo mismo?.-

Código
  1. #include<stdio.h>
  2.  
  3. int main( void ){
  4. int numero = 12345, i, b = 1, temp = 0, x;
  5.  
  6. for( i = 0; i < 32; i++ ){
  7. temp += numero & b;
  8. x = numero & b;
  9. if( x > 0 ) printf("\n bit encendido ==> [%2d] = %d", i, x);
  10. b <<= 1;
  11. }
  12.  
  13. printf( "\n\n La direccion de memoria %p contiene el valor %d\n\n", &numero, temp );
  14.  
  15. return 0;
  16. }

Cuando el número es positivo, el simple pero cuando es negativo se me complica un poco entenderlo.-
 



Saludos.
Daniel
57  Programación / Programación C/C++ / Punteros dobles / Punteros a puntero. en: 13 Abril 2016, 02:58 am
Hola, a todos.
Desearía  que alguien me ayude a entender la utilidad práctica de los punteros dobles, entiendo que una variable puntero apunta a la dirección de memoria donde está alojada una variable del mismo tipo, o sea su valor es la dirección de memoria de una variable común.-
Un puntero doble apunta a otro puntero, si bien mi descripción no es para escribir un libro pero es lo que hay.-
Por ahí leí que los punteros dobles se asemejan a los array de 2 dimensiones, es esto cierto y porque?.-
El manual con el que estoy estudiando punteros pone este ejemplo pero no tengo claro el beneficio en utilizar punteros dobles, el autor en este caso no da demasiadas explicaciones sobre el tema, no me cabe dudas que más adelante profundizara  sobre el particular pero me gustaría aprenderlo de Uds. El libro tiene más de 200 páginas dedicadas exclusivamente a punteros y de paso está en inglés.-

Código
  1. #include <stdio.h>
  2.  
  3. int main( void ){
  4. char *titles[] = {"A Tale of Two Cities",
  5. "Wuthering Heights","Don Quixote",
  6. "Odyssey","Moby-Dick","Hamlet",
  7. "Gulliver's Travels"};
  8.  
  9. char **bestBooks[3];
  10. char **englishBooks[4];
  11.  
  12. bestBooks[0] = &titles[0];
  13. bestBooks[1] = &titles[3];
  14. bestBooks[2] = &titles[5];
  15. englishBooks[0] = &titles[0];
  16. englishBooks[1] = &titles[1];
  17. englishBooks[2] = &titles[5];
  18. englishBooks[3] = &titles[6];
  19.  
  20. printf("%s\n\n",*englishBooks[1]); /*Wuthering Heights*/
  21.  
  22. return 0;
  23. }
   

Bueno es todo por el momento y desde ya muchas gracias.-
Daniel
58  Programación / Programación C/C++ / Medir velocidad de ejecución de un programa en lenguaje C.- en: 3 Abril 2016, 21:49 pm
Hola, gente.
Esta vez los molesto por poco, me podrían decir que tengo que agregar a mi código para medir el tiempo que tarda en ejecutarse, busqué en foros y lo que intené no funcionó. -
Es probable que me quieran dar un tirón de orejas por tratar de reinventar la rueda, pero créanme que es tan solo para practicar con punteros y de paso cotejarlo con el método de la burbuja y saber que es más rápido si un doble for o un bucle while. -

Código
  1. #include <stdio.h>
  2.  
  3. void ordenar(size_t *ptrV, size_t elementos);
  4. void mostrar(size_t *ptrV, size_t elementos);
  5.  
  6. int main( void ){
  7. size_t vector[] = {99, 8, 13, 6, 104, 40, 7, 2, 1}, *ptrV = vector;
  8. static size_t elementos = sizeof (vector) / sizeof (size_t);
  9.  
  10. ordenar(ptrV, elementos);
  11. mostrar(ptrV, elementos);
  12.  
  13. return 0;
  14. }
  15.  
  16. void ordenar(size_t *ptrV, size_t elementos){
  17. size_t i, tmp = 0;
  18.  
  19. while(1){
  20. if( *(ptrV+i) >  *(ptrV+(i+1)) ){
  21. tmp = *(ptrV+i);
  22. *(ptrV+i) = *(ptrV+(i+1));
  23. *(ptrV+(i+1)) = tmp;
  24. }
  25. if( i+1 == elementos ){
  26. if( tmp == 0) break;
  27. else{tmp = 0; i = -1;}
  28. }
  29. i++;
  30. }
  31. }
  32.  
  33. void mostrar(size_t *ptrV, size_t elementos){
  34. size_t i;
  35.  
  36. for( i = 0; i < elementos; i++ )
  37. printf( " %u", *(ptrV+i) );
  38. }

Desde ya muchas gracias. -

Saludo.
Daniel

59  Programación / Programación C/C++ / Pasar cifra numérica a letra en lenguaje C en: 28 Marzo 2016, 00:23 am
Hola, gente.
Tengo un error que por más que investigo no logro solucionar, hice un montón de pruebas como con la función printf para saber si accedía a la posición de memoria correcta y realmente en todos los casos imprimía la fila correcta y el contenido de la primer columna, pero siempre al acceder a esta parte del programa el mismo se cierra. -
Un favorcito más, si alguien conoce otra manera para lograr lo mismo le agradecería me dé alguna pista. - 


lineas 67 y 73
Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <windows.h>
  4.  
  5. int ingreso( int monto[] );
  6. void mostrar( int monto[], int contador );
  7.  
  8.  
  9. int main( void ){
  10. int monto[3], contador = 0;
  11.  
  12. contador = ingreso( monto );
  13. mostrar( monto, contador );
  14.  
  15. return 0;
  16. }
  17.  
  18. int ingreso( int monto[] ){
  19. int ch, ok, contador ;
  20.  
  21. do{
  22. system("cls||clear");
  23. ok = 1; contador = 0;
  24. printf("\n\n Ingrese monto del cheque (superior a \"0\" e inferior a \"1000\")....:" );
  25. while(( ch = getchar()) != '\n'){
  26. if( isdigit(ch) ){
  27. if( contador < 3 ){
  28. monto[contador] = ch - '0';
  29. contador++;
  30. }
  31. else{
  32. ok = 0;
  33. }
  34. }
  35. else{
  36. ok = 0;
  37. }
  38. }
  39. if( ok == 0 || monto[0] == '0'){
  40. printf( "\n Ingreso incorrecto...\n\n\tPulse <Enter> para intentarlo nuevamente..." );
  41. getchar();  
  42. ok = 0;
  43. }
  44. }while(!ok);
  45.  
  46. return contador;
  47. }
  48.  
  49. void mostrar( int monto[], int contador ){
  50. char  *unidades[] = { "", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve", "diez" },
  51.      *decenas[]  = { "veinte", "treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa" },
  52.  *centenas[] = { "", "Cien", "Doscientos", "Trescientos", "Cuatrociento", "Quinientos",
  53. "Seiscientos", "Setecientos", "Ochocientos", "Novecientos" },
  54.  *especiales[] = { "Diez", "Once", "Doce", "Trece", "Catorce", "Quince", "Dieciseis", "Diecisiete",
  55.  "Dieciocho", "Diecinueve", "Veinti" };
  56. int tmp;
  57.  
  58. if( contador == 1 ){
  59. printf( "\n %s", unidades[monto[0]] );
  60. }
  61.  
  62. if( contador == 2 ){
  63. tmp = monto[0]-2;
  64. if( monto[0] == 1)
  65. printf( "\n %s ", especiales[monto[1]] );
  66. else if( monto[1] == 0 ){
  67. decenas[tmp][0] = toupper(decenas[tmp][0]);  
  68. printf( "\n %s", decenas[monto[0]-2] );
  69. }
  70. else if( monto[0] == 2 && monto[1] > 0 )
  71. printf( "\n %s%s", especiales[10], unidades[monto[1]] );
  72. else{
  73. decenas[tmp][0] = toupper(decenas[tmp][0]);  
  74. printf( "\n %s y %s", decenas[monto[0]-2], unidades[monto[1]] );
  75. }
  76. }
  77.  
  78. if( contador == 3 ){
  79. printf( "\n %s ", centenas[monto[0]] );
  80. if( monto[1] == 0 )
  81. printf( "%s", unidades[monto[2]] );
  82. else if( monto[1] == 1 )
  83. printf( "%s", especiales[monto[2]] );
  84. else
  85. printf( "%s y %s", decenas[monto[1]-2], unidades[monto[2]] );
  86. }
  87. }
  88.  
  89.  
  90. /*
  91. Ejercicio 6-1. Escriba un programa que solicite un número entero positivo menor que 1000
  92. y a continuación, cree y genere un valor de tipo string que es el valor del entero en palabras.
  93. Por ejemplo, si 941 es introducido, el programa creará la cadena "Novecientos cuarenta y uno".
  94. */

Saludos.
Daniel
60  Programación / Programación C/C++ / Comportamiento de la función fgets(lenguaje C). en: 23 Marzo 2016, 05:02 am
Hola.

Código
  1. fgets( word[i], MAX_COL , stdin );
  2.  
  3. if((p=strchr(word[i], '\n'))){
  4. *p='\0';
  5. }
  6. else{
  7. while((ch = getchar()) !='\n' && ch!=EOF);
  8. word[i][MAX_COL] = '\0';
  9. }


En este trozo de código está mi gran duda, según lo que tengo leído es que si ingreso menos caracteres que  MAX_COL fgets los guarda desde el buffer de teclado en la variable indicada, en este caso word y también el carácter de nueva línea (\n) que se produce al apretar < Enter >, la primera duda, ¿es estrictamente necesario remplazar el carácter \n por \0? -
En el caso de ingresar más caracteres del establecido por MAX_COL fgets lee  MAX_COL – 1 y en la última casilla de memoria asignada a MAX_COL copia el carácter \n, de ser esto cierto la otra duda es:  ¿la sentencia else no se ejecuta nunca en este caso, o estoy equivocado?

Es todo y desde ya muchas gracias por el tiempo que le dediquen al tema,-

Saludos.
Daniel

Páginas: 1 2 3 4 5 [6] 7 8 9 10
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines