北京工业大学C语言课件3-循环结构_第1页
北京工业大学C语言课件3-循环结构_第2页
北京工业大学C语言课件3-循环结构_第3页
北京工业大学C语言课件3-循环结构_第4页
北京工业大学C语言课件3-循环结构_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计第2章循环结构2.1求解100以内所有偶数的和(for语句)2.2求解n!(for语句、while语句)2.3求解两个数的最大公约数(while语句)2.4用格里高利公式求π的近似值(do-while语句)2.5统计一个整数的位数(do-while语句)2.6判断素数(break和continue语句)2.7求1!+2!+….+100!(嵌套循环)2.8说谎族和诚实族(综合案例)本章要点使用for、while和do-while语句实现循环结构?while和do-while语句有什么不同?如何使用break语句处理多循环条件?如何实现多重循环?2.1求偶数和求解100以内所有偶数的和。sum=2+4+6+…2.1.1问题分析2.1.2for语句2.1.1问题分析

求在一定范围内(1~100)、满足一定条件(偶数)的若干整数的和,求累加和。思路:设置一个变量(sum),其初值为0,然后在1~100的数中(i)寻找偶数,将它们一个一个累加到sum中。一步累加:sum=sum+i;重复累加,用循环语句实现,在循环过程中:(1)判别i是不是偶数:用分支控制语句来实现。(2)对循环次数进行控制:通过i值的变化sum=0i=1i<=100i是偶数?sum=sum+ii=i+1输出sum真真假假#include<stdio.h>intmain(void){ inti,sum=0;

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

if(i%2==0)sum=sum+i;printf(“%d\n",sum);return0;}

程序实现for(表达式1;表达式2;表达式3)

循环体语句实现C语句的重复执行2.1.2for语句3个表达式、循环体语句!书写顺序和执行顺序不同!表达式1只执行一次循环(控制)变量:for语句中,通过改变或判断某个变量的值来控制循环的执行for(i=1;i<=100;i++)

{if(i%2==0)sum=sum+i;}for语句中的循环变量赋初值判断其值改变其值for(i

=1;

i

<=100;

i

++){if(i%2==0)sum=sum+i;}表达式1:给循环变量赋初值,指定循环的起点。i=1表达式2:给出循环的条件,判断循环是否达到终点?

i<=100表达式3:设置循环的步长,改变循环变量的值,从而可改变表达式2的真假性。i++循环体语句:被反复执行的语句,一条语句。for语句的说明课堂练习一1.求200以内奇数的累加和;求200以内奇数的累加和#include<stdio.h>intmain(void){ inti,sum=0;

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

if(i%2!=0)sum=sum+i;printf(“%d\n",sum);return0;}

2.2求解n!n!=1×2×3×4×…×n2.2.1问题分析2.2.2for语句、while语句2.2.1问题分析

求在一定范围内(1~n)、若干整数的乘积,求累乘。思路:设置一个变量(fact),其初值为1,然后在1~n的数中依次将它们累乘到fact中。乘积操作:fact=fact*i;重复累乘,用循环语句实现,在循环过程中通过i值的变化对循环次数进行控制;分别使用for语句和while语句实现循环结构;求解n!#include<stdio.h>main(){inti,n,fact;printf("inputn:");scanf("%d",&n);fact=1;for(i=1;i<=n;i++)fact=fact*i;printf(“%d!=%d\n",n,fact);return0;

}课堂练习二键盘输入5个整数,统计其中能被3整除的数的个数。统计能被3整除的数的个数#include<stdio.h>intmain(void){ inti,number,count=0;

for(i=1;i<=5;i++){scanf(“%d”,&number);if(number%3==0)count=count+1;

}printf(“%d\n",count);return0;}

求1+2+3+……+n#include<stdio.h>intmain(void){inti,sum;printf(“Entern:");scanf("%d",&n);sum=0;for(i=1;i<=n;i++)

sum=sum+i;printf(“sum=%d”,sum);return0;}求1+1/2+1/3+……+1/n#include<stdio.h>intmain(void){inti;doublesum;

printf(“Entern:");scanf("%d",&n);sum=0;for(i=1;i<=n;i++)

sum=sum+1.0/i;printf(“sum=%f”,sum);return0;}求前n项和,即循环n次,每次累加1项。for(i=1;i<=n;i++)sum=sum+item

(第i项)

item=1.0/(2*i-1)求1+1/3+1/5+…的前n项和#include<stdio.h>intmain(void){inti,n; doubleitem,sum;printf(“Entern:"); scanf("%d",&n); sum=0; for(i=1;i<=n;i++){ item=1.0/(2*i-1);/*计算第i项的值*/ sum=sum+item;/*累加第i项的值*/ } printf("sum=%f\n",sum);return0;}源程序求1+1/3+1/5+…求前n项和,即循环n次,每次累加1项。for(i=1;i<=n;i++)sum=sum+item

(第i项)item=flag*1.0/denominatordenominator=denominator+2flag=-flag求1-1/3+1/5-…的前n项和item=flag*1.0/(2*i-1)flag=-flag#include<stdio.h>intmain(void){intdenominator,flag,i,n;doubleitem,sum;printf(“Entern:");scanf("%d",&n); flag=1;denominator=1; sum=0;for(i=1;i<=n;i++){

item=flag*1.0/denominator;/*计算第i项的值*/ sum=sum+item;/*累加第i项的值*/flag=-flag;/*准备下一次循环*/denominator=denominator+2;

} printf("sum=%f\n",sum);return0;}编写程序,输入一个正整数n,计算1-2/3+3/5-4/7+5/9-6/11+...的前n项之和。输入10个字符,统计其中英文字母、数字字符和其他字符的个数。课堂练习三#include<stdio.h>intmain(void){intdigit,i,letter,other;

charch;

digit=letter=other=0;printf(“Enter10characters:");

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

ch=getchar();/*从键盘输入一个字符,赋值给变量ch*/

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

letter++;

elseif(ch>='0'&&ch<='9')/*如果ch是数字字符*/

digit++;

else

other++;}printf("letter=%d,digit=%d,other=%d\n",letter,digit,other);return0;}统计其中英文字母、数字字符和其他字符的个数#include<stdio.h>main(){inti,n,fact;printf("inputn:");scanf("%d",&n);fact=1;for(i=1;i<=n;i++)fact=fact*i;printf(“%d!=%d\n",n,fact);return0;

}#include<stdio.h>main(){inti,n,fact;printf("inputn:");scanf("%d",&n);fact=1;i=1;while(i<=n){fact=fact*i;i++;}printf(“%d!=%d\n",n,fact);return0;

}for语句实现while语句实现While语句--求解n!2.2.2while语句while(条件)

循环体语句;真假while下一条语句表达式循环体语句循环条件循环体一条语句while语句和for语句都是在循环前先判断条件while语句说明表达式1;while(表达式2){

for的循环体语句;

表达式3;}把for语句改写成while语句for(表达式1;表达式2;表达式3)

循环体语句while和for的比较for(i=1;i<=n;i++)

sum=sum+i;i=1;

循环变量赋初值while(i<=n)循环条件

{

sum=sum+i;

i++;循环变量的改变

}循环体课堂练习四输入一个正整数n,再输入n个学生的成绩,计算平均分,并统计不及格学生的人数。计算平均分,并统计不及格学生的人数#include<stdio.h>intmain(void){inti,n;

doublegrade,total;

num=0;total=0; scanf("%d",&n);i=1;while(i<=n){scanf(“%lf”,&grade);

total=total+grade;

if(grade<60)count++;i++; }

if(n!=0){printf(“Gradeaverageis%.2f\n",total/n);printf("Numberoffailuresis%d\n",count);} elseprintf("Gradeaverageis0\n");return0;}思考:如果学生个数n事先不确定,当输入的成绩小于等于0时,表示输入结束,如何改?2.3求解最大公约数输入两个整数,求解这两个数的最大公约数。最大公约数:是能够同时整除这两个整数的最大的正整数。2.3.1问题分析2.3.1问题分析

采取辗转相除法求两个数的最大公约数,辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数。思路:将num1和num2赋值给变量a和b。判断条件b!=0是否满足,如果满足,重复执行操作:temp=a%b,a=b,b=temp。如果不满足,即b=0,则输出a的值,即为num1和num2的最大公约数;#include<stdio.h>main(){intnum1,num2;inta,b,temp;printf("Inputnum1&num2:");scanf("%d%d",&num1,&num2);a=num1;b=num2;while(b!=0){temp=a%b;a=b;b=temp;}if(num1!=0&&num2!=0)printf("%d\n",a);}2.4用格里高利公式求π的近似值使用格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10–4。2.4.1问题分析2.4.2do-while语句2.4.1问题分析

这是一个数列求和的问题,即求累加和。关键点1:数列的通项如何表示?item=flag*1.0/i;flag=-flag;i=i+2;关键点2:循环继续的条件?精确到最后一项的绝对值小于10–4

,循环次数不确定#include<stdio.h>#include<math.h>main(){doubleitem,sum,pi;intflag,i;i=1;flag=1;sum=0;do{item=flag*1.0/i;sum=sum+item;flag=-flag;i=i+2;}while(fabs(item)>=0.0001);pi=sum*4;printf("pi=%lf\n",pi);}2.4.2do-while语句do{

循环体语句}

while(表达式)先循环后判断真假表达式循环体语句do-while的下一条语句while是先判别条件,再决定是否循环;do-while是先至少循环一次,然后再根据循环的结果决定是否继续循环。while和do-while的比较真假表达式循环体语句do-while的下一条语句真假while的下一条语句表达式循环体语句循环结构程序设计循环程序的实现要点:归纳出哪些操作需要反复执行?

循环体这些操作在什么情况下重复执行?循环条件选用合适的循环语句forwhiledo-while循环具体实现时考虑(循环条件):事先给定循环次数,首选for通过其他条件控制循环,考虑while或do-while课堂练习五2.输入一批正整数(以零或负数做结束标记),求其中偶数的累加和。1.2.5统计一个整数的位数从键盘读入一个整数,统计该数的位数。2.5.1问题分析2.5.2do-while语句intmain(void){intcount,number;count=0;printf("Enteranumber:");scanf("%d",&number);if(number<0)number=-number;do{

number=number/10;

count++; }while(number!=0);printf("Itcontains%ddigits.\n",count);return0;}程序实现Enteranumber:12534Itcontains5digits.Enteranumber:-99Itcontains2digits.Enteranumber:0Itcontains1digits.while(number!=0){

number=number/10;

count++;}逆序输出将一个正整数逆序输出,例如键盘输入一个正整数12356,屏幕输出65321,逆序输出各个位数上的数字。逆序问题:将一个正整数逆序输出确定:循环条件和循环体(循环不变式)

123455432112345%10=512345/

10=

1234

1234%

10=4

1234

/

10=

123

123

%

10=3

123

/

10=

12

12

%

10=2

12

/

10=

1

1

%

10

=

1

1

/

10

=

0结束循环不变式x%10x=x/10循环结束条件x==0scanf(“%d”,&x);while(x!=0){digit=x%10;x=x/10;printf("%d",digit);}用do-while实现?2.6判断素数输入一个正整数m,判断它是否为素数。2.6.1问题分析2.6.2break语句和continue语句2.6.1问题分析算法:除了1和m,不能被其它数整除。设i取值[2,m-1]如果m不能被该区间上的任何一个数整除,即对每个i,m%i都不为0,则m是素数只要找到一个i,使m%i为0,则m肯定不是素数m%2%3%4%5%(m-1)不是素数||=0=0是素数&&!=0!=0m不可能被大于m/2的数整除

i取值[2,m-1]、[2,m/2]、[2,]for(i=2;i<=m/2;i++)

if(m%i==0)break;/*如果m能被某个i整数,则m不是素数,提前结束循环*/if(i>m/2)printf(“yes\n”)/*如果循环正常退出,说明m不能被任何一个i整除,则m是素数*/elseprintf("no\n”);intmain(void){inti,m; printf(“Enteranumber:");

scanf("%d",&m); for(i=2;i<=m/2;i++)

if(m%i==0)break;

if(i>m/2&&m!=1)

printf("%disaprimenumber!",m); elseprintf("No!\n"); }Enteranumber:9NoEnteranumber:1111isaprimenumber!for(i=2;i<=m/2;i++)

if(m%i==0)printf("No!\n");elseprintf("%disaprimenumber!\n",m);循环条件?循环的结束条件?2.6.2break语句while(exp){

语句1

if(expb)break;

语句2}真假

exp语句1假

expb

语句2循环体真for(i=2;i<=m/2;i++)

if(m%i==0)break;if(i>m/2)

printf("Yes");elseprintf("No!\n");当循环有多个出口时:表示循环条件区分结束条件continue语句while(exp){语句1

if(expb)continue;

语句2}真假

exp语句1假expb

语句2循环体真跳过continue后面的语句,继续下一次循环break和continue#include"stdio.h"intmain(void){charc;inti;for(i=0;i<10;i++){c=getchar();if(c=='\n')break;putchar(c);}}abc↙efgh↙123↙abcabcefgh1continue;break和continue以下程序段输出100~200之间所有能被3整除的数。for(i=100;i<=200;i++){ if(i%3!=0) continue; printf(“%d”,i);}for(i=100;i<=200;i++)if(i%3==0)printf(“%d”,i);课堂练习五求100以内的全部素数,每行输出10个。求100以内的全部素数,每行输出10个for(m=2;m<=100;m++)if(m是素数)printf("%d",m);n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0)break;if(i>n)printf("yes\n")elseprintf("no\n”);for(m=2;m<=100;m++){n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0)break;if(i>n)printf("%d",m)}#include<stdio.h>#include<math.h>intmain(void){intcount,i,m,n;count=0;

for(m=2;m<=100;m++){n=sqrt(m);

for(i=2;i<=n;i++)

if(m%i==0)break;if(i>n){ /*如果m是素数*/

printf("%6d",m);count++;/*每行10个的处理*/

if(count%10==0)printf(“\n”);}}}

23571113171923293137414347535961677173798389972.7求1!+2!+….+100!for(i=1;i<=100;i++){

item=i!sum=sum+item;}2.7.1嵌套循环用循环计算i的阶乘2.7.1嵌套循环for(i=1;i<=100;i++){

item=i!sum=sum+item;}for(i=1;i<=100;i++){

item=1;

for(j=1;j<=i;j++) item=item*j;sum=sum+item;}#include<stdio.h>intmain(void){ inti,j; doubleitem,sum;

sum=0;

for(i=1;i<=100;i++){item=1;

for(j=1;j<=i;j++) item=item*j; sum=sum+item; }

printf("1!+2!+3!+…+100!=%e\n",sum);}分析嵌套循环的执行过程for(i=1;i<=100;i++){

item=1;

for(j=1;j<=i;j++) item=item*j;sum=sum+item;}外层循环变量i的每个值内层循环变量j

变化一个轮次;内外层循环变量不能相同分别用i

和jfor(i=1;i<=100;i++)for(j=1;j<=i;j++) printf("%d%d\n",i,j);2.8诚实族和说谎族诚实族和说谎族是来自两个荒岛的不同民族,诚实族的人永远说真话,而说谎族的人永远说假话。

有一天小明遇到来自这两个民族的三个人,为了调查这三个人都是什么族的,小明问了他们一个问题,以下是他们的对话:问:“你们是什么族?”,第一个人答:“我们之中有两个来自诚实族。”第二个人说:“不要胡说,我们三个人中只有一个是诚实族的。”第三个人听了第二个人的话后说:“对,就是只有一个诚实族的。”请根据他们的回答判断他们分别是哪个族的1.问题分析

三个人分别是诚实族还是说谎族?2.解题思路

枚举法:将三个人可能出现的组合枚举一遍,找出满足条件的解。

解题思路定义变量a,b,c分别表示3个人;确定每个人的取值范围:0或1(1代表诚实族,0代表说谎族);对三个人的所有组合方式进行遍历,找出满足条件的解;三重嵌套循环,遍历a,b,c的所有组合for(a=0;a<=1;a++)for(b=0;b<=1;b++)for(c=0;c<=1;c++)循环体:检查是否满足条件(a&&a+b+c==2||!a&&a+b+c!=2)&&(b&&a+b+c==1||!b&&a+b+c!=1)&&(c&&a+b+c==1||!c&&a+b+c!=1)#include<stdio.h>main(){inta,b,c;for(a=0;a<=1;a++)/*穷举各种可能性*/for(b=0;b<=1;b++)for(c=0;c<=1;c++)if((a&&a+b+c==2||!a&&a+b+c!=2)&&(b&&a+b+c==1||!b&&a+b+c!=1)&&(c&&a+b+c==1||!c&&a+b+c!=1)){printf("Aisa%s.\n",a?"honest":"liar");printf("Bisa%s.\n",b?"honest":"liar");printf("Cisa%s.\n",c?"honest":"liar");}}课堂练习六输入一批学生成绩,求最高分和平均分(当输入的成绩为负数时,输入结束)。某地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬一块。问用45人正好搬45块砖,有多少种搬法?输入一批学生成绩,求最高分和平均分#include<stdio.h>intmain(void){intmark,max;printf(“Entermarks:");scanf("%d",&mark);/*读入第一个成绩*/

max=mark;

温馨提示

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

评论

0/150

提交评论