C 概念基础讲解1 下载本文

循环结构

顺序结构程序自上而下只执行一遍,分支结构中有些语句可能一遍也执行不了,这两种结构都没有充分利用计算机速度快的特点。循环结构是让一些语句在一定条件下反复多次被执行。

循环结构是三大程序结构之一,是C++程序设计的重点内容。顺序结构、选择结构只解决简单问题,是程序设计的基础,而循环结构则是程序设计的实际应用。顾名思义,所谓循环,是指某些语句由于需要而被反复执行多次的现象。

三种循环语句(for、while、do-while)。

1、for循环

格式:for( 初始化; 条件; 调整) 循环体;

循环体可能是复合语句,要写为下面这种格式: for( 初始化; 条件; 调整) { 循环体; }

C++中的for语句使用最为广泛和灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。

for语句的一般格式为

for(表达式1;表达式2;表达式3) 语句 它的执行过程如下: (1) 先求解表达式1。

(2) 求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。 (3) 求解表达式3。

(4) 转回上面第(2)步骤继续执行。

(5) 循环结束,执行for语句下面的一个语句。 例如,输出10个?*?,可用如下语句即可完成: cout << “**********”; 如果要输出1000个?*?,再用上面的写法就不现实了! 解决办法是: 输出一个?*?,即cout << ?*?;重复1000次。

int main(){ int i;

for(i=1;i<=1000;i++)cout << “*\ }

○for 先判断条件而后执行循环体,即有可能循环体一

次也不被执行。如下语句中循环体?s=s+i?一次也不被执行:

for(i=10;i<0;i++)s=s+i;

○c++对循环变量的数据类型没有什么特殊要求:整型int,实型double,字符型 char都可以

○for 适宜循环次数明显的情况,又称计数循环。 ○for中三个表达式间只能用分号相隔,且即使三个表达式省略时,分号也不可省略。

○当循环语句超过一条语句时,要用{ }将语句组合在一起,构成复合语句。

○for中三个表达式,可以为多条语句。 如:for(i=1,j=2;i<=10;i++,j++)s=s+i+j;

2、while循环 格式:

while ( 条件表达式) {语句组} 等同于

for(; 条件表达式; ) {语句组}

3、do while循环 1)格式:

do { 语句组}

while(条件表达式);

for循环和while循环都是先判断表达式是否成立,然后再决定是否循环,do-while的差别在于先执行一次循环再看表达式是否成立。它是这样执行的:先执行一次指定的语句(即循环体),然后判别表达式,当表达式的值为非零(?真?) 时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。 例3.11 用do-while语句求1+2+3+…+100。 可编写出下面的程序: #include using namespace std; int main( )

{int i=1,sum=0; do

{ sum=sum+i; //累加求和 i++;

}while (i<=100); //条件成立就返回do后面大括号中的内容执行

cout<<″sum=″<

13

4、转向语句 1)break语句

break在循环体中,也可以从循环体内跳出循环体,提前结束循环。 for ( ; ; ) { cin>>x;

if (x==123) break; }

注意:break只能退出一层循环

2)continue语句

continue:其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。

int main( ) { int i;

for (i=1;i<=5;i++) { if (i%2)cout<<“*”; else continue; cout<<“#”; }

cout<<“ $\\n”; }

结果为:*#*#*# $

5、多重循环

循环嵌套:这是循环结构的重点和难点。三种循环语句可以互相嵌套(而不是交叉!),共有六种情况,构成循环嵌套结构的各种形式。

多重循环格式之一: for( ; ; ){ 语句组; for( ; ; ) { 语句组; }

语句组; }

例题:

如输出一个m×n的一个矩形的’*’号阵 样例输入:3 5 样例输出: *****

***** *****

一般用外循环控制行,内循环控制每行输出的内容.

如本例中用m控制行,n控制每行上有多少个*号,每行上的*号输出完毕后输出一个换行符。 输出m行n列*号 cin>>m>>n;

for( i=0;i

//外循环通常用作控制行,表示输出图形有m行 for(j=0;j

cout<

外循环i=0时,内循环j从0一直变化到n-1,即内循环中的语句{ cout<<‘*’; }被执行了n次,语句 cout<

有时每列上的字符个数不同,如 n=3时,输出如下图形 * ** *** cin>>n;

for( i=0;i

#include #include using namespace std; int main( ) {long f1,f2; int i; f1=f2=1;

for(i=1;i<=20;i++)

{cout<

if(i%2==0) cout<

14

f1=f1+f2; //左边的f1代表第3个数,是第1、2个数之和

f2=f2+f1;//左边的f2代表第4个数,是第2、3个数之和 }

return 0; }

有时每行上的字符个数以等差数列递增,如 n=3时,输出如下图形 * *** ***** cin>>n;

for( i=1;i<=n;i++ ){

for( j=1;j<=2*i-1;j++ )//每行上的字符数目以2递增,因此是2*i cout<

如果是这样的金字塔形式 n=3,输出 * *** *****

可以看作是先输出了一个倒三角形的空格,然后再输出上例中的图形 cin>>n;

for( i=1;i<=n;i++ ){

for(j=1;j<=n-i;j++) //每行上的空格数是n-1,n-2,...,1,0这样一个递减序列,而i每次递增1,要将一个递增序列改为递减序列,直接在前面加上-号 cout<<' ';

for( j=1;j<=2*i-1;j++){//每行上的字符数目以2递增,因此是2*i cout<

cout<

简单算法与常用技巧

1、输入数据的数量不确定的处理

可以用while(cin>>n) 来进行处理。一直到无输入流数据时才退出循环。

2、数字的分离

如输入一个不知道位数的整数,要将其倒序输出 cin>>a; b=0;

while(a!=0){ //可接写为while(a)

b=b*10+a;//将a的个位取出来累加到b中 a=a/10; //将a的个位去掉 }

cout<

3、计数器

计数器在循环中的一般形式

cin>>n;j=0; //计数器初值一般为0 for(i=1;i<=n;i++){ cin>>a;

if(a%2==0) j=j++; } cout<

4、累加器

累加器在循环中的一般形式 cin>>n;s=0;//n个数的累加 for(i=1;i<=n;i++){ cin>>a; s=s+a;} cout<

5、累乘器

累乘器在循环中的一般形式 cin>>n;s=1;

for(i=1;i<=n;i++){ cin>>a; s=s*a;} cout<

6、标记法

输入整数n,请判断其是否为素数(质数)。 cin>>n;

f=1; //用f做标记,为1则表示是素数 for( j=2;j

if(n%j==0)f=0;//f为0表示n在2~n-1间有约数 if(f==1) cout<<”yes”; else cout<<”no”;

7、求最大值

先假设输入的第一个数即为最大数,然后用它去和后面的数一一进行比较,如果后面的数比它大,则将大的数

15

赋值给它。 cin>>a; max=a;

for(i=1;i

{ cin>>a; if(a>max) max=a;} 循环退出后max中存储的就是最大值

8、求最小值

先假设输入的第一个数即为最小数,然后用它去和后面的数一一进行比较,如果后面的数比它小,则将小的数交换给它。 cin>>a; min=a;

for(i=1;i

{ cin>>a; if(a

9、字符的处理

输入一串字母和数字,以? . ?号结束,统计其中字母和数字的个数。 char a;

zimu=0; shuzi=0; for( cin>>a; a!=?.?;){

if(a>=?a?&&a<=?z?||a>=?A?&&a<=?Z?) zimu++; if(a>=?0?&&a<=?9?) shuzi++; cin>>a; }

10、穷举的思想

穷举法也称为?枚举法?,这种算法基本思想是依题目的部分条件,确定答案的大致范围;在此范围内,对所有可能的情况一一列举,逐一验证,直到全部情况验证完毕,或者得到了需要的结果。

若某个情况经验证符合题目的全部条件,则它就是本题的一个答案;若全部情况经验证后,都不符合 题目的全部条件,则原题无解。 用穷举法解题的大致步骤如下:

1)分析题目,确定所要求的解是什么? 2)确定解的可能取值范围是什么? 3)穷举出所有可能的解 4)验证每一个可能的解 5)优化

例:鸡兔同笼问题

一个笼子里有鸡和兔,现在只知道里面一共有a个头,b只脚,问鸡和兔各有多少只(要求鸡和兔至少1只)?

int i,j,a,b; cin>>a>>b;

for(i=1;i

11、递推的思想 迭代的方法

例:斐波那契数列(从第三项起为前面两项之和) 1 1 2 3 5 8 13…

F1=1 (n=1) F2=1 (n=2) Fn=Fn-1+Fn-2 (n≥3)

cin>>n; a1=1; a2=1;

for(i=3; i<=n; i++){ a3=a1+a2; a1=a2; a2=a3; }

cout<

猴子吃桃问题。猴子摘了一堆桃,第一天吃了一半,还嫌不过瘾,又吃了一个;第二天又吃了剩下的一半零一个;以后每天如此。到第N天,猴子一看只剩下一个了。问最初有多少个桃子? cin>>n;

for(s=1,i=2;i<=n;i++) s=(s+1)*2; cout<

练习(循环)

一、选择

1、下列关于if语句的描述中,错误的是

A.If语句中可以没有 else if 子句,也可以没有else子句

B.If语句中只能有1个else子句

C.If语句中只能有不超过5个的else if 子句 D.If语句中<条件>可以是任意表达式

2、下列关于break语句和continue语句的描述中,错误的是

A.break语句可以用来退出循环体 B.Break语句可以用来退出if语句

16