华东师范大学期末试卷(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是已有原始链表的表头。[提示:可以构建另一个链表,并将原始链表中的结点依次在新链表的表头插入]

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