形式系统

计算机专业教学
posts - 48, comments - 150, trackbacks - 0, articles - 10
  教师博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

07课程设计(题3)

Posted on 2008-06-23 00:00 形式系统 阅读(367) 评论(2)  编辑 收藏 引用 网摘 所属分类: 编程开发

课题3:移动平均线求解

 

Step1:在数组中实现单一的移动平均线求解

要求:

1、  采用数组作为存放数字序列,数字用float

2、  求出自第三个数字开始,每个数字所对应的移动平均值。

3、  通过编写主程序将所求得的数打印出来。

 

以下为参考框架。

#include <stdio.h>

 

float a[]={12.3,12.6,12.5,12 …. } /* 随机地设置一实数序列,作为输入序列 */

float b[];                  /* 将求出的平均值写入本数组,不足3天的位置空出。*/

 

/*  求下标为pos的数组元素往回溯三天的移动平均值 */

float avg(int  pos){

 

}

 

/* 求出a数组所有的移动平均值,并写入b数组 */

void avgs() {

 

}

 

/* 调用上述函数,并负责打印结果 */

void main(){

 

}

Feedback

# 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();
}

只有注册用户登录后才能发表评论。