北京邮电大学2017——2018学年第1学期《计算导论与程序设计》期末考试试题(B)

一、 简答题(共25分,每问5分)

1、从计算工具的发展历史来看,现代“电子计算机”和帕斯卡、莱布尼兹时代的“机械式计算器”有什么本质区别?

2、针对ENIAC计算机,冯.诺依曼为什么要提出“存储程序”的思想?冯.诺依曼机体系的特点是什么?

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++;
        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])
            return middle;
        else if (searchKey < a[middle])
            ________________;
        else
            ________________; 
    }
    return -1;
}

8、对于二维数组int a[4][5],a[0]+1是数组元素________________的地址。

9、用100元买100只鸡,大公鸡5元1只,母鸡3元1只,小鸡1元3只。完成以下程序,输出可能买的鸡数的所有组合。

int main()
{
    int cocks, hens, chicken;
    for(__________;__________;__________)
        for(__________;__________;__________)
            for(__________;__________;__________)
                if (____________________&&____________________)
                    printf("cocks:%d, hens:%d, chicken:%d\n",cocks, hens, chicken);
    return 0;
}

10、以下程序用于计算到给定日期为止,当年已经过去多少天。输入为当前日期。

int 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);
    return 0;
}

三、 程序设计题 (50分)

说明:1. 所有题目只画出对应的NS图; 2. 所有题目不能使用全局变量,否则视为0分处理;  3. 所有题目假定用户输入肯定正确,程序不需要对异常输入进行处理。

1、世界杯小组赛的32支参赛队分为八个小组,每组四队进行比赛。每支球队都必须和其他三支球队进行且只进行一场比赛,胜者得三分,负者不得分,打平双方各得一分。每个小组的前两名出线。小组赛出线规则如下

     a、积分高者排名靠前

     b、小组中总净胜球高者排名靠前

     c、小组中总进球数高者排名靠前

假设依次采用a、b、c三条规则后没有排名相同的队伍,请写出判断各个队伍排名的程序。

输入:4行,每行一个字符串和3个整数,字符串为国家的名字(长度不会超过20),3个整数(大于等于0且小于20)依次为该队的总进球数、总失球数和积分。注:总净胜球指的是该队总的进球数减去总的失球数

输入样例

Brazil 3 7 4
China 10 0 9
Germany 4 7 4
Italy 3 6 4

输出:4行,按小组赛排名从高到低每行输出一个国家的名字。

输出样例

China
Germany
Italy
Brazil

要求:

  1. 如上,每支队伍的数据包含四个属性:Country(国家名),GoalsFor(总进球数),GoalsAgainst(总失球数),Points(积分)。请将每支队伍信息抽象成一个结构体,并通过typedef struct team TEAM语法格式给出该结构体完整定义。(4分)
  2. 设计三个函数Comp, Swap, SortComp功能:顺次依据a、b、c三条规则比较两支球队的成绩,并返回比较结果;Swap功能:将两支球队的所有数据交换(两个结构体内的所有值都要交换);Sort功能:将若干支队伍依据规则降序排列。要求给出三个函数的完整函数头格式,包括参数列表、返回值,并说明参数列表中每个参数的含义,以及返回值的含义。(12分)
  3. 请分别给出三个函数Comp, Swap, Sort对应的算法设计N-S图,要求Sort函数必须调用其它两个函数。(10分)
  4. 请给出main函数对应的算法设计N-S图,算法中必须调用Sort函数。注:输入输出无需细化。(2分)

发表评论