目录
一、选择题
二、编程题
2.1计算日期到天数转换
2.2幸运的袋子
一、选择题
1.定义学生、教师和课程的关系模式 S (S#,Sn,Sd,Dc,SA )(其属性分别为学号、姓名、所在系、所在系的系主任、年龄); C ( C#,Cn,P# )(其属性分别为课程号、课程 名、先修课); SC ( S#,C#,G) (其属性分别为学号、课程号和成绩),则该关系为( )
A. 第二范式
B. 第一范式
C. 第三范式
D. BCNF范式
范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式。目前关系数据库有六种范式:第一范式( 1NF )、第二范式( 2NF )、第三范式( 3NF )、 Boyce-Codd 范式( BCNF )、第四范式( 4NF )和第五范式( 5NF )。
满足最低要求的范式是第一范式( 1NF )。在第一范式的基础上进一步满足更多要求的称为第二范式( 2NF ),其余范式以次类推。一般说来,数据库只需满足第三范式( 3NF )就行了。
第一范式:主属性(主键)不为空且不重复,字段不可再分(存在非主属性对主属性的部分依赖)。 第二范式:如果关系模式是第一范式,每个非主属性都没有对主键的部分依赖。 第三范式:如果关系模式是第二范式,没有非主属性对主键的传递依赖和部分依赖。 BCNF 范式:所有属性都不传递依赖于关系的任何候选键。
题目中关系模式满足第二范式,但在关系模式 S 中,学生所在系依赖于学号( S# → Sd ),但系本身确定了系主任( Sd → Dc ),存在传递依赖,不满足第三范式。
所以正确答案是 A
2.下面不属于数据库系统特点的是( )
A. 数据冗余度高
B. 数据具有完整性
C. 数据共享性好
D. 数据独立性高
数据库系统的特点是:数据结构化、数据的共享性高,冗余度低,易扩充、数据独立性高、数据由DBMS统一管理和控制。
所以正确答案是 A
3.将实体-联系模型转换为关系模型时,实体之间多对多联系在关系模型中的实现方式是( )
A. 建立新的关系
B. 建立新的属性
C. 增加新的关键字
D. 建立新的实体
将实体-联系模型转换为关系模型时,实体之间多对多联系在关系模型中的实现方式是建立新的关系。
所以正确答案是 A
4.关于求和函数,以下说法正确的是()
A.sum返回表达式中所有数的总和,因此只能用于数字类型的列
B. Avg返回表达式中所有数的平均值,可以用于数字型和日期型的列
C. Max和Min可以用于字符型的列
D. Count可以用于字符型的列
sum函数所处理的字段类型必须是数值型的,不能是其他数据类型的,比如字符或日期。
avg这个是数值函数 , 不能用于日期。
所以正确答案是 A
5.有三个关系 R 、 S 和 T 如下:则由关系 R 和 S 得到关系 T 的操作是( )。
A. 自然连接
B. 交
C. 除
D. 并
如果 S = T/R ,则 S 称为 T 除以 R 的商。在除运算中 S 的域由 T 中那些不出现在 R 中的域所组成,对于 S 中的任一有序组,由它与关系 R 中每个有序组所构成 的有序组均出现在关系 T 中。
所以正确答案是 C
6.设有表示学生选课的三张表,学生S(学号,姓名,性别,年龄,身份证号),课程C(课号,课名),选课SC(学号,课号,成绩),则表SC的关键字(键或码)为( )。
A. 课号,成绩
B. 学号,成绩
C. 学号,课号
D. 学号,姓名,成绩
在表SC中有学生表中的学号,还有课程表中的课号,所以这两者是SC中的外键。
所以正确答案是 C
7.关系数据库所采用的数据存放形式是()
A. 二维表
B. 链表
C. 网状
D. 二叉树
关系数据库所采用的数据存放形式是二维表。
所以正确答案是 A
8.某关系表有:员工(部门编号,部门名称,员工编号,姓名,性别,年龄),则其主码为()。
A. 部门编号、员工编号
B. 员工编号
C. 姓名
D. 部门编号
员工信息表中的主码就是员工的编号,每个人都是不同的,用于区分每个员工。
所以正确答案是 A
9.在使用 limit 子句时,如果没有足够的行,则:
A. MySQL会报错
B. MySQL将只返回它能返回的那么多行
C. MySQL将不会返回任何行
在使用 limit 子句时,如果没有足够的行,则MySQL将只返回它能返回的那么多行
所以正确答案是 B
10.不属于SQL语句的是()
A. SELECT
B. CANCEL
C. UPDATE
D. ALTER
SELECT、UPDATE、ALTER都是sql语句,第一个是查询中的关键字,第二个是更新表中信息的关键字,第三个是修改表
所以正确答案是 A
二、编程题
2.1计算日期到天数转换
根据输入的日期,计算是这一年的第几天。 保证年份为4位数且日期合法
设置一个year方法来判断年份是否是闰年判断条件就是y%400==0||y%4==0&&y%100!=0
然后再创建一个mouth方法,按照对应的月份返回对应的天数,要考虑是否是闰年的二月,然后将他们都相加再加上一开始输入的天即可。
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int y = sc.nextInt();
int m = sc.nextInt();
int d = sc.nextInt();
int sum = d;
boolean x = year(y);
for (int i = 1; i < m; i++) {
sum+=mouth(i,x);
}
System.out.println(sum);
}
public static boolean year(int y){
if(y%400==0||y%4==0&&y%100!=0){
return true;
}
return false;
}
public static int mouth(int m,boolean x){
if(m==1){
return 31;
}else if(m==2&&x){
return 29;
}else if(m==2&&!x){
return 28;
}else if(m==3){
return 31;
}else if(m==4){
return 30;
}else if(m==5){
return 31;
}else if(m==6){
return 30;
}else if(m==7){
return 31;
}else if(m==8){
return 31;
}else if(m==9){
return 30;
}else if(m==10){
return 31;
}else{
return 30;
}
}
}
2.2幸运的袋子
一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。 例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3 你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。
首先对数组进行排序,然后遍历数组,使用递归。当一个袋子号码无法和前面的袋子号码达到要求的时候,后面的袋子号码自然也不会达到要求,直接break。因为号码已经排序了,越往后数值越大,乘积自然也越大。
当递归返回的时候,需要回溯,继续计算前面的号码和当前位置后面的号码是否是幸运的。
然后要考虑特殊情况,即号码为1。
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] num = new int[n];
for (int i = 0; i < n; i++) {
num[i] = sc.nextInt();
}
Arrays.sort(num);
System.out.println(lucky(num,0,0,1));
}
public static int lucky(int[] arr,int index,long sum,int tmp){
int count = 0;
for (int i = index; i < arr.length; i++) {
sum +=arr[i];
tmp *=arr[i];
if(sum>tmp){
count+=1 + lucky(arr,i+1,sum,tmp);
}else if(arr[i]==1){
count +=lucky(arr,i+1,sum,tmp);
}else{
break;
}
sum-=arr[i];
tmp/=arr[i];
while(i<arr.length-1&&arr[i]==arr[i+1] ){
i++;
}
}
return count;
}
}