程序设计基础-课件_第1页
程序设计基础-课件_第2页
程序设计基础-课件_第3页
程序设计基础-课件_第4页
程序设计基础-课件_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

程序设计基础A第4章基本控制结构

马新娟

2011.10

程序对数据的处理流程:程序的主要功能就是对数据的处理,其整个流程主要包括数据的输入、数据的处理、数据的输出。数据处理数据输入数据输出C程序中如何实现数据输入?C程序中如何实现数据输出?本章知识点4.1顺序结构4.2选择结构4.3循环结构4.4C语言控制结构应用举例C语言提供了支持重复执行某一段程序的循环控制语句。主要有以下方式:(1)while语句;(2)do...while语句;(3)for语句;4.3循环结构发现重复性动作到写好一个循环结构通常包括:循环中涉及哪些变量?循环开始前应该赋给它们什么初值?循环体中应该如何修改它们?在什么情况下应该继续(或应该终止)循环?循环终止后如何得到所需要的结果

4.3.1while循环while语句的一般形式:while(表达式)

语句while语句的执行过程:只要表达式的值为非0,就重复执行语句,直到表达式值为0时止4.3循环结构4.3.2do-while循环特点是先执行循环体一次,然后根据循环中“表达式”的值判断循环条件是否成立。一般形式为:do

循环体while(表达式);执行过程:

先执行一次指定的循环体语句,再计算“表达式”的值,当表达式的值为非0时,继续执行循环体语句,直到“表达式”的值等于0时循环结束。语句会被至少执行一次。4.3循环结构4.3.2do-while循环do-whie语句和while语句的区别在于:do-while是先执行循环体后判断,因此do-while至少要执行一次循环体;而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。while语句和do-while语句一般可以相互替用。

4.3循环结构4.3.2do-while循环例4.19计算正整数n的各位上的数字的乘积。分析:

对于一个正整数n,n%10可以求出n的个位数字,n/10%10可以得到n的十位数字,n/100%10可以得到n的百位数字,依次类推,可以使用一个循环得到正整数n的各位数字。

4.3循环结构#include"stdio.h"voidmain(){longn,k=1;printf("Pleaseenteranumber:");scanf("%ld",&n);do{k=k*(n%10);/*n%10求出n上各位的数字,k用来求出数字之积*/n=n/10;}while(n);printf("\n%ld\n",k);}4.3循环结构条件PA当型循环直到型循环真假假条件PA假真假条件P条件PA假当循环条件第一次就为假时4.3.3for循环for语句的一般形式为:for(表达式1;表达式2;表达式3)语句for语句执行过程如下:(1)首先求解表达式1。表达式1一般用于给循环初始变量赋值。(2)求解表达式2,若其值为非0,则执行for语句中指定的循环体语句,然后执行下面的第(3)步,若为0(“假”),则结束循环,转到第(5步)。表达式2一般用于条件判断,并决定循环是否结束。(3)求解表达式3。表达式3一般用于改变控制循环的循环变量的值,使得循环趋向结束。(4)返回第(2)步执行下一次循环。(5)循环结束,执行for语句下面的一个语句。

4.3循环结构4.3.3for循环例4.20利用for语句求1+2+3+…+100的值。#include"stdio.h"voidmain(){inti,sum;for(i=1,sum=0;i<=100;i=i+1)sum+=i;printf("sum=%d",sum);}

4.3循环结构4.3.3for循环for语句的一般形式,可以表示成while语句的形式:表达式1;while(表达式2){

语句表达式3;}3种循环形式可以互换

4.3循环结构4.3.3for循环例4.21斐波那契(Fibonacci数列)问题。该数列前2个数据项为1。从第3项开始,每项都是该项的前两项之和,输出该数列的前20项,每行5个数据项。分析:斐波那契数列:1,1,2,3,5,8,13,…。变量f1和f2表示数列的前两项,变量f3表示前两项的和。

用递推法解:设用f1,f2,f3表示相邻的三个裴波那契数据项,据题意递推的初始条件为:f1=f2=1;递推的公式为:f3=f1+f2。

为了反复使用迭代公式,可以在每一个数据项求出后将f1、f2和f3顺次向后移动一个数据项,即将f2的值赋给fl,f3的值赋给f2,从而构成如下的迭代语句序列:f3=f1+f2;f1=f2;f2=f3;

反复使用该语句序列就能够求出所要求的斐波那契数列。

4.3循环结构4.3.3for循环例4.21Fibonacci数列,输出该数列前20项,每行5个数据项。#include<stdio.h>voidmain(){intf1=1,f2=1,f3;inti;printf("\n%-10d%-10d",f1,f2);for(i=3;i<=20;i++){f3=f1+f2;printf("%-10d",f3);

if(i%5==0)printf("\n");f1=f2;f2=f3;}}

4.3循环结构国王的许诺。相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8×8共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第一个格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上的64个格子,我就感恩不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。国王能兑现他的许诺吗?试编程计算舍罕王共要多少麦子赏赐他的宰相,这些麦子合多少立方米?(已知1立方米麦子约1.42e8粒)总粒数为:sum=1+2+22+23+…+263

补充例题:#defineCONST1.42e8/*定义符号常量CONST值为1.42e8*/#include<stdio.h>main(){intn;

doubleterm=1,sum=1;/*累乘求积、累加求和变量赋初值*/

for(n=2;n<=64;n++){term=term*2;/*根据后项总是前项的2倍计算累加项*/sum=sum+term;/*作累加运算*/}

printf("sum=%e\n",sum);/*打印总麦粒数*/

printf("volum=%e\n",sum/CONST);/*打印折合的总麦粒体积数*/}

for循环控制结构的灵活运用,常见的几种省略形式:(1)省略for控制结构中的表达式1:for(;表达式2;表达式3)

循环体i=1;sum=0;for(;i<=100;i++)sum+=i;(2)省略for控制结构中的表达式2for(表达式1;;表达式3)循环体则形成死循环,等价于:

for(表达式1;1;表达式3)

循环体4.3循环结构for循环控制结构的灵活运用,常见的几种省略形式:(3)省略for控制结构中的表达式3:for(表达式1;表达式2;)

循环体for(i=1,sum=0;i<=100;){sum+=i;i++;}(4)省略for控制结构中的所有表达式:for(;;)构成了典型的for语句表示的死循环结构4.3循环结构for循环的灵活运用示例例4.23在一行输出10个”*”。代码(1):#include<stdio.h>voidmain(){ inti;for(i=0;i<10;i++) printf("*"); printf("\n");}代码(2):#include<stdio.h>voidmain(){

inti=0;for(;i<10;i++) printf("*"); printf("\n");}4.3循环结构例4.23在一行输出10个”*”。代码(3):#include<stdio.h>voidmain(){ inti;for(i=0;i<10;) { printf("*");

i++; } printf("\n");}代码(4):#include<stdio.h>voidmain(){ inti=0;for(;i<10;) { printf("*");

i++; } printf("\n");}4.3循环结构例4.23在一行输出10个”*”。代码(5):#include<stdio.h>voidmain(){ inti;for(i=0;i<10;printf("*"),i++)

; printf("\n");}4.3循环结构4.3.4循环嵌套

在一个循环结构的循环体内又包含另外一个完整的循环结构,称为循环的嵌套。内嵌的循环还可以再嵌套循环,这就是多重循环,其中最常用的循环嵌套还是两重循环。外层的循环称为外循环,被嵌套的循环称为内循环。1.嵌套循环执行的过程是:

每进入一次外层循环,内层循环要按照赋初值、判断循环条件、执行内层循环体这三个过程进行,直到内层循环条件不成立;接下来顺序地执行外层循环体中、内层循环后的其他运算,外层循环体执行结束后返回外层循环条件判断,依此类推,直至外层循环条件为假。4.3循环结构注意在for和while语句之后一般没有分号有分号表示循环体就是分号之前的内容(空循环体)while(i<100);

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

printf("%d",i);for通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量4.3.4循环嵌套

2.循环嵌套应注意以下几个问题:(1)内、外层循环的循环控制变量不能同名。(2)内循环应完全置于外循环内,内、外循环不得交叉。(3)循环嵌套中,内、外层循环的执行次数是很重要的。(4)循环嵌套的层数没有限制,但通常使用二重或三重循环。3.常见的循环嵌套类型三种循环形式互相嵌套4.3循环结构合法的嵌套循环4.3.4循环嵌套

4.循环嵌套设计举例循环嵌套在程序设计,特别是比较复杂问题的程序设计中有非常广泛的应用。如果确定用二重循环解决问题,在设计中首先要做好如下几个细节:明确外循环要实现的目标,搞清楚外循环的循环次数;明确内循环要实现的目标,搞清楚内循环的循环次数;建立内外循环之间的联系,一般而言,内循环的循环次数都是与外循环变量有关的,要找到内循环变量与外循环变量的关系。4.3循环结构4.循环嵌套设计举例例4.24输入打印行数n,按照图形如下的规律打印出n行图形:***************

分析:这是一个n行图形的打印问题,可以用循环来控制输出的行数。由于每行的输出图形是不同的,可以用一个嵌套的内循环来控制一行图形中“*”的输出个数。通过观察可以发现不同行图形中“*”的输出个数之间是有规律的,这个规律即:“*”的输出个数与所在的行数存在关系,由此可以得到内循环控制范围与外循环变量值之间的关系。4.3循环结构#include<stdio.h>voidmain(){inti,j,n;scanf(“%d”,&n);//输入行数

for(i=1;i<=n;i++)//外循环控制输出行数,每次输出一行

{ for(j=1;j<=i;j++)//内循环控制每行输出的“*”个数

printf("*");printf("\n");//输出1行后的换行

}}4.3循环结构***************分析:仍然是一个用两重循环来解决的问题

本问题的外循环的循环体应包含三部分内容:①内循环1:输出若干空格以确定起始位置;②内循环2:从起始位置完成一行“*”的输出;③换行操作;4.3循环结构#include<stdio.h>voidmain(){inti,j,k,n;scanf(“%d”,&n);//输入行数

//外循环控制输出行数,每次输出一行

for(i=1;i<=n;i++){

for(k=1;k<=n-i;k++)//内循环1:找起始输出位置

printf(““); for(j=1;j<=i;j++)//内循环2:控制每行输出的“*”个数

printf("*");

printf("\n");//输出1行后的换行

}}4.3循环结构例4.25求100~200间的全部素数,按每行5个输出。

分析:判断一个数是否素数在前面刚刚介绍过,用一个单循环可以实现。本例是判断多个数是否素数,可以借助前面的方法,加一层外循环依次取得每一个数,在内循环中来实现每个数的判别。同时要设置一个计数变量,来统计获得的素数数目。当判断出一个素数时该变量计数加一,输出素数时通过计数变量做一下判断,如果素数的个数是5的倍数,需要换行。4.3循环结构例4.25求100~200间的全部素数,按每行5个输出。

#include<stdio.h>#include<math.h>voidmain(){intm,k,i,count=0;//计数变量赋初值

for(m=101;m<=200;m=m+2){k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i>=k+1){printf("%d",m);

count++;//输出新素数并计数加一}if(count%5==0)printf("\n");//限定每行输出5个素数}printf("\n");}4.3循环结构4.3.5break和continue

循环结束有2种方式:(1)正常结束循环:通常都是以某个表达式的结果值作为判断条件,当其值为假(0值)时结束循环。(2)非正常结束循环:

C语言提供了4种转移语句,可在循环体内随时对循环进行各种检测,一旦发现某种特殊的情况,则跳出循环,非正常的结束循环。这四种转移语句为:break、continue、goto和return语句。return语句用于函数的返回,将在函数中介绍。4.3循环结构4.3.5break和continue1.break语句break语句又称中断语句,其一般形式为:break;功能:强制中断当前的循环结构或switch结构,直接结束循环或switch结构。2.continue语句continue语句的一般形式为:continue;功能:结束本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断和执行。

4.3循环结构4.3循环结构1.break语句2.continue语句例4.26break和continue的比较

代码a:

代码b:#include<stdio.h>voidmain(){inti;for(i=1;i<=10;i++){if(i%4==0)break; printf("i=%d\n",i);}}4.3循环结构#include<stdio.h>voidmain(){inti;for(i=1;i<=10;i++){if(i%4==0)continue;printf("i=%d\n",i);}}选择三种循环的一般原则如果循环次数已知,用for如果循环次数未知,用while如果循环体至少要执行一次,用do-while4.4.1程序举例

例4.27由键盘任意输入一串字符,分别统计其中的大写字母、小写字母、数字、其他字符的个数

.分析:程序定义4个整型变量,用于统计4种字符的数量,当然在程序还没有进行统计之前,应将它们初始化为0,再定义1个字符变量用于接收键盘输入的字符,利用循环输入一串字符,每输入一个字符,利用if结构对输入的字符进行判断和统计,直到输入回车时为止。4.4C语言控制结构应用举例#include<stdio.h>voidmain(){ charc; intdigcount=0; intuppcount=0; intlowcount=0; intothercount=0; printf("\ninput:\n");

4.4C语言控制结构应用举例 while((c=getchar())!='\n') { if(c>='0'&&c<='9') digcount++; elseif(c>='A'&&c<='Z') uppcount++; elseif (c>='a'&&c<='z') lowcount++; else othercount++; } printf("\nDigitcharacteris%d\n",digcount); printf("\nUpperis%d.\n",uppcount); printf("\nLoweris%d.\n",lowcount); printf("\nOthercharacteris%d.\n",othercount);}4.4C语言控制结构应用举例4.4.1程序举例

例4.28编写一个人口统计程序。1990年世界人口约为50亿,按年增长率1%计算,哪一年开始世界人口将突破100亿大关?

分析:设p0=50亿(1990年世界人口基数),当人口数p=p*(1+1%)n>2*p0时,n为人口超过100亿所需要的年数,该年份为1990+n。4.4C语言控制结构应用举例例4.28#include<stdio.h>voidmain(){intyear=1990; floatrate=0.01,p0=5E+9,p; p=p0;do {p=p*(1+rate); ++year; }while(p<p0*2);printf("\nyear=%5d,doublerpopulationis:%f\n",year,p);}4.4C语言控制结构应用举例4.4.1程序举例

例4.29编写程序,从键盘输入6名学生的5门成绩,分别统计出每个学生的平均成绩。

分析:

每个学生都有5门课程,即可借助双层嵌套循环实现,该题给出了学生成绩管理系统的一部分功能。4.4C语言控制结构应用举例#include<stdio.h>voidmain(){inti,j;floatscore,sum,ave;for(i=0;i<6;i++){ sum=0; printf("Pleaseinput5scoresofstudentNo.%d\n",i+1); for(j=0;j<5;j++) { scanf("%f",&score); sum+=score; } ave=sum/5;printf("No.%dave=%5.2f.\n",i+1,ave);}}4.4C语言控制结构应用举例例4.30

4.4C语言控制结构应用举例分析:(1)确定问题的实质。根据上述公式求pi的值,即把等号右边的各项相加后再乘以4,所以首先判断此题是一个利用循环累加求和的问题,设累加器为pi。

(2)确定循环体。规律:①各项的分子都是1(恒定不变),分母以2递增(变化),首项的分母是1;②在要累加的各项中,符号由正号开始,正负交替。1)因为分子不变,所以用常量1即可表示;分母是变化的,所以用一个变量n保存,每循环一次,n加2。2)因为各项的符号正负交替变化,所以设一个用于控制符号的变量sign,sign的初值为1(代表正号),用sign←-sign操作改变符号。每一项的取值可表示为sign/n。(3)循环的条件。

这个问题是一个不定数循环。根据题的要求,当某一项的绝对值小于10-6后停止累加,所以应该将每项的取值存储在一个变量中,设为item。item作循环控制变量,循环的条件是|item|>=10-6

4.4C语言控制结构应用举例(4)循环前的初始化

初始化的对象包括循环条件中要参与比较的变量和循环体中会出现在等号右侧的变量,因此,pi、n、sign和item需要初始化。变量pi保存累加和,初值为0;n保存各项分母,初值为1;sign是符号位,初值为1(正);i­tem是循环控制变量,初值为l。4.4C语言控制结构应用举例item=1,pi=0,n=1.0,sign=1

当|t|

1e-6pi=pi+itemn=n+2sign=-signitem=sign/npi=pi*4输出pi#include<stdio.h>#include<math.h>voidmain(){ intsign;floatn,item,pi; sign=1;pi=0;n=1.0;item=1;//初始化操作

while((fabs(item))>=1e-6){ pi=pi+item; n=n+2; sign=-sign; item=sign/n;}pi=pi*4;printf("pi=%10.6f\n",pi);}4.4C语言控制结构应用举例4.4.2枚举思想及程序实现枚举就是对多种可能的情形一-测试,从众多的可能中找出符合条件的(一个或一组)解,或者无解的结论。在一个集合内对集合中的每个元素进行一一测试的方法称为枚举法,也叫穷举法。穷举方法的实现主要依赖于以下两个基本要点:(1)枚举范围:搜寻可能值的范围如何确定。(2)特定条件:被搜寻可能值的判定方法。4.4C语言控制结构应用举例4.4.2枚举思想及程序实现例4.31编程找出所有的“水仙花数”。“水仙花数”是指一个3位数,其各位上数字的立方之和等于这个数本身。例如153=13+53十33,所以153是“水仙花数”。依题意可以得出:搜寻可能值的范围为100到999;判定方法为各位上数字的立方之和等于被判定数。程序可以依次取出区间[100,999]之间的每一个数,将该数分解为3个数字,按照判定条件判定即可。4.4C语言控制结构应用举例例4.31编程找出所有的“水仙花数”。程序一:#include<stdio.h>voidmain(){intn=100,m,k,j;while(n<=999){m=n/100;k=(n-m*100)/10;j=n%10;if(n==m*m*m+k*k*k+j*j*j)printf("%d",n);n++;}printf("是水仙花数.\n");}4.4C语言控制结构应用举例例4.31编程找出所有的“水仙花数”。上面求取“水仙花数”的方法可以称为分离数据,除此之外还可以使用组合数据的方法求取“水仙花数”。如果用a,b和C分别表示3位数的百位、十位和个位,则该3位数可以表示为:a*100+b*10+c,其中a的变化范围为[l,9],b和c的变化范围均为[0,9]。程序只需要依次用a、b和c组合出所有的3位数参加判断即可。4.4C语言控制结构应用举例例4.31编程找出所有的“水仙花数”。程序二:#include<stdio.h>voidmain(){intn=100,m,k,j;for(m=1;m<=9;m++) for(k=0;k<=9;k++) for(j=0;j<=9;j++) { n=m*100+k*10+j; if(n==m*m*m+k*k*k+j*j*j) printf("%d",n); }printf("是水仙花数.\n");}4.4C语言控制结构应用举例4.4.2枚举思想及程序实现例4.32搬砖问题:36块砖,36人搬,男搬4,女搬3,两个小孩抬1砖。要求一次将所有砖搬完,问需要男、女、小孩各多少?设男、女、小孩的数量分别为man、woman、child,依题意可以得出被搜寻值的判定方法,可以用下式表示:4*man+3*woman+0.5*child==36对于搜寻的范围,按照常识简单划分,man、woman、child都应该为整数,而且男人的数量小于9人(36/4),女人的数量应该少于12人(36/3),当男人数量和女人数量一定的情况下,小孩的数量可以用算式child=36-man-woman&&child%2=0来确定。因此可以确定搜寻范围如下:man:1~8woman:1~11child=36-man-woman&&child%2=04.4C语言控制结构应用举例4.4.2枚举思想及程序实现例4.32搬砖问题#include<stdio.h>voidmain(){intman,woman,child;for(man=1;man<9;man++) for(woman=0;woman<12;woman++) { child=36-man-woman; if(4*man+3*woman+child/2.0==36) printf("man=%d,woman=%d,child=%d\n",man,woman,child);}}4.4C语言控制结构应用举例4.4.3迭代思想及程序实现迭代就是一个不断地由变量的旧值按照一定的规律推出变量新值的过程,迭代亦称为递推。迭代一般与三个因素有关,它们是:初始值、迭代公式和迭代结束条件(迭代次数)。①迭代初值:即从什么初值开始。②迭代过程:即如何迭代,解决迭代的公式③迭代次数或条件:即到什么时候为止。4.4C语言控制结构应用举例4.4.3迭代思想及程序实现例如:人口的计算问题。己知今年人口13亿,设人口的年增长率为万分之三,问10年后人口为多少?容易看出该问题迭代的三要素:①迭代初值:t=13②送代过程:t=t*(1+0.0003)③迭代次数或条件:10次再如:求累加和1+2+3+…+n的问题。①法代初值:t=0;i=1;②迭代过程:t=t+i;i++;③迭代次数或条件:n次。4.4C语言控制结构应用举例4.4.3迭代思想及程序实现例4.33求若干个正数中最小的两个数。分析:(1)确定解决问题的框架求最小数可以利用打擂法,本题中除了求最小数之外,还要求次小数。很容易想到,应该在求最小数算法的基础上进行改进。(2)如何求次小数设最小数存储在变量min中,次小数存储在变量min_next中,输入的数为x。因为min_next只比min大,所以可以分两种情况:4.4C语言控制结构应用举例1)如果x比min小,那么在更新min前,先用它更新min_next,它们之间的迭代关系是先执行min_next←min,再执行min←x。2)如果x不比min小,却比min_next小,则只更新min_next。例如:min=10,min_next=20,输入了一个数为15,则min不变,min_next更新为15。也就是说,如果x没有比min小,则还要继续将x与min_next比较。(3)循环条件本题在若干正数中求解,属于不定数循环,利用存放输入数据的变量x控制循环,当x>0时进入循环。(4)循环前的初始化像打擂一样,打擂前擂台上必须有擂主才行,所以min和min_next在循环前都要初始化。为此,循环前输入两个数据,先进行比较,小的作为min的初值,大的作为min_next的初值。另外,循环控制变量x在循环前,也需要初始化。4.4C语言控制结构应用举例#include<stdio.h>voidmain(){intmin,min_next,x,y;printf("pleaseinputtwonumbers:");

scanf("%d%d",&x,&y);if(x<y)

{ min=x; min_next=y;}else

{ min=y; min_next=x;

}4.4C语言控制结构应用举例printf("pleaseinputonenumber:");scanf("%d",&x);while(x>0){ if(x<min) { min_next=min;/*用原最小数更新次小数*/ m

温馨提示

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

评论

0/150

提交评论