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ú

Temas - m@o_614

#91
Programación C/C++ / problemas con fseeks
30 Enero 2014, 21:55 PM
Saludos, tengo problemas con unos fseeks que tengo dentro de un ciclo while que me lee un archivo, pero a la hora de imprimir el archivo no lo hace correctamente

este es el codigo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 8

typedef enum {INS,OP,DIR,MAQ,CALCULADO,CALCULAR,TOTAL} tabla;

void buscarFinLinea(FILE *hc12);
void listaTABOP();
char *Tabla_Operandos(FILE *hc12,int tabla);
void ignorarEspacios(FILE *hc12);
void quitarSaltosLinea(char *cadena);

int main()
{
   listaTABOP();
   return 0;
}

void buscarFinLinea(FILE *hc12)
{
   int car;
   while((car = fgetc(hc12))!= '\n')
       ;
}

void quitarSaltosLinea(char *c)
{
   char *ptr;
   if(((ptr = strchr(c,'\n'))!= NULL)||((ptr = strchr(c,'\t'))!= NULL)||((ptr = strchr(c,' '))!= NULL))
      *ptr = '\0';
}

void listaTABOP()
{
   int car,i,pos,n;
   FILE *hc12;
   COD *ultimo = NULL;
   char *ins,*op,**dir,**maq,**cal,**x_cal,**sum;
   if((hc12 = fopen("Tabla_OP.txt","r"))!= NULL)
   {
       while((car = fgetc(hc12))!= EOF)
       {
           i = 0;
           fseek(hc12,-1,SEEK_CUR);
           ins = Tabla_Operandos(hc12,INS);
           printf("[%s]\t",ins);
           ignorarEspacios(hc12);
           op = Tabla_Operandos(hc12,OP);
           printf("[%s]",op);
           pos = ftell(hc12);
           buscarFinLinea(hc12);
           if((car = fgetc(hc12)) != '\t')
           {
               n = 0;
               fseek(hc12,pos,SEEK_SET);
               ignorarEspacios(hc12);
               dir = (char**)malloc(sizeof(char*));
               dir[i] = Tabla_Operandos(hc12,DIR);
               printf("\t[%s]\t",dir[i]);
               ignorarEspacios(hc12);
               maq = (char**)malloc(sizeof(char*));
               maq[i] = Tabla_Operandos(hc12,MAQ);
               printf("[%s]\t",maq[i]);
               ignorarEspacios(hc12);
               cal = (char**)malloc(sizeof(char*));
               cal[i] = Tabla_Operandos(hc12,CALCULADO);
               printf("[%s]\t",cal[i]);
               ignorarEspacios(hc12);
               x_cal = (char**)malloc(sizeof(char*));
               x_cal[i] = Tabla_Operandos(hc12,CALCULAR);
               printf("[%s]\t",x_cal[i]);
               ignorarEspacios(hc12);
               sum = (char**)malloc(sizeof(char*));
               sum[i] = Tabla_Operandos(hc12,TOTAL);
               printf("[%s]\n",sum[i]);
               buscarFinLinea(hc12);
           }
           else
           {
               n = 1;
               fseek(hc12,pos,SEEK_SET);
               dir = (char**)malloc(MAX*sizeof(char*));
               maq = (char**)malloc(MAX*sizeof(char*));
               cal = (char**)malloc(MAX*sizeof(char*));
               x_cal = (char**)malloc(MAX*sizeof(char*));
               sum = (char**)malloc(MAX*sizeof(char*));
               do
               {
                   ignorarEspacios(hc12);
                   dir[i] = Tabla_Operandos(hc12,DIR);
                   printf("\t[%s]\t",dir[i]);
                   ignorarEspacios(hc12);
                   maq[i] = Tabla_Operandos(hc12,MAQ);
                   printf("[%s]\t",maq[i]);
                   ignorarEspacios(hc12);
                   cal[i] = Tabla_Operandos(hc12,CALCULADO);
                   printf("[%s]\t",cal[i]);
                   ignorarEspacios(hc12);
                   x_cal[i] = Tabla_Operandos(hc12,CALCULAR);
                   printf("[%s]\t",x_cal[i]);
                   ignorarEspacios(hc12);
                   sum[i] = Tabla_Operandos(hc12,TOTAL);
                   printf("[%s]\n",sum[i]);
                   buscarFinLinea(hc12);
                   i++;
                   printf("\t");
               }while((car = fgetc(hc12)) == '\t');
           }
       }
   }
   else
      printf("No se pudo abrir el archivo");
}

void ignorarEspacios(FILE *hc12)
{
   int car;
   do
   {
       car = fgetc(hc12);
   }while(car == '\t' || car == ' ');
}

char *Tabla_Operandos(FILE *hc12,int tabla)
{
   int car,lon = 0,pos;
   char *c;
   fseek(hc12,-1,SEEK_CUR);
   pos = ftell(hc12);
   if((tabla==INS)||(tabla==OP)||(tabla==DIR)||(tabla==MAQ)||(tabla==CALCULADO)||(tabla==CALCULAR))
   {
       do
       {
           car = fgetc(hc12);
           lon++;
       }while(car != '\t' && car != EOF);
   }
   else
   {
       do
       {
           car = fgetc(hc12);
           lon++;
       }while(car != '\n' && car != EOF);
       lon--;
   }
   fseek(hc12,pos,SEEK_SET);
   c = (char*)calloc((lon+1),sizeof(char));
   fgets(c,lon+1,hc12);
   quitarSaltosLinea(c);
   return c;
}

[
y el archivo es
quote]ABA         NO   INH      1806      2   0   2
         ADCA   SI   IMM      89ii      1   1   2
                            DIR      99dd      1   1   2
                            EXT      B9hhll   1   2   3
                            IDX      A9xb      1   1   2
                            IDX1      A9xbff   1   2   3
                            IDX2      A9xbeeff   1   3   4
                            [D,IDX]   A9xb      1   1   2
                            [IDX2]   A9xbeeff   1   3   4[/quote]
el problema es que  cuando llega al codop ADCA no me imprime toda la linea solo me imprime

[]....[ADCA]...[SI]...[IMM]...[89ii]....[1]...[1]

esto se arregla si le quito el primer fseek() que aparece en el while() de la funcion listaTABOP, pero si se lo quito ahora los codops siguientes al ADCA los imprime sin la primer letra, se la come,entonces como puedo arreglar este problema

gracias
#92
Programación C/C++ / se me borro el codigo
27 Enero 2014, 05:08 AM
Saludos, tengo un problema con el siguiente codigo que creo que ya habia posteado antes, pero lo que pasa es que de repente la pantalla se me congelo y cuando reinicie la maquina ya no tenia codigo, se me borro todo y ahora estoy empezandolo a hacer de nuevo todo, el codigo me lee de un archivo todos los codigos de operacion y me hace una lista simplemente ligada, esto si funciona bien, pero a la hora de que le pido que busque un codigo de operacion en la lista siempre me imprime que no lo encuentra, y no entiendo por que? si alguien me pudiera ayudar se lo agradeceria mucho

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LONG_ETIQUETA 8
#define LONG_CODOP 5
#define COMENTARIO ';'
#define TABULADOR '\t'
#define ESPACIOS_ ' '
#define MAX 8

typedef enum {FALSO,VERDADERO} booleano;
typedef enum {ETIQUETA,CODOP,OPERANDO} linea;

typedef struct nodo
{
    char *instruccion;
    struct nodo *sig;
}COD;

void imprimirLista(COD *cabeza);
int verificarCombinacion(FILE *fd);
booleano esComentario(FILE *fd);
char *Etiqueta_Codop_Operando(FILE *fd,int linea);
void ultimaLinea(char *codop);
void buscarFinLinea(FILE *fd);
void ignorarEspacios(FILE *fd);
void listaTABOP(COD **cabeza);
COD *ultimoElemento(COD **cabeza);
COD *crearNodo(char *ins);
void insertarFinal(char *ins,COD *ultimo);
char *Tabla_Operandos(FILE *hc12);
COD *buscarCodop(COD *cabeza,char *codop);
void quitarSaltosLinea(char *cadena);
booleano esNumero(char caracter);
booleano esLetra(char caracter);

int main()
{
    FILE *fd;
    int car,combinacion;
    COD *cabeza = NULL,*encontrado = NULL;
    char *etiqueta,*codop,*operando;
    listaTABOP(&cabeza);
    //imprimirLista(cabeza);
    if((fd = fopen("ejemplo_errores.txt","r"))!= NULL)
    {
        while((car = fgetc(fd))!= EOF)
        {
            switch(car)
            {
                case COMENTARIO:
                   if(esComentario(fd))
                      printf("COMENTARIO\n\n");
                   else
                      buscarFinLinea(fd);
                   break;
                case ESPACIOS_:
                case TABULADOR:
                   etiqueta = "null";
                   printf("ETIQUETA = %s\n",etiqueta);
                   ignorarEspacios(fd);
                   codop = Etiqueta_Codop_Operando(fd,CODOP);
                   printf("CODOP = %s\n",codop);
                   erroresCodop(codop);
                   combinacion = verificarCombinacion(fd);
                   if(combinacion == 2)
                   {
                       operando = "null";
                       printf("OPERANDO = %s\n\n",operando);
                   }
                   else
                   {
                       ignorarEspacios(fd);
                       operando = Etiqueta_Codop_Operando(fd,OPERANDO);
                       printf("OPERANDO = %s\n\n",operando);
                   }
                   break;
                default:
                   etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA);
                   printf("ETIQUETA = %s\n",etiqueta);
                   erroresEtiqueta(etiqueta);
                   combinacion = verificarCombinacion(fd);
                   if(combinacion == 2)
                   {
                       codop = "null";
                       printf("CODOP = %s\n",codop);
                       erroresCodop(codop);
                       operando = "null";
                       printf("OPERANDO = %s\n\n",operando);
                   }
                   else
                   {
                       ignorarEspacios(fd);
                       codop = Etiqueta_Codop_Operando(fd,CODOP);
                       printf("CODOP = %s\n",codop);
                       erroresCodop(codop);
                       combinacion = verificarCombinacion(fd);
                       if(combinacion == 2)
                       {
                           operando = "null";
                           printf("OPERANDO = %s\n\n",operando);
                       }
                       else
                       {
                           ignorarEspacios(fd);
                           operando = Etiqueta_Codop_Operando(fd,OPERANDO);
                           printf("OPERANDO = %s\n\n",operando);
                       }
                   }
                   break;
            }
            if((encontrado = buscarCodop(cabeza,codop)) == NULL)
               printf("NO SE ENCONTRO EL CODOP DE OPERACION\n");
        }
        ultimaLinea(codop);
    }
    else
       printf("No se pudo abrir el archivo");
    return 0;
}

booleano esComentario(FILE *fd)
{
    int car;
    while((car = fgetc(fd))!= '\n')
    {
        if(car == ';')
           return 0;
    }
    return 1;
}

void buscarFinLinea(FILE *fd)
{
    int car;
    while((car = fgetc(fd))!= '\n')
        ;
}

void ignorarEspacios(FILE *fd)
{
    int car;
    do
    {
        car = fgetc(fd);
    }while(car == '\t' || car == ' ');
}

int verificarCombinacion(FILE *fd)
{
    int car,combinacion;
    fseek(fd,-1,SEEK_CUR);
    if((car = fgetc(fd))== '\n')
       combinacion = 2;
    else
       combinacion = 1;
    return combinacion;
}

booleano esLetra(char caracter)
{
    if((caracter >= 'A' && caracter <= 'Z')||(caracter >= 'a' && caracter <= 'z'))
       return 1;
    else
       return 0;
}

booleano esNumero(char caracter)
{
    if(caracter >= '0' && caracter <= '9')
       return 1;
    else
       return 0;
}

char *Etiqueta_Codop_Operando(FILE *fd,int linea)
{
    int car,lon = 0,pos;
    char *cadena,*ptr;
    fseek(fd,-1,SEEK_CUR);
    pos = ftell(fd);
    if((linea == ETIQUETA)||(linea == CODOP))
    {
        do
        {
            car = fgetc(fd);
            lon++;
        }while(car != '\t' && car != ' ' && car != '\n');
    }
    else
    {
        do
        {
            car = fgetc(fd);
            lon++;
        }while(car != '\n');
    }
    cadena = (char*)calloc((lon+1),sizeof(char));
    fseek(fd,pos,SEEK_SET);
    fgets(cadena,lon+1,fd);
    if(((ptr=strchr(cadena,'\n'))!=NULL)||((ptr=strchr(cadena,'\t'))!=NULL)||((ptr=strchr(cadena,' '))!=NULL))
       *ptr = '\0';
    return cadena;
}

void ultimaLinea(char *codop)
{
    if((strcmp(codop,"end")) != 0)
       printf("Error:No se encontro el END.\n");
}

void quitarSaltosLinea(char *cadena)
{
    char *ptr;
    if(((ptr=strchr(cadena,'\n'))!=NULL)||((ptr=strchr(cadena,'\t'))!=NULL)||((ptr=strchr(cadena,' '))!=NULL))
       *ptr = '\0';
}

void listaTABOP(COD **cabeza)
{
    int car;
    FILE *hc12;
    COD *ultimo = NULL;
    char *ins;
    if((hc12 = fopen("Tabla_OP.txt","r"))!= NULL)
    {
         while((car = fgetc(hc12))!= EOF)
        {
            if(car != '\t')
            {
                ins = Tabla_Operandos(hc12);
                buscarFinLinea(hc12);
                if(*cabeza == NULL)
                   *cabeza = crearNodo(ins);
                else
                {
                    ultimo = ultimoElemento(cabeza);
                    insertarFinal(ins,ultimo);
                }
            }
            else
               buscarFinLinea(hc12);
        }
    }
    else
       printf("No se pudo abrir el archivo");
}

COD *ultimoElemento(COD **cabeza)
{
    COD *ptr;
    ptr = *cabeza;
    while(ptr->sig != NULL)
       ptr = ptr->sig;
    return ptr;
}

char *Tabla_Operandos(FILE *hc12)
{
    int car,lon = 0,pos;
    char *cadena;
    fseek(hc12,-1,SEEK_CUR);
    pos = ftell(hc12);
        do
        {
            car = fgetc(hc12);
            lon++;
        }while(car != '\t');
    fseek(hc12,pos,SEEK_SET);
    cadena = calloc((lon+1));
    fgets(cadena,lon+1,hc12);
    quitarSaltosLinea(cadena);
    return cadena;
}

COD *buscarCodop(COD *cabeza,char *codop)
{
    COD *ptr;
    for(ptr = cabeza;ptr != NULL;ptr = ptr->sig)
    {
        if(ptr->instruccion == codop)
           return ptr;
    }
    return NULL;
}

void insertarFinal(char *ins,COD *ultimo)
{
    ultimo->sig = crearNodo(ins);
    ultimo->sig->sig = NULL;
    ultimo = ultimo->sig;
}

COD *crearNodo(char *ins)
{
    int tam;
    COD *x;
    x = (COD*)malloc(sizeof(COD));
    tam = strlen(ins);
    x->instruccion = malloc(tam);
    strcpy(x->instruccion,ins);
    x->sig = NULL;
    return x;
}


#93
Saludos tengo una variable que es de tipo char** p, esto es para que sea un arreglo que contenga cadenas de tamaño variable y despues estas variables asignarselas al elemento nombre del mismo tipo que esta en una estructura, el problema es que el codigo me truena y no se por que

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 4

typedef struct
{
    char **nombre;
}CODOP;

int main()
{
    int tam,tam1,tam2,tam3,i;
    CODOP *x;
    char **p;
    x = (CODOP*)malloc(sizeof(CODOP));
    p = (char**)malloc(MAX*sizeof(char*));
    p[0] = "anita";
    p[1] = "lava";
    p[2] = "la";
    p[3] = "tina";
    tam = strlen(p[0]);
    tam1 = strlen(p[1]);
    tam2 = strlen(p[2]);
    tam3 = strlen(p[3]);
    x->nombre = (char**)malloc(MAX*sizeof(char*));
    x->nombre[0] = (char*)malloc((tam+1)*sizeof(char));
    x->nombre[1] = (char*)malloc((tam1+1)*sizeof(char));
    x->nombre[2] = (char*)malloc((tam2+1)*sizeof(char));
    x->nombre[3] = (char*)malloc((tam3+1)*sizeof(char));
    strcpy(x->nombre[0],p[0]);
    strcpy(x->nombre[1],p[1]);
    strcpy(x->nombre[2],p[2]);
    strcpy(x->nombre[3],p[3]);
    for(i = 0;i < MAX;i++)
       printf("%s\n",x->nombre[i]);
    return 0;
}


gracias de antemano
#94
Programación C/C++ / Process returned 0
19 Enero 2014, 23:40 PM
Saludos, tengo entendido que al compilar un programa si te aparece un mensaje que diga Process returned 0 (0x0) quiere decir que compilo bien y sin errores, pero a mi en el siguiente codigo no me aparece ese mensaje, pero tampoco me aparecen mensajes de error o warnings, el programa tiene que leer un archivo y almacenar algunos datos en la variable que le corresponda, pero no se donde esta el error?? y por que el programa no termina como deberia

int main()
{
   int car,i;
   FILE *hc12;
   COD *cabeza = NULL,*ultimo;
   char *ins,*op,*dir[MAX],*maq[MAX],*cal[MAX],*x_cal[MAX],*suma[MAX];
   if((hc12 = fopen("archivo.txt","r"))!= NULL)
   {
       while((car = fgetc(hc12))!= EOF)
       {
           i = 0;
           ins = Tabla_Operandos(hc12);
           printf("%s\t",ins);
           ignorarEspacios(hc12);
           op = Tabla_Operandos(hc12);
           printf("%s",op);
           do
           {
               ignorarEspacios(hc12);
               dir[i] = Tabla_Operandos(hc12);
               printf("\t\t%s\t",dir[i]);
               ignorarEspacios(hc12);
               maq[i] = Tabla_Operandos(hc12);
               printf("%s\t",maq[i]);
               ignorarEspacios(hc12);
               cal[i] = Tabla_Operandos(hc12);
               printf("%s\t",cal[i]);
               ignorarEspacios(hc12);
               x_cal[i] = Tabla_Operandos(hc12);
               printf("%s\t",x_cal[i]);
               ignorarEspacios(hc12);
               suma[i] = Tabla_Operandos(hc12);
               printf("%s\n",suma[i]);
               buscarFinLinea(hc12);
               i++;
           }while(car == '\t');
       }
   }
   return 0;
}

void buscarFinLinea(FILE *fd)
{
   int car;
   while((car = fgetc(fd))!= '\n')
       ;
}

void ignorarEspacios(FILE *fd)
{
   int car;
   do
   {
       car = fgetc(fd);
   }while(car == '\t' || car == ' ');
}

char *Tabla_Operandos(FILE *hc12)
{
   int car,lon = 0,pos;
   char *cadena;
   fseek(hc12,-1,SEEK_CUR);
   pos = ftell(hc12);
   do
   {
       car = fgetc(hc12);
       lon++;
   }while(car != '\t' && car != ' ');
   fseek(hc12,pos,SEEK_SET);
   cadena = calloc(lon+1);
   fgets(cadena,lon+1,hc12);
   quitarSaltosLinea(cadena);
   return cadena;
}


de antemano gracias
#95
Programación C/C++ / Lista con arrays
15 Enero 2014, 19:51 PM
Saludos tengo el siguiente archivo de texto:

ADCA****SI***IMM***89ii******1***1***2
**************DIR***99dd*****1***1***2   
**************EXT***B9hhll****1***2***3   
**************IDX***A9xb*****1***1***2   
**************IDX1**A9xbff****1***2***3   
**************IDX2**A9xbeeff**1***3***4   

los * son espacios
Y tengo que leer este archivo y que me guarde cada uno de los elementos en una variable para esto se me ocurrio que podia hacer una lista simplemente ligada que tuviera los elementos:

codop = ADCA, operando = SI y para los 5 elementos restantes pense que podria hacerlos con arreglos, que direccionamiento fuera algo como:

direc[0] = IMM
direc[1] = DIR
direc[2] = EXT
direc[3] = IDX
direc[4] = IDX1

y codigo maquina fuera:

maq[0] = 89ii
maq[1] = 99dd
maq[2] = B9hhl
....
....
esto seria un array de cadenas un char **direc y para los campos que tienen numeros seria un simple array, el codigo que tengo hecho es el siguiente pero me aparecen warnings que dicen assignment makes integer from pointer without a cast, y no entiendo por que,¿¿¿como corregirlo???

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

typedef struct nodo
{
   char *codigo;
   char *Operando;
   char **modo_direccionamiento;
   char **codigo_maquina;
   char *bytes_calculados;
   char *bytes_x_calcular;
   char *total_bytes;
   struct nodo *sig;
}COD;

void buscarFinLinea(FILE *hc12);
void ignorarEspacios(FILE *hc12);
char *Tabla_Operandos(FILE *hc12);
void insertarFinal(char *ins,char *op,char **dir,char **maq,char *calculado,char *calcular,char *total,COD *ultimo,int i);
COD *ultimoElemento(COD *cabeza);
COD *crearNodo(char *ins,char *op,char **dir,char **maq,char *calculado,char *calcular,char *total,int i);
void quitarSaltosLinea(char *cadena);

int main()
{
   COD *cabeza = NULL,*ultimo;
   FILE *hc12;
   int p,i,car;
   char *ins,*op,**dir,**maq,*calculado,*calcular,*total;
   if((hc12 = fopen("archivo.txt","r"))!= NULL)
   {
       i = 0;
       while((car = fgetc(hc12))!= EOF)
       {
           if(car != '\t')
           {
               ins = Tabla_Operandos(hc12);
               ignorarEspacios(hc12);
               op = Tabla_Operandos(hc12);
               ignorarEspacios(hc12);
               p = ftell(hc12);
               buscarFinLinea(hc12);
               if(car == '\t')
               {
                   fseek(hc12,p,SEEK_SET);
                   dir = (char**)malloc(8*sizeof(char));
                   dir[i] = Tabla_Operandos(hc12);
                   ignorarEspacios(hc12);
                   maq = (char**)malloc(8*sizeof(char));
                   maq[i] = Tabla_Operandos(hc12);
                   ignorarEspacios(hc12);
                   calculado = (char*)malloc(8*sizeof(char));
                   calculado[i] = Tabla_Operandos(hc12);
                   ignorarEspacios(hc12);
                   calcular = (char*)malloc(8*sizeof(char));
                   calcular[i] = Tabla_Operandos(hc12);
                   ignorarEspacios(hc12);
                   total = (char*)malloc(8*sizeof(char));
                   total[i] = Tabla_Operandos(hc12);
                   buscarFinLinea(hc12);
                   if(cabeza == NULL)
                      //cabeza = crearNodo(ins,op,dir,maq,calculado,calcular,total,i);
                   else
                   {
                       //ultimo = ultimoElemento(cabeza);
                       //insertarFinal(ins,op,dir,maq,calculado,calcular,total,ultimo);
                   }
                   i++;
               }
           }
       }
   }
   else
      printf("No se pudo abrir archivo\n");
   return 0;
}

void buscarFinLinea(FILE *fd)
{
   int car;
   while((car = fgetc(fd))!= '\n')
       ;
}

void ignorarEspacios(FILE *fd)
{
   int car;
   do
   {
       car = fgetc(fd);
   }while(car == '\t' || car == ' ');
}

char *Tabla_Operandos(FILE *hc12)
{
   int car,lon = 0,pos;
   char *cadena;
   fseek(hc12,-1,SEEK_CUR);
   pos = ftell(hc12);
   do
   {
       car = fgetc(hc12);
       lon++;
   }while(car != '\t');
   fseek(hc12,pos,SEEK_SET);
   cadena = (char*)calloc((lon+1),sizeof(char));
   fgets(cadena,lon+1,hc12);
   quitarSaltosLinea(cadena);
   return cadena;
}

void quitarSaltosLinea(char *cadena)
{
   char *ptr;
   if(((ptr=strchr(cadena,'\n'))!=NULL)||((ptr=strchr(cadena,'\t'))!=NULL)||((ptr=strchr(cadena,' '))!=NULL))
      *ptr = '\0';
}



de antemano gracias
#96
Saludos, tengo unas dudas con respecto a por que en algunas ocasiones se tienen que pasar los punteros por referencias?? como cuando estas haciendo una lista enlazada y quieres insertar por la cabeza, por que tienes que pasar el puntero por referencia, que no se supone que el puntero ya almacena una direccion de memoria y que por lo tanto no es necesario pasarlo asi funcion(&cabeza).

gracias
#97
Saludos, estoy haciendo una lista simplemente ligada la cual tiene un campo indice para que cada que vaya agregando un elemento sepa cuantos elementos tiene. El problema es que cuando inicializo ese campo a 0 dentro de la structura me aparece un error
typedef struct nodo
{
    char *codigo;
    int indice = 0;
    struct nodo *sig;
}NODO;


me dice que expected ':', ','...... or attribute before token

gracias
#98
Programación C/C++ / busqueda binaria en archivo
31 Diciembre 2013, 22:54 PM
Saludos

tengo la siguiente tabla de instrucciones(de un ensamblador) capturada en un archivo txt:

codop
ABA     NO   INH   1806     2   0   2
ABX     NO   IDX   1AE5     2   0   2
ABY     NO   IDX   19ED  2   0   2
ADC     SI   IMM   89ii     1   1   2
..
..
..

y tengo por ejemplo un codigo de operacion que dice ABY, el cual lo tengo que buscar en este archivo, para ello pense que seria mas rapido si lo hago con una busqueda binaria, pero me queda la duda de si tengo primero que guardar solamente los codigos de operacion(ABA,ADB...) en una estructura de datos para despues poder hacer la busqueda, o si tengo que recorrer el archivo completo linea por linea para saber cuantos codops son??  no les pido que posteen el codigo solo que me dijeran  cual podria ser la manera más optima y rapida de hacerlo

gracias
#99
Programación C/C++ / funcion strcmpi()
31 Diciembre 2013, 05:05 AM
Saludos

tengo una duda con respecto a si la funcion strcmpi esta recomendada usarla o no. tengo entendido que a diferencia de strcmp, esta no es estandar, y si tengo que comparar dos cadenas pero sin diferenciar mayusculas de minusculas no se si hacerlo con esta funcion o hacerlo yo todo el procedimiento

de antemano gracias, y felices fiestas
#100
Saludos tengo un programa que me tiene que leer un archivo como por ejemplo:

;comentario numero 1 =TALLER=
Et1       equ      $ffFF
dos         LDAA   @4732
;comentario numero 2 ¡Programacion!
;comentario numero 3
tres       sWi      x,5
Netq%23       RMB      556
Et12_xyz12  ADCA   1,PC

y me tiene que imprimir sus partes

COMENTARIO

ETIQUETA = Et1
CODOP = equ
OPERANDO = $ffFF
...
...
y asi con todas las lineas

el problema es que para las las etiquetas tengo dos reglas, una que su longitud no sea mayor a 8 caracteres y otra, que solo tenga letras, numeros y el guion bajo, si una etiqueta tiene otro caracter tengo que imprimir

Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo

pero para el Netq%23 me tendria que imprimir un mensaje de error, por que tiene el %, pero no imprime nada no entiendo por que

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LONG_ETIQUETA 8
#define LONG_CODOPS 5

typedef enum {FALSO,VERDADERO} booleano;
typedef enum {ETIQUETA,CODOP,OPERANDO} linea;

booleano esComentario(FILE *fd);
char *Etiqueta_Codop_Operando(FILE *fd,int linea);
void erroresEtiqueta(char *etiqueta);
void buscarFinLinea(FILE *fd);
void ignorarEspacios(FILE *fd);
booleano esNumero(char cadena[],int i);
booleano esLetra(char cadena[],int i);

int main()
{
    FILE *fd;
    int car;
    char *etiqueta,*codop,*operando;
    if((fd = fopen("P1ASM.txt","r"))!= NULL)
    {
        while((car = fgetc(fd))!= EOF)
        {
            if(car == ';')
            {
                if(esComentario(fd))
                   printf("COMENTARIO\n");
                else
                   buscarFinLinea(fd);
            }
            else if((car >= 'A' && car <= 'Z')||(car >= 'a' && car <= 'z'))
            {
                etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA);
                printf("\nETIQUETA = %s\n",etiqueta);
                erroresEtiqueta(etiqueta);
                ignorarEspacios(fd);
                codop = Etiqueta_Codop_Operando(fd,CODOP);
                printf("CODOP = %s\n",codop);
                ignorarEspacios(fd);
                operando = Etiqueta_Codop_Operando(fd,OPERANDO);
                printf("OPERANDO = %s\n\n",operando);
            }
        }
    }
    else
       printf("No se pudo abrir el archivo");
    return 0;
}

booleano esComentario(FILE *fd)
{
    int car;
    while((car = fgetc(fd))!= '\n')
    {
        if(car == ';')
           return 0;
    }
    return 1;
}

void buscarFinLinea(FILE *fd)
{
    int car;
    while((car = fgetc(fd))!= '\n')
        ;
}

void ignorarEspacios(FILE *fd)
{
    int car;
    do
    {
        car = fgetc(fd);
    }while(car == '\t' || car == ' ');
}

booleano esLetra(char *etiqueta,int i)
{
    if((etiqueta[i] >= 'A' && etiqueta[i] <= 'Z')||(etiqueta[i] >= 'a' && etiqueta[i] <= 'z'))
       return 1;
    else
       return 0;
}

booleano esNumero(char *etiqueta,int i)
{
    if(etiqueta[i] >= '0' && etiqueta[i] <= '9')
       return 1;
    else
       return 0;
}

char *Etiqueta_Codop_Operando(FILE *fd,int linea)
{
    int car,lon = 0,pos;
    char *cadena;
    fseek(fd,-1,SEEK_CUR);
    pos = ftell(fd);
    if(linea == ETIQUETA||linea == CODOP)
    {
        do
        {
            car = fgetc(fd);
            lon++;
        }while(car != '\t' && car != ' ');
    }
    else
    {
        while((car = fgetc(fd)) != '\n')
           lon++;
    }
    cadena = calloc((lon+1));
    fseek(fd,pos,SEEK_SET);
    fgets(cadena,lon+1,fd);
    return cadena;
}

void erroresEtiqueta(char *etiqueta)
{
    int tam,i,caracterInvalido = 0;
    tam = strlen(etiqueta);
    if(tam-1 > LONG_ETIQUETA)
       printf("\tError:la longitud maxima de una etiqueta es de ocho caracteres\n");
    for(i = 0;(i < tam)&&(caracterInvalido);i++)
    {
        if((!esLetra(etiqueta,i))&&(!esNumero(etiqueta,i))&&(!etiqueta[i] == '_'))
           caracterInvalido = 1;
    }
    if(caracterInvalido)
       printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n");
}


el resto del codigo funciona bien, solo tengo problema con esa parte

gracias
#101
Programación C/C++ / fgetc()
25 Diciembre 2013, 08:54 AM
Saludos

Yo sé que la función fgetc funciona con un argumento que es un stream de tipo FILE, pero tengo la duda de si fgetc puede aceptar argumentos de otros tipos como char*??

gracias
#102
Programación C/C++ / uso de strcat
21 Diciembre 2013, 03:13 AM
Saludos, tengo una duda sobre el uso de la función strcat.

si yo tengo una cadena inicializada en NULL, *cadena = NULL, y con un ciclo while quiero ir agregadole caracter por caracter podria hacer esto con el strcat que me vaya concatenando al final de la cadena caracter por caracter??

algo como asi:

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

int main()
{
    int i = 0;
    char *cadena = NULL,c[5],car;
    while(i < 5)
    {
        printf("Dame car\n");
        fgets(c,5,stdin);
        sscanf(c,"%c",&car);
        strcat(cadena,car);
        i++;
    }
    return 0;
}


es que el codigo no funciona y creo que es por el strcat

gracias
#103
Programación General / Singleton variables prolog
15 Diciembre 2013, 19:34 PM
Saludos, estoy haciendo mi primer programa en Prolog, es un simple árbol genealógico pero me aparece un warning que dice singleton variables[C,D] y no se que significa esto

los hechos del programa son del tipo padre(-,-) y madre(-,-).
hermanos(A,B):-padre(C,A),padre(C,B);madre(D,A),madre(D,B).
abuelo(E,A):-padre(E,padre(C,A)),padre(E,madre(D,A)).

?-abuelo(daniel,maria).

de antemano gracias
#104
Programación C/C++ / Diseño de Ensamblador
9 Diciembre 2013, 16:56 PM
Saludos

tengo que crear un programa que identifique las partes de una línea en lenguaje ensamblador, y para esto me dicen que necesito tener un archivo de texto creado previamente y

Leer línea a línea el archivo, pudiendo:
a. Leer cada línea directamente del archivo, de una por una y procesar cada línea que se va leyendo.
b. Leer todo el archivo con un ciclo y conforme se lee el archivo almacenarlo en una estructura de datos temporal, posteriormente leer de esta estructura de datos

Me dice que en ambos casos hay ventajas y desventajas. Deberás elegir la que sea más conveniente, recuerda que el  programa debe de irse completando con las siguientes practicas.

¿cuales son estas ventajas y desventajas?,¿Cuál de estas opciones es la mejor y la más fácil de implementar?, No quiero que me hagan la tarea solo que me den una ligera idea de como seria

gracias
#105
Saludos

Tengo una duda, si en la Arquitectura de Harvard la CPU esta conectada a dos memorias independientes(una para datos, otra para instrucciones), la CPU puede acceder a ambas memorias simultaneamente, por tener dos buses diferentes y a mayor velocidad, entonces por que la Arquitectura de Von Neumman es más utilizada, si parece que la otra tiene mas ventajas??

gracias
#106
Programación C/C++ / basura en mi programa
6 Diciembre 2013, 00:47 AM
Saludos estoy haciendo un programa que contiene un menu para elegir diferentes operaciones aritmeticas, ya se que no se puede usar fflush(stdin) para limpiar el buffer, pero ya le puse el fgets + sscanf en las partes donde crei que me daba problemas pero aun asi sigue con basura, tengo que cambiar cada uno de los scanf() que tengo en mi codigo por un fgets + sscanf???? lo que pasa es que son muchisimos y crei que con solo ponerle 2 seria mas que suficiente

#include <stdio.h>
#include <stdlib.h>
#define TAM 5
#define ARITMETICA_SIMPLE 1
#define ARITMETICA_BINARIA 2
#define FACTORIAL 3
#define TABLA_MULTIPLICAR 4
#define SALIR 5
int main()
{
    //Variables de uso interno del programa
    int continuar = 1,i,factorial = 1;
    //Variables para entrada de datos
    int opcion,numero1,numero2,numero_factorial,multiplicando,multiplicador;
    char operador,buffer[TAM];
    do
    {
        //Menu principal
        printf("CALCULADORA v1.0\n\n");
        printf("Elige una de las siguientes opciones:\n");
        printf("1. Aritmetica simple con suma de enteros a+b\n");
        printf("2. Aritmetica extendida binaria\n");
        printf("3. Factorial de n (n!)\n");
        printf("4. Detallar una tabla de multiplicar\n");
        printf("5. Salir\n");
        printf("Opcion a elegir? ");
        fgets(buffer,sizeof(buffer),stdin);
        sscanf(buffer,"%d",&opcion);
        switch(opcion)
        {
            //Aritmetica simple con suma de enteros a+b
            case ARITMETICA_SIMPLE:
               printf("Dame el valor de a = ");
               scanf("%d",&numero1);
               printf("Dame el valor de b = ");
               scanf("%d",&numero2);
               printf("%d + %d = %d",numero1,numero2,numero1+numero2);
               break;
            //Aritmetica extendida binaria (+,-,*,/,%modulo)
            case ARITMETICA_BINARIA:
               printf("Escribe el operador (+,-,*,/,%%): ");
               fgets(buffer,sizeof(buffer),stdin);
               sscanf(buffer,"%c",&operador);
               printf("\nDame el valor de a = ");
               scanf("%d",&numero1);
               printf("Dame el valor de b = ");
               scanf("%d",&numero2);
               switch(operador)
               {
                   case '+':
                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1+numero2);
                      break;
                   case '-':
                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1-numero2);
                      break;
                   case '*':
                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1*numero2);
                      break;
                   case '/':
                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1/numero2);
                      break;
                   case '%':
                      printf("%d %c %d = %d\n",numero1,operador,numero2,numero1%numero2);
                      break;
                   default:
                      printf("No hay un resultado calculable\n");
                      printf("%d %c %d = 0\n",numero1,operador,numero2);
               }
               break;
            //Factorial de n (n!)
            case FACTORIAL:
               printf("Dame el valor de n = ");
               scanf("%d",&numero_factorial);
               if(numero_factorial < 0)
                  printf("El factorial de %d no esta definido\n",numero_factorial);
               else if(numero_factorial == 0)
                  printf("El factorial de 0 es 1\n");
               else
               {
                   for(i = numero_factorial;i > 0;i--)
                      factorial*=i;
                   printf("El factorial de %d es %d\n",numero_factorial,factorial);
               }
               break;
            //Detallar una tabla de multiplicar
            case TABLA_MULTIPLICAR:
               printf("Dame el multiplicando i = ");
               scanf("%d",&multiplicando);
               printf("Dame hasta cual multiplicador n= ");
               scanf("%d",&multiplicador);
               printf("Tabla de multiplicar del %d\n",multiplicador);
               i = 1;
               while(i <= multiplicador)
               {
                   printf("%d\tX\t%d\t=\t%d\n",multiplicando,i,multiplicando*i);
                   i++;
               }
               break;
            //Salida del programa
            case SALIR:
               continuar = 0;
               break;
            default:
               printf("Opcion no valida!\n");
        }
        if(continuar)
           system("pause");
    }while(continuar);
    return 0;
}


de antemano gracias
#107
Programación C/C++ / problema al abrir archivo
4 Diciembre 2013, 22:13 PM
Saludos, tengo un archivo.txt guardado en x ruta, y quiero abrirlo en modo de solo lectura, pero tengo la duda si debo ingresarle en la funcion fopen la ruta completa donde se encuentra el archivo, o si puedo hacerlo de esta manera, el archivo se encuentra en el escritorio pero si lo hago de esta manera me imprime que no se pudo abrir archivo

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

int main()
{
   FILE *fd;
   if((fd = fopen("P1ASM.txt","r"))!= NULL)
   {
       printf("Si se pudo abrir archivo");
   }
   else
      printf("No se pudo abrir el archivo");
   return 0;
}


de antemano gracias
#108
Programación C/C++ / varias listas ligadas
4 Diciembre 2013, 00:20 AM
Saludos

Si tengo un codigo en el que tengo que crear diferentes listas simplemente ligadas, tendria que hacerlo como un arreglo de punteros?? para que cada uno de esos punteros apunte al primer nodo de la lista??

#109
Dudas Generales / Duda de matematicas
1 Diciembre 2013, 03:32 AM
Saludos

Tengo una duda respecto a unos ejercicios de matematicas, se que este es un foro de informatica y no de mate, pero espero que me pudieran ayudar con esto:

el ejercicio dice:  encuentra el orden de las siguientes expresiones:

a ) 3n! + 100 n^100
b) 3^(n+1) + 10^ n/2

tengo entendido que el orden de la suma de unas expresiones algebraicas es el el orden del mayor elemento o algo asi, como por ejemplo si tengo:

3n^2 + 5n + 2, el orden va a ser el mayor o sea n^2, pero de las expresiones anteriores no se como calcularlos porque tienen factoriales y n/2

gracias
#110
Programación C/C++ / Caballos
27 Noviembre 2013, 21:02 PM
Saludos, tengo un programa que dado un tamaño n de un tablero, me diga cual es el numero maximo de caballos que se pueden colocar en ese tablero sin atacarse? y de cuantas formas, el programa me tiene que dar maximo 10 soluciones solamente.

e hice un codigo que me pida una (x,y) aleatoria para poner en esa casilla al caballo y despues calcular los 8 movimientos posibles y asegurarme que no haya otra pieza en ninguna de esas 8 casillas que marque, para que no se ataquen,en caso de que si haya otro caballo que pueda atacar pedir otra (x,y) aleatoria, y asi sucesivamente hasta que tengo el total de caballos en el tablero, como son 10 tableros maximo, a cada uno le saco el numero total de caballos y esos totales los almaceno en un arreglo para despues buscar con una funcion el mayor de ellos. y ese seria mi maximo. Pero el problema es que ese no es el maximo, porque solo son 10 tableros, pero por ejemplo si fueran 20 tableros a los que les calculo su total de caballos puede ser que en alguno de esos haya un numero de caballos mayor que al mayor que calcule de los 10 tableros que tenia

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define NO_CASILLAS_DISPONIBLES 0
#define MAX_SOLUCIONES 10

void inicializarTablero(char **tablero,int n);
int insertarCaballos(char **tablero,int fila,int columna,int casillasDisponibles,int numCaballos,int n);
int verificarMovimientos(char **tablero,int fila,int columna,int casillasDisponibles,int n);
void imprimirTablero(char **tablero,int n);
int maximoCaballos(int totalCaballos[]);

int main()
{
   FILE *fd;
   int n,i,j = 0,fila,columna,numCaballos,totalCaballos[MAX_SOLUCIONES],casillasDisponibles,MaxCaballos;
   char **tablero;
   do
   {
       printf("Dame tamanio de tablero: ");
       scanf("%d",&n);
   }while(n < 2 || n > 20);/*
   if((fd = fopen("caballos_xx.txt","w"))!=NULL)
   {*/
       srand(time(NULL));
       tablero = malloc(n*sizeof(char*));
       for(i = 0;i < n;i++)
          tablero[i] = malloc(n);
       while(j < MAX_SOLUCIONES)
       {
           numCaballos = 0;
           casillasDisponibles = n*n;
           fila = rand() % n;
           columna = rand() % n;
           printf("(%d,%d)\n",fila,columna);
           inicializarTablero(tablero,n);
           totalCaballos[j] = insertarCaballos(tablero,fila,columna,casillasDisponibles,numCaballos,n);
           imprimirTablero(tablero,n);
           printf("\n\nEl numero maximo de caballos en esta solucion es de %d\n",totalCaballos[j]);
           j++;
       }
       MaxCaballos = maximoCaballos(totalCaballos);
       printf("\nEl numero maximo de caballos en un tablero de %d x %d sin atacarse es %d\n",n,n,MaxCaballos);/*
   }
   else
      printf("No se pudo crear archivo");*/
   return 0;
}

void inicializarTablero(char **tablero,int n)
{
   int i,j;
   for(i = 0;i < n;i++)
   {
       for(j = 0;j < n;j++)
          tablero[i][j] = '0';
   }
}

int insertarCaballos(char **tablero,int fila,int columna,int casillasDisponibles,int numCaballos,int n)
{
   if(casillasDisponibles > NO_CASILLAS_DISPONIBLES)
   {
       if(tablero[fila][columna] == '0')
       {
           tablero[fila][columna] = 'C';
           casillasDisponibles = verificarMovimientos(tablero,fila,columna,casillasDisponibles,n);
           numCaballos++;
           fila = rand() % n;
           columna = rand() %n;
           insertarCaballos(tablero,fila,columna,casillasDisponibles,numCaballos,n);
       }
       else
       {
           fila = rand() % n;
           columna = rand() %n;
           insertarCaballos(tablero,fila,columna,casillasDisponibles,numCaballos,n);
       }
   }
   else
      return numCaballos;
}

int verificarMovimientos(char **tablero,int fila,int columna,int casillasDisponibles,int n)
{
   int i,j,nuevaFila,nuevaColumna,eliminadas;
   eliminadas = casillasDisponibles-1;
   nuevaFila = fila + 2;
   nuevaColumna = columna -1;
   if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
   {
       tablero[nuevaFila][nuevaColumna] = 'x';
       eliminadas--;
   }
   nuevaFila = fila + 2;
   nuevaColumna = columna + 1;
   if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
   {
       tablero[nuevaFila][nuevaColumna] = 'x';
       eliminadas--;
   }
   nuevaFila = fila + 1;
   nuevaColumna = columna - 2;
   if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
   {
       tablero[nuevaFila][nuevaColumna] = 'x';
       eliminadas--;
   }
   nuevaFila = fila + 1;
   nuevaColumna = columna + 2;
   if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
   {
       tablero[nuevaFila][nuevaColumna] = 'x';
       eliminadas--;
   }
   nuevaFila = fila - 2;
   nuevaColumna = columna - 1;
   if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
   {
       tablero[nuevaFila][nuevaColumna] = 'x';
       eliminadas--;
   }
   nuevaFila = fila - 2;
   nuevaColumna = columna + 1;
   if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
   {
       tablero[nuevaFila][nuevaColumna] = 'x';
       eliminadas--;
   }
   nuevaFila = fila - 1;
   nuevaColumna = columna - 2;
   if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
   {
       tablero[nuevaFila][nuevaColumna] = 'x';
       eliminadas--;
   }
   nuevaFila = fila - 1;
   nuevaColumna = columna + 2;
   if((nuevaFila>=0&&nuevaFila<n)&&(nuevaColumna>=0&&nuevaColumna<n)&&(tablero[nuevaFila][nuevaColumna]=='0'))
   {
       tablero[nuevaFila][nuevaColumna] = 'x';
       eliminadas--;
   }
   return eliminadas;
}

void imprimirTablero(char **tablero,int n)
{
    int i,j;
    for(i = 0;i < n;i++)
    {
        printf("\n");
        for(j = 0;j < n;j++)
           printf("[%c]",tablero[i][j]);
    }
    printf("\n");
}

int maximoCaballos(int totalCaballos[])
{
    int Maximo,i;
    Maximo = totalCaballos[0];
    for(i = 1;i < MAX_SOLUCIONES;i++)
    {
        if(totalCaballos[i] > Maximo)
           Maximo = totalCaballos[i];
    }
    return Maximo;
}



este es el codigo, pero no entiendo como puedo hacer que me saque el maximo posible sin necesidad de cambiar todo el codigo, me costo un poco de trabajo hacerlo y entender como iba a ser el algoritmo y todo, por eso no  quiero empezar desde 0, si pudieran ayudarme se los agradeceria muchisimo

de antemano gracias
#111
Programación C/C++ / abrir archivo con default
26 Noviembre 2013, 22:08 PM
Saludos, yo siempre que utilizo archivos los creo y abro  indicandole al fopen que quiero crear mi archivo en la USB, pero ahora quiero usar la forma default solo que no se como hacerlo ni donde me va a crear y guardar los archivos:

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

void crearTablero(int n,int **tablero);

int main()
{
    FILE *pd;
if((pd = fopen("F:\\archivo.txt","w"))!= NULL)
   printf("Se ha creado archivo");
}


de antemano gracias
#112
Programación C/C++ / memoria dinamica y funciones
25 Noviembre 2013, 03:09 AM
saludos

tengo el siguiente codigo en el que le asigno memoria dinamica a una matriz en lenguaje C para poder ingresarle x numero de datos, el problema que tengo es que si quiero pasarle la matriz a una funcion para dentro de esta asignarle memoria dinamica el programa me truena, pero si se la asigno dentro del main el programa funciona correctamente y no se a que se debe, este es el codigo que me truena:

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

void inicializaTablero(char **tablero,int n);

int main()
{
    int n,i,j;
    char **tablero;
    printf("Dame tamanio de tablero: ");
    scanf("%d",&n);
    inicializaTablero(tablero,n);
    for(i = 0;i < n;i++)
    {
        printf("\n");
        for(j = 0;j < n;j++)
        printf("[%c]",tablero[i][j]);
    }
    return 0;
}

void inicializaTablero(char **tablero,int n)
{
    int i,j,k;
     tablero = (char**)malloc(n*sizeof(char*));
    for(i = 0;i < n;i++)
       tablero[i] = (char*)malloc(n);
    for(j = 0;j < n;j++)
    {
        for(k = 0;k < n;k++)
           tablero[j][k] = '0';
    }
}


y de esta manera si funciona:

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

int main()
{
    int n,i,j,k;
    char **tablero;
    printf("Dame tamanio de tablero: ");
    scanf("%d",&n);
    tablero = (char**)malloc(n*sizeof(char*));
    for(i = 0;i < n;i++)
       tablero[i] = (char*)malloc(n);
    for(j = 0;j < n;j++)
    {
        for(k = 0;k < n;k++)
           tablero[j][k] = '0';
    }
    for(i = 0;i < n;i++)
    {
        printf("\n");
        for(j = 0;j < n;j++)
        printf("[%c]",tablero[i][j]);
    }
    return 0;
}


de antemano gracias

#113
Programación C/C++ / desbordamiento de arreglos
24 Noviembre 2013, 01:41 AM
Saludos, si tengo una matriz en C, en la cual tengo que posicionarme en alguna de las casillas( le pido la fila y la columna al usuario), y despues a apartir de esa casilla quiero moverme x numero de celdas en el eje de las filas y x numero de celdas en el eje de las columnas, ¿Cual es a manera correcta de validar que la nueva posicion en la que me encuentro es una celda valida para que no se desborde el arreglo???,podria ser algo como esto?

void verificarCelda(char **arreglo,int filaInicial,int columnaInicial)
{
    if(arreglo[filaInicial + 2][columnaInicial - 1] != -1)
       printf("Celda valida");
}
#114
Programación C/C++ / matrices y memoria dinamica
22 Noviembre 2013, 23:13 PM
Saludos

si tengo  una matriz n x n, a la que quiero asignarle memoria dinamicamente porque su tamaño solo se puede saber en tiempo de ejecucion, cual es la manera correcta de hacerlo?

char **tablero;
     tablero = (char**)malloc(tamanio*sizeof(char*);


o esta otra:


char **tablero;
tablero = (char**)malloc(n*sizeof(char));
   for(i = 0;i < n;i++)
      tablero[i] = (char*)malloc(n*sizeof(char));


otra duda, estaba leyendo un manual sobre memoria dinamica y me decia que si hacia algo como esto me iba a dar error de compilacion que porque el compilador requiere que el tamaño del array o de la matriz sea constante:

int main()
{

    int num_estudiantes,i;
    printf("Dame numero de estudiantes: ");
    scanf("%d",&num_estudiantes);
    int asignatura[num_estudiantes];
    for(i = 0;i < num_estudiantes;i++)
    {
        printf("Dame un numero \n");
        scanf("%d",&asignatura[i]);
    }

pero ya lo probe y me compila correctamente, a que se debe esto??

gracias
#115
Programación C/C++ / copiar vectores de enteros
21 Noviembre 2013, 22:14 PM
Saludos

Tengo un arreglo de enteros y quiero copiarlo a otro arreglo, pense que lo podia hacer con la funcion strcpy(), pero despues me di cuenta que esta solo se usa para cadenas. Entonces que otra manera hay de hacer esto??

gracias
#116
Programación C/C++ / Lista doblemente ligada
14 Noviembre 2013, 23:54 PM
Saludos tengo una lista doblemente ligada que me inserta por la cabeza, por el final, despues y antes de un elemento que se le pide al usuario, todavia no esta terminado pero el problema que tengo es con el caso de insertar antes de un elemento dado, que me truena el programa y no entiendo por que, creo que el problema es que una vez que le pido al usuario el numero antes del que quiero ingresar mando llamar a la funcion anterior

#include <stdio.h>
#include <stdlib.h>
#define INSERTAR_CABEZA 1
#define INSERTAR_ANTES 2
#define INSERTAR_DESPUES 3
#define INSERTAR_FINAL 4
#define SALIR 5

typedef struct nodo
{
    int elemento;
    struct nodo *sig;
    struct nodo *ant;
}Nodo;

Nodo *crearNodo(int insertable);
void insertarCabeza(int insertable,Nodo **cabeza);
void insertar_antes(Nodo *anterior,int insertable);
void insertar_despues(Nodo *posterior,int insertable);
void insertarFinal(Nodo *ultimo,int insertable);
Nodo *buscarElemento(int elementoBuscado,Nodo *cabeza);
void imprimirLista(Nodo *cabeza);
Nodo *ultimoElemento(Nodo *cabeza);
Nodo *Anterior(Nodo *p);

int main()
{
    Nodo *cabeza,*anterior,*posterior,*p,*ultimo;
    cabeza = NULL;
    int continuar = 1,opcion,numElementos,insertable,elementoBuscado,i;
    printf("Lista Doblemente Enlazada!\n\n");
    do
    {
        printf("\nMenu\n");
        printf("1) Insertar cabeza de Lista\n");
        printf("2) Insertar antes de elementento\n");
        printf("3) Insertar despues de elemento\n");
        printf("4) Insertar final de Lista\n");
        printf("5) Salir\n");
        scanf("%d",&opcion);
        switch(opcion)
        {
            case INSERTAR_CABEZA:
               printf("Dame el numero de elementos de la lista: ");
               scanf("%d",&numElementos);
               for(i=0;i < numElementos;i++)
               {
                   printf("Dame el elemento a insertar: ");
                   scanf("%d",&insertable);
                   insertarCabeza(insertable,&cabeza);
                   system("cls");
               }
               imprimirLista(cabeza);
               break;
            case INSERTAR_ANTES:
               printf("Antes de que elemento se quiere insertar: ");
               scanf("%d",&elementoBuscado);
               if((p = buscarElemento(elementoBuscado,cabeza))!=NULL)
               {
                   printf("Dame el elemento a insertar: ");
                   scanf("%d",&insertable);
                   anterior = Anterior(p);
                   insertar_antes(anterior,insertable);
               }
               else
                  printf("No se encontro elemento!\n");
               imprimirLista(cabeza);
               break;
            case INSERTAR_DESPUES:
               printf("Despues de que elemento deseas insertar: ");
               scanf("%d",&elementoBuscado);
               if((posterior = buscarElemento(elementoBuscado,cabeza))!=NULL)
               {
                   printf("Dame el elemento a insertar: ");
                   scanf("%d",&insertable);
                   insertar_despues(posterior,insertable);
               }
               else
                  printf("No se encontro elemento!\n");
               imprimirLista(cabeza);
               break;
            case INSERTAR_FINAL:
               printf("Dame el numero de elementos de la lista: ");
               scanf("%d",&numElementos);
               if(estaVacia(cabeza))
               {
                   printf("Dame el elemento a insertar: ");
                   scanf("%d",&insertable);
                   cabeza = crearNodo(insertable);
                   numElementos--;
               }
               for(i = 0;i < numElementos;i++)
               {
                   ultimo = ultimoElemento(cabeza);
                   printf("Dame el elemento a insertar: ");
                   scanf("%d",&insertable);
                   insertarFinal(ultimo,insertable);
               }
               imprimirLista(cabeza);
               break;
            case SALIR:
               continuar = 0;
               break;
        }
        if(continuar)
            system("pause");
    }while(continuar);
    return 0;
}

Nodo *crearNodo(int insertable)
{
    Nodo *p;
    p = (Nodo*)malloc(sizeof(Nodo));
    p->elemento = insertable;
    p->sig = NULL;
    p->ant = NULL;
    return p;
}

void insertarCabeza(int insertable,Nodo **cabeza)
{
    Nodo *nuevo;
    nuevo = crearNodo(insertable);
    nuevo->sig = *cabeza;
    nuevo->ant = NULL;
    *cabeza = nuevo;
}

void insertar_antes(Nodo *anterior,int insertable)
{
    Nodo *nuevo;
    nuevo = crearNodo(insertable);
    anterior->sig->ant = nuevo;
    nuevo->ant = anterior;
    nuevo->sig = anterior->sig;
    anterior->sig = nuevo;
}

void insertar_despues(Nodo *posterior,int insertable)
{
    Nodo *nuevo;
    nuevo = crearNodo(insertable);
    posterior->sig->ant = nuevo;
    nuevo->ant = posterior;
    nuevo->sig = posterior->sig;
    posterior->sig = nuevo;
}

void insertarFinal(Nodo *ultimo,int insertable)
{
    ultimo->sig = crearNodo(insertable);
    ultimo->sig->sig = NULL;
    ultimo->sig->ant = ultimo;
}

void imprimirLista(Nodo *cabeza)
{
    Nodo *ptr;
    for(ptr = cabeza;ptr!=NULL;ptr = ptr->sig)
       printf("%d\t",ptr->elemento);
}

Nodo *buscarElemento(int elementoBuscado,Nodo *cabeza)
{
    Nodo *ptr;
    for(ptr = cabeza;ptr!=NULL;ptr = ptr->sig)
    {
        if(ptr->elemento == elementoBuscado)
           return ptr;
    }
    return NULL;
}

Nodo *ultimoElemento(Nodo *cabeza)
{
    Nodo *ptr;
    ptr = cabeza;
    while(ptr->sig!=NULL)
       ptr = ptr->sig;
    return ptr;
}

int estaVacia(Nodo *cabeza)
{
    if(cabeza == NULL)
       return 1;
    else
       return 0;
}

Nodo *Anterior(Nodo *p)
{
    return p->ant;
}


gracias
#117
Programación C/C++ / programa tarjetas
9 Noviembre 2013, 06:02 AM
Saludos

Tengo el siguiente programa que dice:

Tengo n tarjetas numeradas en cierto orden(al azar), y hay que eliminar algunas de esas tarjetas, de tal forma que las que queden esten ordenadas ascendentemente,  y cuyos valores esten entre el rango 1 <= valores <= 100,000, esto ya lo codifique pero el problema que tengo es que me pide encontrar el menor numero de tarjetas que se pueden eliminar y es lo que no entiendo como hacerlo, o sea que tengo que buscar todas las posibilidades y despues verificar cual es la que puede eliminar el menor numero de tarjetas?? el codigo es el siguiente:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define VALORES 100000

typedef struct nodo
{
   int dato;
   struct nodo *sig;
}Nodo;

void agregarTarjetas(int x,Nodo **cabeza);
void imprimirTarjetas(Nodo *cabeza);
void eliminarTarjetas(Nodo *cabeza);
Nodo *crearNodo(int x);


int main()
{
   int numeroTarjetas,i,x;
   Nodo *cabeza;
   cabeza = NULL;
   srand(time(NULL));
   do
   {
       printf("Dame numero de tarjetas: ");
       scanf("%d",&numeroTarjetas);
       system("cls");
   }while((numeroTarjetas < 1)||(numeroTarjetas > 100));
   for(i = 0;i < numeroTarjetas;i++)
   {
       x = rand()% VALORES+1;
       agregarTarjetas(x,&cabeza);
   }
   printf("Archivo original\n");
   imprimirTarjetas(cabeza);
   eliminarTarjetas(cabeza);
   printf("despues\n");
   imprimirTarjetas(cabeza);
   return 0;
}

void agregarTarjetas(int x,Nodo **cabeza)
{
   Nodo *nuevo;
   nuevo = crearNodo(x);
   nuevo->sig = *cabeza;
   *cabeza = nuevo;
}

Nodo *crearNodo(int x)
{
   Nodo *p;
   p = (Nodo*)malloc(sizeof(Nodo));
   p->dato = x;
   p->sig = NULL;
   return p;
}

void imprimirTarjetas(Nodo *cabeza)
{
   Nodo *ptr;
   for(ptr = cabeza;ptr!=NULL;ptr = ptr->sig)
      printf("[%d]",ptr->dato);
}

void eliminarTarjetas(Nodo *cabeza)
{
   Nodo *ptr1,*ptr2;
   for(ptr1 = cabeza,ptr2 = ptr1->sig;ptr2!=NULL;ptr2 = ptr2->sig)
   {
       if(ptr2->dato < ptr1->dato)
          ptr1->sig = ptr2->sig;
       else
          ptr1 = ptr1->sig;
   }
}


esta la hice con listas con apuntadores porque pense que seria mas facil hacer las eliminaciones, aunque tambien lo habia hecho de esta otra manera, y las dos funcionan solo que no se como hacer un algoritmo que me determine cual es el menor numero de tarjetas que se pueden eliminar

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define VALORES 100000

int *ingresarValores(int numeroTarjetas,FILE *fd);
void eliminarTarjetas(int tarjetas[],int numeroTarjetas,FILE *fd);

int main()
{
   FILE *fd;
   int numeroTarjetas,*tarjetas;
   srand(time(NULL));
   if((fd = fopen("F:\\Archivo_Analisis_Algoritmos.txt","w"))!= NULL)
   {
       do
       {
           printf("Dame el numero de tarjetas: ");
           scanf("%d",&numeroTarjetas);
           system("cls");
       }while((numeroTarjetas < 1)||(numeroTarjetas > 1000));
       fprintf(fd,"Archivo de Texto:\n\n");
       tarjetas = ingresarValores(numeroTarjetas,fd);
       eliminarTarjetas(tarjetas,numeroTarjetas,fd);
   }
   else
      printf("No se pudo crear archivo\n");
   return 0;
}

int *ingresarValores(int numeroTarjetas,FILE *fd)
{
   int i,*buffer;
   buffer = (int*)malloc(numeroTarjetas*sizeof(int));
   for(i = 0;i < numeroTarjetas;i++)
   {
       buffer[i] = rand()% VALORES+1;
       printf("[%d]",buffer[i]);
       fprintf(fd,"%d,",buffer[i]);
       if((i%10==0)&&(i!=0))
          fprintf(fd,"\n");
   }
   return buffer;
}

void eliminarTarjetas(int tarjetas[],int numeroTarjetas,FILE *fd)
{
   int i,j;
   for(i=0;i < numeroTarjetas;i++)
   {
       for(j=i+1;j < numeroTarjetas;j++)
       {
           if(tarjetas[j] < tarjetas[i])
              tarjetas[i] = -1;
       }
   }
   fprintf(fd,"\n\nTarjetas eliminadas\n");
   for(i=0;i < numeroTarjetas;i++)
   {
       if(tarjetas[i] != -1)
          fprintf(fd,"[%d]",tarjetas[i]);
   }

}


por ejemplo si tengo los numeros [11,500][22,924][13,449][21,933][13,150][1,858][11,516], se que el menor numero de eliminaciones serian 4, y quedaria asi:

[11,500][13,449][21,933], pero trate de buscarle la logica y no supe como

de antemano gracias
#118
Programación C/C++ / colores de texto
6 Noviembre 2013, 01:19 AM
Saludos

Si tengo un codigo con varios printf, y quiero cambiarle el color de fuente a solo uno de esos printf, como lo haria, intente con system("color"); pero imprime todo de ese color y no solo el printf que yo quiero,tendria que agregar alguna libreria o algo asi??

gracias
#119
Programación C/C++ / fwrite y estructuras
4 Noviembre 2013, 02:14 AM
Saludos

si tengo la siguiente estructura en la que tengo campos de tipo cadena y campos de tipo entero, cual es la manera para poder escribirlos en un archivo utilizando a fuerzas la funcion fwrite()??

typedef struct
{
    char nombre[MAX];
    int edad;
    char ciudad_residencia[MAX];
}Persona;


el problema que tengo es con el campo int me imprime basura  a la hora de escribir en el archivo:

int main()
{
    FILE *fd;
    Persona p;
    agregarDatos(&p);
    if((fd = fopen("F:\\gente.txt","w"))!=NULL)
    {
        fwrite(p.nombre,sizeof(char),strlen(p.nombre),fd);
        fwrite(&p.edad,sizeof(int),1,fd);// aqui esta el error
        fwrite(p.ciudad_residencia,sizeof(char),strlen(p.ciudad_residencia),fd);
    }
    else
       printf("No se pudo crear archivo\n");
    return 0;
}


tengo entendido que con el fprintf me puedo quitar de problemas, pero tengo que usar a fuerzas el fwrite

de antemano gracias

#120
Programación C/C++ / cambiar for a do-while
1 Noviembre 2013, 23:28 PM
Saludos tengo la siguiente funcion que tiene un for el cual quiero convertirlo a un do-while, pero no se bien como hacerlo

void imprimirLista(Nodo *cabeza)
{
   Nodo *p,*ult;
   for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig)
   {
       printf("%s\t",p->nombre);
       printf("%d\t",p->edad);
       printf("%s\n\n",p->ciudad_residencia);
   }
}

Nodo *fin(Nodo *cabeza)
{
   Nodo *ptr = cabeza;
   while(ptr->sig!= NULL)
       ptr = ptr->sig;
   return ptr;
}


el principal problema es que no se donde poner el p = p->sig en el do while?? probe con lo siguiente pero me marca errores

void imprimirLista(Nodo *cabeza)
{
   Nodo *p,*ult;
    p = cabeza;
    ult = fin(cabeza);
   do
   {
       printf("%s\t",p->nombre);
       printf("%d\t",p->edad);
       printf("%s\n\n",p->ciudad_residencia);
        p = p->sig;
   }while(p!=ult);
}


gracias
#121
Programación C/C++ / problema con do-while
31 Octubre 2013, 21:01 PM
Saludos

tengo que crear un programa que pida al usuario pares de números enteros y escriba su suma (con el formato "20 + 3 = 23")en pantalla y en un fichero llamado "sumas.txt", que se encontrará en un subdirectorio llamado "resultados".
  Cada vez que se ejecute el programa deberá añadir los nuevos resultados a continuación de los resultados anteriores

y el codigo es el siguiente y compila correctamente:

#include <stdio.h>
#include <stdlib.h>
#define TAM 10
/*
  Crear un programa que pida al usuario pares de números enteros y escriba su suma (con el formato "20 + 3 = 23")
  en pantalla y en un fichero llamado "sumas.txt", que se encontrará en un subdirectorio llamado "resultados".
  Cada vez que se ejecute el programa deberá añadir los nuevos resultados a continuación de los resultados anteriores.
*/

int main()
{
    FILE *fd;
    int numero1,numero2,suma,continuar = 1;
    char respuesta,cad[TAM];
    if((fd = fopen("F:\\resultados\\sumas.txt","a+"))!= NULL)
    {*/
        do
        {
            printf("Dame primer numero: ");
            fgets(cad,TAM,stdin);
            sscanf(cad,"%d",&numero1);
            printf("Dame segundo numero: ");
            fgets(cad,TAM,stdin);
            sscanf(cad,"%d",&numero2);
            suma = numero1+numero2;
            printf("%d + %d = %d",numero1,numero2,suma);
            printf("\n\nDesea hacer otra suma? (S/N)\n");
            fgets(cad,TAM,stdin);
            sscanf(cad,"%c",&respuesta);
            if(respuesta == 'N')
               continuar = 0;
        }while(continuar);
    }
    else
       printf("No se pudo crear archivo\n");
    return 0;
}
el problema es que si a la hora de hacerme la pregunta Desea hacer otra suma, yo quiero validar que la respuesta sea solamente o S o N, y si la respuesta es otro caracter que haga un while preguntandome si quiero otra suma hasta que el caracter sea valido, para esto le hice la siguiente modificacion al codigo pero el dowhile interior nunca se sale y no entiendo por que

#include <stdio.h>
#include <stdlib.h>
#define TAM 10
/*
  Crear un programa que pida al usuario pares de números enteros y escriba su suma (con el formato "20 + 3 = 23")
  en pantalla y en un fichero llamado "sumas.txt", que se encontrará en un subdirectorio llamado "resultados".
  Cada vez que se ejecute el programa deberá añadir los nuevos resultados a continuación de los resultados anteriores.
*/

int main()
{
    FILE *fd;
    int numero1,numero2,suma,continuar = 1;
    char respuesta,cad[TAM];
    if((fd = fopen("F:\\resultados\\sumas.txt","a+"))!= NULL)
    {
        do
        {
            printf("Dame primer numero: ");
            fgets(cad,TAM,stdin);
            sscanf(cad,"%d",&numero1);
            printf("Dame segundo numero: ");
            fgets(cad,TAM,stdin);
            sscanf(cad,"%d",&numero2);
            suma = numero1+numero2;
            printf("%d + %d = %d",numero1,numero2,suma);
            do
            {
                printf("\n\nDesea hacer otra suma? (S/N)\n");
                fgets(cad,TAM,stdin);
                sscanf(cad,"%c",&respuesta);
            }while((respuesta != 'S')||(respuesta != 'N'));
            if(respuesta == 'N')
               continuar = 0;
        }while(continuar);
    }
    else
       printf("No se pudo crear archivo\n");
    return 0;
}


de antemano gracias
#122
Programación C/C++ / agenda y archivos
28 Octubre 2013, 23:10 PM
Saludos, tengo que crear un programa que me cree Una agenda que maneje los siguientes datos: nombre, dirección, tlf móvil, email, y día, mes y año de nacimiento, Se podra añadir un dato nuevo, visualizar los nombres de las fichas existentes, o mostrar los datos

pero hay una parte que dice: leerá los datos de un fichero llamado "agenda.dat" (si existe). Al terminar, guardará todos los datos en ese fichero. y es lo que no entiendo bien que quiere decir, como voy a leer datos de un fichero si me esta diciendo que guarde todos los datos en el fichero al final y en la parte que dice añadir un dato nuevo, se refiere a agregar una Persona a la agenda con su nombre,direccion,tel... o a inventar un nuevo dato como edad o algo asi??

#include <stdlib.h>
#include <string.h>
#define AGREGAR 1
#define VISUALIZAR 2
#define MOSTRAR 3
#define SALIR 4
#define TAM 3
#define MAX 45
typedef struct datos
{
    char nombre[MAX];
    char direccion[MAX];
    char tlf_movil[MAX];
    char email[MAX];/*
    Fecha fechaNacimiento;*/
}Agenda;

void agregar_Persona(Agenda persona[],int i);
void visualizar_Nombres(Agenda persona[],int i);
void mostrar_datos(char nombreBuscar[],Agenda persona[],int i);

int main()
{
    int i = 0,continuar = 1,opcion;
    char nombreBuscar[MAX],op[TAM];
    FILE *fd;
    Agenda persona[TAM];/*
    if((fd = fopen("F:\\agenda.dat","w"))!= NULL)
    {*/
        do
        {
            printf("Menu\n");
            printf("1)Agregar Registro\n");
            printf("2)Visualizar Nombres\n");
            printf("3)Mostrar datos\n");
            printf("4)Salir\n");
            fgets(op,TAM,stdin);
            sscanf(op,"%d",&opcion);
            switch(opcion)
            {
                case AGREGAR:
                   if(i < TAM)
                   {
                       agregar_Persona(persona,i);
                       i++;
                   }
                   else
                      printf("No se permiten agregar mas de 100 registros");
                   break;
                case VISUALIZAR:
                   visualizar_Nombres(persona,i);
                   break;
                case MOSTRAR:
                   printf("Dame el nombre de la persona a mostrar: ");
                   fgets(nombreBuscar,MAX,stdin);
                   mostrar_datos(nombreBuscar,persona,i);
                   break;
                case SALIR:
                   continuar = 0;
                   break;
                default : printf("Opcion invalida!");
            }
            if(continuar)
            {
                system("pause");
                system("cls");
            }
        }while(continuar);
/*
    }*/
    return 0;
}

void agregar_Persona(Agenda persona[],int i)
{
    char cadena[MAX];
    printf("Dame nombre:\n");
    fgets(persona[i].nombre,MAX,stdin);
    printf("Dame direccion:\n");
    fgets(persona[i].direccion,MAX,stdin);
    printf("Dame telefono movil:\n");
    fgets(persona[i].tlf_movil,MAX,stdin);
    printf("Dame email:\n");
    fgets(persona[i].email,MAX,stdin);
    system("cls");
}

void visualizar_Nombres(Agenda persona[],int i)
{
    int j;
    for(j = 0;j < i;j++)
       printf("%s\n",persona[j].nombre);
}

void mostrar_datos(char nombreBuscar[],Agenda persona[],int i)
{
    int j;
    for(j = 0;j < i;j++)
    {
        if((strcmp(nombreBuscar,persona[j].nombre))== NULL)
        {
            printf("%s\n",persona[j].nombre);
            printf("%s\n",persona[j].direccion);
            printf("%s\n",persona[j].tlf_movil);
            printf("%s\n",persona[j].email);
        }
    }
}
#123
Programación C/C++ / Libreria de grafos
24 Octubre 2013, 01:19 AM
Saludos

Tengo que hacer un programa que me dice que cree un grafos simple( no permite mas de una arista entre dos vertices), que sean dirigido o no dirigido y que puede agregar o eliminar aristas y vertices, pero la verdad no tengo muy claro si debo de hacerlo con un arreglo de listas que es una opcion que me dijo el profesor que podia hacer, pero yo la veo muy dificil porque nunca he hecho un arreglo de listas, y tampoco se si tengo que pedirle el numero de vertices y de aristas al inicio del programa, si tengo que verificar que no este vacio el grafo antes de eliminar un vertice,si los vertices los represento como nodos las aristas tambien las tengo que crear como nodos??,puedo crear una arista aun si no tengo vertices?? esto lo tengo que validar tambien?? les agredeceria que me dieran algunas sugerencias de como empezarlo porque no tengo ni la mas minima idea

gracias
#124
Programación C/C++ / recorrer archivo binario
18 Octubre 2013, 23:22 PM
Saludos

Si tengo un arreglo de estructuras(o de registros), los cuales guardo en un archivo binario, para yo poder recorrer registro por registro(tomando en cuenta que tienen diferente longitud) en un archivo binario tengo que hacerlo secuencialmente o sea caracter por caracter, o puedo ir saltando de registro en registro hasta encontrar el que busco?? tengo que poner delimitadores entre cada registro para saber donde empieza uno y donde termina otro??

gracias
#125
Programación C/C++ / sustituir scanf
12 Octubre 2013, 04:29 AM
Saludos

Tengo el siguiente codigo en el que le ingresas datos a una estructura x, el programa compila correctamente pero tengo una duda, tengo entendido que cuando alternas una funcion como fgets() y scanf() te da problemas, y para esto le puse un ciclo while con un getchar(). Pero queria saber si podia sustituir el scanf por otra funcion que no me provoque basura en el buffer, para asi no tener que ponerle el while(getchar()!= '\n')

#include <stdio.h>
#include <stdlib.h>
#define TAM 20
#define MAX 10
typedef struct datos
{
   char nombre[TAM];
   int edad;
   char ciudad_residencia[TAM];
}Persona;

void entrada(Persona *p);

int main()
{
   Persona p;
   int i;
   for(i = 0;i < 10;i++)
      entrada(&p);
   return 0;
}

void entrada(Persona *p)
{
   printf("Dame nombre:\n");
   fgets(p->nombre,TAM,stdin);
   printf("Dame edad:\n");
   while(getchar()!='\n')
   scanf("%d",&p->edad);
   printf("Dame ciudad de residencia:\n");
   fgets(p->ciudad_residencia,TAM,stdin);
}


gracias
#126
Programación C/C++ / problema con strcmp
9 Octubre 2013, 21:54 PM
Saludos, tengo el siguiente codigo que me dice que tengo que ingresar nombres a un archivo de texto y en cuanto el usuario teclee la palabra fin termine, el problema es que el codigo no se detiene cuando le ingreso la palabra fin y no entiendo por que

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAM 10
/*
  Crea un programa que vaya leyendo las frases que el usuario teclea, y las guarde en un fichero de texto,
  llamado "registroDeUsuario.txt". Terminará cuando la frase introducida sea "fin"(esa frase no deberá guardarse en el fichero).
*/

int main()
{
   FILE *fd;
   int i = 0,continuar = 1;
   char nombre[TAM],cad[]= "fin",*p;
   if((fd = fopen("F:\\registroDeUsuario.txt","w"))!= NULL)
   {
       do
       {
           printf("Dame el nombre %d:\n",i++);
           fgets(nombre,TAM,stdin);
           if((p = strchr(nombre,'\n'))!=NULL)
              *p = '\0';
           fwrite(nombre,sizeof(char),strlen(nombre),fd);
           if(strcmp(nombre,cad) == 0)
              continuar = 1;
       }while(continuar);
   }
   else
      printf("No se pudo abrir archivo");
   return 0;
}


de antemano gracias




ya vi donde me equivoque, en la bandera continuar era 0 en vez de uno  :P
#127
Dudas Generales / Exception en codeblocks
6 Octubre 2013, 05:46 AM
saludos

Tengo un grave problema, no puedo abrir el codeblocks, cada vez que lo intento me aparece un mensaje que dice:

An exception has been raised, the application encountered an error at C:CB1211.... on line 237

The error message is

TinyXML error: Error document empty.
.......
......

a que se debe esto? que debo hacer??

gracias
#128
Saludos

Tengo el siguiente codigo que me tiene que comprimir un archivo cuando aparecen las siguientes palabras: de , para , con , desde , al ,y se tienen que sustituir con los siguientes signos: *, /, + ,- ,@ y escribir el texto comprimido(con las sustituciones) en otro archivo. El programa compila correctamente y me hace lo que le pido pero tiene algunos fallos, por ejemplo cuando utilizo sizeof() en unos for para sacar el numero de elementos me aparecen warnings, y tambien por ejemplo, yo se que el tamanio del texto que voy a comprimir es de 96 caracteres, por eso lo puse asi en los arreglos, pero si mi maestra quiere que me abra un archivo mas grande o mas chico no se si funcionara, como puedo corregir esto??como puedo hacer que funcione para cualquien tamanio de texto??ahh!! y otra duda, mi profesora nos dijo algo de que no queria que el archivo se sobreescribiera y que checaramos eso, no se bien a que se referia si alguien me pudiera ayudar tambien con eso se lo agradeceria

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

char ver_signos(char signo[],int i);
char *comprimir_archivo(char signo[],char arreglo[]);

int main()
{
    int i,tam,ini;
    char nombre[MAX],archivo[MAX],arreglo[96],*palabra,*producto,car,opcion,*ptr,sig;
    char *p[]={" de "," para "," con "," desde "," al "};
    char signo[]={'*','/','+','-','@'};
    FILE *fd,*ap;
    printf("Dame el nombre del archivo: ");
    fgets(nombre,MAX,stdin);
    if((ptr = strchr(nombre,'\n')) != NULL)
       *ptr = '\0';
    sprintf(archivo,"F:\\%s.txt",nombre);
    ap = fopen("F:\\Archivo_producto.txt","w");
    if((fd = fopen(archivo,"r"))!= NULL)
    {
        printf("Elige una opcion\n");
        printf("a) Comprimir archivo\n");
        printf("b) Descomprimir archivo\n");
        switch(opcion = getchar())
        {
            case 'A':case'a':
               fgets(arreglo,96,fd);
               for(i=0;i < 5;i++)
               {
                   fseek(fd,0,SEEK_SET);
                   while((car = fgetc(fd))!= EOF)
                   {
                       if(car == ' ')
                       {
                           ini = ftell(fd);
                           tam = strlen(p[i]);
                           palabra = (char*)malloc((tam+1)*sizeof(char));
                           fseek(fd,-1,SEEK_CUR);
                           fgets(palabra,tam+1,fd);
                           if((strcmp(palabra,p[i]))== 0)
                           {
                               sig = ver_signos(signo,i);
                               fseek(fd,ini,SEEK_SET);
                               arreglo[ini-1] = sig;
                           }
                           free(palabra);
                       }
                   }
               }
               producto = comprimir_archivo(signo,arreglo);
               fwrite(producto,sizeof(char),strlen(producto),ap);
               break;
               // me gustaria ponerle aqui el fwrite(arreglo,sizeof(char),strlen(arreglo),ap);
            case 'B': case 'b':/*
               for(i = 0;i < sizeof(signo);i++)
               {
                   while((car = fgetc(ap)))
               }
               break;*/
            default:
               printf("La opcion no existe\n");
        }
    }
    else
       printf("No se pudo abrir el archivo");
    return 0;
}

char ver_signos(char signo[],int i)
{
    int j;
    for(j = 0;j < sizeof(signo);j++)// warning por usar sizeof
    {
        if(j == i)
           return(signo[j]);
    }
}

char *comprimir_archivo(char signo[],char arreglo[])
{
    int tam[]={4,6,5,7,4},i,j,k;
    char a[96];
    for(i=0; i < sizeof(signo);i++)//warning por usar sizeof
    {
        for(j = 0,k = 0;j < 96;k++)
        {
            if(arreglo[j] == signo[i])
            {
                a[k] = arreglo[j];
                j = j+tam[i];
            }
            else
            {
                a[k] = arreglo[j];
                j++;
            }
        }
        memset(arreglo,0,96);
        strcpy(arreglo,a);
    }
    return arreglo;
}


Estas son las unicas fallas que le encontre al codigo, alomejor hay mas que no he notado, las sugerencias para hacerlo mas eficientes son bienvenidas

de antemano gracias
#129
Programación C/C++ / problema con archivos
1 Octubre 2013, 20:22 PM
Saludos tengo el siguiente programa que me lee un archivo que tiene nombres de personas separados por una coma y me pide que le ingrese un nombre y al final me tiene que imprimir el numero de veces que aparece ese nombre en el archivo solo que no me imprime la cantidad correcta

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAM 10

int main()
{
   FILE *fd;
   int i = 0,j = 0,tam;
   char captura[TAM],*cadena,*nombre,car;
   if((fd = fopen("F:\\nombre_archivo.txt","r"))!= NULL)
   {
       printf("Capture nombre a buscar: ");
       fgets(captura,TAM,stdin);
       tam = strlen(captura);
       nombre = (char*)malloc((tam+1)*sizeof(char));
       cadena = (char*)malloc((tam+1)*sizeof(char));
       strcpy(nombre,captura);
       while((car  = fgetc(fd))!=EOF)
       {
           while((car = fgetc(fd))!= ',')
           {
               cadena[j] = car;
               j++;
           }
           j = 0;
           if((strcmp(cadena,nombre)) == 0)
              i++;
       }
       printf("El nombre %s se encuentra %d veces en el archivo\n",nombre,i);
   }
   else
      printf("No se pudo abrir archivo");
   return 0;
}


gracias de antemano
#130
ASM / traducir ensamblador a codigo maquina
26 Septiembre 2013, 23:42 PM
Saludos tengo que sacar el codigo maquina de este programa en ensamblador

pero tengo una instruccion que no entiendo como va

0806                 BCD0             DS.B       1
....
....
....
E017   ??????    lbeq                FIN0       ; digito BCD0
....
....
...

                      FIN0               stab  BCD0

pero no se cual es el codigo correcto que va en los ????? por que por un lado lbeq tiene codigo maquina 18 27 qq rr y stab tiene codigo maquina 7b hh ll, yo supuse que como al lado de lbeq tiene FIN0 pues que tenia que brincarme hasta esa intruccion. ya intente leer manuales de esto pero no los comprendo, si alguien me pudiera ayudar se lo agradeceria mucho
#131
Programación C/C++ / problema con getc()
26 Septiembre 2013, 20:19 PM
Saludos

tengo el siguiente codigo que me tiene que leer un archivo de texto e imprimir cuantas veces aparece un caracter, para esto uso el fgetc para que vaya leyendo 1 por 1 pero no me imprime correctamente

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

int main()
{
   int i,tam,cont;
   char nombre[MAX],archivo[MAX],car,opcion,*ptr;
   FILE *fd,*ap;
   printf("Dame el nombre del archivo: ");
   fgets(nombre,MAX,stdin);
   if ((ptr = strchr(nombre, '\n')) != NULL)
      *ptr = '\0';
   sprintf(archivo,"F:\\%s.txt",nombre);
   ap = fopen("Archivo_producto","w");
   if((fd = fopen(archivo,"r"))!=NULL)
   {
       printf("Elige una opcion\n");
       printf("a) Comprimir archivo\n");
       printf("b) Descomprimir archivo\n");
       switch(opcion = getchar())
       {
           case 'A':case'a':
              cont = 0;
              fseek(fd,0,SEEK_END);
              tam = ftell(fd);
              fseek(fd,0,SEEK_SET);
                  for(i=0;i <= tam;i++)
                  {
                      if((car = fgetc(fd))== 'd');
                         cont++;
                  }
              printf("%d",cont);
              break;
           default:
              printf("La opcion no existe\n");
       }
   }
   else
      printf("No se pudo abrir el archivo");
   return 0;
}


de antemano gracias
#132
Programación C/C++ / problema con sprintf()
25 Septiembre 2013, 19:02 PM
Saludos

Tengo el siguiente programa que le pide al usuario que ingrese el nombre de cualquier archivo que desee abrir y una vez que teclea el nombre se lo asigna a un arreglo que se llama archivo, para esto uso el sprintf, pero no se cual es el problema que aunque le ingreso un archivo que si existe me aparece que no se pudo abrir archivo

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

int main()
{
   int i,j;
   char nombre[MAX],archivo[MAX];
   FILE *fd;
   printf("Dame el nombre del archivo: ");
   fgets(nombre,MAX,stdin);
   sprintf(archivo,"F:\\%s.txt",nombre);
   if((fd = fopen(archivo,"r"))!=NULL)
   {
       printf("Si se pudo abrir archivo");
   }
   else
      printf("No se pudo abrir el archivo");
   return 0;
}


de antemano gracias
#133
Programación C/C++ / serie de numeros en fichero
23 Septiembre 2013, 22:37 PM
Saludos tengo el siguiente codigo que mediante un for me tiene que imprimir 1000 numeros inversamente ordenados en un archivo con el mismo nombre, el problema es que me imprime basura en el archivo y no tengo idea de por que??

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

int main()
{
    int i;
    FILE *fd;
    if((fd = fopen("F:\\1000-Inversamente Ordenados.txt","w"))!=NULL)
    {
        for(i=1000;i > 0;i--)
        {
            fwrite(&i,sizeof(int),1,fd);
            fwrite("\n",sizeof(int),1,fd);
        }

    }
    else
       printf("No se pudo crear el archivo");
    return 0;
}


de antemano gracias
#134
Programación C/C++ / imprimir basura
20 Septiembre 2013, 06:01 AM
Saludos tengo el siguiente arreglo de 11 elementos

74,14,21,44,38,97,11,78,65,88,30  y quiero que me imprima el primer elemento (74), el quinto (97) y el 30 que es el ultimo, todo esto porque estoy empezando un metodo de ordenamiento pero no lo he terminado, el problema es que aunque si me imprime el primero y el quinto en el ultimo me imprime basura, en vez de imprimir el 30 me imprime 31 y no se por que

void  arreglo(int v[],int n)
{
    int i,j,k;
    k = n/2;
    for(j=0;j <= k;j+=k)
    {
        if(v[j] < v[j+k])
        {
            printf("[%d]",v[j]);
            printf("[%d]",v[j+k]);
        }
        else
        {
            printf("[%d]",v[j]);
            printf("[%d]",v[j+k]);
        }
    }
}


de antemano gracias

#135
Programación C/C++ / analisis codigos de ordenamiento
18 Septiembre 2013, 18:59 PM
Saludos tengo que codificar algunos codigos de ordenamiento y despues me pide que los compare de acuerdo a su tiempo de ejecucion, ya sea para un array de 1000, 10000 o 1000000, los codigos ya los tengo hechos

BURBUJA
#include <stdio.h>
#include <stdlib.h>
#define MAX 100

void Ordenacion_Burbuja(int v[],int n);

int main()
{
    int i,n,v[MAX];
    printf("Dame el numero de elementos del vector: ");
    scanf("%d",&n);
    for(i=0;i < n;i++)
    {
        printf("Dame el elemento numero %d:\n",i+1);
        scanf("%d",&v[i]);
        system("cls");
    }
    Ordenacion_Burbuja(v,n);

    for(i=0;i < n;i++)
       printf("[%d]",v[i]);
    return 0;
}

void Ordenacion_Burbuja(int v[],int n)
{
    int i,j,aux;
    for(i=1;i < n;i++)
    {
        for(j=0;j < n-i;j++)
        {
            if(v[j] > v[j+1])
            {
                aux = v[j+1];
                v[j+1] = v[j];
                v[j] = aux;
            }
        }
    }
}


INSERCION
#include <stdio.h>
#include <stdlib.h>
#define MAX 100

void metodo_Insercion(int v[],int n);

int main()
{
    int i,v[MAX],n;
    printf("Dame el numero de elementos del vector: ");
    scanf("%d",&n);
    for(i=0;i < n;i++)
    {
        printf("Dame el elemento numero %d:\n",i+1);
        scanf("%d",&v[i]);
        system("cls");
    }
    metodo_Insercion(v,n);
    for(i=0;i < n;i++)
       printf("[%d]",v[i]);
    return 0;
}

void metodo_Insercion(int v[],int n)
{
    int i,j,aux;
    for(i=1;i < n ;i++)
    {
        for(j=i;j > 0;j--)
        {
            if(v[j] < v[j-1])
            {
                aux = v[j];
                v[j] = v[j-1];
                v[j-1] = aux;
            }
        }
    }

}


SELECCION

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

void metodo_Seleccion();
int Minimo(int v[],int n);
void intercambiar(int pos,int v[]);

int main()
{
    int n,i,v[MAX],pos;
    printf("Dame el numero de elementos del vector: ");
    scanf("%d",&n);
    for(i=0;i < n;i++)
    {
        printf("Dame el elemento numero %d: ",i+1);
        scanf("%d",&v[i]);
        system("cls");
    }

    metodo_Seleccion(v,n);
    for(i=0;i < n;i++)
        printf("[%d]",v[i]);
    return 0;
}

void metodo_Seleccion(int v[],int n)
{
    int i,j,minimo,aux,pos;
    for(i=0;i < n;i++)
    {
        minimo = v[i];
        pos = i;
        for(j=i+1;j < n;j++)
        {
            if(v[j] < minimo)
            {
                minimo = v[j];
                pos = j;
            }
        }
        aux = v[pos];
        v[pos] = v[i];
        v[i] = aux;
    }
}


El problema es que no tengo idea como determinar los tiempos que le toma a cada uno ordenar un vector, como se puede hacer???

de antemano gracias