|
191
|
Programación / Programación C/C++ / Libreria de grafos
|
en: 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
|
Programación / Programación C/C++ / Re: recorrer archivo binario
|
en: 21 Octubre 2013, 21:39 pm
|
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); tamanioRegistro = (ftell(fd ) - suma ); arregloTam[i] = tamanioRegistro; suma+=tamanioRegistro; } 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; fgets(p [i ]. nombre,MAX ,stdin ); if((ptr = strchr(p [i ]. nombre,'\n'))!= NULL ) *ptr = '\0'; fgets(cad ,sizeof(cad ),stdin ); 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]; while(i < numeroRegistro-1) { posicion = arregloTam[i]; fseek(ap ,posicion ,SEEK_CUR ); i++; } tam = arregloTam[i]; }
|
|
|
193
|
Programación / Programación C/C++ / recorrer archivo binario
|
en: 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 / Programación C/C++ / Re: sustituir scanf
|
en: 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. edad,sizeof(int),1,fd ); fwrite(p. ciudad_residencia,sizeof(char),strlen(p. ciudad_residencia),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]; fgets(p ->nombre ,MAX ,stdin ); printf("Dame ciudad de residencia:\n"); fgets(p ->ciudad_residencia ,MAX ,stdin ); } void mostrar(FILE *ap) { int car; while((car = fgetc(ap ))!= EOF ) }
disculpa que haga tantas preguntas, pero es que apenas estoy empezando a familiarizarme con archivos, gracias
|
|
|
195
|
Programación / Programación C/C++ / Re: sustituir scanf
|
en: 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 / Programación C/C++ / Re: sustituir scanf
|
en: 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 ); 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]; fgets(p ->nombre ,MAX ,stdin ); printf("Dame ciudad de residencia:\n"); fgets(p ->ciudad_residencia ,MAX ,stdin ); } void mostrar(FILE *ap) { int car; while((car = fgetc(ap ))!= EOF ) }
|
|
|
197
|
Programación / Programación C/C++ / Re: sustituir scanf
|
en: 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]; fgets(p ->nombre ,MAX ,stdin ); fgets(cad ,10,stdin );// aqui tiene una array de 10 elementos pero solo ocupo un int }
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. ciudad_residencia); 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]; fgets(p ->nombre ,MAX ,stdin ); printf("Dame ciudad de residencia:\n"); fgets(p ->ciudad_residencia ,MAX ,stdin ); } void mostrar(FILE *ap) { int car; while((car = fgetc(ap ))!= EOF ) }
|
|
|
198
|
Programación / Programación C/C++ / Re: sustituir scanf
|
en: 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 / Programación C/C++ / sustituir scanf
|
en: 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) { fgets(p ->nombre ,TAM ,stdin ); printf("Dame ciudad de residencia:\n"); fgets(p ->ciudad_residencia ,TAM ,stdin ); }
gracias
|
|
|
200
|
Programación / Programación C/C++ / problema con strcmp
|
en: 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 ++); if((p = strchr(nombre ,'\n'))!=NULL ) *p = '\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
|
|
|
|
|
|
|