2022年大学计算机专业课程教学课件 第5章 循环结构程序设计_第1页
2022年大学计算机专业课程教学课件 第5章 循环结构程序设计_第2页
2022年大学计算机专业课程教学课件 第5章 循环结构程序设计_第3页
2022年大学计算机专业课程教学课件 第5章 循环结构程序设计_第4页
2022年大学计算机专业课程教学课件 第5章 循环结构程序设计_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

循环的概念解决的问题C语言中的几种循环的形式1、goto2、while(条件) {}3、do{}while(条件);4、for(表达式1;表达式2;表达式3) {}第5章循环结构程序设计前面例题中的问题a,b,c赋初值s=(a+b+c/2)S=开方(s*(s-a)*(s-b)*(s-c))输出面积S三角形面积1、分析已知:三条边求:面积量化1、分析已知:a,b,c求:S2、算法找:数学公式(P.83)变:变成程序的算法S1:得到三条边的长度S2:计算三边之和的一半(a+b+c)/2S3:计算机面积S=开方(s*(s-a)*(s-b)*(s-c))S4:输出面积S5:结束3、流程图4、程序#include"math.h"main(){doublea,b,c,s,S;printf("pleaseinputa,b,c:")scanf("%lf,%lf,%lf",&a,&b,&c)s=(a+b+c)/2;S=sqrt(s*(s-a)*(s-b)*(s-c));printf("Areais%lf",S);getch();}插入:如果不是三角形则S5a,b,c赋初值s=(a+b+c/2)S=开方(s*(s-a)*(s-b)*(s-c))输出面积Sa+b<c||b+c<a||c+a<byn4、程序#include"math.h"main(){doublea,b,c,s,S;printf("pleaseinputa,b,c:")scanf("%lf,%lf,%lf",&a,&b,&c);If(a+b<c||b+c<a||c+a<b) {printf(“Notatrigle!”); exit(0); }Else{

s=(a+b+c)/2;S=sqrt(s*(s-a)*(s-b)*(s-c));printf("Areais%lf",S);}getch();}输入三条边直到是三角形则为止a,b,c赋初值s=(a+b+c/2)S=开方(s*(s-a)*(s-b)*(s-c))输出面积S

直到a+b>c||b+c>a||c+a>bdo{printf("pleaseinputa,b,c:")scanf("%lf,%lf,%lf",&a,&b,&c);

If(a+b<c||b+c<a||c+a<b) printf(“Notatrigle!”);}while(a+b<c||b+c<a||c+a<b);

s=(a+b+c)/2;S=sqrt(s*(s-a)*(s-b)*(s-c));printf("Areais%lf",S);printf("pleaseinputa,b,c:")scanf("%lf,%lf,%lf",&a,&b,&c);while(a+b<c||b+c<a||c+a<b){printf(“Notatrigle!”);printf("pleaseinputa,b,c:")scanf("%lf,%lf,%lf",&a,&b,&c);}

s=(a+b+c)/2;S=sqrt(s*(s-a)*(s-b)*(s-c));printf("Areais%lf",S);printf("pleaseinputa,b,c:")scanf("%lf,%lf,%lf",&a,&b,&c);for(;a+b<c||b+c<a||c+a<b;){printf(“Notatrigle!”);printf("pleaseinputa,b,c:")scanf("%lf,%lf,%lf",&a,&b,&c);}

s=(a+b+c)/2;S=sqrt(s*(s-a)*(s-b)*(s-c));printf("Areais%lf",S);求一元二次方程的根4、程序#include“math.h"main(){floata,b,c,disc,x1,x2,p,q;printf("pleaseinputa,b,c:")scanf(“%f,%f,%f”,&a,&b,&c);disc=b*b-4*a*c;p=-b/(2*a);q=sqrt(disc)/(2*a);x1=p+q;x2=p-q;printf(“x1=%f,x2=%f\n",x1,x2);getch();}4、程序#include“math.h"main(){floata,b,c,disc,x1,x2,p,q;printf("pleaseinputa,b,c:")scanf(“%f,%f,%f”,&a,&b,&c);if(a<0){ printf(“Nota2equation!”); exit(0);}else{disc=b*b-4*a*c;If(disc<0){ printf(“notexitrealroot!”); exit(0);}p=-b/(2*a);q=sqrt(disc)/(2*a);x1=p+q;x2=p-q;printf(“x1=%f,x2=%f\n",x1,x2);}getch();}do{printf("pleaseinputa,b,c:")scanf(“%f,%f,%f”,&a,&b,&c);if(a<0)

printf(“Nota2equation!”);}while(a<0);改进程序:main(){intscore;printf(“pleaseinputchengji:”);scanf(“%d”,&score);score=score/10;switch(score){case10:case9:printf(“\nA\n”);break;case8:printf(“\nB\n”);break;case7:printf(“\nC\n”);break;case6:printf(“\nD\n”);break;default:printf(“\nE\n”);}getch();}程序:main(){intscore;do{printf(“pleaseinputchengji:”);scanf(“%d”,&score);score=score/10;switch(score){case10:case9:printf(“\nA\n”);break;case8:printf(“\nB\n”);break;case7:printf(“\nC\n”);break;case6:printf(“\nD\n”);break;

default:printf(“\nE\n”);}getch();}while(score<0);}例子求1+2+3+…+100的和四段论1、分析:已知:1,2,3…100求:和2、算法:找:三种:直接连加、高斯算法、循环变:循环

直到i>100循环s1:使s=0s2:使i=1s3:s+i=>ss4:i+1=>is5:如果i不大于100,则重复执行s3-s5,否则,结束s6:输出s就是所要的和。3、流程图s=0,i=1s+i=>si+1=>i输出s当i<100s=0,i=1s+i=>si+1=>i输出s4、写程序main(){ints,i;s=0;i=1;do{s=s+i;i=i+1;}while(i<=100);printf(“sumis%d\n”,s);getch();}main(){ints,i;s=0;i=1;while(i<=100){

s=s+i;i=i+1;}printf(“sumis%d\n”,s);getch();}main(){ints,i;s=0;i=1;for(;i<=100;){

s=s+i;i=i+1;}printf(“sumis%d\n”,s);getch();}变main(){ints,i;s=0;i=1;for(;i<=100;){

s=s+i;i=i+1;}printf(“sumis%d\n”,s);getch();}main(){ints,i;s=0;i=1;for(;i<=100;i=i+1;){

s=s+i;}printf(“sumis%d\n”,s);getch();}main(){ints,i;s=0;for(i=1;;i<=100;i=i+1;)s=s+i;printf(“sumis%d\n”,s);getch();}main(){ints,i;for(s=0,i=1;;i<=100;i=i+1;)s=s+i;printf(“sumis%d\n”,s);getch();}for() 的执行过程for(i=1;i<=100;i=i+1;)s=s+i;几种循环的比较P.114break、continue语句有选择地求和main(){ints,i;s=0;i=1;while(i<=100){

s=s+i;i=i+1;}printf(“sumis%d\n”,s);getch();}if(i%5!=0)continue;main(){ints,i;s=0;i=1;while(i<=100){

s=s+i;i=i+1;}printf(“sumis%d\n”,s);getch();}if(s>32767)break;main(){ints,i;s=0;i=1;while(i<=100){

s=s+i;i=i+1;}printf(“sumis%d\n”,s);getch();}if(s>32767)break;if(i%5!=0)continue;任意个数main(){ints,i;intmax_range;printf(“pleaseinputmaxrange:”);scanf(“%d”,&max_range);s=0;i=1;while(i<=max_range){

s=s+i;i=i+1;}printf(“sumis%d\n”,s);getch();}if(s>32767)break;if(i%5!=0)continue;例5.6输出以下4*5的矩阵。

12345246810369121548121620解题思路:可以用循环的嵌套来处理此问题用外循环来输出一行数据用内循环来输出一列数据按矩阵的格式(每行5个数据)输出#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++){if(n%5==0)printf(“\n”); printf("%d\t",i*j);}printf("\n"); return0;}累计输出数据的个数控制一行内输出5个数据#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++){if(n%5==0)printf(“\n”); printf("%d\t",i*j);}printf("\n"); return0;}双重循环#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++){if(n%5==0)printf(“\n”); printf("%d\t",i*j);}printf("\n"); return0;}控制输出4行#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++){if(n%5==0)printf(“\n”); printf("%d\t",i*j);}printf("\n"); return0;}控制每行中输出5个数据#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++){if(n%5==0)printf(“\n”); printf("%d\t",i*j);}printf("\n"); return0;}i=1时j由1变到5i*j的值是1,2,3,4,5#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++){if(n%5==0)printf(“\n”); printf("%d\t",i*j);}printf("\n"); return0;}i=2时j也由1变到5i*j的值是2,4,6,8,10如何修改程序,不输出第一行的空行?#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++){if(n%5==0)printf(“\n”);

printf("%d\t",i*j);}printf("\n"); return0;}if(i==3&&j==1)break;遇到第3行第1列,终止内循环#include<stdio.h>intmain(){inti,j,n=0;for(i=1;i<=4;i++)for(j=1;j<=5;j++,n++){if(n%5==0)printf(“\n”);

printf("%d\t",i*j);}printf("\n"); return0;}if(i==3&&j==1)continue;原来第3行第1个数据3没有输出5.8循环程序举例

例5.7用

公式求

的近似值,直到发现某一项的绝对值小于10-6

为止(该项不累计加)。5.8循环程序举例解题思路:求近似值的方法很多,本题是一种其他方法:5.8循环程序举例每项的分子都是1后一项的分母是前一项的分母加2第1项的符号为正,从第2项起,每一项的符号与前一项的符号相反5.8循环程序举例sign=1,pi=0,n=1,term=1当term≥10-6pi=pi+termn=n+1sing=-signterm=sign/npi=pi*4输出pi#include<stdio.h>#include<math.h>intmain(){intsign=1;doublepi=0,n=1,term=1;while(fabs(term)>=1e-6){pi=pi+term;n=n+2;sign=-sign;term=sign/n;}pi=pi*4;printf("pi=%10.8f\n",pi);return0;}求绝对值的函数只保证前5位小数是准确的#include<stdio.h>#include<math.h>intmain(){intsign=1;doublepi=0,n=1,term=1;while(fabs(term)>=1e-6){pi=pi+term;n=n+2;sign=-sign;term=sign/n;}pi=pi*4;printf("pi=%10.8f\n",pi);return0;}改为1e-8

例5.8求费波那西(Fibonacci)数列的前40个数。这个数列有如下特点:第1、2两个数为1、1。从第3个数开始,该数是其前面两个数之和。即:这是一个有趣的古典数学问题:有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问每个月的兔子总数为多少?第几个月小兔子对数中兔子对数老兔子对数兔子总数110012010131012411135212563238753513┇┇┇┇┇输出f1,f2Fori=1to38f3=f1+f2输出f3f1=f2f2=f3f1=1,f2=1#include<stdio.h>intmain(){intf1=1,f2=1,f3;inti;printf("%12d\n%12d\n",f1,f2);for(i=1;i<=38;i++){f3=f1+f2; printf("%12d\n",f3); f1=f2; f2=f3;}return0;}…代码可改进#include<stdio.h>intmain(){intf1=1,f2=1;inti;for(i=1;i<=20;i++){printf("%12d%12d",f1,f2);if(i%2==0)printf("\n");f1=f1+f2;f2=f2+f1;}return0;}

例5.9输入一个大于3的整数n,判定它是否素数(prime,又称质数)。解题思路:让n被i整除(i的值从2变到n-1)如果n能被2~(n-1)之中任何一个整数整除,则表示n肯定不是素数,不必再继续被后面的整数除,因此,可以提前结束循环注意:此时i的值必然小于nNNYn=i+1输入ni=2i≤n-1Yn被i整除i≤a输出不是素数Y输出是素数N#include<stdio.h>intmain(){intn,i;printf(“n=?");scanf("%d",&n);for(i=2;i<=n-1;i++)if(n%i==0)break;if(i<n)printf("%disnot\n",n);elseprintf("%dis\n",n);return0;}#include<stdio.h>intmain(){intn,i;printf(“n=?");scanf("%d",&n);for(i=2;i<=n-1;i++)if(n%i==0)break;if(i<n)printf("%disnot\n",n);elseprintf("%dis\n",n);return0;}k=sqrt(n);#include<stdio.h>intmain(){intn,i,k;printf(“n=?");scanf("%d",&n);for(i=2;i<=k;i++)if(n%i==0)break;if(i<n)printf("%disnot\n",n);elseprintf("%dis\n",n);return0;}k=sqrt(n);#include<math.h>#include<stdio.h>intmain(){intn,i,k;printf(“n=?");scanf("%d",&n);for(i=2;i<=k;i++)if(n%i==0)break;if(i<=k)printf("%disnot\n",n);elseprintf("%dis\n",n);return0;}k=sqrt(n);#include<math.h>

例5.10求100~200间的全部素数。解题思路:使用例5.9的算法在例5.9程序中只要增加一个外循环,先后对100~200间的全部整数一一进行判定即可

……for(n=101;n<=200;n=n+2){k=sqrt(n);for(i=2;i<=k;i++)if(n%i==0)break;if(i>=k+1) {printf("%d",n); m=m+1; } if(m%10==0)printf(“\n”);}……只对奇数进行检查控制每行输出10个数据

例5.11译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。ABCDEFG……WXYZ非字母字符保持原状不变输入一行字符,要求输出其相应的密码解题思路:问题的关键有两个:

(1)决定哪些字符不需要改变,哪些字符需要改变,如果需要改变,应改为哪个字符处理的方法是:输入一个字符给字符变量c,先判定它是否字母(包括大小写),若不是字母,不改变c的值;若是字母,则还要检查它是否’W’到’Z’的范围内(包括大小写字母)。如不在此范围内,则使变量c的值改变为其后第4个字母。如果在’W’到’Z’的范围内,则应将它转换为A~D(或a~d)之一的字母。c=getchar();解题思路:问题的关键有两个:

(1)决定哪些字符不需要改变,哪些字符需要改变,如果需要改变,应改为哪个字符处理的方法是:输入一个字符给字符变量c,先判定它是否字母(包括大小写),若不是字母,不改变c的值;若是字母,则还要检查它是否’W’到’Z’的范围内(包括大小写字母)。如不在此范围内,则使变量c的值改变为其后第4个字母。如果在’W

温馨提示

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

评论

0/150

提交评论