北京邮电大学 2017——2018 学年第 1 学期
《计算导论与程序设计》期末考试试题(B)
一、学生参加考试须带学生证或学院证明,未带者不准进入考场。学生必须按
照监考教师指定座位就坐。
二、书本、参考资料、书包等物品一律放到考场指定位置。
三、学生不得另行携带、使用稿纸,要遵守《北京邮电大学考场规则》,有考场
违纪或作弊行为者,按相应规定严肃处理。
四、学生必须将答题内容做在试题答卷上,做在草稿纸上一律无效。
五、学生的姓名、班级、学号、班内序号等信息由教材中心统一印制。
2018 年 1 月 23 日
计算导论与程序设计 考试时间
一
25
二
25
三
50
四
五
六
七
八
总分
考
试
注
意
事
项
考试
课程
题号
满分
得分
阅卷
教师
一、 简答题(共 25 分,每问 5 分)
1、 从计算工具的发展历史来看,现代“电子计算机”和帕斯卡、莱布尼兹时代的“机
械式计算器”有什么本质区别?
2、 针对 ENIAC 计算机,冯.诺依曼为什么要提出“存储程序”的思想?冯.诺依曼机
体系的特点是什么?
第 1页 /共 12页
3、 一幅位图图像可以看作是由多个小方格组合而成的矩阵,每个小方格叫做一个
“像素”,比如一个分辨率为 1024×768 的图像可看作由 1024×768 个方格组成。
假设每个像素能表示 512 种颜色,则存储一幅 1024×768 的图像至少需要多少字
节?请说明原因。
4、 高级语言所编写的源代码程序(可看成一个字符序列)在内存中也是二进制存储
的,为什么计算机不能直接执行?请解释 CPU 运行一个程序的主要步骤?
5、 什么是计算机指令?通常指令所实现的操作是非常基本和简单的,但为什么我们
可以用计算机完成玩游戏,甚至战胜世界围棋大师等复杂任务?
二、 程序填空题(共 25 分,每空 1 分)
1. 定义以下变量并假设已给其赋值“char a; int b; float c; double d;”,则表达式 a*b+c-d
的数据类型为________________________。
2. 假定 x=7,y=9,则表达式(x++)*(++y)的值为__________________。
3. 定 义 以 下 变 量 “ char string1[10], *string2="Great"; ”, 通 过 调 用 函 数
strCopy(string1,string2)将字符串常量拷贝到字符数组中,要求函数保证不能改变
string2 指向的字符串值。
void strCopy(char * s1,
{
s2)
while(
{ *s1=
s1++;
)
;
第 2页 /共 12页
s2++;
}
*s1=
;
}
4. 以下函数为判断一个数 n 是否为素数。若为素数,则返回 1;否则返回 0。
&&
)
int isPrim(int n)
{
int i;
int prim=1;
i = 2;
while (
{
if (n % i = = 0)
else
i++;
}
return
}
;
;
5. 以下是一个递归函数,用于求任意正整数 n 的位数。
int length (int n)
{
if (____________________________)
return 1;
return _____________________________;
}
6. 定义二维数组 int a[5][4],假设 int 类型占 4 个字节,则 a[2][3]的地址为:
&a[0][0] + _____________________________。
7. 以下函数实现“折半查找”。在数组 a 中查找整数 searchKey,如在 a 中找到
searchKey,则返回所在元素的下标,否则返回-1。
int binarySearch(int a[],int searchKey,int low,int high)
{
int middle;
while (_________________________)
{
middle = (low + high)/2;
if (searchKey == a[middle])
else if (searchKey < a[middle])
return middle;
________________;
________________;
else
}
return -1;
}
第 3页 /共 12页
8. 对于二维数组 int a[4][5],a[0]+1 是数组元素________________的地址。
9. 用 100 元买 100 只鸡,大公鸡 5 元 1 只,母鸡 3 元 1 只,小鸡 1 元 3 只。完成以
下程序,输出可能买的鸡数的所有组合。
main()
{ int cocks,hens,chicken;
for(
for(
for(
if (
;
;
;
;
;
;
&&
)
)
)
printf("cocks:%d,hens:%d,chicken:%d\n",cocks,hens,chicken);
)
}
10. 以下程序用于计算到给定日期为止,当年已经过去多少天。输入为当前日期。
main()
{
int year, month, day;
int yearDays, i;
printf("Input year-month-day:\n");
scanf(_____________________________);
yearDays = 0;
for(
{
;
// 输入年月日
)
;
switch(i)
{
____________________________________________________
yearDays+=31; break;
____________________________________________________
yearDays+=30; break;
case 2: if (_________________________________________)
// 判断闰年
yearDays+=29;
else
yearDays+=28;
break;
default: printf("invalid month!"); break;
}
}
printf("The days are %d",yearDays + day);
}
第 4页 /共 12页
三、 程序设计题 (50 分)
说明:1. 所有题目只画出对应的 N-S 图; 2. 所有题目不能使用全局变量,否则视
为 0 分处理;
3. 所有题目假定用户输入肯定正确,程序不需要对异常输入进行处理。
1. 世界杯小组赛的 32 支参赛队分为八个小组,每组四队进行比赛。每支球队都必须和
其他三支球队进行且只进行一场比赛,胜者得三分,负者不得分,打平双方各得一分。
每个小组的前两名出线。小组赛出线规则如下:
a、积分高者排名靠前
b、小组中总净胜球高者排名靠前
c、小组中总进球数高者排名靠前
假设依次采用 a、b、c 三条规则后没有排名相同的队伍,请写出判断各个队伍排名
的程序。
输入:4 行,每行一个字符串和 3 个整数,字符串为国家的名字(长度不会超过 20),
3 个整数(大于等于 0 且小于 20)依次为该队的总进球数、总失球数和积分。注:总净胜球
指的是该队总的进球数减去总的失球数。
输入样例:
Brazil
China
Germany
Italy
3
10
4
3
7
0
7
6
4
9
4
4
输出:4 行,按小组赛排名从高到低每行输出一个国家的名字。
输出样例:
China
Germany
Italy
Brazil
要求:
1) 如上,每支队伍的数据包含四个属性:Country(国家名),GoalsFor(总进球数),
GoalsAgainst(总失球数),Points(积分)。请将每支队伍信息抽象成一个结构体,
并通过 typedef struct team TEAM 语法格式给出该结构体完整定义。(4 分)
2) 设计三个函数 Comp, Swap, Sort。Comp 功能:顺次依据 a、b、c 三条规则比较
两支球队的成绩,并返回比较结果;Swap 功能:将两支球队的所有数据交换(两
个结构体内的所有值都要交换);Sort 功能:将若干支队伍依据规则降序排列。
要求给出三个函数的完整函数头格式,包括参数列表、返回值,并说明参数列
表中每个参数的含义,以及返回值的含义。(12 分)
3) 请分别给出三个函数 Comp, Swap, Sort 对应的算法设计 N-S 图,要求 Sort 函数
必须调用其它两个函数。(10 分)
4) 请给出 main 函数对应的算法设计 N-S 图,算法中必须调用 Sort 函数。注:输入
输出无需细化。(2 分)
第 5页 /共 12页
第 6页 /共 12页
2. 一张正方形的卫星照片可看作是由多个小方格组合而成的矩阵,每个小方格叫做一
个像素点。卫星照片中存在街区和道路,街区是由不同道路或者道路与照片边缘围成的
矩形区域,所有道路都纵横排列,每条道路均贯穿整张照片并平行于照片的边缘,照片
的最外一圈不是道路。卫星照片中每个像素点都有灰度值,如果某点的灰度值大于等于 0
且小于等于 50,则该点为道路上的点;如果某点的灰度值大于 50,则该点为街区上的点,
街区和道路所包含的像素点总数是不固定的。每个像素都有坐标(x,y),分别为行坐标和
列坐标,照片左上角的像素点坐标为(0,0)。假定卫星照片矩阵的阶数为常数 MAP_LEN,
要求编写一个程序,求出照片中各个街区的坐标。
输入:1+10 行(假定 MAP_LEN=10)。第一行为 2 个整数 s 和 t,s 代表横向道路的
条数,t 代表纵向道路的条数。后续输入 10 行,每行 10 个整数,代表 10×10 的正方型
矩阵照片,每个整数代表一个像素的灰度值(该值大于等于 0 且小于等于 10000)。
输入样例:输入一个 10 阶正方形矩阵,横向道路条数 1,纵向道路条数 2。
1
99
99
99
99
99
99
99
50
99
99
输出:假定照片左上角的像素点坐标为(0,0),“按行”依次输出各个矩形街区的左上
角坐标和右下角坐标。输出格式为多行,每行代表照片中同一行的所有街区,每个街区
坐标输出格式为“x1,y1,x2,y2”,同一行内每个街区坐标之间用制表符'\t'分隔。
2
99
99
99
99
99
99
99
50
99
99
50
50
50
50
50
50
50
50
50
50
50
50
50
50
50
50
50
50
50
50
99
99
99
99
99
99
99
50
99
99
99
99
99
99
99
99
99
50
99
99
99
99
99
99
99
99
99
50
99
99
99
99
99
99
99
99
99
50
99
99
50
50
50
50
50
50
50
50
50
50
99
99
99
99
99
99
99
50
99
99
输出样例:根据以上输入样例,总共有 2×3 个街区,按行输出每个街区的坐标
0, 0, 6, 1
8, 0, 9, 1
0, 3, 6, 4
8, 3, 9, 4
0, 7, 6, 9
8, 7, 9, 9
第 7页 /共 12页
要求:
1) 设计一个结构体存储一个街区的坐标,通过 typedef struct block BLOCK 语法格
式给出该结构体完整定义。(2 分)
2) 假定输入的横向道路条数为 s,纵向道路条数为 t,请给出街区总数 blockNums
的计算公式。(2 分)
3) 假定需要用一个存储结构存储“所有”街区坐标结构体 BLOCK,并要求以“动
态分配内存”的方式实现,请定义指向该动态存储结构指针的类型(1 分),并说
明动态内存分配的顺序(1 分),以及使用完毕后释放的顺序(1 分)。
4) 设计函数 getBlocks(int map[][MAP_LEN], int rowBlocks, int colBlocks,),用于求
出卫星照片上所有街区的坐标,并以“动态分配内存”的方式保留所有街区坐
标结构体。参数 map 表示卫星照片矩阵,MAP_LEN 为常数;参数 rowBlocks
为结果街区的行数,colBlocks 为结果街区的列数;函数返回值为第 3 问中指向
动态存储结构的指针。请给出函数算法设计 N-S 图。注:假设每次申请内存都
会成功,无需对内存申请不成功做处理。(11 分)
5) 设计 main 函数,要求在 main 函数中调用 getBlocks 函数。注:输入输出无需细
化。(4 分)
第 8页 /共 12页