Facendo uso della libreria standard:
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> #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; }
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; }

Rispondi quotando
