版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章C语言的基本程序设计
本章介绍C语言程序设计的基本方法和基本的程序语句。使读者对C程序有一个初步的认识,为后面各章的学习打下基础。3.1C语言的语句概述3.2算法与结构化程序设计方法3.3顺序结构程序设计3.4顺序结构程序设计实训3.5选择结构程序设计3.6选择结构程序设计实训3.7循环结构程序设计3.8循环结构程序设计实训3.1C语言的语句概述
C语句可分为以下五类:表达式语句、函数调用语句、控制语句、复合语句、空语句。
1表达式语句
表达式语句由表达式加上分号“;”组成。格式为:表达式;例如:sum=a+b;i++;printf("Hello,everyone!\n");执行表达式语句就是计算表达式的值。最常用的表达式语句是赋值语句和函数调用语句。
2函数调用语句格式为:函数名(实际参数表);
执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。(在第六章函数中详细介绍)例如printf("CProgram");调用库函数,输出字符串。
3控制语句控制语句用于控制程序的流程,以实现程序的各种结构方式。C语言有九种控制语句。可分成以下三类:(1)条件判断语句if语句,switch语句(2)循环执行语句dowhile语句,while语句,for语句(3)转向语句break语句,goto语句,continue语句,return语句4复合语句
在C语言中,把多个语句用一对大括号“{}”括起来组成的语句称复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句,例如例如:{x=y+z;a=b+c;printf("%d%d",x,a);}
是一条复合语句。复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。5空语句
格式:;
功能:不进行任何操作,只起到占位的作用,在程序中可用来作空循环体。例如:for(i=0;i<100;i++);这里的循环体为空语句,for循环虽然执行了多次,由于循环体为空,循环只是有延时作用而已。[Return]3.2算法与结构化程序设计方法
3.2.1算法1算法的概念数据结构(datastructure)是对数据的描述,在程序中要指定数据的类型和数据的组织形式;算法(algorithm)是对操作的描述,即操作步骤。实际上,一个程序除了以上两个主要要素之外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。程序=算法十数据结构十程序设计方法十语言工具和环境计算机的算法可分为两大类:数值运算算法和非数值运算算法。数值运算算法主要用于解决数值计算问题,如求方程的根、求函数值、求定积分等。数值运算算法以外的算法均属于非数值运算算法,如排序问题采用的算法就是非数值运算算法。【例3-1】交换两个变量a、b的值。对于交换两个变量a、b值问题,可以借助于临时变量c,采用以下步骤实现:S1:c=a;S1:c=b;S2:a=b;或S2:b=a;S3:b=c;S3:a=c;【例3-2】求1+2+3+…+10的和。设两个变量S和i,分别用以存放部分和及整数l~10。采取以下步骤实现目标:S1:S=0S2:i=1S3:S=S+iS4:i=i+lS5:如果i不大于10,则返回重新执行步骤S3及其后续的S4、S5。否则,算法到此结束,变量S中保存的就是要求的和。
2算法的特性(1)有穷性一个算法必须包含有限个操作步骤,且要在合理的时间范围内由计算机处理完成。(2)确定性算法中的每一个步骤都应当是确定的,而不应当是含糊的、有歧义的。(3)有零个或多个输入所谓输入是指在执行算法时需要从外界取得必要的信息。(4)有一个或多个输出算法的目的是为了求解,“解”就是输出。一个算法得到的结果就是算法的输出。没有输出的算法是没有意义的。(5)有效性算法中的每一个步骤都应当能有效地执行,并得到确定的结果。
3算法的表示算法的表示或者描述主要可以用以下几种方法:自然语言、流程图、N-S结构图和伪代码。其中最常用的方法是流程图和N-S结构图。(1)三种基本结构l)顺序结构:其中A和B两个框是顺序执行的(其结构如图3-1)。2)选择结构或称分支结构:根据给定的条件p是否成立而选择执行A框或B框,A框和B框必有一个被执行(其结构如图3-2)。3)循环结构(又称重复结构),即重复执行某一部分操作的结构。循环结构分两种:当型循环结构和直到型循环结构。①当型循环结构:如图3-3(a)所示。②直到型循环结构:如图3-3(b)所示。图3-1顺序结构图3-2选择结构(a)当型循环(b)直到型循环(2)用N-S结构图表示算法图3-4为例3-1的N-S结构图。图3-5为例3-2的N-S结构图。c=aa=bb=c图3-4例3-1的N-S结构图图3-5例3-2的N-S结构图3.2.2结构化程序设计方法一个结构化程序就是用高级语言表示或实现的结构化算法。结构化程序设计方法包括以下几个步骤:自顶而下、逐步细化、模块化设计、结构化编码。对于一个复杂的任务,先要对其进行详尽的分析,把它分解成若干个相互独立的子任务(模块):再把每一个子任务分解成若干个更小的子任务(子模块),直到子任务足够小,可以直接用简单的算法来实现为止;然后对每一个分解后的子任务(子模块)进行程序编码,即模块化程序设计:最后按照刚才分解的相反顺序组合各个模块,最终解决问题。这种设计时自顶而下、逐步细化,实现时自下而上、逐步组合的结构化程序设计方法全局性强,有利于保证程序层次分明、结构清晰、算法正确。[Return]3.3顺序结构程序设计
3.3.1数据输出函数1字符输出函数putchar(1)格式putchar(字符变量);(2)功能putchar函数是字符输出函数,其功能是在显示器上输出单个字符。(3)使用说明程序中如使用本函数,则必须在文件开头使用文件包含命令#include<stdio.h>或#include“stdio.h”将库函数包括到用户源文件中。例如:putchar('A');输出大写字母A。putchar(x);输出字符变量x的值。putchar('\n');换行。2格式输出函数printfprintf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但由于printf函数使用频繁,系统不要求在使用printf函数之前必须包含stdio.h文件。(1)格式printf("格式控制字符串",输出表列)(2)格式字符串格式字符串的格式为:%[标志][输出最小宽度][.精度][长度]格式字符1)格式字符:格式字符用以表示输出数据的类型,其含义如下所示:格式字符
含义d,i以十进制形式输出带符号整数(正数不输出符号)o以八进制形式输出无符号整数(不输出前缀O)x,X以十六进制形式输出无符号整数(不输出前缀Ox)(格式字符为x,输出十六进制的a~f时用小写,否则用大写)u以十进制形式输出无符号整数f以小数形式输出单、双精度实数,隐含输出6位小数。e,E以指数形式输出单、双精度实数,隐含输出6位小数。(用e时指数用e表示(如1.2e+02),否则用E表示(如1.2E+02))g,G选%f或%e中输出宽度较短的一种格式输出c输出单个字符s输出字符串2)标志常用标志字符为-、+两种,他们的意义分别是:-:结果左对齐,右边填空格。+:输出符号(正号或负号)空格:输出值为正时冠以空格,为负时冠以负号。3)输出最小宽度用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则左边补以空格或0(默认格式为右对齐)。4)精度精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。5)长度长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。(3)说明如果要输出字符“%”,则应该在“格式控制”字符串中用连续两个%表示。例如:printf("%f%%",1.0/4);输出结果为:0.250000%f格式符,用来输出实数(包括单、双精度),以小数形式输出。格式:%f,%m.nf,%-m.nf都可。
注意:单精度实数的有效位数一般为7位,双精度为16位。【例3-4】用printf函数输出数据。main(){inta=25;floatb=123.4567898;doublec=34567890.1234567;chard='k';printf("a=%d,%5d,%o,%x,%u\n",a,a,a,a,a);printf("b=%f,%lf,%10.4f,%5.4f,%e,%10.2e\n",b,b,b,b,b,b);printf("c=%f,%e,%g\n",c,c,c);printf("d=%c,%8c,%i\n",d,d,d);printf("string=%s,%8s,%8.3s,%-8.3s\n","china","china","china","china");}程序执行结果为:a=25,25,31,19,25b=123.456787,123.456787,123.4568,123.4568,1.23457e+02,1.2e+02c=34567890.123457,3.45679e+07,3.45679e+07d=k,k,107string=china,china,chi,chi
3.3.2数据输入函数1字符输入函数getchar()(1)格式getchar()(2)功能其功能是从键盘上输入一个字符。通常把输入的字符赋予一个字符变量,构成赋值语句。(3)使用说明1)getchar函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。2)使用本函数前必须包含文件“stdio.h”。3)在TC屏幕下运行含本函数程序时,将退出TC屏幕进入用户屏幕等待用户输入。输入完毕再返回TC屏幕。
【例3-5】用getchar()函数输入字符。#include<stdio.h>main(){charch;printf("inputacharacter\n");ch=getchar();putchar(ch);}程序执行结果为:inputacharacter↙zz2格式输入函数scanfscanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。(1)格式scanf(“格式控制字符串”,地址表列);
其中,格式控制字符串的作用与printf函数相同,地址表列中给出各变量的地址,或字符串的首地址。变量的地址是由地址运算符“&”后跟变量名组成的。(2)格式字符串格式字符串的格式为:%[*][输入数据宽度][长度]格式字符下面介绍各项的具体含义。
【例3-6】用scanf函数输入数据。main(){inta,b,c;printf("inputa,b,c\n");scanf("%d%d%d",&a,&b,&c);printf("a=%d,b=%d,c=%d\n",a,b,c);}程序执行结果为:inputa,b,c↙123a=1,b=2,c=31)格式字符格式字符表示输入数据的类型,其含义如下所示:格式字符含义d输入带符号的十进制整数o输入无符号的八进制整数x,X输入无符号的十六进制整数(大小写作用相同)u输入无符号的十进制整数f,e,E,g,G输入实型数(用小数形式或指数形式,大小写作用相同)c输入单个字符s输入字符串2)“*”符表示跳过指定的输入项或列数,读入的数据不赋予相应的变量。例如:scanf("%d%*d%d",&a,&b);当输入123时,把1赋予a,2被跳过,3赋予b。3)宽度用十进制整数指定输入的宽度(即字符数),系统将自动截取所需数据。例如:scanf("%5d",&a);如输入12345678则只把12345赋予变量a,其余部分被截去。4)长度长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf)。h表示输入短整型数据。(3)使用说明1)输入数据时不能规定精度例如:scanf("%8.3f",&a);是非法的。不能企图用此语句输入小数为3位的实数。2)格式字符串后面应当是变量地址,而不该是变量名。例如:scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。
3)格式字符串中除了格式字符外还出现了非格式字符,则输入时应输入与这些字符相同的字符。例如:scanf(“%d,%d”,&a,&b);应输入3,4。这里的“,”与格式字符串中的“,”对应。如果输入34或3;4则不正确。4)在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。[Return]3.4顺序结构程序设计实训
在确定算法和数据结构以后,顺序结构程序设计可归纳为五步:⑴包含头文件或宏定义(不是必有的)⑵定义变量和类型⑶变量赋初值(可定义时赋,或用赋值语句,或键入)⑷计算处理(考虑类型转换、溢出)⑸输出结果(考虑类型、精度)根据上面介绍的步骤进行下面的程序设计。【例3-7】计算任意两整数的和、差、积、商。【例3-8】计算圆柱的体积。【例3-9】计算一元二次方程ax2+bx+c=0的根。(假设b2-4ac>0)【例3-10】按不同格式输出整型与长整型。【例3-11】输入一个三位正整数,以倒序形式输出它的各位数。[Return]【例3-7】计算任意两整数的和、差、积、商。#include"stdio.h"main(){inta,b,c,d,e,f;printf("pleaseinputtwointegeraandb:\n");scanf("%d%d",&a,&b);c=a+b;d=a-b;e=a*b;f=a/b;printf("%d+%d=%d%d-%d=%d\n",a,b,c,a,b,d);printf("%d*%d=%d%d/%d=%d\n",a,b,e,a,b,f);}程序执行结果为::pleaseinputtwointegeraandb:151015+10=2515-10=515*10=15015/10=1【例3-8】计算圆柱的体积。定义实型变量radius,high,vol分别表示圆柱的底面半径、高和体积。#definePI3.1415926main(){floatradius,high,vol;printf("Pleaseinputradius&high:");scanf("%f%f",&radius,&high);/*从键盘输入两个实数赋给变量radius,high*/vol=PI*radius*radius*high;printf("radius=%7.2f,high=%7.2f,vol=%7.2f\n",radius,high,vol);}程序执行结果为::Pleaseinputradius&high:25radius=2.00,high=5.00,vol=62.83【例3-9】计算一元二次方程ax2+bx+c=0的根。(假设b2-4ac>0)#include“math.h” /*为使用求平方根函数sqrt(),必须包含math.h头文件*/main(){floata,b,c,disc,x1,x2;printf("inputa,b,c:");scanf("%f,%f,%f",&a,&b,&c); /*输入方程的三个系数的值*/disc=b*b-4*a*c; /*求判别式的值赋给disc*/x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf("\nx1=%6.2fx2=%6.2f\n",x1,x2);}程序执行结果为:inputa,b,c:1,3,2x1=-1.00x2=-2.00【例3-10】按不同格式输出整型与长整型。main(){intnum1=123;longnum2=123456;/*用3种不同格式,输出int型数据num1的值*/printf("num1=%d,num1=%5d,num1=%-5d,num1=%2d\n",num1,num1,num1,num1);/*用3种不同格式,输出long型数据num2的值*/printf("num2=%ld,num2=%8ld,num2=%5ld\n",num2,num2,num2);}程序执行结果为::num1=123,num1=123,num1=123,num1=123num2=123456,num2=123456,num2=123456【例3-11】输入一个三位正整数,以倒序形式输出它的各位数。(例如:输入123,则输出321)main(){intx,a,b,c;printf("pleaseinputx:");scanf("%d",&x);/*输入一个三位正整数*/c=x%10;/*获得个位数字*/b=x/10%10;/*获得十位数字*/a=x/100;/*获得百位数字*/printf("\nx=%d,daoshu=%d\n",x,100*c+10*b+a);}程序执行结果为::pleaseinputx:345x=345,daoshu=5433.5选择结构程序设计
3.5.1if语句1if语句的三种基本格式(1)if型1)格式if(表达式)语句;2)执行过程如果表达式的值为真,则执行其后的语句,否则不执行该语句,执行后继语句。其执行过程如图所示:3)使用说明:这里的表达式一般是关系表达式、逻辑表达式,但还可以是算术表达式、赋值表达式或字符表达式,甚至也可以是一个变量,这正是C语言灵活性的具体体现。系统对表达式的值进行判断,若为非零就按真来处理,执行语句;若为零就按假来处理,不执行语句。【例3-12】输入两个整数,比较它们的大小,并将其中的大数输出。main(){inta,b,max;printf("\ninputtwonumbers:");scanf("%d%d",&a,&b);max=a;if(max<b)max=b;printf("max=%d\n",max);}程序执行结果为::inputtwonumbers:510max=10(2)if-else型1)格式:if(表达式)语句1;else语句2;2)执行过程如果表达式的值为真,则执行语句1,否则执行语句2,语句1或语句2执行完之后,执行后继语句。其执行过程如图所示:3)使用说明:①语句1、语句2后面都必须有“;”,它们可以是简单语句,也可以是复合语句。②若if语句中,在表达式为真或为假时,都执行一个赋值语句,且是给同一个变量赋值,就可以用条件表达式来处理。如:max=(a>b)?a:b;当然,条件表达式很多时候不能取代一般的if语句。(3)if-else-if型1)格式if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;…elseif(表达式n)语句n;else语句n+1;
【例3-13】从键盘输入学生的考试成绩,利用计算机将学生的成绩划分等级并输出。学生的成绩可分为5个等级,这5个等级是:90~100分为A级,80~89分为B级,70~79分为C级,60~69分为D级,0~59分为E级。学生的考试成绩为0~99分。main(){intscore;printf("pleaseinputascore:\n");scanf("%d",&score);if((score<0)||(score>100))printf("dataerror!\n");elseif(score>=90)printf("thegradeisA.\n");elseif(score>=80)printf("thegradeisB.\n");elseif(score>=70)printf("thegradeisC.\n");elseif(score>=60)printf("thegradeisD.\n");elseprintf("thegradeisE.\n");}程序执行结果为:pleaseinputascore:95A(4)if语句(三种格式)的使用说明1)在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。2)在if和else后面可以只含一个语句,也可以有一组(多个)语句,此时必须把这一组语句用大括弧括起来组成一个复合语句。但要注意的是在右花括弧之后不能再加分号。
if语句的嵌套当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。(1)格式:if(表达式1)if(表达式2)语句1;else语句2;elseif(表达式3)语句3;else语句4;(2)说明:1)在嵌套的if语句中,经常会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。C语言规定,else总是与它上面最近的还没有配对的if配对。2)如果程序要求else必须与某一个if配对,则应通过添加大花括弧构成复合语句,以此来确定匹配关系。【例3-14】比较两个数的大小关系。main(){inta,b;printf("pleaseinputa,b:\n");scanf("%d%d",&a,&b);if(a!=b)if(a>b)printf("%d>%d\n",a,b);elseprintf("%d<%d\n",a,b);elseprintf("%d=%d\n",a,b);}程序执行结果为:pleaseinputA,B:①35②64③553<56>45=5main(){inta,b;printf("pleaseinputA,B:");scanf("%d%d",&a,&b);if(a==b)printf("%d=%d\n",a,b);elseif(a>b)printf("%d>%d\n",a,b);elseprintf("%d<%d\n",a,b);}3.5.2switch语句C语言还提供了另一种用于多分支选择的switch语句。1格式switch(表达式){case常量表达式1:语句1;case常量表达式2:语句2;…case常量表达式n:语句n;default:语句n+1;}2执行过程计算表达式的值,并逐个与其后的常量表达式值相比较,当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句n+1。【例3-15】利用switch语句重新完成例3-13编程任务。main(){intscore;printf("inputascore(0~100):");scanf("%d",&score);score=score/10;; /*将成绩整除10,转化成switch语句中的case标号*/switch(score){case10:case9:printf("grade=A\n");/*标号10和9,都执行本行的语句*/case8:printf("grade=B\n");case7:printf("grade=C\n");case6:printf("grade=D\n");case5:case4:case3:case2:case1:case0:printf("grade=E\n");/*标号5~0,都执行本行的语句*/default:printf("Thescoreisoutofrange!\n");/*成绩超出范围时,提示出错*/}}程序执行结果为:inputascore(0~100):95grade=Agrade=Bgrade=Cgrade=Dgrade=EThescoreisoutofrange!main(){intscore;printf("inputascore(0~100):");scanf("%d",&score);score=score/10; /*将成绩整除10,转化成switch语句中的case标号*/switch(score){case10:case9:printf("grade=A\n");break;/*标号10和9,都执行本行的2条语句*/case8:printf("grade=B\n");break;case7:printf("grade=C\n");break;case6:printf("grade=D\n");break;case5:case4:case3:case2:case1:case0:printf("grade=E\n");break;/*标号5~0,都执行本行的2条语句*/default:printf("Thescoreisoutofrange!\n");/*成绩超出范围时,提示出错*/}}【例3-16】计算器程序。用户输入运算数和四则运算符,输出计算结果。main(){floata,b,s;charc;printf("inputexpressiona+(-,*,/)b:\n");scanf("%f%c%f",&a,&c,&b);switch(c){case'+':printf("%f\n",a+b);break;case'-':printf("%f\n",a-b);break;case'*':printf("%f\n",a*b);break;case'/':printf("%f\n",a/b);break;default:printf("inputerror\n");}}程序执行结果为:inputexpressiona+(-,*,/)b:15+10253使用说明(1)在case后的各常量表达式的值必须互不相同,否则会出现错误。(2)在case后,允许有多个语句,可以不用{}括起来。(3)各case和default子句的出现先后顺序不会影响程序执行结果。(4)default子句可以省略不用。[Return]3.6选择结构程序设计实训
【例3-17】输入三个整数x,y,z,请把这三个数由小到大输出。【例3-18】输入并判断和显示任意一年是否为闰年。【例3-19】编写一个计算售票收款数目的小程序。具体要求为:每张票零售价格为25元,团体票价为20元,一次购票数目超过30张(包含30)时按团体票出售。对输入的购票数目计算并输出相应的购票款的数额。【例3-20】编写一个已知利润计算薪水的程序。标准如下:(profit表示利润,薪水的单位是元)profit≤1000基础薪水为5001000<profit≤2000另按利润的10%提2000<profit≤5000另按利润的15%提5000<profit≤10000另按利润的20%提10000<profit另按利润的25%提[Return]【例3-17】输入三个整数x,y,z,请把这三个数由小到大输出。main(){intx,y,z,temp;scanf("%d%d%d",&x,&y,&z);if(x>y){temp=x;x=y;y=temp;}/*交换x,y的值*/if(x>z){temp=z;z=x;x=temp;}/*交换x,z的值*/if(y>z){temp=y;y=z;z=temp;}/*交换z,y的值*/printf("smalltobig:%d%d%d\n",x,y,z);}程序执行结果为:1001288smalltobig:1288100【例3-18】输入并判断和显示任意一年是否为闰年。main(){intyear;printf("pleaseinputayear:\n");scanf("%d",&year);if(year%4==0&&year%100!=0||year%400==0)printf("theyear%disleapyear.\n",year);elseprintf("theyear%disnotleapyear.\n",year);}程序执行结果为:pleaseinputayear:2000theyear%disleapyear.main(){intyear,leap=0; /*leap=0:预置为非闰年*/printf("Pleaseinputtheyear:");scanf("%d",&year);if(year%4==0)if(year%100!=0)leap=1;elseif(year%400==0)leap=1;if(leap)printf("%disaleapyear.\n",year);elseprintf("%disnotaleapyear.\n",year);}【例3-19】编写一个计算售票收款数目的小程序。具体要求为:每张票零售价格为25元,团体票价为20元,一次购票数目超过30张(包含30)时按团体票出售。对输入的购票数目计算并输出相应的购票款的数额。main(){intnumber;floattotal;printf("pleaseinputthenumberofticketsyouwanttobuy:\n");scanf("%d",&number);if((number<0)||(number>3000))printf("dataerror!\n");elseif(number>=30){total=20.0*number;printf("youmustpay%.2fyuan.\n",total);}else{total=25.0*number;printf("youmustpay%.2fyuan.\n",total);}}程序执行结果为:①35youmustpay700.00yuan②15youmustpay375.00yuan【例3-20】main(){longprofit;intgrade;floatsalary=500;printf("Inputprofit:");scanf("%ld",&profit);grade=(profit-1)/1000; /*将利润-1、再整除1000,转化成switch语句中的case标号*/switch(grade){case0:break; /*profit≤1000*/case1:salary+=profit*0.1;break; /*1000<profit≤2000*/case2:case3:case4:salary+=profit*0.15;break; /*2000<profit≤5000*/case5:case6:case7:case8:case9:salary+=profit*0.2;break; /*5000<profit≤10000*/default:salary+=profit*0.25; /*10000<profit*/}printf("salary=%.2f\n",salary);}3.7循环结构程序设计
循环结构是结构化程序设计中三种基本结构之一。C语言提供了while、dowhile、for三种循环语句来组成各种不同形式的循环结构。3.7.1while循环语句1格式while(表达式)语句;其中表达式是循环条件,语句为循环体。2执行过程先计算表达式的值,若表达式的值为真(非0)时,执行循环体语句;然后重复执行上面的操作,直到表达式的值为假时结束循环,执行while循环后面的语句。其执行过程可用图表示。
3使用说明
1)while语句中的表达式一般是关系表达式或逻辑表达式,只要表达式的值为真(非0)即可继续循环。2)循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。3)循环体中应有修改循环变量、使循环趋于结束的语句,否则出现死循环。4)循环之前要为有关变量赋初值。一般要设计循环程序,首先要根据问题找出“循环三要素”。即:1)有关变量的初始化,应放在循环之前。2)循环条件3)循环内要重复执行的任务。
【例3-21】计算1+2+3+…100的和。main(){inti=1,sum=0; /*初始化循环控制变量i和累计器sum*/while(i<=100){sum+=i; /*实现累加*/i++; /*循环控制变量i增1*/}printf("sum=%d\n",sum);}程序执行结果为:sum=50503.7.2dowhile循环语句1格式do语句;while(表达式);其中语句是循环体,表达式是循环条件。2执行过程先执行循环体语句,再判别表达式的值,若为真(非0)则返回重复执行循环体语句,如此反复,直到表达式为假终止循环。执行过程如图所示。3使用说明do-while语句和while语句的区别在于do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。(2)在if语句、while语句中,表达式后面都不能加分号,而在do-while语句的表达式后面则必须加分号。(3)do和while之间的循环体由多个语句组成时,必须用{}括起来组成一个复合语句。(4)编程时do-while语句和while语句一般可以相互转换。(5)循环之前要为有关变量赋初值。
例如:利用do-while语句计算1+2+3+…100的和。main(){inti=1,sum=0; /*初始化循环控制变量i和累计器sum*/do{sum+=i; /*实现累加*/i++; /*循环控制变量i增1*/}while(i<=100);/*循环继续条件:i<=100*/printf("sum=%d\n",sum);}
3.7.3for循环语句for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。1格式for(表达式1;表达式2;表达3)语句;其中:“语句”即为循环体语句。(1)先计算表达式1的值。(2)再计算表达式2的值,若值为真(非0)则执行循环体语句,否则结束循环,执行for语句的后继语句。(3)然后再计算表达式3的值,转回第2步继续执行。例如:利用for语句来计算1+2+3+…100的和。
main(){inti=1,sum=0;for(;i<=100;i++)sum+=i;printf("sum=%d\n",sum);}3使用说明for语句最常用的格式是:for(循环变量赋初值;循环条件;循环变量的增值)语句;如果在for语句外(即for语句出现前)给循环变量赋初值,可省略表达式1。表达式2一般为关系表达式或逻辑表达式。表达式3通常可用来修改循环变量的值,一般是赋值语句。for语句中的各表达式都可省略,但分号间隔符不能少。循环体可以是空语句,但空语句后的分号不可少。
这三个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。【例3-22】求1、1、2、3、5、8、13、...Fibonacci数列的前20个数。#include"stdio.h"main(){longf1=1,f2=1,fn;/*定义并初始化数列的前2个数*/inti,n;printf("\n%20ld%20ld",f1,f2); /*输出前2个Fibonacci数*/for(i=3;i<=20;i++){fn=f1+f2;/*计算下1个Fibonacci数*/f1=f2;f2=fn;printf("%20ld",fn);}}也可以在循环体内每次产生两个Fibonacci数,程序修改如下:main(){longintf1=1,f2=1; /*定义并初始化数列的前2个数*/inti=1; /*定义并初始化循环控制变量i*/for(;i<=10;i++) /*每组2个数,20组40个数*/{printf("%15ld%15ld",f1,f2);/*输出当前的2个数*/if(i%2==0)printf("\n"); /*输出2次(4个数)后换行*/f1=f1+f2;f2=f2+f1; /*计算2个新数*/}}4几种循环语句的比较(1)for循环主要用于循环变量初值、步长、增量以及循环次数确定的循环。(2)while或do-while循环主要用于循环次数及判断条件要在循环执行过程中才能确定的循环。(3)用while和do-while循环时,循环变量的初始化应在while和do-while语句之前完成。for循环中,循环变量的初始化可在表达式1中完成,也可放于循环之前。(4)while和do-while循环可以互相转换。for循环也可以转换为while和do-while循环,但是while和do-while循环倒不一定能转换为for循环。(5)三种循环中for循环的功能最强,凡是其它两个循环能实现的,用for循环也能实现。3.7.4break语句和continue语句1break语句(1)格式break;(2)执行过程break语句只能用在switch语句或循环语句中,其功能是跳出switch语句或跳出本层循环,转去执行后继语句。使用break语句可以使循环语句有多个出口,在某些情况下使编程更加灵活、方便。2continue语句格式continue;(2)执行过程continue语句只能用在循环体中,结束本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断与执行。应注意的是,本语句只结束本层本次的循环,并不跳出循环。【例3-23】break语句的应用。main(){intsum,i;for(i=1,sum=0;;i++)/*省略了表达式2*/{sum=sum+i;if(i==100)break;/*利用if语句判断循环是否结束*/}printf("sum=%d\n",sum);}程序执行结果为:sum=5050【例3-24】输出100以内所有8的倍数,要求输出时每5个数占一行。main(){intn,i=0;for(n=8;n<=100;n++){if(n%8!=0)continue;printf("%10d",n);i++;if(i%5==0)printf("\n");}printf("\n");}3.7.5循环的嵌套当循环体内某语句又是循环语句时,就构成了循环的嵌套。内嵌循环的循环体中还可以出现循环语句,这就构成了多重循环。C语言中,for语句、while语句、do-while语句可以相互嵌套,构成多重循环。例如:(1)for(;;)(3)while(){…{while()…{…}for(;;)…
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度企业内退员工社交活动组织合同
- 2024年度翻译服务与劳务合同
- 2024年度企业与广告公司宣传推广合同
- 2024年度环境保护合同with环境保护项目描述及实施期限
- 2024年度企业融资借款合同范本示例
- 2024年度电商行业市场调研与竞争分析合同3篇
- 2024年度企业员工劳动合同全周期服务
- 2024年度影视制作委托合同标的为电影制作及发行
- 手指肌腱断裂康复治疗
- 2024年度大连市房屋租赁合同租金调整机制
- 道教高功培训班符咒课程讲述
- 基因与健康PPT通用课件
- 酒店组织架构图以及各岗位职责(完整版)
- 环境地质学试题库(共45页)
- 肝癌免疫治疗pptx课件
- 无题(相见时难别亦难)(正式)PPT课件
- 新吨公里计算
- 心理咨询之ACT疗法
- 全国渔业行政执法案件基本法律文书格式
- ISO9001_2016年[全套]质量管理体系文件
- 桥式吸砂机操作使用说明书
评论
0/150
提交评论