Visualizzazione dei risultati da 1 a 10 su 23

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Puoi usare il template vector nella libreria standard?
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Facendo uso della libreria standard:
    codice:
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    
    //counts
    
    
    void counts(const vector<int>& v) {
    	//crea un vettore di dimensione max-min+1
    	//ovvero la dimensione del range in input
    	int mi = *min_element(v.begin(), v.end());
    	int ma = *max_element(v.begin(), v.end());
    	int l = ma-mi+1;
    	int *c = new int[l];
    	//inizializza tutto a 0
    	//suppone che ci siano 0 elementi per ogni numero
    	for(int i = 0; i < l; ++i) {
    		c[i] = 0;
    	}
    	//scorre i numeri e incrementa il contatore del numero relativo
    	for(int i = 0; i < v.size(); ++i) {
    		++c[v[i]-mi];
    	}
    	//se un contatore è diverso da 0 il numero era presente, lo stampa
    	for(int i = 0; i < l; ++i) {
    		if(c[i]!=0) {
    			cout << i+mi << " " << c[i] << endl;
    		}
    	}
    	delete[] c;
    }
    
    
    int main() {
    	vector<int> v;
    	fstream file;
        file.open ("dati.txt",ios::in);
        if(!file)
        {
            cout << "errore apertura file!!!";
        }
        
        while (!file.eof())
        {
        	int e;
            file >> e;
            v.push_back(e);
        }
        
        for (int i=0;i< v.size() ;i++)
        	cout << "  "<< v[i];
        cout << endl << endl;
        
        
        counts(v);
        
        system("pause");
    	return 0;
    }
    Senza libreria standard. Ovviamente questa implementazione fa abbastanza schifo perché ho cercato di utilizzare solo costrutti semplici, non sapendo cosa tu avessi effettivamente fatto.
    codice:
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    
    //definizione vettore espandibile
    
    
    const int initsize = 8; //dimensione iniziale del vettore
    
    
    struct intvect {
    	int size;   //backend size
    	int length; //used
    	int *data;
    };
    
    
    void init(intvect& v) {
    	v.size=initsize;
    	v.length=0;
    	//allocazione vettore
    	v.data = new int[v.size];
    }
    
    
    int get(const intvect& v, int i) {
    	if(i < v.length) {
    		return v.data[i];
    	}
    	else {
    		throw("Out of bounds");
    	}
    }
    
    
    int set(intvect& v, int i, int e) {
    	if(i < v.length) {
    		v.data[i] = e;
    		return v.data[i];
    	}
    	else {
    		throw("Out of bounds");
    	}
    }
    
    
    void expand(intvect& v) {
    	int *old = v.data;
    	//raddoppia la dimensione
    	v.size *= 2;
    	v.data = new int[v.size];
    	//copia i dati nel nuovo vettore
    	for(int i = 0; i < v.length; ++i) {
    		v.data[i] = old[i];
    	}
    	//libera la memoria
    	delete[] old;
    }
    
    
    int push(intvect& v, int e) {
    	//espande se neccessario
    	if(v.length >= v.size) {
    		expand(v);
    	}
    	//inserisce
    	v.data[v.length] = e;
    	++v.length;
    	return v.data[v.length-1];
    }
    
    
    int pop(intvect& v) {
    	if(v.length > 0) {
    		--v.length;
    		return v.data[v.length];
    	}
    	else {
    		throw("Out of bounds");
    	}
    }
    
    
    //supporto
    int min(const intvect& v) {
    	if(v.length < 1) throw("undefined");
    	int ret = v.data[0];
    	for(int i = 1; i < v.length; ++i) {
    		if(v.data[i] < ret) ret = v.data[i];
    	}
    	return ret;
    }
    
    
    int max(const intvect& v) {
    	if(v.length < 1) throw("undefined");
    	int ret = v.data[0];
    	for(int i = 1; i < v.length; ++i) {
    		if(v.data[i] > ret) ret = v.data[i];
    	}
    	return ret;
    }
    
    
    //counts
    
    
    void counts(const intvect& v) {
    	//crea un vettore di dimensione max-min+1
    	//ovvero la dimensione del range in input
    	int mi = min(v);
    	int ma = max(v);
    	int l = ma-mi+1;
    	int *c = new int[l];
    	//inizializza tutto a 0
    	//suppone che ci siano 0 elementi per ogni numero
    	for(int i = 0; i < l; ++i) {
    		c[i] = 0;
    	}
    	//scorre i numeri e incrementa il contatore del numero relativo
    	for(int i = 0; i < v.length; ++i) {
    		++c[v.data[i]-mi];
    	}
    	//se un contatore è diverso da 0 il numero era presente, lo stampa
    	for(int i = 0; i < l; ++i) {
    		if(c[i]!=0) {
    			cout << i+mi << " " << c[i] << endl;
    		}
    	}
    	delete[] c;
    }
    
    
    int main() {
    	intvect v;
    	init(v);
    	fstream file;
        file.open ("dati.txt",ios::in);
        if(!file)
        {
            cout << "errore apertura file!!!";
        }
        
        while (!file.eof())
        {
        	int e;
            file >> e;
            push(v, e);
        }
        
        for (int i=0;i< v.length ;i++)
        	cout << "  "<< get(v, i);
        cout << endl << endl;
        
        
        counts(v);
        
        //system("pause");
    	return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.