2021秋-北邮计算机导论期末考试(BUPT)

函数题:

6-1 函数求值

求下列函数值:

输入只有一行,依次为一个正整数n(1 <= n <= 200),和一个浮点数x(0<x<100)。

输出只有一行,为所求得的函数值(保留3位小数)。

提示:C语言中开平方的函数原型为:double sqrt(double); ,可以在代码中使用

注意:此题要求递归求解,且不允许使用全局变量,否则没有分。

函数接口定义:

doublefun( int n , double x );

其中 n 和 x 都是用户传入的参数。 n 大于等于1且小于等于200; x 大于0且小于100。函数须返计算结果。

裁判测试程序样例:

#include<stdio.h>#include<math.h>doublefun( int n , double x );
intmain(){
int        n;
double    x;
scanf( "%d%lf" , &n , &x );
printf( "%.3f\n" , fun( n , x ) );
return0;
}
/* 请在这里填写答案 */

输入样例:

20 3.3

输出样例:

在这里给出相应的输出。例如:

4.987

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

程序代码:

double fun(int n, double x)
{
    if (n == 1)
        return sqrt(n + x);
    else
        return sqrt(n + fun(n - 1, x));
}

编程题:

7-1 身高预测

利用父母的身高可以对孩子成人后的身高进行预测,公式为:

男孩成人时的身高 = ( 父亲身高 + 母亲身高) * 1.08 / 2

女孩成人时的身高 = ( 父亲身高 * 0.923 + 母亲身高)/ 2

这个公式为捷克斯洛伐克人提出的,比较简便,因此流传很广。但因只考虑父母的遗传因素,所以误差范围比较大,使用价值有限。

现请你根据这个公式和给定的数据来预测一下孩子成人后的身高。

输入格式:

只有一行,为两个浮点数,加一个整数,依次代表父亲的身高、母亲的身高和孩子的性别(父母的身高大于0小于3,单位为米;最后一个整数为0时代表女孩,为1时代表男孩;测试数据保证所有输入符合上述要求)。

输出格式:

也只有一行,为根据上述公式预测的孩子的身高(单位仍然为米,要求保留2位小数)。

输入样例:

1.81 1.72 1

输出样例:

1.91

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

程序代码:

#include<stdio.h>
int main()
{
    double fu, mu;
    int sex;
    scanf("%lf %lf %d", &fu, &mu, &sex);
    double len;
    if (sex == 0)
    {
        len = (fu * 0.923 + mu) / 2;
    }
    else
    {
        len = (fu + mu) * 1.08 / 2;
    }
    printf("%.2lf\n", len);
    return 0;
}

7-2 拍7令四

拍7令是一种多人游戏,参与游戏的人围成一圈,依次快速报数。规则规定,第一个人从任意一个数字开始报数,当有人数到含有“7”的数字或“7”的倍数时,用拍手来代替报数,下个人继续报之后的数。如果有人报错数或拍错手则视为失败。现在请你写一段类似的程序。

输入格式:

为2个用空格分隔的正整数,第一数代表第一人第一次报的数,第二个数代表最后一次报的数(假设这轮游戏期间没有失败的行为出现)。

输出格式:

只有一个整数,该整数为此轮游戏所有没有报出的数个数。

测试数据保证输入合法,且 1、输入的两个数均大于0且小于1000000;2、输入的两个数字均该被报出;3、后一个数字大于前一个数字。

输入样例:

1 22

输出样例:

4

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

程序代码:

#include<stdio.h>
int main()
{
    int a1, a2;
    scanf("%d %d", &a1, &a2);
    int i, j, cnt = 0, flag, ch;
    for (i = a1; i <= a2; i++)
    {
        flag = 0;
        ch = i;
        while (ch != 0)
        {
            if (ch % 10 == 7)
            {
                flag = 1; break;
            }
            ch = ch / 10;
        }
        if (i % 7 == 0 || flag == 1)
            cnt++;
    }
    printf("%d\n", cnt);

    return 0;
}

7-3 干支纪年法

中国农历采取天干地支作为计算年,月,日,时的方法,就是把每一个天干和地支按照一定的顺序而不重复地搭配起来,用来作为纪年,纪月,纪日,纪时的代号。把“天干”中的一个字摆在前面,后面配上“地支”中的一个字,这样就构成一对干支。如果“天干”以“甲”字开始,“地支”以“子”字开始顺序组合,就可以得到:

1.甲子 2.乙丑 3.丙寅 4.丁卯 5. 戊辰 6.已巳 7.庚午 8.辛未 9.壬申 10.癸酉11. 甲戌 12.乙亥 13.丙子 14.丁丑 15.戊寅 16.已卯 17.庚辰 18.辛巳 19.壬午 20.癸未21.甲申 22.乙酉 23.丙戌 24.丁亥 25.戊子 26.已丑 27.庚寅 28.辛卯 29.壬辰 30.癸巳31.甲午 32.乙未 33.丙申 34.丁酉 35.戊戌 36.已亥 37.庚子 38.辛丑 39.壬寅 40.癸卯41.甲辰 42.乙巳 43.丙午 44.丁未 45.戊申 46.已酉 47.庚戌 48.辛亥 49.壬子 50.癸丑51.甲寅 52.乙卯 53.丙辰 54.丁巳 55.戊午 56.已未 57.庚申 58.辛酉 59.壬戌 60.癸亥

这六十对干支,天干经六个循环,地支经五个循环正好是六十,就叫做“六十干支”。按照这样的顺序每年用一对干支表示,六十年一循环,叫做“六十花甲子”。如2013年是癸巳年,1990是庚午年;从1984年的甲子年,到2044年又是甲子年。这种纪年方法就叫做“干支纪年法”,一直沿用到今天。历史上的辛亥革命、戊戌变法等说法均源于此。

假设我们用0-9依次代替10个天干,A-L依次代替12个地支,现在请你写一段程序,根据给定的年份算出其干支纪年法所对应的年份。

输入格式:

第1 行是测试数据的组数T(0<T<100)。后面跟着T 行测试用例,每行一个正整数n(1000<n<3000),代表公元纪年法的年份。

输出格式:

T行,每行对应一个测试用例,为该年份所对应的干支纪年法的年份(相应的字符表示)。

输入样例:

3
1984
1990
2044

输出样例:

0A
6G
0A

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

程序代码:

#include<stdio.h>
int main()
{
    char a[10] = { '0','1','2','3','4','5','6','7','8','9' };
    char b[12] = { 'A','B','C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K', 'L' };
    int n;
    scanf("%d", &n);
    int i, j, year;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &year);
        if (year >= 1984)
        {
            printf("%c%c\n", a[(year - 1984) % 10], b[(year - 1984) % 12]);
        }
        else
            printf("%c%c\n", a[10-((1984 - year) % 10)], b[12-((1984 - year) % 12)]);
    }
    return 0;
}

7-4 奇怪的屏幕

我们的屏幕大都是由一个一个像素点构成的。随着各个像素点亮度,色彩等不同,屏幕上就可以显示各种不同的图案。现在有一个屏幕有些奇怪,当某一个像素点亮了以后,它周边的8个点(当这个点在屏幕的边上或角上时,这个数量是不一样的)都会亮。当然后亮的这8个点是因为这个中心点才亮的,它们不再会导致它们各自周围的点再亮了(否则一个点亮了,整个屏幕就都亮了)。我们把前一种像素点叫主动亮的点。如图所示,如果那个红色的点为主动亮的点,则红框内其他8个点则会因为这个主动亮的点也亮起来,但红框外边的点不会。

如果规定屏幕的左上角的坐标为(1,1),它的右边的点坐标依次为(1,2),(1,3)等等,它的下边的点坐标依次为(2,1),(3,1)等等。其他点坐标也依此类推。

现在请你写一段程序来计算一下在某种情况下这个屏幕共亮了多少个像素点。

输入格式:

第一行为三个用空格分隔的整数m,n,c(0<m,n,c<10),依次代表屏幕像素行数,列数以及主动亮的像素点的个数。后边共c行,每行均为两个用空格分隔的整数,依次代表c个主动点亮的点的行坐标和列坐标。

测试用例保证输入合法且没有重复的主动亮的点。

输出格式:

所有亮了的像素点个数(包括主动亮的点)。

输入样例:

4 6 2
2 2
4 2

输出样例:

12

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

程序代码:

#include<stdio.h>
int main()
{
    int m, n, c;
    scanf("%d %d %d", &m, &n, &c);
    int a[10][10] = { 0 };
    int i, j, a1, b1;
    for (i = 0; i < c; i++)
    {
        scanf("%d %d", &a1, &b1);
        if (a1== 1 && b1 == 1)
        {
            a[a1][b1] = 1;
            a[a1][b1 + 1] = 1;
            a[a1+1][b1] = 1;
            a[a1+1][b1+1] = 1;
        }
        else if (a1 == 1 && b1 == n)
        {
            a[a1][b1] = 1;
            a[a1][b1 - 1] = 1;
            a[a1 + 1][b1] = 1;
            a[a1 + 1][b1 - 1] = 1;
        }
        if (a1 == m && b1 == 1)
        {
            a[a1][b1] = 1;
            a[a1][b1 + 1] = 1;
            a[a1 - 1][b1] = 1;
            a[a1 - 1][b1 + 1] = 1;
        }
        if (a1 == m && b1 == n)
        {
            a[a1][b1] = 1;
            a[a1][b1 - 1] = 1;
            a[a1 - 1][b1] = 1;
            a[a1 - 1][b1 - 1] = 1;
        }
        else if (a1 == 1)
        {
            a[a1][b1] = 1;
            a[a1][b1-1] = 1;
            a[a1][b1+1] = 1;
            a[a1+1][b1] = 1;
            a[a1+1][b1-1] = 1;
            a[a1+1][b1+1] = 1;
        }
        else if (b1 == 1)
        {
            a[a1][b1] = 1;
            a[a1-1][b1] = 1;
            a[a1-1][b1 + 1] = 1;
            a[a1][b1+1] = 1;
            a[a1 + 1][b1] = 1;
            a[a1 + 1][b1 + 1] = 1;
        }
        else if (a1 == m)
        {
            a[a1][b1] = 1;
            a[a1][b1 - 1] = 1;
            a[a1][b1 + 1] = 1;
            a[a1 - 1][b1] = 1;
            a[a1 - 1][b1 - 1] = 1;
            a[a1 - 1][b1 + 1] = 1;
        }
        else if (b1 == n)
        {
            a[a1][b1] = 1;
            a[a1][b1 - 1] = 1;
            a[a1-1][b1 - 1] = 1;
            a[a1 -1][b1] = 1;
            a[a1 + 1][b1 - 1] = 1;
            a[a1 + 1][b1] = 1;
        }
        else
        {
            a[a1][b1] = 1;
            a[a1][b1 - 1] = 1;
            a[a1][b1 + 1] = 1;
            a[a1 - 1][b1] = 1;
            a[a1 - 1][b1 - 1] = 1;
            a[a1 - 1][b1+1] = 1;
            a[a1 + 1][b1] = 1;
            a[a1 + 1][b1 - 1] = 1;
            a[a1 + 1][b1 + 1] = 1;
        }
    }
    int sum = 0;
    for (i = 1; i<= m; i++)
    {
        for (j = 1; j <= n; j++)
        {
            if (a[i][j] == 1)
                sum++;
        }
    }
    printf("%d\n", sum);
    return 0;
}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
北京邮电大学下一代internet实验是指北邮在深入研究传统互联网的基础上,积极探索并实践新一代互联网技术和架构,努力推动互联网的进一步发展和创新。 首先,北邮下一代internet实验的目标是提高网络性能和安全性。现有的互联网架构存在一些问题,如网络延迟高、数据丢失率大、数据传输速度慢等。北邮通过对网络协议、路由和拓扑结构的创新和改进,致力于提高网络的性能,使用户能够更快地获取和传输数据,并减少网络中断和故障的风险。 其次,北邮下一代internet实验还致力于开发和应用新的互联网技术。随着互联网的不断发展,新的技术和应用层出不穷,如物联网、边缘计算、人工智能等。北邮积极探索这些新技术的应用场景,并通过实验验证它们的可行性和实效性。这些新技术的应用将为用户提供更多的选择和便利,也有助于互联网发展的多元化和多样化。 此外,北邮下一代internet实验还关注网络安全和隐私保护问题。互联网作为信息交流和共享的载体,必然带来了各种安全和隐私风险。北邮在实验中加强网络安全技术的研究和应用,提出并实施网络安全策略,保护用户的个人隐私和信息安全。 总结来说,北邮下一代internet实验是为了提高互联网的性能、推动新技术的应用、解决网络安全问题等目标而进行的一系列实践和研究工作。通过这些工作的开展,北邮将为互联网的进一步发展和创新做出积极贡献,并为用户提供更加高效、便捷、安全和可信赖的网络服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值