image

编辑人: 浅唱

calendar2025-12-08

message1

visits311

2023年05月C语言二级答案及解析

一、编程题

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

3
1 5 7
2

样例输出

2 10 14

提示
注意答案的数据范围

参考答案:

include <bits/stdc++.h>

using namespace std;

int main()

{

int a[100],n,i,x;

cin>>n;

for(i=1;i<=n;i++)

cin>>a[i];

cin>>x;

for(i=1;i<=n;i++)

cout<<a[i]*x<<" ";

}

解析:【喵呜刷题小喵解析】:这个题目要求将给定的整数序列中的每个整数放大x倍后输出。首先,我们定义了一个整数数组a[100]来存储输入的整数序列,变量n表示整数序列的长度,变量i用于循环,变量x表示放大的倍数。接着,我们通过cin语句读取n的值,然后通过循环读取整数序列中的每个整数,并存储在数组a中。然后,我们通过cin语句读取放大的倍数x。最后,我们通过循环将数组a中的每个整数放大x倍,并通过cout语句输出放大后的序列。注意,在读取输入时,我们使用i从0开始循环,而不是从1开始。这是因为在C++中,数组下标是从0开始的,所以我们应该从0开始循环。另外,我们在输出时,需要在每个整数后面加上一个空格,以便将每个整数分开。最后,我们在程序末尾添加了return 0语句,表示程序正常结束。

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

I am a student

样例输出

student a am I

参考答案:

include <bits/stdc++.h>

void flashback(char a[], int j, int p); //倒序函数

int main(void)

{

char a[10000];

int j, i, k, end;

char temp;

gets(a);

end = strlen(a)-1 ;

for (i = 0; i < end+1; i++) //先处理特殊符号

if (!isalpha(a[i])) //非字母将第一个符号替换为’ ’

{

a[i]=’ ’;

j=0; //j用来记录连续特殊带符号的个数

if(i==0) //如果是首字符 删除他

{

for(k=1;k<=end-1;k++)

a[k]=a[k+1];

a[k]=‘\0’;

}

else k=i+1; //k为特殊符号后的下一字符

while (!isalpha(a[i])&&i<(end+1))

{

i++;

j++;

}

j–;

if(i==(end+1) ) //如果特殊字符结尾,截断字符串

a[k-1]=‘\0’;

else {

for(k=1;k<=end-j;k++) //通过搬移数组去除掉连续的特殊字符

a[k] = a[k + j];

a[k] = ‘\0’;

}

end=strlen(a)-1;

}

flashback(a, 0, end); //句子倒序

for (i = 0; i < end; i++)

if (!isspace(a[i]) && i < end) {

j = i++;

while (!isspace(a[i]) && i < end)

i++;

if (i < end) k = –i;

else k = end;

flashback(a, j, k);

}

puts(a);

}

void flashback(char a[], int j, int p)

{

int i;

char temp;

for (i = j; i < p; i++, p–)

{

temp = a[p];

a[p] = a[i];

a[i] = temp;

}

}

解析:【喵呜刷题小喵解析】:本题要求将输入的英文字符串中的单词倒序排列。首先,我们需要处理字符串中的特殊字符,将它们替换为空格,并去除连续的特殊字符。然后,我们可以将字符串整体倒序,并再次遍历字符串,将每个单词也倒序。在处理特殊字符时,我们遍历字符串,遇到非字母字符就将其替换为空格,并统计连续非字母字符的个数。如果第一个字符就是非字母字符,我们就将其删除。如果最后一个字符是非字母字符,我们就截断字符串。否则,我们就通过搬移数组去除掉连续的非字母字符。在将字符串整体倒序时,我们定义了一个reverse函数,用于交换字符串中两个位置的字符。在主函数中,我们调用该函数将字符串整体倒序。在将每个单词也倒序时,我们再次遍历字符串,遇到非空格字符就将其后面的空格字符之前的所有字符倒序。这样,我们就得到了倒序排列的字符串。需要注意的是,本题的时间限制和内存限制较宽松,因此我们可以使用C++标准库中的函数来简化代码。例如,我们可以使用cin和cout来读取和输出字符串,使用strlen函数来获取字符串的长度,使用isalpha和isspace函数来判断字符是否为字母或空格,使用swap函数来交换两个位置的字符。这些函数都可以提高代码的可读性和可维护性。

3、

计算矩阵边缘元素之和

输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。

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

3 3
3 4 1
3 7 1
2 0 1

样例输出

15

参考答案:

include<stdio.h>

include<stdlib.h>

int main()

{

int m,n;//矩阵的长和宽

int sum = 0;

printf(“输入矩阵的长和宽\n”);

scanf(“%d%d”,&m,&n);

int a[m][n];//存储矩阵的值

//为矩阵赋值

for(int i=0;i<m;i++)

{

for(int j=0;j<n;j++)

{

scanf(“%d”,&a[i][j]);

}

}

//打印矩阵

for(int i=0;i<m;i++)

{

for(int j=0;j<n;j++)

{

printf(“%d\t”,a[i][j]);

}

printf(“\n”);

}

//计算首尾两行:行的话就是第一行a[0][?],最后一行a[m-1][?] ,然后以列循环求和0-n

for(int i=0;i<n;i++)

{

sum = sum+a[0][i]+a[m-1][i];

}

//计算首尾两列:列的话就是第一列a[?][0],最后一列a[?][n-1],然后以行循环求和1-n-1,注意要去掉第一行和最后以行,不然重计算

for(int j=1;j<m-1;j++)

{

sum = sum+a[j][0]+a[j][n-1];

}

printf(“矩阵边缘元素之和sum=%d\n”,sum);

return 0;

}

解析:【喵呜刷题小喵解析】:首先,我们需要包含必要的头文件,即`#include`,用于输入输出操作。在`main()`函数中,我们定义了两个整数变量`m`和`n`,分别表示矩阵的行数和列数。同时,我们定义了一个整数变量`sum`,用于存储矩阵边缘元素的和。接下来,我们使用`printf()`函数输出提示信息,要求用户输入矩阵的长和宽。然后,使用`scanf()`函数读取用户输入的矩阵的长和宽,并将它们存储在变量`m`和`n`中。然后,我们定义了一个二维数组`a[m][n]`,用于存储矩阵的值。接下来,我们使用两个嵌套的`for`循环,读取用户输入的矩阵中的每个元素,并将它们存储在数组`a`中。然后,我们使用两个嵌套的`for`循环,分别计算矩阵的首尾两行和首尾两列的元素之和,并将它们累加到变量`sum`中。最后,我们使用`printf()`函数输出矩阵边缘元素的和,即变量`sum`的值。需要注意的是,在计算首尾两列的元素之和时,我们使用了`j=1`和`j

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

参考答案:

include<stdio.h>

int main()

{

int n,i,f,t,m,j=0,a[500];

scanf(“%d”,&n);

for(int i=0;i<n;i++)

{

scanf(“%d”,&m);

if(m%2==1) //判断所输入的数据是否为奇数,若为奇数就把数存入到一维数组a[]中;

{

a[j]=m;

j++; //用j来判断数组内的元素个数。

}

}

for(i=0;i<j-1;i++) //使用冒泡排序的方法对一维数组进行排序

{

int q=0;

for(f=0;f<j-i-1;f++)

{

if(a[f]>a[f+1])

{

t=a[f];

a[f]=a[f+1];

a[f+1]=t;

}

}

}

if(j==1) //需要考虑数组内数据只有一个数据时的情况。

printf(“%d”,a[0]);

else //数组内的数据大于一时。

{

for(i=0;i<j-1;i++)

{

printf(“%d,”,a[i]);

}

if(j>=2)

{

printf(“%d”,a[j-1]);

}

}

//在刚开始没有考虑数组数值为一的情况;造成一直显示结果错误!

return 0;

}

解析:【喵呜刷题小喵解析】:首先,程序通过`scanf`函数读取输入的正整数序列的长度`n`。然后,程序使用一个循环来读取序列中的每个数字,并检查它是否为奇数。如果是奇数,程序将其存储在数组`a`中,并增加计数器`j`。然后,程序使用冒泡排序算法对数组`a`进行排序。冒泡排序是一种简单的排序算法,它通过重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。最后,程序检查数组`a`中的元素数量。如果只有一个元素,程序直接打印该元素。否则,程序打印数组`a`中的所有元素,并在每个元素之间插入逗号。在打印最后一个元素时,程序不打印逗号。这个程序使用了C语言的基本语法和库函数,如`scanf`、`printf`和数组操作。同时,程序也使用了条件语句和循环结构来控制程序的流程。这个程序能够正确地读取输入的正整数序列,提取其中的奇数,并按升序输出。程序的时间复杂度和空间复杂度都是O(n),其中n是输入序列的长度。

5、实数加法
求两个实数相加的和。

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

0.111111111111111111111111111111
0.111111111111111111111111111111

样例输出

0.222222222222222222222222222222

参考答案:

include<iostream>

include<string>

include<algorithm>

using namespace std;

int main()

{

string a,b;

int j=0;

int m,n;

string ax,ay,bx,by;

cin>>a;

cin>>b;

int x=a.find(“.”);

int y=b.find(“.”);

ax=a.substr(0,x);

ay=a.substr(x+1);

bx=b.substr(0,y);

by=b.substr(y+1);//将整数小数分离开

if(ax.size()>bx.size())

m=ax.size();//找到最大位数

else

m=bx.size();

if(by.size()>ay.size())

n=by.size();

else

n=ay.size();

while(ax.size()!=m)

ax=“0”+ax;//整数部分补0(在前面补)

while(bx.size()!=m)

bx=“0”+bx;

while(ay.size()!=n)

ay+=“0”;//小数补0(在后面补)

while(by.size()!=n)

by+=“0”;

int k=0;

string zheng=““,xiao=””;

for(int i=n-1;i>=0;i–)//注意要倒序

{

xiao+=((k+(ay[i]-‘0’)+(by[i]-‘0’))%10+‘0’);//k起到进位的作用

k=(k+(ay[i]-‘0’)+(by[i]-‘0’))/10;//进几

}

for(int i=m-1;i>=0;i–)

{

zheng+=((k+(ax[i]-‘0’)+(bx[i]-‘0’))%10+‘0’);

k=(k+(ax[i]-‘0’)+(bx[i]-‘0’))/10;

}

if(k!=0)

zheng+=k+‘0’;

int c;

for (c=0;c<xiao.length();c++)

if (xiao[c] != ‘0’)

break;//去掉小数部分0

reverse(zheng.begin(), zheng.end());//将整数部分倒序

cout << zheng << “.”;

for (int i = xiao.length() - 1; i>=c; i–)//也可以用reverse

cout << xiao[i];

cout << endl;

}

解析:【喵呜刷题小喵解析】:这是一个涉及浮点数加法的问题。对于两个实数相加,整数部分和小数部分需要分开处理。首先,我们需要将输入的字符串形式的实数分割成整数部分和小数部分。然后,我们需要对整数部分和小数部分进行对齐,即在小数点后的位数少的数前面补0,使其与位数多的数对齐。接着,我们需要对整数部分和小数部分进行相加。对于小数部分,由于每一位上的数字相加可能会产生进位,我们需要记录进位值,并在下一位相加时加上。最后,我们需要将相加后的结果输出。整数部分和小数部分需要倒序输出,因为我们是从低位开始相加的。在输出小数部分时,我们需要去掉前导的0。注意,这个答案中使用了字符串来处理实数,这样可以避免浮点数精度问题。同时,由于题目要求输出的小数部分不为0,所以在输出小数部分时,我们只需要输出从非0位开始到小数点后的所有位。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2023年05月C语言二级答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share