Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - rir3760

#1301
Cita de: freecom4ever en 16 Febrero 2012, 05:07 AMpd: 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:
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:
printf("%d %p\n", *puntero, (void *) &variable);

Un saludo
#1302
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
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'):
int i, b = 0;

for (i = 0; cadena[i] != '\0'; i++)
   if (cadena[i] == c)
      b++;


El segundo es un error en el comentario:
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
Cita de: Anastacio en 16 Febrero 2012, 00:11 AMAhora 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:
printf("Escriba el resultado de %d + %d\n", a, b);

Un saludo
#1305
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:
printf("c es igual a&d", c);
Donde tienes '&' cuando deberías utilizar '%'.

También debes cambiar esta linea:
scanf("%d\n", &c);
A:
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
Cita de: NeoB en 12 Febrero 2012, 18:02 PMBuenas, 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.

Cita de: NeoB en 12 Febrero 2012, 18:02 PMNo 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:
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:
"0123456789"

Si se desea generar todas las palabras de longitud tres estas son:
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:
#include <stdio.h>
#include <stdlib.h>

#define MAX_LENGTH  3

void print_words(char const *abc, int length);

int main(void)
{
   char abc[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' /* sentinel */};
   int i;
   
   for (i = 0; i < MAX_LENGTH; i++){
      puts("----");
      print_words(abc, i + 1);
   }
   
   return EXIT_SUCCESS;
}

void print_words(char const *abc, int length)
{
   char *word;
   int i;
   
   if ((word = malloc(length)) == NULL){
      fputs("Women and children first!\n", stderr);
      exit(EXIT_FAILURE);
   }
   
   for (i = 0; i < length; i++)
      word[i] = abc[0];
   printf("Length: %d\n%.*s\n", length, length, word);
   
   while (1){
      i = length;
      while (i-- > 0){
         word[i] = abc[word[i] - abc[0] + 1];
         
         if (word[i] != abc[0])
            break;
      }
     
      if (i == -1)
         break;
      else
         printf("%.*s\n", length, word);
   }
   
   free(word);
}


Un saludo
#1307
Programación C/C++ / Re: Codigo Dijkstra en C
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
Cita de: theluigy13etv en 12 Febrero 2012, 16:11 PMMe 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
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):
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int i;
  char **p;
 
  puts("Lista de argumentos (1):");
  for (i = 0; i <= argc; i++)
     printf(
        "argv[%d] == \"%s\"\n",
        i,
        argv[i] != NULL ? argv[i] : "NULL"
     );
 
  puts("----");
 
  puts("Lista de argumentos (2):");
  for (p = argv; p <= argv + argc; p++)
     printf(
        "argv[%ld] == \"%s\"\n",
        (long int) (p - argv),
        *p != NULL ? *p : "NULL"
     );
 
  return EXIT_SUCCESS;
}


Un saludo
#1310
Aparte de lo ya comentado por eleon hay otros errores al principio del programa, en este condicional:
Código (cpp) [Seleccionar]
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