Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Mensajes - m@o_614

#191
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
#192
muchas gracias eferion por tu respuesta, el programa lo que hace es que me pide que le ingrese 10 registros que contengan(nombre,edad y ciudad residencia) y despues me pide un numero del 1 al 10 y me tiene que imprimir ese registro, el problema es que si le pido por ejemplo el registro numero 2 y este registro es:

marco22guadalajara, (nombre,edad, ciudad) el programa me imprime marco22guadalajar, o sea que se come la ultima letra y ya lo revise pero no entiendo por que hace esto

El programa basicamente me hace un arreglo del tamanio de cada registro para ver donde esta cada uno
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 35
#define TAM 10
/*
  Ampliar el programa anterior para que use un "array de structs", de forma que se puedan tener datos de 10 personas.
  Se deberán pedir  los datos de las 10 personas y guardarlos en el fichero, Después se pedirá un número del 1 al 10
  y se mostrarán los datos de la persona indicada por ese número,que se deberán leer de fichero
  (1 será la primera ficha, y 10 será la última). Por ejemplo,
  si el usuario indica que quiere ver los datos de la persona 3 (tercera), se deberá leer las dos primeras,
  ignorando su contenido, y después leer la tercera, que sí se deberá mostrar.
*/
typedef struct datos
{
   char nombre[MAX];
   int edad;
   int tamanio;
   char ciudad_residencia[MAX];
}Persona;

void agregarRegistro(Persona p[],int i);
void buscarRegistro(FILE *ap,int numeroRegistro,int arregloTam[]);

int main()
{
   Persona p[TAM];
   int i,numeroRegistro,tamanioRegistro,suma = 0,arregloTam[TAM];
   FILE *fd,*ap;
   if((fd = fopen("F:\\gente.txt","w+"))!= NULL)
   {
       for(i = 0;i < TAM;i++)
       {
           agregarRegistro(p,i);
           fprintf(fd,"%s%d%s",p[i].nombre,p[i].edad,p[i].ciudad_residencia);
           fseek(fd,0,SEEK_END);
           tamanioRegistro = (ftell(fd) - suma);
           arregloTam[i] = tamanioRegistro;
           suma+=tamanioRegistro;
           system("cls");
       }
       fclose(fd);
       if((ap = fopen("F:\\gente.txt","r"))!= NULL)
       {
           printf("Dame un numero(del 1 al 10): ");
           scanf("%d",&numeroRegistro);
           buscarRegistro(ap,numeroRegistro,arregloTam);
       }
       else
          printf("No se pudo abrir archivo");
   }
   else
      printf("No se pudo crear archivo");
   return 0;
}

void agregarRegistro(Persona p[],int i)
{
   char cad[10],*ptr;
   printf("Dame nombre:\n");
   fgets(p[i].nombre,MAX,stdin);
   if((ptr = strchr(p[i].nombre,'\n'))!= NULL)
      *ptr = '\0';
   printf("Dame edad:\n");
   fgets(cad,sizeof(cad),stdin);
   sscanf(cad,"%d",&p[i].edad);
   printf("Dame ciudad de residencia:\n");
   fgets(p[i].ciudad_residencia,MAX,stdin);
   if((ptr = strchr(p[i].ciudad_residencia,'\n'))!= NULL)
      *ptr = '\0';
}

void buscarRegistro(FILE *ap,int numeroRegistro,int arregloTam[])
{
   int i = 0,posicion,tam;
   char Registro[100];
   fseek(ap,0,SEEK_SET);
   while(i < numeroRegistro-1)
   {
       posicion = arregloTam[i];
       fseek(ap,posicion,SEEK_CUR);
       i++;
   }
   tam = arregloTam[i];
   fgets(Registro,tam,ap);
   printf("%s",Registro);
}

#193
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
#194
Programación C/C++ / Re: sustituir scanf
17 Octubre 2013, 17:10 PM
Saludos

ya le puse que me escribiera con los fwrite, uno para cada campo porque no queria escribir bytes de mas, pero en el segundo fwrite() no me imprime el numero correcto, no se si es porque fwrite el primer argumento tiene que ser una cadena o arreglo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
/*
   Crear un "struct" que almacene los siguientes datos de una persona: nombre, edad, ciudad de residencia.
   Pedir al usuario esos datos de una persona y guardarlos en un fichero llamado "gente.dat", cerrar el fichero,
   volverlo a abrir para lectura y mostrar los datos que se habían guardado.
*/
typedef struct datos
{
    char nombre[MAX];
    int edad;
    char ciudad_residencia[MAX];
}Persona;

void entrada(Persona *p);
void mostrar(FILE *ap);

int main()
{
    FILE *fd,*ap;
    Persona p;
    if((fd = fopen("F:\\gente.txt","w"))!= NULL)
    {
        entrada(&p);
        fwrite(p.nombre,sizeof(char),strlen(p.nombre),fd);
        fwrite(&p.edad,sizeof(int),1,fd);
        fwrite(p.ciudad_residencia,sizeof(char),strlen(p.ciudad_residencia),fd);
        fclose(fd);
        if((ap = fopen("F:\\gente.txt","r"))!= NULL);
           mostrar(ap);
    }
    else
       printf("No se pudo crear archivo");
    return 0;
}

void entrada(Persona *p)
{
    char cad[10];
    printf("Dame nombre:\n");
    fgets(p->nombre,MAX,stdin);
    printf("Dame edad:\n");
    fgets(cad,10,stdin);
    sscanf(cad,"%d",&p->edad);
    printf("Dame ciudad de residencia:\n");
    fgets(p->ciudad_residencia,MAX,stdin);
    system("cls");
}

void mostrar(FILE *ap)
{
    int car;
    while((car = fgetc(ap))!= EOF)
       printf("%c",car);
}


disculpa que haga tantas preguntas, pero es que apenas estoy empezando a familiarizarme con archivos, gracias
#195
Programación C/C++ / Re: sustituir scanf
17 Octubre 2013, 00:36 AM
ya entendi en donde estaba el error, sizeof(Persona) es igual a 44 porque toma las elementos de la struct completos, otra duda, estaba leyendo en una pagina de internet y me decia que cuando estoy guardando estructuras en un archivo de texto tengo que hacerlo campo por campo, o sea que tendria que usar 3 fwrites() y cuando estoy abriendo el archivo en binario puedo hacerlo todo en un solo paso, si es asi o no?

gracias de nuevo
#196
Programación C/C++ / Re: sustituir scanf
16 Octubre 2013, 05:10 AM
una ultima pregunta, si le quiero hacer una modificacion al codigo y en vez de que me guarde los datos de la estructura en el archivo con fprintf quiero que lo haga con fwrite, ya no funciona como lo hacia con fprintf ahora me imprime basura, por que sucede esto??

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
/*
   Crear un "struct" que almacene los siguientes datos de una persona: nombre, edad, ciudad de residencia.
   Pedir al usuario esos datos de una persona y guardarlos en un fichero llamado "gente.dat", cerrar el fichero,
   volverlo a abrir para lectura y mostrar los datos que se habían guardado.
*/
typedef struct datos
{
    char nombre[MAX];
    int edad;
    char ciudad_residencia[MAX];
}Persona;

void entrada(Persona *p);
void mostrar(FILE *ap);

int main()
{
    FILE *fd,*ap;
    Persona p;
    if((fd = fopen("F:\\gente.txt","w"))!= NULL)
    {
        entrada(&p);
        fwrite(&p,sizeof(Persona),1,fd);
        fclose(fd);
        if((ap = fopen("F:\\gente.txt","r"))!= NULL);
           mostrar(ap);
    }
    else
       printf("No se pudo crear archivo");
    return 0;
}

void entrada(Persona *p)
{
    char cad[10];
    printf("Dame nombre:\n");
    fgets(p->nombre,MAX,stdin);
    printf("Dame edad:\n");
    fgets(cad,10,stdin);
    sscanf(cad,"%d",&p->edad);
    printf("Dame ciudad de residencia:\n");
    fgets(p->ciudad_residencia,MAX,stdin);
    system("cls");
}

void mostrar(FILE *ap)
{
    int car;
    while((car = fgetc(ap))!= EOF)
       printf("%c",car);
}

#197
Programación C/C++ / Re: sustituir scanf
15 Octubre 2013, 22:28 PM
muchas gracias Eternal Idol ya cheque el enlace que dejaste, y ya pude hacer el codigo que me tiene que ingresar datos de una estructura en un archivo, cerrarlo y despues que me imprima en pantalla los datos que se habian guardado, pero tengo otra duda, cada vez que utilizas fgets() es necesario quitarle el salto de linea '\n', se recomienda hacer eso?? y tambien en el sscanf si quiero que lo que me ingrese sea un entero no se desperdicia espacio en el array que le puse asi:

void entrada(Persona *p)
{
    char cad[10];
    printf("Dame nombre:\n");
    fgets(p->nombre,MAX,stdin);
    printf("Dame edad:\n");
    fgets(cad,10,stdin);// aqui tiene una array de 10 elementos pero solo ocupo un int
    sscanf(cad,"%d",&p->edad);
}


aqui esta el codigo completo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
/*
   Crear un "struct" que almacene los siguientes datos de una persona: nombre, edad, ciudad de residencia.
   Pedir al usuario esos datos de una persona y guardarlos en un fichero llamado "gente.dat", cerrar el fichero,
   volverlo a abrir para lectura y mostrar los datos que se habían guardado.
*/
typedef struct datos
{
    char nombre[MAX];
    int edad;
    char ciudad_residencia[MAX];
}Persona;

void entrada(Persona *p);
void mostrar(FILE *ap);

int main()
{
    FILE *fd,*ap;
    Persona p;
    if((fd = fopen("F:\\gente.txt","w"))!= NULL)
    {
        entrada(&p);
        fprintf(fd,"%s\n",p.nombre);
        fprintf(fd,"%d\n",p.edad);
        fprintf(fd,"%s\n",p.ciudad_residencia);
        fclose(fd);
        if((ap = fopen("F:\\gente.txt","r"))!= NULL);
           mostrar(ap);
    }
    else
       printf("No se pudo crear archivo");
    return 0;
}

void entrada(Persona *p)
{
    char cad[10];
    printf("Dame nombre:\n");
    fgets(p->nombre,MAX,stdin);
    printf("Dame edad:\n");
    fgets(cad,10,stdin);
    sscanf(cad,"%d",&p->edad);
    printf("Dame ciudad de residencia:\n");
    fgets(p->ciudad_residencia,MAX,stdin);
    system("cls");
}

void mostrar(FILE *ap)
{
    int car;
    while((car = fgetc(ap))!= EOF)
       printf("%c",car);
}
#198
Programación C/C++ / Re: sustituir scanf
14 Octubre 2013, 19:19 PM
Saludos Eternal Idol, por lo que he entendido la funcion sscanf obtiene la entrada de un arreglo y no de un stream, entonces si yo quisiera ponerle un stdin para indicarle que va a tomar la entrada de lo que le ingrese por el teclado me va a dar error, que puedo hacer en este caso?

de antemano gracias
#199
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
#200
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