2023年05月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

2023年05月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试_第1张图片

第1题:数字放大

给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。
时间限制:1000
内存限制:65536
输入
包含三行: 第一行为N,表示整数序列的长度(N ≤ 100); 第二行为N个整数(不超过整型范围),整数之间以一个空格分开; 第三行包含一个整数(不超过整型范围),为指定的整数x。
输出
N个整数,为原序列放大之后的序列,整数之间以一个空格分开。
样例输入
3
1 5 7
2
样例输出
2 10 14

解题思路如下:

(1)首先,我们需要读取输入的整数序列的长度N,以及N个整数和放大倍数x。可以使用scanf函数来实现,根据题目要求使用适当的格式说明符读取输入。

(2)接下来,我们需要遍历整数序列,将每个整数放大x倍后输出。可以使用一个循环来遍历整数序列,并使用printf函数将放大后的整数输出。

(3)在循环中,我们可以使用乘法运算将每个整数放大x倍。将放大后的整数输出后,再输出一个空格。

以下是使用上述思路编写的C程序:

#include 

int main() {
    int N;
    int sequence[100];
    int x;

    // 读取整数序列的长度N
    scanf("%d", &N);

    // 读取N个整数
    for (int i = 0; i < N; i++) {
        scanf("%d", &sequence[i]);
    }

    // 读取放大倍数x
    scanf("%d", &x);

    // 输出放大后的整数序列
    for (int i = 0; i < N; i++) {
        printf("%d ", sequence[i] * x);
    }

    printf("\n");

    return 0;
}

通过以上步骤,我们可以输入整数序列的长度N、N个整数和放大倍数x,并将整数序列中的每个整数放大x倍后输出。每个整数之间以一个空格分隔。

第2题:单词倒排

编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。
时间限制:10000
内存限制:65536
输入
输入为一个字符串(字符串长度至多为100)。
输出
输出为按要求排序后的字符串。
样例输入
I am a student
样例输出
student a am I

解题思路如下:

(1)首先,我们需要读取输入的字符串,即一行英文。

(2)接下来,我们需要对字符串进行处理,将所有单词的顺序倒排。

(3)可以使用字符串处理函数和循环来实现这个过程。我们可以使用strtok函数将字符串拆分为单词,并将每个单词存储在一个数组中。

(4)然后,我们可以从数组的最后一个单词开始,依次输出每个单词。在输出单词时,我们可以使用printf函数,并在单词之间输出一个空格。

以下是使用上述思路编写的C程序:

#include 
#include 

int main() {
    char sentence[100];
    char words[100][100];
    int word_count = 0;

    // 读取输入的字符串
    gets(sentence);

    // 使用strtok函数将字符串拆分为单词
    char* word = strtok(sentence, " ");
    while (word != NULL) {
        strcpy(words[word_count], word);
        word_count++;
        word = strtok(NULL, " ");
    }

    // 倒序输出单词
    for (int i = word_count - 1; i >= 0; i--) {
        printf("%s ", words[i]);
    }

    printf("\n");

    return 0;
}

注意:由于gets()函数在C11标准中被废弃,因此在某些编译器中可能会出现警告。可以使用fgets()函数来代替gets()函数。

通过以上步骤,我们可以输入一行英文字符串,并将所有单词的顺序倒排后输出。每个单词之间以一个空格分隔。注意在读取输入字符串和输出结果时,要确保数组的大小足够大,以避免溢出。

第3题:计算矩阵边缘元素之和

所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
时间限制:10000
内存限制:65536
输入
第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以一个空格分开。 接下来输入的m行数据中,每行包含n个整数,整数之间以一个空格分开。
输出
输出对应矩阵的边缘元素和
样例输入
3 3
3 4 1
3 7 1
2 0 1
样例输出
15

解题思路如下:

(1)首先,我们需要读取输入的矩阵的行数m和列数n,以及矩阵的数据。

(2)接下来,我们需要计算矩阵的边缘元素之和。根据题目描述,边缘元素包括第一行和最后一行的元素,以及第一列和最后一列的元素。我们可以使用循环来遍历矩阵的边缘元素,并将其累加到一个变量中。

(3)我们定义一个变量sum来存储边缘元素之和,初始值为0。然后,使用两个嵌套的循环来遍历矩阵的元素。

(4)在循环中,我们判断当前元素是否位于矩阵的边缘。如果是,则将其累加到sum变量中。

(5)最后,输出sum变量的值,即边缘元素之和。

以下是使用上述思路编写的C程序:

#include 

int main() {
    int m, n;
    int matrix[100][100];
    int sum = 0;

    // 读取矩阵的行数和列数
    scanf("%d %d", &m, &n);

    // 读取矩阵的数据
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }

    // 计算边缘元素之和
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (i == 0 || i == m - 1 || j == 0 || j == n - 1) {
                sum += matrix[i][j];
            }
        }
    }

    // 输出边缘元素之和
    printf("%d\n", sum);

    return 0;
}

通过以上步骤,我们可以输入矩阵的行数、列数和数据,并计算矩阵的边缘元素之和,最后输出和的值。

第4题:奇数单增序列

给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。
时间限制:1000
内存限制:65536
输入
共2行: 第1行为 N; 第2行为 N 个正整数,其间用空格间隔。
输出
增序输出的奇数序列,数据之间以逗号间隔。数据保证至少有一个奇数。
样例输入
10
1 3 2 6 5 4 9 8 7 10
样例输出
1,3,5,7,9

解题思路如下:

(1)读取输入:首先,从标准输入读取序列的长度N。然后,使用一个数组存储这个序列的元素。

(2)提取奇数:遍历输入的序列,对于每个元素,判断是否为奇数(通过取模运算判断是否能被2整除)。如果是奇数,则将其存储在另一个数组(oddArr)中,并增加计数器count的值。

(3)排序奇数序列:使用冒泡排序算法对奇数序列进行升序排序。在这个例子中,我们使用了简单的冒泡排序算法,但你也可以使用其他更高效的排序算法。

(4)输出奇数序列:遍历排序后的奇数序列数组,并按照要求的格式输出。每个奇数后面输出一个逗号,除了最后一个奇数。

下面是解决该问题的C语言代码示例:

#include 

void oddIncreasingSequence(int arr[], int N) {
    int oddArr[500]; // 存储奇数序列的数组
    int count = 0; // 记录奇数个数

    // 遍历原始序列,将奇数存入oddArr数组
    for (int i = 0; i < N; i++) {
        if (arr[i] % 2 != 0) {
            oddArr[count] = arr[i];
            count++;
        }
    }

    // 使用冒泡排序对奇数序列进行升序排序
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - i - 1; j++) {
            if (oddArr[j] > oddArr[j + 1]) {
                int temp = oddArr[j];
                oddArr[j] = oddArr[j + 1];
                oddArr[j + 1] = temp;
            }
        }
    }

    // 输出奇数序列
    for (int i = 0; i < count; i++) {
        printf("%d", oddArr[i]);
        if (i != count - 1) {
            printf(",");
        }
    }
}

int main() {
    int N;
    scanf("%d", &N); // 输入序列长度

    int arr[500];
    for (int i = 0; i < N; i++) {
        scanf("%d", &arr[i]); // 输入正整数序列
    }

    oddIncreasingSequence(arr, N);

    return 0;
}

通过以上步骤,我们可以得到按升序排列的奇数序列,并按照要求的格式输出。

第5题:实数加法

求两个实数相加的和。
题目中输入输出里出现的浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj。对于整数部分,P1P2…Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。
时间限制:1000
内存限制:65536
输入
2行,每行是一个加数。每个加数的长度不超过100。
输出
一行,即相应的和。输出保证一定是一个小数部分不为0的实数。
样例输入
0.111111111111111111111111111111
0.111111111111111111111111111111
样例输出
0.222222222222222222222222222222

解题思路如下:

(1)读取输入:首先,从标准输入读取两个加数,分别存储在num1num2数组中。

(2)实数相加:从小数点后一位开始逐位相加,同时跟踪进位。将每一位的和存储在一个结果数组中。

(3)反转结果数组:由于是从小数点后一位开始相加,所以得到的结果数组是反向的,我们需要将其反转,得到正确的结果。

(4)添加小数点和整数部分0:在结果数组的最后添加小数点和整数部分0,使其成为一个小数。

(5)输出结果:将结果数组打印到标准输出。

下面是解决该问题的C语言代码示例:

#include 
#include 

void addRealNumbers(char num1[], char num2[], char result[]) {
    int len1 = strlen(num1); // 加数1的长度
    int len2 = strlen(num2); // 加数2的长度
    int maxLen = (len1 > len2) ? len1 : len2; // 获取较长的长度

    int carry = 0; // 进位
    int index = 0; // 结果数组的索引

    // 从小数点后一位开始逐位相加
    for (int i = maxLen - 1; i >= 0; i--) {
        int digit1 = (i >= (len1 - 2)) ? num1[i + 1] - '0' : 0; // 获取加数1的当前位数
        int digit2 = (i >= (len2 - 2)) ? num2[i + 1] - '0' : 0; // 获取加数2的当前位数

        int sum = digit1 + digit2 + carry; // 相加结果

        result[index] = sum % 10 + '0'; // 将个位数存入结果数组
        index++;

        carry = sum / 10; // 更新进位
    }

    // 如果最后还有进位,将其存入结果数组
    if (carry > 0) {
        result[index] = carry + '0';
        index++;
    }

    // 反转结果数组
    for (int i = 0; i < index / 2; i++) {
        char temp = result[i];
        result[i] = result[index - i - 1];
        result[index - i - 1] = temp;
    }

    // 添加小数点和整数部分0
    result[index] = '.';
    result[index + 1] = '0';
    result[index + 2] = '\0';
}

int main() {
    char num1[102]; // 存储加数1
    char num2[102]; // 存储加数2
    char result[105]; // 存储结果

    scanf("%s", num1); // 输入加数1
    scanf("%s", num2); // 输入加数2

    addRealNumbers(num1, num2, result); // 相加

    printf("%s\n", result); // 输出结果

    return 0;
}

通过以上步骤,我们可以得到两个实数相加的和,并按要求的格式输出。

你可能感兴趣的:(C/C++等级考试历届真题解析,c语言,c++,算法,电子学会,等级考试)