实验目的:
一、从实验仪器测量数据并且记录在文本文档中
二、读取记录表的数据。
三、检查记录表中的温度是否符合标准。
实验步骤:
一、从实验仪器测量数据并且记录在文本文档中
根据实验仪器上的电路连接图连接相关路线读取相关数据,并且记录在文件中。
二、读取记录表的数据
在当前工程目录底下创建一个文本文档,将所测的数据(时间、温度、湿度)记录在文本文档中,如:
(一)记录表
通过程序运行将此文件的有限数据读出并显示在终端(运行在屏幕上),同时求温度的最大值与平均值。
三、检查记录表中的温度是否符合标准
另给一个标准表,即再创建一个文本文档,另给一组数据(时间、温度、湿度),同样也需要去读取标准表的数据,通过记录表与标准表在相等时间内的温度比较,检查记录表中的温度是否符合标准,若不合格,则输出记录表中不合格的温度以及对应时间。标准表如下:
(二)标准表
通过眼睛去比较记录表与标准表,如果规定在相等时间时两表中的温度差超过了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.0
double 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)、在编写程序实现文件读取数据时,文件若创建在当前目录底下,则读取时可用相对路径打开文件,否则用绝对路径打开文件。
实验心得:
通过这次实验,我懂得了数据应该按照什么样的顺序去记录,才能从文件中正确地读取出来;以及对用程序去操作文件更了解了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-29 05:08:40