第一部分:高级语言程序设计基础(共100分)
一、单项选择题(每题2分,共20分)
若有以下定义:
int a=5, b=6, c=7;
则表达式 (a < b) ? (b < c ? b : c) : (a < c ? a : c) 的值是( )
A. 5 B. 6 C. 7 D. 不确定
若有定义:int x=3, y=4, z=5;
则表达式 !(x+y)+z-1 && y+z/2 的值是( )
A. 0 B. 1 C. -1 D. 2
执行以下程序段后,i 和 j 的值分别为( )
c
int i=1, j=2;
i += j++ + --i;
A. i=3, j=3 B. i=4, j=3 C. i=5, j=3 D. i=5, j=2
以下关于指针的说法,错误的是( )
A. int *p = NULL; 是合法的
B. 指针变量可以指向常量
C. 指针变量的值可以改变
D. 两个指针变量不能进行加法运算
若有定义:char str[]="Hello\0World";,则 sizeof(str) 和 strlen(str) 的值分别是( )
A. 12, 5 B. 12, 10 C. 11, 5 D. 11, 10
以下递归函数的功能是( )
c
int func(int n) {
if(n <= 1) return 1;
return func(n-1) + func(n-2);
}
A. 计算 n! B. 计算斐波那契数列的第 n 项 C. 计算 2^n D. 计算 n 的平方
若有定义:int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
则表达式 *(*(a+1)+2) 的值是( )
A. 7 B. 8 C. 9 D. 6
以下说法正确的是( )
A. 全局变量如果不初始化,其值为随机
B. 静态局部变量在函数调用结束后空间被释放
C. 寄存器变量的地址不能被取
D. 外部变量只能在一个源文件中使用
有下列程序段:
c
char *p = "hello";
p[1] = 'a';
则程序运行结果是( )
A. 编译错误 B. 运行时错误 C. 输出 "hallo" D. 输出 "hello"
若有结构体定义:
c
struct node {
int data;
struct node *next;
};
struct node a, b, *p = &a;
a.data = 10; b.data = 20; a.next = &b; b.next = NULL;
则 p->next->data 的值为( )
A. 10 B. 20 C. 随机值 D. 编译错误
二、填空题(每题4分,共20分)
若有定义:int a[5] = {1,3,5,7,9}, *p = a+2;
则 (p+1) 的值是 ______。
下列程序段输出结果为 ______。
c
int x = 1, y = 0;
if(!x) y=1;
else if(x==0) y=2;
else y=3;
printf("%d", y);
函数 int fun(char *s) 返回字符串中数字字符的个数,请补充完整。
c
int fun(char *s) {
int count = 0;
while(______) {
if(*s >= '0' && *s <= '9') count++;
s++;
}
return count;
}
有二维数组 int b[3][4],若 b 的地址为 0x1000,int 占 4 字节,则 b[2][1] 的地址为 ______(用十六进制表示)。
以下程序运行后输出 ______。
c
int a=3, b=5;
void swap(int a, int b) {
int t = a; a = b; b = t;
}
int main() {
swap(a, b);
printf("%d %d", a, b);
return 0;
}
三、程序填空题(每题4分,共20分)
以下程序将字符串 s 中的所有小写字母转换为大写字母,请填空。
c
void toUpper(char *s) {
while(*s) {
if(*s >= 'a' && *s <= 'z')
______;
s++;
}
}
以下程序使用冒泡排序对数组 arr 进行升序排序,请填空。
c
void bubbleSort(int arr[], int n) {
int i, j, temp;
for(i=0; i<n-1; i++) {
for(j=0; j<______; j++) {
if(arr[j] > arr[j+1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
以下递归函数计算 x 的 n 次幂,请填空。
c
double power(double x, int n) {
if(n == 0) return 1;
if(n < 0) return ______;
return x * power(x, n-1);
}
以下程序从键盘读入一个字符串,并输出其长度(不使用 strlen)。请填空。
c
int main() {
char str[100];
int len = 0;
gets(str);
while(______) len++;
printf("%d", len);
return 0;
}
以下程序定义了一个结构体表示学生信息,并输出其中成绩最高的学生姓名。请填空。
c
struct Student {
char name[20];
int score;
};
int main() {
struct Student stu[3] = {{"Tom",85},{"Jerry",92},{"Alice",78}};
int maxIdx = 0;
for(int i=1; i<3; i++)
if(______) maxIdx = i;
printf("%s", stu[maxIdx].name);
return 0;
}
四、程序阅读题(每题4分,共20分)
请写出以下程序的运行结果。
阅读程序:
c
#include <stdio.h>
int main() {
int a[3][3] = {{1,2},{3,4,5},{6}};
printf("%d", a[1][2] + a[2][1]);
return 0;
}
输出:______
阅读程序:
c
#include <stdio.h>
void fun(int *a, int *b) {
int *t;
t = a; a = b; b = t;
}
int main() {
int x = 10, y = 20;
fun(&x, &y);
printf("%d %d", x, y);
return 0;
}
输出:______
阅读程序:
c
#include <stdio.h>
int main() {
int i = 0, sum = 0;
do {
i++;
if(i % 2 == 0) continue;
sum += i;
} while(i < 10);
printf("%d", sum);
return 0;
}
输出:______
阅读程序:
c
#include <stdio.h>
int main() {
char *p = "abcde";
p += 2;
printf("%c", *p++);
printf("%c", *p);
return 0;
}
输出:______
阅读程序:
c
#include <stdio.h>
int f(int n) {
static int s = 1;
s *= n;
return s;
}
int main() {
printf("%d ", f(2));
printf("%d ", f(3));
printf("%d", f(4));
return 0;
}
输出:______
五、程序设计题(共20分)
题目:编写一个函数 int findMaxSum(int a[], int n),找出数组中 连续子数组的最大和(例如:[-2,1,-3,4,-1,2,1,-5,4] 的最大子数组和为 6,子数组为 [4,-1,2,1])。要求算法时间复杂度为 O(n)。在 main 函数中测试该函数。
分值:函数定义 10分,主函数测试 10分。
第二部分:数据库原理及应用(共100分)
一、单项选择题(每题2分,共20分)
在关系数据库中,下列说法正确的是( )
A. 关系的属性可以再分解 B. 关系中不能有多余的元组
C. 关系的行顺序可以任意交换 D. 关系的列顺序不可交换
关于视图,下列说法错误的是( )
A. 视图可以像表一样查询 B. 视图可以更新,但有限制
C. 视图可以包含 ORDER BY 子句 D. 视图可以建立索引
设有关系模式 R(A,B,C,D),函数依赖集 F={A→B, B→C, C→D},则 R 的候选键为( )
A. A B. B C. C D. AD
以下哪种封锁协议可以避免“不可重复读”问题但不避免“幻读”问题?( )
A. 一级封锁协议 B. 二级封锁协议 C. 三级封锁协议 D. 两段锁协议
在 SQL 中,与“IN”等价的关系代数运算是( )
A. 选择 B. 投影 C. 笛卡尔积 D. 并
设有关系 R(a,b,c),S(b,c,d),以下查询结果可能为 3 个元组的是( )
A. SELECT * FROM R WHERE b=1 B. SELECT * FROM R NATURAL JOIN S
C. SELECT * FROM R WHERE a>2 D. SELECT a, d FROM R, S WHERE R.b=S.b
关系模式规范化时,消除主属性对候选键的部分依赖,至少应达到( )
A. 1NF B. 2NF C. 3NF D. BCNF
关于事务的隔离级别,下列说法正确的是( )
A. READ UNCOMMITTED 级别可以避免脏读
B. REPEATABLE READ 级别可以避免幻读
C. SERIALIZABLE 级别并发度最低
D. READ COMMITTED 级别可以避免不可重复读
下列哪个不是数据库恢复常用的技术?( )
A. 日志文件 B. 检查点 C. 镜像数据库 D. 索引重建
设有关系 R(A,B) 和 S(A,C),R 中 A 为唯一键,S 中 A 为外键参照 R(A)。删除 R 中某个元组时,若希望同时删除 S 中相应元组,应使用( )
A. ON DELETE RESTRICT B. ON DELETE CASCADE
C. ON DELETE SET NULL D. ON DELETE NO ACTION
二、填空题(每题4分,共20分)
数据库系统中,数据的物理独立性是指当 ______ 改变时,逻辑结构不变。
关系代数中,专门的关系运算包括选择、投影、连接和 ______。
已知关系 R(A,B,C),SQL 语句 SELECT A, COUNT(*) FROM R GROUP BY A HAVING COUNT(*) > 1; 的功能是查找 ______。
有两个关系 R 和 S,R∩S 等价于 R – (R – S) 或 ______(用其他关系代数运算表示)。
在事务并发调度中,若一个调度是可串行化的,则它一定满足 ______ 协议(填一种锁协议)。
三、数据库设计题(每题10分,共20分)
题目:某学校管理系统需求如下:
每个学生有学号(唯一)、姓名、性别、出生年份。
每门课程有课程号(唯一)、课程名、学分。
学生选修课程,每个学生可以选多门课,每门课可被多个学生选,选修有成绩(整数)。
每个学生只能属于一个学院,学院有学院编号(唯一)、学院名、院长姓名。
请完成:
(1) 画出该系统的 E-R 图(标出实体、属性、联系及 cardinality)。
(2) 将 E-R 图转换为关系模式(注明主键和外键)。
题目:设有关系模式 R(A,B,C,D,E),函数依赖集 F = { A→BC, CD→E, B→D, E→A }。
(1) 求 R 的所有候选键。
(2) 判断 R 最高属于第几范式?说明理由。
(3) 若不属于 3NF,将其分解为 3NF 且保持函数依赖。
四、数据库编程题(每题20分,共40分)
题目(SQL 查询):假设已存在如下关系表:
Student(sno, sname, sage, sdept)
Course(cno, cname, credit)
SC(sno, cno, grade)
请写出下列查询的 SQL 语句:
(1) 查询选修了“数据库”课程且成绩高于该课程平均分的学生学号和姓名。(10分)
(2) 查询没有选修任何课程的学生姓名。(5分)
(3) 查询每个学生选修课程的门数及平均分,并按平均分降序输出。(5分)
题目(存储过程):创建存储过程 proc_Transfer,实现两个账户之间的转账功能。
现有账户表 Account(accNo char(10) primary key, balance decimal(10,2))。
要求:
参数:转出账号 @fromAcc,转入账号 @toAcc,转账金额 @amount。
如果转出账户余额不足,则回滚事务并输出“余额不足”。
如果转账成功,提交事务并输出“转账成功”。
需要考虑并发控制,加必要的锁。
请写出完整的 SQL 存储过程代码(使用 T-SQL 或 PL/SQL 风格均可)。

中南林业科技大学涉外学院
湖南 长沙 | 民办三本 | 435.2万

湖南中医药大学湘杏学院
湖南 长沙 | 民办三本 | 150万

衡阳师范学院南岳学院
湖南 衡阳 | 民办三本 | 78.6万

南华大学船山学院
湖南 衡阳 | 民办三本 | 96万

湖南科技大学潇湘学院
湖南 湘潭 | 民办三本 | 150万

湖南工业大学科技学院
湖南 株洲 | 民办三本 | 150万

湖南工程学院应用技术学院
湖南 湘潭 | 民办三本 | 155万

湖南文理学院芙蓉学院
湖南 常德 | 民办三本 | 156万

湖南理工学院南湖学院
湖南 岳阳 | 民办三本 | 69万

湖南农业大学东方科技学院
湖南 长沙 | 民办三本 | 99.5万