Ver Mensaje Individual
  #3 (permalink)  
Antiguo 05/04/2006, 07:31
ariattaquero
 
Fecha de Ingreso: mayo-2005
Mensajes: 115
Antigüedad: 19 años, 8 meses
Puntos: 1
bueno pongo el codigo para que puedan ayudarme mejor, estaba separado pues es para hacer un tda, y lo uni todo aca, por si hay algun error de ese tema....


Código:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define INICIO "0"
#define DEST "1"

typedef struct Tcomandos {
    int id;
    char nombre[CARACTERES];
    char params[CARACTERES];
}Tcomandos;

typedef struct TDA_ValCmd {
    Tcomandos comando[max];
}TDA_ValCmd;


void mostrar_menu(void);
int seleccion(void);

//Declaracion Primitivas Privadas
void inicializar_cmd(Tcomandos* comando);

void destruir_cmd(Tcomandos* comando);

void setId(TDA_ValCmd* tda, int pos, int id);

void setNom(TDA_ValCmd* tda, int pos, const char* nombre);

void setParam(TDA_ValCmd* tda, int pos, const char* parametro);

int getId(TDA_ValCmd* tda, int pos);

char* getNom(TDA_ValCmd* tda, int pos);

char* getParam(TDA_ValCmd* tda, int pos);

int vacio(TDA_ValCmd* tda);

void buscarPosId(TDA_ValCmd* tda, int id, int *pos, int *error);

//Implementacion Primitivas Publicas
int ValCmd_crear(TDA_ValCmd* tda)
{
    Tcomandos comando[max];
    
    inicializar_cmd(comando);
    printf("en crear Comando[3].id = %d\n",comando[3].id);
    printf("en crear Comando[3].nombre = %s\n",comando[3].nombre);
    printf("en crear Comando[3].params = %s\n",comando[3].params);
    tda =(TDA_ValCmd * )malloc(sizeof(TDA_ValCmd));
    if (tda == NULL)
         return 0; // no hubo espacio en memoria
    else return 1; // hubo espacio en memoria
}

int ValCmd_agregar_def_cmd(TDA_ValCmd* tda, int id, char* nombre, char* params)
{
    int i=0, idAgr=0;
    printf("voy a obtuvener el id\n"); system("pause");
    printf("tda->comando[0].id = %d\n", tda->comando[i].id);system("pause");
    idAgr = tda->comando[i].id;
    printf("obtuvo el id\n"); system("pause");
    // busco el 1er lugar que este vacio e inserto al final
    // i < mas es l rango para que i no se pase si el vector esta lleno
    /* el idAgr debe ser distinto a id, ya que el id debe ser unico, entonces si
     son iguales devuelve 0 */
     
     while (( idAgr!=0) && (i < max) && (idAgr!=id))
     {
         i++;
         if (i == max) // si esta lleno
                  return 0; // no se pudo crear
         idAgr = tda->comando[i].id;
     }
     if (idAgr == id) // si ese id ya existe
          return 0; // no se pudo crear
    else
    {
        setId(tda, i, id);
        setNom(tda, i, nombre);
        setParam(tda,i, params);
    }
    return 1; // se pudo crear
}

int ValCmd_obtener_def_cmd(TDA_ValCmd* tda, int id, char* nombre, char* params)
{
    int error;
    int pos;
    if (!vacio(tda)) // si el tda no esta vacio
    {
        buscarPosId(tda, id, &pos, &error); // busca la posicion del id
        if (error == 0) // si no hubo error
        {
            nombre = getNom(tda, pos);
            params = getParam(tda, pos);
        }
        else return 0; // no se pudo obtener el id     
    }
    else return 0; // no se pudo obtener el id
    return 1; // se pudo obtener el id
}

int ValCmd_obtener_id_cmd (TDA_ValCmd* tda,int id, char* nombre)
{
    int pos;
    char* nomEnc;
     
    if(!vacio(tda))
    {
        pos = 0;
         do {
           nomEnc = getNom(tda,pos);
           if (nomEnc==nombre) 
              { id=getId(tda,pos);
                 return 1;}
           else if (pos < max) pos++;
           }    
         while ((pos<=max)&&(nomEnc!=nombre));
         if (nomEnc!=nombre) return 0;
        } else return 0;
}  

int Val_Cmd_borrar_def_cmd(TDA_ValCmd* tda,int id)
{
    int pos;
    int IdEnc; 
    
    if(!vacio(tda))
      {pos=0;
       do 
         {IdEnc = getId(tda,pos);
           if (IdEnc == id )
              {setId(tda,pos,-1);
               setNom(tda,pos,INICIO);
               setParam(tda,pos,INICIO);
               return 1;}
           else if (pos < max) pos++;
          }    
        while ((pos <= max)&&(IdEnc!=id));
        if (IdEnc!=id) return 0;
       } else return 0;
}




void ValCmd_destruir(TDA_ValCmd* tda)
{
    Tcomandos comando[max];
    
    destruir_cmd(comando);
    printf("en destruir Comando[3].id = %d\n",comando[3].id);
    printf("en crear Comando[3].nombre = %s\n",comando[3].nombre);
    printf("en crear Comando[3].params = %s\n",comando[3].params);
    free(tda);
}

// Implementacion Primitivas Privadas by Cristian                        

void inicializar_cmd(Tcomandos* comando)
{
    int i;
    for (i=0; i<=max; i++)
    {
        comando[i].id=0;
        strcpy(comando[i].nombre,INICIO);
        strcpy(comando[i].params,INICIO);
    }    
} 

void destruir_cmd(Tcomandos* comando)
{
    int i;
    for(i=0; i<=max; i++)   
    {
        comando[i].id=-1;
        strcpy(comando[i].nombre,DEST);
        strcpy(comando[i].params,DEST);
    }
}        
        
void setId(TDA_ValCmd *tda, int pos, int id)
{
    tda->comando[pos].id = id;
}

void setNom(TDA_ValCmd* tda, int pos, const char* nombre)
{
    strcpy (tda->comando[pos].nombre, nombre);
}

void setParam(TDA_ValCmd* tda, int pos, const char* parametro)
{
    strcpy(tda->comando[pos].params, parametro);
}

int getId(TDA_ValCmd* tda, int pos)
{
    return (tda->comando[pos].id);
}

char* getNom(TDA_ValCmd* tda, int pos)
{
    return (tda->comando[pos].nombre);
}

char* getParam(TDA_ValCmd* tda, int pos)
{
    return (tda->comando[pos].params);
}

int vacio(TDA_ValCmd* tda)
{
    char *nombre;
    char *parametro;
    int id;
    
    id = getId(tda, 0);
    nombre = getNom(tda, 0);
    parametro = getParam(tda, 0);
    if ( (id == -1) && (nombre == INICIO) && (parametro == INICIO) )
        return 1;
    else return 0;
}

void buscarPosId(TDA_ValCmd* tda, int id, int *pos, int *error)
{
    int i=0, idbuscar;
    int encontrado=0;
    *error = 0; // falso
    idbuscar = getId(tda, i);
    if ( idbuscar == id) // si el primero es el id que buscaba
        encontrado = 1; // true
    // busco el id en caso que no sea el primero
    while ((i<max) && (encontrado == 0))
    {
        i++;
        // me fijo si se paso del rango
        if (i != max)
        {
            idbuscar = getId(tda, i);
            if (idbuscar == id) // si lo encuentra    
               encontrado = 1; // true
        }
        else
            *error = 1; // no existe el id a buscar (se paso de rango)
    }
    if ((encontrado == 1) && (*error == 0)) 
        *pos = i;
}


int main(int argc, char* argv[])
{
    TDA_ValCmd *tda;
    
    char nombre[CARACTERES], params[CARACTERES];
    int id, fin = 0, creado = 0, idAgr, i=0;
    int agregado = 0;
    
    
    
    creado = ValCmd_crear(tda);
    if (creado == 1) // si se pudo crear
    {
        while ( fin == 0)
        {
            mostrar_menu();
            switch (seleccion())
            {
                case 1: 
                        printf(" Ingrese el Id del Comando: \n");
                        scanf("%d", &id);
                        printf(" Ingrese el Nombre del Comando: \n");
                        scanf("%s", nombre);
                        printf(" Ingrese los Parametros del Comando: \n");
                        scanf("%s", params);
                        
                        /*agregado = ValCmd_agregar_def_cmd(tda, id, nombre, params);
                        if(agregado == 1) 
                             printf(" El comando ha sido correctamente agregado\n");
                        else printf(" Error al agregar el comando\n");*/
                        
        /*********** ACA VIENE EL PROBLEMA *****************/               
                        idAgr = tda->comando[i].id;
                         while (( idAgr!=0) && (i <= max) && (idAgr!=id))
                         {
                               i++;
                               if (i == max) // si esta lleno
                                  printf("no se pudo crear\n"); // no se pudo crear
                               idAgr = tda->comando[i].id;
                         }
                         if (idAgr == id) // si ese id ya existe
                            printf("no se pudo crear\n"); // no se pudo crear
                         else
                         {
                             tda->comando[i].id = id;
                             strcpy (tda->comando[i].nombre, nombre);
                             strcpy(tda->comando[i].params, params);;
                         }
                        
                        break;
                case 2: printf("No disponible aun\n");
                        break;
                case 3: printf("No disponible aun\n"); break;
                case 4: fin = 1; break;
                default: printf(" Opcion no valida\n");break;
            }
        }
        ValCmd_destruir(tda);    
    }// fin if     
    // en caso de que no ha sido creado
    else printf("El validador no se pudo crear \n"); 
    
    system ("pause");
    return 0;
}    

void mostrar_menu(void)
{
     printf("-------------------------------------------\n");
     printf("|               Menu                      |\n");
     printf("-------------------------------------------\n");
     printf("|  1 - Agragar una definicion de comando  |\n");
     printf("|  2 - Eliminar una definicion de comando |\n");
     printf("|  3 - Validar una sentencia              |\n");
     printf("|  4 - Salir del programa                 |\n");
     printf("-------------------------------------------\n");
}

int seleccion(void)
{
    int op =0;
    printf("|  Ingrese una opcion y luego <ENTER>     |\n");
    printf("-------------------------------------------\n");
    scanf("%d",&op);
    return (op);
}