¿Algoritmo existente?

Iniciado por goto C, 28 Julio 2013, 13:54 PM

0 Miembros y 1 Visitante están viendo este tema.

goto C

#10
error C2143: error de sintaxis : falta ';' delante de 'tipo'

error C2065: 'hasta' : identificador no declarado

error C2065: 'hasta' : identificador no declarado

error C2065: 'hasta' : identificador no declarado

EDITO: he quitado el const, pero da exactamente los mismos errores.

EDITO 2: amchacon, muy chula tu foto, es lo menos que podemos hacer por recordar a un genio al que nunca se le ha reconocido lo suficiente su trabajo y a quien no conoce esta sociedad en que vivimos, pero sí conoce a Steve Jobs, por ejemplo.

amchacon

Cita de: goto C en 28 Julio 2013, 22:39 PM
error C2143: error de sintaxis : falta ';' delante de 'tipo'

error C2065: 'hasta' : identificador no declarado

error C2065: 'hasta' : identificador no declarado

error C2065: 'hasta' : identificador no declarado

EDITO: he quitado el const, pero da exactamente los mismos errores.
¿Has probado el código literalmente o has hecho algun cambio?

Cita de: goto C en 28 Julio 2013, 22:39 PMEDITO 2: amchacon, muy chula tu foto, es lo menos que podemos hacer por recordar a un genio al que nunca se le ha reconocido lo suficiente su trabajo y a quien no conoce esta sociedad en que vivimos, pero sí conoce a Steve Jobs, por ejemplo.
;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

do-while

#12
¡Buenas!

Aquí te dejo otro código. Trabaja las combinaciones sobre un vector de enteros, ya que es lo único que te hace falta. Hacer combinaciones sobre un vector de cualquier cosa es hacer combinaciones sobre los indices del vector...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct t_combinatoria
{
   unsigned long **lista;
   unsigned long n_elementos;
   unsigned long longitud_elemento;
};
typedef struct t_combinatoria t_combinatoria;

void inicializar_combinatoria(t_combinatoria *c)
{
   c->lista = NULL;
   c->n_elementos = 0;
   c->longitud_elemento = 0;
}

void finalizar_combinatoria(t_combinatoria *c)
{
   unsigned long i;

   for(i = 0 ; i < c->n_elementos ; i++)
       free(c->lista[i]);

   free(c->lista);

   c->lista = NULL;
   c->n_elementos = 0;
   c->longitud_elemento = 0;
}

unsigned long factorial(unsigned long n)
{
   unsigned long ret = 1;

   while(n)
       ret *= (n--);

   return ret;
}

unsigned long n_sobre_k(unsigned long n, unsigned long k)
{
   return (factorial(n) / factorial(k)) / factorial(n - k);
}

int combinaciones(t_combinatoria *datos,unsigned long elementos_conjunto, unsigned long elementos_combinacion)
{
   static unsigned long indice = 0;
   static unsigned long elementos_fijados = 0;
   static unsigned long *aux = NULL;
   unsigned long i;

   if(!elementos_combinacion)
       return 0;

   if(indice == elementos_combinacion)
   {
       memcpy(*(datos->lista + elementos_fijados), aux, elementos_combinacion * sizeof(unsigned long));

       elementos_fijados++;

       return 1;
   }

   /* si es la primera vez que llamamos a la funcion, reservamos memoria para la tabla de combinaciones */
   if(!indice)
   {
       if(!(aux = (unsigned long *) malloc(elementos_combinacion * sizeof(unsigned long))))
           return 0;

       datos->n_elementos = n_sobre_k(elementos_conjunto,elementos_combinacion);
       datos->longitud_elemento = elementos_combinacion;

       if(!(datos->lista = (unsigned long **) malloc(datos->n_elementos * sizeof(unsigned long *))))
       {
           datos->n_elementos = 0;
           datos->longitud_elemento = 0;

           return 0;
       }

       for(i = 0 ; i < datos->n_elementos ; i++)
       {
           if(!(datos->lista[i] = (unsigned long *) malloc(datos->longitud_elemento * sizeof(unsigned long))))
           {
               int j;

               for(j = 0 ; j < i ; j++)
                   free(datos->lista[i]);

               free(datos->lista);
               datos->lista = NULL;

               datos->n_elementos = 0;
               datos->longitud_elemento = 0;

               return 0;
           }
       }

       for(i = 0 ; i < elementos_conjunto - elementos_combinacion + indice + 1; i++)
       {
           aux[indice] = i;

           indice++;

           combinaciones(datos, elementos_conjunto, elementos_combinacion);

           indice--;
       }

       free(aux);
       aux = NULL;
       elementos_fijados = 0;
       indice = 0;
   }
   else
   {
       for(i = aux[indice - 1] + 1 ; i < elementos_conjunto - elementos_combinacion + indice + 1; i++)
       {
           aux[indice] = i;

           indice++;

           combinaciones(datos, elementos_conjunto, elementos_combinacion);

           indice--;
       }
   }

   return 1;
}

int main(int argc, char *argv[])
{
   unsigned long i,j,k;
   t_combinatoria comb;
   char *vocales = "aeiou";

   for(i = 1 ; i <= 5 ; i++)
   {
       inicializar_combinatoria(&comb);

       combinaciones(&comb, 5 , i);

       for(j = 0 ; j < comb.n_elementos ; j++)
       {
           for(k = 0 ; k < comb.longitud_elemento ; k++)
               printf("%c",vocales[comb.lista[j][k]]);
           printf("\n");
       }

       finalizar_combinatoria(&comb);
   }

   return 0;
}


Había visto un error que no existia...  :P

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

goto C

Amchacon, lo he compilado sin modificar absolutamente nada. Do-while, ya sé que lo único que me hace falta es "jugar" con las posiciones de los elementos del array, pero  lo que no encuentro es el cómo combinarlos, es decir, un algoritmo que haga esas combinaciones sea cual sea el número de caracteres, y ahí es donde os pido ayuda.

Os pongo aquí parte del código que es donde tengo los problemas, este código es, de todos los que he probado hasta la fecha, el que mejor funciona posiblemente y el que es más sencillo de comprender porque es el más corto.

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int numcarac, auxnumcarac, i, j, k, l=0, contador=1; //numcarac es el numero de caracteres del array carac y auxnumcarac el de caraccomb
    char carac[26], caraccomb[26]; //carac es el array con todos los caracteres, y caraccomb el array en el que iremos guardando las diferentes combinaciones de los caracteres de carac

//... pedimos datos por teclado, los guardamos y los mostramos para asegurarnos, esto funciona bien, comprobado, no lo pongo para no liar mas

//AQUI ESTA EL PROBLEMA:
auxnumcarac=2;

   for(i=0; i<numcarac; i++)
   {
      for(j=i; j<numcarac; j++)
      {
         for(k=0; k<auxnumcarac; k++)
         {
            caraccomb[l] = carac[j+k];
            l++;
         }

         //aqui mostramos caraccomb:
         printf("%s\n", caraccomb);

      }
      auxnumcarac++;
      l=0;
   }


Gracias y saludos. :D
A ver si podéis orientarme un poco en el código este.