①求解“变量赋初值”表达式。
②求解“循环继续条件”表达式。如果其值非0,执行③;否则,转至④。 ③执行循环体语句组,并求解“循环变量增值”表达式,然后转向②。 ④执行for语句的下一条语句。 ?、说明
①“变量赋初值”、“循环继续条件”和“循环变量增值”部分均可缺省,甚至全部缺省,但其间的分号不能省略。
②当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。
③“循环变量赋初值”表达式,既可以是给循环变量赋初值的赋值表达式,也可以是与此无关的其它表达式(如逗号表达式)。
例如,for(sum=0;i<=100;i++) sum += i;
for(sum=0,i=1;i<=100;i++) sum += i;
④“循环继续条件”部分是一个逻辑量,除一般的关系(或逻辑)表达式外,也允许是数值(或字符)表达式。
如:while(!E)等价于while(0),while(E)等价于while(1)。
for语句最为灵活,不仅可用于循环次数已经确定的情况,也可用于循环次数虽不确定、但给出了循环继续条件的情况。
练习5_3:求n的阶乘n!(n!=1*2*??*n)。 /*程序功能:求n!*/ main()
{ int i, n;
long fact=1;/*将累乘器fact初始化为1*/ printf(“Input n: ”);
scanf(“%d”, &n); for(i=1; i<=n; i++)
fact *= i;/*实现累乘*/
printf(\ }
程序运行情况如下: Input n: 5↙ 5 ! = 120
练习5_4 有以下程序 #include
int a=10,b=10,i; for(i=0;a>8;b=++i)
printf(\}
程序输出的结果是10 10 9 1 练习5_5 有以下程序 #include
for(k=0;k<10;k++); printf(\}
答案:10
- 11 -
练习5_6以下程序的运行结果是 #include
int m;
for(m=1;m<=50;m++) {
if(m!=0) continue;
printf(\ }
printf(\}答: 12 24 36 48 4、循环的比较
?、While和 for都是先判断后循环,而do-while是先循后判断。即do-while语句在条件不成立时循环体也要被执行一次。
?、while和do-while语句的条件表达式只有一个,只起到控制循环结束的作用,循环变量的初值等都用其他语句完成;for语句则有3个表达式,不仅能起到控制循环结束的作用,还可给循环变量赋初值。
练习5_7 对于以下程序段 int m=-1; do {
m=m*m; }
while(!m);
循环执行的次数为多少?答:1次。 练习5_8 对于以下程序段
int k=5; while (k=0) k=k-1; printf(\,循环体执行的次数为多少次?答:0次。 练习5_9 对于以下程序段
int a=5;while(a>=1) a--;程序执行后,a的值是0。 练习5_10以下程序 #include
for(i=0;i<10;i++); printf(\}输出结果是10。 5、循环的嵌套
?、循环语句的循环体内,又包含另一个完整的循环结构,称为循环的嵌套。循环嵌套的概念,对所有高级语言都是一样的。
?、for语句和while语句允许嵌套,do-while语句也不例外。 练习5_11:编程:
输出下列图形 * *** ***** ******* *********
- 12 -
解:/*程序功能:打印5行\,第一行1个,第二行3个,第三行5个...*/ #include
while(k<=2*i-1) { printf(\ k++; }
printf(\ i++; } }
6、break语句与continue语句 ?、一般格式: break; continue; ?、功能
①break:强行结束循环,转向执行循环语句的下一条语句。 ②continue:对于for循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于while和do-while循环,跳过循环体其余语句,但转向循环继续条件的判定。
?、说明
①break能用于循环语句和switch语句中,而continue只能用于循环语句中。 ②break是终止整个循环的执行,而continue只是结束本次循环。
③循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关。 练习5_12 求Fibonacci数列前12项的和。 解:
每月新增兔子数Fn={1,1,2,3,5,8,13,21,34,?}(斐波那契数列) 月份n 兔子数Fn
1 F1=1 2 F2=1
3 F3=2=F1+F2 4 F4=3=F2+F3 ?
n Fn=Fn-1+Fn-2 由此可写出递推公式
1 (n=1)
F(n)= 1 (n=2) F(n-1)+ F(n-2) (n>3) 程序代码如下: #include
int F1=1,F2=1;
- 13 -
int F,S=2,n=3; while(n<=12) {
F=F1+F2; F1=F2; F2=F; S=S+F; n++; }
printf(\}
第六章 数组
数组是数目固定、类型相同的若干变量的有序集合。 ▲一、一维数组
1、一维数组的定义:数据类型 数组名[常量表达式][, 数组名2[常量表达式2]??]; ? “数据类型”是指数组元素的数据类型。
? 数组名,与变量名一样,必须遵循标识符命名规则。
? “常量表达式”必须用方括号括起来,指的是数组的元素个数(又称数组长度),它是一个整型值,其中可以包含常数和符号常量,但不能包含变量。
? 数组元素的下标,是元素相对于数组起始地址的偏移量,所以从0开始顺序编号。
? 数组名中存放的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素,按其下标的顺序占用一段连续的存储单元。
注:数组名能与其他变量名相同,数组名后是用方括号括起来的常量表达式,不能和圆括号。
2、数组元素的引用
引用数组中的任意一个元素的形式: 数组名[下标表达式]
? “下标表达式”可以是任何非负整型数据,取值范围是0~(元素个数-1)。
? 1个数组元素,实质上就是1个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。
? 在C语言中,数组作为1个整体,不能参加数据运算,只能对单个的元素进行处理。 ?、一维数组元素的初始化
? 初始化格式:数据类型 数组名[常量表达式]={初值表}
? 如果对数组的全部元素赋以初值,定义时可以不指定数组长度(系统根据初值个数自动确定)。如果被定义数组的长度,与初值个数不同,则数组长度不能省略。
? “初值表”中的初值个数,可以少于元素个数,即允许只给部分元素赋初值。 3、数组元素的存储
数组元素在计算机内存中存储时,占据一片连续的存储空间,数组名代表数组元素占据的内存空间的首地址。由于数组各元素的数据类型相同,因此在数组中,每一个元素在内存里占用的存储单元数都是相同的。
练习6_1:从键盘上任意输入n个整数,用冒泡法按从小到大地排序,并在屏幕上显示出来。 解:冒泡法排序的基本思想:从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍的(N-1)次比较后,最大的数已放在最后,第二遍只需考虑(N-1)个数,以此类推直到第(N-1)遍比较后就可以完成排序。 #include \#define NUM 10 main()
{ int data[NUM];
- 14 -
/*定义符号常量(数据个数N)*/
/*定义1个1维整型数组data*/
int i,j,temp;
printf(\请输入10个整数:\\n\ for(i=0; i scanf(\ /*冒泡法排序*/ for(i=0; i /*定义循环变量和临时变量*/ /*外循环:控制比较趟数*/ for(j=NUM-1; j>i; j--) /*内循环:进行每趟比较*/ if(data[j] printf(\排序后的数据:\\n\ for(i=0; i printf(\} 练习6_2下列对一维数组正确赋初值的语句是 A、int a[10]= \; B、char a[]=\; C、int a[3]={1,3,5,7,9,1}; D、char a[3]= \。 练习6_3、在下面关于一维数组的定义中,有语法错误的是 A、int x[ ] = {1,2,3,4,5}; B、int x[5] = {0}; C、int x[5]; D、 int x[ ]; 答案:D 练习6 _4青年歌手参加歌曲大奖赛,有10个评委对他进行打分,试编程求这位选手的平均得分(去掉一个最高分和一个最低分),并在屏幕上输出去掉的最高分和去掉的最低分及这位选手的最后得分。 解: #include int i,j,min; float temp,ave=0; float a[11]; printf(\输入评委所打的分数:\\n\for(i=1;i<=10;i++) - 15 -