Problema:numeri unici e non duplicati

di il
7 risposte

Problema:numeri unici e non duplicati

Buonasera, ho creato un programma che deve scrivere su un file, dei numeri che io inserisco da tastiera, ma non devono essere duplicati.
Il mio problema è: come faccio ad inserire i numeri duplicati una sola volta?
Se per esempio scrivo due volte 33, voglio che nel file compaia 33 una sola volta.
I numeri sono contenuti in un vettore v.

Linguaggio C

FUNZIONE CHE CONTROLLA LA SCRITTURA NEL FILE(Ma in questo caso i numeri duplicati non vengono proprio scritti neanche una volta):

void scrivi_file(int v[],int cont)
{
	int i,j,cont2=0;
	FILE *f1;
	f1=fopen("file2.txt","w");
	for(i=0;i<cont;i++)
	{
		for(j=0;j<cont;j++)
		{
			if(v[i]==v[j])
			cont2=cont2+1;
		}
    if(cont2==1)
	{
		fprintf(f1,"%d  ",v[i]);
	}
	cont2=0;
    }
	fclose(f1);
}

7 Risposte

  • Re: Problema:numeri unici e non duplicati

    Non so quanta libertà tu abbia nell'esercizio, ma per me la cosa più facile sarebbe salvare i valori in un vettore (immagino fino ad un numero speciale che ti fa uscire dalla scanf) confrontando ad ogni aggiunta il valore che metti in coda con quelli precedentemente salvati e salvandolo solo se il confronto non da corrispondenze. Finito il ciclo di scanf salvi il vettore nel file
  • Re: Problema:numeri unici e non duplicati

    enricoscarsissimo ha scritto:


    Non so quanta libertà tu abbia nell'esercizio, ma per me la cosa più facile sarebbe salvare i valori in un vettore (immagino fino ad un numero speciale che ti fa uscire dalla scanf) confrontando ad ogni aggiunta il valore che metti in coda con quelli precedentemente salvati e salvandolo solo se il confronto non da corrispondenze. Finito il ciclo di scanf salvi il vettore nel file
    Guarda ho messo anche un pezzo di codice non so se ti può aiutare
  • Re: Problema:numeri unici e non duplicati

    Continuo a pensare che aggiungere un altro vettore sia la cosa più semplice. Salvi il primo valore contenuto in v[] in un secondo vettore di supporto che chiamo v_supp[].
    Dopo di che fai un confronto tra il valore seguente di v e tutti quelli contenuti in v_supp[] fino a quel momento (che all'inizio è solo il primo valore salvato). Se il confronto non dà corrispondenze salvi v in v_supp+1, altrimenti passi a v[++i] e così via


    ma perché un pezzo me lo stampa in corsivo? lol
  • Re: Problema:numeri unici e non duplicati

    Ho modificato un po' il tuo codice, non ho provato se funziona ma credo che concettualmente sia okay:
    void scrivi_file(int v[],int cont)
    {
    	int i,j,flag;
    	FILE *f1;
    	f1=fopen("file2.txt","w");
    	for(i=0;i<cont;i++)
    	{
    		for(j=i+1,flag=1 ;j<cont; j++)
    		{
    			if(v[i]==v[j])
    				flag=0;
    		}
    	    if(flag==1)
    	   		fprintf(f1,"%d  ",v[i]);
        }
    	fclose(f1);
    }
    fondamentalmente confronto n con tutti i valori ad esso successivi. Se n è unico lo salvo nel file, altrimenti passo al successivo (tanto sono certo che ritroverò n in seguito, essendo doppio)
  • Re: Problema:numeri unici e non duplicati

    [ i ] senza spazi è il codice per il corsivo. Usa qualche spazio in più o i tag code
  • Re: Problema:numeri unici e non duplicati

    enricoscarsissimo ha scritto:


    Ho modificato un po' il tuo codice, non ho provato se funziona ma credo che concettualmente sia okay:
    void scrivi_file(int v[],int cont)
    {
    	int i,j,flag;
    	FILE *f1;
    	f1=fopen("file2.txt","w");
    	for(i=0;i<cont;i++)
    	{
    		for(j=i+1,flag=1 ;j<cont; j++)
    		{
    			if(v[i]==v[j])
    				flag=0;
    		}
    	    if(flag==1)
    	   		fprintf(f1,"%d  ",v[i]);
        }
    	fclose(f1);
    }
    fondamentalmente confronto n con tutti i valori ad esso successivi. Se n è unico lo salvo nel file, altrimenti passo al successivo (tanto sono certo che ritroverò n in seguito, essendo doppio)
    Aaah ecco capito grazie mille
  • Re: Problema:numeri unici e non duplicati

    Per 'cultura' ti riporto come avrei fatto la stessa cosa in CPP

    La libreria standard ti mette a disposizione i "set": strutture dati che ti garantiscono proprio l'assenza di duplicati. Usalo al posto del vettore e 'per grazia della libreria e di chi l'ha scritta' avrai la funzionalità che cerchi

    eccoli qui

    Altra cosa: fai amicizia con gli stream, così tratterai tutto (input e output allo stesso modo e con le stesse funzioni).

    Nel tuo caso avrei usato un ofstream in modo da usare una copy per salvare il set su file.
    
      #include <fstream>
       #include <iterator>
       #include <string>
       #include <set>
       #include <iostream>
       
       using namespace std;
       int main(){
        set<int> dati; //dichiaro un set di interi
        
       int t; 
       cout<<"-1 per terminare"<<endl;
       
       cin >> t; //leggo il primo input
       if(t=-1) return 0; //se non ho dati non sto a creare il file
       
       while (t!=-1){
        auto ret= dati.emplace(t); //aggiungo il dato
        if (!ret.second) cout<<"doppione"<<endl; //messaggio se è un doppione
        cin >> t; //leggo i dati 
       }
    
       ofstream output_file("./risultati.txt"); //apro il file come 'stream'
       ostream_iterator<int> iteratore_del_file (output_file, " "); //gli costruisco intorno un iteratore (cosC, da salvare i numeri 'spaziati')
       copy(dati.begin(), dati.end(), iterator_del_file); //copio i dati dal set al file
       cout <<"fine"<<endl;
       }
       
       
Devi accedere o registrarti per scrivere nel forum
7 risposte