文章目录
第四章 循环结构设计
4.1 计数循环
for 语句
for基本语法
for语句常用于某一组语句常用来重复执行
n次。
for (表达式1; 表达式2; 表达式3){
//执行循环语句
}
- 内部的i变量仅限于循环内使用,在循环外运用需要定义变量。
- 可理解为:for(表达式1;表达式2; 表达式3) {执行循环语句}
- for( ; ; )表示无限循环。
- 表达式1里面可以用逗号分隔,表示并列语句。
- 表达式2一般时关系表达式或是逻辑、算数表达式,死循环只能用break或者Ctrl+C。
例程:求100个数的最大值、最小值、平均值- 表达式3也可以时任何表达式,在循环周期结束后对循环变量的修正。
#include <iostream>
using namespace std;
int main(){
int a = 0, sum = 0, min = 0, max = 100;
for (i = 0; i < 100; ++i){
cout << "请输入一个数" ;
cin >> a; sum += a;
if (a > max) max = a;
if (a < min) min = a;
}
cout << "max value" << max << endl;
cout << "min value" << min << endl;
cout << "average value" << sum / 100 << endl;
}
return 0;
}
tips:程序设计时应尽量用循环代替重复的语句,使程序变得简洁美观
for循环的嵌套
最内层的循环全部结束以后,才算完成外层循环的一次循环周期
#include <iostream>
using namespace std;
int main(){
int i, j;
for (i = 1; i <= 9; ++i){
cout << endl;
for (j = 1; j <= 9; ++j){
cout << i*j << "\t" ;
}
}
return 0;
}
while语句
用于循环次数不固定的循环
while语句语法
while (表达式){
//语句
}
- 表达式为true,就会执行循环,表达式内经常会进行变量的判断
- 摘自百度百科,转义字符表
例程:
int main(){
double ex, x, p; //存储变量
int i; //循环变量
cout<< "请输入x的值:" ; cin >> x;
ex = 0; p = 1; i = 0;
while (p > 1e-6){//科学计数法0.000001
ex += p;
++i;
p = p* x / i; //阶乘的递推
}
cout << "ex = " << ex << endl;
return 0;
}
do…while语句
do…while语句语法
do{
//循环的语句(至少执行一次)
} while (表达式);
- 相比while,循环语句先于判断条件
循环的中途退出
当读入数值直到一个标志值时,中途退出循环
- break语句:跳出循环
- continue语句:跳出当前循环周期,直接进入下一个循环周期
一些拓展
循环是简单的代码重用,未来在面向对象和类编程有用
枚举法
对是可能解的所有候选按照一定顺序进行逐一枚举和检验
例程:四大湖问题:
#include <iostream>
using namespace std;
int main(){
int a, b, c, d; bool flag = false;//flag为控制标志位
for(a = 1; a <= 4; ++a){
for(b = 1; b <= 4; ++b){
if(a == b) continue;
else
for(c = 1; c <= 4; ++c){
if(c == a || c == b) continue;
else{
d = 10 - a - b - c;
if((a == 1) + (b == 4) + (c == 3) == 1 && (b == 1)+ (a == 4) + (c == 2) + (d == 3) == 1 && (b == 4) + (a == 3) == 1 && (c == 1) + (d == 4) + (a == 3) == 1)//满足所有的条件
cout << a << b << c << d << endl;
flag = 1; break;
}
if(flag) break;}
if(flag) break;}
if(flag) break;}
return 0;
}
贪婪法
将问题分为各类小问题,得到多个局部最优解,最后得到全局最优解。
例程:硬币找零问题
#define ONEFEN 1
#define TWOFEN 2
#define FIVEFEN 5
#define ONEJIAO 10
int main(){
int onefen = 0, twofen = 0, fivefen = 0, onejiao = 0, money;
cin >> money;
//遍历扣除相应的硬币数,得到各个硬币的局部最优解
while(money >= ONEJIAO){onejiao++; money = money - ONEJIAO}
while(money >= FIVEFEN){fivefen++; money = money - FIVEFEN}
while(money >= TWOFEN){twofen++; money = money - TWOFEN}
while(money >= ONEFEN){onefen++; money = money - ONEFEN}
cout << onefen << twofen << fivefen << onejiao << endl;
return 0;
}