# re: 07课程设计(题3) 回复 更多评论
2008-06-28 17:49 by
/* 题3 移动平均线第4步框架 */
#include <stdio.h>
#include <stdlib.h>
#define MAX 200
char dates[MAX][15];
float a[2][MAX]; /* 双缓冲 */
int pos; /* 位置 */
int bufIndex; /* 当前缓冲区当前待处理的数 */
int fileEndBuf; /* 文件结束点对应的缓冲区标号 */
int fileEndPos; /* 文件结束点对应在缓冲区的位置 */
FILE *f;
/* 由于必须反复从文件中读数据,所以先行打开,最后才关闭 */
void openFile() {
if((f=fopen("D:\\f.txt","r"))==NULL) {
printf("Can't open the file.");
exit(1);
}
}
/* 判断是否还有下一条记录 */
int hasNext() {
if(bufIndex==fileEndBuf && pos==fileEndPos)
return 0;
else
...
}
/* 从文件中读取一块数据到当前缓冲区中,当前缓冲区根据bufIndex指示 */
void readBlock( ) {
int i;
while( i<MAX && !feof(f)) {/*每次读,要么读满缓冲区,要么把文件读完(缓冲区未满)*/
fscanf(...);
if(feof(f)) {
... /* 保存文件结束点对应于缓冲区的位置 */
}
i++;
}
}
/* 获取下一个数据值 */
double getNextValue() {
pos++;
if( pos >=MAX) {
readBlock();
bufIndex=(bufIndex+1)%2;
pos=0;
}
return a[bufIndex][pos];
}
/* 以当前位置为基准,获取回溯backStep步的数据值 */
double getPreValue(int backStep) {
int back=pos-backStep;
if( back<0) {
back=MAX+back;
return a[(bufIndex+1)%2][back];
}
else
return a[bufIndex][back];
}
/* 计算下一时间点的平均值 */
void computeNext() {
}
void main() {
openFile();
while(hasNext())
computeNext();
fclose(f);
}
# re: 07课程设计(题3) 回复 更多评论
2008-07-01 15:58 by
/* 针对 Step2 Step3
已更新,可运行,注意在D盘配置数据文件 f.txt
说明:Step2重点是数据读入到数组a中,Step3重点是重构Step1中的avg和avgs方法,实现对多时间跨度的计算。建议这两个人密切合作但要有分工。write函数要补充完整。在机器上调好,同时要把程序看懂。
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 200
char dates[MAX][15];
double a[MAX];
double b05[MAX]; /* 5日均值序列 */
double b10[MAX]; /* 10日均值序列 */
double b20[MAX]; /* 20日均值序列 */
int i;
void init() {
for(i=0;i<MAX;i++) {
b05[i]=0;
b10[i]=0;
b20[i]=0;
}
}
/* 求一个点的移动平均值 */
double avg(int pos, int r,double v[])
{ int j;
double s=0;
for(j=0;j<=r-1;j++)
s+=a[pos-j];
v[pos]=s/r;
return v[pos];
}
/* 求从pos位置开始,往前回溯的一组数的移动平均值 */
/* pos: 起始位置 */
/* r: 平均天数 */
/* v[]: 存放结果的数组: */
void avgs(int pos,int r, double v[])
{
for(;pos>=r-1;pos--)
v[pos]=avg(pos,r,v);
}
/* 从文件中读数 */
void read() {
FILE *f;
double d1,d2,d3,d4,d5,d6;
int i;
if((f=fopen("D:\\f.txt","r"))==NULL) {
printf("Can't open the file.");
exit(1);
}
char str[20];
i=0;
/* 先假定文件足够长,以数组的长度作为循环次数 */
for(i=0;i<MAX;i++) {
fscanf(f,"%s%lf%lf%lf%lf%lf%lf",str,&d1,&d2,&d3,&d4,&d5,&d6);
a[i]=d4;
/* 测试是否读入
printf("%s %10.3lf %10.3lf %10.3lf %10.3lf %10.3lf %10.3lf\n",str,d1,d2,d3,a[i],d5,d6);
*/
i++;
}
fclose(f);
}
/* 写到文件中 */
void write() {
FILE *f1;
int i;
if((f1=fopen("D:\\b.txt","w"))==NULL) {
printf("Can't open the file.");
exit(1);
}
fprintf(f1,"\t05Avg\t\t10Avg\t\t20Avg\n");
for(i=0;i<MAX;i++) {
fprintf(f1,"%10.3lf %10.3lf %10.3lf\n",b05[i],b10[i],b20[i]);
}
fclose(f1);
}
/* 计算每个点的移动平均值 */
void compute() {
avgs(MAX,5,b05);
avgs(MAX,10,b10);
avgs(MAX,20,b20);
}
/* */
void outputAvg() {
int i;
printf("\t05Avg\t\t10Avg\t\t20Avg\n");
for(i=0;i<MAX;i++)
printf("%10.3lf\t%10.3lf\t%10.3lf\n",b05[i],b10[i],b20[i]);
}
void main() {
init();
read(); /* 读入数据 */
compute(); /* 计算 */
outputAvg();
write(); /* 写入文件 */
//outputAvg();
}