嵌套循环的控制变量——Ada应用实例之十三
来源:互联网 发布:查询linux是否装samba 编辑:程序博客网 时间:2024/05/17 03:21
嵌套循环的控制变量——Ada应用实例之十三
以下是解答HDU ACM 2019(判断“回文串”)的一个C程序:
(引自http://zhidao.baidu.com/question/217863132.html)
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,k;
char a[1000];
while(scanf("%d",&n)!=EOF)
{
getchar();
for(i=0;i<n;i++)
{
gets(a);
k=strlen(a);
for(i=0;i<k;i++)
{
if(a[i]!=a[k-i-1])
break;
}
if(i==k)
printf("yes/n");
if(i!=k)
printf("no/n");
}
}
return 0;
}
作者发现一个奇怪现象,当输入是:
4
hahah
haha
程序给出的输出是:
yes
yes
显然第2个输出是错的。原因是程序中2个嵌套的循环:
for(i=0;i<n;i++)
for(i=0;i<k;i++)
使用了同一个变量i来控制循环。以下分析出错过程:
a) 处理第1个输入“hahah”,内层循环“for(i=0;i<k;i++)”结束后i的值是5;
b) 执行外层循环“for(i=0;i<n;i++)”的判断条件“i<n”,结果为假,退出循环;
c) 执行“while(scanf("%d",&n)!=EOF)”,由于此时输入是“haha”,未能读入;
d) 执行“getchar()”,读入‘h’;
e) 执行gets(a),读入“aha”,这是回文串,所以输出“yes”。
变量i是在main中声明的,因此它的作用域包含2个嵌套的循环。如果在外层循环与内层循环之间再声明一个变量i,就可以避免混淆问题:
for(i=0;i<n;i++)
{
int i;
不过还是把外层循环改用另一个循环变量(例如,j),程序的可读性较好。
如果用Ada编写这个程序,就不会出现混淆问题。Ada的for循环的控制变量有如下特点:
a) 它是隐含声明的;
b) 它的作用域限于该循环体;
c) 出了该循环体它就不存在了;
d) 编程者不能对它修改;
e) 它的值域是离散的。
以下例子中2个循环控制变量i虽然同名,但有各自的作用域:
with Text_IO; use Text_IO;
procedure main is
begin
for i in 1 .. 2
loop
put_line ("External i = " & Integer'Image (i));
for i in 1 .. 2
loop
put_line ("Inner i = " & Integer'Image (i));
end loop;
end loop;
end main;
该程序输出:
External i = 1
Inner i = 1
Inner i = 2
External i = 2
Inner i = 1
Inner i = 2
- 嵌套循环的控制变量——Ada应用实例之十三
- 全局变量的初值——Ada应用实例之七
- 数组下标越界——Ada应用实例之三
- 结构体扩展——Ada应用实例之五
- 赋值表达式——Ada应用实例之十一
- 动态分配内存——Ada应用实例之十二
- 平衡二叉树的节点搜索函数——Ada应用实例之四
- 函数strspn的实现——Ada应用实例之八
- 数组的指定初始化——Ada应用实例之九
- 数学函数的异常捕获——Ada应用实例之十
- 简易计算器设计中的一个数据结构问题——Ada应用实例之二
- 枚举型自加——Ada应用实例之六
- 稳定婚姻的求解程序——Ada应用实例之一
- UGUI—Slider控制变量
- 循环嵌套的应用
- 循环嵌套的应用
- 4.5 for 语句的循环控制变量
- 【java解惑】整型溢出的循环控制变量
- String介绍
- debian 基础拾零
- 简单的说一下广搜算法,带个例题NYOJ115 城市平乱。
- this关键字
- 集合
- 嵌套循环的控制变量——Ada应用实例之十三
- 内部类
- 设计模式
- 进程通信之飞鸽传书2007绿色版
- 异常
- Myeclipse的快捷键
- Myeclipse的快捷键
- 当星巴克不再是咖啡
- 生日悖论问题——《算法导论学习笔记》