选择循环的种类
循环种类(按照循环次数分):
(1)计数循环
(2)连续求值循环:在批处理,可以每次判断队列的节点个数来决定送多少个
(3)无限循环
(4)迭代循环:对容器里的每个元素执行一次循环
循环的灵活度: 循环的次数是一定的还是每次都会检查
检查循环执行完毕的位置: 开始、结尾、中间(保证一部分代码肯定会执行)
1、什么时候使用while循环
需要一个灵活的循环(不确定循环的次数),或者循环至少需要执行一次的情况下。
2、何时使用for循环
for循环使用在一个执行次数固定的循环,为了满足简单的用途,简单的递增递减,对容器元素进行迭代等;如果存在一个必须使执行从循环中跳出的条件,那么就应该改用while循环。
3、何时用带退出的循环
带退出的循环: 终止条件出现在循环中间,可以使用while和break模拟。使用带退出的循环能够更方便的理解代码,尽量将退出的判断条件放在一起。例如:使用通道号在数组中匹配查找设备,查找到之后使用break退出循环。
循环控制
循环会出现什么样的错误:忽略了对累加变量或其他与循环有关的变量执行初始化、不正确的嵌套、不正确的循环终止、忽略或者错误地增加了循环变量的值、用不正确的循环指标访问数组元素。
1、进入循环: 指导原则
(1)仅从一个入口进入循环。
(2)把初始化循环的代码紧放在循环前头。
(3)无限循环使用while(true)
(4)在适当的情况下多使用for循环:for循环把循环的控制代码集中在一处,从而有助于写成可读性强的循环。
(5)在while更合适的地方不要使用for循环。
C中胡乱把while填充到for循环
for(rewind(InFile).RecCount = 0; !feof(InFile); RecCount++)
{
fgets(InputRec[RecCount-1], MAX_CHARS, InFile);
}
rewind(InFile);
RecCount = 0;
while(!feof(InFile))
{
fgets(InputRec[RecCount], MAX_CHARS, InFile);
RecCount++;
}
2、处理好循环体
(1)把循环的“内务处理”工作放在循环的开头或结尾。i++这些语句,主要目的不是完成循环工作,而是控制循环。
(2)像子程序一样,一个循环只做一件事情。
3、退出循环
(1)尽可能使循环终止条件看起来很明显;不需要理解循环体内部就可以知道退出的条件。
(2)避免出现依赖循环下标最终取值的代码,在循环体内某个适当的地方把这一最终值赋给某个变量:
滥用循环下标的最终取值的代码:
for ( i=0; i<MaxRecords; i++ )
{
if( Entry[i] = = TestValue )
{
break;
}
}
if( i< MaxRecords )
return(TRUE);
else
return(FALSE);
修改之后的代码:
Found = FALSE;
for(i<0; i<MaxRecords; i++)
{
if(Entry[i] == TestValue)
{
Found = TRUE;
break;
}
}
return(Found);
(3)考虑使用安全计数器:在循环体内加一个变量的++,当这个值加到某个程度代码出现问题;
4、提前退出循环
(1) while 循环中,若要用布尔量标志时就应考虑用 break 语句。
(2)把 continue 放在循环的头前检查,如果不是我们需要的值可以直接进入下一次循环。
(3)使用break和continue时一定要小心;例如:锁的使用
5、检查端点
(1)对一个简单的循环,通常需要考虑三种情况:开始、结束、中间任一状态。
(2)高效的程序员既会在脑海中进行模拟,也会手动地执行运算;模拟程序运行的多种可能情况,从而避免后期出现问题。
6、使用循环变量
(1)用整数或者枚举类型表示数组和循环的边界。
(2)在嵌套循环中使用有意义的变量名来提高其可读性:特别是在二维和多维数组中。
(3)把循环下标的作用域限制在本循环内:不要在此次循环之外再使用本次的循环下标,以免用串引入错误。
7、循环应该有多长
(1)使循环尽可能短,能一目了然
(2)限制嵌套超过 3 层
(3)把长循环的内容移到子程序里
循环由内而外创建
第一步:明确循环内需要做的内容
{get rate from table}
{ add rate to total}
第二步:尽可能多地把循环体内的注释转化为代码
Rate := Table[];
Ttl := TtlRate+Rate ;
第三步:加入下标
Rae := Table[Census.Age,Census.Sex ];
TtlRate := TtlRate+Rate ;
第四步:增加循环
for Person := FirstPerson to LasttPerson do
begin
Rate := Table[Census.Age,Census.Sex] ;
TtlRate := TtlRate + Rate ;
End;
第五步:增加初始化
TtlRate := 0;
for Person := FirstPerson to LastPerson do
begin
Rate := Table[Census[Person].Age,Census[Person].Sex] ;
TtlRate:= TtlRate + Rate ;
end;
要点
· 循环很复杂,使其简化有利于阅读。代码量大的循环,封装为子程序,循环不多于3层。
· 简化循环的技巧有:避免使用怪样子循环、使循环次数最小、使进出口清楚、把内务代码放在一个地方。
· 循环控制变量不可滥用,应给它起一个有含义的名字并让它只起一个用途。
· 仔细考虑一下整个循环,保证循环在各种情况和终止条件下都能照常运行。