




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章C语言控制语句北京科技大学C
语言程序设计2023/2/10本章介绍数据输出数据输入顺序结构程序设计分支结构程序设计循环结构程序设计2023/2/10程序的三种基本结构顺序结构N-S结构图流程图ABAB选择结构YNABP成立?PTFAB2023/2/10程序的三种基本结构循环结构NYP成立?A当P成立时
A直到型循环
A当P成立时YNAP成立?当型循环N-S结构图流程图2023/2/103.1结构化程序设计3种基本结构特点:只有一个入口和一个出口结构内的每一个框都有机会被执行结构内没有死循环仅包含3种基本结构的程序称为结构化程序2023/2/103.2顺序结构程序设计主要内容:字符输出函数格式输出函数字符输入函数格式输入函数顺序结构程序设计举例2023/2/103.2.1字符输出函数函数调用的一般形式
putchar(ch)功能:在标准输出设备(即显示器屏幕)上输出一个字符。例如:putchar(‘b’);putchar(‘\n’);putchar('\101');putchar(st);输出:b输出:回车换行输出:A2023/2/10说明putchar是C语言的标准库函数,使用时必须加编译预处理命令:#include"stdio.h"
或
#include<stdio.h>【例3.1】利用putchar函数输出字符。#include"stdio.h"
main(){charc1,c2;c1='a';c2='b';putchar(c1);putchar(c2);putchar('\n');putchar(c1-32);putchar(c2-32);
putchar('\n');}也可改为c1=97;c2=98;
输出结果:abAB2023/2/103.2.2格式输出函数函数调用的一般形式
printf("格式控制字符串",输出表列)
功能:按格式控制所指定的格式,在标准输出设备上输出
输出表列各项的值。例如有程序段:inta=123,b=100;printf("%d%d%d\n",a,b,a+b);printf("c=%d+%d=%d\n",a,b,a+b);2023/2/10输出:123100223输出:c=123+100=2232023/2/10格式控制字符串用双引号括起的字符串,用于指定输出数据的类型、格式、个数包括:非格式字符和格式字符照原样输出
printf("c=%d+%d=%d\n",a,b,a+b);格式字符:指定输出3个十进制整型数,分别为变量a、b、a+b的值2023/2/10输出格式说明符整型数据
%d以有符号十进制形式输出整型数%o以无符号八进制形式输出整型数%x以无符号十六进制形式输出整型数%u以无符号十进制形式输出整型数实型数据
%f以小数形式输出实型数%e以指数形式输出实型数%g按数值宽度最小的形式输出实型数字符型数据
%c输出一个字符%s输出字符串其他
%%输出字符%本身在%和格式符之间可以使用附加说明符2023/2/10附加格式说明符l输出长整型数(只可与d、o、x、u结合用)m指定数据输出的宽度(即域宽).n对实型数据,指定输出n位小数;对字符串,指定左端截取n个字符输出+使输出的数值数据无论正负都带符号输出-使数据在输出域内按左对齐方式输出整数位数+小数位数+小数点自动对n位后小数四舍五入
例如:%ld——输出十进制长整型数
%m.nf——右对齐,m位域宽,n位小数或n个字符%-m.nf——左对齐2023/2/10例3.2整型数据的输出main(){inta=11,b=22;
intm=-1;longn=123456789;
printf("%d%d\n",a,b);
printf("a=%d,b=%d\n",a,b);
printf("m:%d,%o,%x,%u\n",m,m,m,m);
printf("n=%d\n",n);
printf("n=%ld\n",n);}程序输出:1122a=11,b=22m:-1,37777777777,ffffffff,4294967295n=123456789n=1234567892023/2/10例3.3实型数据的输出main(){floatx=1234.56,y=1.23456789;
doublez=1234567.123456789;
printf("x=%f,y=%f\n",x,y);
printf("z=%f\n",z);
printf("z=%e\n",z);
printf("z=%18.8f\n",z);
printf("x=%10.3f\n",x);
printf("x=%-10.3f\n",x);
printf("x=%4.3f\n\n",x);}程序输出:x=1234.560059,y=1.234568z=1234567.123457z=1.23457e+06z=1234567.12345679x=1234.560x=1234.560x=1234.5602023/2/10例3.4字符型数据的输出main(){intm=97;
charch='B';
printf("m:%d%c\n",m,m);
printf("ch:%d%c\n",ch,ch);
printf("%s\n","student");printf("%10s\n","student");printf("%-10s\n","student");printf("%10.3s\n","student");printf("%.3s\n\n","student");}程序输出:m:97ach:66Bstudentstudentstudent
stustu2023/2/10注意:printf函数格式控制中的格式字符与输出表列参数的个数和类型必须一一对应。格式说明符的%和后面的描述符之间不能有空格。除%X、%E、%G外类型描述符必须是小写字母。长整型数应该用%ld(或%lo、%lx、%lu)格式输出,否则会出现输出错误。printf函数的参数可以是常量、变量或表达式。2023/2/103.2.3字符输入函数函数调用的一般形式
getchar()功能:从标准输入设备(即键盘)上输入一个字符。例如:getchar();c=getchar();printf("%c\n",getchar());2023/2/10例如:【例3.5】getchar函数的应用。
#include"stdio.h"main(){charch;
ch=getchar();
printf("%c%d\n",ch,ch);
printf("%c%d\n\n",ch-32,ch-32);}程序运行时输入:m
并按回车键后输出结果是:m109M772023/2/10说明:getchar是C语言的标准库函数,使用时必须加编译预处理命令:#include"stdio.h"
或
#include<stdio.h>getchar函数需要交互输入,接收到输入字符之后才继续执行程序。连续使用getchar函数时,要注意字符的输入形式,例如执行如下程序段:charch1,ch2;ch1=getchar();ch2=getchar();必须连续输入两个字符,中间不能有其他字符2023/2/103.2.4格式输入函数函数调用的一般形式scanf("格式控制字符串",地址表列);功能:按格式控制指定的格式,从标准输入设备(即键盘)交互输入数据,并依次存放到对应地址表列参数指定的变量中(即将输入值赋给变量)。
例如:scanf("%d%f",&a,&f);scanf("%o,%f",&b,&x);scanf("a=%d,b=%d",&a,&b);2023/2/10格式控制字符串用双引号括起的字符串,用于指定输入数据的类型、格式、个数以及输入的形式
包括:非格式字符和格式字符照原样输入
scanf("a=%d,b=%d",&a,&b);格式字符:指定输入2个十进制整型数赋给变量a和b2023/2/10输入格式说明符整型数据
%d输入十进制整型数%u输入无符号的十进制整型数%o输入八进制整型数%x输入十六进制整型数实型数据
%f输入小数形式的单精度实型数%e输入指数形式的单精度实型数字符型数据
%c输入单个字符%s输入一个字符串在%和格式符之间可以使用附加说明符2023/2/10附加格式说明符l与d、o、x、u结合输入长整型数与f结合输入double型数h与d、o、x、u结合输入短整型数m指定输入数据的宽度*忽略读入的数据(即不将读入数据赋给相应变量)例如:%ld、%lo——输入十进制、八进制长整型数%lf、%le——输入双精度实型数%mf——输入m位数(域宽)%*d——忽略输入的一个整型数此变量接收下一个数据对float和double型指整数位数+小数点+小数位数2023/2/10例如:scanf("%d%d%d",&a,&b,&c);
输入3个十进制整型数,以空白符(空格、tab键或回车键)分隔
scanf("%d,%o,%f",&a,&b,&x);
输入3个数,以“,”分隔scanf("a=%d,b=%d",&a,&b);
输入的形式是:a=32,b=28(普通字符要照原样输入)2023/2/10程序举例例1:格式控制串中分隔符的应用。main(){int
a,b,c,d;
scanf("%d%d",&a,&b);
scanf("%d,%d",&c,&d);
printf("\n%d,%d,%d,%d",a,b,c,d);}运行时输入:123,4输出:?可以这样输入吗?123,4输出:1,2,3,41,2,3,42023/2/10例2:c格式符的使用。main(){charc1,c2,c3;
scanf("%c%c",&c1,&c2);scanf("%c",&c3);printf(“%c,%c,%c\n",c1,c2,c3);}运行时输入:ABC输出:?思考:若输入:AB(回车)C输出:?2023/2/10例3:f格式符的使用。main(){floatx,y;doublez;
scanf("%f",&x);scanf("%6f%6lf",&y,&z);
printf("x=%f,y=%f,z=%12.8f\n",x,y,z);}运行时输入:531.56212.345678.315输出:注意:float型7位有效,double型15~16位有效。x=531.562012,y=12.345000,z=678.310000002023/2/10例4.s格式符的使用。main(){chara[10],b[10];
scanf(“%s%s”,a,b);
printf(“%s\n%s\n”,a,b);}运行时输入:Howdo
you
do!输出:Howdo2023/2/10例5.抑制符的使用。main(){int
a,b;scanf(“%2d%*3d%2d”,&a,&b);
printf(“a=%db=%d”,a,b);}输入:1234567输出:?a=12b=672023/2/10使用scanf函数应注意:要求在程序运行中输入数据,输入的数据个数和类型必须与格式说明符一一对应。地址参数形式:&变量名(除数组或指针变量)。
格式控制中有非格式字符时,必须照原样输入。格式控制中无非格式字符时,输入的数值型数据和字符串用空白符分隔,字符型数据不必分隔。double型数据输入时,必须用%lf或%le格式。实型数输入时域宽不能用m.n形式的附加说明。为了减少不必要的输入量,格式控制中尽量不要出现普通字符,也不要使用
‘\n’
、‘\t’
等转义字符。2023/2/10scanf("%c%c%c",&ch1,&ch2,&ch3);要输入:abc不能输入:abc注意数值型数据与char型数据的混合输入注意(续):格式符之间若无普通字符,则:输入的数值型数据用空白符分隔输入的char型数据不必分隔
例如:scanf("%d%d",&m,&n);scanf("%c",&ch);错误输入:3228a
正确输入:3228a
2023/2/103.2.5顺序结构程序设计举例顺序结构程序的一般算法描述变量定义变量赋值运算处理输出结果可用:变量初始化赋值语句输入函数调用语句注意各个语句的顺序2023/2/103.2.5顺序结构程序设计举例【例3-11】数据交换。从键盘输入a、b的值,输出交换以后的值。
思路:在计算机中交换变量a和b的值:a=b;b=a;?正确的交换方法:a123b78c?12378123c=a;a=b;b=c;2023/2/10程序:main(){int
a,b,c;
printf("\ninputa,b:");
scanf("%d,%d",&a,&b);
printf("\nbefore
exchange:a=%db=%d\n",a,b);
c=a;a=b;b=c;/*数据交换*/
printf("afterexchange:a=%db=%d\n",a,b);}程序运行情况如下:inputa,b:32,57
beforeexchange:a=32b=57afterexchange:a=57b=32
2023/2/10举例(补充)【例3.6】已知三条边a、b、c,求三角形面积。计算三角形面积的海伦公式:其中:设定义:整型变量a、b、c实型变量s、area2023/2/10程序如下:#include"math.h"main(){int
a,b,c;floats,area;
scanf("%d,%d,%d",&a,&b,&c);s=1/2*(a+b+c);area=sqrt(s(s-a)(s-b)(s-c));
printf("area=%8.3f\n",area);}程序运行情况如下:3,4,5
area=6.000
实际上还需要判断a、b、c是否能构成三角形,即应该进行选择判断处理2023/2/10举例(补充)【例3.7】从键盘输入两个整数,输出它们相除的余数及商(要求保留2位小数)。
例如输入的m和n分别为100和18,输出形式为:m%n=10m/n=5.56
main(){int
m,n;
printf("\ninputm,n:");
scanf("%d,%d",&m,&n);
printf("\nm%%n=%d\n",m%n);
printf("m/n=%.2f\n",(float)m/n);}2023/2/10举例:【例3-12】输入时间(时、分、秒),然后打印输出共计多少秒?分析:2023/2/10程序如下:#include<stdio.h>voidmain(){ shorthour,min,sec; longtotal; printf("%nEnterhour:min:sec:"); scanf("%d:%d:%d",&hour,&min,&sec); total=hour*3600+min*60+sec; printf("\nThetotalsecond=%ld",total);}程序运行情况如下:Enterhour:min:sec:3:10:50Thetotalsecond=11450思考:total的数据类型如何处理?2023/2/1040提出问题:自然语言:如果…则…
否则…C语言:分支语句?问题1:如何根据收入,确定他的纳税比例及纳税额??
问题2如何根据学生的分数判断是否及格?2023/2/10413.3分支结构程序设计3.3.1if条件分支语句3.3.2switch多路开关语句2023/2/1042单分支语句语句一般格式if(表达式)
语句功能:计算表达式的值,如果是一个非0值(即逻辑真),就执行内嵌语句,否则(即逻辑假)跳过内嵌语句,顺序执行后续语句。内嵌语句,可为:赋值语句函数调用语句控制语句复合语句空语句可为算术、关系、逻辑、赋值等合法的表达式2023/2/1043单分支语句的算法:例如:⑴if(x>0)m++;⑵if(a>b){c=a;a=b;b=c;}
表达式非0
TF
语句N-S结构图语句流程图NY表达式非0?2023/2/1044双分支语句语句一般格式if(表达式)
语句1
else语句2
功能:计算表达式的值,如果它的值是一个非0值(逻辑真),就执行内嵌语句1,之后跳过内嵌语句2,执行后续语句;否则跳过内嵌语句1,执行内嵌语句2,之后执行后续语句。
2023/2/1045双分支语句的算法:例如:⑴if(x>0)m++;elsem--;⑵if(ch>='a'&&ch<='z')
{
ch=ch-32;
printf("%c\n",ch);}else
printf("%c\n",ch);
表达式非0
TF
语句1语句2N-S结构图语句1
语句2流程图NY表达式非0?2023/2/1046多分支语句语句一般格式if(表达式1)
语句1
elseif(表达式2)
语句2
……
elseif(表达式n-1)
语句n-1
else语句
n功能:依次计算并判断表达式i,为非0时执行后面的语句,都为0时,执行语句n无论执行完哪个语句分支,都转到后续语句2023/2/1047多重分支语句的算法流程图表达式2?表达式1?语句n语句1
语句2语句n-1…YNYNNY表达式n-1?2023/2/1048多重分支语句的算法N-S结构图表达式1?
TF
表达式2?语句1TF
语句2…
表达式n-1?TF
语句n-1语句n例如:if(a<0)x=-1;elseif(a==0)x=0;elsex=1;2023/2/1049if语句的简单应用【例3-14】设x与y有如下函数关系,根据输入的x,计算y的值输入:用scanf
函数计算:根据x的值,应用不同的算式输出:用printf
函数思路:y=x-7(x>0)2
(x=0)3x2(x<0)2023/2/1050程序分析:2023/2/1051程序:#include<stdio.h>voidmain(){ floatx,y; printf("\n"); scanf("%f",&x); if(x>0)y=x-7; if(x==0)y=2; if(x<0)y=3*x*x; printf("%.2f\n",y);}程序运行情况如下:3.8-3.20
键盘输入elseelse2023/2/1052if语句的简单应用【例3.8】输入一个字符,如果是大写字母,则将其转换为小写字母输出,否则直接输出。输入:用getchar
或scanf
函数ch是否为大写字母:ch>='A'&&ch<='Z'(或ch>=65&&ch<=90)大写字母转换为小写字母:ch=ch+32输出:用putchar
或printf
函数思路:2023/2/1053程序:#include"stdio.h"main(){charch;
ch=getchar();if(ch>='A'&&ch<='Z')
ch=ch+32;
printf("%c\n",ch);}程序运行情况如下:Gg
能使用条件表达式代替吗?putchar(ch>='A'&&ch<='Z'?ch+32:ch);putchar('\n')2023/2/1054(3)if语句的嵌套如果if的内嵌语句中又使用了一个if语句,则构成if语句的嵌套。
【例3.9】比较两个整数的关系。#include<stdio.h>main(){intx,y;
printf("EnterintegerXandY:");
scanf("%d%d",&x,&y);
if(x!=y)
if(x>y)printf("X>Y\n");
else
printf("X<Y\n");
else
printf("X=Y\n");}应该正确判断:if的内嵌语句if和else的配对if(x!=y)
if(x>y)printf("X>Y\n");
else
printf("X<Y\n");
elseprintf("X=Y\n");提倡缩格书写有利于阅读程序2023/2/1055双(或多)分支if语句的嵌套形式if(表达式)if语句else
if语句
if语句嵌套的形式单if语句的嵌套形式if(表达式)if语句可以是各种形式的if语句可以是各种形式的if语句如果是简单if语句,必须用“{}”括起2023/2/1056⑵if(c<=100)if(c>=50)printf("50<=c<=100\n");else
printf("c<50\n");else
if(c<=150)printf("100<c<=150\n");else
printf("c>150\n");⑶if(c<=100)if(c>=50)printf("50<=c<=100\n");elseprintf("c<50\n");例如:⑴if(c<=100)
if(c>=50)printf("50<=c<=100\n");与哪个if配对?匹配规则:在嵌套的if~else语句中,else总是与上面的、离它最近的、在同一复合语句中还没有配对的if配对。
elseprintf("c<50\n");2023/2/1057⑴
if(a>b)
if(a>c)
if(a>d)flag=1;
elseflag=2;
elseflag=3;⑵if
(a>b)
{
if(a>c)
if(a>d)flag=1;
else
flag=2;
}elseflag=3;flag=3的条件:flag=3的条件:当c≥a>b时当a≤b时例如:2023/2/1058举例【例3.10】输入一个数,判断它是奇数还是偶数,如果是奇数则进一步判断它是否为5的倍数。
定义变量x输入x的值
x是奇数
TF
输出“odd”x是5的倍数输出“even”TF是5的倍数x%2!=0?x%5等于0?2023/2/1059程序:main(){
intx;
scanf("%d",&x);
if(x%2!=0)
{
printf("%disanodd\n",x);
if(x%5==0)
printf("%disthetimesof5\n",x);
}
else
printf("%disaneven\n",x);}等价于if(x%2)…..等价于if(!(x%5))…..思考:如果没有{},算法和输出如何?2023/2/1060学习if语句的难点正确用表达式描述条件例如:当x大于5小于10时令x自增if(5<x<10)x++;if~else语句的配对正确判断内嵌语句例如:if(x<y)x=x+3;y=y-2;elsex=x-3;y=y+2;{}{}2023/2/1061熟悉常用的if表达式形式例如有定义:int
a,b=0;a等于什么值时,执行b=2;语句?if(a==0)b=2;if(a==1)b=2;if(a!=0)b=2;if(a=1)b=2;if(a=0)b=2;if(a)b=2;if(!a)b=2;等价于if(a!=0)b=2;等价于if(a==0)b=2;2023/2/10623.3.2switch多路开关语句switch语句的一般形式
switch(表达式){case常量表达式1:语句序列1case常量表达式2:语句序列2
……case常量表达式n:语句序列n[default:语句序列n+1]}功能:计算表达式的值,与常量表达式的值比较,等于第i个值时,顺序执行语句序列i、i+1、…、n+1若与所有常量表达式值都不相等,执行语句序列n+1。
2023/2/1063switch语句的算法描述例如:switch(a){case5:printf("&");case2:printf("#");
default:printf("$");}当a等于5,输出:$当a等于2,输出:#$当a是其他值,输出:$2023/2/1064说明:“case常量表达式i:”等价于语句标号,计算出的表达式值等于哪个语句标号,就从哪个位置开始顺序向下执行语句序列。∴语句位置影响运行结果例如:switch(a){case2:printf("#");default:printf("$");
case5:printf("&");}当a等于2,输出:#$&当a是其他值,输出:$&当a等于5,输出:&switch与break语句结合才能实现程序的分支break;break;当a等于2,输出:#当a等于5,输出:&当a是其他值,输出:$2023/2/1065switch语句的简单应用【例3.11】已知x=100,y=15,要求输入一个算术运算符(+、-、*或/),并对x和y进行指定的算术运算。
思路:设x和y为float型变量并赋初值;输入的运算符op为char型变量;根据op的值(为'+'、'-'、'*'、'/')进行x和y的相加、相减、相乘、相除运算(选择分支);还要考虑到输入字符不是+、-、*或/时的情况2023/2/1066程序:#include"stdio.h"main(){floatx=100,y=15,z;charop;op=getchar();
switch(op)
{case'+':z=x+y;break;case'-':z=x-y;break;case'*':z=x*y;break;case'/':z=x/y;break;default:z=0;
}
if((int)z!=0)printf("%f%c%f=%f\n",x,op,y,z);elseprintf("%cisnotanoperator\n",op);}实型数通常不使用z==0或z!=0的比较可用if((int)z)代替2023/2/1067注意:switch语句的书写格式:语句体本身必须用花括号括起;case和default后面如果有多条语句,则不必加花括号;case和常量表达式之间必须有空格;default可以写在语句体的任何位置,也可以省略。break语句可以改变case的语句标号作用,终止后续case语句序列的执行。
switch语句和break语句结合,可以实现程序的选择控制。
允许switch嵌套使用,但同一个switch语句中,任意两个case的常量表达式值不能相同。
2023/2/10684.3选择结构程序设计举例【例3.12】求一元二次方程ax2+bx+c=0的根。
思路:一元二次方程的根取决于系数a,b,c求根公式:
判别式d=b2-4ac
当
d=0时,方程有两个相等的实根:x1=x2=-b/(2*a)当d>0时,方程有两个不相等的实根:x1=(-b+sqrt(d))/(2*a)x2=(-b-sqrt(d))/(2*a)
当d<0时,方程有两个虚根:x1=jp+ipix2=jp-ipi实部
jp=-b/(2*a)
虚部
ip=sqrt(-d)/(2*a)2023/2/1069算法:定义变量a、b、c、d、x1、x2、jp、ip输入系数a、b、ca==0TF
计算d=b*b-4*a*c
不是二d==0
次方程TFd>0
计算重根TF
输出重根计算实根计算虚根输出实根输出虚根2023/2/1070程序:#include"math.h"main(){floata,b,c,d,x1,x2,lp,ip;
scanf("%f%f%f",&a,&b,&c);
printf("theequation");
if(fabs(a)<1e-6)printf("isnotquadratic");
else
{
d=b*b-4*a*c;
if(fabs(d)<=1e-6)
/*相等的实根*/
{
printf("hastwoequalroots:\n");
printf("x1=x2=%8.4f\n",-b/(2*a));
}2023/2/1071程序(续):
elseif(d>1e-6)
/*不相等的实根*/
{
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
printf("hastworealroots:\n");
printf("x1=%8.4f,2=%8.4f\n",x1,x2);
}
else
/*虚根*/
{
lp=-b/(2*a);ip=sqrt(-d)/(2*a);
printf("hastwocomplexroots:\n");
printf("x1=%8.4f+%8.4fi\n",lp,ip);
printf("x2=%8.4f-%8.4fi\n",lp,ip);
}
}
}2023/2/1072举例(续):【例3.13】输入年份,判别该年是否为闰年。思路:年份year为闰年的条件为①
能够被4整除,但不能被100整除的年份;②
能够被400整除的年份。只要满足任意一个就可以确定它是闰年。例如:1996年、2008年是闰年2006年、1900年不是闰年设定标志变量leap,只要符合其中一个条件的就是闰年,令leap=1;否则令leap=0
2023/2/1073算法:定义变量year、leap
输入年份year
能被4整除且不能被100整除?
TF
能被400整除?
leap=1
TFleap=1leap=0leap=1?TF
是闰年不是闰年year%400==0year%4==0&&year%100!=02023/2/1074程序:main(){intyear,leap;
scanf("%d",&year);
if(year%4==0&&year%100!=0)leap=1;
elseif(year%400==0)leap=1;
elseleap=0;if(leap==1)
printf("%disaleapyear\n",year);else
printf("%disnotaleapyear\n",year);}2023/2/1075问题1:如何根据收入,确定一个人的纳税比例及纳税额?当一个公司有多名员工时,如何计算每个人的纳税比例及纳税额?提出问题:C语言:循环语句??
问题2如何根据学生的分数判断是否及格?如何根据全班学生的分数,分别判断他们是否及格?2023/2/10763.4循环结构程序设计while循环控制do-while循环控制for循环控制循环的嵌套2023/2/10773.4.1while循环控制语句一般格式while(表达式)
语句
一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式
用来控制循环体是否执行称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句是循环重复执行的部分2023/2/1078功能:计算表达式的值,当为非0(逻辑真)时,执行内嵌语句,每执行一次,就判断一次表达式的值,当表达式的值为0时结束循环,转去执行while后面的语句。
当表达式为真语句N-S结构图NY流程图表达式非0?语句循环控制条件循环体2023/2/1079例如:【例3.14】编写程序,求100个自然数的和即:
s=1+2+3+…+100
思路:寻找加数与求和的规律
加数i——从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。求和——设变量
sum存放和,循环求sum=sum+i,直至i超过100。
2023/2/1080算法和程序:main(){int
i,sum;i=1;sum=0;while(i<=100)
{sum=sum+i;i++;
}
printf("sum=%d\n",sum);}程序输出结果:sum=5050i:循环控制变量sum:累加器
i=1,sum=0当i<=100sum=sum+ii++输出sum2023/2/1081注意:如果
(表达式)值为0,则循环体一次也不执行
(例如当i的初值为101)。在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。
思考如下的输出?
……while(i<=100){i++;sum=sum+i;}
printf("sum=%d\n",sum);}运行后,输出:sum=5150原因是什么?如何修改程序使结果正确?
2023/2/1082其他的while
语句形式while(0){....}
由于表达式恒等于0,所以循环体永远也不会执行,是一个逻辑错误的语句while(1){....}
由于表达式恒等于1,所以不可能通过循环控制条件来结束循环体的执行,即死循环。为了保证循环正常运行,应该特别注意:循环控制条件的描述
控制条件的初始状态(初始值)
循环体内部对控制条件的影响2023/2/10833.4.2do-while语句语句一般格式do语句
while(表达式);
功能:先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为0结束循环,转去执行while下面的语句。2023/2/1084
do-while循环的算法循环体当表达式为真N-S结构图NY循环体表达式非0?流程图main(){inti=1,sum=0;
do
{sum=sum+i;i++;
}
while(i<=100);
printf("%d\n",sum);}用do-while语句求1+2+…+100
2023/2/1085说明:while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构区别:do-while语句先执行循环体再判断条件,循环体至少执行一次;while语句先判断条件再执行循环体,循环体有可能一次也不执行do—while循环体中一定要有能使表达式值趋于0的操作(如i++),否则会出现死循环。
2023/2/1086do-while语句的简单应用【例3.15】用辗转相除法求m和n的最大公约数2023/2/1087算法和程序:main(){int
m,n,r;
scanf("%d,%d",&m,&n);if(m<n){r=m;m=n;n=r;}
do{r=m%n;
m=n;n=r;
}while(r!=0);
printf("%d\n",m);}程序运行情况如下:24,6012定义m、n、rm<nTFm和n交换r=m%nm=nn=r当r!=0时输出最大公约数m2023/2/10883.4.3for语句语句一般格式for(表达式1;表达式2;表达式3)语句功能:计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。循环初始条件循环控制条件循环体2023/2/1089for语句的算法N-S结构图for(表达式1;表达式2;表达式3)语句NY流程图计算表达式1语句计算表达式3表达式2为真?例如:main(){int
i,sum;
for(sum=0,i=1;i<=100;i++)
sum=sum+i;
printf("sum=%d\n",sum);}可部分或全部省略,但“;”不可省略2023/2/1090省略for语句的表达式⑴表达式1、2、3全省略,即:for(;;)
等同于:while(1),会无限循环(死循环)注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行⑵省略表达式1和表达式3,即:for(;表达式2;)
等同于:while(
表达式2)⑶省略表达式2,即:for(表达式1;;表达式3)
等同于:表达式1;while(1){…表达式3;}2023/2/1091例如:⑴i=1;for(;i<=100;i++)sum+=i;⑵for(i=1;;i++){…if(i>100)……}⑶for(i=1;i<=100;){…i++;…}⑷i=1;for(;;){…if(i>100)…
i++;…}2023/2/1092说明:所有用while
语句实现的循环都可以用for
语句实现。
等价于:for(表达式1;表达式2;表达式3)
语句;表达式1;while(表达式2){
语句;
表达式3;
}2023/2/1093for语句的简单应用【例3.16】求n!,即计算p=1×2×3×…×n的值。
思路:求阶乘与求累加的运算处理过程类似,只要将“+”变为“*”。设置:乘数i
,初值为1,终值为n(n是循环控制终值,需要从键盘输入)累乘器p
,每次循环令p=p*i2023/2/1094程序:main(){inti,n;longp;
p=1;
printf("Entern:");
scanf("%d",&n);for(i=1;i<=n;i++)
p
=
p
*
i;
printf("p=%ld\n",p);}思考:如何求s=1!+2!+…+n!?2023/2/10953.4.43种循环语句的比较while和do-while语句的表达式只有一个,for语句有三个。while和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。while语句多用于循环次数不定的情况do-while语句多用于至少要运行一次的情况for语句多用于要赋初值或循环次数固定的情况2023/2/10963.4.5循环的嵌套如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套例如:
#include<stdio.h>main(){inti,j;
for(
i=1;i<10;i++
)
for(
j=1;j<=i;j++
)
printf((j==i)?"%4d\n":"%4d",i*j);
}外循环语句内循环语句外循环体内循环体2023/2/1097例如:
#include<stdio.h>main(){inti,j;
for(
i=1;i<10;i++
){for(
j=1;j<=i;j++
)
printf("%4d",i*j);
printf("\n");
}
}外循环语句内循环语句外循环体内循环体3.4.5循环的嵌套2023/2/1098运行结果:124369481216510152025612182430367142128354249816243240485664918273645546372812023/2/1099注意:while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。例如:for(a=1;a<=10;a++){for(b=0;b<=5;b++)
……}外循环执行了10次,内循环执行6次循环正常结束时,内循环执行了10×6=60次2023/2/101003.5break和continue语句结构化程序设计中有如下2种语句实现跳转:continue语句break语句在循环语句的循环体中使用,可以进行循环的流程控制2023/2/101013.5.1
break语句功能:利用break语句能够强迫终止本层循环,转到后续语句执行。2023/2/10102后续语句…语句…YN表达式?后续语句…语句…表达式?YN3.5.1
break的应用break;while语句break;do-while语句后续语句计算表达式3计算表达式1…语句…表达式2?YNbreak;for语句2023/2/10103例如:⑴int
x,n=0,s=0;while(n<10){scanf("%d",&x);
if(x<0)break;s+=x;n++;};⑵int
x,n=0,s=0;do{scanf("%d",&x);
if(x<0)break;s+=x;n++;}while(n<10);⑶for(n=0,s=0;n<10;n++){scanf("%d",&x);
if(x<0)break;s+=x;}2023/2/101043.5.2
continue语句及应用功能:中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。2023/2/10105后续语句…语句…YN表达式?后续语句…语句…表达式?YN3.5.2
continue语句及应用(续)continue;while语句continue;do-while语句后续语句计算表达式3计算表达式1…语句…表达式2?YNcontinue;for语句2023/2/10106例如:⑴int
x,n=0,s=0;while(n<10){scanf("%d",&x);
if(x<0)continue;
s+=x;n++;};
⑵int
x,n=0,s=0;do{scanf("%d",&x);
if(x<0)continue;
s+=x;n++;}while(n<10);
⑶for(n=0,s=0;n<10;){scanf("%d",&x);
if(x<0)continue;
s+=x;n++}2023/2/10107应用举例【例3.17】把100~200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。
思路:设变量n,从100变化到200;对每个n进行判断,当n不能被7整除时,终止本次循环,否则就输出这个数;设变量j作为输出个数的计数器,每输出一个数就令j++;当输出了10个数时(即j%10等于0),输出’\n’退出循环后输出j的值。
2023/2/10108算法和程序main(){int
n,j=0;
for(n=100;n<=200;n++){if(n%7!=0)continue; printf("%6d",n);
j++;
if(j%10==0)
printf("\n");
}
printf("\n");
printf("j=%d\n",j);}for(n=100;n<=200;n++)n不能被7整除
TF终止本次循环输出n
输出10个数
TF
换行2023/2/101093.6程序设计举例及案例研究【例3-21】判断输入的某个数m是否为素数。若是素数,输出“YES”,若不是,输出“NO”。
思路:素数是指只能被1和它本身整除的数,如5、7、11、17、…等。
分别用2、3、…,m-1尝试能否整除整数m。如果m能被某个数整除,则m就不是素数。这是一种穷举算法设除数为j,从2循环到m-12023/2/10110算法和程序:
输入一个数mfor(j=2;j<=m-1;j++)
m%j==0TF
退出循环
j>m-1TF输出"YES“输出"NO"#include"math.h"main(){int
j,m,k;
printf("Enteranintegernumber:");
scanf("%d",&m);if(m==0||m==1)printf("NO\n");for(j=2;j<=m-1;j++)
if(m%j==0)break;if(j>m-1)
printf("YES\n");else
printf("NO\n");}2023/2/10111程序的优化对于穷举法来说,为了提高程序的效率,就要减少尝试次数。#include"math.h"main(){int
j,m,k;
printf("Enteranintegernumber:");
scanf("%d",&m);if(m==0||m==1)printf("NO\n");
k=sqrt(m);for(j=2;j<=k;j++)
if(m%j==0)break;if(j>k)printf("YES\n");elseprintf("NO\n");}思考:如何输出100~200中所有的素数
2023/2/10112举例2【例】用牛顿迭代法求方程
2x3+4x2-7x-6=0在x=1.5附近的根。
思路:设xn为一个接近xa的近似根,过(xn,f(xn))点做切线,切线方程为:即:xnxn+1xy0f(x)(xn,f(xn))(xn+1,f(xn+1))
xa
方程的根—牛顿迭代公式2023/2/10113算法基本步骤:①
先设一个方程近似根x0,求出方程f的值和方程导数f1的值;f=2x03+4x02-7x0-6f1=6x02+8x0-7②
用迭代公式x=x0-f/f1进行迭代,求出x比x0要接近方程真实的根;③
当|x-x0|大于某个很小的数时(如10-6),认为未找到,此时将x→x0,再次求f、f1,并迭代,又求出一个新的更接近方程根的x;④
一直到|x-x0|≤10-6时得到方程近似根:x或x0。这是一种迭代算法用循环实现2023/2/10114算法和程序:#include"math.h"main(){floatx,x0,f,f1;
x=1.5;do{x0=x;f=2*x0*x0*x0+4*x0*x0-7*x0-6;f1=6*x0*x0+8*x0-7;
x=x0-f/f1;}while(fabs(x-x0)>1e-6);
printf("%f\n",x);}x赋初值x0=x计算f计算f1计算x=x0-f/f1当|x-x0|>10-6时输出x2x3+4x2-7x-6=02023/2/10115举例3【例】编程序,输出以下图形。
****************一共有4行,每行由空格和星号组成:空格数按行增加,星号按行减少变量
i
控制输出行数,从1变化到4变量j控制输出每行的空格和星号:j从1变化到
i,每次输出一个空格j从1变化到9-2*i,每次输出一个星号使用双重
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 沧州市人民医院物理治疗设备操作考核
- 大学舞蹈课件
- 大学老师知识培训课件
- 2025湖南永州市潇湘兴业集团公司选聘急需紧缺专业人才考前自测高频考点模拟试题及完整答案详解1套
- 2025北京协和医院整形美容外科合同制科研助理招聘模拟试卷附答案详解(突破训练)
- 石家庄市中医院处方管理考核考核
- 石家庄市人民医院血型基因分型技术考核
- 2025年萍乡创新发展投资集团有限公司招聘6人模拟试卷及答案详解(各地真题)
- 2025年度黑龙江省气象部门高校毕业生招聘4人(第三批次气象类)考前自测高频考点模拟试题及参考答案详解一套
- 2025中心医院医疗流程优化考核
- 新产品APQP开发计划表
- ICU患者的早期活动
- LY/T 1145-1993松香包装桶
- JJF 1338-2012相控阵超声探伤仪校准规范
- GB/T 9114-2000突面带颈螺纹钢制管法兰
- GB/T 17245-1998成年人人体质心
- 港口集团绩效考核方案
- 华为公司校园招聘个人简历标准版
- 固体化学固体中的扩散
- 学校结核病防控培训课件
- 经典企业商业融资计划书模板
评论
0/150
提交评论