標籤:
實驗目的:一、從實驗儀器測量資料並且記錄在文字文件中二、讀取記錄表的資料。三、檢查記錄表中的溫度是否符合標準。實驗步驟:一、從實驗儀器測量資料並且記錄在文字文件中根據實驗儀器上的電路串連圖串連相關路線讀取相關資料,並且記錄在檔案中。二、讀取記錄表的資料在當前工程目錄底下建立一個文字文件,將所測的資料(時間、溫度、濕度)記錄在文字文件中,如:
(一)記錄表
通過程式運行將此檔案的有限資料讀出並顯示在終端(運行在螢幕上),同時求溫度的最大值與平均值。三、檢查記錄表中的溫度是否符合標準另給一個標準表,即再建立一個文字文件,另給一組資料(時間、溫度、濕度),同樣也需要去讀取標準表的資料,通過記錄表與標準表在相等時間內的溫度比較,檢查記錄表中的溫度是否符合標準,若不合格,則輸出記錄表中不合格的溫度以及對應時間。標準表如下:
(二)標準表
通過眼睛去比較記錄表與標準表,如果規定在相等時間時兩表中的溫度差超過了2就不合格,那麼我們一眼就知道記錄表中最後兩個資料不合格,那麼就要把兩個時間和溫度對應輸出到終端。結合二、三步驟的原始碼,此原始碼如下:
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#define MAX 100#define TIME_LEN 10#define temperature_LEN 5#define humidity_LEN 5#define CHECK_STAND 2.0double check_failtem[30];char check_failtime[20][20];struct TXT{ char time[TIME_LEN]; char temperature[temperature_LEN]; char humidity[humidity_LEN];}txt[30],check[30];void print(){ printf("++++++++++++++++++++++\n"); printf("1->讀取記錄表的資料\n"); printf("2->讀取標準表的資料\n"); printf("3->求記錄表溫度的最大值\n"); printf("4->求記錄表溫度的平均值\n"); printf("5->檢查某個時間下溫度是否合格\n"); printf("++++++++++++++++++++++\n"); printf("\n請輸入序號:");}void FileRead_Write()//讀取記錄表的資料{ FILE *pfread = fopen("C:/Users/SAMSUNG/Documents/Visual Studio 2013/Projects/txtchuanganqi2015_6_24/Debug/sulijuan.txt", "rb+"); if (pfread == NULL) { perror("error"); exit(EXIT_FAILURE); } printf("時間 溫度 濕度\n"); for (int i = 0; i < 5; i++) { fgets(txt[i].time, 5, pfread); fseek (pfread, 1, SEEK_CUR); fgets(txt[i].temperature, 5, pfread); fseek(pfread, 1, SEEK_CUR); fgets(txt[i].humidity, 6, pfread); fseek(pfread, 1, SEEK_CUR); printf("%s %s %s\n", txt[i].time, txt[i].temperature, txt[i].humidity); } printf("\n"); fclose(pfread);}void FileRead_Stadard()//讀取標準表的資料{ FILE *fcheck = fopen("C:/Users/SAMSUNG/Documents/Visual Studio 2013/Projects/txtchuanganqi2015_6_24/Debug/standardtemperature.txt", "rb+"); printf("時間 溫度 濕度\n"); for (int i = 0; i < 5; i++) { fgets(check[i].time, 5, fcheck); fseek(fcheck, 1, SEEK_CUR); fgets(check[i].temperature, 5, fcheck); fseek(fcheck, 1, SEEK_CUR); fgets(check[i].humidity, 6, fcheck); fseek(fcheck, 1, SEEK_CUR); printf("%s %s %s\n", check[i].time, check[i].temperature, check[i].humidity); } printf("\n"); fclose(fcheck);}void temperature_max(struct TXT txt[])//求記錄表溫度的最大值{ int i = 0; double n,max = 0.0; max = atof(txt[0].temperature); for (i = 1; i < 5; i++) { n = atof(txt[i].temperature); if (n>max) { max = n; } } printf("temperature_max = %f\n",max); printf("\n");}void temperature_avg(struct TXT txt[])//求記錄表溫度的平均值{ double m,sum = 0.0; int i; sum = atof(txt[0].temperature); for (i = 1; i <5; i++) { m = atof(txt[i].temperature); sum += m; } printf("temperature_avg = %f\n",sum/5); printf("%f", fabs(atof(check[3].temperature) - atof(txt[3].temperature))); printf("\n");}void Check_temperature(struct TXT txt[], struct TXT check[])//檢查溫度是否合格{ int i = 0,j = 0; for (i = 0; i<5;i++) { if (strcmp(txt[i].time, check[i].time) == 0) { if ((fabs(atof(check[i].temperature) - atof(txt[i].temperature))) > CHECK_STAND) { strcpy(check_failtime[i],txt[i].time); check_failtem[i] = atof(txt[i].temperature); printf("%s ", check_failtime[i]); printf("%f\n", check_failtem[i]); //fwrite(&(txt[i].temperature), sizeof(TXT), 1, pf); } } }}int main(){ int input; while (1) { print(); scanf("%d", &input); switch (input) { case 1: FileRead_Write(); break; case 2: FileRead_Stadard(); break; case 3: temperature_max(txt); break; case 4: temperature_avg(txt); break; case 5: Check_temperature(txt, check); break; default: printf("序號無效\n"); break; } } return 0;}
解析一:用fopen開啟建立的記錄表,通過fgets操作檔案指標一行一行地去讀取時間、溫度、濕度,並且放在一個數組裡面,方便尋找來進行運算。解析二:將兩個表裡的資料都讀出來放在兩個不同的數組裡面,通過運算元組對兩個表的溫度進行比較,當時間相同時才會進行溫度的比較。運行結果:(一)從檔案中讀取記錄表的資料
(二)在讀取出的資料中求溫度的最大值和平均值
(三)從檔案中讀取標準表的資料
(四)比較記錄表和標準表,檢查記錄表中某個時間下的溫度是否合格
實驗總結:(1)、電路必須串連正確,記錄有限的相關資料。(2)、在編寫程式實現檔案讀取資料時,檔案若建立在目前的目錄底下,則讀取時可用相對路徑開啟檔案,否則用絕對路徑開啟檔案。實驗心得:通過這次實驗,我懂得了資料應該按照什麼樣的順序去記錄,才能從檔案中正確地讀取出來;以及對用程式去操作檔案更瞭解了。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【C語言】多溫度感應器大資料的分析與處理實驗報告