《实用C语言程序设计教程》第3章三种基本结构程序设计课件_第1页
《实用C语言程序设计教程》第3章三种基本结构程序设计课件_第2页
《实用C语言程序设计教程》第3章三种基本结构程序设计课件_第3页
《实用C语言程序设计教程》第3章三种基本结构程序设计课件_第4页
《实用C语言程序设计教程》第3章三种基本结构程序设计课件_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

第三章三种基本结构程序设计3.1顺序结构程序设计

3.2

选择结构程序设计

3.3

循环结构

2023/7/27第三章三种基本结构程序设计3.1顺序结构程序设计33.1顺序结构程序设计顺序结构程序:就是执行时依语句排列顺序一条接着一条地执行,不发生控制流的转移。

特点:每个程序都是按照语句的书写顺序依次执行的,它是最简单的结构。不可或缺的若干语句,用{}把它们括起来,这样的语句体称为复合语句。复合语句在逻辑上等价于一条语句,复合语句内部还可嵌套复合语句。

ABab2023/7/273.1顺序结构程序设计顺序结构程序:就是执行时依语句排列

3.1.1程序设计简例main(){charch=′a′;/*定义变量并赋值*/inta=98;unsignedb=1000;longc=123456789;floatx=3.14;doubley=1.2345678;printf(″(1)a=%d,a=%c,ch=%d,ch=%c\n″,a,a,ch,ch);/*输出*/printf(″(2)b=%u\n″,b);printf(″(3)c=%ld\n″,c);printf(″(4)x=%f,y=%f\n″,x,y);printf(″(5)x=%e,y=%e\n″,x,y);printf(″(6)y=%-10.2f\n″,y);}【例1】分析下列程序,观察运行结果

运行结果

(1)a=98,a=b,ch=97,ch=a(2)b=1000(3)c=123456789(4)x=3.140000,y=1.234567(5)x=3.14000e+00,y=1.23456e+00(6)y=1.232023/7/273.1.1程序设计简例main()【例1】分析下列程序设计简例【例2】输入一个三位的整数,分解它的符号、百位数字、十位数字和个位数字,然后依次输出。#include<stdio.h>#include<math.h>/*程序中使用了数学函数abs*/main(){charc1,c2,c3,c4;/*定义变量*/intx;printf(″pleaseinputanumer:\n″);/*输入提示信息*/scanf("%d",&x);/*键盘输入x的值*/c4=x>=0?’+’:’-’;/*将x的符号赋给c4*/x=abs(x);/*取x的绝对值*/c3=x%10+48;/*求得x的个位数字,加48转换为对应数字字符的ASCII码值*/x=x/10;/*去掉个位数,取出x的高位*/c2=x%10+48;/*求得x的十位数字,加48转换为对应的ASCII码值*/c3=x/10+48;/*求得x的百位数字,加48转换为对应的ASCII码值*/printf("%c\n%c\n%c\n%c\n",c4,c3,c2,c1);/*输出符号位,百位,十位,个位*/}程序的执行结果:pleaseinputanumer:-321↙-,3,2,12023/7/27程序设计简例【例2】输入一个三位的整数,分解它的符号、程序设计简例【例3】在屏幕输出“pleaseinputyourname:”,再从键盘上输入一个名字,然后显示“Hello!”,在下一行显示输入的名字。#include<stdio.h>main(){charname[10];/*存放名子的变量在后面章节再详细介绍*/printf(″pleaseinputyourname:\n″);/*输出提示信息*/scanf(″%s″,name);/*读入名字*/printf(″Hello!\n″);/*输出Hello!*/printf(″%s″,name);/*输出读入的名字*/}程序的执行结果:pleaseinputyourname:Ligang↙Hello!Ligang2023/7/27程序设计简例【例3】在屏幕输出“pleaseinp程序设计简例【例4】读入一个小写字母,将其转换成大写字母后输出,同时输出其对应的ASCII编码。#include<stdio.h>main(){charch1,ch2;printf("Enteralowerletter:");ch1=getchar();/*利用字符输入函数,实现键盘输入一个字符,赋给字符变量ch1*/printf("letter:%c,ASCII:%d\n",ch1,ch1);/*屏幕显示键盘输入的字符,并显示该字符的ASCII代码值*/ch2=ch1-32;/*将小写字母转换成对应的大写字母*/printf("letter:%c,ASCII:%d\n",ch2,ch2);/*屏幕显示转换后的字符,及该字符的ASCII代码值*/}程序运行情况:Enteralowerletter:a↙letter:a,ASCII:97letter:A,ASCII:652023/7/27程序设计简例【例4】读入一个小写字母,将其转换成大程序设计简例【例5】在100.0g苯中加入13.76g联苯(MB),所形成溶液的沸点为82.40℃(t2),计算联苯的相对分子量。已知纯苯的沸点为80.10℃(t1),Kb=2.57。#include<stdio.h>main(){floatmA,mB,MB,Kb,t1,t2;/*定义变量*/printf(″pleaseinput:mA,mB,Kb

,t1,t2\n″);/*输出“输入数据”提示信息*/scanf(″%f,%f,%f,%f,%f″,&mA,&mB,&Kb

,&t1,&t2);/*读入数据*/MB=(Kb*mB)/((t1-t2)*mA);/*计算联苯的分子量*/printf("MB=%6.2f",MB);/*输出联苯的分子量*/printf("g/mol\n");/*打出分子量的单位*/}程序运行情况:pleaseinput:mA,mB,Kb

,t1,t2100.0,13.76,2.57,80.10,82.40↙MB=153.75g/mol2023/7/27程序设计简例【例5】在100.0g苯中加入13.76g3.1.2格式输入输出的一般形式格式、格式输出函数printf()printf()函数调用的形式:

printf(“格式控制字符串”,输出项表)或printf(字符串)在该函数调用时,在其后面加上分号,就构成了格式输出语句。printf中的输出项是和前面的格式控制字符串按顺序一一对应的。“项”可以是常量、变量、表达式、数组和函数调用,其值应和格式说明相容。

1.格式控制字符串该字符串放在一对双引号中,它可以包含以下三部分内容。(1)按原样输出的字符:(2)转义字符:(3)与输出项对应的“格式说明符”:要求以%开头,格式说明符在个数和类型上应该与输出项相对应。

2023/7/273.1.2格式输入输出的一般形式格式、格式输出函数pri

输出格式字符表

格式符输出形式输出项类型数据输出方式%-md%-mo%-mx%-mud十进制整数o八进制整数x十六进制整数u无符号整数int,shortunsignedintunsignedshortchar有-,左对齐;无-,右对齐无m或总宽度超过m位时按实际宽度输出;不足m位时,补空格%-mld%-mlo%-mlx%-mluld十进制整数lo八进制整数lx十六进制整数lu无符号整数longunsignedlong%-m.nf%-m.ne%<f,e>f十进制小数e十进制指数自动选定格式floatdouble有-,左对齐;无-,右对齐无m.n或总宽度超过m时,则按实际宽度输出;有m.n输出m位,其中小数n位;不足m位时,加空格%g自动选定f或e格式floatdouble不输出尾数中无效的0,以尽可能少地占输出宽度。%-mcc单个字符char有-,左对齐;无-,右对齐无m则输出单个字符;有m则输出m位,不足m位时补空格%-m.nss字符串字符串有-,左对齐;无-,右对齐无m.n则按实际输出全部字符串有m.n则输出前n个字符串注意:m、n均是正整数,m主要用于控制输出数据的总宽度,n用于控制输出实数的小数位数或控制输出字符串时可以输出的实际字符数。2023/7/27输出格式字符表格式符输出形式输出项类型数据输出方式%-m格式输入输出的一般形式格式2.输出项表printf函数中的“输出项表”部分由表达式组成,这些表达式应与“格式控制字符串”中的格式说明符的类型一一对应,若“输出项表”中有多个表达式,则每个表达式之间应由逗号隔开,各输出项可以是任意合法的表达式(包括常量、变量和函数调用)。因此printf函数也具有计算的功能。

printf("%d\n",100);/*输出显示100*/printf("%d\n",1234000+5678);/*输出显示:1234+5678*/printf("%f\n",(x=123.0)+(y=0.4567));/*输出显示:123.456700*/printf("%6.2f\n",123.4567);/*输出显示:123.46*/printf("%.3f\n",123.4567);/*输出显示:123.457*/2023/7/27格式输入输出的一般形式格式2.输出项表printf函数格式输入输出的一般形式格式3.printf函数的控制字符的附加说明标记作用+(加号)空格#0*输出的正数前面加“+”号,负数前面加“-”号在输出的正数前加一个空格“#o”使输出的八进制数前加0“#x”或“#X”使输出的十六进制数前加0x或0X对没有小数部分的浮点数,#迫使f、e、E、g、G打印出小数点且“#g”不去掉尾部的无效0用0(零)去填充域宽指定浮点数的输出位数2023/7/27格式输入输出的一般形式格式3.printf函数的控制字符的格式输入输出的一般形式格式二.格式输入函数scanf()scanf()调用的格式:scanf("格式控制字符串",输入地址项表列);该函数具有按格式字符串中规定的格式,在键盘上输入各输入项的数据,并依次赋给各输入项,且具有对从输入流中接收到的数据进行格式转换的功能。因为要求在内存中保存所接收到的数据,因此,需要提供接收数据的变量的地址。地址运算符&用于取得指定变量的地址。当以数值格式从输入流中读取数据时,scanf()可以跳过空格、换行及跳格符(在输入流中,数值型数据须以这些空白字符分隔)。2023/7/27格式输入输出的一般形式格式二.格式输入函数scanf(格式输入输出的一般形式格式1.格式控制字符串格式符输入形式输入项类型数据输入方式%md%mo%mxd十进制整数o八进制整数x十六进制整数int,shortunsignedintunsignedshort无m按实际位数输入有m只能输入m位不足m位,以Enter键或空格结束%mld%mlo%mlxld十进制整数lo八进制整数lx十六进制整数longunsignedlong%mf%mef十进制小数e十进制指数floatdouble%mlf%mlelf十进制小数le十进制指数floatdouble%mcc单个字符char无m仅取单个字符,以Enter结束有m输入m个字符,仅取第一个%mss字符串字符串无m输入字符至回车或空格结束有m仅取前m个字符2023/7/27格式输入输出的一般形式格式1.格式控制字符串格式符输入形式输格式输入输出的一般形式格式2.输入地址表列scanf函数中的“地址表列”部分是由变量的地址组成的,如果有多个变量,则各变量之间用逗号隔开。地址运算符为“&”,如变量a的地址可以写为&a。输入项表中的各输入项,应该是存放输入数据存储单元的地址。使用时一定注意,各输入项之间用“,”号分隔开,各变量名前一定要加“&”求地址运算符。3.说明(1)在scanf函数“格式控制”部分中的每个格式说明符都必须在“地址表”中有一个变量与之对应,格式说明符必须要与相应变量的类型一致。而且,输入的数据必须是常量,不能是表达式,而且按输入项的前后次序顺序输入数据。

(2)在输入数据时,各数据之间要使用“空格”、“Tab”或“回车”键(Enter键)作为分隔;如果格式说明符之间包含其他字符,则输入数据时,应输入与这些字符相同的字符做间隔。

2023/7/27格式输入输出的一般形式格式2.输入地址表列3.说明(1)在格式输入输出的一般形式格式(3)在输入字符型数据时,由于“空格”也作为有效字符输入,因此,不需要用“空格”做分隔,只要输入一个字符即可。故输入字符型数据时,数据之间不用分隔符。

(4)在格式说明符的前面指定输入数据所占的列数时,系统将自动按此列数来截取所需的数据。

(5)如果在格式控制字符串中,含有不属于格式说明的其他字符,在输入数据时,必须在对应位置上原样输入这些字符。

(6)如果在%后有一个“*”附加说明符,表示跳过它指定的列数。

(7)在scanf函数中不使用%u说明符,对unsigned型数据,以%d或%o、%x格式输入。

(8)在用scanf函数输入数据时,不能规定精度。

2023/7/27格式输入输出的一般形式格式(3)在输入字符型数据时,由于“3.1.3字符输入、输出函数1.字符输入函数格式:

getchar()或getch()调用函数时,当程序执行到getchar函数调用语句时,将等待输入,只有当用户输入字符,并按Enter键后,才接收输入的第1个字符,并在屏幕上回显该字符,同时送到内存的缓冲区,准备赋给指定的变量。并且对空格符、制表符(Tab键)和回车符(Enter键)都被当作有效字符读入。getch()函数是立即接收用户来自键盘上的输入,不把字符回显到屏幕上。

2.字符输出函数putchar格式:putchar(ch)

其作用是将参数代表的字符在标准输出设备(通常是显示器)上加以输出。参数ch可以是字符常量、字符变量或整型表达式,其功能等价于:printf("%c",ch)。

2023/7/273.1.3字符输入、输出函数1.字符输入函数格式:ge3.2选择结构程序设计分支语句有两类:一类是if语句,另一类是switch语句。条件语句的作用是使程序按某种条件有选择地执行一条或多条语句。其中,条件可以用表达式来描述,如关系表达式和逻辑表达式。

选择结构程序中的语句(段)是否执行,取决于某个“条件”是否成立。选择结构的程序又有三种形式:单分支结构、双分支结构和多分支结构。2023/7/273.2选择结构程序设计分支语句有两类:一类是3.2.1程序设计简例【例6】输入2个数,如果它们的值不相等,则交换并输出它们的值;否则,输出“equal”。

#include<stdio.h>voidmain(){inta,b,t;printf("inputa,b:\n");scanf("%d,%d",&a,&b);if(a!=b){/*语句1是一条复合语句*/t=a;a=b;b=t;printf("a=%d,b=%d\n",a,b);}elseprintf("equal\n");/*语句2*/程序的执行结果1:inputa,b:10,12↙a=12,b=10程序的执行结果2:inputa,b:10,10↙equal

2023/7/273.2.1程序设计简例【例6】输入2个数,如果程序设计简例【例7】输入3个整数,输出其中的最大值。#include<stdio.h>voidmain(){inta,b,c,max;/*max中放最大值*/printf("inputa,b,c:\n");scanf("%d%d%d",&a,&b,&c);max=a;/*先假设a是最大的数*/if(max<b)max=b;/*如果b比假设的最大值大,再假设b是最大的数*/if(max<c)max=c;/*如果c比假设的最大值大,则c是最大的数*/printf("maxis%d\n",max);}运行:inputa,b,c:329065↙maxis902023/7/27程序设计简例【例7】输入3个整数,输出其中的最大值程序设计简例【例8】解方程ax2+bx+c=0。

分析:(1)若b2-4ac>0,方程有两个不等的实根;(2)若b2-4ac=0,方程有两个相等的实根;(3)若b2-4ac<0,方程有两个复根。

yyn开始a==0这是一次方程x=-c/bdelta=b*b-4*a*c输入a,b,c方程有两个相等的实根x1,x2=-b/(2*a)n方程有两个虚根n方程有两个不相等的实根x1=(-b+sqrt(delta)/(2*a))x2=(-b-sqrt(delta)/(2*a))结束图3-1解一元二次方程的流程示意图ydelta==0delta<02023/7/27程序设计简例【例8】解方程ax2+bx+c=0。程序设计简例main(){floata,b,c,delta,x1,x2,realpart,imagepart;printf(″请输入a,b,c:\n″);scanf(″%f,%f,%f″,&a,&b,&c);if(fabs(a)<=1e-6)printf(″这是一次方程x=%f\n″,-c/b);else{

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

if(fabs(delta)<=1e-6)

printf(″方程有两个相等的实根:x1=x2=%8.4f\n″,-b/(2*a));elseif(delta>1e-6)2023/7/27程序设计简例main()2023/7/27程序设计简例{

x1=(-b+sqrt(delta))/(2*a);x2=(-b-sqrt(delta))/(2*a);printf(″有两个不等的实根:x1=%8.4f和x2=%8.4f\n″,x1,x2);}else{realpart=-b/(2*a);imagepart=sqrt(-delta)/(2*a);printf(″有两个虚根:″);printf(″%8.4f+%8.4fi\n″,realpart,imagepart);printf(″%8.4f-%8.4fi\n″,realpart,imagepart);}}}程序运行:请输入a,b,c:3.00,4.00,5.00↙有两个虚根:-0.6667+1.1055i-0.6667-1.1055i2023/7/27程序设计简例{程序运行:2023/7/27程序设计简例【例9】从键盘输入一个月份(1~12),并显示该月份的英文名称。main(){intmonth;printf(″Enteramonth″);scanf(″%d″,&month);switch(month)/*根据month的当前取值,做出多分支选择*/{case1:printf(″January\n″);break;case2:printf(″February\n″);break;case3:printf(″March\n″);break;case4:printf(″April\n″);break;case5:printf(″May\n″);break;case6:printf(″June\n″);break;case7:printf(″July\n″);break;case8:printf(″Augus\n″);break;case9:printf(″September\n″);break;case10:printf(″October\n″);break;case11:printf(″November\n″);break;case12:printf(″December\n″);break;default:printf(″DataError!\n″);break}}2023/7/27程序设计简例【例9】从键盘输入一个月份(1~12),3.2.2单分支与双分支结构

1.单分支结构程序

格式:if(表达式)语句1;

假(=0)真(≠0)语句1表达式图3-2单分支结构语句1若多于一条,则需用复合语句。if语句的功能如图3-2所示。语句中的“表达式”项可以是算术表达式、关系表达式或逻辑表达式,甚至可以是任意类型的数值。

if语句的执行过程是:遇到if关键字,首先计算圆括号中的表达式的值,如果表达式的值(或数值的)值不为0(真)时,就执行其后的语句1;表达式值为0(假)时,就跳过其后的语句1,控制转移到下一条语句。2023/7/273.2.2单分支与双分支结构1.单分支结构程序格式:单分支与双分支结构2.双分支结构程序格式:if(表达式)语句1;else语句2;语句1、语句2若多于一条语句,则应使用复合语句。其执行过程如图3-3所示。

假(=0)真(≠0)语句1表达式图3-3双分支结构语句2该语句遇到关键字if,首先运算小括号中的表达式,如表达式的值为非0,则执行紧跟其后的语句1,执行完语句1后,执行if-else结构后面的语句;如果表达式的值为0,则执行关键字else后面的语句2,接着执行if-else结构后面的语句。2023/7/27单分支与双分支结构2.双分支结构程序格式:if(表达式)语句3.2.3多分支结构⑴嵌套形式1格式:if(表达式1)if(表达式2)语句1;else语句2;else语句3;1.if-else语句嵌套结构

执行流程如图3-4所示,在if-else语句中包含另一if-else语句,即第一个else与第二个if结合,而最后一个else与第一个if结合。假(=0)真(≠0)表达式1图3-4嵌套形式1语句3假(=0)真(≠0)语句1表达式2语句22023/7/273.2.3多分支结构⑴嵌套形式1格式:1.多分支结构⑵嵌套形式2格式:if(表达式1){if(表达式2)语句1;}else语句2;语句1语句2假(=0)真(≠0)表达式1图3-5嵌套形式2假(=0)真(≠0)表达式2执行流程如图3-5所示,在if-else语句中包含一个单分支结构复合语句。即else与第一个if结合。因为第二个if在复合语句中,复合语句是一条语句,不能与复合语句外的else结合。如果把{}去掉,则else与第二个if结合。2023/7/27多分支结构⑵嵌套形式2格式:语句1语句2假多分支结构⑶嵌套形式3格式:if(表达式1)语句1;elseif(表达式2)语句2;else语句3;执行流程如图3-6所示,在if-else语句的else后紧跟另一个if-else语句。C语言规定:else总是与它前面最近的同一复合语句内的不带else的if结合。在if语句嵌套形式2中可以看到,else与if在同一复合语句内才能结合。图3-6嵌套形式3语句3语句1假(=0)真(≠0)表达式1假(=0)真(≠0)表达式2语句2嵌套形式语句结构执行过程是:从上到下逐一对if后面的表达式进行运算。当某一个表达式的值为真(非0)时,就执行紧跟其后的相关子句中的语句,而后面的其余部分均被跳过。当有n个if语句,就有n+1个分支。2023/7/27多分支结构执行流程如图3-6所示,在if-else多分支结构2.switch语句switch语句的格式:switch(表达式){case常量表达式1:语句组1;break;case常量表达式2:语句组2;break;

…case常量表达式n:语句组n;break;

default:语句组n+1;break;

}2023/7/27多分支结构2.switch语句switch语句的格式:2多分支结构表达式常量表达式1语句组1break常量表达式2语句组2breakdefault语句组n+1break常量表达式n语句组nbreak………图3-7switch语句2023/7/27多分支结构表达式常量表达式1语句组1break常量表达式2语多分支结构注意

(1)switch关键字后面的表达式,可以是任意合法的表达式。

(2)一定要用圆括号把switch后面的(表达式)括起来。否则会给出出错信息。

(3)所有case子句后所列的常量表达式值都不能相同,且每个case关键字后面的常量表达式的类型,必须与switch关键字后面的表达式类型一致。

(4)break语句的作用是退出switch语句。如果“语句组i”的后面没有安排break语句,那么执行完<语句i>后,会继续往下执行<语句i+1>。(5)default可以省略。如果有它,其位置不一定放在整个语句的最后。2023/7/27多分支结构注意(1)switch关键字后面的表达式,可以多分支结构(6)一定要用花括号将switch里的case、default等括起来。在case后面中虽然包含一个以上执行语句,但可以不必用花括弧括起来,会自动顺序执行本case后面所有的执行语句。当然加上花括弧也可以。(7)执行switch语句时,首先计算其后的表达式的值,然后自上而下顺序寻找一个case后面的常量与该值相匹配,找到后按顺序执行此case后面的所有语句,包括后续的case子句,而不再进行判断。如果所有case中的常量值都不能与switch后面的表达式的值相等,就执行default关键字后面的语句;若既没有相匹配的case,也没有default关键字,则直接跳过switch语句。

2023/7/27多分支结构(6)一定要用花括号将switch里的cas多分支结构3.if语句与switch语句的区别if语句的嵌套形式和switch语句都能实现多分支选择,在某种场合也可以互换替代,但if语句适应于各种条件的选择,能够计算关系或逻辑表达式;switch语句只适用于检验表达式与哪个值相等的情形。

2023/7/27多分支结构3.if语句与switch语句的区别3.3循环结构for循环语句while循环语句do-while循环语句

continue/break语句goto语句和语句标号

2023/7/273.3循环结构for循环语句2023/7/273.3.1程序设计简例i=1,s=0i100s=s+1i++假真图3-8【例10】计算1+2+3+…+99+100。#include″stdio.h″main(){ints,i;s=0;/*累加和的变量初值为0*/ i=1;/*累加数从1开始*/loop:if(i<=100)/*累加数不大于100*/{s=s+i;/*进行累加*/i++;/*产生下一个累加数*/gotoloop;/*使程序流程转到if语句,以便继续累加下一个数*/}printf(s=1+2+…+100=%d\n″,s);/*输出累加*/}程序运行结果:s=1+2+…+100=50502023/7/273.3.1程序设计简例i=1,s=0i100s=s+程序设计简例【例11】输入任意一个大于等于2的自然数n,判断该数是否是素数并输出相应的结果。真真真假假假开始输入ntag=1,i=2i<ni=i+1tag=0,breaktag=1<n输出是素数输出不是素数图3-9结束n%i=0#include″stdio.h″main(){inti,n,tag;printf(″请输入一个大于2的自然数n:″);scanf(″%d″,&n);tag=1;/*若标志变量tag等于0,n不是素数,若tag不等于0,则n是素数。*/for(i=2;i<n;i++)/*i循环中分别检测n能否被i整除,i=2,3,…,n-1*/if(n%i==0){tag=0;break;}/*n能被i整除,n不是素数,令tag=0*/if(tag==1)printf(″%d是素数\n″,n);elseprintf(″%不是素数\n″,n);}2023/7/27程序设计简例【例11】输入任意一个大于等于2的自然数n,判程序设计简例【例12】用递推法求菲波拉契(Fibonacci)数列的前20项。main(){longf,f1,f2;inti;f1=f2=1;printf(″%10ld%10ld″,f1,f2);i=3;while(i<=20)/*产生第3到20项*/{f=f1+f2;/*递推出第i项*/printf(″%10ld″,f);if(i%4==0)printf(″\n″);/*每行输出4个数换行*/f1=f2;f2=f;/*为下一步递推做准备*/i=i+1;}}运行程序,输出结果是:112358132134558914423337761098715972584418167652023/7/27程序设计简例【例12】用递推法求菲波拉契(Fibonacc程序设计简例【例13】将100元人民币换成面值1元、2元、5元的钞票,给出所有可能的兑换方案。#include<stdio.h>main(){inti,j,k,n=0;printf("给出所有可能的兑换方案:\n");for(i=0;i<=100;++i)/*第一层(最外层)循环*/for(j=0;j<=50;++j)/*第二层(中间层)循环*/for(k=0;k<=20;++k)/*第三层(最内层)循环*/if(i*1+j*2+k*5==100)printf("方案%8d:%8d(1)%8d(2)%8d(5)\n",++n,i,j,k);}2023/7/27程序设计简例【例13】将100元人民币换成面值1元、程序设计简例【例14】求自然对数底的近似值,公式为:e=1+1/1!+1/2!+…+1/n!+…。#include<stdio.h>main(){inti=1;doublee=1.0,u=1.0;while(u>1e-6)/*while循环语句*/{u=u/i;e=e+u;i++;}printf("\ne=%12.10f",e);i=1;e=1.0,u=1.0;do/*dowhile循环语句*/{u=u/i;e=e+u;i++;}while(u>1e-6);printf("\ne=%12.10f",e);for(i=1,e=1.0,u=1.0;u>1e-6;++i)/*for循环语句*/{u=u/i;e=e+u;}printf("\ne=%12.10f",e);}2023/7/27程序设计简例【例14】求自然对数底的近似值,公式为:e=1程序设计简例【例15】找出两个自然数平方之和的所有三位数。#include"stdio.h"#include"math.h"main(){intk,j,m,n,flag;for(n=100;n<1000;n++)/*第一层(最外层)循环*/{k=sqrt(1.0*n);/*第一层(最外层)循环复合句开始*/flag=0;j=1;while((j<=k)&&(flag==0))/*第二层(中间层)循环*/{m=1;/*第二层(中间层)循环复合句开始*/while((m<=k)&&(m*m!=n-j*j))m=m+1;/*第三层(最内层)循环*/if(m*m+j*j==n){flag=1;

printf("%d=%d*%d+%d*%d\n",n,j,j,m,m);}j=j+1;

}/*第二层(中间层)循环复合句结束*/}/*第一层(最外层)循环复合句结束*/}2023/7/27程序设计简例【例15】找出两个自然数平方之和的所有三位数。3.3.2当型循环与直到型循环

一.“当型”循环在执行循环语句时,首先判断循环控制表达式是否为“真”,若为“真”,则反复执行循环体。若为“假”,则结束循环。如图3-10所示。图3-10假真循环体表达式1.while语句格式:while(表达式)〈语句〉(循环体部分)功能:当表达式的值为真时,执行while语句中的循环体。(1)循环体如果包含一个以上的语句,则必须用花括弧括起来,以复合语句的形式出现,否则while语句范围只到while后面第一个分号处。2023/7/273.3.2当型循环与直到型循环一.“当型”循环在执行循当型循环与直到型循环(2)在循环体中应有使循环趋向于结束的语句,即设置修改循环条件的语句。(3)while语句先判断表达式的值,然后执行循环体中的语句,如果表达式的值一开始为假(值为0),则不执行循环体,直接执行循环体以外的语句。表达式是控制循环的条件,它可以是任何类型的表达式。2.for语句格式:for(表达式1;表达式2;表达式3)〈语句〉功能:首先计算表达式1的值;其后检测表达式2的值,若其值为“真”,则执行循环体语句,执行完毕后,再计算表达式3,至此完成了一次循环;然后,再次测试表达式2的值是否为“真”,若为“真”,继续执行循环体语句,……直到计算表达式2的值为0,即为“假”,则终止循环,执行for语句下面的一个语句。如图3-11所示图3-11假循环体真表达式2表达式1表达式32023/7/27当型循环与直到型循环(2)在循环体中应有使循环趋向于结束的语当型循环与直到型循环(1)for语句中条件测试总是在循环开始时进行;如果循环体部分是多个语句组成的,则必须用左、右花括号括起来,使其成为一个复合语句。(2)for语句中,表达式1通常是为循环变量赋初值的表达式;表达式2是控制循环的表达式;表达式3通常是改变循环变量值的表达式。表达式1和表达式3既可以是一个简单的表达式,也可以是逗号表达式。(3)for语句的表示形式相当灵活,可以部分或全部省略,但“;”不能省略,如for(;;)。2023/7/27当型循环与直到型循环(1)for语句中条件测试总是在循环开始当型循环与直到型循环二.“直到型”循环格式:do〈语句〉(循环体部分)while(表达式);(分号必不可少)功能:先执行〈语句〉,后判断表达式的值。它的执行过程是:先执行一次指定的语句,然后判断表达式的值,当表达式的值为非零(“真”)时,返回重新执行该语句,如此反复,直到表达式的值等于0为止,此时循环结束。如图3-12所示。

图3-12真假循环体表达式2023/7/27当型循环与直到型循环二.“直到型”循环格式:do功能:先执当型循环与直到型循环(1)dowhile语句的表达式是任意表达式,是控制循环的条件。(2)先执行后判断。因此,循环体至少执行一次,直到表达式为“假”才退出循环。因此,在循环体语句中一定要有改变表达式的值的操作,最终使其表达式的值变为0,结束循环。否则将成为“死”循环。(3)如果dowhile语句的循环体部分是多个语句组成的话,则必须用左右花括号括起来,使其形成复合语句。(4)在关键字while的小括号的后面,一定要加分号“;”,千万不能忘记,它表示dowhile语句到此结束。2023/7/27当型循环与直到型循环(1)dowhile语句的表达式是任意当型循环与直到型循环三.goto语句格式:goto〈语句标号〉;功能:程序执行到goto语句时,转到语句标号指定的语句去执行。

(1)使用goto语句时,需要预先指定一个有标号的可执行语句作为目的位置,这个有标号的语句必须与goto语句在同一个函数内。〈语句标号〉必须用标识符表示,不能用整数作为标号。(2)与if语句一起构成循环结构。从结构化程序设计角度考虑,大多数现代的编程方法都认为goto语句是有害的结构,因此不提倡使用if和goto语句构造循环。(3)goto语句为无条件转向语句,会跳过程序中的一段代码并转到一个指定的目的位置。2023/7/27当型循环与直到型循环三.goto语句格式:goto〈语句3.3.3各种循环语句的比较(1)4种循环语句均可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto语句和if语句构成的循环。(2)while和dowhile循环,只在while后面指定循环条件,在循环体中包含反复执行的操作语句,包括使循环趋于结束的语句(如i++,或i=i+1等)。

for循环可以在表达式3中包含使循环趋于结束的语句,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。(3)while语句和dowhile语句只有一个表达式,用于控制循环是否进行。for语句有三个表达式,不仅可以控制循环是否进行,而且能为循环变量赋初值及不断修改循环变量的值。for语句比while和dowhile语句功能更强,更灵活。for语句中三个表达式可以是任何合法的C语言表达式,而且可以部分省略或全部省略,但其中的两个分号不能省略。

2023/7/273.3.3各种循环语句的比较(1)4种循环语句均可以用来各种循环语句的比较(4)用while和dowhile循环时,循环变量初始化的操作应在while和dowhile语句之前完成。for语句可以在表达式1中实现循环变量的初始化。(5)for循环和while循环语句结构均是先判断循环条件,条件成立,才执行循环体,具有“先判断,后执行”特点,for语句和while语句可能一次也不执行循环体;而dowhile循环语句则是先执行循环体,然后再判断循环条件,具有“先执行,后判断”的特点。dowhile语句至少执行一次循环体。for和while循环属于“当型”循环;而dowhile循环属于“直到型”循环。(6)while语句和dowhile语句多用于循环次数不定的情况。而dowhile语句更适合于第一次循环肯定执行的场合。在初值、增量控制条件明显,或循环次数已经给定的情况下,最好选用for语句。(7)对while循环、dowhile循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环,而对goto语句和if语句构成的循环,不能用break语句和continue语句进行控制。2023/7/27各种循环语句的比较(4)用while和dowhile循环3.3.4break语句与continue语句1.break语句格式:break;功能:在循环体或switch结构中,当执行到brea

温馨提示

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

评论

0/150

提交评论