|
181
|
Programación / Programación C/C++ / fwrite y estructuras
|
en: 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. 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
|
|
|
182
|
Programación / Programación C/C++ / Re: cambiar for a do-while
|
en: 2 Noviembre 2013, 06:27 am
|
gracias rir3760, de hecho ya me habia fijado que la funcion no me imprime el ultimo elemento de la lista, por esto pense que era buena idea hacer un do-while() porque como la condicion se realiza al final si me imprimiria el ultimo elemento y ya despues se saldria. y pues tambien quedaria pendiente lo de verificar que no este vacia, la funcion me imprimiria correctamente si en la funcion fin cambiara el p->sig!= NULL por p!=NULL, tal como me dijiste : void imprimirLista(Nodo *cabeza) { Nodo *p,*ult; for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig) } Nodo *fin(Nodo *cabeza) { Nodo *ptr = cabeza; while(ptr!=NULL) ptr = ptr->sig; return ptr; }
solo que como tambien quiero hacer un CASE para que tenga la opcion de ingresarme por el final, entonces a fuerzas tengo que hacer la comparacion while(p->sig !=NULL) porque p seria el puntero que apunta al ultimo elemento que es el que necesito para ingresar por la cola,por eso pense que necesitaba el do while a fuerzas,porque quiero que la funcion fin me regrese el puntero que en su campo siguiente tiene NULL, no se si me di a entender en esto ultimo, de todos modos gracias
|
|
|
183
|
Programación / Programación C/C++ / cambiar for a do-while
|
en: 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\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\n\n",p ->ciudad_residencia ); p = p->sig; }while(p!=ult); }
gracias
|
|
|
184
|
Programación / Programación C/C++ / Re: Duda sobre lista de un typedef struct
|
en: 1 Noviembre 2013, 22:02 pm
|
Te refieres a algo como esto?? typedef struct archivo{ Cadena Contenido; Cadena Atributos; Cadena nombreArchivo; }Archivo; typedef struct listaArchivos{ Archivo archivos[TAM];//numero de archivos que quieras o *archivo listaArchivos *siguiente; }Lista;
|
|
|
185
|
Programación / Programación C/C++ / problema con do-while
|
en: 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: "); printf("Dame segundo numero: "); suma = numero1+numero2; printf("%d + %d = %d",numero1 ,numero2 ,suma ); printf("\n\nDesea hacer otra suma? (S/N)\n"); 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: "); printf("Dame segundo numero: "); suma = numero1+numero2; printf("%d + %d = %d",numero1 ,numero2 ,suma ); do { printf("\n\nDesea hacer otra suma? (S/N)\n"); }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
|
|
|
186
|
Programación / Programación C/C++ / Re: Libreria de grafos
|
en: 30 Octubre 2013, 05:04 am
|
Saludos, ya comence a hacer el codigo, primero tengo una typedef struct que me indica que voy a tener una matriz de tipo int a la que le tengo que asignar memoria dinamicamente y el numero de vertices, le pido cuantos vertices y aristas quiero, y despues inicializo el grafo, osea que cada uno de los elementos de la matriz sean -1 indicandome que no hay arista entre los vertices i y j, pero no se si esta parte y la de agregarArista estan bien hechas, exactamente esta parte: void inicializaGrafo(Grafo *grafo,int num) { int i,j,valor; grafo->numVertices = num; grafo ->elementos = (int**)malloc(valor = num *num *sizeof(int)); for(i=0;i < num;i++) { for(j=0;j < num;j++) grafo->elementos[i][j] = -1; } }
el codigo completo es este: #include <stdio.h> #include <stdlib.h> #define AGREGAR_ARISTAS 1 #define ELIMINAR_ARISTAS 2 #define SALIR 3 typedef struct { int **elementos; int numVertices; }Grafo; int max_aristas(int num); void agregarArista(int arista,int vertice1,int vertice2,Grafo *grafo); int main() { Grafo grafo; int opcion,numAristas,num,continuar = 1,maximo,arista,vertice1,vertice2; printf("Libreria de Grafos!!\n"); printf("Dame numero de vertices: "); printf("Dame numero de aristas: "); maximo = max_aristas(num); if(numAristas > maximo) printf("Error! El grafo no puede tener mas de %d aristas",maximo ); else { inicializaGrafo(&grafo,num); do { printf("1. Agregar Arista\n"); printf("2. Eliminar Vertice\n"); printf("3. Eliminar Arista\n"); case AGREGAR_ARISTAS: printf("Dame el valor de la arista: "); printf("Dame el valor del primer vertice: "); printf("Dame el valor del segundo vertice: "); agregarArista(arista,vertice1,vertice2,&grafo); break; case ELIMINAR_ARISTAS: //eliminarArista(); break; case SALIR: continuar = 0; break; default: printf("Opcion invalida\n"); }while(continuar); } return 0; } int max_aristas(int num) { int maximo; maximo = (num(num-1))/2; return maximo; } void inicializaGrafo(Grafo *grafo,int num) { int i,j,valor; grafo->numVertices = num; grafo ->elementos = (int**)malloc(valor = num *num *sizeof(int)); for(i=0;i < num;i++) { for(j=0;j < num;j++) grafo->elementos[i][j] = -1; } } void agregarArista(int arista,int vertice1,int vertice2,Grafo *grafo) { grafo->elementos[vertice1][vertice2] = arista; }
gracias
|
|
|
187
|
Programación / Programación C/C++ / Re: agenda y archivos
|
en: 29 Octubre 2013, 21:22 pm
|
rir3760 pero si NULL retorna un puntero tipo void, que no se supone que void puede apuntar a cualquier tipo de dato??? y una cosa mas si en la estructura typedef tengo el campo fecha de nacimiento de esta manera: ypedef struct { int dia; int mes; int año; }Fecha; typedef struct datos { char nombre[MAX]; char direccion[MAX]; char tlf_movil[MAX]; char email[MAX]; Fecha fechaNacimiento; }Agenda;
y despues quiero agregarle la fecha de nacimiento usando el fgets y el sscanf podria ser de esta manera?? void agregar_Persona(Agenda persona[],int i) { char cadena[MAX]; fgets(persona [i ]. nombre,MAX ,stdin ); fgets(persona [i ]. direccion,MAX ,stdin ); printf("Dame telefono movil:\n"); fgets(persona [i ]. tlf_movil,MAX ,stdin ); fgets(persona [i ]. email,MAX ,stdin ); printf("Dame fecha de nacimiento:\n"); sscanf(cadena ,"%d",&datos [i ]. fechaNacimiento. dia); sscanf(cadena ,"%d",&datos [i ]. fechaNacimiento. mes); sscanf(cadena ,"%d",&datos [i ]. fechaNacimiento. año ); }
con un solo arreglo cadena para almacenar dia mes y año aunque sean campos diferentes gracias
|
|
|
188
|
Programación / Programación C/C++ / Re: agenda y archivos
|
en: 29 Octubre 2013, 02:22 am
|
gracias rir3760 por tu respuesta, despues del ciclo do while cerre el archivo fd y volvi a abrir el mismo archivo pero ahora en modo escritura para poder escribir en el, la unica duda que me queda es por que en esta linea me aparece un warning de comparison between integer and pointer without a cast y que aun asi me compile: la linea es esta: if((strcmp(nombreBuscar ,persona [j ]. nombre))== NULL )
y el codigo #include <stdio.h> #include <stdlib.h> #include <string.h> #define AGREGAR 1 #define VISUALIZAR 2 #define MOSTRAR 3 #define SALIR 4 #define TAM 3 #define MAX 45 /* Una agenda que maneje los siguientes datos: nombre, dirección, tlf móvil, email, y día, mes y año de nacimiento, (estos tres últimos datos deberán ser números enteros cortos). Deberá tener capacidad para 100 fichas. Se podra añadir un dato nuevo, visualizar los nombres de las fichas existentes, o mostrar los datos de una persona (se preguntará al usuario cual es el nombre de esa persona que quiere visualizar). Al empezar el programa, leerá los datos de un fichero llamado “agenda.dat” (si existe). Al terminar, guardará todos los datos en ese fichero. */ typedef struct datos { char nombre[MAX]; char direccion[MAX]; char tlf_movil[MAX]; char email[MAX]; }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,*ap; Agenda persona[TAM]; if((fd = fopen("F:\\agenda.dat","r"))!= NULL ) { do { printf("1)Agregar Registro\n"); printf("2)Visualizar Nombres\n"); 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) { } }while(continuar); } if((ap = fopen("F:\\agenda.dat","w"))!= NULL ) fwrite(persona ,TAM ,sizeof(char),ap ); return 0; } void agregar_Persona(Agenda persona[],int i) { char cadena[MAX]; fgets(persona [i ]. nombre,MAX ,stdin ); fgets(persona [i ]. direccion,MAX ,stdin ); printf("Dame telefono movil:\n"); fgets(persona [i ]. tlf_movil,MAX ,stdin ); fgets(persona [i ]. email,MAX ,stdin ); } 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,encontrado = 0; for(j = 0;((j < i)&&(!encontrado));j++) { if((strcmp(nombreBuscar ,persona [j ]. nombre))== NULL )//aqui me aparece un warning { 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); encontrado = 1; } } }
|
|
|
189
|
Programación / Programación C/C++ / agenda y archivos
|
en: 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("1)Agregar Registro\n"); printf("2)Visualizar Nombres\n"); 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) { } }while(continuar); /* }*/ return 0; } void agregar_Persona(Agenda persona[],int i) { char cadena[MAX]; fgets(persona [i ]. nombre,MAX ,stdin ); fgets(persona [i ]. direccion,MAX ,stdin ); printf("Dame telefono movil:\n"); fgets(persona [i ]. tlf_movil,MAX ,stdin ); fgets(persona [i ]. email,MAX ,stdin ); } 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); } } }
|
|
|
190
|
Programación / Programación C/C++ / Re: Libreria de grafos
|
en: 24 Octubre 2013, 21:49 pm
|
gracias rir3760 por tu respuesta, tu te refieres a almacenar los vertices con una lista ligada y las aristas con una matriz??? grafo[vertice1][vertice2] = arista, donde arista esta entre el vertice1 y el vertice2, pero si los vertices son nodos de una lista como los voy a poner como indice de una matriz??
|
|
|
|
|
|
|