数据库实验报告.docx
- 文档编号:23132597
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:24
- 大小:423.49KB
数据库实验报告.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
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)称为拟合函数或最小二乘解。 心得体会(遇到的问题和解决方法) 通过本次实验使自己在理论知识的基础上加以实践,加深对代数插值和最小二乘法拟合的理解。 在调试程序时经常会因为一些小的错误导致程序不能正常运行,这时需要仔细检查程序。 总的来说,在整个实验的过程中,使自己对所学的知识有了进一步的巩固,也学会了用简单的方法求解函数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)