CSP-J入门组初赛模拟题二
二、阅读程序题
(程序输入不超过数组或字符串定义的范围,判断题正确填√错误填X;除特殊说明外,判断题 1.5分,选择题3分,共计40分)
第一题
1 #include<bits/stdc++.h>
2 using namespace std;
3 int main(){
4 string s;
5 char s1[100];
6 int len,j = 0;
7 cin >> s;
8 len = s.size();
9 memset(s1,0,sizeof(s1));
10 for(int i = 0;i < len;i++){
11 if(i % 2 == 0)
12 if((s[i] >= 'A' && s[i] < 'Z')||(s[i] >= 'a' && s[i] < 'z')){
13 s1[j] = s[i] +1;
14 ++j;
15 }
16 }
17 cout << s1 << endl;
18 return 0;
19 }
程序分析
以上程序是一个简单的字符串处理程序。程序的功能是读入一个字符串s,然后根据一定的规则将字符串处理后输出,如果字符的下标是偶数,则判断字符是否为字母,如果是字母,则将该字母后一个字母加入到数组中,并最后进行输出
判断题
1)、输出的字符串只能是字母组成
2)、若将12行的"<"改为"<=",则输出结果有可能包含数字
3)、将第9行删除,程序运行结果不会改变
4)、将第11行删除,则输出字符的长度和输入字符的长度一致
答案:1√ 2 × 3 × 4 ×
答案分析:
1、从程序分析可以得出输出的只能是字母
2、输出不可能是数字,因为数字的ASCII码值要小于字母的ASCII码
3、如果没有初始化,有可能输出的时候会出现乱码
4、如果输入的有包含非字母字符输出的长度就会更短
单选题
5)、若输入的字符串长度为10,则输出的字符串长度最长可能为
A、4
B、5
C、6
D、10
答案:B
答案分析:因为是要获取偶数位置的,且字符是字母的才加入字符数组中,题目要求输出长度最长只能是输入的偶数位置都是字母就可以得到5个,答案B
6)、若输入的字符串都是字母,则输出中可能出现
A、A
B、Z
C、a
D、以上都不对
答案:B
答案分析:因为输出的是当前字符的后一个字符,所以a和A是不可能,Z是可以,偶数位置为Y就会输出Z,答案B
第二题
1 #include<bits/stdc++.h>
2 using namespace std;
3 int main(){
4 int a[1001],i,j,t,n;
5 for(i = 0;i <= 1000;i++)
6 a[i] = 0;
7 scanf("%d",&n);
8 for(i = 1;i <= n;i++){
9 scanf("%d",&t);
10 a[t]++;
11 }
12 for(i = 1000;i >= 0;i--)
13 for(j = 1;j <= a[i];j++)
14 printf("%d",i);
15 return 0;
16 }
程序分析
该实现了对一组数字进行排序的功能,且从大到小进行排序,接下来使用一个for循环,循环n次,每次读入一个数字t,并将数组a中下标为t的元素加1,表示数字t出现的次数。
再使用两个嵌套的for循环,从数组a的最后一个元素开始,逆序遍历数组。外层的for循环控制遍历的次数,内层的for循环用来输出当前数字i的个数次数,即将数字i输出a[i]次。
判断题
1)、输入10个数字,输出结果是从小到大。
2)、若输入的数字中有两个1,则输出时出来第一个1是第一个输入的
3)、若将第13行的"<="改为"<",且输入数据为10 2 12 33 34 1 2 87 22 9 0,则输出2
4)、 若将第12行改为for(i=0;i<=1000;i++),则程序运行结果不变
答案:1× 2 ×3 √ 4 ×
答案分析:
1、从程序分析可以得出输出结果是从大到小
2、如果有两个1,输出来的第一个是第二个输入的
3、输入的2出现两次,如果改成<,所以只会输出超过出现1次的数字
4、如果改成这个,则输出结果就是从大到小
单选题
5)、 若将第12行改为for(i=1000;i>1;i--);第13行 改为for(j=a[i];j>1;j--),输入数据为5 2 12 33 34 44,则运行结果
A、不变
B、输出2 12 33 34 44
C、无输出
D、输出44 34 33 12 2
答案:C
答案分析:输入的数字都只有一次,二条件是要出现次数超过一次的数字才会有输出,所以答案C
6)、若将第10行改为++a[t]或a[t++],则输入5 1 2 3 4 5,输出结果为
A、1 2 3 4 5 或 5 4 3 2 1
B、1 2 3 4 5 或 无输出
C、5 4 3 2 1 或 5 4 3 2 1
D、5 4 3 2 1 或 无输出
答案:D
答案分析:++a[t]和a[t]++效果一样,但是a[t++]在下面输出的时候条件都不满足,所以没有输出,答案D
第三题
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=500000,INF=0x3f3f3f3f;
4 int L[maxn/2+2],R[maxn/2+2];
5 void unknown(int a[],int left,int mid,int right){
6 int n1=mid-left,n2=right-mid;
7 for(int i=0;i<n1;i++)
8 L[i]=a[left+i];
9 for(int i=0;i<n2;i++)
10 R[i]=a[mid+i];
11 L[n1]=R[n2]=INF;
12 int i=0,j=0;
13 for(int k=left;k<right;k++){
14 if (L[i]<=R[j])
15 a[k]=L[i++];
16 else
17 a[k]=R[j++];
18 }
19 }
20 void unknownsort(int a[],int n,int left,int right){
21 if(left+1<right){
22 int mid=(left+right)/2;
23 unknownsort(a,n,left,mid);
24 unknownsort(a,n,mid,right);
25 unknown(a,left,mid,right);
26 }
27 }
28 int main(){
29 int a[maxn],n;
30 cin>>n;
31 for(int i=0;i<n;i++)cin>>a[i];
32 unknownsort(a,n,0,n);
33 for(int i=0;i<n;i++){
34 if(i) cout<<" ";
35 cout<<a[i];
36 }
37 cout<<endl;
38 return 0;
39 }
程序分析
该程序是使用归并排序来对一个数组进行排序的。具体分析如下:
-
首先定义了常量maxn和INF,maxn表示数组的最大长度,INF表示一个很大的数,用来作为L和R数组的哨兵。
-
定义了一个函数unknown,该函数接受一个数组a、数组的长度n和三个下标值left、mid、right作为参数。该函数的作用是将数组a中的[left, mid)和[mid, right)两个部分进行归并排序。
-
函数unknown首先计算出两个部分的长度n1和n2,然后将数组a中的[left, mid)和[mid, right)两个部分分别复制到L和R数组中。
-
利用变量k遍历[left, right)范围内的所有元素,并根据L和R数组中的元素的大小关系将其放入数组a中。
-
接着定义了一个函数unknownsort,该函数接受一个数组a、数组的长度n和两个下标值left和right作为参数。该函数的作用是将数组a中的[left, right)范围内的元素进行归并排序。
-
在函数unknownsort中,首先判断[left, right)范围内的元素个数是否大于1,如果大于1,则计算出中间下标mid,然后递归调用unknownsort函数对[left, mid)和[mid, right)两个部分进行归并排序。最后调用unknown函数对[left, mid)和[mid, right)两个部分进行归并操作。
判斯题
1) 将第13 行的“<”改为“<=”不会改变运行结果
2) 将第 21行的“<”改为“<="不会改变运行结果
3) 此类排序方法是高效的,但是不稳定
4)将第4行的2个“+2"都去掉不会改变运行结果
答案:1 × 2 × 3 × 4 √
答案分析:
1、从程序分析可以得出如果更改了,遍历的范围就包括了right,越界了,所以错误
2、从程序分析可以得出如果更改了,left到right范围内的元素需要大于1个也就是2个以上才需要进行归并排序,如果改了之后变成1个也需要归并排序,这个就有问题,所以错误
3、归并排序的优点就是高效而且稳定,适用于大规模数据排序,所以错误
4、+2设置只是人为的给数组长度加长一点防止越界,真正实际使用的时候数据是不会越界的,所以正确
单选题
5)此题是哪种排序
A、选择排序
B、桶排序
C、归并排序
D、堆排序
答案:C
答案分析:这是非常典型的归并排序的解题方法,所以答案C
6)此题用到了()思想。
A、动态规划
B、分治
C、冒泡
D、贪心
答案:B
答案分析:归并排序使用了分治的思想。将待排序的数组分成两个子数组,分别对两个子数组进行递归排序,然后将两个已排序的子数组合并起来,得到最终的排序结果,所以答案B