C语言三种循环语句

2018-10-20 17:39

还可以再简化为:

int a(int); main() { int num;

scanf(%d,&num); printf(%d,a(num)); }

int a(int num) {

return num*num; /*直接在这儿返回*/ }

对于函数而言,一个函数只能返回一个值,如果想返回一组数值,就要使用数组或者结构或者指针。其实对于这些,还是返回一个值,只是这个值是一个地址而已。但是对于数组的返回有和变量不同,因为数组和地址是联系在一起的。看一个例子:

void a(int []); main() {

int array[5]={1,2,3,4,5},i; a(array);

for(i=0;i<5;i++) printf(%d,array[i]); }

void a(int array[]) { int i;

for(i=0;i<5;i++) array[i]++; }

看看这个程序,好象函数没有返回值,但是函数的功能的确实现了,在主函数当中输出的值的确都各加了1上来。这就是因为数组和变量不同的缘故,在后面讲指针的时候再详细说明。

下面看一个实际例子,加深对函数的理解:

用函数实现,判断一个整数是不是素数?在主函数里输入输

出,子函数里判断。

#include math.h int judge(int); main() {

int num,result; scanf(%d,&num); result=judge(num); if(result==1) printf(yes\\n); else printf(no\\n); }

judge(int num) {

int i,flag=1;

for(i=2;i<=sqrt(num);i++) if(num%i==0) { flag=0; break;

}

return flag; }

可以看出,函数的功能就是为了让程序看起来有条理,一个函数实现一个特定的功能。如果我们还和以前那样,把所有代码都放在main()函数,好象程序就显的臃肿了。而且函数有一个显著的好处就是很方便的使用。这里面的judge()函数判断一个数是不是素数,如果我们以后还有判断某个数是不是素数,就可以直接使用这个函数了。我们这样,把下面的代码:

judge(int num) {

int i,flag=1;

for(i=2;i<=sqrt(num);i++) if(num%i==0) { flag=0; break; }

return flag;

}

保存为judge.h文件,放到include目录里面。

以后就可以直接使用这个函数了,就好象直接使用abs(),sqrt()这些函数一样方便。

#include math.h /*必须要有它*/ #include judge.h main() {

int num,result; scanf(%d,&num); result=judge(num); if(result==1) printf(yes\\n); else printf(no\\n); }

看上面的例子,我们在程序中直接使用了函数judge(),这就是我们自己编写的第一个所谓的库函数。但是程序的第一行要包含math.h文件,这是因为在judge.h里面使用了sqrt()函数,所以为了方便,我们可以把math.h放到judge.h

三种基本的循环语句: for语句、while语句和do-while语句。

一、循环语句

(一)、for循环 它的一般形式为: for(<初始化>;<条件表过式>;<增量>) 语句;

初始化总是一个赋值语句,它用来给循环控制变量赋初值;条件表达式是一个关系表达式,它决定什么时候退出循环;增量定义循环控制变量每循环一次后按什么方式变化。这三个部分之间用;分开。 例如:

for(i=1;i<=10;i++) 语句;

上例中先给i赋初值1,判断i是否小于等于10,若是则执行语句,之后值增加1。再重新判断,直到条件为假,即i>10时,结束循环。 注意:

(1).for循环中语句可以为语句体,但要用{和}将参加循环的语句括起来。

(2).for循环中的初始化、条件表达式和增量都是选择项,即可以缺省,但;不能缺省。省略了初始化,表示不对循环控制

变量赋初值。省略了条件表达式,则不做其它处理时便成为死循环。省略了增量,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。 (3).for循环可以有多层嵌套。 例如: for(;;) 语句; for(i=1;;i+=2) 语句; for(j=5;;) 语句;

这些for循环语句都是正确的。 main() { int i,j; printf(i j\\n); for(i=0;i<2;i++) for(j=0;j<3;j++) printf(%d %d\\n,i,j); }

输出结果为: i j 0 0 0 1 0 2

1 0 1 1 1 2

用for循环求1+2+……+100的和: main() {

int sn=0,i;

for(i=1;i<=100;i++) sn+=i; /*1+2+……+100*/ printf(%d\\n,sn); }

从程序可以看出,使用循环语句可以大大简化代码。 (二)、while循环 它的一般形式为: while(条件) 语句;

while循环表示当条件为真时,便执行语句。直到条件为假才结束循环。并继续执行循环程序外的后续语句。 例如:

#include stdio.h main() {

char c;

c='\\0'; /*初始化c*/

while(c!='\\n') /*回车结束循环*/ c=getche(); /*带回显的从键盘接收字符*/ }

上例中,while循环是以检查c是否为回车符开始,因其事先被初始化为空,所以条件为真,进入循环等待键盘输入字符;一旦输入回车,则c='\\n',条件为假,循环便告结束。与for循环一样,while循环总是在循环的头部检验条件,这就意味着循环可能什么也不执行就退出。 注意:

(1).在while循环体内也允许空语句。 例如:

while((c=getche())!='\\n'); 这个循环直到键入回车为止。 (2).可以有多层循环嵌套。

(3).语句可以是语句体, 此时必须用{和}括起来。 用while循环求1+2+……+100的和: main() {

int sn=0,i=0;

while(++i<=100)

sn+=i; /*求1+2+……+100*/ printf(%d\\n,sn); }

(三)、do--while循环 它的一般格式为: do { 语句块; }

while(条件);

这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断条件是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while循环至少要执行一次循环语句。 同样当有许多语句参加循环时,要用{和}把它们括起来。

用do--while循环求1+2+……+100的和: main() {

int sn=0,i=1; do

sn+=i; /*求1+2+……+100*/ while(++i<=100);

printf(%d\\n,num); }

看上面的例子,形式参数和实际参数的标识符都是num,程序把实际参数num的值传递给形式参数num。有些人可能就不明白了,既然两个都是num,为什么还要传递呢?干脆这样不就行了吗: void a(); main() { int num;

scanf(%d,&num); a(); } void a() {

printf(%d\\n,num); }

其实不然,这就要涉及到标识符作用域的问题。作用域的意思就是说,哪些变量在哪些范围内有效。一个标识符在一个语句块中声明,那么这个标识符仅在当前和更低的语句块中可见,在函数外部的其实地方不可见,其他地方同名的标识符不受影响,后面我们会系统讲解作用域的问题。在这儿你就要知道两个同名的变量在不同的函数中是互不干扰的。 前面将的都是变量与变量之间的值传递,其实函数也可以传递数组之间的值。看下面的例子:

void a(int []); main() {

int array[5],i;

for(i=0;i<5;i++) scanf(%d,&array[i]); a(array); }

void a(int array[]) { int i;

for(i=0;i<5;i++) printf(%d\\t,array[i]);

printf(\\n); }

这就是数组之间的值传递。注意他们的声明和定义形式,和变量参数传递有什么区别?有了后面的[]就表明传递的是一个数组。其中在定义的时候,也可以写成void a(int array[5]);想想,如果我们写成了int array[4]会有什么情况发生?

目前我们只学了数组和变量,以后还会知道指针、结构,到那是,函数也可以传递它们之间的值。

二、函数值的返回

其实我们也可以把函数当作一个变量来看,既然是变量,那一定也可以有类型。还举最前面的例子,现在要求在main()函数里输入一个整数作为正方形的边长,在子函数里求正方形的面积,然后再在主函数里输出这个面积。

我们前面的程序都是在子函数里输出的,现在要求在主函数里输出,这就需要把算好的值返回回来。先看例子:

int a(int); /*声明函数*/ main()

{

int num,area; scanf(%d,&num);

area=a(num); /*调用时的形式*/ printf(%d,area); }

int a(int num) {

int area_back; area_back=num*num;

return area_back; /*返回一个值*/ }

和前面的程序有几点不同:

(1).声明函数类型时,不是void,而是int。这是由于最后要求的面积是整型的,所以声明函数的返回值类型是整型。 (2).return语句 它的意思就是返回一个值。在C语言中,return一定是在函数的最后一行。

(3).调用函数的时候,由于函数有一个返回值,所以必须要用变量接受这个返回值(不是绝对的),如果我们不用一个变量接受这个值,函数还照样返回,但是返回的这个值没有使用。

上面的例子运行过程是这样的,先把实参的值传递给形参,然后在子函数里计算面积得到area_back,然后返回这个面积到主函数,也就是把area_back赋值给area,最后输出。 前面说了,返回值有时不一定非要用一个变量来接受,我们可以把上面的程序简化为:

int a(int); main() { int num;

scanf(%d,&num);

printf(%d,a(num)); /*函数调用放在这儿*/ }

int a(int num) {

int area_back; area_back=num*num; return area_back; }

这样函数返回的值就可以直接放到输出缓冲区直接输出了。

y=x+6; else y=3*x-2; printf(%f\\n,y); }

这里要说明两点:

(1).-5<=x&&x<1不能写成-5<=x<1;1<=x&&x<4也不能写成1<=x<4;在C语言中,不能认识连续不等式。

(2).y=2*x+5不能写成y=2x+5;y=3*x-2也不能写成y=3x-2;这与我们平时所写的方法不一样。

4.输入三个数x,y,z,然后按从大到小输出。 main() {

float x,y,z;

scanf(%f%f%f,&x,&y,&z); if(x>=y&&x>=z) {

printf(%f\\t,x);

if(y>=z) printf(%f\\t%f\\n,y,z); else printf(%f\\t%f\\n,z,y);

}

else if(y>=x&&y>=z) {

printf(%f\\t,y);

if(x>=z) printf(%f\\t%f\\n,x,z); else printf(%f\\t%f\\n,z,x); } else {

printf(%f\\t,z);

if(x>=y) printf(%f\\t%f\\n,x,y); else printf(%f\\t%f\\n,y,x); } }

说明:这是一个典型的if语句嵌套结构,如果不使用括号,那么if和else的对应关系就乱了。

四、switch--case语句

在编写程序时, 经常会碰到按不同情况分转的多路问题, 这时可用嵌套if -else-if语句来实现, 但if-else-if语句使用不方便, 并且容易出错。对这种情况, Turbo C2.0提供了一个开关语句。开关语句格式为:

switch(变量) {

case 常量1: 语句1或空; case 常量2: 语句2或空; . . .

case 常量n: 语句n或空; default: 语句n+1或空; }

执行switch开关语句时,将变量逐个与case后的常量进行比较,若与其中一个相等,则执行该常量下的语句,若不与任何一个常量相等,则执行default后面的语句。 注意:

1.switch中变量可以是数值,也可以是字符,但必须是整数。 2.可以省略一些case和default。

3.每个case或default后的语句可以是语句体,但不需要使用

{和}括起来。 例如: main() { int x,y; scanf(%d,&x); witch(x) { case 1: y=x+1;

break; /*退出开关语句,遇到break才退出*/ case 4: y=2*x+1; break; default: y=x--; break; }

printf(%d\\n,y); }

从上面的例子可以看出,用开关语句编的程序一定可以用if

语句做。那么在什么情况下需要用switch语句呢?一般在出现比较整的情况下或者能转化成比较整数的情况下使用。看下面的例子:

例子:一个学生的成绩分成五等,超过90分的为'A',80-89的为'B',70-79为'C',60-69为'D',60分以下为'E'。现在输入一个学生的成绩,输出他的等级。

(1).用if语句 main() {

float num; char grade; scanf(%d,&num); if(num>=90) grade='A';

else if(num>=80&&num<89) grade='B'; else if(num>=70&&num<79) grade='C'; else if(num>=60&&num<69) grade='D'; else grade='E'; printf(%c,grade); }

(2).用switch语句 main() { int num; char grade; scanf(%d,&num); num/=10; switch(num) { case 10: case 9: grade='A'; break; case 8: grade='B'; break; case 7: grade='C'; break; case 6: grade='D'; break;

default: grade='E'; break; }

printf(%c,grade); }

说明一点,并不是每个case里面有都语句,有时侯里面是空的,就好象这一题。switch语句执行的顺序是从第一case判断,如果正确就往下执行,直到break;如果不正确,就执行下一个case。所以在这里,当成绩是100分时,执行case 10:然后往下执行,grade='A';break;退出。 想想看,这里为什么要用num/=10;? 假设当程序中有浮点数时怎么办呢?

前面我们说的都是无参数无返回值的函数,实际程序中,我们经常使用到带参数有返回值的函数。

一、函数参数传递 1.形式参数和实际参数

函数的调用值把一些表达式作为参数传递给函数。函数定义中的参数是形式参数,函数的调用者提供给函数的参数叫实际参数。在函数调用之前,实际参数的值将被拷贝到这些形式参数中。 2.参数传递 先看一个例子:

void a(int); /*注意函数声明的形式*/ main() { int num;

scanf(%d,&num); a(num); /*注意调用形式*/ }

void a(int num_back) /*注意定义形式*/ {

printf(%d\\n,num_back); }

在主函数中,先定义一个变量,然后输入一个值,在a()这个函数中输出。当程序运行a(num);这一步时,把num的值赋值给num_back,在运行程序过程中,把实际参数的值传给形式参数,这就是函数参数的传递。

形参和实参可能不只一个,如果多于一个时,函数声明、调用、定义的形式都要一一对应,不仅个数要对应,参数的数据类型也要对应。

void a(int,float); main() {

int num1; float num2; scanf(%d,&num1); scanf(%f,&num2); a(num1,num2); }

void a(int num1_back,float num2_back) {

printf(%d,%f\\n,num1_back,num2_back); }

上面的例子中,函数有两个参数,一个是整型,一个是浮点型,那么在声明、调用、定义的时候,不仅个数要一样,类型也要对应。如果不对应,有可能使的编译错误,即使没错误,也有可能让数据传递过程中出现错误。 再看一个例子:

void a(int); main() { int num;

scanf(%d,&num); a(num); }

void a(int num) {


C语言三种循环语句.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:汇港城售楼部装修施工方案设计

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: