使用c语言的EasyX库实现文件管理系统
代码思路
1、利用两个文本文件,一个文本文件保存需要的数据,另一个保存需要处理的数据,对需要处理的文本内容进行最小值,最大值,平均值的求解。
2、把处理的数据存入数组,转化性质,用Easyx进行画图。
3、添加必要的提示文本,达到更好的人机交互
头文件的应用
#include <stdio.h>
#include <graphics.h> //EasyX头文件
#include <string.h>
#include <conio.h>//getch()函数头文件
#include <stdlib.h>//itoa()函数头文件
相关子文件的引用
void picture(int* c);//画图函数
double Max(double shuj[], int len);
double Min(double shuj[], int len);
double DMin(double shuj[], int len);
double DMax(double shuj[], int len);
double Avg(double shuj[], int len);
画图子程序
void picture(int* c) //画图程序
{
int dat[11] = { 40000,30000,20000,10000,0,-10000,-20000,-30000,-40000,-50000 };//Y轴
int time[10] = { 0,12,13,14,15,16,17,18,19,20 };//X轴
int i = 0,j;
char str[10];
initgraph(1250, 550, SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
/*************************x轴单位长度**********************/
settextcolor(RGB(255, 55, 39));
for (i = 1; i <= 9; i++)
{
itoa(time[i], str, 10);//将数字转化成字符串
outtextxy(120 * i, 260, str);
}
/**************************y轴单位长度*********************/
settextcolor(RGB(255, 55, 39));
for (i = 0; i <= 10; i++)
{
itoa(dat[i], str, 10);//将数字转化成字符串
outtextxy(10, 50 + 50 * i, str);
}
/*******************************x轴***********************/
setlinecolor(RGB(170, 70, 10));
line(60, 250, 1150, 250);
line(1150, 250, 1130, 240);//x轴箭头
line(1150, 250, 1130, 260);//x轴箭头
settextcolor(RGB(78, 67, 197));
outtextxy(1150, 250, "x / 时间");
/******************************y轴********************/
setlinecolor(RGB(57, 170, 180));
line(60, 40, 60, 770);
line(60, 40, 50, 60);//y轴箭头
line(60, 40, 70, 60);//y轴箭头
outtextxy(20, 20, "y / 数据");
/***************************折线图************************/
settextcolor(RGB(94, 196, 200));
settextstyle(20, 0, "楷体");
outtextxy(390, 10, "2008-7-25 12:00:00 - 2008-7-25 20:00:00 电场的变化");//标题
setlinecolor(RGB(87, 190, 214));
for (i = 1; i < 481; i++)
{
line(120 + 2 * i, c[i], 120 + 2 * (i + 1), c[i + 1]);
//Easyx的坐标和广义坐标不同,好好学习呦
}
getch();
closegraph();
}
画图程序使用Easyx插件进行编写,b站可学习
数据处理子程序
double Max(double shuj[], int len) //最大值程序
{
double max = 0;
int i;
for (i = 0; i < len; i++)
{
if (max < shuj[i])
{
max = shuj[i];
}
}
return max;
}
double Min(double shuj[], int len)
{
double min = 0;
int i;
for (i = 0; i < len; i++)
{
if (min > shuj[i])
{
min = shuj[i];
}
}
return min;
}
double Avg(double shuj[], int len)
{
double sum = 0, avg = 0;
int i;
for (i = 0; i < len; i++)
{
sum = sum + shuj[i];
}
avg = sum / len;
return avg;
}
double DMin(double shuj[], int len)
{
double dmin = 0, Dshuj = 0;
int i;
for (i = 1; i <= len; i++)
{
Dshuj = shuj[i] - shuj[i - 1];
if (dmin > Dshuj)
{
dmin = Dshuj;
}
}
return dmin;
}
double DMax(double shuj[], int len)
{
double dmax = 0, Dshuj = 0;
int i;
for (i = 1; i <= len; i++)
{
Dshuj = shuj[i] - shuj[i - 1];
if (dmax < Dshuj)
{
dmax = Dshuj;
}
}
return dmax;
}
代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <graphics.h> //EasyX头文件
#include <string.h>
#include <conio.h>//getch()函数头文件
#include <stdlib.h>//itoa()函数头文件
void picture(int* c);//函数声明 F:\CR1000_Tab60sec.dat
double Max(double shuj[], int len);
double Min(double shuj[], int len);
double DMin(double shuj[], int len);
double DMax(double shuj[], int len);
double Avg(double shuj[], int len);
int main(void)
{
char txt[128] = {'\0'}, Date[30];//数据处理所需的数组
char ch;
int nn = 0, huan = 0, i = 0, j = 0, choicex = 0, choice = 0 ,choicez = 0,len, Cshuj;
int c[500];//画图转化
double shu, max = 0, min = 0, avg = 0, Sum = 0, dmax = 0, dmin = 0, Dshuj = 0;
double Shuj[500];
FILE* fp;
FILE* date;
FILE* Savedate;
printf("\n--------------------------**欢迎使用文件处理系统**--------------------------\n");
do /*输入文件路径,直到路径正确*/
{
printf("**请您输入文件路径: ");
gets_s(txt);
//判断文件是否打开失败
if ((fp = fopen(txt, "rt")) == NULL)
{
puts("----输入的文件路径有误,重新输入----");
}
} while ((fp = fopen(txt, "rt")) == NULL);
date = fopen("status.txt", "wt");//把要处理数据存到status.txt文本文件
if (date == NULL) {
printf("File open error!\n");
return 0;
}
Savedate = fopen("Save.txt", "wt");//把要保存数据存到Savedate.txt文本文件
if (Savedate == NULL) {
printf("File open error!\n");
return 0;
}
printf("打开文件成功\n\n");
printf("----------------------**数据列表**--------------------\n\n");
printf(" *时间数据* *电场数据* \n");
/*********对原始数据进行处理,采集需要的时间和电场数据***********/
while ((ch = fgetc(fp)) != EOF) /*对文件内每字符进行判断*/
{
if (ch == '\n') /*让系统跳过文件前面的头文件*/
{
nn++;
}
if (nn >= 4)
{
if (ch == ',')
{
huan++;
if (huan == 1)
{
fprintf(Savedate, ", ");
printf(" ");
}
}
if (ch != ',' && ch != '"')
{
if (ch != '\n')
{
if (huan == 0)
{
fprintf(Savedate,"%c", ch);
printf("%c", ch);
}
if (huan == 2)
{
fprintf(Savedate,"%c",ch);
fprintf(date, "%c", ch);
printf("%c", ch);
}
}
if (ch == '\n')
{
fprintf(Savedate, "\n");
fprintf(date, "\n");
huan = 0;
printf("\n");
printf(" ");
}
}
}
}
printf("\n\n---------------------- **数据读取完毕** --------------------\n");
fclose(date); //操作结束后关闭所有文件
fclose(Savedate);
fclose(fp);
/****************利用处理文本文件采集电场数据*************/
date = fopen("status.txt", "rb");
if (date == NULL) {
printf("File open error!\n");
return 0;
}
while (fgets(Date, 30, date) != NULL)
{
shu = atof(Date);//数据转化
Shuj[j] = shu;
j++;
}
len = j -1;
Shuj[i] = '\0';
fclose(date);
printf("\n***********************************************\n\n");
/****************数据处理(最大值,最小值,平均值)********************/
max = Max(Shuj, len);
min = Min(Shuj, len);
avg = Avg(Shuj, len);
/******************数据处理(差分最大值,差分最小值)*********************/
dmax = DMax(Shuj, len);
dmin = DMin(Shuj, len);
/********************************数据输出********************************/
do
{
printf("\n----*是否对电场数据进行统计分析\n");
printf("----“1”对电场数据的分析\n");
printf("----“2”无需对电场数据进行统计分析\n");
printf("输出:");
scanf_s("%d", &choicex);
if ((choicex != 1) && (choicex != 2))
{
printf("\n--**输入有误------请重新输入**--\n");
}
} while ((choicex!=1)&& (choicex != 2));
if (choicex == 1)
{
printf("\n***********************************************\n");
printf(" **电场数据的最大值为: %.4f\n\n", max);
printf(" **电场数据的最小值为: %.4f\n\n", min);
printf(" **电场数据的平均值为: %.4f\n\n", avg);
printf(" **电场数据的差分的最大值为: %.4f\n\n", dmax);
printf(" **电场数据的差分的最小值为: %.4f\n", dmin);
}
if (choicex == 2)
{
printf("*-------------------------------------------------------*");
}
printf("\n***********************************************\n");
///*************************图像输出***********************/
do
{
printf("\n----请选择要输出的图像:\n");
printf("----“1”输出电场数据\n");
printf("----“2”输出差分后的电场数据\n");
printf("输出:");
scanf_s("%d",&choice);
if ((choice != 1) && (choice != 2))
{
printf("\n--**输入有误------请重新输入**--\n");
}
} while ((choice != 1) && (choice != 2));
for (i = 1; i <= len; i++)
{
if (choice == 1)
{
Cshuj = (int)(Shuj[i]);
Cshuj = 250 - (Cshuj / 200);
c[i] = Cshuj;
}
if (choice == 2)
{
Cshuj = (int)(Shuj[i] - Shuj[i - 1]);
Cshuj = 250 - (Cshuj / 200);
c[i] = Cshuj;
}
}//相关参数转化(Easyx)
picture(c);
/***********************************************************/
do
{
printf("\n----是否需要输出另一张图像\n");
printf("----“1”确认输出另一张图像\n");
printf("----“2”不需要输出另一张图像\n");
printf("输出:");
scanf_s("%d", &choicez);
if ((choicez != 1) && (choicez != 2))
{
printf("\n--**输入有误------请重新输入**--\n");
}
} while ((choicez != 1) && (choicez != 2));
for (i = 1; i <= len; i++)
{
if (choicez == 1 && choice == 1)//输出差分处理的图像
{
Cshuj = (int)(Shuj[i] - Shuj[i - 1]);
Cshuj = 250 - (Cshuj / 200);
c[i] = Cshuj;
}
if (choicez == 1 && choice == 2)//输出未处理的图像
{
Cshuj = (int)(Shuj[i]);
Cshuj = 250 - (Cshuj / 200);
c[i] = Cshuj;
}
if (choicez == 2)
{
break;
}
}
if (choicez == 1)
{
picture(c);
}
printf("\n图像展示完毕\n");
printf("\n------------------------*感谢您的使用*---------------------\n");
return 0;
}
void picture(int* c)
{
int dat[11] = { 40000,30000,20000,10000,0,-10000,-20000,-30000,-40000,-50000 };//Y轴
int time[10] = { 0,12,13,14,15,16,17,18,19,20 };//X轴
int i = 0;
char str[10];
initgraph(1250, 550, SHOWCONSOLE);
setbkcolor(WHITE);
cleardevice();
/*************************x轴单位长度**********************/
settextcolor(RGB(255, 55, 39));
for (i = 1; i <= 9; i++)
{
itoa(time[i], str, 10);//将数字转化成字符串
outtextxy(120 * i, 260, str);
}
/**************************y轴单位长度*********************/
settextcolor(RGB(255, 55, 39));
for (i = 0; i <= 10; i++)
{
itoa(dat[i], str, 10);
outtextxy(10, 50 + 50 * i, str);
}
/*******************************x轴***********************/
setlinecolor(RGB(170, 70, 10));
line(60, 250, 1150, 250);
line(1150, 250, 1130, 240);//x轴箭头
line(1150, 250, 1130, 260);//x轴箭头
settextcolor(RGB(78, 67, 197));
outtextxy(1150, 250, "x / 时间");
/******************************y轴********************/
setlinecolor(RGB(57, 170, 180));
line(60, 40, 60, 770);
line(60, 40, 50, 60);//y轴箭头
line(60, 40, 70, 60);//y轴箭头
outtextxy(20, 20, "y / 电场数据");
/***************************折线图************************/
settextcolor(RGB(94, 196, 200));
settextstyle(20, 0, "楷体");
outtextxy(390, 10, "2008-7-25 12:00:00 - 2008-7-25 20:00:00 电场的变化");//标题
setlinecolor(RGB(87, 190, 214));
for (i = 1; i < 481; i++)
{
line(120 + 2 * i, c[i], 120 + 2 * (i + 1), c[i + 1]);
} //画布坐标的正方向恰好与广义坐标系的正方向相反
getch();
closegraph();
}
double Max(double shuj[], int len)
{
double max = 0;
int i;
for (i = 0; i < len; i++)
{
if (max < shuj[i])
{
max = shuj[i];
}
}
return max;
}
double Min(double shuj[], int len)
{
double min = 0;
int i;
for (i = 0; i < len; i++)
{
if (min > shuj[i])
{
min = shuj[i];
}
}
return min;
}
double Avg(double shuj[], int len)
{
double sum = 0, avg = 0;
int i;
for (i = 0; i < len; i++)
{
sum = sum + shuj[i];
}
avg = sum / len;
return avg;
}
double DMin(double shuj[], int len)
{
double dmin = 0, Dshuj = 0;
int i;
for (i = 1; i <= len; i++)
{
Dshuj = shuj[i] - shuj[i - 1];
if (dmin > Dshuj)
{
dmin = Dshuj;
}
}
return dmin;
}
double DMax(double shuj[], int len)
{
double dmax = 0, Dshuj = 0;
int i;
for (i = 1; i <= len; i++)
{
Dshuj = shuj[i] - shuj[i - 1];
if (dmax < Dshuj)
{
dmax = Dshuj;
}
}
return dmax;
}
原始数据文件
有很多数据,这里只是一部分
输出数据文件
Easyx画图展示
总结
本文提供的画图代码只能画出坐标轴,因为缺少数据
仅供参考
书山有路勤为径,学海无涯苦作舟