数据库实验报告.docx

上传人:b****2 文档编号:23132597 上传时间:2023-05-08 格式:DOCX 页数:24 大小:423.49KB
下载 相关 举报
数据库实验报告.docx_第1页
第1页 / 共24页
数据库实验报告.docx_第2页
第2页 / 共24页
数据库实验报告.docx_第3页
第3页 / 共24页
数据库实验报告.docx_第4页
第4页 / 共24页
数据库实验报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数据库实验报告.docx

《数据库实验报告.docx》由会员分享,可在线阅读,更多相关《数据库实验报告.docx(24页珍藏版)》请在冰豆网上搜索。

数据库实验报告.docx

数据库实验报告

本科实验报告

 

课程名称:

数据库系统概论

实验项目:

实验地点:

逸夫楼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

whereSage

andSdept<>'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;i

f[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;p

nj+=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)称为拟合函数或最小二乘解。

心得体会(遇到的问题和解决方法)

通过本次实验使自己在理论知识的基础上加以实践,加深对代数插值和最小二乘法拟合的理解。

在调试程序时经常会因为一些小的错误导致程序不能正常运行,这时需要仔细检查程序。

总的来说,在整个实验的过程中,使自己对所学的知识有了进一步的巩固,也学会了用简单的方法求解函数。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1