做数据统计和概率,统计每个数据出现的频率和概率,给我一个思路编程解决
数据如
abc.txt文本文件
10 00 10 11 22 12 55 26 78 94 61 91 64
45 97 61 1234 45 65 87 98 87 95 35 21 33 33 15 99 11 00
17 22 33 97 79 65 78 456 ...
(数据很多...)
本来数字都是小于的100的随机整数,现在要读取里面的数据,里面1234可以分出12和34的数据,并且有提示,还有,里面可能有1个空格或两个空格,或者换行,怎么编程读取,例如456,一定要报错。
要按照出现的几率大小或者次数多少进行排序,都是以内的整数,数据很多。输出的文本文件out.txt,error.txt,warn.txt,如果有“456”这类数据的错误,放在里面来。如果没有,要error提示“no error ",如果出现1234的这样的数据,要把这类数据放到里面去,如果没有,就提示”no warning“,我应该怎么编程读取这些数据呢?
谢谢!
我还想补充2点
1 out.txt格式 顺序---数据---次数---概率
1----12---10---0.00230
2----55---10---0.0023
3----13---9----0.00207
2 就是出现错误 "456 "这样的错误,暂且忽略。
给我一个思路先,谢谢了
00这样的号码也是数据范围内,如果有这样的数据,1200,也要分开12和00,作为2个数据处理
456不作为里面要求的数据处理,忽略掉,不计
[解决办法]
#include <string>
#include <fstream>
#include <iostream>
#include <map>
#include <iterator>
#include <algorithm>
using namespace std;
class My_Func
{
public:
typedef map <string,int> PMAP;
My_Func():pmap(PMAP()),n(0){}
void operator()(const string &str)
{
++n;
if(str.size()==2||str.size()==3)insert(str);
else if(str.size()==4)
{
insert(str.substr(0,2));
insert(str.substr(2,2));
}
}
void print()//这里面的cout改成相应的fout即可.
{
int i=0;
PMAP::iterator it;
for(it=pmap.begin();it!=pmap.end();++it)
{
cout < <i++ < < "--- " < <it-> first < < "--- " < <it-> second\
< < "--- " < <double(it-> second)/double(n);
if((it-> first).size()==3)cout < < " 出错了 ";
cout < <endl;
}
}
private:
void insert(const string &str)
{
PMAP::iterator it;
it=pmap.find(str);
if(it!=pmap.end())it-> second++;
else pmap.insert(make_pair(str,1));
}
PMAP pmap;
int n;
};
int main()
{
const char *filename= "abc.txt ";
fstream ifs(filename,ios::in);
if(!ifs.is_open())exit(1);
for_each(istream_iterator <string> (ifs),istream_iterator <string> (),My_Func()).print();
ifs.close();
system( "PAUSE ");
return 0;
}
/*abc.txt
10 00 10 11 22 12 55 26 78 94 61 91 64
45 97 61 1234 45 65 87 98 87 95 35 21 33 33 15 99 11 00
17 22 33 97 79 65 78 456 1200
10 00 10 11 22 12 55 26 78 94 61 91 64
45 97 61 1234 45 65 87 98 87 95 35 21 33 33 15 99 11 00
17 22 33 97 79 65 78 456 1200
10 00 10 11 22 12 55 26 78 94 61 91 64
45 97 61 1234 45 65 87 98 87 95 35 21 33 33 15 99 11 00
17 22 33 97 79 65 78 456 1200
10 00 10 11 22 12 55 26 78 94 61 91 64
45 97 61 1234 45 65 87 98 87 95 35 21 33 33 15 99 11 00
17 22 33 97 79 65 78 456 1200
10 00 10 11 22 12 55 26 78 94 61 91 64
45 97 61 1234 45 65 87 98 87 95 35 21 33 33 15 99 11 00
17 22 33 97 79 65 78 456 1200
10 00 10 11 22 12 55 26 78 94 61 91 64
45 97 61 1234 45 65 87 98 87 95 35 21 33 33 15 99 11 00
17 22 33 97 79 65 78 456 1200
10 00 10 11 22 12 55 26 78 94 61 91 64
45 97 61 1234 45 65 87 98 87 95 35 21 33 33 15 99 11 00
17 22 33 97 79 65 78 456 1200
10 00 10 11 22 12 55 26 78 94 61 91 64
45 97 61 1234 45 65 87 98 87 95 35 21 33 33 15 99 11 00
17 22 33 97 79 65 78 456 1200
*/
[解决办法]
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <assert.h>
#define MAX_NUM100
//
int g_count[MAX_NUM]={0};
int *g_sort[MAX_NUM] = {0};
// return 0 if ok, otherwise errno
int parse_file(const char* filename);
void statistic(int data);
void output();
int parse_file(const char* filename)
{
int c;
int data_ready = 0;
int data = 0;
FILE* fp;
if ((fp = fopen(filename, "r ")) == NULL){
return errno;
}
while ((c = fgetc(fp)) != EOF){
if (c == ' ' || c == '\r ' || c == '\n '){
if (data_ready){
statistic(data);
data_ready = 0;
data = 0;
}
}else{
assert(isdigit(c));
data *= 10;
data += c - '0 ';
data_ready = 1;
}
}
fclose(fp);
return 0; // parse ok!
}
void statistic(int data)
{
int tmp;
if (data > = MAX_NUM){
tmp = data / MAX_NUM;
if (tmp < 10 || tmp > = MAX_NUM){
printf( "==== invalid data:%d\n ", data);
return;
}
g_count[tmp]++;
data %= MAX_NUM;
}
g_count[data]++;
}
int compare_count( const void *arg1, const void *arg2 )
{
return (**(int**)arg1) - (**(int**) arg2 );
}
int compare_data( const void *arg1, const void *arg2 )
{
return (*(int**)arg1) - (*(int**) arg2 );
}
void output()
{
int i, j, k, tmp;
int total = 0;
for( i = 0; i < MAX_NUM; ++i){
total += g_count[i];
g_sort[i] = &g_count[i];
}
//sort data
qsort(&g_sort, MAX_NUM, sizeof(int*), compare_count);
for (i = 0; i < MAX_NUM && *g_sort[i] == 0; ++i)
;// NOOP, skip zero-count data
printf( "No.\tdata\thits\tpercent\n ");
printf( "========================================================\n ");
k = 0;
while(i < MAX_NUM){
// sort by group
tmp = *g_sort[i];
for (j = i; i < MAX_NUM && *g_sort[i] == tmp; ++i)
; // NOOP
qsort(&g_sort[j], i - j, sizeof(int*), compare_data);
// output
for(; j < i; ++j){
printf( "%02d\t%2d\t%4d\t%.2f\n ",
k++,
(g_sort[j] - g_count),
tmp,
tmp*1.0f/total*100.0f
);
}
printf( "-------------------------------------------------------\n ");
}
printf( "========================================================\n ");
}
void main(int argc, char* argv[])
{
int ret;
if (argc != 2){
printf( "Usage: %s filename\n ", argv[0]);
return;
}
if ((ret = parse_file(argv[1])) == 0){
output();
}else{
printf( "!!!!!!!! error : %d, %s\n ", ret, strerror(ret));
}
}