嵌套循环的控制变量——Ada应用实例之十三

原创 2011年01月21日 21:39:00

嵌套循环的控制变量——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编写这个程序,就不会出现混淆问题。Adafor循环的控制变量有如下特点:

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

相关文章推荐

几个C#嵌套循环的小例子

  • 2010年08月12日 15:36
  • 183KB
  • 下载

oracle嵌套循环的执行计划优化

嵌套循环连接处理的两个数据集被称为外部循环(outer loop,也就是驱动数据源,driving row soulce )和内部循环〔 inner loop )。外部循环为左子节点,内部循环为右子节...

oracle嵌套循环的执行计划优化

嵌套循环连接处理的两个数据集被称为外部循环(outer loop,也就是驱动数据源,driving row soulce )和内部循环〔 inner loop )。外部循环为左子节点,内部循环为右子节...

【Java学习之路】Java编程之嵌套循环的使用

使用嵌套循环打印矩形、平行四边形、等腰三角形、菱形

for循环的基本应用 嵌套循环 do while循环 和while循环的区别 面试题

day for循环for循环与do-while 循环do - while循环 do …while循环的语法 do{ 循环体; }while(); //此处有一个分号!!! 注意...

AngularJS ng-repeat嵌套循环中,如何取得外层循环的索引值

下面,笔者给大家提供一种讨巧的方法来实现

三种循环结构打印直角三角形(嵌套循环的使用)

程序流程控制主要包括三种,分别为判断结构、选择结构以及循环结构,今天要讲的是循环结构,其中循环结构有:while、do...while以及for循环。如何通过循环结构来打印指直角三角形呢?这就涉及到了...

动态分配内存——Ada应用实例之十二

Ada易于避免动态分配内存相关的错误。

for标签之嵌套循环实例精选

接上一篇,轻开B2C电子商务网站用嵌套循环定制展示商品的实例。目的:在一页中显示最多十八件商品,每行显示三件。实现:主循环从0到@{list:getLength}(书包list的长度),步长为step...
  • tx18
  • tx18
  • 2015年02月15日 09:14
  • 1230
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌套循环的控制变量——Ada应用实例之十三
举报原因:
原因补充:

(最多只允许输入30个字)