循环控制

Download Report

Transcript 循环控制

声明
p50-规范化指数形式(Wikipedia)
A real number is called normalized, if it is in the
form:
+(-)d0.d1d2d3d4….dn
where n is an integer, d0, d1, d2, d3...are the digits of
the number in base 10, and d0 is not zero.
•As examples, x = 918.082 in normalized form is
•
9.18082e+002
p72-标准化指数形式,无此定义
存储形式:float a=3.14159; + .314159 +1
循环控制,就是如何实现循环结构的
控制问题。
有3种方法:
1、 用while语句。
2、 用do-while语句。
3、 用for语句。
其它三个主要内容:
循环嵌套、break和continue
while语句:专门用于实现循环控制的语句之一。
一般形式为:
while (表达式) 语句
语句关键字
语句关键
表达循环条件的
表达式
循环体
含义:当表达式的值为非0时,执行循环体,否
则执行后续语句。
执行过程:
while (表达式) 语句
表达式
非0
循环体
0
例:用while语句实现求1到10的和:
s=0
main()
i=1
{ int i=1,s=0;
while(i<=10)
i≤10?
{
y
s=s+i;
i++;
s=s+i
}
i=i+1
printf(“\n %d”,s);
}
n
注意与if语句的区别。
循环体中要有使循环条件趋于不成立的条件
int i=1,s=0;
while(i<=10){
s=s+i;
i++;
}
可简写为:
main(){
-1
int y =10;
while (y--) ;
printf(“ %d ”, y);
}
while(i<=10) s+=i++;
while(i<=10) s+=++i;
do-while语句主要用于实现直到型循环。
其一般形式为:
do{
循环体
循环体
}while(表达式);
非0(真)
执行过程:
表达式
0(假)
例:用do-while语句实现前面算法:
main()
s=0
{ int i=1,s=0;
i=1
do{
s+=i++;
s=s+i
}while(i<=10);
i=i+1
printf(“\n%d”,s);
y
}
i≤10?
注意与while语句的区别。
n
… …
x=-1;
do{
x=x*x;
}while( !x);
… …
A) 是死循环
B) 循环执行三次
C) 循环执行一次
D) 有语法错误
C)循环执行一次
main()
{ int y=10;
do{
y--;
} while(--y);
printf(“%d\n”, y--);
}
A) -1
B) 1
C) 8
D) 0
D) 0
写出下列程序段的运行结果以
及循环体中的语句共执行了几次。
……
x=y=0;
do{
y++;
x*=x;
}while((x>0)&&(y>5));
printf(“y=%d x=%d\n”,y,x);
……
y=1 x=0
循环体中的语
句共执行了1次
写出下列程序段的运行结果。
……
a=10; y=0;
do
{ a+=2; y+=a;
printf(“a=%d y=%d\n”,a,y);
if (y>50) break;
} while(a=14);
……
a=12 y=12
a=16 y=28
a=16 y=44
a=16 y=60
3 for 语句
for语句是一种使用最为灵活,
并且是用得最多的循环控制语句,
其一般形式为:
for(表达式1;表达式2;表达式3)
循环体
大体含义:
对于()的情况 执行循环体
求解表达式1
表达式2
y
循环体
求解表达式3
n
例:用for语句实现前面的算法:
s=0;
for(i=1;i<=10;i++) s+=i;
表达式1
表达式2
表达式3
标准形式
循环体
可以理解:
循环变量i从初值1开始到终值10,步长为1,重复执
行循环体。
for语句的常见变化:
s=0; i=1;
for(;i<=10;i++)s+=i;
s=0;
for(i=1;i<=10;)s+=i++;
s=0;i=1;
for(;i<=10;)s+=i++;
省略表达式1
省略表达式3
省略表达式1和3
s=0; i=1;
for(;;)
{
s+=i++;
if(i>10) break;
}
s=10;i=10;
for(;--i;) s+=i;
省略3个表达式
表达式2是
任意表达式
用逗号表达式
s=0;
for(i=1,j=10;i<j;i++,j--) s+=i+j;
1 2 3 4 5 6 7 8 9 10
i
j
在程序设计中不要过分追求它的多变性
通用吗?
例:求n!
n!=1*2*3…(n-1)*n
参照累加求和
main()
{
int i,n=5,s=1;
for(i=1;i<=n;i++)s*=i;
printf(“\n s=%d”,s);
}
注意s的初值。
注意当n较大时的情况。
求和与连乘都是最常用的算法,要熟练掌握。
例:求自然数1-100中能被3整除的数之和。
main()
{
int i,s=0;
for(i=1;i<=100;i++)
for(i=1;i<=100;i++)
for(i=3;i<=100;i+=3)
for(i=3;i<=100;i+=3)
if(i%3==0)s+=i;
s+=i;
s+=i;
if (i%7)s+=i;
printf(“\n %d”,s);
}
求能被3整除但不被7整除的数之和?
例:求任意100个数中的最大值。
main()
{ int i,a,max;
max=-32768;
max=?
for(i=1;i<=100;i++)
for(i=1; ;i++)
{
scanf(“%d”,&a); if(a==-9999)break;
if(a>max) max=a;
}
printf(“\n max=%d”,max);
}
循环体中没有引用循环变量。i的作用?
求任意个数中的最大值?
#include<stdio.h>
#include<math.h>
int main(){
float p,r=0.09;
int n=10;
p=pow(1.+r,n);
printf("p=%f\n",p);
return 0;
}
#include<stdio.h>
int main(){
char c1,c2;
c1=97;c2=98;
printf(“c1=%c,c2=%c\n”,c1,c2);
printf(“c1=%d,c2=%d\n”,c1,c2);
return 0;
}
1). c1=a,c2=b
c1=97,c2=98
2) c1=197;c2=198;
c1=?,c2=? //未定义的未知结果
c1=-59,c2=-58 //
197 补码(与原码相同):0000 0000 1100 0101
-1 1100 0100
取反 1011 1011
-(2^5+2^4+2^3+2^1+2^0)=-59
3) c1=a,c2=b c1=97,c2=98
#include<stdio.h>
int main(){
int a,b; float x,y; char c1,c2;
scanf("a=%db=%d",&a,&b);
scanf("%f%e",&x,&y);
scanf("%c%c",&c1,&c2);
return 0;
}
1. a=3b=7 8.5 7.182e+1Aa
2. a=3b=7
8.5 7.182e+1Aa
1.
字符串长度
1.“ab’1’\\\12703”: ‘\\’, ‘\127’ ----9
2. “ab’1’\\\12803” : ‘\\’, ‘\12’ ----10
3. “abc\n\\\'\"” : ‘\n’, ‘\\’, ‘\'’, ‘\"’---7
4 “abc\0xyz”: ‘\0’ ---有效长度3(strlen())
5. “abc\\0xy” : ‘\\’----7
6. “\t\"\065\xff\n”:‘\t’, ‘\"’, ‘\065’, ‘\xff’, ‘\n’----5
内存大小
5
循环的嵌套
循环体内又包含另一个完整的循环结构(多重
循环)。
外重循环
for(i=1;i<=10;i++)
{
for(j=1;j<=20;j++)
内重循环
{
s+=i+j;
执行200次
}
}
要掌握多重循环
执行的全过程
例:找出行号乘以列号等于100的座位。
main()
{
int i,j;
for(i=1;i<=30;i++)
for(j=1;j<=20;j++)
if(i*j==100)
printf(“\n%d,%d”,i,j);
}
注意循环的关系
例:百钱买百鸡问题。
给定100块钱,要求正好买100只鸡,已知公
鸡5元/只,母鸡3元/只,小鸡1元/3只,问公
鸡、母鸡和小鸡应各买多少只?
若考虑用方程组:
x+y+z=100
5x+3y+z/3=100
是一多解问题。
用测试法求解的程序:
main()
{
int x,y,z;
for(x=1;x<=100;x++)
for(y=1;y<=100;y++)
for(z=1;z<=100;z++)
if(x+y+z==100&&5*x+3*y+z/3.0==100)
printf(“\n%d,%d,%d”,x,y,z);
}
程序可进一步简化为:
main()
{
int x,y,z;
for(x=1;x<=20;x++)
for(y=1;y<=33;y++)
{ z=100-x-y;
if(5*x+3*y+z/3.0==100)
printf(“\n%d,%d,%d”,x,y,z);
}
}
用测试法求解问题的典型例子
1
break 语句
主要是用于switch 结构和循环结构中
main()
{ int i, s=0;
for(i=0; i<100; i++)
{ scanf(“%d\n”, &x);
if(x<=0) break;
s+=x;
}
printf(“s=%d\n”,s);
}
x=5,y=4,a=1
main()
{ int x=3,y=6,a=0;
while(x++!=(y-=1))
{ a+=1;
if (y<x) break;
}
printf(“x=%d,y=%d,a=%d\n”,x,y,a);
}
2
continue语句
该语句是专用于循环结构中改变某一次
循环流程的语句。
其作用是:使程序流程提前结束本次循环
从而开始下一次循环。
102 105 108 111 114
117 120 123 … …
main()
{ int n;
for(n=100; n<=200; n++)
{ if(n%3!=0) continue;
printf(“ %4d \n”, n);
}
(1) i=0 x=1
main()
{ int i, j, x=0;
for(i=0; i<2; i++)
{ x++;
for(j=0; j<=3; j++)
A) x=4
{ if(j%2) continue;
B) x=8
x++;
C) x=6
(2) i=1 x=5
}
D) x=12
x++;
}
printf(“x=%d \n”, x);
B
}
j=0
x=2
j=2
x=3
x=4
j=0
x=6
j=2
x=7
x=8
main()
(1) c=‘B’
{ int k=0; char c=‘A’;
do
(2) c=‘C’
{ switch(c++)
(3) c=‘D’
{ case ‘A’:k++; break;
case ‘B’:k--;
A) k=3
(4) c=‘E’
case
‘C’:k+=2;
break;
B) k=4
case ‘D’:k=k%2; continue;
C) k=2
(5) c=‘F’
case ‘E’:k=k*10; break;
D) k=0
default :k=k/3;
(6) c=‘G’
}
B
k++;
} while(c<‘G’);
printf(“k=%d \n”, k);
}
k=2
k=4
k=7
k=1
k=11
k=4
main()
{ int i;
for(i=1; i<5; i++)
{ if(i%2) printf(“*”);
else continue;
printf(“#”);
}
printf(“$\n”);
}
A) *#*#*# $
B) #*#*#* $
C) *#*# $
D) #*#* $
C
若 i , j 已定义为 int 类型,则以下程序段中内循环体
总的执行次数是:
for( i =5; i ; i --)
for(j=0; j<4; j++) { … … }
A) 20
B) 24
C) 25
A
D) 30
1、在下列语句中,哪一个不为无限循环
A) i=100;
while(1)
{ i=i %100; i++;
if (i >100) break;
}
C) k=32765;
do
{ k++; k++;
}while(k>0);
C
B) for(; ;)
D) S=32765;
while((S++%2)||(S%2))
S++;
int ------ -32768~32767
32765
01111111 11111101
77775
32766
01111111 11111110
77776
32767
01111111 11111111
77777
-32768
10000000 00000000
100000
-32767
10000000 00000001
100001
-32766
10000000 00000010
100002