版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计基础——C语言武昌首义学院信息科学与工程学院1程序设计基础——C语言武昌首义学院信息科学与工程学院1点击添加文本点击添加文本点击添加文本点击添加文本第4章控制结构4.2顺序结构4.1算法及其描述方法4.3选择结构4.4循环结构4.5综合应用举例2点击添加文本点击添加文本点击添加文本点击添加文本第4章控4.1算法及其描述方法计算机科学家沃思(N.Wirth)曾提出过一个经典公式:
数据结构+算法=程序①数据结构:对数据的描述。②算法:对操作的描述。这就好比厨师做的菜谱。菜谱上一般应包括:①原材料:指出应使用哪些原料。②操作步骤:指出如何使用这些原材料按规定的步骤加工成所需的菜肴。34.1算法及其描述方法计算机科学家沃思(N.Wirth)4.1.1算法的概念为解决一个具体问题而采取的确定的有限的操作步骤。算法有穷性确定性有效性没有或多个输入一个或多个输出算法特性44.1.1算法的概念为解决一个具体问题而采取的确定的有限点击添加文本点击添加文本点击添加文本点击添加文本12344.1.2算法的描述方法自然语言程序流程图N-S图伪码5点击添加文本点击添加文本点击添加文本点击添加文本12344.1自然语言【举例】计算n!。【分析】n!=1×2×3×4×…×n,可用n次乘法运算来实现,每次在原有结果基础上乘上一个数,而这个数是从1变化到n的。【算法】step1输入n的值。step2如果n<0,则打印输出“输入错误”提示信息,转去执行step4。step3如果n≥0,则:
①给存放结果的变量res置初值1。
②给代表乘数的变量i置初值1。
③进行累乘运算res=res*i。
④乘数变量增1,得到下一个乘数的值,i=i+1。
⑤如果i≤n,则重复执行③和④,否则执行⑥。
⑥输出n!的结果res。step4程序结束。61自然语言【举例】计算n!。62程序流程图图4-1程序流程图中的常用符号图4-2计算n!的程序流程图72程序流程图图4-1程序流程图中的常用符号图4-2计3N-S图图4-3计算n!的N-S图83N-S图图4-3计算n!的N-S图84伪码伪码表示的计算n!的算法。inputnifn<0print“inputerror”gotoendelseres=1i=1loop:res=res*ii=i+1if(i<=n)gotoloopprintresend:伪码是指介于自然语言和计算机语言之间的一种代码,它不能在计算机上运行,无固定格式和规范,只要写出来自己或别人能看懂即可。94伪码伪码表示的计算n!的算法。伪码是指介于自然语言和计算机4.2顺序结构顺序结构:完全按照语句出现的先后顺序执行的程序。顺序结构的基本程序框架:输入、计算、输出。(a)程序流程图(b)N-S图图4-4顺序结构104.2顺序结构顺序结构:完全按照语句出现的先后顺序执行的【程序4-1】输入三角形的三边长,求三角形的面积。假设输入的三角形的三边a、b和c能构成三角形,根据海伦公式,求三角形面积的公式为:area=,其中s=【算法分析】step1定义程序中用到的变量:floata,b,c;floats,area;step2输入三角形的三条边a、b和c。step3
计算s和area的值。s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));step4
打印输出三角形的面积。11【程序4-1】输入三角形的三边长,求三角形的面积。假设输入的【程序4-1】输入三角形的三边长,求三角形的面积。include<stdio.h>#include<math.h>intmain(){ floata,b,c,s,area; printf("请输入三角形的三条边:\n"); scanf("%f,%f,%f",&a,&b,&c); s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("a=%7.2f,b=%7.2f,c=%7.2f\n",a,b,c); printf("area=%7.2f\n",area); return0;}输入计算输出3,4,5↙a=3.00,b=4.00,c=5.00area=6.0012【程序4-1】输入三角形的三边长,求三角形的面积。输入计算输【程序4-2】交换数据。对输入的两个变量a、b,交换它们的值并输出。【算法分析】step1定义程序中用到的变量:inta,b,c;step2输入要交换的两个变量a和b。step3借助第三个变量c实现a和b的交换
①c=a;
②a=b;
③b=c;step4打印输出交换后的a和b。abc①②③ab交换13【程序4-2】交换数据。对输入的两个变量a、b,交换它们的值【程序4-2】对输入的两个变量a、b,交换它们的值并输出。#include<stdio.h>intmain(){ inta,b,c; scanf("%d%d",&a,&b); printf("Beforeswapa=%d,b=%d\n",a,b); c=a; a=b; b=c; printf("Afterswapa=%d,b=%d\n",a,b); return0;}输入交换输出34↙Beforeswapa=3,b=4Afterswapa=4,b=314【程序4-2】对输入的两个变量a、b,交换它们的值并输出。输154.3选择结构单分支如果天气好,就去旅游双分支跟团?自助?多分支汽车?火车?飞机?154.3选择结构单分支4.3选择结构实际问题中,有时需要根据不同的判断条件执行不同的操作步骤,这就是选择结构,也称为分支结构。①如果输入的三角形三边不能构成三角形,则输出“输入错误”信息;否则,若能构成三角形,则计算三角形的面积并输出。②计算一元二次方程ax2+bx+c=0的根,如果b2-4ac>0,有两个不等的实根;如果b2-4ac=0,有两个相等的实根;如果b2-4ac<0,有两个复数根。③计算分段函数的值:
-1 (x<0)y=0 (x=0)1 (x>0)164.3选择结构实际问题中,有时需要根据不同的判断条件执行点击添加文本点击添加文本点击添加文本点击添加文本4.3.14.3.24.3选择结构if语句switch语句单分支双分支多分支多分支17点击添加文本点击添加文本点击添加文本点击添加文本4.3.144.3.1if语句C语言提供如下3种基本形式的if语句if(a>b)max=a;18(1)if形式if(表达式)
语句单分支表达式语句真假4.3.1if语句C语言提供如下3种基本形式的if语句i4.3.1if语句(2)if-else形式if(表达式)
语句1else
语句2if(a>b) max=a;elsemax=b;19双分支表达式语句1真假语句24.3.1if语句(2)if-else形式if(a>b4.3.1if语句(3)else-if形式if(表达式1)
语句1elseif(表达式2)
语句2elseif(表达式3)
语句3else
语句420多分支表达式1语句1假真表达式2真假表达式3语句2语句3真语句4假4.3.1if语句(3)else-if形式20多分支表达式4.3.1if语句21表达式1语句1真多分支表达式1语句1假真表达式2真假表达式3语句2语句3真语句4假假表达式2语句2真假表达式3语句3真假语句44.3.1if语句21表达式1语句1真多分支表达式1语句【程序4-3】某商店规定按照用户购物款,给出相应的折扣率。规定为:(1)购物款大于1000元,购物为7折。(2)购物款大于800,小于或等于1000元,购物为8折。(3)购物款大于500,小于或等于800元,购物为9折。(4)购物款小于或等于500元,购物无折扣。请设计程序,根据用户购物款,计算用户实际支付的金额。用if形式实现if(cost>1000)rate=0.7;if(cost>800&&cost<=1000)rate=0.8;if(cost>500&&cost<=800)rate=0.9;if(cost<=500)rate=1.0;用else-if形式实现if(cost>1000)rate=0.7;elseif(cost>800)rate=0.8;elseif(cost>500)rate=0.9;elserate=1.0;22【程序4-3】某商店规定按照用户购物款,给出相应的折扣率。规23if(cost>1000)rate=0.7;if(cost>800&&cost<=1000)rate=0.8;if(cost>500&&cost<=800)rate=0.9;if(cost<=500)rate=1.0;【程序4-3】用if形式实现(1)购物款大于1000元,购物为7折。(2)购物款大于800,小于或等于1000元,购物为8折。(3)购物款大于500,小于或等于800元,购物为9折。(4)购物款小于或等于500元,购物无折扣。if形式cost>1000rate=0.7真cost>800&&cost<=1000真真cost>500&&cost<=800cost<=500rate=0.8rate=0.9rate=1.0真假假假假23if(cost>1000)【程序4-3】用if形式实现24cost>1000rate=0.7真cost>800&&cost<=1000真真cost>500&&cost<=800cost<=500rate=0.8rate=0.9rate=1.0真if(cost>1000)rate=0.7;elseif(cost>800)rate=0.8;elseif(cost>500)rate=0.9;elserate=1.0;【程序4-3】用elseif形式实现(1)购物款大于1000元,购物为7折。(2)购物款大于800,小于或等于1000元,购物为8折。(3)购物款大于500,小于或等于800元,购物为9折。(4)购物款小于或等于500元,购物无折扣。elseif形式假假假假cost>800cost>500cost=1.024cost>1000rate=0.7真cost>800&【程序】用if形式实现#include<stdio.h>intmain(){intcost;/*购物款*/floatrate;/*折扣率*/printf("请输入用户的购物款:\n");scanf("%d",&cost);if(cost>1000)rate=0.7;if(cost>800&&cost<=1000)rate=0.8;if(cost>500&&cost<=800)rate=0.9;if(cost<=500)rate=1.0;printf("用户支付的实际金额是:%.2f\n",cost*rate);return0;}计算25【程序】用if形式实现计算25【程序】用else-if形式实现#include<stdio.h>intmain(){intcost;/*购物款*/floatrate;/*折扣率*/printf("请输入用户的购物款:\n");scanf("%d",&cost);if(cost>1000) rate=0.7;elseif(cost>800) rate=0.8;elseif(cost>500) rate=0.9;else rate=1.0;printf("用户支付的实际金额是:%.2f\n",cost*rate);return0;}请输入用户的购物款:700↙用户支付的实际金额是:630.00计算26【程序】用else-if形式实现请输入用户的购物款:计算264.3.1if语句【注意】if语句如果在满足条件时执行一组(多条)语句,则必须把这组语句用大括号括起来组成一个复合语句块。if(a>b){a++;b++;}else{a=0;b=1;}if(a>b)a++;b++;elsea=0;b=1;无大括号,会怎样?27无论(a>b)成立与否,均会执行。
4.3.1if语句【注意】if(a>b)if(a>b)无大4.3.1if语句【注意】if语句的嵌套:如果if语句中的执行语句又有一个if语句。else总是与它之前最近出现的,尚未配对的if相匹配。
if(a>b)if(b>0)printf(“a>b>0\n”);elseprintf(“a>b,b<=0\n”);elseif(a>0)printf(“b>=a>0\n”);elseif(a==0)printf(“b>=a=0\n”);elseprintf(“b>=a,a<0\n”);284.3.1if语句【注意】if(a>b)28【程序4-4】编程设计一个简单的猜数游戏:先由计算机“想”一个数请人猜,如果人猜对了,则计算机给出提示“Right!”,否则提示“Wrong!”,并告诉人所猜的数是大还是小。【分析】本例程序设计中的难点是如何让计算机“想”一个数。“想”反映了一种随机性,可用随机函数rand()产生计算机“想”这个数。随机函数rand()产生一个0~RAND_MAX之间的整数,RAND_MAX在头文件stdlib.h中定义的符号常量,因此使用该函数时需要包含头文件stdlib.h。ANSI标准规定RAND_MAX的值不得大于双字节整数的最大值32767。29【程序4-4】编程设计一个简单的猜数游戏:先由计算机“想”一【算法设计】step1通过调用随机函数任意生成一个数magic。step2输入人猜的数guess。step3如果guess大于magic,则给出提示“Wrong!Toohigh!”。step4如果guess小于magic,给出提示“Wrong!Toolow!”。step5如果guess等于magic,给出提示“Right!”,并打印guess值。step1step2step3step4step530【算法设计】step1step2step3step4/*程序4-4:设计一个简单的猜数游戏。*/#include<stdio.h>#include<stdlib.h>intmain(){intmagic; /*定义计算机“想”的数*/intguess; /*定义人猜的数*/
magic=rand(); /*调用随机函数任意生成一个数magic*/printf("Pleaseguessamagicnumber:");scanf("%d",&guess);
if(guess>magic) /*如果guess大于magic*/printf("Wrong!Toohigh!\n");elseif(guess<magic)/*如果guess小于magic*/ printf("Wrong!Toolow!\n");else /*如果guess等于magic*/{ printf("Right!\n"); printf("Thenumberis:%d\n",magic);}return0;}step1step2step3step4step5①Pleaseguessamagicnumber:25↙Wrong!Toolow!②Pleaseguessamagicnumber:60↙Wrong!Toohigh!③Pleaseguessamagicnumber:41↙Right!Thenumberis:4131/*程序4-4:设计一个简单的猜数游戏。*/step1s【思考】如何产生一个指定范围内的随机数?(1)如果希望计算机能够产生指定范围MIN_NUM~MAX_NUM之间的随机数,可采用下面的方法:①调用随机函数rand任意生成一个随机数:
magic=rand();②将这个随机数限制在MIN_NUM~MAX_NUM之间:magic=magic%(MAX_NUM-MIN_NUM+1)+MIN_NUM; 例如,如果希望计算机生成1~100之间的随机数,则产生这个范围随机数的代码为:magic=rand();magic=magic%(100–1+1)+1;以上两条语句可合并为一条语句:
magic=rand()%100+1;32【思考】如何产生一个指定范围内的随机数?32#include<stdio.h>#include<stdlib.h>intmain(){intmagic;intguess;magic=rand()%100+1;//产生1-100的随机数
printf("Pleaseguessamagicnumber:");scanf("%d",&guess);if(guess>magic)printf("Wrong!Toohigh!\n");elseif(guess<magic)printf("Wrong!Toolow!\n");else{printf("Right!\n");printf("Thenumberis:%d\n",magic);}return0;}33#include<stdio.h>33【注意】(2)如何才能使程序每次执行时产生不同的随机数序列?通过调用函数srand()为函数rand()设置随机数种子来实现。unsignedintseed; /*定义一个无符号整型变量*/printf("Pleaseenterseed:");scanf("%u",&seed);/*输入随机数种子seed*/srand(seed);/*为函数rand()设置随机数种子*/magic=rand()%100+1;/*生成一个1-100之间的随机数*/
34【注意】34intmain(){intmagic;intguess;unsignedintseed; /*定义一个无符号整型变量*/printf("Pleaseenterseed:");scanf("%u",&seed);/*输入随机数种子seed*/srand(seed);/*为函数rand()设置随机数种子*/magic=rand()%100+1;/*生成一个1-100之间的随机数*/printf("Pleaseguessamagicnumber:");scanf("%d",&guess);if(guess>magic)printf("Wrong!Toohigh!\n");elseif(guess<magic)printf("Wrong!Toolow!\n");else{printf("Right!\n");printf("Thenumberis:%d\n",magic);}return0;}35intmain()35【注意】如果不想每次都通过输入随机数种子来完成随机化,那么可以使用计算机读取其时钟值并把该值自动设置为随机数种子。
#include<time.h>/*包含函数time()的声明*/
srand(time(NULL));/*为函数rand()设置随机数种子*/magic=rand()%100+1;/*生成一个1-100之间的随机数*/
36【注意】36#include<stdio.h>#include<stdlib.h>#include<time.h>/*包含函数time()的声明*/intmain(){intmagic;intguess;srand(time(NULL));/*为函数rand()设置随机数种子*/magic=rand()%100+1;/*生成一个1-100之间的随机数*/printf("Pleaseguessamagicnumber:");scanf("%d",&guess);if(guess>magic)printf("Wrong!Toohigh!\n");elseif(guess<magic)printf("Wrong!Toolow!\n");else{printf("Right!\n");printf("Thenumberis:%d\n",magic);}return0;}37#include<stdio.h>374.3.2switch语句switch语句常用于各类分类统计、菜单等程序的设计。switch(表达式){case
常量表达式1:
语句序列1;case
常量表达式2:
语句序列2;……case
常量表达式n:
语句序列n;default:
语句序列n+1;}多分支相等相等相等其它值整型字符型枚举型384.3.2switch语句switch语句常用于各类分类【程序4-7】根据用户输入的整数,打印输出星期一至星期天。#include<stdio.h>intmain(){inta;scanf("%d",&a);
switch(a){
case1: printf("Monday\n");
case2: printf("Tuesday\n");
case3: printf("Wednesday\n");
case4: printf("Thursday\n");
case5: printf("Friday\n");
case6: printf("Saturday\n");
case7: printf("Sunday\n");
default: printf("error\n");}return0;}3↙WednesdayThursdayFridaySaturdaySundayerror相等39【程序4-7】根据用户输入的整数,打印输出星期一至星期天。#只有switch语句和break语句配合才能形成真正意义上的多分支。【程序4-8】增加了break语句switch(a){case1:printf("Monday\n");break;case2:printf("Tuesday\n");break;case3: printf("Wednesday\n");
break;case4:printf("Thursday\n");
break;case5:printf("Friday\n");
break;case6:printf("Saturday\n");
break;case7:printf("Sunday\n");break;default:printf("error\n");
break;}3↙Wednesday相等每个case子句和default子句出现的次序发生改变时,不影响程序的运行结果。40只有switch语句和break语句配合才能形成真正意义上的图(a)程序的程序流程图41a=1输出Monday开始输出Tuesday结束输出Wednesday输出Thursday输出Friday输出Saturday输出Sunday输出errora?输入aa=2a=3a=4a=5a=6a=7其它图(b)程序的N-S图图(a)程序的程序流程图41a=1输出开始输出结束输出输【注意】若case子句后执行的语句序列缺省不写,则表示与它后续case子句执行相同的语句序列。switch(a){case1:printf("Monday\n");break;case2:printf("Tuesday\n");break;case3: printf("Wednesday\n");
break;case4:printf("Thursday\n");
break;case5:printf("Friday\n");
break;case6:/*语句序列缺省*/case7:printf(“Weekend\n");break;default:printf("error\n");
break;}6↙Weekend7↙Weekend42【注意】switch(a)6↙7↙42【注意】各个case之后是常量表达式,一定不要试图使用条件表达式或者逻辑表达式。switch(a){case1:printf("Monday\n");break;case2:printf("Tuesday\n");break;case3: printf("Wednesday\n");
break;case4:printf("Thursday\n");
break;case5:printf("Friday\n");
break;case6||7:printf("Weekend\n");break;default:printf("error\n");
break;}逻辑表达式43【注意】switch(a)逻辑表达式43【注意】各个case之后是常量表达式,一定不要试图使用条件表达式或者逻辑表达式。#include<stdio.h>intmain(){intscore;scanf("%d",&score);
switch(score){
casescore>=60:printf("及格\n");
break;
casescore<60: printf("不及格\n");
break;}return0;}条件表达式44【注意】#include<stdio.h>条件表达式44【程序4-10】根据输入的百分制成绩score,转换成相应的五分制成绩grade,并打印输出。转换标准为:
A90≤score≤100B80≤score<90grade=
C70≤score<80D60≤score<70E0≤score<60算法1:嵌套if语句算法2:switch语句多分支45【程序4-10】根据输入的百分制成绩score,转换成相应的/*检查成绩是否在1-100的范围内*/if(score<0||score>100)printf("Inputerror!\n");elseif(score>=90)printf("%d--A\n",score);elseif(score>=80)printf("%d--B\n",score);elseif(score>=70)printf("%d--C\n",score);elseif(score>=60)printf("%d--D\n",score);elseprintf("%d--E\n",score);算法1:嵌套if语句46/*检查成绩是否在1-100的范围内*/算法1:46switch(score/10){case
10:case
9: printf("%d--A\n",score); break;case
8: printf("%d--B\n",score); break;case
7: printf("%d--C\n",score); break;case
6: printf("%d--D\n",score);case
5:case
4:case3:case
2:case
1:case
0:printf("%d--E\n",score); break;default: printf("Inputerror!\n");}算法2:switch语句技巧score/10=?100/10=1095/10=987/10=8…23/10=247switch(score/10)case5:算法2:技巧s【知识的引入】“判断除数是否为0?”的判定表达式:
if(b==0)错误原因:float类型变量b,不能直接与0进行“等于==”比较。正确方法:如果|b|<10-5,则认为b0。
fabs(b)<EPS (EPS即10-5)趋近于48【知识的引入】趋近于48【程序4-11】编程实现一个简单的计算器程序,从键盘接收用户的输入:操作数1运算符
操作数2运算符为加(+)、减(-)、乘(*)、除(/)。计算表达式的值,并输出结果。程序的算法描述:49【程序4-11】编程实现一个简单的计算器程序,从键盘接收用户【程序4-11】编程实现一个简单的计算器程序。#include<stdio.h>#include<math.h>#defineEPS1E-5intmain(){floata,b; /*定义两个操作数*/charop; /*定义运算符*/printf("inputexpression:a+(-,*,/)b\n");scanf("%f%c%f",&a,&op,&b);/*输入运算表达式*/
switch(op){
case'+': /*处理加法*/ printf("%.2f\n",a+b); break;
case'-': /*处理减法*/ printf("%.2f\n",a-b); break;
case'*': /*处理乘法*/ printf("%.2f\n",a*b); break;
case'/': /*处理除法*/if(fabs(b)<EPS) /*除数b为0*/printf("Divisionbyzero!\n");else printf("%.2f\n",a/b);break;
default:printf("Inputerror!\n");}return0;}①inputexpression:a+(-,*,/)b5.3+3.4↙8.70②inputexpression:a+(-,*,/)b5.3-3.4↙1.90③inputexpression:a+(-,*,/)b5.3*3.4↙18.02④inputexpression:a+(-,*,/)b5.3/3.4↙1.56⑤inputexpression:a+(-,*,/)b5.3/0↙Divisionbyzero!⑥inputexpression:a+(-,*,/)b5.3#3.4↙inputerror!50【程序4-11】编程实现一个简单的计算器程序。①input514.4循环结构实际应用中的许多问题,都会涉及重复执行的操作步骤和相应的算法。①计算1+2+3+…+100这样一个循环累加的问题,每次循环累加一个自然数,总共需要100次循环,即累加100个数,从而得到这个自然数列之和。②计算n!=1×2×3×…×n这样一个循环累乘问题,每次循环累乘一个自然数,总共需要n次循环,即累乘n个数,从而得到n的阶乘。③利用公式
;求π的近似值,直到最后一项的绝对值小于10-5为止。这是一个事先不知道循环次数的问题,需根据给定条件来判断循环是否终止。④以二维表形式打印九九乘法表,这需要双重循环才能解决问题,需要用外层循环控制行的打印,而用内层循环控制列的打印。514.4循环结构实际应用中的许多问题,都会涉及重复执行的点击添加文本点击添加文本点击添加文本点击添加文本4.4.14.4.24.4循环结构while语句do...while语句524.4.3for语句循环条件
:给定的条件。循环体
:反复执行的程序段。循环变量
:用于控制循环执行次数的变量。循环要素点击添加文本点击添加文本点击添加文本点击添加文本4.4.144.4.1while语句while(表达式) {
循环体语句}先判断后执行53若有多条语句假真循环体语句表达式循环4.4.1while语句while(表达式) 先判断后执54输入5个整数求和开始sum=n1+n2+n3+n4+n5输入n1的值结束输入n2的值输入n3的值输入n4的值输入n5的值输出sum的值sum=0,i=1i≤5?假真开始输入x的值sum=sum+xi++结束输出sum的值输入100个整数求和i≤100?54输入5个整数求和开始sum=n1+n2+n3+n4+n555sum=0,i=1i≤5?假真开始输入x的值sum=sum+xi++结束输出sum的值输入5个整数求和#include<stdio.h>intmain(){intsum=0,i=1,x;
while(i<=5){ scanf(“%d”,&x);sum=sum+x; i++; }printf("%d\n",sum);return0;}55sum=0,i=1i≤5?假真开始输入x的值sum=su56#include<stdio.h>intmain(){intsum=0,i=1,x;
while(i<=5){ scanf(“%d”,&x);sum=sum+x; i++; }printf("%d\n",sum);return0;}输入5个整数求和输入100个整数求和#include<stdio.h>intmain(){intsum=0,i=1,x;
while(i<=100){ scanf(“%d”,&x);sum=sum+x; i++; }printf("%d\n",sum);return0;}56#include<stdio.h>输入5个整数求和输入57计算1+2+3+…+100的和#include<stdio.h>intmain(){intsum=0,i=1,x;
while(i<=100){
scanf(“%d”,&x);sum=sum+x; i++; }printf("%d\n",sum);return0;}输入100个整数求和#include<stdio.h>intmain(){intsum=0,i=1,x;
while(i<=100){scanf(“%d”,&x);sum=sum+x; i++; }printf("%d\n",sum);return0;}5050i57计算1+2+3+…+100的和#include<std58【程序4-12】求1+2+3+…+100算法设计过程:设置sum=0;i=1;(1)将1累加到和sum中sum+isum1i+1i2(2)将2累加到和sum中sum+isum3i+1i3(3)将3累加到和sum中sum+isum6i+1i4……(100)将100累加到和sum中sum+isum5050i+1i1010sumi1123364……5050101累加结束输出循环三要素:循环体循环条件
:i<=100循环变量
:i循环体58【程序4-12】求1+2+3+…+1000sumi11259【程序4-12】求1+2+3+…+100,即#include<stdio.h>intmain(){intsum=0,i=1; /*sum用来存放累加和,初值为0*/
while(i<=100){ sum=sum+i; /*把i的值累加到变量sum中*/ i++; /*使i的值加1*/}printf("%d\n",sum);return0;}循环条件循环体循环变量5050【思考】如果改为求1到100之间所有偶数之和,程序应如何修改?59【程序4-12】求1+2+3+…+100,即循环条件循环60#include<stdio.h>intmain(){intsum=0,i=1;
while(i<=100){ sum=sum+i;
i++;
}printf("%d\n",sum);return0;}#include<stdio.h>intmain(){intsum=0,i=100;
while(i>=1){ sum=sum+i;
i--;
}printf("%d\n",sum);return0;}顺着累加i=1,2,3,…,100→
i<=100倒着累加i=100,99,98,…,1→
i>=160#include<stdio.h>#include<61#include<stdio.h>intmain(){intsum=0,i=1;
while(i<=100){ sum=sum+i; i++; }printf("%d\n",sum);return0;}【课外拓展学习】计算1+2+3+…+n的值,其中n的值由用户输入。#include<stdio.h>intmain(){intsum=0,i=1,n;
printf(“Inputn:”);scanf(“%d”,&n);
while(i<=n){ sum=sum+i; i++; }printf("%d\n",sum);return0;}61#include<stdio.h>【课外拓展学习】计4.4.2do…while语句do
{
循环体语句}
while(表达式);先执行后判断62若有多条语句注意表达式循环体语句假真循环4.4.2do…while语句do 先执行后判断62若有63表达式循环体语句表达式循环体语句假真假真do…while循环while循环比较while和do…while63表达式循环体语句表达式循环体语句假真假真do…while64【程序】用do…while循环求1+2+3+…+100#include<stdio.h>intmain(){intsum=0,i=1;
do
{ sum=sum+i; i++;}while(i<=100);printf("%d\n",sum);return0;}开始sum=0i=1i≤100sum=sum+ii++输出sum的值结束假真64【程序】用do…while循环求1+2+3+…+100开65do…while循环开始sum=0i=1i≤100sum=sum+ii++输出sum的值结束假真求while循环开始sum=0i=1i≤100sum=sum+ii++输出sum的值结束假真先执行后判断先判断后执行65do…while循环开始sum=0i≤100sum=su66【程序4-13】用do…while循环求1+2+3+…+100,即#include<stdio.h>intmain(){intsum=0,i=1;/*sum用来存放累加和,初值为0*/
do
/*在循环开始时不检查条件,先执行一次循环体*/{ sum=sum+i;/*把i的值累加到变量sum中*/ i++;/*使i的值加1*/}while(i<=100);printf("%d\n",sum);return0;}循环条件循环体循环变量505066【程序4-13】用do…while循环求1+2+3+…+67while语句和do…while语句的区别【程序4-14】#include<stdio.h>intmain(){ intsum=0,i; scanf("%d",&i);
while(i<=2){ sum=sum+i; i++; }printf("sum=%d\n",sum);return0;}【程序4-15】#include<stdio.h>intmain(){ intsum=0,i; scanf("%d",&i);
do{ sum=sum+i; i++; }while(i<=2);printf("sum=%d\n",sum);return0;}
3↙sum=03↙sum=3先判断后执行先执行后判断67while语句和do…while语句的区别【程序4-1468【猜数游戏】先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏;否则计算机给出提示,告诉人所猜的数是太大还是太小。猜一次直到猜对为止循环控制语句的应用举例68【猜数游戏】先由计算机“想”一个1~100之间的数请人猜69猜一次分支语句开始调用随机函数生成一个数magicguess>magic?结束N输入人猜的数guess提示“错误!太大”guess<magic?提示“错误!太小”YNY提示“正确”69猜一次分支语句开始调用随机函数生成一个数magicgue70#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){intmagic,guess;
srand(time(NULL)); magic=rand()%100+1;printf("Pleaseguessamagicnumber:");scanf("%d",&guess);
if(guess>magic) printf("Wrong!Toohigh!\n");
elseif(guess<magic)printf("Wrong!Toolow!\n");
else
printf("Right!\n");
return0;}开始调用随机函数生成一个数magicguess>magic?结束N输入人猜的数guess提示“错误!太大”guess<magic?提示“错误!太小”YNY提示“正确”70#include<stdio.h>开始调用随机函数生成71计数器count初始化为0count+1->countguess≠magic?YN打印人猜数的次数count直到猜对为止开始调用随机函数生成一个数magicguess>magic?结束N输入人猜的数guess提示“错误!太大”guess<magic?提示“错误!太小”YNY提示“正确”【程序】先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏;否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。计算机记录人猜的次数。71计数器count初始化为0count+1->countg72计数器count初始化为0count+1->countguess≠magic?YN打印人猜数的次数count开始调用随机函数生成一个数magicguess>magic?结束N输入人猜的数guess提示“错误!太大”guess<magic?提示“错误!太小”YNY提示“正确”#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){intmagic,guess,count;
srand(time(NULL)); magic=rand()%100+1;
count=0;
do{printf("Pleaseguessamagicnumber:");scanf("%d",&guess);count++;
if(guess>magic) printf("Wrong!Toohigh!\n");
elseif(guess<magic)printf("Wrong!Toolow!\n");
elseprintf("Right!\n");
}while(guess!=magic);
printf("counter=%d\n",count);return0;}72计数器count初始化为0count+1->countg73【思考】如果猜数的范围是100~500,程序应如何修改?srand(time(NULL)); magic=rand()%401+100;【思考】先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏;否则计算机给出提示,告诉人所猜的数是太大还是太小,直到猜10次为止。循环条件:(guess!=magic)&&(count<=10)73【思考】如果猜数的范围是100~500,程序应如何修改?4.4.3for语句for(表达式1;表达式2;表达式3) {
循环体语句}
74若有多条语句for语句最简单的应用形式如下:for(循环变量赋初值;循环条件;循环变量增值)
循环体语句表达式1表达式2假真表达式3循环体语句循环4.4.3for语句for(表达式1;表达式2;表75for(表达式1;表达式2;表达式3){
循环体语句}表达式1;while(表达式2) {
循环体语句
表达式3;}for语句与while语句等价于75for(表达式1;表达式2;表达式3)表达式1;76【程序4-12】求1到100之间所有数之和。inti=1;while(i<=100){sum=sum+i;i++;}for(i=1;i<=100;i++)sum=sum+i;循环次数事先已知的问题用for语句编写。循环次数事先未知的问题用while语句和do…while语句编写。76【程序4-12】求1到100之间所有数之和。inti77【程序4-17】利用公式
;求π的近似值,直到最后一项的绝对值小于10-5为止,要求统计总共累加了多少项。4.4.4三种循环控制语句的应用举例
doubleelement;/*每一项*/doublesum; /*求和的变量*/intsign; /*符号的取值*/intn; /*每一项分母的值*/elementsumsignn77【程序4-17】利用公式78doublesign=1.0,element,sum=0,pi;intn=1,count=0;
do{element=sign/n; /*求累加项的值*/sum+=element;/*将累加项累加到求和变量sum上*/count++; /*计数器变量count加1*/sign=-sign; /*求下一个累加项的分子*/n+=2; /*求下一个累加项的分母*/}while(fabs(element)>=1E-5); pi=sum*4;
printf("pi=%lf\ncount=%d\n",pi,count);循环条件循环体78doublesign=1.0,element,sum=79【程序4-18】求Fibonacci数列:1,1,2,3,5,8,……的前40个数。该数列的特点是:F1=1 (n=1)F2=1 (n=2)Fn=Fn-1+Fn-2 (n≥3)4.4.4三种循环控制语句的应用举例【分析】112358……f1f2f1=f1+f2
f2=f2+f1
f1f2f1f2
f1=f1+f2
f2=f2+f1
79【程序4-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位工勤技能-辽宁-辽宁垃圾清扫与处理工二级(技师)历年参考题库含答案详解
- 2026事业单位工勤技能-贵州-贵州铸造工三级(高级工)历年参考题库含答案详解
- 2026事业单位工勤技能-贵州-贵州林木种苗工五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-贵州-贵州动物检疫员五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-福建-福建舞台技术工一级(高级技师)历年参考题库含答案详解
- 2026事业单位工勤技能-福建-福建护理员三级(高级工)历年参考题库含答案详解
- 2026事业单位工勤技能-福建-福建保健按摩师五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-甘肃-甘肃水生产处理工四级(中级工)历年参考题库含答案详解
- 2026事业单位工勤技能-甘肃-甘肃垃圾清扫与处理工二级(技师)历年参考题库含答案详解
- CN119495284A 一种书籍朗读方法、装置、设备、介质及产品 (上海极豆科技有限公司)
- 派出所档案管理办法
- 偏瘫患者护理常规
- 大厦改造提升方案(3篇)
- 人民监督培训课件
- 儿科系列常见病中药临床试验设计与评价技术指南急性支气管炎
- 嘉兴市天和制药有限公司年产3200万支预充式导管冲洗器及1万袋0.9%氯化钠注射液项目环评报告
- 藏族酥油茶简介及茶文化
- 加气站进入受限空间作业安全管理办法
- 标杆地产五星级酒店精装修标准
- YY/T 0853-2024医用静脉曲张压力袜
- GB/T 17879-2023齿轮磨削后表面回火的化学浸蚀检验
评论
0/150
提交评论