控制循环

选择循环的种类

循环种类(按照循环次数分):
(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层。
· 简化循环的技巧有:避免使用怪样子循环、使循环次数最小、使进出口清楚、把内务代码放在一个地方。
· 循环控制变量不可滥用,应给它起一个有含义的名字并让它只起一个用途。
· 仔细考虑一下整个循环,保证循环在各种情况和终止条件下都能照常运行。

猜你喜欢

转载自blog.csdn.net/weixin_37921201/article/details/88701919