日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言进行数据指定步长的区间统计

發布時間:2025/3/12 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言进行数据指定步长的区间统计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。