CSP初赛复习(二十四)J组程序阅读题

梁老师
梁老师 北京小升初老师~

0 人点赞了该文章 · 70 浏览




  由于CSP比赛的阅读程序题并不是上机去运行程序,所以要一步步地读程序,记录相关变量值的变化情况。因为程序的运行结果只有输出语句才有输出,所以只写出输出语句的结果。有时要找出规律才能写出结果,特别是循环次数多的情况,另外要注意边界值,不能多算一步也不能少算一步。

   解决这类问题的关键在于能够分析程序的结构以及程序段的功能。常见的有列表法、画流程图法等。完成这类题目的方法和步骤如下:

1、从头到尾通读程序,大致把握程序的算法、找出这个题目的即这个程序想干什么。抓住了它,不仅得出答案变得较容易,而且对自己的结果也会比较有信心。

2、通过给程序分段、理清程序的结构和层次,达到读懂程序的目的。

3、阅读程序中特别注意跟踪主要变量的值的变化,可以用列表的方法,了解变量变化和程序的运行结果,注意发现规律。所谓列表法,就是将各变量名作为表头,在程序的执行过程中,将各变量值的变化记录在相应变量的下方。

4、按照程序中输出格式的要求,写出运行结果,并带着结果回到程序进行检查。

   在阅读程序时,要特别注意过程、函数所完成的子任务以及和主程序之间的参数传递关系。在阅读程序中,比较好的方法是首先阅读主程序,看其需要调用的过程或函数是什么,最后要求输出变量是什么;其次在阅读程序中,将较长的程序分成几个程序段(特别注意循环结构、判断结构),阅读理解各程序段的功能以及各程序之间的关联。

例:

#include<iostream>

using namespace std;

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

int solve(int x,int y)

{

int u, v;

if(x == n)

return a[x][y]; 

//递归边界:当x=5时,solve(5,y)=a[5][y]

u= solve(x + 1, y);

v= solve(x + 1, y + 1);

if(u > v)

return a[x][y] + u;

else

return a[x][y] + v; 

//用递归最终求得solve(1,1)=a[1][1]+solve(2,2)=2+12=14

int main()

{

cin>>n;

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

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

cin>>a[i][j];

cout<<solve(1,1)<<endl;

return 0;

}

输入:

5

2

-1 4

2 -1 -2

-1 6 4 0

3 2 -1 5 8

输出:  14


#include<iostream>

#include<string>

using namespace std;

int n, ans, i, j;

string s;

char get(int i)

{

if(i < n)

return s[i];

else

return s[i-n];

//i<8get(i)返回s[i]i>=8get(i)返回s[i-8],从第一个开始返回

}

int main()

{

cin>>s;

n= s.size();

ans= 0;

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

{

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

if (get(i+j) < get(ans+j))

{

ans = i;

break;

}

else if (get(i+j) > get(ans+j))

break;

}

//此循环执行完ans=7

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

cout<<get(ans+j);

//1,ans+j<8,输出s[7+0]2,ans+j=8,输出s[8-8]3,ans+j=9,输出s[9-8]……

cout<<endl;

return 0;    

}

输入:  CBBADADA

输出:  ACBBADAD


#include<iostream>

using namespace std;

int main()

{

constint SIZE = 100;

intheight[SIZE], num[SIZE], n, ans;

cin>>n;

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

cin>>height[i];

num[i] = 1;

for (int j = 0; j < i; j++) {

if ((height[j] < height[i]) && (num[j] >= num[i]))

num[i] = num[j]+1;

}

}

//两两相比,得出num[0], num[1], num[2], num[3], num[4], num[5]

ans= 0;

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

if (num[i] > ans) ans = num[i];

} 

//得出num中最大值,即在数组height中第几位数值最大

cout<<ans<<endl;

return 0;    

}

输入:

6

2  5  3  11  12  4

输出:  4


图片

图片

答案:× √ × B C C



发布于 2024-03-30 08:35

免责声明:

本文由 梁老师 原创发布于 家长帮 ,著作权归作者所有。

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论

广告
All Rights Reserved Powered BY WeCenter V4.1.0 © 2025 京ICP备20005761号-2