Problema ordinamento in un file [C]

di il
39 risposte

39 Risposte - Pagina 2

  • Re: Problema ordinamento in un file [C]

    Ho provato a modificare il codice ma ora mi stampa n volte l'ultimo valore della lista e basta..
    Provo a ripostarlo:
    Lista ordina_lista(Lista *p_lista){
    	FILE *fp, *fn;
    	int x = 0;
    	Lista n;
    	n = (Nodo*)malloc(sizeof(Nodo));
    	strcpy( n->id, id );					
           	n->reale = reale;					
           	n->immaginario = immaginario;
          	
    	fp = fopen("lista.txt", "r");
    	fn = fopen("secondo.txt", "w+");
    
    	if(x == 0){
    		x = 1;
    	}
    
    	if(nodo->reale < nodo->next->reale){
    		strcpy( nodo->id, n->id );					
           		nodo->reale = n->reale;					
    	       	nodo->immaginario = n->immaginario;
    		nodo = nodo->next;
    	}else if(nodo->reale > nodo->next->reale){
    		nodo->next = n;
    		nodo->next = nodo->next->next;
    	}
    	while((fscanf(fp,"%s %lg %lg", nodo->id, &nodo->reale, &nodo->immaginario) != EOF)){	
    		if(n->reale > nodo->reale){
    			strcpy( nodo->id, n->id );					
           			nodo->reale = n->reale;					
    	       		nodo->immaginario = n->immaginario;
    			nodo = nodo->next;
    		}
    		else if(n->reale < nodo->reale){
    			nodo = nodo->next;
    		}	
    	fprintf(fn, "%s %g %g\n", n->id, n->reale, n->immaginario);
    	}
    	
    	if(x == 0) {
    		printf("\nLa lista è vuota\n\n");
    	}
    	
    	fclose(fp);
    	fclose(fn);
    	remove("lista.txt");
    	rename("secondo.txt", "lista.txt");
    
    	return 0;
    }
    
  • Re: Problema ordinamento in un file [C]

    Devi creare un nuovo nodo ogni lettura e non solo uno all'inizio...g
  • Re: Problema ordinamento in un file [C]

    vbextreme ha scritto:


    Devi creare un nuovo nodo ogni lettura e non solo uno all'inizio...g
    Avevo pensato di crearne uno all'inizio e poi sostituirlo in caso se ne trovi uno minore; trascriverlo e riniziare a scorrere la lista. So che momentaneamente la parte del "riniziare a scorrere la lista" non la faccio, e non so nemmeno se si puo fare.. o come.. però non mi sembrava una cattiva idea.. Tu cosa ne pensi?
  • Re: Problema ordinamento in un file [C]

    Penso che hai le idee confuse.
    tu devi leggere il file è trasformare la lettura in un nodo nuovo, poi scorri la lista fino a trovare il punto dove inserirlo.Ora ripeti questa frase fino che nn è finito il file.

    A questo punto hai la lista ordinata, la scorri tutta partendo dalla testa e salvando uno dopo l'altro i valori di ogni nodo.
    the end
  • Re: Problema ordinamento in un file [C]

    vbextreme ha scritto:


    Penso che hai le idee confuse.
    tu devi leggere il file è trasformare la lettura in un nodo nuovo, poi scorri la lista fino a trovare il punto dove inserirlo.Ora ripeti questa frase fino che nn è finito il file.

    A questo punto hai la lista ordinata, la scorri tutta partendo dalla testa e salvando uno dopo l'altro i valori di ogni nodo.
    the end
    so di avere le idee confuse, sono alle prime armi nella programmazione in c; ho capito cosa intendi e ci avevo già pensato, ma non so come metterla in pratica, quindi cerco soluzioni alternative. Grazie comunque..
  • Re: Problema ordinamento in un file [C]

    vbextreme ha scritto:


    Penso che hai le idee confuse.
    tu devi leggere il file è trasformare la lettura in un nodo nuovo, poi scorri la lista fino a trovare il punto dove inserirlo.Ora ripeti questa frase fino che nn è finito il file.

    A questo punto hai la lista ordinata, la scorri tutta partendo dalla testa e salvando uno dopo l'altro i valori di ogni nodo.
    the end
    Ho modificato il codice in base a quanto mi hai detto tu.. o almeno a quello che ho capito. Mi puoi dire dove sbaglio nel codice? Te lo riposto modificato. Qui al posto di inserire i valori nel nuovo file inserisce zeri..
    Lista ordina_lista(Lista *p_lista){
    
    	FILE *fp, *fn;
    	int x = 0;
    	stampa_lista(&nodo);
    	fp = fopen("lista.txt", "r");
    	fn = fopen("secondo.txt", "w+");
    
    
    	if(x == 0){
    		x = 1;
    	}
    
    	Lista n;
    	while((fscanf(fp,"%s %lg %lg", nodo->id, &nodo->reale, &nodo->immaginario) != EOF)){
    		n = (Nodo*)malloc(sizeof(Nodo));
    
    		if(nodo->reale > nodo->next->reale){
    			strcpy( nodo->next->id, n->id );					
           			nodo->next->reale = n->reale;					
           			nodo->next->immaginario = n->immaginario;
    		}
    		else if(nodo->reale < nodo->next->reale){
    			strcpy( nodo->id, n->id );					
           			nodo->reale = n->reale;					
           			nodo->immaginario = n->immaginario;
    		}	
    		fprintf(fn, "%s %g %g\n", n->id, n->reale, n->immaginario);
    
          	}
    	if(x == 0) {
    		printf("\nLa lista è vuota\n\n");
    	}
    
    		
    	fclose(fp);
    	fclose(fn);
    	remove("lista.txt");
    	rename("secondo.txt", "lista.txt");
    
    	return 0;
    }
    
  • Re: Problema ordinamento in un file [C]

    Non hai letto la mia risposta.
    Metti da parte il c e scrivi tutti i passaggi in italiano uno dopo l altro.
  • Re: Problema ordinamento in un file [C]

    vbextreme ha scritto:


    Non hai letto la mia risposta.
    Metti da parte il c e scrivi tutti i passaggi in italiano uno dopo l altro.
    1- apro i file.
    2- leggo tutti i numeri dentro i file.
    3- metto i numeri che ho letto dentro un nuovo nodo allocato dinamicamente.
    4- inserisco i nodi che ho letto nella giusta posizione uno alla volta (questo non so come farlo).
    5- stampo i nodi in ordine sul file numero 2.
    6- elimino il primo file e rinomino il secondo come il primo.

    Giusto?
  • Re: Problema ordinamento in un file [C]

    1 apro un file in lettura
    2 creo un nodo
    3 leggo dal file i valori del nodo
    4 inserisco nella lista il nodo già ordinato
    5 fintanto che ho dati goto 2
    6 chiudo il file
    7 apro un file in scrittura
    8 scorro la lista dal primo elemento
    9 salvo i dati del nodo
    10 chiudo

    Ora che hai i punti procedi cosi, quota ogni punto e per ognuno fai la conversione nel linguaggio c.

    Non preoccupati se così avrà poco senso il codice che scriversi, ci penseremo al passaggio successivo.
  • Re: Problema ordinamento in un file [C]

    vbextreme ha scritto:


    1 apro un file in lettura
    fp = fopen("lista.txt", "r");
    2 creo un nodo
    Lista n;
    n = (Nodo*)malloc(sizeof(Nodo));
    3 leggo dal file i valori del nodo
     while(fscanf(fp, "%s %lg %lg", id, &reale, &immaginario) != EOF ){
    		nodo = (Nodo *)malloc(sizeof(Nodo));			
    		strcpy( nodo->id, id );	
            	nodo->reale = reale;	
            	nodo->immaginario = immaginario;
            	nodo->next = elem_succ;
            	elem_succ = nodo;					
    }
    4 inserisco nella lista il nodo già ordinato
    questo passaggio non so come farlo..
    ho provato così ma non mi convince..
    if(nodo->reale > nodo->next->reale){
    			strcpy( nodo->next->id, n->id );					
           			nodo->next->reale = n->reale;					
           			nodo->next->immaginario = n->immaginario;
    			nodo = nodo;
    			nodo->next = nodo->next->next;
    			
    		}
    		else if(nodo->reale < nodo->next->reale){
    			strcpy( nodo->id, n->id );					
           			nodo->reale = n->reale;					
           			nodo->immaginario = n->immaginario;
    			nodo = nodo->next;
    			nodo->next = nodo->next->next;
    			
    		}	
    
    5 fintanto che ho dati goto 2
    while(fscanf(fp, "%s %lg %lg", id, &reale, &immaginario) != EOF ){
    n = (Nodo*)malloc(sizeof(Nodo));
    }
    6 chiudo il file
    fclose(fp);
    7 apro un file in scrittura
    fn= fopen("secondo.txt", "w+");
    8 scorro la lista dal primo elemento
    while(fscanf(fp, "%s %lg %lg", id, &reale, &immaginario) != EOF )
    9 salvo i dati del nodo
    fprintf(fn, "%s %g %g", n->id, n->reale, n->immaginario);
    10 chiudo
    fclose(fn);
    remove("lista.txt");
    rename("secondo.txt", "lista.txt");
    Ora che hai i punti procedi cosi, quota ogni punto e per ognuno fai la conversione nel linguaggio c.

    Non preoccupati se così avrà poco senso il codice che scriversi, ci penseremo al passaggio successivo.
    Su alcuni punti non sono sicuro. Però è come ho impostato il codice..
  • Re: Problema ordinamento in un file [C]

    Il punto due è sbagliato, ma se lo eliminiamo il punto 3 è quasi correto, basta che setti next = null.
    Il punto 4 andrà dentro al ciclo del punto 3 dopo al next null.
    nel punto 4 avrai
    4.a se il nuovo nodo < del primo nodo sposto il nodo( che nn significa copiare i valori ma spostare gli indirizzi) continue.
    4.b se arrivo qui ciclo la lista fino a trovare la posizione giusta e inserisco il nodo
    Il punto 5 fa capo al 4 quindi puoi tirarci una riga sopra
    Il punto 8 mi fa capire che nn hai la piu pallida idea di quello che tu stai facendo!
    conosci le liste?
    dove stai studiando il c?
    ho detto di scorrere la lista non il file!
  • Re: Problema ordinamento in un file [C]

    vbextreme ha scritto:


    Il punto 8 mi fa capire che nn hai la piu pallida idea di quello che tu stai facendo!
    conosci le liste?
    dove stai studiando il c?
    ho detto di scorrere la lista non il file!
    Questo è proprio il sospetto che esprimo già da qualche giorno: secondo me il nostro ofcar non ha ben chiara la differenza tra il file e la lista, e neanche la relazione che c'è tra il contenuto della lista e quello del file.
  • Re: Problema ordinamento in un file [C]

    vbextreme ha scritto:


    Il punto due è sbagliato, ma se lo eliminiamo il punto 3 è quasi correto, basta che setti next = null.
    Il punto 4 andrà dentro al ciclo del punto 3 dopo al next null.
    nel punto 4 avrai
    4.a se il nuovo nodo < del primo nodo sposto il nodo( che nn significa copiare i valori ma spostare gli indirizzi) continue.
    4.b se arrivo qui ciclo la lista fino a trovare la posizione giusta e inserisco il nodo
    Il punto 5 fa capo al 4 quindi puoi tirarci una riga sopra
    Il punto 8 mi fa capire che nn hai la piu pallida idea di quello che tu stai facendo!
    conosci le liste?
    dove stai studiando il c?
    ho detto di scorrere la lista non il file!
    Il punto 8 lo avevo letto male; so che con quello scorro il file e non la lista.. faccio molta confusione ma so che sono due cose diverse..
    Per scorrere la lista faccio un
    while(nodo != NULL)
    giusto?

    Nel punto 4 in cui dici "nuovo nodo" cosa intendi?
  • Re: Problema ordinamento in un file [C]

    Punto 8 ancora errato
  • Re: Problema ordinamento in un file [C]

    Io e vbextreme abbiamo provato a farti ragionare a fondo, però secondo me non riusciamo a fare passi avanti. A questo punto proviamo questa strada: guarda bene questo codice, che non è perfetto ma è un punto di partenza.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    // Contenitore generico per i dati
    typedef struct record_t_ {
    	int valore;
    } Record;
    
    // Funzione che esegue il confronto tra due record
    int minore_di(Record r1, Record r2) {
    	if(r1.valore < r2.valore)
    		return 1;
    	return 0;
    }
    
    /* Un nodo della lista, costituito da un
     * record e dal puntatore al nodo successivo */
    typedef struct nodo_lista_t {
    	Record rec;
    	struct nodo_lista_t* next;
    } Nodo;
    
    typedef Nodo* Lista;
    
    /* Funzione che aggiunge un nuovo Record alla lista,
     * mantenendo l'ordinamento della lista stessa */
    Lista aggiungi_in_ordine(Lista L, Record n_elemento) {
    	// Creazione del nuovo nodo
    	Nodo* n_nodo = malloc(sizeof(Nodo));
    	n_nodo->rec = n_elemento;
    	n_nodo->next = NULL;
    
    	if(L == NULL)
    		return n_nodo;
    
    	// Inserimento in testa
    	if(minore_di(n_elemento, L->rec)) {
    		n_nodo->next = L;
    		return n_nodo;
    	}
    
    	// Copia del puntatore alla testa della lista
    	Lista tmp = L;
    
    	while(tmp) {
    		if(tmp->next == NULL || minore_di(n_elemento, tmp->next->rec)) {
    			// Inserisco il nuovo nodo
    			n_nodo->next = tmp->next;
    			tmp->next = n_nodo;
    			return L;
    		}
    		tmp = tmp->next;
    	}
    
    	// Tanto per metterci qualcosa: qui non ci arriva mai
    	return NULL;
    }
    
    void stampa_lista(Lista L) {
    	while(L) {
    		/* La stampa dipende dal tipo di dato che
    		 * viene memorizzato nel Record */
    		printf("%d  ", L->rec.valore);
    		L = L->next;
    	}
    	printf("\n");
    }
    
    int main(int argc, char const *argv[])
    {
    	Lista L = NULL;
    	FILE* fp = fopen("valori.txt", "r");
    	char* buffer = malloc(100 * sizeof(char));
    	int numero_letto;
    	Record record;
    
    	while((buffer = fgets(buffer, 100, fp)) != NULL) {
    		numero_letto = atoi(buffer);
    		printf("Numero letto: %d\n", numero_letto);
    		record.valore = numero_letto;
    		L = aggiungi_in_ordine(L, record);		
    	}
    
    	stampa_lista(L);
    
    	fclose(fp);
    
    	return 0;
    }
    
    Fa le seguenti cose: apre un file, legge dei valori e li memorizza in una lista in ordine crescente. L'ho testato con un file dal seguente contenuto:
    
    2
    3
    4
    1
    5
    
    e l'output prodotto è
    
    Numero letto: 2
    Numero letto: 3
    Numero letto: 4
    Numero letto: 1
    Numero letto: 5
    1  2  3  4  5  
    
    Noterai che ciò che viene memorizzato nella lista non è un singolo valore, ma una struct che ho chiamato Record. Ho fatto questo per facilitarti nel momento in cui lo andrai a modificare per contenere i tuoi numeri complessi (al posto di un int valore avrai un int parte_reale e int parte_immaginaria).
    A questo punto vediamo le modifiche che devi fare per arrivare al tuo risultato definitivo:
    - gestione dei numeri complessi come dicevo prima: due int (o float, o quello che vuoi) all'interno di ogni Record
    - salvataggio su file della lista ordinata: apri un nuovo file in scrittura, scrivi, elimini il vecchio file e rinomini il nuovo

    A questo punto dovresti aver terminato. Per altri dubbi siamo qui.

    Buon lavoro.
Devi accedere o registrarti per scrivere nel forum
39 risposte