湖南文理学院芙蓉学院

  • 官方网址: https://fur.huas.edu.cn/
  • 官方电话:0736-7186057
  • 电子邮箱:
  • 院校地址:湖南省常德市青年东路

湖南文理学院芙蓉学院《软件工程》模拟卷

第一部分:高级语言程序设计基础(共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 风格均可)。