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 Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
91  Programación / Programación C/C++ / Re: Problema con ciclos (ejercicio de pi) en: 29 Marzo 2014, 17:48 pm
Bueno, reconociendo el término general de la sumatoria (algo que siempre es bueno hacer):

  4 * (-1)^n
--------------
  2 * (n - 1)

para n desde 1 hasta infinito (o hasta el máximo N impuesto por el usuario), quedaría el código siguiente donde la idea (debida a leosansan en un post similar) de usar una bandera de signo que conmute de +1 a -1 en cada iteración nos evita tener que estar viendo si n es par o impar, quedaría:
Código
  1. int main()
  2. {
  3.   double numero;
  4.   int n, N;
  5.   int signo;
  6.  
  7.   cout << "numero de terminos: ";
  8.   cin >> N;
  9.   cout << endl;
  10.  
  11.   numero = 4;
  12.   signo = -1;
  13.   for ( n = 1; n <= N; i++, signo*=-1 ) {
  14.      cout << "a[" << i << "] = " << numero << endl;
  15.      numero += signo * 4. / (2*n + 1);
  16.   }
  17.  
  18.   return 0;
  19. }
  20.  

donde el punto en "4." obliga la división entre doubles en lugar de enteros (gracias de nuevo por la acotación leosansan).
92  Programación / Programación C/C++ / Re: [DUDA] Función mayúscula a minúscula y viceversa en: 29 Marzo 2014, 17:11 pm
¡Hoy amaneció entretenido el foro, muchas dudas, jeje! Ahora mis observaciones. En primer lugar, el uso de getch() (en sistemas Windows) requiere la cabecera <conio.h>

En cuánto a la función de pedir dato, no requieres una cadena auxiliar s [que por cierto en tal caso debería ser declarada como char * y no char], pues gets() debe depositar su dato directamente el frase:

Código
  1. void pedir_datos (char frase[])
  2. {
  3.    printf("Introduce una frase: \n");
  4.    gets(frase);
  5. }

Debes tener cuidado porque en el main(), el arreglo frase debe tener la longitud suficiente para contener cualquier cadena que introduzca el usuario, de lo contrario ocurriría un desbordamiento de memoria. En tu caso, al haber declarado con longitud de 100 creo que está bien (aunque hay maneras más seguras de hacerlo pero no voy a distraerte el tema con eso).

La función toUpperCase() recorre la cadena, restando 32 al código ASCII de cada carácter encontrado, así pasa de minúscula a mayúscula. Una alternativa es usar la función de biblioteca toupper(c), que pasa el carácter c a mayúsculas (requiere la cabecera <ctype.h>). Por cierto, declara el tipo de s en tu código como char * (apuntador a carácter), e inicialízalo al primer caraćter de la cadena. Si no lo inicializas, el compilador tomará un valor por defecto, generalmente cero, y por eso falla tu programa:
Código
  1. void toUpperCase(char frase[])
  2. {
  3.   char * s = frase;
  4.   for( ; *s!='\0'; s++)
  5.      if( *s >= 'a' && *s <= 'z')
  6.         *s -= (char)32;
  7. }

Te explico: s es un apuntador a carácter, o lo que es lo mismo, una cadena en C. Ojo, que s no es el valor del carácter sino un apuntador al mismo. El valor de la letra sería *s. Por eso cambiamos s por *s en tu código, y tras la inspección de cada letra incrementa el apuntador para que "apunte" a la siguiente letra de la cadena. Por eso es ++s (y no ++*s, se incrementa el apuntador, no el valor apuntado, era otro error que tenías). La función de minúsculas quedaría similar:
Código
  1. void toLowerCase(char frase[])
  2. {
  3.   char * s = frase;
  4.   for( ; *s!='\0'; s++)
  5.      if( *s >= 'A' && *s <= 'Z')
  6.         *s += (char)32;
  7. }

Como aditamento (nunca está de más una segunda opción, jeje), una forma de hacer lo mismo con la función de biblioteca toupper() sería:
Código
  1. void toUpperCase(char frase[])
  2. {
  3.   char * s = frase;
  4.   for( ; *s!='\0'; s++)
  5.      *s = toupper( *s );
  6. }

La salida, en cualquier caso, es la misma:
Código:
Introduce una frase: 
holA Mundo
Frase original: holA Mundo
holA Mundo
Mayuscula: HOLA MUNDO
Minuscula: hola mundo
93  Sistemas Operativos / GNU/Linux / Re: Arrancar con gnome por defecto en lugar de kde en: 29 Marzo 2014, 16:42 pm
Hola a todos. Bueno comienzo diciendo que la solución al final fue simple, desinstalar el kdm (igual no lo pienso utilizar, entonces es mejor que ese paquete no ocupe espacio en mi computador):

sudo apt-get purge kdm

Usé la opción purge porque a diferencia de remove, no sólo borra el paquete sino también sus archivos de configuración. Y lo hace de forma totalmente controlada por apt-get, por lo que debe ser más seguro que si lo hiciera yo manualmente.

Al iniciar, como no encontró kdm, inicia por defecto con gnome que es lo que quiero.

Cuidado con la opción autoremove, porque él elige automáticamente qué paquetes desinstalar, una vez lo usé y me borró un montón de paquetes que luego tuve que restaurar, jeje.

Respecto a elegir cerrar sesión y poder seleccionar con qué escritorio arrancar, lo hice pero no encontré tal ícono  :(. Tal parece que depende mucho de la distro y versión, en mi caso Ubuntu 10.04, algo anticuada pero menos pesada que las más recientes, y además me funciona perfecto porque es prácticamente del mismo año que la compu.

Publico la solución encontrada a efectos que le pueda servir a alguien más con el mismo problema, y un saludo para todos !!!  :D
94  Programación / Programación C/C++ / Re: Promoción de los parámetros numéricos pasados a función ? en: 28 Marzo 2014, 09:44 am
Las promociones, en caso de funciones con número variable de argumentos, serían entonces:

* char, unsigned char, short, unsigned short, pasan a int
* float pasa a double

¿sólo esas?
95  Programación / Programación C/C++ / Promoción de los parámetros numéricos pasados a función ? en: 27 Marzo 2014, 19:03 pm
Leyendo en internet encontré la cita:

Citar
Cuidado con los tipos. Tengan en cuenta que por defecto C hace promoción de los parámetros pasados, así, si pasan un float, este será promovido a double y la sentencia va_arg(pa,float) será incorrecta. Lo mismo con shorts, etc. Normalmente el compilador nos avisará de esto.

El tema se refiere a funciones con número variable argumentos, donde lógicamente debemos avisar a la macro va_arg sobre el tipo esperado del siguiente argumento de la función. La verdad nunca antes había leído de ésto, pero según entiendo de la cita si se pasa un float a la función, de alguna manera promueve el argumento a double, i.e., reserva en la pila de argumentos, en el lugar asignado para el mismo, el espacio que ocupa un double en lugar del espacio que ocupa un float. En este caso desreferenciar el argumento (usando va_arg) como float dará un error, como es de suponer.

Tengo dos inquietudes: (1) ¿Cuándo ocurren dichas "promociones", y cómo podemos hacer entonces para trabajar de manera segura?

(2) Se me ocurre que una forma de controlar dichas promociones es hacer cast explícito de los argumentos pasados, ejemplo: f( (float) x, (float) y ), así invocará la función reservando en la pila de argumentos el espacio justo para argumentos de tipo float. ¿Es correcto?
96  Programación / Programación C/C++ / Re: Problemas con arrays C++ en: 26 Marzo 2014, 15:35 pm
Si el autor del post viene de programar PHP sería mucho mejor atenerse a las clases de alto nivel de C++ (sencillas y potentes), que programar en el "rudimentario" (pero elemental y eficiente) nivel de C. ¿no?

Para programar en C, y sobre todo con arrays y cadenas, debes tener muy en cuenta aspectos de hardware para elaborar código eficiente. Mientras las clases de C++ abstraen la capa de hardware, manteniendo al programador en un nivel como "virtual" diría yo, independiente casi por completo de los aspectos máquina.

Lo mejor sería la clase vector sobre el tipo string, es lo que más se parece a la manera de trabajar PHP, javascript, Java y similares.
97  Programación / Programación C/C++ / Re: Pasar un archivo texto a binario. (Solucionado) en: 26 Marzo 2014, 15:19 pm
Mmmm, ¿"binary_write"? ¿No es lo mismo que:

fwrite( &campo, sizeof(tipo_del_dato_en_el_campo), 1, fPtr );

?
98  Programación / Programación C/C++ / Re: Alinear texto (Solucionado) en: 26 Marzo 2014, 15:16 pm
Ahora sí lo entiendo mucho más fácilmente  :), está más "despejadito". Mira, pero si acortas el código a fuerza de usar el operador ternario estás haciendo "trampa", jajaja. En esencia es el mismo if, pero escrito más brevemente  :rolleyes:

O sea, produce prácticamente el mismo ejecutable, sólo se reduce el fuente. Es lo mismo que yo cambiara

a = 1;
b = 2;
c = 3;

por

a = 1; b = 2; c = 3;

(jajaja)

Por otra parte lo de "%-*s" está genial.
99  Programación / Programación C/C++ / Re: c++ matrices[3][4] en: 25 Marzo 2014, 19:34 pm
Y no tienes que inventar tantos nombres de índices, i, j, b, c, f, etc. Puedes usar siempre los mismos nombres i, j, y el programa queda más sencillo:
Código
  1. int main ()
  2. {
  3.    int mata[3][4];
  4.    int matb[3][4];
  5.    int res[3][4];
  6.    int i, j;
  7.  
  8. for (i=0; i<3; i++){
  9. for (j=0; j<4; j++)
  10. { cout<<"Matriz A["<<i<<"]["<<j<<"] = "; cin>> mata[i][j]; }
  11. }
  12.  
  13. for (i=0; i<3; i++){
  14. for (j=0; j<4; j++)
  15. { cout<<"Matriz j["<<i<<"]["<<j<<"] = "; cin>> matb[i][j]; }
  16. }
  17.  
  18. for (i=0; i<3; i++) {
  19. for (j=0; j<4; j++) {
  20. res[i][j]= mata[i][j] + matb[i][j];
  21.  
  22. cout<< "Resultado Suma matrices: " <<"["<< i <<"]["<<j<<"]: "<< res[i][j]<<endl;
  23. }
  24. }
  25. getchar();
  26. return 0;
  27. }

o si prefieres definir los contadores como locales del ciclo:
Código
  1. int main ()
  2. {
  3.    int mata[3][4];
  4.    int matb[3][4];
  5.    int res[3][4];
  6.  
  7. for (int i=0; i<3; i++){
  8. for (int j=0; j<4; j++)
  9. { cout<<"Matriz A["<<i<<"]["<<j<<"] = "; cin>> mata[i][j]; }
  10. }
  11.  
  12. for (int i=0; i<3; i++){
  13. for (int j=0; j<4; j++)
  14. { cout<<"Matriz j["<<i<<"]["<<j<<"] = "; cin>> matb[i][j]; }
  15. }
  16.  
  17. for (int i=0; i<3; i++) {
  18. for (int j=0; j<4; j++) {
  19. res[i][j]= mata[i][j] + matb[i][j];
  20.  
  21. cout<< "Resultado Suma matrices: " <<"["<< i <<"]["<<j<<"]: "<< res[i][j]<<endl;
  22. }
  23. }
  24. getchar();
  25. return 0;
  26. }

En este caso preferiría el primer método porque ciertamente usarás las variables i,j a lo largo de todo el código. Recomendaría también usar getchar() en lugar de system("PAUSE") por las razones que ha sido explicadas muchas veces en el foro, jeje.
100  Programación / Programación C/C++ / Re: Proyecto calculadora: Convertir infijo a posfijo. en: 25 Marzo 2014, 19:21 pm
Por cierto, y un comentario fuera de lugar, ¿por qué no compartes en el foro algún algoritmo de esteganografía de ficheros elaborado en/para C? Con teoría básica de cómo funciona, etc.

¿o ya lo has hecho?
Páginas: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines