跳转至

华东师范大学期末试卷(A)2019-2020学年第一学期

课程名称:程序设计

专业:数据科学与大数据技术

年级/班级:2019级

课程性质:专业必修

本卷共分三部分,总分为100分。第一部分为20道选择题,共60分。第二部分为5道填空题,共20分。第三部分为3道程序设计题,共20分。

一、选择题(共60分,每题3分)

1)C语言(以及很多其他程序语言)代码需要经历一系列翻译流程才能变成机器可以理解的代码。关于这一系列翻译流程的顺序,正确的是()
A.编译→链接→汇编
B.编译→汇编→链接
C.汇编→编译→链接
D.汇编→链接→编译

2) 一个最简单的C语言代码由预处理命令和实际完成功能的代码构成,以下哪项不是正确的C语言预处理命令()
A. #include<stdio.h>
B. #define HEIGHT 180 C.#ifdef DEBUG D.#x=sqrt(y)

3) C语言的标识符是用来命名变量、常量、函数等元素的符号。标识符的命名必须遵循一定的规则,否则会出现编译错误。以下哪个标识符是不合法的()

A. student2 B._student2 C. 2student D._2student

4) C语言中运算符的优先级和结合性决定了表达式的执行顺序。请问*a+b> c!=d的执行顺序(正确的括号位置)是()

A.(*(a+b))>(c!=d) B.((*a)+b)>(c!=d) C.((*(a+b))>c)!=d D.(((*a)+b)>c)!=d

5)格式化输入输出转换说明符的完整格式是%m.pX,其中m代表要打印的字符数,p代表精度,X是要打印的数据类型。假设浮点型变量a=123.456789,那么以%8.3f 格式打印a的输出是()

A.123.457  
B.123.4567  
C. 123.457  
D.123.4570

6)请阅读以下使用分支结构的代码片段

int a= 0;
if(a++==1)
    a++;
else
    a--;
printf ("%d",a):

请问这段代码的输出是() A.-1 B.0 C.1 D.2

7) 请阅读以下关于函数调用的代码

#include <stdio.h>
int i=0;
int func (int *a,int b)
{
    i=1;
    *a=1;
    b=1;
}
int main ()
{
    int j=0,k=0;
    func(&j,k);
    printf("%d,%d,%d\n",i,j,k);
    return 0;
}

请问这段代码的输出是()
A.1,1,1 B.1,1,0 C.1,0,0 D.0,0,0

8)请问以下二维数组的初始化语句中,哪个是错误的()

A.int a[3][]={{1,2},{3,4},{5,6}};
B.int a[3][2]={{1,2},{3,4},{5,6}}; C.int a[][2]={{1,2},{3,4},{5,6}}; D.int a[3][2]={{1,2},{},{5,6}};

9)给定二维数组int a[3][2]={{1,2},{3,4},{5,6}},假设数组元素1的内存地址为10000,且内存分配方向为从低地址向高地址分配,另外int型变量占据4个字节。请问数组元素5的内存地址为()
A.10008
B.10012
C.10016
D.10020

10)已知在某系统上double型变量占据8个字节,double型指针变量占据4个字节,int型变量占据4个字节。请问该系统上int型指针变量占据多少个字节()
A.1个字节
B.2个字节
C.4个字节
D.8个字节

11)假设有整型数组int a[6]={1,2,3,4,5,6},令指针量int *p=a;

请问以下哪个表达式的值不是5()

A.*(&p+4) B.*(p+4) C.*(p+3)+1 D.*(*(&p)+3)+1

12)假设有字符型数组 char str[] = "Hello World!"; 请问 strlen(str) 的值和sizeof(str)/sizeof(str[0]) 的值依次是多少()
A.12,12
B.12,13
C.13,12
D.13,13

13)请阅读以下关于字符串操作的代码

#include <stdio.h>
#include <string.h>
int main()
{
    char s1[]= "Real Madrid";
    char s2[]= "FC Barcelona";
    if(s1<s2)
        printf("1");
    else
        printf("0");
    if(strcmp(s1,s2))
        printf("1");
    else
        printf("0");
    return 0;
}

假设内存地址由低地址向高地址分配,请问这段代码的输出()
A.00 B.01 C.10 D.11

14)已知结构 student 包含两个字符指针变量name和number,分别用于存储学生姓名字符串和学号字符串,现假设指针变量pstu指向一个student结构变量, 以下哪个表达式会产生编译错误()
A. pstu->name B.pstu.name
C. (*pstu).name D. &pstu->name

15)请阅读以下关于联合的代码

#include <stdio.h>
union student
{
    char *name;
    char *number;
};
int main()
{
    union student stu;
    stu.name = "Jordan";
    stu.number = "20190001";
    printf("%s,%s",stu.name,stu.number);
}

请问这段代码的输出为()
A.Jordan,Jordan B.Jordan,20190001 C.20190001,Jordan D.20190001,20190001

16)假设有宏定义 #define ADD(x,y) x+y,请问表达式 2 * ADD(3,3) /3 的值为()
A.4
B.7
C.10
D.13

17)请阅读以下关于条件编译的代码

#include <stdio.h>
#define FLAG 0
int main()
{
    #ifdef FLAG
        printf("1");
    #elif FLAG==0
        printf("2");
    #elif FLAG>0
        printf("3");
    #else
        printf("4");
    #endif
    return 0;
}

请问这段代码的输出为()
A.1
B.2
C.3
D.4

18)假设有二维数组a[][],请问以下哪个表达式等价于元素a[3][2]()
A.**(a+2)+3 B.*(*(a+2)+3)
C.**(a+3)+2
D.*(*(a+3)+2)

19) 请阅读以下关于链表的代码

#include <stdio.h>
#include <stdlib.h>
typedef struct node
    int number;
    struct node *next;
}node;

int main()
{
    node *head,*p;
    head->number =1;
    head->next = NULL;
    p=(node *) malloc(sizeof(node));
    p->number =2;
    p->next = head->next;
    head->next = p;
    p=(node *) malloc(sizeof(node);
    p->number=3;
    p->next = head;
    head =p;
    while(head)
    {
        printf("%d ",head->number);
        head = head->next;
    }
    return 0;
}

请问这段代码的输出为() A.1 2 3
B.1 3 2
C.2 1 3
D.3 1 2

20)假设文件指针 fp 指向的文件内容为DaSE,str为一个字符数组,请问调用读文件函数fgets(str,3,fp)后,printf('%s',str)输出为()
A.D
B.Da
C.DaS
D.DaSE

二、填空题(共20分,每题4分)

21)假设在内存中采用两个字节来存储int类型数据,那么整数-350在内存中的二进制表示形式为( )。

22)printf("%d",'Z'-'A') 的输出为() 23)请阅读如下函数代码

int func(int n)
{
    if(n<=2)   
        return 1;   
    if(n==3)   
        return 3;   
    else   
        return func(n-1) + func(n-3);   
}   

请问func(10)的值为()

24)C语言中有一种变量,其作用域为从被定义到程序结束,并且可以被作用域内的所有函数共用,这种变量称为 ()。

25)已知文件file.txt中的内容为ECNUDaSE,现使用文件指针fp以读写方式打开file.txt,并且调用函数fseek(fp,5L,0)。请问调用函数fputc('A',fp)并关闭文件后,file.txt中的内容变为()

三、程序设计题(共20分,26和27题各5分,28题10分)

26)请实现一个简易的计算器,能够完成复数的加法、减法和乘法运算。请完成以下缺失部分的代码,具体要求如下: a)复数已使用如下结构体定义,real为实部,imag为虚部; b)请实现三个尚缺少返回值类型的函数,加法add(),减法sub()和乘法prod()。 提示: (a+bi)+(c+di)=(a+c)+(b+d)i (a+bi)-(c+di)=(a-c)+(b-d)i (a+bi)×(c+di)=(ac-bd)+(bc+ad)i

typedef struct complexumber{float real;float img;}cn;

add(cn n1,cn n2)
{



}
sub(cn n1,cn n2)
{



}
prod(cn n1,cn n2)
{



}

27)冒泡排序是一种非常容易实现的对数组的排序算法,其核心思想是:对数组进行多轮遍历并且在每一轮遍历中,不断交换相邻元素的位置(如有必要),直到在一轮遍历中没有元素交换发生,则算法结束。假设数组a的长度为n,下面已经给出了冒泡排序的C语言实现基本框架,请完善循环内缺失的代码,将a中元素按从小到大顺序排序。

for (int i=0;i<       ;i++)
{
    for (int j=0;j<       ;j++)
    {
        if(             )
        {



        }
    }
}

28)单向链表倒排是一种常见的链表操作,即从表头开始,依次反转结点指针的指向,例如下图中上半部分为原始链表,下半部分为倒排后的链表。请完善以下代码中缺失的部分,实现倒排链表的函数。假设head是已有原始链表的表头。[提示:可以构建另一个链表,并将原始链表中的结点依次在新链表的表头插入]

image-20260425192057973

typedef struct node
{
    int number;
    struct node *next;
}node;
node* reverseList(node *head)
{
    if(!head) return NULL;









}