资源描述
C语言程序设计说明书与实验报告
25
2020年5月29日
文档仅供参考
C 语 言 程 序 设 计实验报告
学院:资源加工与生物工程
专业:无机非金属材料工程
班级:0501
姓名:金光龙
学号:
指导老师:金胜明
制作日期: 7月9日
C语言程序设计说明书
目录
一 程序设计目的及任务;
二 程序设计的内容;
三 源程序;
四 程序说明;
五 实践心得;
一 程序设计目的及任务
1、学会数据文件的建立
在实验室试验和现场生产过程中,经常要存储、处理许多数据(试验数据和生产数据),在没有在线检测的条件下,这些数据都要进行人工的输入,建立数据文件。
以前,我们都是编写建立数据文件的程序来建立数据文件,当某个数据输入错误时就要重新输入或编写数据文件修改程序,比较麻烦。直接在编辑状态下(TC,TP等)编写数据文件简单、直观、实用。
2、理解而且学会运用文件操作函数
3、学会用线性回归法建立数学模型
二 程序设计的内容
一、 数据文件
1.文件操作函数
(1)文件的打开 fopen
#include<stdio.h>
FILE *fopen(char *filename, char *type);
filename—文件名,字符串变量;type—文件打开的方式(r,w,a)
函数功能:打开由文件filename指定的文件,并把一个stream与它联系起来。返回一个指针,该指针用来识别随后操作的文件stream。若成功地完成打开,则返回最近打开的文件stream,若出现错误,则返回NULL。
(2) 文件的关闭 fclose
#include<stdio.h>
int fclose(FILE *stream);
filename—文件名,字符串变量;type—文件打开的方式(r,w,a)
函数功能:关闭指定的流式文件。
(3)fscanf—从流中执行格式化输入
#include<stdio.h>
int fscanf(FILE *stream, char *format[,argument,…]);
函数功能:从指定的输入流中按规定的格式把数据读入由地址参数&arg1,…&argn给定的单元中。
(4)fprintf—发送格式化输出到流
#include<stdio.h>
int fprintf(FILE *stream, char *format[,argument,…]);
函数功能:按规定的格式把数据输出到指定的流式文件stream中。
例:
#include ”stdio.h”
main()
{
FILE fp, *fopen();
float d, date[10][2];
int i,j;
fp=fopen(”试验数据.dat”,”r”);
for(i=0;i<10;i++)
or(j=0;j<2;j++)
{
fscanf(fp, ”%f”,&d);
date[i][j]=d;
}
fclose(fp);
}
例如,建立存储下列数据的数据文件,并对它进行读、写操作。
序号
Na2O
K2O
CaO
SiO2
弹性模量
1
7.26
8.16
12.68
72
7.2636
2
6.76
7.66
11.68
72
7.2582
3
6.26
7.16
10.68
72
7.2456
4
7.26
7.66
10.68
74
7.
5
6.76
7.16
12.68
74
7.3130
6
6.26
8.16
11.68
74
7.2560
7
7.26
7.16
11.68
76
7.2558
8
6.76
8.16
10.68
76
7.1988
9
6.26
7.66
12.68
76
7.3086
二、 线性回归法建立数学模型
1 建立数学模型的方法
(1) 机理分析法
(2) 数据分析法
回归分析法---静态数模
时间序列分析法—动态数模(系统辨识)
(3) 综合分析法
2 建立线性回归模型的步骤
(1) 第一步
一组试验数据(m组,m>n)
目标:求βj的估计值bj。
使。
用最小二乘法,使
由试验数据计算系数。
第二步 求方程的解
第三步 判断模型的显著性
① 统计量
② 给出显著水平
α(0.1,0.05,0.01)
③ 判断
F > Fα 显著 呈线性关系
F < Fα 不显著 不呈线性关系
例:(m=6,n=1)
X 132 147 163 179 198 222
Y 0 0.6 1.1 1.8 2.4 3.1
Y=-4.688566+0.035669X
利用得到的Y的一个表示式,能够算出相应的弹性模量。
三 源程序
1、 立存储数据的数据文件,并对它进行读、写操作:
数据如上面的表格
(1)
#include<stdio.h>
main()
{
char ch;
FILE *fp;
if ((fp=fopen("F:\\TC\\shujiu.txt","r"))==NULL)
{
printf("file cannot be opened\n");
exit(1);
}
while((ch=fgetc(fp))!=EOF)
fputc(ch,stdout);
fclose(fp);
}
上机调试经过
运行结果如下:
N0. Na2O K2O CaO SiO2 Model
1 7.26 8.16 12.68 72 7.2636
2 6.76 7.66 11.68 72 7.2582
3 6.26 7.16 10.68 72 7.2456 /*此程序为对F:\\TC\\shujiu.txt 的
4 7.26 7.66 10.68 74 7. 文件进行输出*/
5 6.76 7.16 12.68 74 7.3130
6 6.26 8.16 11.68 74 7.2560
7 7.26 7.16 11.68 76 7.2558
8 6.76 8.16 10.68 76 7.1988
9 6.26 7.66 12.68 76 7.3086
(2)
#include<stdio.h>
main()
{
FILE *fp;
float d, date[9][6];
int i,j;
fp=fopen("F:\\TC\\shujiu.txt","r");
printf("\nPut the number:\n");
for(i=0;i<9;i++)
for(j=0;j<6;j++)
{fscanf(fp,"%f",&d);
date[i][j]=d;
printf("%6.4f",date[i][j]);
}
printf("the munber:\n");
for(i=0;i<9;i++)
{printf("%8.2f",date[i][0]);
printf("%8.2f",date[i][1]);
printf("%8.2f",date[i][2]);
printf("%8.2f",date[i][3]);
printf("%4.2f",date[i][4]);
printf("%8.4f",date[i][5]);
printf("\n");}
fclose(fp);
}
上机调试经过
运行结果如下:
1.00 7.26 8.16 12.6872.00 7.2636
2.00 6.76 7.66 11.6872.00 7.2582
3.00 6.26 7.16 10.6872.00 7.2456
4.00 7.26 7.66 10.6874.00 7.
5.00 6.76 7.16 12.6874.00 7.3130
6.00 6.26 8.16 11.6874.00 7.2560
7.00 7.26 7.16 11.6876.00 7.2558
8.00 6.76 8.16 10.6876.00 7.1988
9.00 6.26 7.66 12.6876.00 7.3086、
/*此程序为先对F:\\TC\\shujiu.txt的文件进行打开,再导入到
一个二维数组里进行输出*/
2、璃弹性模量与成分之间的数学模型
源代码如下:
#include "stdio.h"
int i, j, k, n,m;
char cele;
void head()
{ for(i=0;i<8;i++)
printf(" %c",003);
printf("请选择要进行的操作:");
for(i=0;i<8;i++)
printf(" %c",003);
printf("\n");
{ for(i=0;i<8;i++)
printf(" %c",020);
printf(" a.运行程序\n");
for(i=0;i<8;i++)
printf(" %c",020);
printf(" b.退出程序\n");
}
cele=getchar();
if(cele=='a') printf("\n");
else
exit(1);
}
main()
{ for(i=0;i<20;i++)
printf(" %c %c",001,002);
printf("\n");
for(i=0;i<8;i++)
printf(" %c %c",001,002);
printf(" 欢迎使用本程序 ");
for(i=0;i<8;i++)
printf(" %c %c",001,002);
printf("\n\n\n\t\t^_^本程序根据已知的数据构件一个数学模型^_^\n\t其作用是经过分析构成物质,用计算机模拟出材料的弹性模量。\n\n\n");
printf("\t\t 资源加工与生物工程学院\n\t\t\t\t\t\t\t%c 无机0501班\n\n");
printf("\t\t\t姓名: 金光龙 \n");
printf("\n\t\t\t\t\t\t\t 学号:\n\n");
head();
printf ("请输入行数m:\t");
scanf ("%d",&m);
printf ("请输入列数n:");
scanf ("%d",&n);
float s[n][n+1], b[n], x[m+1][n+1], y[5];
float r, t;
char celect;
FILE *fp1;
fp1=fopen("date1.txt","r");
/*date1.txt数据为1 0 0 0 0 0
1 7.26 8.16 12.68 72 7.2636
1 6.76 7.66 11.68 72 7.2582
1 7.26 7.66 10.68 74 7.
1 6.76 7.16 12.68 74 7.3130
1 6.26 8.16 11.68 74 7.2560
1 7.26 7.16 11.68 76 7.2558
1 6.76 8.16 10.68 76 7.1988
1 6.26 7.66 12.68 76 7.3086*/
for(i=0;i<10;i++)
for(j=0;j<6;j++)
{fscanf(fp1, "%f",&t);
x[i][j]=t;}
fclose(fp1);
/*把文件中数赋给x[10][6]*/
for(i=0;i<5;i++)
{
for(j=0;j<10;j++)
{s[i][j]=0;
for(k=1;k<10;k++)
s[i][j]+=x[k][i]*x[k][j];}
}
printf("\n\n增广阵为:\n");
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
printf(" %8.2f",s[i][j]);
printf("\n");
}
/*得到S二维数组*/
printf("\n\n");
for(k=0;k<4;k++)
for(i=k+1;i<5;i++)
{
r=s[i][k]/s[k][k];
for(j=k;j<6;j++)
s[i][j]=s[i][j]-s[k][j]*r;
}
for(i=0;i<5;i++)
{for(j=0;j<6;j++)
if(fabs(s[i][j])<0.00001)
s[i][j]=0; }
printf("对角阵为:\n");
for(i=0;i<5;i++)
{for(j=0;j<6;j++)
printf(" %8.2f",s[i][j]);
printf("\n");
}
/*得到对角阵*/
b[4]=s[4][5]/s[4][4];
b[3]=(s[3][5]-s[3][4]*b[4])/s[3][3];
b[2]=(s[2][5]-s[2][4]*b[4]-s[2][3]*b[3])/s[2][2];
b[1]=(s[1][5]-s[1][4]*b[4]-s[1][3]*b[3]-s[1][2]*b[2])/s[1][1];
b[0]=(s[0][5]-s[0][4]*b[4]-s[0][3]*b[3]-s[0][2]*b[2]-s[0][1]*b[1])/s[0][0];
/*得到b[5]*/
printf("\n\n\t\tB阵为:\n");
for(i=0;i<5;i++) printf("\t\tb[%d]=%f\n",i,b[i]);
FILE *fp2;
fp2=fopen("fdate2.txt","w");
/*文件date2.txt的等式为:
y=7.2620+(-0.0303*x1)+(-0.0320*x2)+(0.04012*x3)+(-0.0003*x4)*/
fprintf(fp2,"y=%.4f+(%.4f*x1)+(%.4f*x2)+(%.5f*x3)+(%.4f*x4) ",b[0],b[1],b[2],b[3],b[4]);
fclose(fp2);
printf("\n\n\t\t\t\t我们得到的数学模型为:\n\n");
printf("\ty=%f+(%f*x1)+(%f*x2)+(%f*x3)+(%f*x4)\n",b[0],b[1],b[2],b[3],b[4]);
for(i=0;i<40;i++)
printf(" %c",005);
printf("\n\n使用模型模拟得到的 弹性模量:");
for(i=0;i<5;i++)
{y[i]=b[0]+b[1]*x[i][1]+b[2]*x[i][2]+b[3]*x[i][3]+b[4]*x[i][4];
printf("\n y[%d]=%f",i,y[i]);}
printf("\n实际的 弹性模量:\n");
for(i=1;i<=5;i++)
printf("d[%d]=%f\n",i-1,x[i][5]);
}
上机调试经过
运行结果如下:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 欢迎使用本程序 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
^_^本程序根据已知的数据构件一个数学模型^_^
其作用是经过分析构成物质,用计算机模拟出材料的弹性模量。
资源加工与生物工程学院 无机0501班
姓名: 金光龙 学号:
_ _ _ _ _ _ _ _请选择要进行的操作: _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ a.运行程序
_ _ _ _ _ _ _ _ b.退出程序
请输入行数m: 10
请输入列数n: 6
增广阵为:
9.00 60.84 68.94 105.12 666.00 65.30
60.84 412.78 466.03 710.61 4502.16 441.38
68.94 466.03 529.58 805.22 5101.56 500.15
105.12 710.61 805.22 1233.80 7778.88 762.94
666.00 4502.16 5101.56 7778.88 49308.00 4832.17
对角阵为:
9.00 60.84 68.94 105.12 666.00 65.30
0.00 1.50 -0.00 -0.00 -0.00 -0.05
0.00 0.00 1.50 -0.00 0.00 -0.05
0.00 0.00 0.00 6.00 0.00 0.24
0.00 0.00 0.00 0.00 24.00 -0.01
B阵为:
b[0]=7.261955
b[1]=-0.030281
b[2]=-0.031982
b[3]=0.040121
b[4]=-0.000343
我们得到的数学模型为:
y=7.261955+(-0.030281*x1)+(-0.031982*x2)+(0.040121*x3)+(-0.000343*x4)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
使用模型模拟得到的 弹性模量:
y[0]=7.261955
y[1]=7.265197
y[2]=7.256207
y[3]=7.247218
y[4]=7. 60
实际的 弹性模量:
[0]=7.263600
[1]=7.258200
[2]=7.245600
[3]=7. 00
[4]=7.313000
press any key to continue...
五 实践心得
这学期虽然学习了C语言,对C语言有了一定的认识,但还只知道在上面运行程序而不知其真正的用途。实习的几天转眼就过去了,经过这几天的学习才发现,原来这一学期对于C语言的了解是非常的肤浅,没有深入的学习。对于第一个任务还算比较容易引进对付,可后面的程序就越发的困难了,有时候是寸步难行,特别是线性回归很难理解,不过到最后还是搞完了。
这次的学习,不但学到了如何利用TC,还锻炼了计算机能力,收获颇大。
经过这近半个月的C语言实践学习,我感觉我有了比较大的收获,对C语言也有了更深的认识。知道C语言是一种概念简洁,数据库类型丰富,表示能力强,运算符多而灵活,控制流和数据结构新颖,程序结构性和可读性好,能有利于培养良好的编程风格,易于体现结构化程序设计思想。它即具有高级语言程序设计的特点,又具有汇编语言的功能;既能有效地进行算法描述,又能对硬件直接进行操作;既适合于编写应用程序,又适合于开发系统软件,它是当今世界上应用广泛,最具有影响力的程序设计语言之一。C语言本身还具有整个语言紧凑整齐,设计精巧,编辑方便,编译与目标代码运行效率高,操作简便,使用灵活等许多鲜明的特点。以前我在TC中只能一个一个的输入,即使两个完全一样的程序都只能再输一次,经过这次的学习,我懂得了用Crtl+k+b ,Crtl+k+k,Crtl+k+c,来定义一个块,再复制到光标处等等。这样省去了很多麻烦,提高了编程的效率。
不但如此,我还学到了如何制作简单界面、编写”建立、读入、保存、另存”等数据文件操作、”修改、插入、添加和删除函数”和”利用线性回归建立数学模型”等等。在一元线性回归数据处理时,,这样能够少用一个循环,体现了编程的简洁性。
虽然我对C语言的了解还只是皮毛,可是经过这次的实习我已有了很大的收获。
展开阅读全文