习题五
5.1 已知一棵树边的集合为
(I,M),(I,N),(E,I),(B,E),(B,D),(A,B),(G,J),(G,K),(C,G),(C,F),(TABLE,L),(C,TABLE) ,(A,C),画出这棵树,并回答下列问题:
⑴哪个是根结点?
⑵哪些是叶子结点?
⑶哪个是结点G的双亲?
⑷哪些是结点G的祖先?
⑸哪些是结点G的孩子?
⑹哪些是结点E的子孙?
⑺哪些是结点E的兄弟?哪些是结点F的兄弟?
⑻结点B和N的层次号分别是什么?
⑼树的深度是多少?
⑽以结点C为根的子树的深度是多少?
解:依题意,树的表示如图 8.23 所示。
(1)根结点是:a
(2)叶子结点是:d,m,n,f,j,k,l
(3)g 的双亲是:c
(4)g 的祖先是:a,c
(5)g 的孩子是:j,k
(6)e 的子孙是:i,m,n
(7)e 的兄弟是 d,f 的兄弟是 g,h
(8)b 的层次是 2,n 的层次是 5
(9)树的深度是 5
(10)以结点 c 为根的子树的深度是 3
(11)树的度数是 3
5.2 一棵度为2的树与一棵二叉树有何区别?
解:二叉树的度也可以为1。
5.3 试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。
解:二叉树:
5.4 一棵深度为N的满K叉树有如下性质:第N层上的结点都是叶子结点,其余各层上每个结点都有K棵非空子树。如果按层次顺序从1开始对全部结点编号,问
⑴各层的结点数目是多少?
⑵编号为n 的结点的父结点(若存在)的编号是多少?
⑶编号为n 的结点的第i个儿子(若存在)的编号是多少?
⑷编号为n的结点有右兄弟的条件是什么?其右兄弟的编号是多少?
解:
(1)第 i 层的结点数为 ki-1。
(2)编号为 n 的结点的双亲点为:「(n-2)/k」+1。
(3)编号为 n 的结点的第 i 个孩子结点为:(n-1)*k+i+1。
(4)编号为 n 的结点有右兄弟的条件是(n-1) % k≠0,其右兄弟的编号是 n+1。
5.5 已知一棵度为m的树中有n1个度为1的结点,n2个度为2的结点,...,nm个度为m 的结点,问该树中有多少个叶子结点?
解:依题意:设 n 为总的结点个数,n0为叶子结点(即度为 0 的结点)的个数,则有:n=n0+ n1+n2+...+n m①
又有:n-1=度的总数,即:
n-1= n1*1+ n2*2+...+ n m*m ②
①-②式得:
1= n0- n2-2n3-...-(m-1) n m
则有: n0=1+ n2+2n3+...+(m-1) n m
=1+ ∑
=
-
m
i
i
n
i
2
)1
(
5.6 试列出下列二叉树的终端结点、非终端结点以及每个结点的层次
题5.6
解:
终端结点:E、G、H
5.7 对于5.6题中给出的二叉树,分别列出先根次序、中根次序、后根次序的结点序列。解:
先根次序:ABDGCEFH
中根次序:DGBAECHF
后根次序:GDBEHFCA
5.8 在二叉树的顺序存储结构中,实际上隐含着双亲的信息,因此可和三叉链表对应。假设每个指针域占4个字节的存储空间,每个信息占K个字节的存储空间。试问对于一棵有n个结点的二叉树,且在顺序存储结构中最后一个结点的下标为m,在什么条件下顺序存储结构比二叉链表更节省空间?
解:(K+4)*n<(m+1)*4
5.9 假定用两个一维数组L(1:n)和R(1:n)作为有n个结点的二叉树的存储结构,L(i)和R(i)分别指示结点i的左孩子和右孩子,0表示空。
⑴试写一个算法判别结点u是否为结点v的子孙;
⑵先由L和R建立一维数组T(1:n),使T中第i (i=1,2,...,n)个分量指示结点i的双亲,然后写判别结点u是否为结点v的子孙的算法。
解:(1)、
int Is_Descendant_C(int u,int v)
//在孩子存储结构上判断u是否v的子孙,是则返回1,否则返回0
{
if(u==v) return 1;
else
{
if(L[v])
if (Is_Descendant(u,L[v])) return 1;
if(R[v])
if (Is_Descendant(u,R[v])) return 1; //这是个递归算法
}
return 0;
}//Is_Descendant_C
(2)、
int Is_Descendant_P(int u,int v)
//在双亲存储结构上判断u是否v的子孙,是则返回1,否则返回0
{
for(p=u;p!=v&&p;p=T[p]);
if(p==v) return 1;
else return 0;
}//Is_Descendant_P
5.10 假设n和m为二叉树中的两结点,用“1”、“0”“Φ”(分别表示肯定、恰恰相反和不一定)填写下表:
注:⑴如果离a和b最近的共同祖先p存在,且⑵a在p的左子树中,b在p的右子树中,则称a 在b的左方(即b在a的右方)。
5.11 假设以二叉链表作存储结构,试分别写出前序和后序遍历的非递归算法,可直接利用栈的基本运算。
解:前序遍历:
依题意,使用一个栈 stack 实现非递归的前序遍历。
void preorder(b)
btree *b;
{
btree *stack[Maxsize],*p;
int top;
if (b!=NULL)
{
top=1; /*根结点入栈*/
stack[top]=b;
while (top>0) /*栈不为空时循环*/
{
p=stack[top]; /*退栈并访问该结点*/
top--;
printf("%d ",p->data);
if (p->right!=NULL) /*右孩子入栈*/
{
top++;
stack[top]=p->right;
}
if (p->left!=NULL) /*左孩子入栈*/
{
top++;
stack[top]=p->left;
}
}
}
}
后序遍历:
根据后序遍历二叉树的递归定义,转换成非递归函数时采用一个栈保存返回的结点,先扫描根结点的所有左结点并入栈,出栈一个结点,然后扫描该结点的右结点并入栈,再扫描该右结点的所有左结点并入栈,当一个结点的左右子树均访问后再访问该结点,如此这样,直到栈空为止。在访问根结点的右子树后,当指针 p 指向右子树树根时,必须记下根结点的位置,以便在遍历右子树之后正确返回,这就产生了一个问题:在退栈回到根结点时如何区别是从左子树返回还是从右子树返回。这里采用两个栈 stack 和 tag,并用一个共同的栈顶指针,一个存放指针值,一个存放左右子树标志(0 为左子树,1 为右子树)。退栈时在退出结点指针的同时区别是遍历左子树返回的还是遍历右子树返回的,以决定下一步是继续遍历右子树还是访问根结点。
因此,实现本题功能的函数如下:
void postorder(btree *b)
{
btree* stack[Maxsize],*p;
int tag[Maxsize];
int top=0;
p=b;
do
{
while(p!=NULL) /*扫描左结点,入栈*/
{
top++;
stack[top]=p;
tag[top]=0;
p=p->left;
}
if(top>0)
{
if(tag[top]==1) /*左右结点均已访问过,则访问该结点*/
{
printf("%c ",stack[top]->data);
top--;
}
else
{
p=stack[top];
if(top>0)
{
p=p->right; /*扫描右结点*/
tag[top]=1; /*表示当前结点的右子树已访问过*/
}
}
}
} while(p!=NULL||top!=0);
}
5.12 假设在二叉链表中增设两个域:双亲域(parent)以指示其双亲结点;标志域(mark):0..2,以区分在遍历过程中到达该结点时应该继续向左或向右或访问该结点。试以此存储结构编写不用栈的后序遍历的算法。
解:
typedef struct {
int data;
EBTNode *lchild;
EBTNode *rchild;
EBTNode *parent;
enum {0,1,2} mark;
} EBTNode,EBitree; //有mark域和双亲指针域的二叉树结点类型void PostOrder_Nonrecursive(EBitree T)//后序遍历二叉树的非递归算法,不用栈{
p=T;
while(p)
switch(p->mark)
{
case 0:
p->mark=1;
if(p->lchild) p=p->lchild; //访问左子树
break;
case 1:
p->mark=2;
if(p->rchild) p=p->rchild; //访问右子树
break;
case 2:
visit(p);
p->mark=0; //恢复mark值
p=p->parent; //返回双亲结点
}
}//PostOrder_Nonrecursive
分析:本题思路与上一题完全相同,只不过结点的mark值是储存在结点中的,而不是暂存在堆栈中,所以访问完毕后要将mark域恢复为0,以备下一次遍历.
5.13 试编写算法在一棵以二叉链表存储的二叉树中求这样的结点:它在前序序列中处第K个位置。
解:
int c,k; //这里把k和计数器c作为全局变量处理
void Get_PreSeq(Bitree T)//求先序序列为k的结点的值
{
if(T)
{
c++; //每访问一个子树的根都会使前序序号计数器加1
if(c==k)
{
printf("Value is %d\n",T->data);
exit (1);
}
else
{
Get_PreSeq(T->lchild); //在左子树中查找
Get_PreSeq(T->rchild); //在右子树中查找
}
}//if
}//Get_PreSeq
main()
{
...
scanf("%d",&k);
c=0; //在主函数中调用前,要给计数器赋初值0
Get_PreSeq(T,k);
}//main
5.14 试以二叉链表作存储结构,编写计算二叉树中叶子结点数目的递归算法。
解:依题意:计算一棵二叉树的叶子结点数的递归模型如下:
因此,实现本题功能的函数如下:
int leafs(btree *b)
{
int num1,num2;
if (b==NULL) return(0);
else if (b->left==NULL && b->right==NULL) return(1);
else
{
num1=leafs(b->left);
num2=leafs(b->right);
return(num1+num2);
}
}
5.15 以二叉链表作存储结构,编定算法将二叉树中所有结点的左、右子树相互交换。解:依题意:交换二叉树的左、右子树的递归模型如下:
因此,实现本题功能的函数如下:
btree *swap(btree *b)
{ btree *t,*t1,*t2;
if (b==NULL) t=NULL;
else
{
t=(btree *)malloc(sizeof(btree)); /*复制一个根结点*/
t->data=b->data;
t1=swap(b->left);
t2=swap(b->right);
t->left=t2;
t->right=t1;
}
return(t);
}
5.16 已知一棵二叉树以二叉链表作存储结构,编写完成下列操作的算法:对于树中每个元素值为x的结点,删去以它为根的子树,并释放相应的空间。
解:依题意:设 print 是以嵌套括号表示输出一个二叉树,本题的算法是:先判定根结点数据域是否为 x,若是则直接输出该二叉树;否则调用的函数对应的递归模型如下:
因此,实现本题功能的函数如下:
btree *delsubtree(btree *b,int x)
{ btree *s;
if (b!=NULL)
if (b->data==x) /*根结点值等于 x 的情况,直接删除*/
{ print(b);
s=NULL;
}
else s=finddel(b,x);
return(s);
}
btree *finddel(btree *p,int x)
{ btree *s;
if (p!=NULL)
{
if (p->left!=NULL && p->left->data==x)
{ print(p->left);
p->left=NULL;
}
if (p->right!=NULL && p->right->data==x)
{ print(p->right);
p->right=NULL;
}
s=finddel(p->left,x);
p->left=s;
s=finddel(p->right,x);
p->right=s;
}
return(p);
}
void print(btree *b)
{ if (b!=NULL)
{
printf("%d",b->data);
if (b->left!=NULL || b->right!=NULL)
{
printf("(");
print(b->left);
if (b->right!=NULL) printf(",");
print(b->right);
printf(")");
}
}
}
5.17 已知一棵以二叉链表作存储结构的二叉树,试编写复制这棵二叉树的非递归算法。
解:依题意:复制一棵二叉树的递归模型如下:
因此,实现本题功能的递归函数如下:
btree *copy(btree *b)
{ btree *p;
if (b!=NULL)
{
p=(btree *)malloc(sizeof(btree));
p->data=b->data;
p->left=copy(b->left);
p->right=copy(b->right);
return(p);
}
else return(NULL);
}
5.18 已知一棵以二叉链表为存储结构的二叉树,试编写层次顺序(同一层自左向右)遍历二叉树的算法。
解:依题意:本算法要采用一个队列 q,先将二叉树根结点入队列,然后退队列,输出该结点,若它有左子树,便将左子树根结点入队列,若它有右子树,便将右子树根结点入队列,如此直到队列空为止。因为队列的特点是先进先出,从而达到按层次顺序遍历二叉树的目的。
因此,实现本题功能的函数如下:
#define MAXLEN 100
void translevel(btree *b)
{
struct node
{
btree *vec[MAXLEN];
int f,r;
} q;
q.f=0; /*置队列为空队列*/
q.r=0;
if (b!=NULL) printf("%d ",b->data);
q.vec[q.r]=b; /*结点指针进入队列*/
q.r=q.r+1;
if (b!=NULL) printf("%d ",b->data);
q.vec[q.r]=b; /*结点指针进入队列*/
q.r=q.r+1;
while (q.f { b=q.vec[q.f]; /*队头出队列*/ q.f=q.f+1; if (b->left!=NULL) /*输出左孩子,并入队列*/ { printf("%d ",b->left->data); q.vec[q.r]=b->left; q.r=q.r+1; } if (b->right!=NULL) /*输出右孩子,并入队列*/ { printf("%d ",b->right->data); q.vec[q.r]=b->right; q.r=q.r+1; } } } 5.19 试以二叉链表作存储结构,编写算法判别给定二叉树是否为完全二叉树。 解: int IsFull_Bitree(Bitree T)//判断二叉树是否完全二叉树,是则返回1,否则返回0 { InitQueue(Q); flag=0; EnQueue(Q,T); //建立工作队列 while(!QueueEmpty(Q)) { DeQueue(Q,p); if(!p) flag=1; else if(flag) return 0; else { EnQueue(Q,p->lchild); EnQueue(Q,p->rchild); //不管孩子是否为空,都入队列 } }//while return 1; }//IsFull_Bitree 分析:该问题可以通过层序遍历的方法来解决.与62.相比,作了一个修改,不管当前结点是否有左右孩子,都入队列.这样当树为完全二叉树时,遍历时得到是一个连续的不包含空指针的序列.反之,则序列中会含有空指针. 5.20 已知一棵完全二叉树存在于顺序存储结构A(1:max)中,A[1:n]含结点值。试编写算法由此顺序结点建立该二叉树的二叉链表。 解:Status CreateBitree_SqList(Bitree &T,SqList A)//根据顺序存储结构建立二叉链表 { Bitree ptr[https://www.wendangku.net/doc/674349761.html,st+1]; //该数组储存与sa中各结点对应的树指针 if(!https://www.wendangku.net/doc/674349761.html,st) { T=NULL; //空树 return; } ptr[1]=(BTNode*)malloc(sizeof(BTNode)); ptr[1]->data=A.elem[1]; //建立树根 T=ptr[1]; for(i=2;i<=https://www.wendangku.net/doc/674349761.html,st;i++) { if(!A.elem[i]) return ERROR; //顺序错误 ptr[i]=(BTNode*)malloc(sizeof(BTNode)); ptr[i]->data=A.elem[i]; j=i/2; //找到结点i的双亲j if(i-j*2) ptr[j]->rchild=ptr[i]; //i是j的右孩子 else ptr[j]->lchild=ptr[i]; //i是j的左孩子 } return OK; }//CreateBitree_SqList 5.21 编写一个算法,输出以二叉树表示的算术表达式,若该表达式中含有括号,则在输出时应该添上,已知二叉树的存储结构为二叉链表。 解: Status Print_Expression(Bitree T)//按标准形式输出以二叉树存储的表达式 { if(T->data是字母) printf("%c",T->data); else if(T->data是操作符) { if(!T->lchild||!T->rchild) return ERROR; //格式错误 if(T->lchild->data是操作符&&T->lchild->data优先级低于T->data) { printf("("); if(!Print_Expression(T->lchild)) return ERROR; printf(")"); } //注意在什么情况下要加括号 else if(!Print_Expression(T->lchild)) return ERROR; if(T->rchild->data是操作符&&T->rchild->data优先级低于T->data) { printf("("); if(!Print_Expression(T->rchild)) return ERROR; printf(")"); } else if(!Print_Expression(T->rchild)) return ERROR; } else return ERROR; //非法字符 return OK; }//Print_Expression 5.22 一棵二叉树的直径定义为,从二叉树的根结点到所有叶子结点的路径长度的最大值。假设以二叉链表作存储结构,试编写算法求给定二叉树的直径和其长度等于直径的一条路径(即从根到该叶子结点的序列)。 解: int maxh; Status Printpath_MaxdepthS1(Bitree T)//求深度等于树高度减一的最靠左的结点 { Bitree pathd; maxh=Get_Depth(T); //Get_Depth函数见6.44 if(maxh<2) return ERROR; //无符合条件结点 Find_h(T,1); return OK; }//Printpath_MaxdepthS1 void Find_h(Bitree T,int h)//寻找深度为maxh-1的结点 { path[h]=T; if(h==maxh-1) { for(i=1;path[i];i++) printf("%c",path[i]->data); exit; //打印输出路径 } else { if(T->lchild) Find_h(T->lchild,h+1); if(T->rchild) Find_h(T->rchild,h+1); } path[h]=NULL; //回溯 }//Find_h 5.23 试分别画出下列各二叉树的先序、中序、后序的线索二叉树。 (a) (d) (e) (a) (b) (c) (d) (e) 题5.23 解:(a (b)前序:中序和后序(一样): (c)前序和中序(一样):后序: (d )前序: 中序: 后序: (e )前序: 中序: 后序: 5.24 试编写一个算法,在中序线索二叉树中,结点p↑之下插入一棵以结点x↑为根,只有左子树的中序全线索化二叉树,使x↑为根的二叉树成为p↑的左子树,若p↑原来有左子树,则令它为x↑的右子树。完成插入之后二叉树应保持线索化特性。 解: Status Insert_BiThrTree(BiThrTree &T,BiThrTree &p,BiThrTree &x)//在中序线索二叉树T的结点p下插入子树x { if(!p->ltag&&!p->rtag) return INFEASIBLE; //无法插入 if(p->ltag) //x作为p的左子树 { s=p->lchild; //s为p的前驱 p->ltag=Link; p->lchild=x; q=x; while(q->lchild) q=q->lchild; q->lchild=s; //找到子树中的最左结点,并修改其前驱指向s q=x; while(q->rchild) q=q->rchild; q->rchild=p; //找到子树中的最右结点,并修改其前驱指向p } else //x作为p的右子树 { s=p->rchild; //s为p的后继 p->rtag=Link; p->rchild=x; q=x; while(q->rchild) q=q->rchild; q->rchild=s; //找到子树中的最右结点,并修改其前驱指向s q=x; while(q->lchild) q=q->lchild; q->lchild=p; //找到子树中的最左结点,并修改其前驱指向p } return OK; }//Insert_BiThrTree 5.25 已知一棵以线索链表作存储结构的中序线索二叉树,试编写在此二叉树上找后序后继的算法。 解:在中序线索二叉树中求结点后继的算法:由于是中序线索二叉树,后继有时可直接利用线索得到,rtag 为 0 时需要查找,即右子树中最左下的子孙便为后继结点。本函数如下: tbtree *succ(tbtree *p) { btree *q; if (p->rtag==1) return(p->right); /*由后继线索直接得到*/ else { q=p->right; while (q->ltag==0) q=q->left; return(q); } } 以此给出中序遍历二叉树的非递归算法:只要从头结点出发,反复找到结点的后继,直至结束。本函数如下: void thinorder(tbtree) btree *t,*h; /*t:原二叉树的根结点指针,h:中序线索二叉树头结点*/ { if (t!=NULL) { p=h; do { printf("%d ",p->data); p=succ(p); } while (p!=NULL); } } 5.26 将下列森林转化为相应的二叉树,并按中序遍历进行线索化: 题5.26 解:二叉树:Array 线索二叉树: 5.27 画出和题5.23所示各二叉树相应的森林:解: (c) (d) 5.28 对以下存储结构分别写出计算树的深度的算法: ⑴双亲表示法;⑵孩子链表表示法;⑶孩子兄弟表示法。 解:(1) int GetDepth_PTree(PTree T)//求双亲表表示的树T的深度 { maxdep=0; for(i=0;i { dep=0; for(j=i;j>=0;j=T.nodes[j].parent) dep++; //求每一个结点的深度 if(dep>maxdep) maxdep=dep; } return maxdep; }//GetDepth_PTree (2) int GetDepth_CTree(CTree A)//求孩子链表表示的树A的深度 { return SubDepth(A.r); }//GetDepth_CTree int SubDepth(int T)//求子树T的深度 { if(!A.nodes[T].firstchild) return 1; for(sd=1,p=A.nodes[T].firstchild;p;p=p->next) if((d=SubDepth(p->child))>sd) sd=d; return sd+1; }//SubDepth (3) int GetDepth_CSTree(CSTree T)//求孩子兄弟链表表示的树T的深度 { if(!T) return 0; //空树 else { for(maxd=0,p=T->firstchild;p;p=p->nextsib) if((d=GetDepth_CSTree(p))>maxd) maxd=d; //子树的最大深度 return maxd+1; } }//GetDepth_CSTree 5.29 假设一棵二叉树的层序序列为ABCDEFGHIJ和中序序列为DBGEHJACIF。请画出该树。解: 程序代码 Private Sub Command1_Click() End Sub Private Sub Command2_Click() = True End Sub Private Sub Command3_Click() = True End Sub Private Sub Command4_Click() = 10 = False = False End Sub 初始窗口:单机放大之后窗口:单机下划线之后窗口:单击加粗之后窗口: 自测2 单击还原之后窗口: Private Sub Command1_Click() Label1 = "visual basic" Text1 = " 程序设计题" End Sub Private Sub Command2_Click() Text1 = "visual basic" Label1 = " 程序设计题" End Sub 初始窗口:单击显示之后窗口:单击交换之后的窗口:自测题3 Private Sub Command1_Click() End Sub Private Sub Command2_Click() = + 30 End Sub = + 20 = 1 初始窗口: 单击缩小两倍之后的窗口:单击向右下角移动之后的窗口:自测题4 程序代码 Private Sub Command1_Click() = "VB 学习" Print"简单的VB程序设计" End Sub Private Sub Command2_Click() Cls End Sub Private Sub Command3_Click() End End Sub Private Sub Command3_Click() End End Sub 初始化窗口:单击显示之后的窗口:单击清除之后的窗口: 自测题5 单击退出之后的窗口: 习题5及其解答 5.1 选择题 1.有说明 struct point { int x; int y; }p; 正确的赋值语句是( c )。 (a) point.x = 1; point.y = 2; (b) point={ 1, 2 }; (c) p.x = 1; p.y = 2; (d) p = { 1, 2 }; 2.已知有职工情况结构变量emp定义为: struct Date { int year; int month; int day; }; strnct Employee { char name[20] ; long code ; Date birth }; Employee emp ; 下列对emp的birth的正确赋值方法是( d )。 (a) year=1980; month=5; day=1; (b) birth.year=1980; birth.month=5; birth.day=1; (c) emp.year=1980; emp.month=5; emp.day=1; (d) emp.birth.year=1980; emp.birth.month=5; emp.birth.day=1; 3.假定有以下说明语句,则下面引用形式错误的是( b )。 struct Student { int num ; double score ; }; Student stu[3]={{1001,80}, {1002,75}, {1003,91}}, *p=stu ; (a) p->num (b) (p++).num (c) (p++)->num (d) (*p).num 4.若有以下说明语句,则下列错误的引用是( d )。 struct Worker { int no; char name[20]; }; Worker w, *p = &w ; (a) w.no (b) p->no (c) (*p).no (d) *p.no 5.s1和s2是两个结构类型变量,若要赋值s1=s2合法,则它们的说明应该是( c )。 (a) s1只能接受相同类型的数据成员 (b) 结构中的成员相同 (c) 同一结构类型的变量 (d) 存储字节长度一样的变量 1.【考点分析】本题考查对4位整数的排序。考查的知识点主要包括:数组元素的排序算法,if判断语句和逻辑表达式,以及求余算术运算。 【解题思路】此题属于4位数排序问题。本题需主要解决3个问题:问题1如何取4位数的后3位进行比较;问题2如何按照题目要求的条件(按照每个数的后3位的大小进行降序排列,如果后3位相等,则按照原始4位数的大小进行升序排列)排序;问题3如何将排完序的前10个数存到数组bb中去。 本题的解题思路为:使用双循环对数组按条件进行排序,然后将排完序的前10个数存到数组bb中。对于问题1可以通过算术运算的取余运算实现(aa[i]%1000);问题2通过包含if判断语句的起泡排序法就可以实现。 【参考答案】 void jsSort() { int i,j; /*定义循环控制变量*/ int temp; /*定义数据交换时的暂存变量*/ for(i=0;i<199;i++) /*用选择法对数组进行排序*/ for(j=i+1;j<200;j++) { if(aa[i]%1000 第二次(第6周)上机作业 一、用T-SQL语句在E:\DATA\文件夹中创建一个教师信息数据库teacher,该数据库包含:(界面方式也要会) 1、一个主数据文件逻辑名‘teacherdata1 ’, 物理名‘E:\DATA\tdata1.mdf ’, 初始容量1MB,最大容量10MB,每次增长量为15%。 2、一个辅助数据文件逻辑名‘teacherdata2 ’ 物理名‘E:\DATA\tdata2.ndf ’, 初始容量2MB,最大容量15MB,每次增长量为2MB。 3、两个数据文件不单独创建文件组,即使用默认的PRIMARY组; 4、一个事务日志文件逻辑名‘teacherlog’物理名‘E:\DATA\teacherlog.ldf ’,初始容量500KB,最大容量不受限制,每次增长量为500KB。 先确认E:\DATA\文件夹已创建, CREATE DATABASE teacher ON PRIMARY ( NAME = teacherdata1 , FILENAME = 'E:\DATA\tdata1.mdf' , SIZE =5MB , MAXSIZE= 10 , FILEGROWTH = 15% ) , ( NAME = teacherdata2 , FILENAME = 'E:\DATA\tdata2.ndf' , SIZE = 2 , MAXSIZE= 15 , FILEGROWTH = 2MB ) LOG ON /* 创建事务日志文件*/ ( NAME = teacherlog , FILENAME = 'E:\DATA\teacherlog.LDF', SIZE = 500 KB ,/* 初始容量,KB单位不能省略*/ MAXSIZE = UNLIMITED ,/* 日志文件最大容量不受限制*/ FILEGROWTH = 500 KB/* 增长量KB 不能省略*/ ) 二、修改数据库“teacher”,增加两个文件组,文件组名:Gteacher1和Gteacher2。ALTER DATABASE teacher Add filegroup Gteacher1 ALTER DATABASE teacher Add filegroup Gteacher2 三、增加一个辅助数据文件,文件逻辑名teacherdata3,物理名为:E:\data\ teacherdata3.ndf’,初始大小为20MB,最大100MB,增量10MB,归属于文件组“Gteacher1”。 Alter database teacher Add file 数据库及应用复习题 一、设计题 有一个[学生课程]数据库,数据库中包括三个表: 学生表Student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个属性组成,记为: Student(Sno,Sname,Ssex,Sage,Sdept) ,Sno 为关键字。 课程表Course由课程号(Cno)、课程名(Cname)、先修课号(Cpno)、学分(Ccredit)四个属性组成,记为:Course(Cno,Cname,Cpno,Ccredit) Cno为关键字。 成绩表SG由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成,记为:SG(Sno,Cno,Grade) (SNO, CNO)为关键字。 用SQL语言实现下列功能: 1.建立学生表Student,其中学号属性不能为空,并且其值是唯一的。 2.向Student表增加“入学时间(Scome)”列,其数据类型为日期型。 3.查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。4.查询学习1号课程的学生最高分数、平均成绩。 5.查询与“李洋”在同一个系学习的学生。 6.将计算机系全体学生的成绩置零。 7.删除学号为05019的学生记录。 8.删除计算机系所有学生的成绩记录。 1. CREATETABLE Student (Sno CHAR(5) NOT NULL UNIQUE, Sname CHAR(20), Ssex CHAR(2), Sage INT, Sdept CHAR(15)) 2. ALTER TABLE Student ADD Scome DATETIME 3. SELECT Sno, Grade FROM SG WHERE Cno='3' ORDER BY Grade DESC 4. SELECT MAX(Grade), AVG(Grade) FROM SC WHERE Cno='1' 5. SELECT Sno, Sname, Sdept FROM Student WHERE Sdept IN 习题二 ⒉1描述以下四个概念的区别:头指针变量,头指针,头结点,首结点(第一个结点)。解:头指针变量和头指针是指向链表中第一个结点(头结点或首结点)的指针;在首结点之前附设一个结点称为头结点;首结点是指链表中存储线性表中第一个数据元素的结点。若单链表中附设头结点,则不管线性表是否为空,头指针均不为空,否则表示空表的链表的头指针为空。 2.2简述线性表的两种存储结构有哪些主要优缺点及各自使用的场合。 解:顺序存储是按索引直接存储数据元素,方便灵活,效率高,但插入、删除操作将引起元素移动,降低了效率;而链式存储的元素存储采用动态分配,利用率高,但须增设表示结点之间有序关系的指针域,存取数据元素不如顺序存储方便,但结点的插入和删除十分简单。顺序存储适用于线性表中元素数量基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素的情况;而链式存储适用于频繁进行元素动态插入或删除操作的场合。 2.3 在头结点为h的单链表中,把值为b的结点s插入到值为a的结点之前,若不存在a,就把结点s插入到表尾。 Void insert(Lnode *h,int a,int b) {Lnode *p,*q,*s; s=(Lnode*)malloc(sizeof(Lnode)); s->data=b; p=h->next; while(p->data!=a&&p->next!=NULL) {q=p; p=p->next; } if (p->data==a) {q->next=s; s->next=p;} else {p->next=s; s->next=NULL; } } 2.4 设计一个算法将一个带头结点的单链表A分解成两个带头结点的单链表A和B,使A中含有原链表中序号为奇数的元素,而B中含有原链表中序号为偶数的元素,并且保持元素原有的相对顺序。 Lnode *cf(Lnode *ha) {Lnode *p,*q,*s,*hb; int t; p=ha->next; q=ha; t=0; hb=(Lnode*)malloc(sizeof(Lnode)); s=hb; while(p->next!=NULL) {if (t==0) {q=p;p=p->next;t=1;} else {q->next=p->next; p->next=s->next; s->next=p; s=p; p=p->next; t=0; } } s->next=NULL; return (hb); } 数据库期中上机考试题 1、在E:\学教管理系统\的路径下建立“学教管理”数据库 2、从服务器jsj上的“jxgl1“库中导入数据到“学教管理”数据库中。 3、在‘学教管理’数据库中增加两个数据表Scholarship-class (奖学金等级,平均最低成绩,金额),Scholarship(学号,奖学金等级,获奖时间),并建立相应的主码、外码和关联。 4、创建“学教管理”数据库中表之间的关系。 5、根据“学教管理”数据库中的基本数据表,进行下列各操作 1)修改Grade表,添加主码、外部码及关联,以及成绩限制在0~100之间。 2)在课程表中增加一个‘先修课号’属性,用于指定在学本课之前必须先修的课程,如果为空,则表示该课没有要求的先修课程。 3)向Student表中录入一条新记录(2005061,赵五,男) 4)分别向Class和grade表中录入一些2009信管管理、2009工商管理、2009旅游管理、2009数理经济四个班级的信息,以及四个班级的一些同学的选课信息。。 5)将李勇的计算机网络成绩置空。 6)找出所有被学生选修了的课程号。 7)查询01311班女同学的个人信息。 8)查询没有选修1号课程的学生姓名与班级号,并按班级号分组和排序。 9)查询姓李的学生的所有信息。 10)查询2009信息管理专业学生的数据库成绩 11)求选修了所有课程的学生学号和姓名。 12)求选修了数据库课程的学生人数。 13)列出每门课程的选修人数。 14)查询选修了3门课以上的学生学号和姓名 15)查询学生张婷婷选修的课程号、课程名和成绩 16)找出2009数理经济班所学数据库的平均分、最高分、最低分 17)找出与李勇在同一班级的学生基本情况信息 18)找出年龄介于李勇的年龄和25之间的学生信息 19)TOM已退学,从数据库删除有关他的相应记录。 题目: 现有一个商店的数据库,记录顾客及其购物情况,由下面三个表组成:商品(商品号,商品名,单价,商品类别,供应商); 顾客(顾客号,姓名,住址); 购买(顾客号,商品号,购买数量); 试用SQL语言完成下列功能: 1 建表,在定义中要求声明: (1)每个表的主外码; (2)顾客的姓名和商品名不能为空值; (3)单价必须大于0,购买数量必须再0到20之间; 2 往表中插入数据: 商品(M01,佳洁士,8.00,牙膏,宝洁; M02,高露洁,6.50,牙膏,高露洁; M03,洁诺,5.00,牙膏,联合利华; M04,舒肤佳,3.00,香皂,宝洁; M05,夏士莲,5.00,香皂,联合利华; M06,雕牌,2.50,洗衣粉,纳爱斯 M07,中华,3.50,牙膏,联合利华; M08,汰渍,3.00,洗衣粉,宝洁; M09,碧浪,4.00,洗衣粉,宝洁;) 顾客(C01,Dennis,海淀; C02,John,朝阳; C03,Tom,东城; C04,Jenny,东城; C05,Rick,西城;) 购买 (C01,M01,3;C01,M05,2; C01,M08,2;C02,M02,5; C02,M06,4;C03,M01,1; C03,M05,1;C03,M06,3; C03,M08,1;C04,M03,7; C04,M04,3;C05,M06,2; C05,M07,8;) 商品有9 条,顾客有5条, 购买有5条 3 用SQL语句完成下列查询: (1)求购买了供应商"宝洁"产品的所有顾客; (2)求购买的商品包括了顾客"Dennis"所购买商品的顾客(姓名);(3)求牙膏卖出数量最多的供应商。 4 将所有的牙膏商品单价增加10%。 5 删除从未被购买的商品记录。 参考答案: create table product ( productno char(10) not null, productname char(15) not null, price float(15), sort char(10), supplier char(20), primary key (productno), check (price > 0) ) create table customer ( customerno char(10) not null, customername char(15) not null, address char(10), primary key (customerno) ) create table buy ( customerno char(10) not null, productno char(10) not null, num smallint, primary key (customerno,productno), foreign key (customerno) references customer (customerno), foreign key (productno) references product (productno), check (num between 0 and 20) ) 基本操作题: (一)(2)主键:职工ID (3)有效性规则:IS NOT NULL (5)输入掩码:00000 (二)(2)主键:编号(3)有效性规则:<=DateSerial(Year(Date())-1,5,1) (4)“邮箱密码”字段的输入掩码:PassWord 或密码; “联系电话”字段的输入掩码:“010-”00000000。 (三)(2)主键:编号(3)默认值:Date()-1 (4)“单价”字段的小数位数设为2,同时设置该字段的“格式”为“固定”或“标准” (5)输入掩码:AAAAAAAA (四)(2)打开表的“属性”窗口: ①在有效性规则行中输入:[学时]=[学分] ②在有效性文本行中输入:学时必须与学分相同 (3)默认值:DateSerial(Year(Date()),9,1) (5)将文本文件“Test.TXT”导入到表“tTemp”中时,应在“导入文本向导”的第二步中选中“第一行包含字段名称”复选框,否则会出现导入错误。 (7)将宏mTest改名为AutoExec。 (五)(1)有效性规则:>0 (6)在“链接数据表向导”中的第一步中选“Sheet1”工作表,在第二步中选中“第一行包含列标题”复选框,在第三步中输入链接表名“tTest”,点击“完成”。 (7)选中“线路”表并右击,在打开的快捷菜单中选“导出…”,打开相应的导出对话框;在该对话框的“保存类型”中选“文本文件”、在“文件名”中输入“Line.TXT”,点击“导出”按钮;在“导出文本向导”的第二步中分别选中“第一行包含字段名称”复选框和“请选择字段分隔符”下的“分号”选项按钮,其它按提示操作。 简单应用题: (一)samp14.mdb (1)【操作步骤】 步骤1:选中"查询"对象,单击"新建"按钮,选中"设计视图",单击"确定"按钮。在"显示表"对话框中分别双击表"tA"、"tB",关闭"显示表"对话框。 步骤2:分别双击"姓名"、"房间号"、"电话"和"入住日期"字段将其添加到"字段"行。 步骤3:单击工具栏中"保存"按钮,另存为"qT1"。关闭设计视图。 (2)【操作步骤】 步骤1:选中"查询"对象,单击"新建"按钮,选中"设计视图",单击"确定"按钮。在"显示表"对话框中分别双击表"tA"、"tB",关闭"显示表"对话框。 步骤2:分别双击"姓名"、"房间号"字段将其添加到"字段"行。在"姓名"字段的"条件"行输入"[请输入姓名:]"。 步骤3: 在"字段"行下一列输入"已住天数:Date()-[入住日期]"。 步骤4:在"字段"行下一列输入"应交金额:(Date()-[入住日期])*[价格]"。 步骤5:单击工具栏中"保存"按钮,另存为"qT2"。关闭设计视图。 (3)【操作步骤】 步骤1:选中"查询"对象,单击"新建"按钮,选中"设计视图",单击"确定"按钮。在"显示表"对话框中分别双击表"tA"、"tB",关闭"显示表"对话框。 步骤2:分别双击"姓名"、"入住日期"、"价格"和"身份证"字段添加到"字段"行。 步骤3:在"身份证"字段的"条件"行输入"Mid([身份证],4,3)=102",单击"显示"行取消该字段显示。 试用SQL的查询语句表达下列查询: 1.检索王丽同学所学课程的课程号和课程名。 select Cno ,Cname from c where Cno in (select cno from sc where sno in (select sno from s where sname='王丽' )) 2.检索年龄大于23岁的男学生的学号和姓名。 select sno,sname from s where sex='男' and age>23 3.检索‘c01’课程中一门课程的女学生姓名 select sname from s where sex='女' and sno in (select sno from sc where cno='c01') 4.检索s01同学不学的课程的课程号。 select cno from c where cno not in (select cno from sc where sno ='s01') 5.检索至少选修两门课程的学生学号。 select sc.sno from s,sc where s.sno=sc.sno group by sc.sno having count(https://www.wendangku.net/doc/674349761.html,o)>=2 6.每个学生选修的课程门数。 解法一: select so.sno sno,https://www.wendangku.net/doc/674349761.html,ount,s.sname from(select sc.sno sno,count(sc.sno) ccount from sc,s where s.sno=sc.sno group by sc.sno ) so,s where s.sno=so.sno 解法二: select sc.sno sno,s.sname,count(sc.sno) ccount from sc,s where s.sno=sc.sno group by sc.sno,sname 1.(10分)从键盘任意输入一个整数,编程判断它的奇偶性。 **输入格式要求:"%d" 提示信息:"Input an integer number:" **输出格式要求:"a is an even number\n" "a is an odd number\n" 程序运行示例1如下: Input an integer number:2 a is an even number 程序运行示例2如下: Input an integer number:5 a is an odd number #include 数据库上机1 1、新建工厂数据库factory。 create database factory on( name=factory_data, filename='d:\factory.mdf') log on(name=factory_log, filename='d:\factory.ldf') 2、数据库factory包括职工表worker、部门表depart和职工工资表salary。用SQL语句建立这三个表并输入数据,其表结构及用例数据分别如下: 职工表结构为: 职工号:int; 姓名:char(8) ; 性别:char(2) ; 出生日期:datetime; 党员否:char(2) ; 参加工作:datetime; 部门号:int; 其中职工号为主码。 部门表结构为: 部门号:int; 部门名:char(10); 其中部门号为主码。 职工工资表结构为: 职工号:int; 日期:datetime; 工资:decimal(6,1) ; 其中职工号和日期为主码。 create table worker ( 职工号int primary key, 姓名char(8) , 性别char(2), 出生日期datetime, 党员否char(2), 参加工作datetime, 部门号int ) create table depart ( 部门号int primary key, 部门名char(10) ) create table salary ( 职工号int, 日期datetime, 工资decimal(6,1), Primary key(职工号,日期) ) 3. 显示部门的详细信息。 select * from depart 4.查询3号职工的工资单。 select * from salary where职工号=3 5.显示所有职工的姓名及年龄,并按姓名升序显示。 select 姓名, 2015-year(出生日期) '年龄' from worker order by姓名6. 求出各部门的部门号及党员人数。 select 部门号,count(党员否) '党员人数' from worker where 党员否='是' group by 部门号 7. 在worker表的“姓名”列创建唯一索引nameindex。 create unique index nameindex on worker (姓名) 数据库上机2 1. 查询12月份过生日的名单。 答:select 姓名from worker where month(出生日期)= 12 2. 查询所有姓刘的职工信息。 select * from worker where 姓名like ‘刘%’ 3. 显示所有职工的职工号和2011年2月份的工资数。 select 职工号,工资from salary where year(日期)=2011 and month(日期)=2 4. 查询1号部门所有职工的姓名和工资,并按工资降序排列。 VB上机考试 1、利用随机函数产生25个100到999之间的整数,构成5 5的矩阵,输出该矩阵。Dim a(1 To 5, 1 To 5) Private Sub Form_Click() Ran domize For i = 1 To 5 Forj = 1 To 5 a(i, j) = Int(Rnd * (999 - 100 + 1) + 100) Print a(i, j); Next j Print Next i End Sub 2、利用随机函数产生25个10到99之间的整数,求其平均值(要求保留3位小数,第4 位四舍五入)。Private Sub Form_Click() For i = 1 To 25 a = In t(R nd * (99 - 10 + 1) + 10) Print a; s = s + a Next i Print Avg = s / 25 Print Avg End Sub 3、在窗体上按下鼠标的右键,记录其坐标。 Private Sub Form_Load() Label1.BorderStyle = 1 Label1.Alig nment = 2 End Sub Private Sub Form_MouseDow n(Button As In teger, Shift As In teger, X As Si ngle, Y As Si ngle) If Butt on = 2 The n Label1.C apti on = X & "," & Y End If End Sub 4、利用随机函数产生25个10到99之间的整数,按从小到大的顺序显示。Dim a(1 上机时间7-18周周四上午3、4节 实验第一部分数据库操作 一:熟悉ACCESS环境(不用提交) 下面的实验要在七周内完成 实验1 建立学生、课程及成绩表,录入部分数据,并设计验证实体、参照及用户自定义完整性。 实验第二部分SQL语句VB数据库访问技术 二:SQL语句及VB数据库访问技术(要提交) 下面的SQL语句要求在“学生成绩管理”数据库进行测试。 下面的实验要在八至十二周内完成,要求提交纸质实验报告,实验报告包括:实验题目、SQL语句及查询结果的截图(查询的名称为自己的学号加姓名)。 【实验2_1】查询学生基本信息表中的所有信息。 SQL语句如下: 【实验2_2】在学生基本信息表中查询学生的学号、姓名、性别和族别信息。 SQL语句如下: 【实验2_3】从学生基本信息表中查询学生由哪些民族构成。 学生的族别有多行重复,要快速查询学生的民族构成,实际上就是对相同值的族别只需要显示一行,可使用DISTINCT关键字实现。 【实验2_4】从成绩表中查询学生成绩。 SQL语句如下: 【实验2_5】从相关表中查询每一位学生的学号、姓名、课程名称、成绩。 【实验2_6】在课程信息表中查找“Delphi程序设计”课程的任课老师。 【实验2_7】查询少数民族学生的基本情况。 【实验2_8】检索1985年1月1日以后出生的女生基本信息。 【实验2_9】查询每位同学的课程门数、总成绩、平均成绩。 【实验2_10】从学生基本信息表中统计各民族学生人数。 【实验2_11】从学生基本信息表中统计汉族学生的人数。 【实验2_12】显示平均成绩大于等于80分以上的学生情况。 【实验2_13】查询学生成绩并将显示的结果按成绩升序排序。 SQL语句如下: 【实验2_14】查询1985年出生的学生基本信息。 【实验2_15】查询不及格学生成绩信息。 查询不及格学生成绩信息,也就是查询0—59之间的学生成绩,可用BETWEEN关键字表示为:WHERE 成绩BETWEEN 0 AND 59。 【实验2_16】查询课程编号为002、003、007的课程编号、课程名称、任课教师和上课时间。 【实验2_17】检索所有姓刘的学生基本信息。 【实验2_18】检索包含“技术”两字的课程信息。 【实验2_19】查询第2 个字为“丽”的学生信息。 【实验2_20】查询课程信息表中教师未定的课程信息。 【实验2_21】统计成绩表中各门课程的学生人数、总成绩、平均成绩。 【实验2_22】检索单科成绩高于全班平均分的学生成绩信息。 【实验2_23】使用左外连接检索学生成绩信息(学号,姓名,课程名称)。 【实验2_24】使用右外连接检索学生成绩信息(学号,姓名,课程名称)。 【实验2_25】查找同名同姓的学生信息。 【实验2_26】在VB中设计针对“课程信息表”的基本编辑窗体,需要附运行界面及源程序代码。 实验第三部分数据库应用系统开发 数据库应用系统开发作为本课程课程设计考查内容,需要在18周之前提交纸质课程设计报告(主要是系统开发侧重于实施环节的报告)及数据库应用系统。系统开发可以两人(不能超过两人)一组,系统名称可自行拟定。 数据库上机实验内容及要求(第二部分) 1.建立工厂管理数据库 工厂(包括厂名和厂长名)需要建立一个管理数据库存储以下信息: (1)一个厂内有多个车间,每个车间有车间号、车间主任姓名、地址和联系电话; (2)一个车间有多个工人,每个工人有职工号、姓名、年龄、性别和工种; (3)一个车间生产多种产品,产品有产品号和价格;每种产品只能由一个车间生产; (4)一个车间制造多种零件,一种零件也可能为多个车间制造。零件有零件号、重量和价格; (5)一种产品可由多种零件组成,一种零件也可以装配出多种产品; (6)产品和零件均存入仓库; (7)厂内有多个仓库,仓库有仓库号、仓库主任姓名和电话。 根据以上需求分析结果,按照下述要求,设计并建立工厂管理数据库。 ◆分析实体及联系,设计E-R图。 ◆将E-R图转换成关系模式,并规范化到3NF。 ◆在Microsoft SQL Server2000中基于“企业管理器”建立数据库及相关对象(主 码,外码,索引,约束等)。 ◆测试数据入库 2.基于“查询分析器”,完成并保存下述题目的SQL脚本 (1)建立“工种”是“钳工”的所有职工详细信息的视图; create view View_工人_钳工 as select* from职工表 where工种='钳工' with check option (2)建立“车间号”是“CJ01”的钳工详细信息的视图; create view View_钳工_CJ01 as select* from View_工人_钳工 where车间号='CJ01' (3)建立使用了“零件号”是“LJ0002”的所有产品详细信息的视图; create view View_产品_零件LJ0002 as select产品表.产品号,价格,车间号,仓库号 from装配表,产品表 where装配表.产品号=产品表.产品号and零件号='LJ0002'(4)对零件表按照“零件号”建立唯一索引; create unique index Index_U_零件号on零件表(零件号) (5)对职工表按照“性别”建立聚簇索引; create clustered index Index_C_性别on职工表(性别) (6)查询使用了“零件号”是“LJ0002”的产品的生产车间号; 习题九 9.1 以下代码中递归函数f 所产生的数值序列是什么? long f (int n) { if (n= =0 | | n= =1) return 1; else return 3*f(n-2)+2*f(n-1); } 解:返回值为: 6 4 5 2 3 3 4 0 1 1 2 1 2 2 3 9.2 n 个元素的数组的最大元素可以用递归计算出来。定义函数 int max(int x ,int y); 它返回x 和y 两个整数中的较大值。试用递归方法编写函数 int arraymax(int a[ ],int n); 它使用递归返回数组a 的最大元素值 终止条件:n= =1 递归步骤:arraymax=max(max(a[0],…,a[n -2]),a[n-1]) 解: int arraymax(int a[ ],int n) { int t; if(n==1) return a[n]; else { if(a[n]>a[n+1]) { t=a[n]; a[n]=a[n+1]; a[n+1]=t; } return arraymax(int a[ ],int n+1); } } 9.3 试写出求递归函数F(n)的递归算法,并消除递归: F(n)=???>?=+0 )2/(01n n F n n n 解: int merge(int n) { if(n==0) return(n+1); if(n>0) return(n*merge(n/2)); } 9.4 试编写如下定义的递归函数的递归算法,并根据算法画出求g(5,2)时栈的变化过程。 ???≥>-≥==0,0)21(000)(n m n n m g n m n m g +, ,, 解: int merge(int m,int n) { if(m==0&&n>=0) return(0); if(m>0&&n>=0) return(merge(m-1,2*n)+n); } 9.5 试将下列递归过程改写为非递归过程。 void test (int &num) { int x ; scanf(x); if (x=0) sum=0; else {test(sum);sum+=x ;} printf(sum); } 解: 非递归算法 void test(int num) { int x; sum=0; scanf(“%d ”,&x); if(x==0) sum=0; while(x>0) { sum+=x; scanf(“%d ”,&x); } printf(“sum=%d\n ”,sum); } 1下列说法中正确的是:( D ) A 、 SQL 中局部变量可以不声明就使用 B 、 SQL 中全局变量必须先声明再使用 C 、 SQL 中所有变量都必须先声明后使用 D 、 SQL 中只有局部变量先声明后使用;全局变量是由系统提供的用户不能自己建立。 2.哪个关键字用于测试跟随的子查询中的行是否存在( B )。 A.MOV B.EXISTS C.UNION D.HAVING 3 .下列哪些语句用于创建存储过程( A )? A、CREATE PROCEDURE B、CREATE TABLE C、DROP PROCEDURE D、其他 5.在SQL中,SELECT语句的“SELECT DISTINCT”表示查询结果中 ( C )。 A.属性名都不相同 B.去掉了重复的列 C.行都不相同 D.属性值都不相同 语言集数据查询、数据操作、数据定义和数据控制功能于一体,语句INSERT、DELETE、UPDATA实现下列哪类功___A_____。 A. 数据查询 B. 数据操纵 C. 数据定义 D. 数据控制 Server 2000 采用的身份验证模式有( D )。 (A)仅Windows身份验证模式 (B)仅SQL Server身份验证模式 (C)仅混合模式 (D)Windows身份验证模式和混合模式 Server 2000 企业版可以安装在操作系统上。( C ) (A)Microsoft Windows 98 (B)Microsoft Windows 2000 Professional (C)Microsoft Windows 2000 Server (D)Microsoft Windows XP Server是一个( C )的数据库系统。 (A)网状型(B)层次型 (C)关系型(D)以上都不是 语言中,删除一个视图的命令是( B )。 A. DELETE B. DROP C. CLEAR D. REMOVE 语言中,删除记录的命令是( A )。 习题1 请根据给出的数据库表结构来回答相应问题: DEPT (DEPTNO INT, DNAME VARCHAR(14),LOC VARCHAR(13)); EMP (EMPNO INT,ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT, HIREDATE DATE, SAL FLOAT, COMM FLOAT, DEPTNO INT); BONUS (ENAME VARCHAR(10), JOB VARCHAR(9), SAL INT, COMM INT); SALGRADE ( GRADE INT, LOSAL INT, HISAL INT); 其中表中包含如下数据: DEPT表: EMP表: SALGRADE表: BONUS表: 无数据 根据上面描述完成下面问题: (注意:注意保存脚本,尤其是DDL和DML,以便进行数据还原) DDL 1. 写出上述表的建表语句。此外,在DEPT上创 建名为”PK_DEPT”的主键约束,在EMP表上 创建名为”PK_EMP”的主键约束以及指向表 DEPT的外键约束”FK_DEPTNO”。 命令: Create table DEPT (DEPTNO INT NOT NULL,DNAME VARCHAR(14),LOC VARCHAR(13)); Alter table DEPT add constraint PK_DEPT PRIMARY KEY (DEPTNO); create table EMP(EMPNO INT NOT NULL,ENAME VARCHAR(10),JOB VARCHAR(9),MGR INT,HIREDATE DATE, SAL FLOAT,COMM FLOAT,DEPTNO INT); alter table EMP add constraint PK_EMP PRIMARY KEY (EMPNO); alter table EMP add constraint FK_DEPTNO foreign key(DEPTNO) references DEPT(DEPTNO);VB程序设计教程实验指导与习题解答上机答案
习题5及其解答
全国计算机三级数据库技术上机试题100道
SQL第6周数据库上机作业答案
数据库上机习题及答案
习题二和上机答案
《数据库》上机练习题
北大数据库原理上机考题练习及参考答案 练习二(商品、顾客、购买)
Access上机操作练习题参考答案
数据库上机实验题目和答案
上机练习题参考答案
数据库上机答案
VB上机考试习题以及答案
数据库上机题目
数据库上机实验(有答案)
习题九和上机答案
数据库上机考试试题及答案
数据库sql查询语句上机练习1_习题_结果(单世民)