初学者循环问题

[编辑]哎呦有一个在代码中的错误,现在所有响应的问题似乎的bizzare,但基本上是对过去是,for循环(i = 0;我<15;我++)。 我还编辑,使问题更加清晰。[/编辑]

我试图做一个for循环,用于检查一个16元素的数组,所以循环从0到15,我后来用我的变量,但有时我== 16,它通过越界引起的问题。

我有一个解决方案,但它似乎不优雅,这让我觉得我失去了一些东西。 我试过while循环,但我永远不能得到任何循环,从0到15,并且永远不会结束在一个值大于15。

有没有什么办法让一个循环去检查数组中的所有16个元素,而从来不大于15在循环的结束?

int i; for(i=0; i<16; i++) { someClass.someMethod(i); if(someClass.Test()) { break; } } if (i == 16) { i = 15; }

--------------解决方案-------------

我建议使用一些其他的变量除了i后,你的循环结束。 使用for循环,而不是一个while循环的条件是,你事先知道究竟有多少次的循环将执行。 如果你已经知道这一点,只是设置一些其他变量设置为循环的结束值,并用给它,而不是i的双重目的。

int j = 15;

for(int i=0; i <= j; i++)
{
someClass.array[i];
}

// continue on using j, which value hasn't changed

那么对于初学者,您的示例代码循环从0到14,但是,如果你循环从0到15,当然,我已经是16 前的循环可以结束。 什么情况是变成16,那么你的循环注意到它的出界爆发。 如果你希望它结束​​在15,老老实实做最简单的事情就在循环结束后,刚刚递减。

i递增上最后检查为16,这是不小于15,因此与i是16循环退出。

也许是有用的知道:

for (before; check; after) { body }

这是一样的:

before
while(check) {
body
after
}

如果你觉得你的for循环这个词,也许你会发现很容易,为什么我,在出口处,为16。

似乎是在你的方法的一些根本性缺陷。

  1. 你真的不应该使用索引变量循环的范围之内。
  2. 您应该使用一个变量或函数来确定环路的限制。
  3. 这将是更好地使用迭代器,而不是数字索引。
  4. 泛型算法可以删除不需要的循环。

只是我的$ 0.02

所以 - 如果你正在检查一个16元素的数组,通常你应该这样做:

for(i=0; i<16; i++)

如何为作品,它有三个的第一条语句开始:

i=0

那么它的检查,在第二条语句:

i < 16 // True here, since 0 < 16

出现这种情况的循环之前。 然后,它运行在您的循环与组块:

someClass.array[i]; //0

最后,它做最后的陈述:

i++

然后它重复第二和第三语句,在一个序列中。

最后一次运行之前,我== 14,那么它就是我++,我设置为15,并执行该块。 最后,它确实我++设置:

i==16

在这点上,条件不再为真:

i < 16 // False, since i==16

在这一点上,你的块不执行,但是我仍然设置为16。

你一定错过了一些东西。

在这个循环就不会连打15,你需要说的我<= 15,只要I = 14它会运行一次保释。

for循环相当于以下while循环:

i = 0;
while(i < 16) {
someClass.array[i];

i++;
} // while

i需要达到16正确地走出循环。

从技术上讲有写循环,这样的方式i是15退出循环,但你不应该做这些:

int i = 0;
while (1) {
someclass.someMethod(i);
if (i < 15) {
i++;
} else {
break;
}
}

是的,它确实你问什么。 但流量是可怕的。

你不能用内置的循环结构实现这一目标,并作为比尔蜥蜴说,你可能真的不希望再利用的循环变量。

但是,如果你真的想,这里有一个办法做到这一点。 诀窍是把循环条件在循环的中间:

int i = 0;
while (true)
{
someclass.array[i];
if (i == 15)
break;
++i;
}

理解此处的关键问题是,有17种不同的回答这个问题:“是什么的我值会导致测试成功吗?”。 或者我可以是在{0,1,...,15},或i的值没有导致测试成功,其被表示为i == 16在这种情况下。 所以,如果我是仅限于16个值,这个问题不能回答。

有合法的情况下,你不希望走过去的最后一个有效值。 举例来说,如果你有256个值,由于某种原因,你只能有一个字节计数。 或者,如发生在我身上最近,要检查数组的只有每第i个元素,最后除了你的迭代需要你远远超出了数组的末尾。 在这些情况下, 循环展开是必要的。

然而,对于这一问题,将清洁剂使用标志:

bool flag = false;
for (int i = 0; i < 15; ++i)
{
someClass.someMethod(i);

if (someClass.Test())
{
flag = true;
break;
}
}

然后,它的明确的测试是否永远不会成功。

如果你的循环结束natuarally,而不是休息, i 就会 16.有没有办法避免这种情况。 你的代码是完全可以接受的,如果你想要的是我结束了15以下:

int i;
for (i=0; i<16; i++) {
someClass.someMethod(i);
if (someClass.Test())
break;
}
if (i == 16)
i = 15;

凡是改变i的循环体后做16〜15:

if (i == 16) i = 15;
i = (i == 16) ? 15 : i;
i = MAX (15,i); /* where MAX is defined :-) */

等等。

但是,这种假设i将被用于有意义的事作为后状态相对于该循环。 我觉得这是很少的情况下,人们往往会重复使用(如另一个循环)之前重新初始化。

此外,你在做什么使得它非常困难(不可能的,即使)找出一个后置条件,wheteher你的循环正常终止,或者是否提前终止,因为someClass.Test()返回真为i == 15此是指利用我做出进一步的决定充满了危险。

我的问题是: 为什么你认为你需要离开i 15还是少了?

我试图做一个for循环,用于检查一个16元素的数组,所以循环从0到15,我后来用我的变量,但有时我== 16,它通过越界引起的问题。

您需要检查在您的for循环没有突破的情况下,因为这些信息决定是否你想要什么做的我是有效的。

有几个方法可以做到这一点。 一个是追踪它在一个bool,如“foundClass”或“testSucceeded”。 它默认为false,然后将其设置为true的突破。 附上我的任何使用后在“如果(foundClass){}”块的功能。

另一种方法是只是做你做了什么。 虽然你的后备看起来不正确的。 如果你是我设置到15,你躺在你的代码,并告诉它someClass.Test()成功地为我== 15,这是不正确的。 避免将该值设置为东西是错的只是让你的代码没有错误以后。 这是更好的把边界检查周围i的实际使用情况在后面的代码。

for(int i=0; i<17; i++)
{
if(i<16)
{
someClass.someMethod(i);
if(someClass.Test())
{
break;
}
}
else if(i==16)
{
i=15;
}
}

如果你说你有16个元素的数组,你没有定义,使用数组来获取信息(不重复信息)

之后,如果你想获得最后的指数再次使用数组来获得这些信息。

for(int i = 0; i < myArray.length; ++i){
myArray[i].somemethod();
}
// lastindex = myArray.length-1;

分类:C# 时间:2012-01-01 人气:0
本文关键词: C#,循环
分享到:

相关文章

  • Javascript的麻烦parseFloat和的if / else循环 2012-01-01

    因此,工作的一些代码,我不与我的第二个功能是保持返回40环斑的问题,我认为循环书写正确. 我猜测它的if和else条件中传递的值? 如果(par_hour <40),其来源于parseFloat function addEmployee() { var employees = new Array(); employees[0] = window.prompt("Enter employee name","Bob"); var hours = new Array

  • 什么是后30毫秒C中的经过时间退出循环的最佳出路++ 2012-01-01

    什么是退出循环接近30毫秒尽可能在C ++中的最佳出路. 轮询提升:microsec_clock? 轮询QTIME? 别的东西? 就像是: A = now; for (blah; blah; blah) { Blah(); if (now - A > 30000) break; } 它应该可以在Linux,Mac OS X和Windows. 循环中的计算是用于更新仿真. 每30毫秒,我想更新视口. --------------解决方案------------- 在这个环节相当多的代码片断例如你想

  • While循环和光标在android系统 2012-01-01

    我的工作我的第一个Android项目和我有SQLite数据库的一些困难. 我需要积累例如sum(amount) for which name= cash and debit_credit= dr . 有没有在SQL循环,这样我怎么能做到这一点的同时,循环和光标? 下面是我的表: ID NAME Debit_Credit AMOUNT 1 cash dr 100 2 equip cr 100 3 cash dr 500 4 A/R cr 500 --------------解决方案--------

  • 资源下载的try-catch while循环或外内 2012-01-01

    是什么区别: while( true ) { try { // something } catch( Exception e ) { break; } } 和 try { while( true ) { // something // break; // eventually } } catch( Exception e ) { } 请问前者运行一个try-catch在每个迭代上还是编译器生成相同的代码. 这是首选? 编辑:打破; 从catch块除去在第二个例子中,因为没有必要. -------

  • 如何解决Maven的循环问题? 2012-01-01

    我有这种依赖的状况: C( - >)B - > A - >Ç 其中,B-> C表示该模块C具有相关性在其pom.xml中到B. 嗯......我想在C中使用类选自B,所以我必须把C->乙但是我收到一个骑自行车的错误,你可以在上面看到... 你看到什么解决办法? 因为它已经使用了一些类从A会有再次循环我不能移动类选自B在C中. 我试图声明一个接口IAlfa C和B中实现它(阿尔法)(但是当我想用它,我需要实例,如: IAlfa alfa = new Alfa() 所以我又需要从

  • 选择一个阵列的所有组件,而循环 2012-01-01

    我做了一个全面的阵列JLabels想一个侦听器添加到他们. 听者并不需要确切地知道哪一个是点击,只是一个是. 有没有一种方法来监听器添加到整个阵列,而不是使用"为()'循环? 谢谢阅读. --------------解决方案------------- 如果你的标签添加到容器(比如一个JPanel),你可以添加一个监听到这个容器,知道哪个组件是在特定的位置. JPanel panel = new JPanel(); panel.addMouseListener( whichOneListener

  • 循环直到Python中的复杂的数据结构的稳定状态 2012-01-01

    我有更多或更少的复杂的数据结构上,我在一个循环中执行一串操作的,直到数据结构达到一个稳定状态,也就是(套字典列表). 不会再发生变化. 迭代次数花费来执行计算而变化似地根据输入. 我想知道如果有形成在这种情况下,停止条件建立的方式. 尽我所能想出的酸洗的数据结构,存储其MD5和检查,如果它已经从上一次迭代变化. 由于这是比我的操作更昂贵的我只能这样做,每20次迭代,但仍,感觉错了. 是否有检查深平等,让我知道什么时候暂停或更好便宜的方式? 谢谢! --------------解决方案------

  • 使用Javascript:推阵列到阵列与循环 2012-01-02

    请给我讲解一下. 我试图创建一个数组的数组用for循环. 当它没有工作,我试图简化代码,以了解JavaScript是干什么的,但简单的代码就没有意义了无论是. function test(){ var sub_array = []; var super_array =[]; for (var i=1;i<=3;i++){ sub_array.push(i); super_array.push(sub_array); } alert(super_array); } 我希望看到[1; 1,2; 1,

  • 奇怪的循环? C# 2012-01-02

    可能重复: 在C#是为(;;)安全?它真的? 所以我最近横跨东西我从来没有见过的来到.. for (; ; ) { } 当feilds留空一样,究竟是什么回事? --------------解决方案------------- 这是一个无限循环. 某处内部应该有一个break;语句,或者可能是一个例外抛出,以便控制传递超出环路. 您也可以通过执行实现同样的事情(可能更明显) while (true) { // do stuff } 这是一个无限循环,几乎等同于一个while(true)循环. 在b

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.453 (s). 10 q(s)