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;
}