数据库实验报告.docx
《数据库实验报告.docx》由会员分享,可在线阅读,更多相关《数据库实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
数据库实验报告
本科实验报告
课程名称:
数据库系统概论
实验项目:
实验地点:
逸夫楼304
专业班级:
软件1106学号:
2011005069
学生姓名:
王婧
指导教师:
降爱莲
2013年5月5日
学生姓名
王婧
实验成绩
实验名称
实验二:
交互式SQL语句的使用
实验目的和要求(必填)
(1)掌握数据库对象的操作过程,包括创建、修改、删除
(2)熟悉表的各种操作,包括插入、修改、删除、查询
(3)熟练掌握常用SQL语句的基本语法
实验内容和原理(必填)
(1)建立一个数据库和相关的表、索引、视图等数据库对象,练习对表、索引和视图的各种操作。
(2)要求认真进行实验,记录各实验用例及执行结果。
(3)深入了解各个操作的功能。
3.1数据定义
1.基本表的创建、修改及删除
2.索引的创建
3.视图的创建
3.2数据操作
完成各类更新操作包括:
1.插入数据
2.修改数据
3.删除数据
3.3数据查询操作
完成各类查询操作
1.单表查询
2.分组统计
3.连接查询
4.嵌套查询
5.集合查询
3.4数据操作
1.创建视图
2.视图查询
主要仪器设备
笔记本计算机,使用SQLServer提供的MicrosoftSQLServerManagementStudio工具,交互式使用SQL语句。
实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)
select*fromStudent
select*fromCourse
select*fromSC
(1)单表查询
SelectSname,'YearofBirth:
'asbirth,2000-SageBIRTHDAY,DEPARTMENT=LOWER(Sdept)
formStudent;
(2)分组统计:
selectcno课程号,count(*)人数,AVG(grade)均分,MAX(grade)最高分
fromscgroupbyCno
(3)连接查询:
selectStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
formStudentLEFTOUTERJOINSCon(Student.Sno=SC.Sno)
(4)嵌套查询:
selectSname,SagefromStudent
whereSageandSdept<>'CS';
(5)集合查询:
select*fromStudentwhereSdept='CS'
exceptselect*fromStudentwhereSage<=19;
(6)视图查询:
createVIEWS_G(Sno,Gavg)
asselectSno,avg(Grade)
fromSCgroupbySno;
selectSC.Sno,Cno,grade
fromSC,S_G
whereSC.Sno=S_G.SnoandGrade>=S_G.Gavg
实验结果和分析
心得体会(遇到的问题和解决方法)
通过使用二分法与割线法求解方程,是我对所学的知识有了更深的了解,加深了对这两种方法的印象,同时也知道对于不同的问题应该采用不同的、适合的方法,才能更快更好的解决问题。
在编写二分法程序时,循环条件出错,使程序的运行结果无法停止,改变条件后,程序运行结果正常。
实验名称
实验二线性方程组的直接求解
实验目的和要求
合理选择利用Gauss消元法、LU分解法、追赶法求解下列方程组:
①
②
③
④
实验内容
高斯消元法:
找到与原方程组等价的系数矩阵为三角形方正的方程组:
lik=aik/akk
aij=aij-lik*akj
k=1,2,…,n-1
i=k+1,k+2,…,nj=k+1,k+2,…,n+1
由回代过程求得原方程组的解:
xn=ann+1/ann
xk=(akn+1-∑akjxj)/akk(k=n-1,n-2,…,2,1)
LU分解:
如果A的各界顺序主子式不为0,则存在唯一的LU分解。
u1j=a1j,j=1,2,3,...,n
li1=ai1/u11,i=1,2,3,...,n
ukj=akj-∑lkiuij,j=k,k+1,...,n,k=2,3,...,n
lik=(aik-∑lijujk)/ukk,i=k+1,...,nj=1,...,k-1
追赶法:
矩阵A的LU分解中,矩阵L和U分别取下二对角线和上二对角线形式,求解Ax=b等价于解两个二对角线方程组Ly=b,Ux=y自上而下解方程组Ly=b形象地称为“追”,自下而上解方程组Ux=y称为“赶”。
主要仪器设备
笔记本计算机
实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)
Gauss消元法
#include"stdio.h"
doublea[15][15],a0[15][15];
doubleb[15],b0[15],l[15];
intn;
inti,j;
voiddisplayA()
{
printf("\n");
for(j=1;j<=n;j++)
{
for(i=1;i<=n;i++)
printf("a[%d][%d]=%f",j,i,a[j][i]);
printf("b[%d]=%f\n",j,b[j]);
}
for(j=1;j<=n;j++)
printf("l[%d]=%f",j,l[j]);
printf("\n");
}
voidmain()
{inti,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%lf",&a[i][j]);
a0[i][j]=a[i][j];
}
scanf("%lf",&b[i]);
b0[i]=b[i];
}
displayA();
k=1;
do
{
for(i=1;i<=n;i++)
{
if(i==k)continue;
l[i]=a0[i][k]/a0[k][k];
}
for(j=k+1;j<=n;j++)a[k][j]=a0[k][j]/a0[k][k];
b[k]=b0[k]/a0[k][k];
for(i=1;i<=n;i++)
{
if(i==k)continue;
for(j=k+1;j<=n;j++)
a[i][j]=a0[i][j]-l[i]*a0[k][j];
b[i]=b0[i]-l[i]*b0[k];
}
displayA();
for(i=1;i<=n;i++)
{
for(j=k+1;j<=n;j++)
a0[i][j]=a[i][j];
b0[i]=b[i];
}
if(k==n)break;
k++;
}while
(1);
for(i=1;i<=n;i++)
printf("b[%2d]=%lf\n",i,b[i]);getch();
}
LU分解
#include
#include
#defineL30
doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];
intmain()
{
intn,i,j,k,r;
scanf("%d",&n);
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
scanf("%lf",&a[i][j]);}
}
for(i=1;i<=n;++i)
{
scanf("%lf",&b[i]);
}
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
l[i][j]=0;
u[i][j]=0.0;
}
}
for(k=1;k<=n;++k)
{
for(j=k;j<=n;++j)
{
u[k][j]=a[k][j];
for(r=1;r{
u[k][j]-=l[k][r]*u[r][j];
}
}
for(i=k+1;i<=n;++i)
{
l[i][k]=a[i][k];
for(r=1;r{
l[i][k]-=l[i][r]*u[r][k];}
l[i][k]/=u[k][k];
}
l[k][k]=1.0;
}
for(i=1;i<=n;++i)
{
y[i]=b[i];
for(j=1;j
{y[i]-=l[i][j]*y[j];}
}
for(i=n;i>0;--i)
{x[i]=y[i];
for(j=i+1;j<=n;++j)
{x[i]-=u[i][j]*x[j];}
x[i]/=u[i][i];
}
for(i=1;i<=n;++i)
{
printf("%0.2lf\n",x[i]);
}
getch();
}
追赶法
#include"stdio.h"
main()
{
doublea[15],b[15],c[15],d[15];
doublet;
inti,n;
scanf("%d",&n);
scanf("%lf%lf%lf",&b[1],&c[1],&d[1]);
for(i=2;i<=n-1;i++)
{
scanf("%lf%lf%lf%lf",&a[i],&b[i],&c[i],&d[i]);
}
scanf("%lf%lf%lf",&a[n],&b[n],&d[n]);
c[1]=c[1]/b[1];
d[1]=d[1]/b[1];
for(i=2;i<=n-1;i++)
{
t=b[i]-c[i-1]*a[i];
c[i]=c[i]/t;
d[i]=(d[i]-d[i-1]*a[i])/t;
}
d[n]=(d[n]-d[n-1]*a[n])/(b[n]-c[n-1]*a[n]);
for(i=n-1;i>=1;i--)d[i]=d[i]-c[i]*d[i+1];
printf("\n********************************\n");
for(i=1;i<=n;i++)
printf("d[%2d]=%lf\n",i,d[i]);getch();
}
实验结果和分析
使用直接法求解线性方程组中,系数矩阵A的主元素不为0,即可使用高斯消元法,如果A的各阶主子式不为0,则存在唯一的LU分解。
追赶法是把高斯消元法用到求解三对角线方程组上,计算量较小。
心得体会(遇到的问题和解决方法)
在编写程序时,首先必须的对高斯消元法,LU分解,追赶法有比较详细的了解,知道每一步该怎么做,要有具体的框架,然后在开始编写程序。
同时要注意赋值符号是==,而不是=。
并且调用的函数要写在主函数之前。
实验名称
实验三线性方程组的迭代求解
实验目的和要求
使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。
实验内容
雅可比迭代:
设线性方程组Ax=b的系数矩阵A可逆,且主对角元a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D-A)x+b则有迭代公式x(k+1)=B1x(k)+f1
高斯赛德尔迭代:
把矩阵A分解成A=D-L-U。
其中D=diag(a11,a22,…,ann),-L,-U分别为A的主对角元素除外的下三角和上三角部分,从而线性方程组可写成(D-L)x=Ux+b,即x=B2x+f2,则有迭代公式x(k+1)=B2x(k)+f2
主要仪器设备
笔记本计算机
实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)
雅可比迭代
#include
#include
voidmain()
{
floata[3][3]={{10,-1,-2},{-1,10,-2},{-1,-1,5}},b[3]={7.2,8.3,4.2};
floatx[3]={0,0,0},sum1;
inti,j,k,n=3;
for(k=0;k<10;k++){
for(i=0;i<3;i++)
{
sum1=0;
for(j=0;j{
if(i==j)continue;
sum1=sum1+a[i][j]*x[j];
}
x[i]=(b[i]-sum1)/a[i][i];}
for(i=0;i{printf("x[%d]=%f,",i+1,x[i]);}
printf("\n");
}
getch();}
高斯赛德尔迭代
#include
#include
voidmain()
{
floata[3][3]={{10,-1,-2},{-1,10,-2},{-1,-1,5}},b[3]={7.2,8.3,4.2};
floatx[3]={0,0,0},sum1,sum2;
inti,j,k,n=3;
for(k=0;k<10;k++)
{
for(i=0;i{
sum1=0;sum2=0;
for(j=0;j
{
sum1=sum1+a[i][j]*x[j];
}
for(j=i+1;j<3;j++)
{
sum2=sum2+a[i][j]*x[j];}
x[i]=(b[i]-sum1-sum2)/a[i][i];
}
for(i=0;i{
printf("x[%d]=%f,",i+1,x[i]);
printf("\n");
}
}
getch();}
实验结果和分析
雅可比迭代法公式简单,每迭代一次只需计算一次矩阵和向量的乘法,需存放x(k+1),x(k)
高斯赛德尔迭代在计算机运行时只需一组存储单元,而且可以较好的利用x(k+1),在一定条件下高斯赛德尔迭代比雅可比迭代法收敛的快。
心得体会(遇到的问题和解决方法)
在编写程序时要认真、细心,每一个语句的括号要相匹配,有时候在嵌套语句较多时,要注意每一个括号,缺少括号会使运行结果错误。
在定义变量时,要记得赋初值。
实验名称
实验四代数插值和最小二乘法拟合
实验目的和要求
代数插值
使用拉格朗日插值法或牛顿插值法求解:
已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。
x
0.40
0.55
0.65
0.80
0.90
1.05
f(x)
0.41075
0.57815
0.69675
0.88811
1.02652
1.25386
最小二乘法拟合多项式
给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。
xi
0
0.5
0.6
0.7
0.8
0.9
1.0
yi
1
1.75
1.96
2.19
2.44
2.71
3.00
实验内容
代数插值
设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n
令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)
其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足
Ln(xj)=yj,L=0,1,…,n
再由插值多项式的唯一性,得Pn(x)≡Ln(x)
最小二乘法拟合多项式
建立正规方程组:
∑(∑xij+k)ak=∑xijyi,j=0,1,…,n
平方误差:
I=∑(∑akxik-yi)2
主要仪器设备
笔记本计算机
实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)
代数差值
#include
#include
#include
voiddifference(float*x,float*y,intn)
{
loat*f;
intk,i;
f=(float*)malloc(n*sizeof(float));
for(k=1;k<=n;k++)
{
f[0]=y[k];
for(i=0;if[i+1]=(f[i]-y[i])/(x[k]-x[i]);
y[k]=f[k];
}
return;
}
intmain()
{
inti,n;
floatx[20],y[20],xx,yy;
printf("请输入数据个数n:
");
scanf("%d",&n);
for(i=0;i<=n-1;i++)
{
printf("x[%d]=",i);
scanf("%f",&x[i]);
printf("y[%d]=",i);
scanf("%f",&y[i]);
}
difference(x,(float*)y,n);
printf("请输入插值xx:
");
scanf("%f",&xx);
yy=y[20];
for(i=n-1;i>=0;i--)
yy=yy*(xx-x[i])+y[i];
printf("\n近似值为:
(%f)=%f\n",xx,yy);
}
最小二乘法
#include"stdio.h"
#include"math.h"
#definenum10
floatneiji(floatb[num],floatc[num])/*内积函数*/
{
intp;
floatnj=0;
for(p=1;pnj+=c[p]*b[p];
returnnj;
}
floatpower(float&a,intn)
{
floatb=1;
for(inti=0;i{
b*=a;
}
returnb;
}
floatx[num],y[num],sumX[num],sumY[num];
voidmain()
{
inti,j,n,index;
charconti;
FILE*f;
conti='';
printf("请输入已知点的个数n=\n");
scanf("%d",&n);
printf("请输入x和y:
");
sumX[1]=sumY[1]=0;
for(i=1;i<=n;i++)
{
printf("x[%d]=",i);
scanf("%f",&x[i]);
sumX[1]+=x[i];
printf("y[%d]=",i);
scanf("%f",&y[i]);
sumY[1]+=y[i];
}
printf("sumX[1]=%f",sumX[1]);
printf("sumY[1]=%f",sumY[1]);
printf("请输入拟和次数=");
scanf("%d",&index);
i=n;
sumX[0]=i;
for(i=2;i<=2*index;i++)
{
for(j=1;j<=n;j++)
{
sumX[i]+=power(x[j],i);
}
printf("sumX[%d]=%f",i,sumX[i]);
}
for(i=2;i<=index+1;i++)
{
for(j=1;j<=n;j++)
{
sumY[i]+=power(x[j],i-1)*y[j];
}
printf("sumY[%d]=%f",i,sumY[i]);
}
f=fopen("Gaussdata.txt","w");
fprintf(f,"%i\n",index+1);
for(i=0;i<=index;i++)
{
for(j=i;j<=index+i;j++)
fprintf(f,"%f",sumX[j]);
fprintf(f,"%f\n",sumY[i+1]);
}
fclose(f);
//利用求解线性方程组的方法求解…
}
实验结果和分析
利用插值法寻求近似函数并计算近似值使求解变得简单,并且只要求在插值节点上,插值函数与被插函数的函数值相等。
在曲线拟合中采用误差平方和来度量误差的整体大小。
寻求与给定点(xi,yi)(i=0,1,…,m)的距离平方和为最小的曲线y=p(x).函数p(x)称为拟合函数或最小二乘解。
心得体会(遇到的问题和解决方法)
通过本次实验使自己在理论知识的基础上加以实践,加深对代数插值和最小二乘法拟合的理解。
在调试程序时经常会因为一些小的错误导致程序不能正常运行,这时需要仔细检查程序。
总的来说,在整个实验的过程中,使自己对所学的知识有了进一步的巩固,也学会了用简单的方法求解函数。