电子科大信软互+班 程算I 2022秋机考真题

基本情况

对应课程:程序设计与算法基础I

考试时间:3小时

题型:函数题+编程题

考试年纪:2022级

函数题只需要完成期中一些(个)函数即可
编程题需要自己手动写main函数

说明:题目从icoding看的,不确定是不是真的是2022级的题,可以供学弟学妹练习


题目

  1. 三角形面积

题目编号:188

一. 已知条件
  1. 秦九韶公式 给定三个边长a、b、c。如果这三条边能构成一个三角形,那么该三角形的面积可以由秦九韶公式求出:


s = (a + b + c) / 2.0
area = sqrt(s * (s - a) * (s - b) * (s - c))
三角形任意两边之和大于第三边。
  1. 求平方根函数sqrt 该函数的原型如下:


double sqrt(double x);

其功能是:求数x的平方根。你可以在程序中直接调用它。

二. 任务

请补全函数area。该函数的原型如下:


double area(double a, double b, double c);

此函数的功能是:判断给定的边长a、b、c是否能构成三角形。

  • 如果能,计算并返回三角形的面积。

  • 如果不能,返回任意负值

三. 测试用例
  1. 测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:

  • 从键盘输入三条边长。各输入项间用空格隔开。

  • 调用你补全的函数area,得到结果。

  • 如果结果是正值,则按%.2lf格式输出面积;否则输出invalid。

  1. 测试用例举例

  • 用例1 输入 3 4 5 输出 6.00

  • 用例2 输入 1 2 3 输出 invalid

四. 要求
  1. 请在框架文件中完成任务。

  1. 请将你的代码写在//TODO和//END OF TODO这对标记之间。

  1. 请勿修改框架中的任何已有内容。


#include <math.h>
#include <stdio.h>

/*
 * 求三角形面积函数area
 * 参数说明:
 *      - a、b、c都是三角形的边长。
 * 返回值说明:
 *      - 如果a、b、c能构成三角形,则返回面积。
 *      - 否则,返回任意负值。
 */
double area(double a, double b, double c) {
    //TODO

    //END OF TODO
}

int main(){
    float a, b, c;
    scanf("%f %f %f", &a, &b, &c);
    double res = area(a, b, c);
    if(res < 0)
        printf("invalid");
    else
        printf("%.2lf", res);
}

  1. 找出闭区间内所有完全数

题目编号:189

一. 已知条件
  1. 真因子 有正整数f和m,且f < m。如果m能被f整除,那么f是m的真因子。显然,1是任意大于1的正整数的真因子;m不是它本身的真因子

  1. 完全数 如果一个正整数m,其所有真因子之和等于m,那么它就是一个完全数。例如完全数6和28:


6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
二. 任务

请补全函数is_perfect。该函数的原型如下:


bool is_perfect(unsigned m);

此函数的功能是:

  • 判断m是否是一个完全数。

  • 如果是,则返回true;否则返回false。

注:你可以将bool类型看作是int类型,true视为1,false视为0。

提示:如果判断i是m的真因子?
三. 测试用例
  1. 测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:

  • 从键盘输入两个正整数a和b并保证3 < a < b <= 10000。

  • 调用你补全的函数is_perfect,找出区间内的所有完全数,并按如下格式输出结果: (完全数1)(完全数2)...(完全数n) 如果区间内没有完全数,则输出为: ()

  1. 测试用例举例

  • 示例1 输入 1 30 输出 (6)(28)

  • 示例2 输入 7 27 输出 ()

四. 要求
  1. 请在框架文件中完成任务。

  1. 请将你的代码写在//TODO和//END OF TODO这对标记之间。

  1. 请勿修改框架中的任何已有内容。


#include <stdio.h>
#include <string.h>
#include <stdbool.h>

/*
 * 判断m是否为完全数
 * 参数说明:
 *      - m:unsigned,待判断的正整数
 * 返回值说明:
 *      - bool,如果m是完全数,返回true;否则返回false。
 */
bool is_perfect(unsigned m) {
    //TODO

    //END OF TODO
}


static void print_perfect(unsigned a, unsigned b) {
    int c = 0;
    for (unsigned i = a; i <= b; ++i)
        if (is_perfect(i)) {
            ++c;
            printf("(%d)", i);
        }
    if (!c) printf("()");
    putchar('\n');
}

int main() {
    unsigned a, b;

    scanf("%u%u", &a, &b);
    print_perfect(a, b);

    return 0;
}
  1. 利用斐波那契数列求黄金分割比例

题目编号:190

一. 已知条件
  1. 斐波那契数列 斐波那契数列的定义为:第1、2项都是1;第n项是前两项之和。递推公式如下: Fn = 1, 当n=1,2时 Fn = Fn-1 + Fn-2, 当n>2时

  1. 黄金分割比例 黄金分割比例phi约等于0.618,可以用斐波那契数列中的相邻两项求得: phi = Fn-1 / Fn n越大,得到得结果就越精确。

二. 任务

请补全函数phi的编码。该函数的原型如下:


double phi(int n);

此函数的功能是:

  • 根据递推公式计算出斐波那契数列的第n-1项和第n项

  • 计算并返回二者的商。

注意:不能也不需要用递归方法

三. 测试用例
  1. 测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:

  • 从键盘输入正整数n(3 <= n <= 20)。

  • 调用你补全的函数phi,计算并用格式"%.5lf"输出结果。

  1. 测试用例举例

  • 用例1 输入 3 输出 0.50000

  • 用例2 输入 8 输出 0.61905

  • 用例3 输入 20 输出 0.61803

四. 要求
  1. 请在框架文件中完成任务。

  1. 请将你的代码写在//TODO和//END OF TODO这对标记之间。

  1. 请勿修改框架中的任何已有内容。


#include <stdio.h>

/*
 * 利用斐波那契数列求黄金分割比例
 *
 * 参数说明:
 *      - n:int, 斐波那契数列的项数
 * 返回值说明:
 *      - double,黄金分割比例
 *
 * 提示:斐波那契数列每项的值都是整数
 * 注意:不能也不需要用递归方法
 */
double phi(int n) {
    //TODO

    //END OF TODO
}


int main() {
    int n;

    scanf("%d", &n);
    printf("%.5lf\n", phi(n));

    return 0;
}

  1. 还原压缩的三角方阵

题目编号:191

一. 已知条件
  1. 三角方阵压缩 有这样的一种方阵(行列数相同的矩阵),左上三角地带所有值都是0,右下三角地带全是无规律的非0值。 例如,以下是这样的一个4阶方阵:


0 0 0 7
0 0 2 4
0 9 6 3
8 5 1 10

因为存在大量的0元素,所以常把它压缩存储到一个一维序列中:


7 2 4 9 6 3 8 5 1 10

假设方阵是n阶的,其非0元素个数为m,则有:m=n(n+1)/2;那么反推过来,n就接近于2m的平方根。提示:是向上取整还是向下取整?

  1. 数据结构 在C语言实现上,方阵可以用一个二维数组表示,压缩成的一维序列可以用一个一维数组表示。

二. 任务

请补全函数restore_matrix的编码。该函数的原型如下:


int restore_matrix(int a[], int b[][MAXN]); //#define MAXN  512

此函数的功能是:

  • 将一维数组a中的压缩数据还原到方阵b中,返回方阵的阶数。

三. 测试用例
  1. 测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:

  • 从键盘依次输入压缩一维数组的值,最后一个数据是0值,表示输入结束。输入数值间用空格隔开。

  • 调用你补全的函数restore_matrix,得到结果,并按行依次输出还原的二维方阵的所有元素,元素间用空格隔开。

  1. 测试用例举例

  • 用例 输入 7 2 4 9 6 3 8 5 1 10 0 输出 0 0 0 7 0 0 2 4 0 9 6 3 8 5 1 10

四. 要求
  1. 请在框架文件中完成任务。

  1. 请将你的代码写在//TODO和//END OF TODO这对标记之间。

  1. 请勿修改框架中的任何已有内容


/*
1. 本题需要的数据较多。因此,为了避免你在本地调试时反复输入,已将测试用例写在了一个数据文件q4.in中,其内容如下:
7 2 4 9 6 3 8 5 1 10 0

上述数据产生的输出是:
0 0 0 7 0 0 2 4 0 9 6 3 8 5 1 10

2. 如果这个文件不存在,那么你就要从键盘手动输入。

3. 如果你的程序编译后是a.out,那在命令行里,你可以这样运行程序 a.out < q4.in ,避免重复从键盘输入
*/

#include <stdio.h>
#include <math.h>

#define MAXN    512

int a[MAXN];
int b[MAXN][MAXN];
/*
 * 将压缩到一维数组的二维方阵还原
 * 首先要根据一维数组的非0元素个数m,计算二维方阵的阶数n。
 * 提示:n接近于sqrt(2m)
 * 
 * 参数说明:
 *      - a:int[],存储压缩数据的一维数组。其中的第一个0值只表示结尾,不是压缩数据。
 *      - b:int[][MAXN],待还原的方阵。
 * 返回值说明:
 *      - int。方阵的阶数。
 */
int restore_matrix(int a[], int b[][MAXN]) {
    //TODO

    //END OF TODO
}



int main() {
    int i, j;
    i = 0;
    while (1) {
        scanf("%d", &a[i]);
        if (a[i] == 0) break;
        ++i;
    }

    int n = restore_matrix(a, b);

    for (i = 0; i < n; ++i)
        for (j = 0; j < n; ++j)
            printf("%d ", b[i][j]);
    putchar('\n');

    return 0;
}
  1. 去除字符串首尾的所有空格

题目编号:192

一. 已知条件
  1. 首尾空格去除 一个字符串的首尾可能存在多个无用的空格。例如:


"   this is    a   test.    "

现在需要将这个字符串首尾所有的空格去除,但字符串中间的空格要原样保留。结果是这样的:


"this is    a   test."

这个结果将保存到另一个字符串中。

  1. 思路 对于原始字符串s和结果字符串t:

  • 指针p从s开头向后,找到第一个非空格字符;

  • 指针q从s尾部向前,找到第一个非空格字符;

  • 将指针p、q之间的字符复制到t中;

  • 字符串t封尾。

提示:如何找到字符串的尾部?
二. 任务

请补全函数trim的编码。该函数的原型如下:


void trim(char *s, char *t);

此函数的功能是:

  • 去除字符串s首尾所有空格,但s中间的空格原样保留。

  • 结果保存到字符串t中。

三. 测试用例
  1. 测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:

  • 从键盘输入首尾、中间可能带有空格的字符串,去掉行尾的'\n',用'\0'封尾。测试程序保证没有全是空格的输入。

  • 调用你补全的函数trim,得到结果,并按如下格式输出: (去掉首尾空格的字符串)

加上()的作用是为了让结果一目了然。
  1. 测试用例举例

  • 用例 输入 this is a test. 输出 this is a test. 注:输入输出背景加深是为了能看清两端空格的存在。

四. 要求
  1. 请在框架文件中完成任务。

  1. 请将你的代码写在//TODO和//END OF TODO这对标记之间。

  1. 请勿修改框架中的任何已有内容




#include <stdio.h>
#include <string.h>


/*
 对于原始字符串s和结果字符串t:
    - 指针p从s开头向后,找到第一个非空格字符;
    - 指针q从s尾部向前,找到第一个非空格字符;
    - 将指针p、q之间的字符复制到t中;
    - 字符串t封尾。
*/

/*
 * 去除字符串两端空格的函数trim
 * 将字符串开头和末尾的所有空格字符去除
 * 
 * 参数说明:
 *      - s:char*,原始字符串
 *      - t:char*,去掉所有首尾空格后的字符串
 * 返回值说明:
 *      - 无
 *
 */
void trim(char *s, char *t) {
    //TODO

    //END OF TODO
}

#define MAXN   512

extern void trim(char *s, char *t);

int main() {
    char s[MAXN + 1], t[MAXN + 1];

    fgets(s, MAXN, stdin);
    char *p = strchr(s, '\n');
    if (p) *p = '\0';
    
    trim(s, t);
    printf("(%s)\n", t);

    return 0;
}
  1. 键值对数组排序

一. 已知条件
  1. 键值对的数据结构 键值对(key-value pair)可以用C语言的结构来描述:


typedef struct {
    char key[30];  //用字符串表示的键
    int value;     //基于简化的目的,数值的类型是int
} pair;

在此基础上,用键值对数组来存储更多的数据。


pair kv[128];  //kv是键值对类型的数组。元素的键无重复。
  1. 字符串比较函数 两个字符串进行值比较的标准库函数原型如下:


int strcmp(const char *s, const char *t);

这个函数的功能是:比较两个字符串的字典序大小。如果s>t,函数返回正值;如果s<t,返回负值;如果相等,返回0

二. 任务

请补全排序函数sort_kv的编码。该函数的原型如下:


void sort_kv(pair kv[], int n);

此函数的功能是:

  • 利用冒泡排序法,按照键值(注:是个字符串)的大小对长度为n的数组kv进行升序排序。

三. 测试用例
  1. 测试程序 测试程序已经写好,并保证输入的有效性。你不必自行编写。 测试程序的功能是:

  • 先读入键值对数组长度,然后依次读入键值对。

  • 调用你补全的函数sort_kv,然后如下格式输出排序结果: (键1=>值1)(键2=>值2)...(键n=>值n)

  1. 测试用例举例

  • 用例 输入


5
pear 30
apple 100
pineapple 20
orange 80
durian 10

输出


(apple=>100)(durian=>10)(orange=>80)(pear=>30)(pineapple=>20)
四. 要求
  1. 请在框架文件中完成任务。

  1. 请将你的代码写在//TODO和//END OF TODO这对标记之间。

  1. 请勿修改框架中的任何已有内容


/*
1. 本题需要的数据较多。因此,为了避免你在本地调试时反复输入,已将测试用例写在了一个数据文件q6.in中,其内容如下:
5
pear 30
apple 100
pineapple 20
orange 80
durian 10

上述数据产生的输出是:
(apple=>100)(durian=>10)(orange=>80)(pear=>30)(pineapple=>20)

2. 如果这个文件不存在,那么你就要从键盘手动输入。

3. 如果你的程序编译后是a.out,那在命令行里,你可以这样运行程序 a.out < q6.in ,避免重复从键盘输入
*/

#include <stdio.h>
#include <string.h>

typedef struct {
    char key[30];  //用字符串表示的键
    int value;     //基于简化的目的,数值的类型是int
} pair;

/*
 * 用冒泡排序法对键值对数组按键进行排序(升序)
 * 
 * 参数说明:
 *      - kv:int[],键值对数组
 *      - n:int,数组长度
 * 返回值说明:
 *      - 无
 */
void sort_kv(pair kv[], int n) {
    //TODO

    //END OF TODO
}


pair kv[128];  //kv是键值对类型的数组

static void print_kv(pair kv[], int n) {
    for (int i = 0; i < n; ++i)
        printf("(%s=>%d)", kv[i].key, kv[i].value);
    putchar('\n');
}

int main() {

    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i)
        scanf("%s%d", kv[i].key, &kv[i].value);

    sort_kv(kv, n);

    print_kv(kv, n);

    return 0;
}


声明

本文章仅供学习使用。严禁作其他用途。

更多真题可参考https://blog.csdn.net/jjq15008419406/category_11960847.html

  • 9
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谨慎谦虚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值