• Lunes 29 de Abril de 2024, 23:22

Autor Tema:  Correccion de errores de divide y venceras  (Leído 1014 veces)

akutalu

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Correccion de errores de divide y venceras
« en: Lunes 9 de Marzo de 2009, 13:08 »
0
Buenas, he hecho un programa utilizando el algoritmo de divide y venceras, pero al compilar tengo errores en las funciones y nose corregirlos. me podeis ayudar? gracias


Código: C++
  1.  
  2. #include <iostream>
  3. using namespace std;
  4.  
  5.  
  6. void formarTabla(int tabla[][100], const int &primero, const int &ultimo);
  7. void completarTabla(int tabla, int eqInf, int eqSup, int diaInf, int diaSup, int eqInic);
  8.  
  9. main (){
  10.  
  11.    int ultimo=0, medio=0;
  12.  
  13.     do{
  14.         cout<<"Introduzca el numero de jugadores"<<endl;
  15.         cin>>ultimo;
  16.        
  17.         if (ultimo<=1)
  18.             cout<< "ERROR!! El número de jugadores debe ser mayor que 1"<<endl;
  19.        
  20.     }while (ultimo<=1);
  21.  
  22.     //dias=ultimo-1; fila=ultimo+1; colum=ultimo            
  23.      
  24.                 //Declaracion de la tabla
  25.                 int tabla[ultimo+1][ultimo];
  26.                
  27.                 //Dias
  28.                 for (int i=0; i<=ultimo-1; i++)
  29.                     tabla[0][i]=i;          
  30.                    
  31.                 //Jugadores
  32.                 for (int j=1; j<=ultimo; j++)
  33.                     tabla[j][0]=j;    
  34.                    
  35.                 //Inicializa la tabla a 0 para evitar errores
  36.                 for (int f=1; f<ultimo+1; f++)
  37.                     for (int c=1; c<ultimo; c++){
  38.                         tabla[f][c]=0;
  39.                         tabla[f][c]=0;
  40.                     }
  41.                    
  42.  
  43.                        
  44.                 formarTabla(tabla,1,ultimo);
  45.                
  46.                
  47.                 cout<<endl<<"      Jugador t t Dia"<<endl<<endl;
  48.            
  49.                 //mostrar la tabla
  50.                 for (int f1=0; f1<ultimo+1; f1++){
  51.                     for (int c1=0; c1<ultimo; c1++)
  52.                         cout<<"t "<<tabla[f1][c1];
  53.                     cout<<endl<<endl;
  54.                 }
  55.                    
  56.    
  57.  
  58.  
  59. cout<<ultimo<<endl;
  60.  
  61. system ("pause");
  62. }
  63.  
  64.  
  65.  
  66. void formarTabla(int tabla[][100], const int &primero, const int & ultimo){
  67.    
  68.     if (ultimo - primero ==1){ //caso base
  69.         cout<<"caso base"<<endl;
  70.                    
  71.         tabla[primero][1]= ultimo;
  72.         tabla[ultimo][1]= primero;
  73.     }
  74.     else {      //caso recursivo
  75.                
  76.         cout<<"caso recursivo"<<endl;
  77.         int medio=(primero+ultimo)/2;
  78.                    
  79.         /*primera subsolución: participantes de 1 a 2k-1*/                                                
  80.         formarTabla(tabla,primero,medio);
  81.         /*segunda subsolución: participantes de 2k-1+1 a 2k*/                                      
  82.         formarTabla(tabla,medio+1,ultimo);
  83.                  
  84.         /*completa la tabla de los participantes de la primera subsolución con los de la segunda*/
  85.         completarTabla(tabla, primero, medio, medio, ultimo-1, medio+1);
  86.         /*completa la tabla de los participantes de la segunda subsolución con los de la primera*/
  87.         completarTabla(tabla, medio+1, ultimo, medio, ultimo-1, primero);
  88.     }
  89.    
  90. }
  91.  
  92. void CompletarTabla(int tabla, int eqInf, int eqSup, int diaInf, int diaSup, int eqInic){
  93.    
  94.     for (int j=diaInf;  j <= diaSup; j++)
  95.       tabla[eqInf][j]= (eqInic + j - diaInf);
  96.  
  97.  
  98.     for (int i = eqInf + 1; i <= eqSup; i++) {
  99.       /*Intercambio de contrincante*/
  100.       tabla[i][diaInf] = tabla[i-1][diaSup]; //el último contrincante de i-1 es ahora el primer contrincante de i
  101.       for (int j = diaInf + 1;  j <= diaSup; j++)
  102.          /*rotación de los contrincantes*/
  103.          tabla[i][j] = tabla[i-1][j-1]; //el contrincante de ayer de i-1, es el contrincante de hoy para i
  104.      
  105.     }
  106. }
  107.  
« última modificación: Martes 10 de Marzo de 2009, 17:09 por akutalu »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Correccion de errores de divide y venceras
« Respuesta #1 en: Martes 10 de Marzo de 2009, 16:48 »
0
Utiliza las etiquetas de código, gracias.

betopin

  • Miembro activo
  • **
  • Mensajes: 93
  • Nacionalidad: co
    • Ver Perfil
    • http://www.programasenc.blogspot.com
Re: Correccion de errores de divide y venceras
« Respuesta #2 en: Miércoles 11 de Marzo de 2009, 01:50 »
0
En esta funcion un error

Código: C
  1. void formarTabla(int tabla[][100], const int &primero, const int &ultimo);
  2.  

Asumo que lo que quieres es trabajar con punteros...de ser asi al llamar la funcion debes enviar la direccion del dato...es decir &ultimo y al declrar la funcion debes definirla como puntero es decir

Código: C
  1. void formarTabla(int tabla[][100], const int &primero, int *ultimo);
  2.  

Tal como esta...lo que estas es tratando de operar una direccion...y lo que se opera es el dato el cual ha sido apuntado

Ese pequeño detalle influye de ahi en adelante, tanto cuando llamas a la funcion como cuando trata de operarse lo que hay dentro de esta

Creo que tambien tienes por alli variables que no han sido previamente inicializadas

Saludos