Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 31
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    168

    [C] problema con ristampa caratteri file txt

    salve a tutti,

    ho un problema. ho questa funzione:

    codice:
    void riscrivi(struct punto*a,int b,FILE* c)	//riscrive su file.
    {
    	int i,j=0;			//riscrive su file i punti, nel modo più veloce (%g), seguiti dalle lettere
    	for(i=0;i<b;i++)	//che corrispondono alle crf a cui appartengono (se ve ne sono): per app[j]=0 
    	{					//ad esempio stamperà A. (0+65=0='A')
    		fprintf(c,"%g %g",a[i].x,a[i].y);
    		for(j=0;j<N_MAX;j++)
    			fprintf(c," %c",a[i].app[j]+65);
    		fprintf(c,"\n");
    	}
    }
    su un file di testo metto ho delle coppie di numeri che corrispondo alle coordinate del piano cartesiano... metto in input le coordinate di centri di circonferenze e rispettive aree...
    il programma mi fa il confronto... con una formula matematica... e fin qui ci siamo funziona...

    poi mi ristampa sul file i punti e accanto a i punti mi dovrebbe stampare una lettera

    es.

    1 2 A

    ad A corrisponde la circonferenza 1 a B la 2...

    se a una coppia di punti corrispondono pù circonferenze come faccio a scrivere

    es.

    1 2 A B

    la mia precedente soluzione è questa:
    codice:
    void riscrivi(struct punto*a,int b,FILE* c)
    {
    	int i;
    	for(i=0;i<b;i++)
    		fprintf(c,"%f %f %c\n",a[i].x,a[i].y,a[i].app+65);
    }
    ma mi stampava accanto allecoppie di punti solo l'ultimo carattere
    es.
    se a 1 2 corrispondevano A e B, il prog scriveva
    1 2 B

    per favore aiutatemi mi sto davvero imballando...grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non e' che si sia capito moltissimo ...

    Ad esempio, non si e' capito cosa ci dovrebbe dire che deve visualizzare sia A che B ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    168
    l'ho spiegato su....

    io inserisco delle circonferenze che chiamo A, B, C, D ecc.

    lui mi deve fare il confronto con la formula matematica...e fin qui ci siamo...

    se i punti presenti nel file di testo appartengono a una circonferenza, accanto al coppia di numeri del file devo scrivere la lettera della circonferenza....

    tutto qui

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da miscialo
    l'ho spiegato su....
    Ma lo hai spiegato male o io non ho capito ... magari se lo rispieghi abbiamo tutti e due un vantaggio, io lo capisco e tu puoi avere una risposta ...

    se i punti presenti nel file di testo appartengono a una circonferenza, accanto al coppia di numeri del file devo scrivere la lettera della circonferenza....
    Spiega un po' meglio cosa rappresentano i vettori e gli elementi delle strutture e le variaibili, oltre a dare chiarimenti sul significato degli argomenti delle funzioni e forse si potra' rispondere ...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    168
    questo è tutto il programma... nell'ultima funzione, ovvero riscrivi devo scrivere accanto ai dati presenti sul file come questi:

    3 0
    2.4 6.2
    -9.2 7.5
    1 0
    -5 5

    devo scrivere l'appartenenza con i dati che inserisco io in input....
    cosi: esempio:

    3 0 A
    2.4 6.2 B
    -9.2 7.5 A
    1 0 A B (il mio problema sussiste qui...se una coppia appartiene a più circonferenze devo scrive più lettere)
    -5 5 B

    non riesco a sfruttare il ciclo per ristampare il dati presenti in questo vettore: a[i].app[j]+65


    codice:
    /*
      PROGRAMMA DI VERIFICA DELL'APPARTENENZA DI PUNTI, CONTENUTI IN UN FILE, A 
      CIRCONFERENZE IMMESSE DA TASTIERA.
    
     -Questo programma opera sul file "punti a tromba.txt", che contiene numeri 
      considerati a 2 a 2 come coordinate di punti nel piano cartesiano. Viene
      richiesto all'utente l'inserimento, da tastiera, di un certo numero di terne,
      ciascuna delle quali rappresenta le coordinate del centro di una circonferenza
      e l'area della stessa. A ciascuna circonferenza il programma assegna una lettera,
      a partire dalla A e in ordine alfabetico. L'acquisizione si interrompe nel momento
      in cui l'utente inserisce una terna il cui ultimo valore è minore o uguale a zero.
      (Ovviamente, è comunque indispensabile porre un limite al numero di cerchi inseribili,
      per motivi di memoria RAM)
     -Dopo aver ultimato l'acquisizione, il programma indica se vi sono punti del file che si
      trovano su qualche circonferenza immessa, scrivendo accanto a tali punti, nel file, le
      lettere delle circonferenze di appartenenza.
    */
    
    #include <stdio.h>	
    #include <stdio.h>		//indispensabile per l'utilizzo delle funzioni I/O di base.
    #include <math.h>		//permette l'utilizzo della funzione che calcola la potenza di un numero.
    #define PIG 3.142		//definisce una MACRO: la costante pi-greco.
    #define N_MAX 30		//numero max di cerchi inseribili (secondo la logica di cui sopra).
    
    struct punto			//definisce la struttura punto, formata da 2 coordinate reali e un'ulteriore
    {						//informazione, l'appartenenza a una circonferenza.
    	float x;
    	float y;
    	int app[N_MAX];
    };
    
    struct crf				//definisce la struttura circonferenza, costituita da: coordinate del centro,
    {						//area e nome.
    	float x;
    	float y;
    	float area;
    	char nome[2];
    };
    
    int acquisisci(struct crf*);
    void nome(struct crf*,int);
    int vedifile(FILE *,struct punto*);
    void appart(struct crf*,int,struct punto*,int);
    void riscrivi(struct punto*,int,FILE*);
    
    void main()
    {
    	int numc,nump;		//dichiara 2 variabili deputate a contenere il numero dei cerchi e dei punti.
    	struct crf cerchi[N_MAX];	//dichiara un vettore di tipo struct crf di dimensione N_MAX.
    	struct punto file[10];		//	"		"	"	   "	"	"	punto "		"		10.
    	FILE *fp;					//dichiara un puntatore a file.
    	fp=fopen("punti a tromba.txt","r");	//il file source viene aperto in funzione read, l'indirizzo
    										//restituito dalla funzione fopen memorizzato in fp.
    	numc=acquisisci(cerchi);//chiamata della funz acquisisci:valore di ritorno memorizzato in numc.
    	nome(cerchi,numc);		//	"		"	  "		nome.
    	nump=vedifile(fp,file);	//	"		"	  "	  vedifile:		"	"		"		"		" nump.
    	appart(cerchi,numc,file,nump);
    	fclose(fp);						//chiusura del file.
    	fp=fopen("punti a tromba.txt","w"); //riapertura dello stesso file in modalità write.
    	riscrivi(file,nump,fp);
    	fclose(fp);						//richiusura del file.
    	printf("\nDai un'occhiata al file!\n(Sempre che esso contenesse punti appartenenti ad una circonferenza immessa)\n\n");
    }
    	
    	
    int acquisisci(struct crf*a)		//funzione che passa per indirizzo il vettore dei cerchi e
    {									//che restituisce un valore.
    	int flag=0,i=0;		//i conta le crf, flag si attiva quando si inserisce un'area non positiva.
    	printf("Acquisizione dei cerchi: coordinate del centro e area\n(finisce se l'area e' nulla o negativa).\n\n");
    	do					//ciclo che continua finchè le crf non superano 
    	{					//il numero max permesso e le aree sono positive.
    	printf("Inserisci X e Y del centro e area (reali) del cerchio n%d:\n",i+1);
    	scanf("%f%f%f",&a[i].x,&a[i].y,&a[i].area);	//acquisizione coordinate centro e area.
    	if(a[i].area<=0)
    		flag=1;				//attivazione flag condizionata.
    	i++;
    	}
    	while(i<N_MAX&&flag==0);
    	return i-1;//restituisce il numero delle circonferenze (esclude l'ultima, che ha area non positiva).
    }
    
    void nome(struct crf* a,int b)	//assegna il nome a ciascuna circonferenza; si poteva inserire 
    {								//direttamente nella "acquisisci" come mostrato alla fine del codice.
    	int i;
    	for(i=0;i<b;i++)
    	{
    		a[i].nome[0]='A'+i,a[i].nome[1]='\0';
    	}
    }
    
    int vedifile(FILE* c,struct punto*d)//passa per indirizzo il vettore dei punti e legge dal file.
    {
    	int i=0;
    	while(fscanf(c,"%f%f",&d[i].x,&d[i].y)!=EOF)	//memorizza i punti del file, li conta...
    		i++;
    	return i;										//...e ne restituisce il numero.
    }
    
    void appart(struct crf*a,int b,struct punto* c,int d)
    {//questa funzione passa per indirizzo i vettori dei cerchi e dei punti e per valore le loro dimensioni
    	int i,j,k;				//per ogni punto, e per ogni cerchio, verifica se la distanza
    	for(j=0;j<d;j++)		//punto-centro è uguale al raggio (calcolato a partire dall'area)
    		k=0;
    		for(i=0;i<b;i++)	//PIG è double: dev'essere forzato a float.
    		{
    			if((pow((c[j].x-a[i].x),2)+pow((c[j].y-a[i].y),2))==a[i].area/(float)PIG)
    			{
    				c[j].app[k]=i;//uguaglia il campo "app" del dato strutturato punto al valore di i, che 
    				k++;
    			} //equivale a 0 per la prima crf, 1 per la seconda ecc.
    			else
    				c[j].app[k]=-65;
    		}
    }
    
    void riscrivi(struct punto*a,int b,FILE* c)	//riscrive su file.
    {
    	int i,j=0;			//riscrive su file i punti, nel modo più veloce (%g), seguiti dalle lettere
    	for(i=0;i<b;i++)	//che corrispondono alle crf a cui appartengono (se ve ne sono): per app[j]=0 
    	{					//ad esempio stamperà A. (0+65=0='A')
    		fprintf(c,"%g %g",a[i].x,a[i].y);
    		for(j=0;j<N_MAX;j++)
    			fprintf(c," %c",a[i].app[j]+65);
    		fprintf(c,"\n");
    	}
    }

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma se capita che il punto appartenga sia ad A che a B (per esempio 1 e 0) la funzione scrive questo

    3 0 A
    2.4 6.2 B
    -9.2 7.5 A
    1 0 A
    1 0 B
    -5 5 B


    ???

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    168
    il prof vorrebbe le lettere affiancate alla coppia...

    ma se si può fare cosi è lo stesso...
    te come suggerisci di fare?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non e' che ti sto dicendo che si puo' fare cosi' ... ti sto chiedendo cosa fa ora il programma se capita un caso del genere ...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    168
    con la versione attuale della funzione dopo le coppie mi stampa caratteri strani....

    con la versione vecchia funziona...ma quando ci sono più corrispondenze, stampa solo l'ultima lettera...

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Versione vecchia ... versione nuova ... e qual e' la versione che hai mostrato?

    Con quale file di testo si puo' provare il codice ?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.