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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Mensajes
Páginas: 1 ... 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 [131] 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 ... 160
1301  Programación / Programación C/C++ / Re: ¿Cual es la diferencia? Duda con punteros y typedef en: 16 Febrero 2012, 17:27 pm
pd: para llegar al codigo de arriba fui probando esto hasta que llegue a eso... (puedo estar equivocado)
No hagas eso. En su lugar lee un buen libro y en base a el avanzas, en caso de duda el mentado o foros como este.

Ello porque en C cuando ocurre un error se genera "comportamiento no definido", en otras palabras todo mundo se lava las manos, puede ocurrir cualquier cosa y, por supuesto, la culpa es del programador. Sacar en base a ello conclusiones no es una buena idea.

En cuanto al ultimo programa tiene dos errores en la llamada a printf:
Código:
printf("%d %d", *puntero &variable);
Falta la coma que separa a los dos últimos argumentos y si se desea imprimir una dirección de memoria se debe utilizar "%p" y convertir el puntero explícitamente al tipo "void *", de esta forma:
Código
  1. printf("%d %p\n", *puntero, (void *) &variable);

Un saludo
1302  Programación / Programación C/C++ / Re: Problema con un Do While simple. en: 16 Febrero 2012, 01:32 am
Pensandolo un poco eso ya sale del tema C/C++ para entrar en "Uso del interprete de comandos", una pagina en ingles donde se describen es Using command redirection operators.

Esa misma documentación en español se puede consultar localmente, basta con:

1) Menú "Inicio", "Ayuda y soporte técnico".
2) En el cuadro "Buscar" se introduce "Interprete de comandos".

Un saludo
1303  Programación / Programación C/C++ / Re: [Ayuda] Ejercicio simple en: 16 Febrero 2012, 01:17 am
Dos detalles a considerar ...

El primero es solo para reducción del código fuente. Ya que se deben verificar cada uno de los caracteres de la cadena no es necesario el uso de la función "strlen", basta con verificar si el carácter es el indicador del final de la cadena (el '\0'):
Código
  1. int i, b = 0;
  2.  
  3. for (i = 0; cadena[i] != '\0'; i++)
  4.   if (cadena[i] == c)
  5.      b++;

El segundo es un error en el comentario:
Código
  1. if (c==cadena[i]) //tambien puede ser if (strcmp((char *)c, cadena[i]) == 0)
Eso no funcionara ya que el valor almacenado en la variable "c" se tomaría como una dirección en memoria, tampoco vale como segundo argumento "cadena[ i ]" ya que es un carácter.

Un saludo
1304  Programación / Programación C/C++ / Re: Porque me sale error con esto? {C} en: 16 Febrero 2012, 00:57 am
Ahora que lo pienso, si quiero hacer eso, no deberia poner acaso el segundo %d despues del +, dentro de las comillas?
Exacto. Solo tienes que cambiar esa linea a:
Código
  1. printf("Escriba el resultado de %d + %d\n", a, b);

Un saludo
1305  Programación / Programación C/C++ / Re: Este Case no me anda, no me figuro en: 16 Febrero 2012, 00:53 am
Lo primero que debes hacer es evitar el uso de la biblioteca conio de Borland, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.

El programa debe funcionar correctamente salvo lo antes mencionado y el error en la linea:
Código
  1. printf("c es igual a&d", c);
Donde tienes '&' cuando deberías utilizar '%'.

También debes cambiar esta linea:
Código
  1. scanf("%d\n", &c);
A:
Código
  1. scanf("%d", &c);
Ya que de no hacerlo se presentan problemas (los especificadores de printf y scanf son similares pero no idénticos, en cuestión de dudas nada mejor que un libro).

Un saludo
1306  Programación / Programación C/C++ / Re: Ayuda a mejorar código. C sobre Linux. en: 15 Febrero 2012, 02:14 am
Buenas, he estado esta última semana dándole vueltas a la idea de hacer un bruteforce en C, para que ya estoy aprendiendo, animarme un poco.
El problema es, al ser tu nivel en el lenguaje todavía bajo, no vas a utilizar todas las facilidades que el lenguaje provee y el programa terminara siendo mas largo (y su desarrollo mas difícil) de lo que debería ser.

Tomar un libro y seguir sus ejemplos (mas ejercicios) no te subirá el nivel de adrenalina pero por algo es la mejor forma de aprender.

No tengo mucho tiempo para mejorarlo por eso de estudiar, y cuando tengo, no veo que cambiar (detalles importantes, y lo único que he hecho es conseguir logearme en localhost con esta "aaaad" en la opción fijo con 5 caracteres).
Detalles importantes que cambiar hay muchos, el primero que salta a la vista es:
Código
  1. int i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20;
No hay razón para ello primero porque puedes declarar las variables dentro de las funciones que las utilizan y segundo porque sus nombres no indican nada sobre su uso. Por ejemplo si yo quiero conocer la diferencia entre "i3" e "i5" no queda mas que revisar el código fuente a detalle.


----


Si reducimos el programa al mínimo este consiste en generar palabras en base a un abecedario. Supongamos que este abecedario consta de diez elementos y ellos son:
Código:
"0123456789"

Si se desea generar todas las palabras de longitud tres estas son:
Código:
000
001
002
003
004
005
006
007
008
009
010

...

999

Como puedes ver con el ejemplo lo que en realidad se hace es procesar de alguna forma cada uno de los números con un numero de dígitos determinado y en una cierta base:

* El numero de dígitos lo indica la longitud de la palabra
* El carácter correspondiente a cada dígito lo dicta tu abecedario
* La base N no es mas que el numero de elementos de tu abecedario.

Hay varias formas de implementarlo, la mas sencilla en mi opinión es emulando un medidor de lo que sea (servicio eléctrico, kilometraje, etc.).

Un ejemplo sencillo en C utilizando un centinela (el ultimo elemento siendo igual al primero en el abecedario) para acortar el programa:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX_LENGTH  3
  5.  
  6. void print_words(char const *abc, int length);
  7.  
  8. int main(void)
  9. {
  10.   char abc[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' /* sentinel */};
  11.   int i;
  12.  
  13.   for (i = 0; i < MAX_LENGTH; i++){
  14.      puts("----");
  15.      print_words(abc, i + 1);
  16.   }
  17.  
  18.   return EXIT_SUCCESS;
  19. }
  20.  
  21. void print_words(char const *abc, int length)
  22. {
  23.   char *word;
  24.   int i;
  25.  
  26.   if ((word = malloc(length)) == NULL){
  27.      fputs("Women and children first!\n", stderr);
  28.      exit(EXIT_FAILURE);
  29.   }
  30.  
  31.   for (i = 0; i < length; i++)
  32.      word[i] = abc[0];
  33.   printf("Length: %d\n%.*s\n", length, length, word);
  34.  
  35.   while (1){
  36.      i = length;
  37.      while (i-- > 0){
  38.         word[i] = abc[word[i] - abc[0] + 1];
  39.  
  40.         if (word[i] != abc[0])
  41.            break;
  42.      }
  43.  
  44.      if (i == -1)
  45.         break;
  46.      else
  47.         printf("%.*s\n", length, word);
  48.   }
  49.  
  50.   free(word);
  51. }

Un saludo
1307  Programación / Programación C/C++ / Re: Codigo Dijkstra en C en: 15 Febrero 2012, 00:44 am
Explicaciones del algoritmo en seudocodigo (e incluso código fuente en C o C++) lo puedes encontrar en la red, por ejemplo en Wikipedia.

En mi opinión lo mejor que puedes hacer es reducir la generación del grafo a un mínimo. El siguiente paso es crear una función para el calculo de las distancias mas cortas en base a ese algoritmo.

Reducelo, publicalo y trataremos de ayudarte.

Un saludo
1308  Programación / Programación C/C++ / Re: ¿Printf y scanf en funciones? en: 14 Febrero 2012, 18:19 pm
Me podrías explicar que quieres decir con esto ...
El comentario de BlackZeroX (Astaroth) va en el sentido de, si se responde (como en tu caso) a un mensaje considerando este en su totalidad, no tiene caso citarlo.

En el caso del lenguaje C no se puede (ni es deseable) abstraer de ese modo las funciones. Por supuesto en un caso ideal cada función debe realizar una única operación pero hasta ahí.

Y aun cuando fuera posible estaríamos ante una regla general con excepciones y eso ya es un mal comienzo: la función principal si puede llamar a funciones para el proceso de entrada/salida pero las demás no.

También esta el problema de una función cuyo único objetivo sea reducir el programa al realizar esta el proceso relacionado con la entrada/salida ...

Un saludo
1309  Programación / Programación C/C++ / Re: ¿Qué significan aquellos parámetros de la lista de argumentos del main ? en: 14 Febrero 2012, 17:41 pm
Extendiendo la explicación que ya te han dado.

* argv[0] usualmente es el nombre de la aplicación pero hay la posibilidad de que sea NULL.

* argv[ i ] es el argumento "i" con este objeto en el rango 0 .. argc - 1

* argv[argc] siempre es NULL.

En base a ello puedes procesar los argumentos mediante un bucle utilizando un contador (lo usual) o un puntero. Por ejemplo (siguiendo el estándar C90):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6.   int i;
  7.   char **p;
  8.  
  9.   puts("Lista de argumentos (1):");
  10.   for (i = 0; i <= argc; i++)
  11.      printf(
  12.         "argv[%d] == \"%s\"\n",
  13.         i,
  14.         argv[i] != NULL ? argv[i] : "NULL"
  15.      );
  16.  
  17.   puts("----");
  18.  
  19.   puts("Lista de argumentos (2):");
  20.   for (p = argv; p <= argv + argc; p++)
  21.      printf(
  22.         "argv[%ld] == \"%s\"\n",
  23.         (long int) (p - argv),
  24.         *p != NULL ? *p : "NULL"
  25.      );
  26.  
  27.   return EXIT_SUCCESS;
  28. }

Un saludo
1310  Programación / Programación C/C++ / Re: Presentación + dudas de principiante en: 14 Febrero 2012, 04:19 am
Aparte de lo ya comentado por eleon hay otros errores al principio del programa, en este condicional:
Código
  1. if (15<=k<=25 & 2.3<=j<=2.7) ...
Cuando deseas verificar si un valor esta dentro de un rango no puedes utilizar la forma usual en matemáticas "15 <= k <= 25". En su lugar debes indicar las dos condiciones, por ejemplo "15 <= k && k <= 25".

También debes utilizar de forma consistente los operadores, en tu caso debes utilizar el operador lógico "&&". El operador '&' es valido pero su uso tiene otra intención (operación AND a nivel de bits).

Un saludo
Páginas: 1 ... 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 [131] 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines