C语言进行数据指定步长的区间统计
生活随笔
收集整理的這篇文章主要介紹了
C语言进行数据指定步长的区间统计
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
設計需求:
1.對數據給出區間寬度進行統計
2.生成生成指定區間寬度的直方圖繪制數據
設計思路
- 對直方圖的理解:直方圖是數值數據分布的精確圖形表示,建直方圖第一步是將值的范圍分段,即將整個值的范圍分成一系列間隔,然后計算每個間隔中有多少值。 這些值通常被指定為連續的,不重疊的變量間隔。 間隔必須相鄰,并且通常是(但不是必須的)相等的大小。也可以理解為各區間的相對頻率。
- 從數據中求出最大值和最小值,對最大值向上取整,對最小值向下取整,即可得出區間范圍。從命令行參數中獲得區間值,用區間范圍除以區間值可以得到需要多少個區間,把區間長度定義成數組的長度,用數據減去最小值得到的差再除以區間值,就可以得到這個值除于哪個區間,再將所定義數組的相應區間值加一即可。即完成區間內的統計。再把數組的值對應寫入到文件中,得到直方圖所需的數據。
需要統計的數據
需要統計的數據是8000行服從正態分布其均值為1.2,方差為2.5的數據。
源代碼
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> int main(int argc,char* argv[]) {int len = 0, z;//數據行數double data = 0;//存放臨時數據double max = 0;//存放數據最大值double min = 0;//存放數據的最小值int num =0;//檢查用戶的參數是否正確if (argc != 4){printf("用法:程序名 統計步長 輸入文件 輸出文件\n");printf("程序名:編譯后后的.exe名稱\n");printf("統計步長:以多大范圍統計數據\n");printf("輸入文件:需要統計的文件名\n");printf("輸出文件:數據輸出的文件名\n");return -1;}//讀寫的文件路徑FILE* fin = fopen(argv[2], "r");FILE* fout = fopen(argv[3], "w");//檢查文件能否被打開if (fin == NULL){printf("源文件打開失敗!\n");return -1;}//檢測文件行數while ((z = fgetc(fin)) != EOF)if (z == '\n'){len++;}rewind(fin);//釋放文件指針//printf("數據個數=%d\n", len);//開辟動態內存char* str = (char*)malloc(sizeof(char) * len);while (1){fscanf(fin, "%s", str);if (feof(fin)) break;data = atof(str);if (data > max)//求出最大值和最小值確定區間{max = data;}if (data < min){min = data;}}rewind(fin);double MAX = ceil(max);//區間最大值double MIN = floor(min);//區間最小值double area = MAX - MIN;//區間范圍double step = atoi(argv[1]);//區間要用命令行參數//double step = 1;//傳入區間寬度num = ceil(area / step);//算出需要幾個區間int j = 0;//控制數組下標int p = (int)num;double a[p];//存放區間的數據計數printf("最大值:%lf\n", max);printf("最小值:%lf\n", min);printf("區間最大值:%.0f\n", MAX);printf("區間最小值:%.0f\n", MIN);printf("需要%d個區間\n", num);for(int i = 0; i < p; i++){a[i] = 0;//將數組全部初始化}while (1){fscanf(fin, "%s", str);if (feof(fin)) break;data = atof(str);//轉換為double//計算該數據的在數組里的下標j = (int)floor((data - MIN) / step);a[j]++;//相應的下標+1}for(int i=1; i < p; i++){//printf("第%.0f個區間有%.0f個數值\n", MIN, a[i-1]);//把數據按照格式打印到文件中fprintf(fout, "%.0f %.0f\n", MIN, a[i-1]);MIN++;}fclose(fin);//關閉文件指針fclose(fout);free(str);//釋放內存return 0; }在gcc中編譯并輸入命令行指令運行程序
我們打開out.txt
得到統計的數據,在MATLAB中進行驗證,交可以看到數據的統計是正確的。
總結
以上是生活随笔為你收集整理的C语言进行数据指定步长的区间统计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA中基本类型Boolean占几个字
- 下一篇: CMD中文乱码出现的原因及解决办法