阅读程序写结果之进阶篇(c语言版)
读程序写结果之进阶篇
上一讲,我们就“读程序写结果”解题的一般方法,做了个简单的探讨与总结。本讲,我们共同来研究两个特例:有关“字符(串)的操作与递归调用。
技巧五:字符串的处理
字符串操作,无论是NOIP初赛还是复赛,近些年来,频频出现,非常明确地提醒了选手,在准备NOIP竞赛时,必须充分地重视并认真彻底地把字符(串)操作了解清楚。
在c/c++中,有关字符的类型有两种:char、string。特别要注意类型string与字符数组的异同点:(假设变量说明为:stringa;charb[100];)
相同点:都可以用下标变量(形如a[i]、b[i])进行访问。
有关字符(串)的函数与过程,请参阅“基础篇”。值得一提的是,常用字符的ASCII码为(括号内为ASCII码,从小到大排列):…’0’(30H)…’9’…’A’(41H)…’Z’…’a’(61H)…’z’…
对字符(串)的处理,要求选手能结合字符(串)有关知识,灵活使用前面讲过的技巧。以下选例说明字符(串)操作在“读程序写结果”中的应用。
[选例八NOIP2008提高组第四题]
1#include<stdio.h>
2#include<stdlib.h>
3#include<string.h>
4inti,j,len;
5chars[50];
6intmain()
7{
8scanf("%s",s);
9len=strlen(s);
10for(i=0;i<len;++i)
11{
12if(s[i]>='A'&&s[i]<='Z')s[i]-='A'-'a';
13}
14for(i=0;i<len;++i)
15{
16if(s[i]<'x')s[i]+=3;elses[i]+=-23;
17}
18printf("%s/",s);
19for(j=1;j<4;j++)
20{
21for(i=0;i<len-j;i=i+j)
22{
23s[i]=s[i+j];
24}
25}
26printf("%s\n",s);
27/*
28输入:ABCDEFGuvwxyz
29*/
30system("pause");
31return0;
32}
输入:ABCDEFGuvwxyz
输出:____________
[解析]:应该算基础题。程序有点长,我们可以根据结构分为以下几个程序段进行分析:第10至13行:这个循环是依次判断字符是否为大写字母,若是,则改为小写。执行后s的值为:abcdefguvwxyz;
第14至17行:注意分界点(对比对象)是字母’x’,运算后,s为:defghijxyzabc第18行:输出:defghijxyzabc/
第19至25行:循环递变,j的值比较小,直接列表模拟!注意15行:变量i的步长。变量j
递变前的s
递变后的s
实现功能1defghijxyzabcefghijxyzabcc依次移位2efghijxyzabccgfihxjzybaccc奇数位移位3gfihxjzybaccchfizxjaybcccc1 4 7 10 13
第21行:输出:hfizxjaybcccc
虽然本程序给人第一感觉:程序长、似乎挺难的,但经过简单的分割处理,可以看出,每个程序段的功能都是显而易见的。“一切反动派都是纸老虎”!在战略上可以藐视这类题,但在战术上应该重视细节。克服长程序给人的心理压力,沉下心来,仔细分析,认真运算,一切就迎刃而解。
[选例九]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20{gets(str);inttemp1;n=0;while(1){i=(strchr(str,'')-str>0)?strchr(str,'')-str:0;n=n+1;if(i>0){temp1=0;a[n][0]=n+64;while(temp1<=i-1){a[n][temp1++]=str[temp1];}a[n][i]='\0';//
#include<stdlib.h>#include<stdio.h>#include<string.h>intn,i,j;charstr[200];chara[22][200];intt1,t2,code;intmain()
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57{;}}temp1=i+1;while(str[temp1]!=0){str[temp1-i-1]=str[temp1++];};str[temp1-i-1]=0;}else{temp1=0;a[n][0]=n+64;while(str[temp1]!=0)a[n][temp1++]=str[temp1];str[temp1]=a[n][temp1]='\0';str[0]='\0';break;}for(i=1;i<=n-1;i++)for(j=1;j<=n-i;j++){charstrtemp[200];strtemp[0]=0;strcat(strtemp,a[j]);strcat(strtemp,a[j+1]);sscanf(strtemp,"%d",&t1);//将strtemp转成整数strtemp[0]=0;strcat(strtemp,a[j+1]);strcat(strtemp,a[j]);sscanf(strtemp,"%d",&t2);if(t1<t2){strcpy(a[21],a[j]);strcpy(a[j],a[j+1]);strcpy(a[j+1],a[21]);;}//a[21]作临时存储空间for(i=1;i<=n;i++)for(inttemp=0;temp<strlen(a[i]);temp++)printf("%c",a[i][temp]);}printf("\n");system("pause");return0;}
输入:9334321
程序运行的结果是:
[解析]这题用到的字符(串)子程序比较多,有需要的,请参阅“基础篇”。
while(1)构成循环的功能是什么呢?第13行,取空格的位置;继而,如果空格存在
的话,把空格前的字符串赋予a[n],并在串str中把至空格为止的字符全部删除;若空格不存在,则把str赋予a[n],令str为空串。所以,实际上,它是以空格为分隔,把各数字字串,分别置于数组a中,即a={'9'、'3','34','321'}。
第34到48行,冒泡排序经典程序段,不同的是,大小的评价标准不一样。它是以相邻两数字字串连接在一起的数值大小为衡量标准。以a[j]='3'、a[j+1]='34'为例,执行完第40、44行的语句后可求得t1=334、t2=343,由于t1<t2,交换a[j]、a[j+1]。这样从“大”到“小”排列后依次输出结果:9343321。
也即,输出由这些数字字串排列生成的最大数值。
技巧六:子程序调用
在处理子程序调用时,应注意参数的传递,特别是区分值参与变参。如果存在全程变量与局部变量交叉使用时,要注意变量的作用域。必须清楚,只有在调用的子程序完全执行....完毕..,才能返回调用该子程序的程序中继续执行。
递归调用是子程序调用的重点,也是难点。如何有效正确计算递归程序的结果呢,下面举几个例子说明一下:
[选例十]
#include<stdio.h>
#include<stdlib.h>
voidw(intnum)
{
if(num>=14)w(num/14);
printf("%d\n",num);
}
intmain()
{
w(2009);
system("pause");
return0;
}
程序运行的结果是:
[解析]具体执行过程如下:(注意箭号顺序)三个printf语句,依次输出:101432009
本例应用大括号的方式全部展开递归调用的过程,只要谨记所调用的子程序执行完毕方能返回调用该子程序的程序中继续执行,严格把关语句的执行顺序就可以了。
只是,很多时候,我们没法,或者很难手工全部展开递归的详细过程,这时,一般可以采用“自底向上”,从递归边界出发,递推出结果。如:
[选例十一]
#include<stdio.h>
#include<stdlib.h> w(143)
)45
ints(intn,intk)
{
if((n==k)||(k==1))return1;
else
相关推荐:
- [高等教育]一年级家长课程教案
- [高等教育]封丘县人民医院深入推进纠正医药购销领
- [高等教育]2017年6月大学英语四级真题试卷及答案(
- [高等教育]2017年北京第二外国语学院文学院824中
- [高等教育]7 高中历史第7单元1861年俄国农奴制改
- [高等教育]【K12学习】4、实际测量-苏教版六年级
- [高等教育]药具培训试卷题库及部分参考答案
- [高等教育]本土电子元器件目录分销商如何赢得生意
- [高等教育]七年级岭南版美术教案
- [高等教育]书作文之书法活动通讯稿
- [高等教育]Endnote X 软件使用入门和用法总结(LS)
- [高等教育]嵌入式系统的现状及发展状况
- [高等教育]2012抗菌药物专项整治活动方案解读
- [高等教育]人教版新课本一年级数学下册期末试卷
- [高等教育]爱课程民法学观后感
- [高等教育]930机组使用说明书1
- [高等教育]煤气设备设施点检标准
- [高等教育]常见室内观叶植物图解
- [高等教育]312党员群众路线心得体会
- [高等教育]小学信息(苗版)第一册全册教案
- 在市---局2010党建大会上的讲话
- 《科哲》提纲及补充阅读材料(2010.7)
- 苏州高博软件技术职业学院论文开题报告
- 兼职导游管理的困境及对策探讨
- 基于通用设计理念的现代厨房产品语义研
- 康乐一中2010年至2011年度鼓号队、花束
- 第10章_数据收集整理与描述_期末复习课
- 2008年黑龙江林甸商贸购物中心营销策划
- 水硬度的测定实验报告
- 五分钟教你拍摄夜景光绘照
- 2014年临床妇产科三基三严试题及答案
- 0第二课 纾解压力第一站了解压力
- 解析建筑工程电气设备安装施工技术要点
- 地方性应用型本科高校“双师型”师资队
- 高考语文专题复习课件:小说阅读指导
- 装饰工程投标书2
- 大学生就业难问题探讨及对策
- English and Its History
- 青岛市城市房屋修缮工程质量监督管理办
- 初中英语形容词和副词的用法和练习题




