|
151
|
Programación / Programación C/C++ / Re: Ayuda principiante! :(
|
en: 14 Junio 2010, 10:33 am
|
Una cosa , el fichero rutas.dat solo contiene un registro? por que solo lees el primero de todos , por consiguiente aunque exitan más solamente compararás el dato introducido con el primer registro , estaría bien saber la estructura del fichero antes ... Solución posible : cargar todos lo codigos de ruta en un array , y cuando metan el código mirar si existe o no , si no , llamar a la rutina de grabación de registros , si existe mandar el mensaje indicandolo ... espero que te sirva Prueba los siguiente , ya verás lo bien que va #include <stdio.h> #include <string.h> #define NOMBRE_ARCHI "c:\\rutas.dat" #define LIMPIA_BUFFER while(getchar()!='\n') struct rutas { int codruta; char cadorigen[20]; char caddestino[20]; float distancia; }; typedef struct rutas trut; void writeRuta(); void datos_ruta () ; void imprimeRuta(); void imprimeRutas(); void leer_registro(); void selectOpcio(); int main(){ selectOpcio(); } void selectOpcio(){ int opcio = 0; while(opcio !=3){ printf("\nTeclee 1 para mostrar todos los registros "); printf("\nTeclee 2 para agregar uno nuevo "); printf("\nTeclee 3 para salir "); LIMPIA_BUFFER; if(opcio == 1){ leer_registro(); }else if(opcio == 2){ datos_ruta(); }else if(opcio != 3){ printf("\nOpcion invalida !!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n"); } } } int compara_cod(int cod_buscado){ FILE *pfich; trut ruta; pfich = fopen(NOMBRE_ARCHI , "ab+"); fread(&ruta ,sizeof(trut ),1,pfich ); if(cod_buscado == ruta.codruta){ return 1; //encontrado } fread(&ruta ,sizeof(trut ),1,pfich ); } return 0; } void leer_registro(){ FILE *pfich; trut ruta; int reg_leidos = 0; pfich = fopen(NOMBRE_ARCHI , "ab+"); fread(&ruta ,sizeof(trut ),1,pfich ); imprimeRuta(ruta); fread(&ruta ,sizeof(trut ),1,pfich ); reg_leidos++; } printf("\n\n Numero de registros leidos =%d \n\n",reg_leidos ); } void imprimeRutas(trut ruta[], int size){ int cont = 0; for(cont ; cont < size ; cont++){ imprimeRuta(ruta[cont]); } } void imprimeRuta(trut ruta){ printf("\n Cod:%d Origen:%s Destino:%s Distancia:%f",ruta. codruta, ruta. cadorigen , ruta. caddestino, ruta. distancia); } void writeRuta(){ trut rutas[2] ; FILE *fichero ; int cont = 0 ; rutas[0].codruta = 10; strcpy(rutas [0]. cadorigen , "Barcelona"); strcpy(rutas [0]. caddestino , "Madrid"); rutas[0].distancia = 500; rutas[1].codruta = 20; strcpy(rutas [1]. cadorigen , "Murcia"); strcpy(rutas [1]. caddestino , "Sevilla"); rutas[1].distancia = 200; fichero = fopen(NOMBRE_ARCHI ,"ab+"); fwrite(rutas , sizeof(rutas [cont ]), 2, fichero ); } void datos_ruta () { int cod = 0; int condicion=0; trut rutas; FILE *pfich; printf ("Introduzca el codigo de la ruta:"); LIMPIA_BUFFER; // importantísimo limpiar el buffer después de leer pfich = fopen(NOMBRE_ARCHI ,"ab+"); if (pfich == NULL) { printf ("Se ha producido un error. Imposible abrir el fichero."); return ; }else{ while (condicion == 0){ if (compara_cod(cod)) { // en este punto llamamos a la rutina que compara los códigos printf ("El codigo introducido ya existe."); printf ("Por favor, introduzca un codigo diferente:"); LIMPIA_BUFFER; //fseek(pfich,0,0); // ya no tiene caso situarse al principio condicion=0; } else { rutas.codruta = cod; //te faltaba esto para que se informe el número de codigo printf ("*Origen del viaje:"); scanf ("%s",&rutas. cadorigen); LIMPIA_BUFFER; printf ("*Destino del viaje:"); scanf ("%s",&rutas. caddestino); LIMPIA_BUFFER; printf ("*Distancia a recorrer:"); scanf ("%f",&rutas. distancia); LIMPIA_BUFFER; condicion=1; fwrite (&rutas , sizeof(rutas ),1,pfich ); printf ("*La ruta ha sido creada correctamente*"); } } } }
|
|
|
155
|
Programación / Programación C/C++ / Re: programacion en c
|
en: 4 Junio 2010, 12:58 pm
|
Fíjate siempre en los mensajes que te da el compilador ... Aquí te esta diciendo que tienes un error en la línea 8 , tienes una ñ metida en "año" mejor intenta no usar eñes lis.c:8: error: stray '\361' in program lis.c:8: error: expected ':', ',', ';', '}' or '__attribute__' before 'o'
Este error es el más claro de todos , "\N" no es una secuencia válida de escape la correcta es "\n" , cambiala ! lis.c:27:9: warning: unknown escape sequence '\N' // \N no es una secuencia de escape , prueba con \n lis.c: In function 'DarAlta':
Esto esta relacionado con el error de la variable año de la estructura fecha lis.c:46: error: 'struct fecha' has no member named 'a' lis.c:46: error: stray '\361' in program lis.c:46: error: expected ')' before 'o'
|
|
|
157
|
Programación / Programación C/C++ / Re: ordenar por nombre o deuda con la función qsort
|
en: 2 Junio 2010, 15:23 pm
|
Pues a simple vista diria que lo único que tienes que hacer es implementar un compara para los floats ejem. int compara_deuda(struct registro *r1, struct registro *r2){ return(r1->deuda > r2->deuda )); }
y pasarselo al qsort donde corresponda qsort(punt_memoria ,num_registros ,sizeof(cliente ),compara_deuda );
ya me diras si te funciona ... Lo siguiente ordena por deuda de manera ascendente /* Programa de ejemplo de gestió de memoria dinámica. El programa tomará los registros de un fichero y reservará la memoria necesaria para poder guardarlos en memoria y ordenarlos con el qsort(), una vez ordenados los volverá a guardar en el fichero */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* macro para leer cadenas con caracteres blanco filtrando los return y blancos iniciales */ #define lee_cad(cad,n,fin) cad[0]=getchar(); \ while(((int)cad[0] == 10) || ((int)cad[0] == 32)) \ cad[0]=getchar();\ n=0; \ while(((int)cad[n]!= 10) && (n < fin)){ \ n++; cad[n]=getchar();} \ cad[n]='\0'; struct registro{ char nombre[50]; float deuda; }; /* Prototipos de procedimientos */ int compara_float(); int compara(); int main(){ FILE * df; struct registro cliente; int i,fin; char op; int num_registros; struct registro *punt_memoria; if((df =fopen("apuestas.dat","wb")) == NULL ){ printf("\nError al crear el fichero apuestas.dat\n"); } do{ printf("Nombre del apostante: "); lee_cad(cliente.nombre,i,50); //scanf("%49s",cliente.nombre); scanf("%f",&cliente. deuda); fwrite(&cliente ,sizeof(cliente ),1,df ); printf("Otro(0 --> No / 1 --> Sí) "); } while(fin!=0); if((df =fopen("apuestas.dat","rb")) == NULL ){ printf("\nError al abrir el fichero apuestas.dat\n"); } /* Para ver cuantos registros hay en el fichero, pongo el puntero al final, obtengo su posición y divido por el tamaño del registro */ num_registros = ftell(df )/sizeof(cliente ); /* Reservo la memoria necesaria para estos registros */ punt_memoria = (struct registro *)calloc(num_registros , sizeof(cliente )); /* Leo los registro del fichero y los guardo en memoria */ rewind(df ); /* Llego el descriptor de fichero al principio */ /* Leo todos los registros y los guardo en la zona reservada de memoria */ fread(punt_memoria ,sizeof(cliente ),num_registros ,df ); /* Ordeno el vector con qsort() */ qsort(punt_memoria ,num_registros ,sizeof(cliente ),compara_float ); /* simplemante cambias el parámetro con el nuevo tipo de ordenación */ /* Guarda los registros ordenados en el fichero */ if((df =fopen("apuestas.dat","wb")) == NULL ){ printf("\nError al crear el fichero apuestas.dat\n"); } fwrite(punt_memoria ,sizeof(cliente ),num_registros ,df ); /* Mostrar el contenido del fichero ordenado */ if((df =fopen("apuestas.dat","rb")) == NULL ){ printf("\nError al abrir el fichero apuestas.dat\n"); } fread(punt_memoria ,sizeof(cliente ),num_registros ,df ); for(i=0; i < num_registros; i++) printf("%s %.1f\n",(punt_memoria +i )->nombre , (punt_memoria +i )->deuda ); } /* main() */ /* La función compara usa strcmp para ordenar alfabéticamente el fichero */ int compara(struct registro *r1, struct registro *r2){ return(strcmp(r1 ->nombre , r2 ->nombre )); } int compara_float(struct registro *r1, struct registro *r2){ return(r1->deuda > r2->deuda); }
|
|
|
159
|
Programación / Programación C/C++ / Re: pasar float con array usando punteros - help
|
en: 28 Mayo 2010, 11:57 am
|
No entiendo mucho de C++ pero en niguna de las funciones estas usando/modificando el valor de las variables que pasas como parametro a las mismas por ejemplo en "calcular" no veo que utilices dentro de la función ni "int *anguloprincipal" , ni "int *aux", ni "int LIM" ......
|
|
|
|
|
|
|