第4章 程序的控制结构_第1页
第4章 程序的控制结构_第2页
第4章 程序的控制结构_第3页
第4章 程序的控制结构_第4页
第4章 程序的控制结构_第5页
已阅读5页,还剩142页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章程序的控制结构湖南师范大学工程与设计学院倪芳英C语言大学实用教程1内容提要算法的描述方法顺序结构选择结构循环结构流程转移控制语句程序的调试与排错4.1算法及描述方法

数据结构+算法=程序算法:为解决一个具体问题而采取的确定的有限的操作步骤,这里仅指计算机能执行的算法算法特性:有穷性确定性

有效性

没有输入或有多个输入

有一个或多个输出

4.1.1算法的概念算法的分类

数值运算算法:解决的是求数值解的问题,例如用辗转相除法求两个数的最大公约数等非数值运算算法:主要用于解决需要用分析推理、逻辑推理才能解决的问题,例如人工智能中的许多问题,查找、分类等问题4.1.2算法的表示方法自然语言表示传统的流程图表示N-S结构化流程图表示

伪代码表示1用自然语言表示算法

自然语言就是人们日常使用的语言,可以是汉语或英语或其它语言。用自然语言表示通俗易懂,但文字冗长,容易出现“歧义性”。自然语言表示的含义往往不大严格,要根据上下文才能判断其正确含义,描述包含分支和循环的算法时也不很方便。因此,除了那些很简单的问题外,一般不用自然语言描述算法。

例如:求n!2用流程图表示算法美国国家标准化协会ANSI(AmericanNationalStandardInstitute)规定了一些常用的流程图符号:起止框判断框处理框输入/输出框注释框流向线连接点将求5!的算法用流程图表示如果需要将最后结果打印出来,可在菱形框的下面加一个输出框。

流程图是表示算法的较好的工具。一个流程图包括以下几部分:(1)表示相应操作的框;(2)带箭头的流程线;(3)框内外必要的文字说明。用N-S流程图表示算法

1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框,或者说,由一些基本的框组成一个大的框。这种流程图又称N--S结构化流程图。求5!算法用N-S图表示4.2顺序结构

C程序结构C程序源程序文件1源程序文件2源程序文件3编译预处理命令全局变量声明函数1函数n…函数首部函数体局部变量声明执行语句程序是解决某种问题的一组指令的有序集合。著名计算机科学家沃思(NikiklausWirth)提出一个公式:程序=数据结构+算法

程序是什么?对数据的描述。在C语言中,体现为数据类型的描述!对数据处理的描述。是为解决一个问题而采取的方法和步骤,是程序的灵魂!

<<数据结构>><<算法设计与分析>>结论:学好C语言首先就必须十分了解C语言的数据类型、运算符与表达式。12构成程序的三种基本结构顺序结构选择结构循环结构已经证明,任何程序均可只用这三种结构综合描述只用这三种结构编制的程序,叫结构化程序程序必须符合结构化规则结构化程序设计的核心思想

采用顺序、选择和循环三种基本结构作为程序设计的基本单元

只有一个入口;只有一个出口;无死语句,即不存在永远都执行不到的语句;无死循环,即不存在永远都执行不完的循环。采用“自顶向下、逐步求精”和模块化的方法进行结构化程序设计

BANS图传统流程图4.2.1顺序结构的流程图表示BA4.2.2顺序结构程序设计举例例1输入三角形的三边长,求三角形面积。假设:三个边长a,b,c能构成三角形。已知面积公式:area=s=(a+b+c)*0.5开始输入三边长计算s计算面积结束顺序结构程序设计举例

#include<stdio.h>

#include<math.h>

voidmain()

{floata,b,c,s,area;

scanf(“%f,%f,%f”,&a,&b,&c);

s=1.0/2*(a+b+c);

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf(“a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n”,a,b,c,s);

printf(“area=%7.2f\n”,area);}

数学函数库因为要用到其中的sqrt函数运行情况:

3,4,6

a=3.00,b=4.00,c=6.00,s=6.50

area=5.33顺序结构程序设计举例例2

从键盘输入一个大写字母,要求改用小写字母输出。

#include<stdio.h>

voidmain()

{charc1,c2;

c1=getchar();

printf("%c,%d\n",c1,c1);

c2=c1+32;

printf("%c,%d\n",c2,c2);

}运行情况:

A↙

A,65

a,97

顺序结构程序设计举例例3求ax2+bx+c=0方程的根。

a,b,c由键盘输入,设>0。

众所周知,一元二次方程式的根为

x1=x2=

可以将上面的分式分为两项:

p=,q=x1=p+q,x2=p-q顺序结构程序设计举例#include<stdio.h>

#include<math.h>

voidmain()

{

floata,b,c,disc,x1,x2,p,q;

scanf("a=%f,b=%f,c=%f",&a,&b,&c);

disc=b*b-4*a*c;

p=-b/(2*a);

q=sqrt(disc)/(2*a);

x1=p+q;x2=p-q;

printf("\n\nx1=%5.2f\nx2=%5.2f\n",x1,x2);

}运行情况:

a=1,b=3,c=2↙

x1=-1.00

x2=-2.004.3选择结构和条件判断生活中的条件判断场景:如果明天是晴天,我们去爬岳麓山。如果电机转速超过s1,则制动设备开始工作。如果实验结果正确,则进行下一实验,否则,修正参数后重复实验。一般判断过程:如果(条件)则{动作1}否则{动作2}对应C语言的if语句(如图):if(表达式){语句1}else{语句2}BN如果

成绩<60

那么

通知补考否则

告知你考试成绩AY条件PABNY条件P4.3.2选择结构的流程图表示if语句实现选择结构【例1】输入两个整数,输出其中的大数。#include<stdio.h>intmain(){

inta,b;

printf("inputtwonumbers:");

scanf("%d%d",&a,&b);if(a>b)

printf("max=%d\n",a);else

printf("max=%d\n",b);}例4.2输入3个数a,b,c,要求按由小到大的顺序输出。#include<stdio.h>intmain(){floata,b,c,t;

scanf("%f,%f,%f",&a,&b,&c);

if(a>b){t=a;a=b;b=t;}

if(a>c){t=a;a=c;c=t;}

if(b>c){t=b;b=c;c=t;}printf("%5.2f,%5.2f,%5.2f\n",a,b,c);return0;}复合语句{}括住的若干条语句构成一个复合语句语句块内可以定义变量变量仅在定义它的复合语句内有效变量必须在复合语句的开头定义复合语句可以用在任何可以使用语句的地方if语句一、功能:判定所给定的条件是否满足,根据判定的结果(真或假)决定是否要执行后面的语句。二、格式:

if(判断条件)

语句;此处无分号此处有分号例a1:if(x>y)

printf("%d",x);x>y输出x真(非0)假(0)当if后面的语句不止一条时,应用大括号将几个语句括起来成为一个复合语句。例a2:if(a>b){printf("%d",a+b);

printf("%d",a-b);}4.3.3条件语句if-else语句●功能:当判断条件成立,即执行if语句主体,判断条件不成立时,则可执行else后面的语句主体。●格式:if(判断条件)

语句;

else

语句;无分号有分号无分号有分号if(判断条件){语句主体1;}else{语句主体2;}#include<stdio.h>intmain(){

inta,b;

printf("inputtwonumbers:");

scanf("%d%d",&a,&b);

if(a>=b){printf("max=%d\n",a);}

if(a<b){printf("max=%d\n",b);}}用if语句处理选择结构举例【例】输入两个整数,输出其中的大数。#include<stdio.h>intmain(){

inta,b;

printf("inputtwonumbers:");

scanf("%d%d",&a,&b);if(a>b)

printf("max=%d\n",a);else

printf("max=%d\n",b);}用if语句处理选择结构举例【例】输入两个整数,输出其中的大数。if的简洁版——条件运算符?:一、功能:根据条件的成立与否,来决定结果为?或:后面的表达式。二、一般形式:条件判断?表达式1:表达式2有三个操作对象,是三元运算符,C语言中唯一的三元运算符。三、求解过程:当条件成立时执行表达式1,表达式1的值即为整个条件表达式的值,否则执行表达式2,表达式2的值为整个条件表达式的值。通常将两个表达式之一的运算结果赋值给某个变量,等价于如下形式的if-else语句:

if(条件判断)

变量x=表达式1;

else

变量x=表达式2;例1:if(a>b)max=a;可表示成:

elsemax=(a>b)?a:b;max=b;四、注意事项:1、优先级:

max=(a>b)?a:b;可写成:max=a>b?a:b;

a>b?a:b+1;是等价于:(a>b?a:b)+1;还是a>b?a:(b+1);答:后者。2、结合性:自右而左例2:a>b?a:c>d?c:d;等价于?a>b?a:(c>d?c:d);若a=1,b=2,c=3,d=4,则上式值为?答:43、条件表达式不能取代所有的if语句,除非if的内嵌语句为赋值语句,且两个分支均给一个变量赋值。例3:if(a>b)printf("%d",a);elseprintf("%d",b);printf("%d",a>b?a:b);5、当表达式1和表达式2的类型不同时,条件表达式的值的类型为二者中较高的类型。例4:x>y?1:1.5;当x>y时,条件表达式的值为1.0。例5:输入一个字符,判别它是否是大写字母,如果是,将它转换成小写字母并输出,如果不是,原样输出。#include<stdio.h>intmain(){

inta,b;

printf("inputtwonumbers:");

scanf("%d%d",&a,&b);max=a>=b?a:b;

printf("max=%d\n",max);}用if语句处理选择结构举例【例】输入两个整数,输出其中的大数。例:用公式法编程计算一元二次方程ax2+bx+c=0的根,a,b,c的值由键盘输入,其中a≠0.步骤:1、输入一组系数a,b,c.2、若a=0,则输出“不是二次方程”的提示信息,并终止程序执行;否则继续第3步3、计算判别式disc=b2-4ac。4、按下式分别计算p和q的值。5、若disc=0,则有两个相等的实根:x1=x2=p6、否则,若disc>0,则输出两个不相等的实根:x1=p+q,x2=p-q7、否则,若disc<0,则输出两个两个共轭复根:x1=p+qi,x2=p-qi#include<stdio.h>#include<stdlib.h>#include<math.h>#defineEPS1e-6int

main(int

argc,char*argv[]){doublea,b,c,disc,p,q;

printf("pleaseentera,b,c\n");scanf("%lf,%lf,%lf",&a,&b,&c);printf("Theequation");if(fabs(a)<=1e-6){printf("isnotaquadratic\n");exit(0);}disc=b*b-4*a*c;p=-b/(2*a);q=sqrt(fabs(disc))/(2*a);if(fabs(disc)<=EPS)

printf("hastwoequalroots:x1=x2=%8.2f\n",p);elseif(disc>EPS){printf("hasdistinctrealroots:x1=%8.2f,x2=%8.2f\n",p+q,p-q);}else{printf("hascomplexroots:\n");

printf("%8.2f+%8.2fi\n",p,q);

printf("%8.2f-%8.2fi\n",p,q);}

system("PAUSE"); return0;}程序测试:是指对一个完成了全部或部分功能模块的计算机程序在正式使用前的检测,以确保该程序能按预定的方式正确运行。静态测试:不执行被测程序,而只是对程序文本进行检查,通过代码审查,来分析和发现程序中的错误。动态测试:通过运行被测程序来检测程序的动态行为和运行结果的正确性,即检查运行结果与预期结果的差异,并分析运行效率和健壮性等性能,包括构造测试用例、执行程序、分析程序的输出结果。白盒测试:内部结构和流向可见,结构测试或逻辑驱动器测试。黑盒测试:内部结构和流向不可见,注重测试程序的功能需求例:判断整数a是奇数还是偶数。

main(){inta;

scanf("%d",&a);if(a%2==1)

printf("itisaoddnumber!\n");else

printf("itisaevennumber!\n");}附:C程序的书写格式——“紧缩对齐”1、一般每个语句占一行;2、不同结构层次的语句,从不同的起始位置开始,同一结构层次中的语句,缩进同样的字数;3、表示结构层次的大括号,写在该结构化语句的第一或第二个字母的下面,某一结构的“{”与“}”在竖直方向上应对齐,并分别占用一行。如果想在判断条件不成立时做其它操作,可如下例:例a3:if(a>b){printf("%d",a-b);

printf("%d",a%b);}if(a<=b){printf("%d",a+b);

printf("%d",a*b);}注意:系统在处理if语句后面的判定条件时,以0为“假”,以非0为“真”。例a4:将两个实数按从小到大的顺序输出。

main(){floata,b,t;

scanf(“%f%f”,&a,&b);if(a>b){t=a;a=b;b=t;}

printf("%f,%f",a,b);}●定义:当if语句主体中又包含了if语句时,则称这个if语句为嵌套if语句。●格式:if(条件判断1){if(条件判断2){

语句主体2;

}

其它语句1;

}

其它语句2;条件判断1其它语句2;条件判断2语句主体2;truetruefalse其它语句1;false选择结构的嵌套elseif语句一、格式:

if(判断条件1){

语句主体1;

}elseif(判断条件2){

语句主体2;

}判断条件1判断条件2语句主体1语句主体2其它语句truetruefalsefalseif-else选择结构的一种最常用形式if(表达式)

语句1;

else

语句2;

语句3表达式值非0时,执行语句1,然后语句3;

表达式值为0时,执行语句2,然后语句3else部分可以没有。if(表达式)

语句1;

语句3当表达式值为0时,直接执行语句3if-else嵌套使用时,注意else和谁配对的问题else-ifif的一种扩展形式if(表达式)

语句1;

elseif(表达式)

语句2;

elseif(表达式)

语句3;

…………

else

语句4;

语句5;else部分可以没有if语句的一般形式if语句最常用的形式:if(表达式)语句1else语句2if语句的三种形式1.if(表达式)语句2.if(表达式)语句1

else语句23.if(表达式1)语句1

elseif(表达式2)语句2elseif(表达式3)语句3……elseif(表达式m)语句melse语句m+1表达式语句假(0)真(非0)表达式语句1语句2假真表达式1语句1表达式2表达式3表达式4语句2语句3语句4语句5假假假假真真真真现场编程完成例4.5体型判断。按“体指数”对肥胖程度进行划分:体指数t=体重w/(身高h)2(w单位为公斤,h单位为米)当t<18时,为低体重;当t介于18和25之间时,为正常体重;当t介于25和27之间时,为超重体重;当t>=27时,为肥胖。编程从键盘输入你的身高h和体重w,根据给定公式计算体指数t,然后判断你的体重属于何种类型。用3种方法编程:算法1:用不带else子句的if语句编程算法2:用在if子句中嵌入if语句的形式编程算法3:用在else子句中嵌入if语句的形式编程

说明:(1)if后面的表达式可为任意的数值类型。但一般为关系表达式或逻辑表达式。(2)每个子语句若为表达式语句等简单语句,应有一分号;若为复合语句{……},则不能有分号。例如:if(x>0)printf("%f",x);elseprintf("%f",–x);if(a+b>c&&b+c>a&&c+a>b){s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));

prints("area=%6.2f\n",area);}elseprintf("itisnotatrilateral");各有一个分号不可有分号一个函数,当x<0时,y=-1;当x=0时,y=0;当x>0时,y=1;写一个程序,输入x的值,输出y值。程序段1:if(x<0)y=-1;elseif(x==0)y=0;elsey=1;程序段2:if(x>=0)if(x>0)y=1;elsey=0;elsey=-1;程序段3:y=-1;if(x!=0)if(x>0)y=1;elsey=0;程序段4:y=0;if(x>=0)if(x>0)y=1;elsey=-1;程序段1和2是正确的若a=5,b=9,判断以下两程序段的运行结果。

if(a>b)if(a-b>6)

printf("%d\n",a%b);else

printf("%d\n",a*b);无输出结果。

if(a>b){if(a-b>6)

printf("%d\n",a%b);}else

printf("%d\n",a*b);输出:45思考1:根据所输入的成绩判断等级:80分以上为A,70至79分为B,60至69分为C,59分以下不及格(failed).score>=70score>=80输出等级Atrue输出等级Btruefalsefalse开始score>=60intscore输入成绩结束输出等级Ctrue输出failedfalse思考2:一个函数,当x<1时,y=x;当1<=x<10时,y=2x-1;当x>=10时,y=3x-11;写一个程序,输入x的值,输出y值。解答:

if(x<1){y=x;

printf("%d\n",y);}elseif(x<10){y=2*x-1;

printf("%d\n",y);}else{y=3*x-11;

printf("%d\n",y);}四、if与else的配对问题思考1:if(score>=80)

printf("A\n");elseif(score>=70)

printf("B\n");elseif(score>=60)

printf("C\n");else

printf("failed\n");原则:else会去找一个与它最接近的上一个if配对。给出以下程序的运行结果。输出:-9若a=20,b=50呢?结果仍为-9

main(){floatc=3.0,d=4.0;if(c>d)c=5.0;elseif(c==d)c=6.0;elsec=7.0;

printf("%f",c);}输出:7.0main(){inta=50,b=20,c=10;

intx=5,y=0;

if(a<b)

if(b!=10)

if(!x)x=1;elseif(y)x=10;x=-9;

printf("%d\n",x);}例:给定一个不多于5位的正整数,求它是几位数,并分别打印出每一位数字。

main()

{longintnum;

int

place,five,four,three,second,one;

scanf("%ld",&num);

if(num>9999)place=5;

elseif(num>999)place=4;

elseif(num>99)place=3;

elseif(num>9)place=2;

elseplace=1;

printf("%d\n",place);printf("每位数字为:\n");

five=num/10000;

four=(num-five*10000)/1000;

three=(num-five*10000-four*1000)/100;

second=(num-five*10000-four*1000-three*100)/10;

one=num-five*10000-four*1000-three*100-second*10;

printf("%d,%d,%d,%d,%d\n",five,four,three,second,one);}例:编程设计一个简单的猜数游戏:先由计算机“想”一个数请玩家猜,如果玩家猜对了,则计算机给出提示“right!”,否则提示“worng!”,并告诉玩家所猜的数是大还是小。#include<stdio.h>#include<stdlib.h>int

main(int

argc,char*argv[]){int

magic,guess;magic=rand();

printf("Pleaseguessamagicnumber:");

scanf("%d",&guess);

if(guess>magic){printf("worng!toohigh!\n");}elseif(guess<magic){printf("worng!toolow!\n");}else{printf("Right\n");

printf("Thenumberis:%d\n",magic);}

system("PAUSE"); return0;}指定范围的随机数如何产生?4.3.4开关语句一般形式:

switch(表达式)

{case常量1:语句1[break;]case常量2:语句2[break;]……case常量n:语句n[break;]default:语句n+1}执行过程常量表达式的作用,且互不相同break语句的作用常量表达式的次序多个case可以共用一组执行语句。表达式1语句1表达式2表达式3表达式4语句2语句3语句4语句5假假假假真真真真多分支选择语句……case'A':case'B':case'C':printf(">60\n");break;……switch语句适用的情况???注意事项:1、case后面的选择值只能只字符或常量;2、每一个case后面的选择值必须互不相同,否则会出现矛盾现象;3、各个case和default的出现次序并不影响执行结果;4、执行完一个case后面的语句,程序流程控制转移到下一个case继续执行。break语句的使用:在执行一个case分支后,使流程跳出switch结构,即终止switch语句的执行。

switch(表达式){case选择值1:语句主体1;break;case选择值2:语句主体2;break;...case选择值n:语句主体n;break;default:语句主体n+1;}其它语句表达式选择值1语句主体1选择值ndefault语句主体n语句主体n+1……break;break;default后面可以不加break.switch多路选择switch(表达式){

case常数1:

语句序列1;

case常数2:

语句序列2;

…………

default:

语句序列3;

}default可以没有,但最好不省略不要忘记break现场编程完成计算器程序……例4.8

编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:操作数1运算符op操作数2然后,计算表达式的值,指定的运算符为加(+)、减(-)、乘(*)、除(/)

【例】计算器程序。用户输入运算数和四则运算符,输出计算结果。

switch语句用于判断运算符,然后输出运算值。当输入运算符不是+,-,*,/时给出错误提示intmain(){floata,b;charc;

printf("inputexpression:a+(-,*,/)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");}}思考1:根据所输入的成绩判断等级:80分以上为A,70至79分为B,60至69分为C,59分以下不及格(failed).score>=70score>=80输出等级Atrue输出等级Btruefalsefalse开始score>=60intscore输入成绩结束输出等级Ctrue输出failedfalse思考2:一个函数,当x<1时,y=x;当1<=x<10时,y=2x-1;当x>=10时,y=3x-11;写一个程序,输入x的值,输出y值。例:

switch(grade){case'A':printf("80~100\n");break;case'B':printf("70~79\n");break;case'C':printf("60~69\n");break;case'D':printf("0~59\n");break;

default:printf("error!\n");}case后面包含不止一个语句时可以不用大括号。

四、switch语句的特殊用法:将不同的选择值共同处理相同的语句。例:根据成绩等级给评语:'a'或'A':excellent;'b'或'B':good;'c'或'C':bestudyhard;'d'或'D':failed.

switch(grade){case'a':case'A':printf("excellent!\n");break;

case'b':case'B':printf("good!\n");break;

case'c':case'C':printf("bestudyhard!\n");break;

default:printf("failed!\n");}思考2:根据用户输入的年份和月份给出该月的天数。思考3:一个函数,当x<0时,y=-1;当x=0时,y=0;当x>0时,y=1;写一个程序,输入x的值,输出y值。思考1:根据用户输入的字母判定代表星期几。#include<stdio.h>main(){int

y,m,d;printf(“pleaseinputyearandmonth:”);scanf(“%d,%d,”,&m,&y);switch(y){case1:case3:case5:case7:case8:case10:case12:d=31;break;case4:case6:case9:case11:d=30;break;case2:if(m%4==0&&m%100!=0||(m%400==0)d=29;elsed=28;break;

defaut:printf(“输入错误!”);}

printf(“这个月的天数为d=%d”,d);}思考2例

运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:

s<250km没有折扣

250≤s<5002%折扣

500≤s<l0005%折扣

1000≤s<20008%折扣

2000≤s<300010%折扣

3000≤s15%折扣设每公里每吨货物的基本运费为p(price的缩写),货物重为w(weight的缩写),距离为s,折扣为d(discount的缩写),则总运费f(freight的缩写)的计算公式为

f=p*w*s*(1

d)

分析此问题,折扣的变化是有规律的:折扣的“变化点”都是250的倍数(250,500,1000,2000,3000)。利用这一特点,可以在横轴上加一种坐标c,c的值为s/250。c代表250的倍数。c=0c=1c=2,3c=4,5,6,7c=8,9,10,11c>=12switch语句适用的情况:1.不等式表示的范围为某一值的整数倍;2.一般不等号与严格不等号分居两侧#include<stdio.h>intmain(){intc,s;floatp,w,d,f;

printf("pleaseenterprice,weight,distance:");

scanf("%f,%f,%d",&p,&w,&s);if(s>=3000)c=12;elsec=s/250;

switch(c){case0:d=0;break;case1:d=2;break;case2:case3:d=5;break;case4:case5:case6:case7:d=8;break;case8:case9:case10:case11:d=10;break;case12:d=15;break;}f=p*w*s*(1

d/100.0);

printf("freight=%10.2f\n",f);return0;}补充:求1月1日到某月底的天数#include<stdio.h>intmain(){inty,m,d=0,leap;

scanf("%d%d",&y,&m);if(y%4==0&&y%100!=0||y%400==0)leap=1;elseleap=0;switch(m){case12:d+=31;case11:d+=30;case10:d+=31;……case3:d+=31;case2:if(leap)d+=29;elsed+=28;case1:d+=31;}……}#include<stdio.h>main(){int

y,m,d;scanf(“%d,%d,”,&y,&m);if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)d=31;elseif(m==4||m==6||m==9||m==11)d=30;elseif(m==2)

{if(y%4==0&&y%100!=0||y%400==0)d=29;elsed=28;}elseprintf(“输入错误!”);

printf(“这个月的天数为d=%d”,d);}用if来编程例9:给出以下程序的运行结果。

intx=10,y=5;

switch(x){case1:x++;

default:x+=y;case2:y--;case3:x--;}printf("%d,%d\n",x,y);答案:14,4什么是循环?为什么要使用循环?问题1:问题2:求学生平均成绩

分数相加后除以课数

在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。(1)用while语句(2)用do—while语句(3)用for语句(4)用goto

语句和if语句构成循环4.4循环结构循环结构的图示:

当型(While型)循环结构

直到型(Until型)循环

4.4.2循环结构的流程图表示1、while语句while语句用来实现“当型”循环结构。一般形式:

while(表达式)语句当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。

4.4.3循环语句流程图设置循环变量初值判断条件改变循环变量值(增或减)循环主体true其它语句false执行步骤:1、第一次进入循环前必须先设置循环控制变量的初始值;2、检查条件判断,若为真,执行循环主体语句,若为假,跳出循环,执行其它语句;3、重新设置循环控制变量的值(增或减),再回步骤2重新判断条件,决定是否继续执行循环。例

求1到100的和

#include<stdio.h>

voidmain()

{inti,sum=0;

i=1;

while(i<=100)

{sum=sum+i;

i++;}

printf(″%d\n″,sum);

}说明:(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现.(2)在循环体中应有使循环趋向于结束的语句。

运行结果:5050注意:(1)控制循环的条件。循环控制变量的初值、条件表达式、增量。(2)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。

do-while语句的特点:先执行循环体,然后判断循环条件是否成立。一般形式:

do

循环体语句

while(表达式);执行过程:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。2、do-whiledo-while循环

一、功能:用于未知循环执行次数的循环。二、格式:

do

语句;

while(条件判断);无分号;有分号;有分号;

do{语句1;语句2;

……;

语句n;}while(条件判断);无分号;有分号;执行流程:1、设置循环控制变量的初始值;2、直接执行循环主体,然后检查条件判断,若为真,继续执行循环主体,若为假,跳出循环执行其它语句;3、每次执行完循环主体内的语句后,重新设置循环控制变量的值(增加或减少),再回到步骤2判断是否继续执行循环。求1到100的和

#include<stdio.h>

voidmain()

{inti,sum=0;

i=1;

do

{sum=sum+i;

i++;

}

while(i<=100);

printf("%d\\n″,sum);

}运行结果:5050

inti;

intsum=0;开始

i=1;

i<=10

i++;

sum=sum+i;true输出结果结束false三、流程图:设置初值循环主体设置增减量判断条件其它语句

ture

false

do-while与while的区别:设置循环变量初值判断条件改变循环变量值(增或减)循环主体true其它语句false

do-while“先做再说”

while“先说再做”while语句和用do-while语句的比较:在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。在一般情况下,用while和do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样;但是如果while后面的表达式一开始就为假时,两种循环的结果是不一样的。例1:main(){intsum=0,i;

scanf(“%d”,&i);

while(i<=10){sum=sum+i;i++;}

printf(“%d”,sum);}例2:main(){intsum=0,i;

scanf(“%d”,&i);do{sum=sum+i;i++;}while(i<=10);

printf(“%d”,sum);}四、do-while程序设计举例例a1:求1+2+3+……+n,并且能控制n的范围(n>0)。

main(){int

n,i=1,sum=0;

do{printf(“input

n(n>0):\n”);

scanf(“%d”,&n);}while(n<=0);

dosum+=i++;

while(i<=n);

printf(“sum=%d\n”,sum);}例a2:求n的阶乘:n!=1*2*…*n,其中n由键盘输入(n>0)。

main(){int

n,i=1,f=1;

do{printf(“input

n(n>0):\n”);

scanf(“%d”,&n);}while(n<=0);

dof*=i++;

while(i<=n);

printf(“%d!=%d\n”,n,f);}例a3:求s=a+aa+aaa+……,其中a是一个数字,例:2+22+222+2222+22222,此时a=2,n=5由键盘输入。

main(){int

n,j=1;longint

a,s=0,t=0;

printf(“a=?,n=?\n”);

scanf(“%ld,%d”,&a,&n);

while(j<=n){t=t+a;

s=s+t;

a=a*10;

j++;}

printf(“%ld\n”,s);}

利用while循环解法

利用do-while循环解法

main(){int

n,j=1;longint

a,s=0,t=0;

printf(“a=?,n=?\n”);

scanf(“%ld,%d”,&a,&n);

do{t=t+a;

s=s+t;

a=a*10;

j++;}while(j<=n);

printf(“%ld\n”,s);}例a4:猴子吃橘子问题:猴子第一天摘下若干个橘子,当即吃了一半,又多吃了一个,第二天又将剩下的橘子吃了一半,又多吃一个,以后每天都吃前一天剩下的橘子的一半零一个,到第10天想吃时,只剩下一个橘子了,求第一天一共摘了多少橘子。

main(){intday,x1,x2;

day=9;x2=1;

do

{x1=(x2+1)*2;

x2=x1;

day--;}while();

printf(“total=%d\n”,x2);}

day>0for语句的格式

for(设置初值;条件判断;设置增减量){语句1;语句2;

……;

语句n;}无分号无分号分号间隔例1:for(i=1;i<=10;i++)sum+=i;

for语句的执行步骤:1、第一次进入for循环时,设置循环控制变量的初始值;2、检查条件判断,若为真,继续执行循环主体;若为假,跳出循环执行其它语句;3、每次执行完循环主体,循环控制变量会根据增减量的设置改变循环控制变量的值,再返回步骤2继续判断条件。3、用for语句实现循环一般形式:

for(表达式1;表达式2;表达式3)语句使用for语句的注意事项

for(设置初值;条件判断;设置增减量)1、“设置初值”可以省略,但应在for语句之前给循环控制变量赋初值。例1:i=1;

for(;i<=10;i++)sum=sum+i;注意:分号不能省2、“条件判断”可以省略,即不判断条件,循环无终止的进行下去,也就是认为条件始终为真。例2:for(i=1;;i++)sum=sum+i;3、“设置增减量”也可以省略,但应另外设法保证循环能正常终止。例3:for(i=1;i<=10;){sum=sum+i;i++;}4、可以同时省略“设置初值”和“设置增减量”,只给循环条件。例4:i=1;for(;i<=10;){sum=sum+i;i++;}5、三个部分都可以省略,不设置初值,不判断条件,循环变量不增减,无终止的执行循环。for(;;)6、“设置初值”除了可以设置循环控制变量的初值外,也可以设置其它变量的值。例5:for(i=1,sum=0;i<=10;i++)sum=sum+i;7、“设置初值”和“设置增减量”可以是一个简单表达式,也可以是逗号表达式,即包含一个以上的表达式,中间用逗号间隔。例6:for(i=0,j=10;i<=10;i++,j--)sum=sum+i*j;

for(i=1;i<=10;i++,i++)sum=sum+i;

相当于:for(i=1;i<=10;i=i+2)sum=sum+i;

8.表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环。例7:for(i=0;(c=getchar()!=‘\n’;i+=c)例8:for(;(c=getchar()!=‘\n’;)9.C99允许在for语句的“表达式1”中定义变量并赋值。for(inti=1;i<=100;i++)sum=sum+i;注意:C语言中的for语句比其他语言(如BASIC,PASCAL)中的FOR语句功能强得多。可以把循环体和一些与循环控制无关的操作也作为表达式1或表达式3出现,这样程序可以短小简洁。但过分地利用这一特点会使for语句显得杂乱,可读性降低,最好不要把与循环控制无关的内容放到for语句中。注意在for和while语句之后一般没有分号有分号表示循环体就是分号之前的内容(空循环体)while(i<100);

i++;for(i=0;i<100;i++);

printf("%d",i);for通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量4.4.4循环程序举例

例用π/4≈1-1/3+1/5-1/7+…公式求π的近似值,直到某一项的绝对值小于为止。N-S图表示算法

#include<stdio.h>

#include<math.h>

voidmain()

{int

s;float

n,t,pi;

t=1;pi=0;n=1.0;s=1;

while(fabs(t)>1e-6)

{pi=pi+t;n=n+2;s=-s;t=s/n;}

pi=pi*4;

printf(“pi=%10.6f\n”,pi);

}现场编程完成例4.6,例4.9

例4.6:猜数游戏:先由计算机“想”一个数请人猜,如果人猜对了,则计算机给出提示:“Right!”,否则提示:“Wrong!”,并告诉人所猜的数是大还是小。例4.9:先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,则结束游戏,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。计算机记录人猜的次数,以此来反映猜数者“猜”的水平。

例:编程设计一个简单的猜数游戏:先由计算机“想”一个数请玩家猜,如果玩家猜对了,则计算机给出提示“right!”,否则提示“worng!”,并告诉玩家所猜的数是大还是小。#include<stdio.h>#include<stdlib.h>int

main(int

argc,char*argv[]){int

magic,guess;magic=rand();

printf("Pleaseguessamagicnumber:");

scanf("%d",&guess);

if(guess>magic){printf("worng!toohigh!\n");}elseif(guess<magic){printf("worng!toolow!\n");}else{printf("Right\n");

printf("Thenumberis:%d\n",magic);}

system("PAUSE"); return0;}指定范围的随机数如何产生?猜数游戏用到的库函数随机函数rand()#include<stdlib.h>RAND_MAX在stdlib.h中定义,不大于双字节整数的最大值32767产生[0,RAND_MAX]之间的随机数magic=rand();产生[0,b-1]之间的随机数magic=rand()%b;产生[a,a+b-1]之间的随机数magic=rand()%b+a;现场编程完成例4.6,发现问题猜数游戏用到的库函数随机函数srand为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的“随机化”通过键入随机数种子,产生[0,100]之间的随机数scanf("%u",&seed);srand(seed);magic=rand()%100+1;猜数游戏用到的库函数随机函数srand为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的“随机化”使用计算机读取其时钟值并把该值自动设置为随机数种子,产生[0,100]之间的随机数函数time()返回以秒计算的当前时间值,该值被转换为无符号整数并用作随机数发生器的种子#include<time.h>srand(time(NULL));magic=rand()%100+1;

例求Fibonacci数列前40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即:F(1)=1(n=1)F(2)=1(n=2)F(n)=F(n-1)+F(n-2)

(n≥3)

算法如图所示:例求Fibonacci数列前40个数。

#include<stdio.h>

voidmain()

{longintf1,f2;

inti;

f1=1;f2=1;

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

{printf(″%12ld%12ld″,f1,f2);

if(i%2==0)printf(″\n″);

f1=f1+f2;

f2=f2+f1;}

}

运行结果:

1123581321345589144233377610987159725844181676510946177112865746368750251

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论