第二部分 专业主观题1. 学校有多名学生,财务处每年要收一次学费。为财务处的收学费工作设计一个数据库,包括两个关系:学生(学号,姓名,专业,入学日期)和收费(学年,学号,学费,书费,总金额)。假设规定属性的类型:学费、书费、总金额为数值型数据;学号、姓名、学年、专业为字符型数据;入学日期为日期型数据。列的宽度自定义。
要求:试用SQL语句定义上述表的结构(定义中应包括主键子句和外键子句)。
CREATE TABLE学生
(学号CHAR(8),
姓名CHAR(8),
专业CHAR(13),
入学日期DATE, PRIMARY KEY(学号));
CREATE TABLE收费
(学年CHAR(10),
学号CHAR(8),
学费NUMERIC(4),
书费NUMERIC(5,2),
总金额NUMERIC(7,2),
PRIMARY KEY(学年,学号),
FOREIGN KEY(学号)REFERENCES学生(学号)),
2. 设有一个长度为s的字符串,其字符顺序存放在一个一维数组的第1至第s个单元中(每个单元存放一个字符)。
要求:从此字符串的第m个字符以后删除长度为t的子串,m<s,t<(s-m),并将删除后的结果复制在该数组的第s单元以后的单元中,试设计此删除算法。
算法描述为:
int delete(r,s,t,m)//从字符串的第m个字符以后删除长度为t的子串
{
char r[];
int s,t,m;
int i,j;
for(i=1;i<=m;i++)
r[s+i]=r[i];
for(j=m+t-i;j<=s;j++)
r[s-t+j]=r[j];
return(1);
}
某商业集团,需要对集团下的商店、商店负责人、商品等进行管理,设计的数据库中有一个关系模式R为:
R(商店编号、商品编号、库存数量、部分编号、负责人)
如果规定:(1)每个商店的每种商品只在一个部门销售
(2)每个商店的每个部门只有一个负责人
(3)每个商店的每种商品只有一个库存数量
要求:3. 根据上述规定,写出关系模式R的基本函数依据。
在关系R中,没有重复列,因此符合1NF;根据规定可知,库存数量、部分编号、负责人依赖于商店编号与商品编号。即(商店编号,商品编号)→(库存数量,部门编号,负责人)。
5. 试问关系模式R最高是第几范式?为什么?
关系模式R最高是2NF。由于部门编号和负责人还依赖于候选码,而在3NF中,若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码。显然关系R还达不到3NF要求。
6. 请解释IP地址和域名的含义,并简述它们之间的关系以及如何建立这种关系。
IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。如“202.101.139.188”的形式。
域名(DomainName),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。任何一个域名都对应一个或者多个IP地址,大部分都是一个域名对应一个IP地址,由于IP地址不好记录,所以人们为了更好的找到一个网站,想出了给IP地址起个别名,就是域名,但是一个IP上可以有上千甚至上万个域名。如“www.it.tom.cn”的形式。
互联网访问的方式是:输入域名——域名解析服务器(DNS)解析域名成IP地址——访问IP地址——根据绑定域名找到目录——达到访问目的地。域名虽然便于记忆,但机器之间只能识别IP地址,它们之间的关系便称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。具体来说,当我们在地址栏中输入“www.it.com.cn”的域名之后,计算机会向DNS服务器查询该域名所对应有IP地址,然后计算机就可以调出那个IP地址所对应的网页,并将网页在我们的浏览器上显示。
7. 找出课程平均分60分以上(包括60)的学生,并输出这些学生的信息,请写出C语言程序中的代码。
#include<stdio.h>
#include<malloe.h>
#define M3/*学生人数*/
#define N3/*课程数目*/
struct student
{
long studentnum;/*学号*/
char name[20];/*学生的姓名*/
float score{N];/*课程的分数*/
struet student *next;
}
/* 创建链表 */
structstudent*createlink(int n)
{
struct student*head=NULL,*p1,*p2;
int i,j;
for(i=1;i<=N;i++)
{
p1=(structstudent*)malloc(size of(struct student));
printf("请输入第%d个学生的学号、姓名及各门课考试成绩:\n",i);
scanf("%d%s",&p1->studentnum, p1->name);
for(j=0;j<N;j++)
scanf("%f", &p1->score{j]);
p1->next=NULL;
if head==NULL
head=p1;
else
p2->next=p1;
p2=p1;
}
Return head;
}
void main()
{
struct student*head=NULL;
int i;
float sum,aver;
struct student*P
p=head;
while(p!=NULL)
{
sum=0;
for(i=0;i<N;i++)
sum+=p->score[i];
aver=surn/N;
if aver>=60
{
printf("学号:%d姓名:%s",p->studentnum,P->name);
for(i=0;i<N;i++)
printff("%f",p->score[i]);
printf("\n");
}
}
}
8. 写出一段C语言程序代码,程序的功能是输入学生的姓名和成绩,然后输出。
#include<studio.h>
struct stu
{
char name[20];/*学生姓名*/
int score;/*学生戍绩*/
}
stu,*p;
main()
{
p=&stu;
printf("Enter name;");
gets(stu.name);
printtf("Enter score:");
scanf("%d", &stu.score);
printf("Output:%s,%d/n",p->name,p->score);
}