嵌套循环的控制变量——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

Ada 语言在军工行业的应用

Ada语言在军工领域得到了广泛的应用,
  • robertsong2004
  • robertsong2004
  • 2014年07月27日 17:41
  • 1300

Ada语言与传统C语言的异同

1. 概述 C语言是目前使用最为广泛的高级程序设计语言,几乎全部的操作系统、大多数中小型应用软件,是用C语言开发而成。C语言提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何...
  • hsluoyc
  • hsluoyc
  • 2015年05月14日 19:08
  • 2943

C语言循环的嵌套

注:参考网络资源拟制,如雷同请见谅 循环的嵌套: 一个循环体语句中又包含另一个循环语句,称为循环嵌套。 嵌套注意事项: 1.使用循环嵌套时,内层循环和外层循环的循环控制变量不能相同。 2.循...
  • jlxuqiang
  • jlxuqiang
  • 2013年04月16日 15:55
  • 8824

for循环嵌套的两种用法

主要有两种类型的for循环嵌套,下面来介绍这两种类型循环嵌套的用法以及事例。 一:内外循环独立进行 #include void main() { int i,j; char a[5]=...
  • qq_14936041
  • qq_14936041
  • 2016年10月29日 19:09
  • 15859

for循环嵌套 简单优化

1 案例描述  某日,在JavaEye上看到一道面试题,题目是这样的:请对以下的代码进行优化  Java代码   for (int i = 0; i 1000; i++)  ...
  • Swimmy_GY
  • Swimmy_GY
  • 2016年03月22日 10:51
  • 2908

for语句嵌套循环使用

案例: 要求:输出“*”组成的几行几列拼成的长方形和三角形; 分析:输出的应该是单个*组成的图形,所以要考虑到每行每列的*个数 1.要想组成三行四列的长方形图形;     则需要每行先排好四个*,再连...
  • zlcmanong
  • zlcmanong
  • 2017年05月20日 09:47
  • 1003

for循环嵌套的几种有意思的图形

for循环嵌套用我自己的大白话来说就是一个外圈的for程序里面一个套着一个小的for程序,如果在范围内就来回运行计算,超出了就跳出等待了,反正就是各种for的包含运行差不多的样子(个人见解,有错请纠正...
  • qq_24341965
  • qq_24341965
  • 2017年08月03日 10:45
  • 239

js循环语句与循环嵌套

循环辅助语句 break 跳出所在的switck或循环结构 var n = Number(prompt("")); var m =Math.ceil(Math.sqrt(n));//根据数学...
  • yangwensheng1122
  • yangwensheng1122
  • 2017年08月01日 10:52
  • 432

Python学习笔记(2)-whil,for,for...in,循环嵌套

>>> ishu =15 >>> while ishu < 15: ishu-=1 if ishu == 3: pass print("ishu 在3,...
  • q869429064
  • q869429064
  • 2016年08月20日 17:25
  • 1023

【Java语言】嵌套For循环性能优化案例

1 案例描述 某日,在JavaEye上看到一道面试题,题目是这样的:请对以下的代码进行优化 Java代码  for (int i = 0; i 1000; i++)      for (int j =...
  • feng88724
  • feng88724
  • 2013年02月18日 10:33
  • 12003
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌套循环的控制变量——Ada应用实例之十三
举报原因:
原因补充:

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