CitarInteresante.:rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:
¿Puedes adelantar algo del código que llevas hecho?.
¡Oh, terrible duda!, ¿será que pretendes que te hagamos el trabajo?.
No por Dios, por qué seré tan mal pensado, seguro que no tardas en colgar el código y plantearas sólo las dudas que tienes.
#include <stdlib.h>
#include <stdio.h>
#define TAM 7
//definicion de estructuras
struct fnum { int numero; int serie;}; //estructura del vector premios
struct registro { struct fnum billete; char lugar[30];}registro;
/*definicion de funciones */
void inicializa_generador_aleatorios(){
/* Inicializa generador de n�meros aleatorios
E: (ninguna) S: (ninguna)*/
srand( time(NULL) );
}
int azar_numero( int tope ){
/* Funcion. Devuelve un entero al azar, menor que tope */
/* E: tope, maximo valor devuelto Valor devuelto: num aleatorio
/ 1 <= valor devuelto <=tope */
return 1+(int)((float)tope*rand()/(RAND_MAX+1.0));
}
int azar_serie( int tope ){
/* Funcion. Devuelve un entero al azar, menor que tope */
/* E: tope, maximo valor devuelto Valor devuelto: num aleatorio / 1 <= valor devuelto <=tope */
return 1+(int)((float)tope*rand()/(RAND_MAX+1.0));
}
void buscar(struct fnum elegido, char lugar [30]){ //para buscar los numeros en fichnumeros
int seguir;
FILE *fich;
seguir = 1;
while (seguir == 1){
fich = fopen("fichnumerosCompleto.dat", "r");
if (fich == NULL)
printf("Error vacio\n");
else {
fread(®istro, sizeof(struct registro), 1, fich);
// leerregistro(
while ((elegido.numero = registro.billete.numero)&&(elegido.serie = registro.billete.serie)) {
//almacena lugar
lugar[30] = *registro.lugar;
seguir = 0;
}
//else leer registro( fread...\ esta funcion es la que no se seguir...
}
}
}
main(){
int intervnum, intervserie; /* longitud del intervalo */
int i;
struct fnum premios[TAM]; //matriz premios
struct registro resultado[TAM];
FILE *result;
FILE *fich;
inicializa_generador_aleatorios();
printf ("Produce un numero aleatorio de loteria: \n");
/* Genera N aleatorios entre min y max y los imprime */
intervnum = 9999 + 1;
intervserie = 9 + 1;
for (i=0; i< TAM; i++){
premios[i].numero = azar_numero(intervnum)%9999 +1;
premios[i].serie = azar_serie(intervserie);
printf ("\n Premio %d\t", i+1);
printf ("%d\t %d\n", premios[i].numero, premios[i].serie);
result = fopen("result.dat", "wr");
/* Apertura en modo lectura-escritura. result apunta a "result.dat"*/
if (result != NULL); { /*Comprobación*/
fwrite (&premios[i], sizeof(struct registro), 1, result);
resultado[i].billete.numero = premios[i].numero;
resultado[i].billete.serie= premios[i].serie;
buscar(premios[i], resultado[i].lugar);
// Escritura de los resultados junto a los lugares en que se vendio
fwrite (&resultado[i], sizeof(struct registro), 1, result);
fread (&resultado[i], sizeof(struct registro), 1, result);
printf("\n%d \t%d \t%s", resultado[i].billete.numero, resultado[i].billete.serie, resultado[i].lugar);
fclose (result);
}
} }
fich = fopen("fichnumerosCompleto.dat", "r");
if (fich == NULL)
printf("Error vacio\n");
else {
printf ("\t");
fread(®istro, sizeof(struct registro), 1, fich);
printf("\nNumero \tSerie \tLugar");
while((registro.billete.numero <= 10) && (registro.billete.serie <=3)){
printf("\n%d \t%d \t%s\n", registro.billete.numero, registro.billete.serie, registro.lugar);
fread(®istro, sizeof(struct registro), 1, fich);
}fclose(fich);
}
} //main
lugar[30] = *registro.lugar;
/*........*/
else {
do {
fread(...); /* lee un registro */
if(....) { // compara si es el registro buscado
strcpy(....); /* haces la copia del lugar */
seguir=0; /* flag para salir del do-while */
}
}while(seguir);
}
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define TAM 7
//definicion de estructuras
struct fnum { int numero; int serie;}; //estructura del vector premios
struct registro { struct fnum billete; char lugar[30];}registro;
struct cadenacar{ char cad[16];};
/*definicion de funciones */
void inicializa_generador_aleatorios(){
/* Inicializa generador de n�meros aleatorios
E: (ninguna) S: (ninguna)*/
srand( time(NULL) );
}
int azar_numero( int tope ){
/* Funcion. Devuelve un entero al azar, menor que tope */
/* E: tope, maximo valor devuelto Valor devuelto: num aleatorio
/ 1 <= valor devuelto <=tope */
return 1+(int)((float)tope*rand()/(RAND_MAX+1.0));
}
int azar_serie( int tope ){
/* Funcion. Devuelve un entero al azar, menor que tope */
/* E: tope, maximo valor devuelto Valor devuelto: num aleatorio / 1 <= valor devuelto <=tope */
return 1+(int)((float)tope*rand()/(RAND_MAX+1.0));
}
void buscar(struct fnum elegido[TAM], char *fichero1, char *fichero2, char *fichero3) { //para buscar los numeros en fichnumeros
struct cadenacar categoria[TAM];
char lugar[30];
int i, x;
int seguir;
int numero[TAM], serie[TAM];
struct registro registro;
FILE *result; /* result apunta a "result.dat"*/
FILE *fich; // fich apunta a "fichnumerosCompletos.dat"
FILE *premiotxt; // premiostxt apunta a "premios.txt"
/* Apertura en modo lectura-escritura. */
fich = fopen("fichnumerosCompleto.dat", "r");
result = fopen("result.dat", "wr");
premiotxt = fopen("premios.txt", "w");
if (result != NULL && fich !=NULL && premiotxt !=NULL);{ /*Comprobación*/
seguir = 1;
while (seguir == 1){
do {
fread(®istro, sizeof(struct registro), 1, fich);
for(i =0; i<TAM; i++){
if ((elegido[i].numero == registro.billete.numero) && (elegido[i].serie == registro.billete.serie)) {
//almacena lugar
fprintf(result, "%d\t %d\t %s\n",registro.billete.numero, registro.billete.serie,registro.lugar);
numero[i] = registro.billete.numero;
serie[i] = registro.billete.serie;
lugar[i] = *registro.lugar;
seguir = 0;
}
}
}while (!feof(fich));
fclose(fich);
fclose(result);
}
for (i = 0; i < TAM; i++){
if (i==0)
strcpy(categoria[0].cad, "Primer premio:");
if (i==0)
strcpy(categoria[0].cad, "Primer premio:");
if(i== 1)
strcpy(categoria[1].cad, "Segundo premio:");
if (i==2)
strcpy(categoria[2].cad, "Tercer premio:");
if ((i <= TAM/2)&&(i>2)){
strcpy(categoria[3+i].cad, "Cuarto premio:");
x=i;}
else
strcpy(categoria[1+x].cad, "Reintegro:");
}
//los escribimos en premios.txt
if ((numero[i] > 0 && numero[i] < 10000) && (serie[i] > 0 && serie[i] < 11))
fprintf(premiotxt,"%s\t%d\t%d\t%s\n",categoria[i].cad, numero[i], serie[i], lugar[i]);
}
fclose(premiotxt);//Cerramo el fichero txt
}
void leerficherotxt(char *fichtxt){
FILE *premiotxt;
char lugar[91];
//Abrir fichero para lectura de los numeros
if ((premiotxt = fopen(fichtxt, "r")) == NULL){
//Si no puede abrise o no existe.
printf("El fichero '%s' no se puede leer", fichtxt);
}
else printf("\n NUMEROS DE PREMIADOS:\n");
fscanf (premiotxt, lugar , 91, fichtxt);
//Muestra datos por pantalla
while ( !feof(premiotxt)){ //Mientras no ha llegado a la marca de fin de fichero lee linea a linea
printf("%s", lugar); //Escribe una de las lineas en la pantalla.
fscanf(premiotxt, lugar, 91, fichtxt); //Lee siguiente linea hasta fin de linea o un maximo de 90 caracteres.
}
fclose (premiotxt);
}
}
void ponersinvender(char *fichtxt){
FILE *premiosinvend;
char lugar[91];
if ((premiosinvend = fopen(fichtxt, "r")) == NULL){
//Si no puede abrise o no existe.
printf("El fichero '%s' no se puede leer", fichtxt);}
else {printf("\nPremios que no se han vendido:\n");
fscanf(premiosinvend, lugar , 91, fichtxt);
//Muestra datos por pantalla
while ( !feof(premiosinvend)){ //Mientras no ha llegado a la marca de fin de fichero lee linea a l$
if (strstr (lugar, "Sin vender")){ //Si la cadena de b�squeda esta incluida en dato
printf("%s", lugar);}
fscanf(premiosinvend, lugar , 91, fichtxt); //Lee la siguiente l�nea del fichero.
}
fclose(premiosinvend);
}}
main(){
int intervnum, intervserie; /* longitud del intervalo */
int i;
struct fnum premios[TAM]; //matriz premios
struct registro resultado[TAM];
char f1[] = {"/home/alumnos/GI33_16/fichnumerosCompleto.dat"};
char f2[] = {"/home/alumnos/GI33_16/resul.dat"};
char f3[] = {"/home/alumnos/GI33_16/premios.txt.dat"};
FILE *result;
FILE *fich;
FILE *premiotxt;
inicializa_generador_aleatorios();
inicializa_generador_aleatorios();
printf ("Produce un numero aleatorio de loteria: \n");
/* Genera N aleatorios entre min y max */
intervnum = 9999 + 1;
intervserie = 9 + 1;
for (i=0; i< TAM; i++){
premios[i].numero = azar_numero(intervnum)%9999 +1;
premios[i].serie = azar_serie(intervserie);
printf ("\n Premio %d\t", i+1);
printf ("%d\t %d\n", premios[i].numero, premios[i].serie);}
//procedimiento para crear los ficheros y operar con ellos
buscar(premios, f1, f2, f3);
result = fopen("result.dat", "r");
fread (&resultado[i], sizeof(struct registro), 1, result);
printf("\n%d \t%d \t%s", resultado[i].billete.numero, resultado[i].billete.serie, resultado[i].lugar);
fclose (result);
leerficherotxt(f3);
ponersinvender(f3);
} //main
#include <ctime>
;)
Citar#include <ctime>este header es para C++ no C
elegido.numero == registro.billete.numero) && (elegido.serie == registro.billete.serie
elegido[i].numero == registro.billete.numero) && (elegido[i].serie == registro.billete.serie
int numero[TAM], serie[TAM];//???????
numero = registro.billete.numero;
serie = registro.billete.serie;
Citarlugar = *registro.lugar;esto te lo aclare antes porque es un error
do {
/*............*/
} while(!feof(fich) && (seguir==1));
Citarviolación del segmentoeste error se debe seguro a un mal uso de los arreglos...
CitarViendo nuestro programa nos podrías poner como harías tu el procedimiento buscarsolo modificando las cosas q te marque deberia andar:
void buscar(struct fnum elegido[TAM], char *fichero1, char *fichero2, char *fichero3) { //para buscar los numeros en fichnumeros
struct cadenacar categoria[TAM];
char lugar[30];
int i, x;
int seguir;
int numero, serie;
struct registro registro;
FILE *result; /* result apunta a "result.dat"*/
FILE *fich; // fich apunta a "fichnumerosCompletos.dat"
FILE *premiotxt; // premiostxt apunta a "premios.txt"
/* Apertura en modo lectura-escritura. */
fich = fopen("fichnumerosCompleto.dat", "r");
result = fopen("result.dat", "wr");
premiotxt = fopen("premios.txt", "w");
if (result != NULL && fich !=NULL && premiotxt !=NULL);{ /*Comprobación*/
seguir = 1;
do {
fread(®istro, sizeof(struct registro), 1, fich);
for(i =0; i<TAM; i++){
if ((elegido[i].numero == registro.billete.numero) && (elegido[i].serie == registro.billete.serie)) {
//almacena lugar
fprintf(result, "%d\t %d\t %s\n",registro.billete.numero, registro.billete.serie,registro.lugar);
numero = registro.billete.numero;
serie = registro.billete.serie;
strcpy(lugar,registro.lugar);
seguir = 0;
break; // este break es para que no continue con el for, ya que se encontro el registro
}
}
}while (!feof(fich) && (seguir==1));
fclose(fich);
fclose(result);
}
/* ...........*/
for (i=0; i< TAM; i++){
premios.numero = azar_numero(intervnum)%9999 +1;
premios.serie = azar_serie(intervserie);
Citar[ iniciousar la función fscanf aquí la doc y dos pagina que tiene ejemplos, la función fscanf estaría dentro de un while para que leea todos los renglones, como veras en el ejemplo mucho depende de como sea el archivo que uno lee, podrías poner aunque mas no sea una parte del archivo (fichnumeros.dat)
Función fopen:Esta función sirve para abrir y crear ficheros en disco
Función fscanf:La función fscanf funciona igual que scanf en cuanto a parámetros, pero la entrada se toma de un fichero en lugar del teclado.
Función feof:Esta función sirve para comprobar si se ha alcanzado el final del fichero
Función fclose:Es importante cerrar los ficheros abiertos antes de abandonar la aplicación
fin ]
fscanf(file,"%d %d %s",var1,var2,str);
02 2154 03 2152 10 2154 |
022154 032152 102154 |