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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  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 52 53 54 55 56 57 58 ... 160
421  Programación / Programación C/C++ / Re: What's the value of i++ + i++? Bjarne Stroustrup F.A.Q. en: 20 Marzo 2014, 02:51 am
Una expresión como esta:
Código
  1. a[i] = i++;
Tiene un resultado indefinido, explicando por partes:

1) Los puntos de secuencia. Salvo los operadores '&&', '||', ',' y '?:' el siguiente punto de secuencia se indica por el terminador de sentencia ';'. Un ejemplo:
Código
  1. alguna_expresion (1); /* (1)  marca el siguiente punto de secuencia */

2) Todo efecto lateral (por ejemplo el generado por los operadores unarios ++ y --) se aplicara en algún momento antes del siguiente punto de secuencia.

3) Dada la mentada expresión:
Código
  1. a[i] = i++;
  2. (1)  (2)
Y considerando lo anterior esta puede ser evaluada en cualquiera de las siguientes formas:

* La expresión (2) se evalúa primero, a continuación aplica el efecto lateral y por ultimo se evalúa (1).
* La expresión (2) se evalúa primero, a continuación se evalúa (1) y por ultimo aplica el efecto lateral.
* La expresión (1) se evalúa primero, a continuación se evalúa (2) y por ultimo aplica el efecto lateral.

Cualquiera que suceda es valida (y por ello la recomendación de evitar expresiones cuyo resultado es indefinido).

----

Otra historia son expresiones del tipo:
Código
  1. i = i++;
Estas son ilegales ya que se modifica un objeto (en este caso la variable "i") en mas de una ocasión entre puntos de secuencia (la asignación mas el efecto lateral).

Un saludo
422  Programación / Programación C/C++ / Re: Operadores a nivel de bits (lenguaje C). en: 16 Marzo 2014, 16:20 pm
Un problema con ese programa es asumir que el tipo unsigned int esta constituido por 32 bits (si son mas el resultado es incorrecto, si son menos el programa reventara por el desplazamiento).

Si son menos, el programa no revienta, simplemente se pierden los bits
No (por el desplazamiento). Para explicarlo mejor considerando que el numero de iteraciones y el desplazamiento esta dado por "magic numbers":
Código
  1. unsigned despliegaMascara = 1 << 31;
  2.  
  3. /* ... */
  4.  
  5. for(c = 1; c <= 32; c++) ...

Si el numero de bits del tipo unsigned int es:
A) Mayor (por ejemplo 64) entonces solo se procesa una parte de los bits.
B) Menor (por ejemplo 16) entonces el desplazamiento "1 << 31" causara que el programa reviente ya que el segundo operando debe ser mayor que cero y menor que el numero de bits del objeto.

Un saludo
423  Programación / Programación C/C++ / Re: Operadores a nivel de bits (lenguaje C). en: 16 Marzo 2014, 15:10 pm
Un problema con ese programa es asumir que el tipo unsigned int esta constituido por 32 bits (si son mas el resultado es incorrecto, si son menos el programa reventara por el desplazamiento).

Una mejor aproximación consiste en utilizar el operador sizeof para obtener el numero de bytes y la macro CHAR_BIT para el numero de bits:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4.  
  5. void imprimir(unsigned num);
  6.  
  7. int main(void)
  8. {
  9.   unsigned num;
  10.  
  11.   printf("Introduce un entero no negativo: ");
  12.   fflush(stdout);
  13.   if (scanf("%u", &num) != 1)
  14.      return EXIT_FAILURE;
  15.  
  16.   imprimir(num);
  17.  
  18.   return EXIT_SUCCESS;
  19. }
  20.  
  21. void imprimir(unsigned num)
  22. {
  23.   unsigned msb = 1U << sizeof(unsigned) * CHAR_BIT - 1;
  24.   size_t i;
  25.   size_t j;
  26.  
  27.   for (i = 0; i < sizeof(unsigned); i++){
  28.      for (j = 0; j < CHAR_BIT; j++){
  29.         putchar(num & msb ? '1' : '0');
  30.         msb >>= 1;
  31.      }
  32.  
  33.      putchar(' ');
  34.   }
  35.   putchar('\n');
  36. }

Un saludo
424  Programación / Programación C/C++ / Re: [C] Estructuras en: 16 Marzo 2014, 14:29 pm
Los errores que mencionas se generan porque tratas de utilizar los alias (solo necesitas uno) como si fueran nombres de variables.

Debe ser:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. /* 1) Se declara el tipo y su nombre alternativo (alias) */
  6. struct coordenada {
  7.   int x;
  8.   int y;
  9. };
  10. typedef struct coordenada coord;
  11.  
  12. int main(void)
  13. {
  14.   /* 2) Se declaran las variables necesarias */
  15.   coord a;
  16.   coord b;
  17.  
  18.   /* 3) Lectura de datos */
  19.   puts("Introduce la coordenada x1:");
  20.   scanf("%d", &a.x);
  21.   puts("Introduce la coordenada y1:");
  22.   scanf("%d", &a.y);
  23.  
  24.   puts("Introduce la coordenada x2:");
  25.   scanf("%d", &b.x);
  26.   puts("Introduce la coordenada y2:");
  27.   scanf("%d", &b.y);
  28.  
  29.   /* Calculo de la hipotenusa */
  30.  
  31.   return EXIT_SUCCESS;
  32. }

Y si vas a imprimir en la salida estándar una cadena literal terminada en '\n' utiliza la función puts en lugar de printf. Por ultimo evita el uso de fflush(stdin), las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
425  Programación / Programación C/C++ / Re: Ayuda con programa en: 16 Marzo 2014, 14:18 pm
Me lo dejé aposta, si le pongo el const no puedo aumentar el puntero
Se puede calificar con const el tipo del segundo parámetro:
Código
  1. char coincidencia(const char letra, const char *diccionario) ...
  2.  
  3. /* O bien */
  4. char coincidencia(const char letra, char const *diccionario) ...
Ya que ello afecta al objeto apuntado.

Supongo estabas pensando en "char * const diccionario" donde el calificador si es un problema.

Un saludo
426  Programación / Programación C/C++ / Re: [C] Estructuras en: 15 Marzo 2014, 17:05 pm
Obtienes los dos puntos de alguna forma, a continuacion obtienes la hipotenusa del triangulo rectangulo con:
Código
  1. hipotenusa = sqrt(x * x + y * y);

Un saludo
427  Programación / Programación C/C++ / Re: Contadores en c++ en: 14 Marzo 2014, 15:04 pm
lo que pasa  y sucede  es que no tengo  la menor  idea de como imprimir los datos  de salida  de  manera  horizontal  e intentado  todo. Dejare  la codificacion para ver  como lo hago.
Para imprimir las tablas en columnas en vez de filas solo tienes que invertir los bucles e imprimir un avance de linea después del bucle interno. Se deben cambiar a:
Código
  1. for (x = 1; x <= 10; x++){
  2.   for (y = ti; y <= tf; y++){
  3.      res = y * x;
  4.      cout << " " << y << "*" << x << "=" << res;
  5.   }
  6.  
  7.   cout << endl;
  8. }

Un saludo
428  Programación / Programación C/C++ / Re: Me crashea el programa en: 14 Marzo 2014, 02:38 am
Dos preguntas:

Para que sirve el include time.h y que hace esto?

Código
  1. srand((unsigned) time(NULL));
Tienes que leer con mas cuidado el tema, eso lo respondí en mi primer mensaje:
Aparte de todo lo dicho falta inicializar la semilla para los números aleatorios, esto puede hacerse con:
Código
  1. #include <stdlib.h>
  2. #include <time.h>
  3.  
  4. /* ... */
  5.  
  6. int main(void)
  7. {
  8.   /* ... */
  9.  
  10.   srand((unsigned) time(NULL));
  11.  
  12.   /* Uso de rand ...  */
  13. }
Antes de utilizar rand y srand se debe incluir <stdlib.h>, antes de time <time.h>.


Un saludo
429  Programación / Programación C/C++ / Re: Listar secuencia de años hasta encontrar año con cifra repetida en: 14 Marzo 2014, 02:32 am
¿Pero qué diablos pasa?, yo no tengo puesto año sino a n i o, observarlo  escribiendo lo anterior seguido en un mensaje y lo veréis, lo cambia el muy cabrito

...

El programa cambia automáticamente "a n i o" por año, hacer si no la prueba y picar  en citar para ver el original y veréis que no está puesto año o escribirlo en un mensaje y pre visualizar. Menuda pifia

Probaré con anyo ...si, éste no lo cambia.

Entonces no me había confundido de código y el que había puesto era el mio sólo que cambiado por el procesador de texto que usamos al escribir los mensajes .....$#@?'¡~# diablos rayos y centellas, que pifia de procesador.
Si encuentras eso realmente molesto abre un tema sobre ello en el foro Sugerencias y dudas sobre el Foro

Un saludo
430  Programación / Programación C/C++ / Re: Estructuras en C en: 13 Marzo 2014, 17:21 pm
Si se puede ver la notacion es diferenete pero creo que al final son la misma cosa o no entiendo que quiere decir cada uno, en si al ver esto me he mareado y ya no entiendo bien como es la notacion del "typedef struct"
Por favor no escribas el texto en mayúsculas, dificulta la lectura y en foros como este equivale a gritar.

----

Tienes tres casos distintos, en el primero:
Código
  1. typedef struct coordinate {
  2.   int x;
  3.   int y;
  4. } Coordinate;
  5.  
  6.  
  7. int main()
  8. {
  9.   Coordinate c[N];
  10. }
Declaras la estructura "struct coordinate" y su alias "Coordinate", puedes utilizar cualquiera de los dos para la declaración, esta se realiza en la función main: "c" es un array de N elementos de tipo "Coordinate".

En el segundo:
Código
  1. typedef struct {
  2.   int x;
  3.   int y;
  4. } Coordinate;
  5.  
  6. int main()
  7. {
  8.   Coordinate c[N];
  9. }
La estructura es anónima (sin nombre, para ser exactos, sin etiqueta). De nuevo la declaración se realiza en la función main y aquí solo puedes utilizar el alias.

El tercero:
Código
  1. typedef struct Coordinatei {
  2.   int x;
  3.   int y;
  4. } c[N];
  5.  
  6. int main()
  7. {
  8.    struct coordinate c[N];
  9. }
Es mas complicado y no es valido ya que:
1) Se declara la estructura "struct Coordinatei".
2) Se declara el alias "c" como equivalente a "struct Coordinatei [N]".
Ya que no hay declaración de "struct coordinate" tu compilador debe generar un mensaje de error.

Por ultimo y solo para redondear puedes utilizar "c" como el tipo para declarar un array, por ejemplo:
Código
  1. /* Forma usual */
  2. struct Coordinatei a[N];
  3.  
  4. /* Utilizando el alias */
  5. c b;
  6.  
En ambas declaraciones el tipo es el mismo: array de N elementos de tipo "struct Coordinatei", la primera utiliza la forma usual y la segunda el alias.

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 52 53 54 55 56 57 58 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines