《C程序设计项目教程(第2版)》项目五_第1页
《C程序设计项目教程(第2版)》项目五_第2页
《C程序设计项目教程(第2版)》项目五_第3页
《C程序设计项目教程(第2版)》项目五_第4页
《C程序设计项目教程(第2版)》项目五_第5页
已阅读5页,还剩64页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

C程序设计项目教程主讲

宋玉璞目录项目1项目2项目3项目4项目5项目6C程序概述算法C语法基础分支语句循环语句数组

项目7项目9项目8项目10函数指针构造数据类型文件5循环语句——解决迭代问题的好办法项目项目5循环语句知识目标掌握while和do-while循环语句的使用方法。掌握for循环语句的使用方法。掌握break语句和continue语句的使用方法。能力目标素质

目标能读懂较为复杂的循环结构程序。能根据实际问题选择合适的循环语句编写程序。提升总结规律和将事物化繁为简的能力。不断积累知识,为国家和民族的科技振兴贡献力量。项目5循环语句项目导读在实际应用中,经常会遇到许多有规律的重复运算。例如,在连加或连乘问题中,需要不断变换数值进行重复运算,此时可利用循环结构设计程序。在C程序中,循环结构程序通常由while、do-while和for语句来实现。循环语句是解决迭代问题的好办法。项目5循环语句任务1制作计算等比数列之和while循环语句一任务1

制作计算等比数列之和

在C程序中,while语句是最简单也是最基本的循环语句,其格式为while(表达式) 语句 /*循环体*/

圆括号内的表达式是控制表达式;while下面的语句是循环体,循环体可以是一条简单的语句,也可以是多条语句组成的复合语句。while循环语句一任务1

制作计算等比数列之和

while语句的执行流程如图所示。执行该语句时,须先判断表达式的值,如果它为真(非0),则执行循环体;接着再次判断表达式的值,如果它仍为真,继续执行循环体,直到表达式的值为假(0),跳出循环体,执行下一条语句。由此可见,while语句就是当型循环结构。while语句的执行流程

任务1

制作计算等比数列之和

【例5-1-1】

分别计算0.99365和1.01365的值。【问题分析】

这是一个累计求积的问题,可以用循环结构来实现。【参考程序】#include<stdio.h>intmain(){ inti=1; /*初始化循环变量i*/ floats1=1,s2=1; /*初始化s1和s2*/ while(i<=365) /*循环条件,当i>365时结束*/ { s1*=0.99; /*求s1*0.99,将结果放入s1中*/ s2*=1.01; /*求s2*1.01,将结果放入s2中*/ i++; /*循环变量i加1*/ } printf("s1=%f,s2=%f\n",s1,s2);/*输出s1和s2的值*/ return0;}任务1

制作计算等比数列之和

【例5-1-1】

分别计算0.99365和1.01365的值。【问题分析】

这是一个累计求积的问题,可以用循环结构来实现。【运行结果】任务1

制作计算等比数列之和

在使用while语句时,需要注意以下两点。(1)变量初始化描述要完整、准确。例如,例5-1-1中,在while语句前要对变量i、s1和s2进行初始化。(2)在循环体中应有使循环趋向于结束的语句。例如,例5-1-1中循环结束的条件是“i>365”,因此,在循环体中用“i++;”语句使i增值并最终大于365。do-while循环语句二任务1

制作计算等比数列之和

除了while语句外,还可以用do-while语句来实现循环结构。使用do-while语句时,无论条件是否满足,都至少执行一次循环体,其语法格式为do{语句 /*循环体*/}while(表达式);do-while循环语句二任务1

制作计算等比数列之和

do-while语句的执行流程如图所示。首先执行一次循环体中的语句,然后计算表达式的值,若为真则继续执行循环体,并再次计算表达式的值,直到表达式的值为假,终止循环,执行do-while语句的下一条语句。由此可见,do-while语句是直到型循环结构。do-while语句的流程

任务1

制作计算等比数列之和

【例5-1-2】

用do-while语句求0.99365和1.01365的值。【参考程序】#include<stdio.h>intmain(){ inti=1; /*初始化循环变量i*/ floats1=1,s2=1; /*初始化s1和s2*/ do { s1*=0.99; /*求s1*0.99,将结果放入s1中*/ s2*=1.01; /*求s2*1.01,将结果放入s2中*/ i++; /*循环变量i加1*/ }while(i<=365); /*直到i>365,跳出循环*/ printf("s1=%f,s2=%f\n",s1,s2);/*输出s1和s2的值*/ return0;}任务1

制作计算等比数列之和

【例5-1-2】

用do-while语句求0.99365和1.01365的值。【运行结果】实施案例一.案例分析设等比数列的首项为5,公比为2,即等比数列中a0=5,an=an−1×2,Sn=Sn−1+an,故可以用循环结构来实现。定义变量S表示等比数列的和,其初值为0;定义变量a表示等比数列的项,其初值为5;定义循环变量i,其取值范围为1~n,n为项数。当i≤n时,循环计算S的值,具体流程如图所示。任务1

制作计算等比数列之和

等比数列求和的流程图

二.参考程序在本次实施案例中,用while语句编程。#include<stdio.h>intmain(){ inti,n,a,S; /*定义变量*/ printf("请输入n的值:"); /*输出提示语*/ scanf("%d",&n); /*输入n的值*/ i=1; /*给i赋初值1*/ a=5; /*给a赋初值5*/ S=0; /*给S赋初值0*/ while(i<=n) /*循环条件,当i>n时结束*/ { S+=a; /*求和,将结果放入S中*/ a=a*2; /*等比数列中的项*/ i++; /*循环变量i自增1*/ } printf("S=%d\n",S); /*输出S的值*/ return0;}任务1

制作计算等比数列之和

三.运行结果通过键盘输入20↙,程序运行结果如图所示。任务1

制作计算等比数列之和

任务实训一.实训目的(1)掌握while语句的使用方法。(2)掌握do-while语句的使用方法。(3)能用while语句和do-while语句编程解决循环结构问题。任务1

制作计算等比数列之和

二.实训内容1.阅读程序(1)若输入字符串abcde↙,则以下while循环体将执行

次。while((ch=getchar())=='e')printf("*");(2)以下程序的输出结果为

。#include<stdio.h>intmain(){ inti=10; while(i>7) { i--; printf("%d",i); } return0;}任务1

制作计算等比数列之和

二.实训内容2.程序改错下列程序用于输出1~10的自然数。请找出错误并修改验证,然后将修改后的程序填入表中。任务1

制作计算等比数列之和

原程序修改后的程序#include<stdio.h>intmain(){ inti=1; while(i<10) { printf("%d\n",i); } return0;}

3.程序填空(1)以下程序用于实现从键盘输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。请将正确答案填在下面的横线上。#include<stdio.h>intmain(){ floatx,amax,amin; scanf("%f",&x); amax=x; amin=x; while(

) { if(x>amax)amax=x; if(

)amin=x; scanf("%f",&x); } printf("\namax=%f\namin=%f\n",amax,amin); return0;}任务1

制作计算等比数列之和

3.程序填空(2)下列程序的运行结果是***。请将正确答案填在下面的横线上。#include<stdio.h>intmain(){ intx=6; do{ printf("*"); x--; x--; }while(

); return0;}任务1

制作计算等比数列之和

4.程序设计使用公式

,求圆周率π的近似值,直至公式中单项的绝对值小于10−6。请将实训过程填入表中。任务1

制作计算等比数列之和

程序代码遇到的问题及解决办法

任务2打印图形金字塔for循环语句一任务2

打印图形金字塔

1.for循环语句的一般形式for循环语句的一般形式为for(表达式1;表达式2;表达式3)

语句 /*循环体*/表达式1:通常为赋值表达式,用于给循环变量赋初值,只执行一次。表达式2:通常为关系表达式或逻辑表达式,在每次执行循环体前先执行此表达式,以决定是否继续执行循环体。for循环语句一任务2

打印图形金字塔

1.for循环语句的一般形式for循环语句的一般形式为for(表达式1;表达式2;表达式3)

语句 /*循环体*/表达式3:通常为表达式语句,用来描述循环变量的变化,多数情况下为自增或自减表达式,实现对循环变量的修改。它是在执行完循环体后才执行的。for循环语句一任务2

打印图形金字塔

for循环语句的执行流程如图所示。for循环语句的流程

for循环语句一任务2

打印图形金字塔

(1)计算表达式1的值,为循环变量赋初值。(2)计算表达式2的值,如果其值为真(非0),则执行循环体语句,然后执行第(3)步;如果为假(0),则退出循环,执行for循环后的语句。(3)计算表达式3的值,调整循环变量的值。(4)返回执行第(2)步,重新计算表达式2的值,依此重复过程,直到表达式2的值为假(0),退出循环。for循环语句一任务2

打印图形金字塔

例如:for(i=1;i<=10;i++)

语句先给i赋初值1,判断i是否小于等于10,若成立,则执行语句;然后i的值增加1,再重新判断i是否小于等于10,直到条件为假,即i>10时,结束循环。for循环语句一任务2

打印图形金字塔

【例5-2-1】

用for循环语句实现求S=1+2+3+…+n的值。【问题分析】首先赋初值,即i=1;循环语句执行的条件为i<=n;在循环过程中,每循环一次后执行一次i自增1。任务2

打印图形金字塔

【例5-2-1】

用for循环语句实现求S=1+2+3+…+n的值。【参考程序】#include<stdio.h>intmain(){ inti,n,S; /*定义变量*/ printf("请输入n的值:"); /*输出提示语*/ scanf("%d",&n); /*输入n的值*/ S=0; /*给S赋初值*/ for(i=1;i<=n;i++) /*循环,当i>n时结束*/ S+=i; /*求和,将结果放入S中*/ printf("S=%d\n",S); /*输出S的值*/ return0;}任务2

打印图形金字塔

【例5-2-1】

用for循环语句实现求S=1+2+3+…+n的值。【运行结果】从键盘中输入50↙,程序运行结果如图所示。任务2

打印图形金字塔

2.for循环语句说明在使用for循环语句实现循环时需要说明以下几点。(1)在for循环语句中省略表达式。for循环中的“表达式1”“表达式2”和“表达式3”都是可选项,即可以缺省,但表达式之间的分号“;”绝对不能缺省。当省略“表达式1”时,应在for语句之前给循环变量赋初值;当省略“表达式2”时,表示循环条件总是成立,相当于while(1);当省略“表达式3”时,表示不对循环变量进行操作,此时须在循环体中加入修改循环变量的语句。任务2

打印图形金字塔

2.for循环语句说明在使用for循环语句实现循环时需要说明以下几点。(2)在for循环语句中省略语句。for语句的循环体可以是空语句,表示当循环条件满足时进行空操作。语句格式为for(表达式1;表达式2;表达式3);例如:for(i=1;i<=20000;i++);表示循环变量空循环了20000次,占用了一定的时间,起到了延长时间的效果。任务2

打印图形金字塔

2.for循环语句说明在使用for循环语句实现循环时需要说明以下几点。(3)for循环语句中逗号表达式的应用。在for循环语句中,表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。例如:for(n=1,m=100;n<m;n++,m--) s=n+m;其中,表达式1同时为n和m赋初值,表达式3同时改变n和m的值。任务2

打印图形金字塔

【例5-2-2】

编程实现,输出1~1000能同时被3、5、7整除的数。【问题分析】

设循环变量i从1循环到1000,判断每个自然数i是否能够同时被3、5、7整除,即将满足条件“i%3==0&&i%5==0&&i%7==0”的数输出。【参考程序】#include<stdio.h>intmain(){ inti=1; /*定义变量i*/ for(i=1;i<=1000;i++) /*i从1到1000循环1000次*/ { if(i%3==0&&i%5==0&&i%7==0) /*如果满足条件则输出i的值*/ printf("%4d",i); } printf("\n"); return0;}任务2

打印图形金字塔

【例5-2-2】

编程实现,输出1~1000能同时被3、5、7整除的数。【问题分析】

设循环变量i从1循环到1000,判断每个自然数i是否能够同时被3、5、7整除,即将满足条件“i%3==0&&i%5==0&&i%7==0”的数输出。【运行结果】程序运行结果如图所示。

循环嵌套

二任务2

打印图形金字塔

一个循环语句的循环体内包含另一个完整的循环结构,称为循环嵌套。嵌在循环体内的循环称为内循环,嵌有内循环的循环称为外循环。内嵌的循环中还可以嵌套循环,这就是多重嵌套。3种循环语句while语句、do-while语句和for语句可以互相嵌套,自由组合。但要注意的是,各循环必须完整包含,相互之间不允许有交叉现象。例如:while(表达式){

语句for(表达式1;表达式2;表达式3){

语句 } }内循环循环嵌套

二任务2

打印图形金字塔

【例5-2-3】

一张单据上有一个5位数的号码为“6**42”,其中百位数和千位数已模糊不清,但知道这个5位数能被57和67整除。请编程找出该单据上所有可能的号码。【问题分析】该问题可使用循环嵌套来实现,外循环控制千位数(0~9),内循环控制百位数(0~9),循环体内判断该数能否同时被57和67整除,若能,则输出该号码。任务2

打印图形金字塔

【例5-2-3】

一张单据上有一个5位数的号码为“6**42”,其中百位数和千位数已模糊不清,但知道这个5位数能被57和67整除。请编程找出该单据上所有可能的号码。【参考程序】#include<stdio.h>intmain(){ inth,i,j; /*定义变量*/ for(i=0;i<=9;i++) /*外循环,控制千位数*/ { for(j=0;j<=9;j++) /*内循环,控制百位数*/ { h=6*10000+i*1000+j*100+42; /*计算该号码的数值*/ if(h%57==0&&h%67==0) /*判断能否同时被57和67整除*/ printf("号码=%d\n",h); /*输出号码*/ } } return0;}任务2

打印图形金字塔

【例5-2-3】

一张单据上有一个5位数的号码为“6**42”,其中百位数和千位数已模糊不清,但知道这个5位数能被57和67整除。请编程找出该单据上所有可能的号码。【运行结果】程序运行结果如图所示。

实施案例一.案例分析从图形金字塔的结构可以看出,第一行有1个“*”,第二行有3个“*”,第三行有5个“*”,依次类推,第n行有2n−1个“*”;从位置上看,第一行“*”前有n−1个空格,第二行“*”前有n−2个空格,第三行“*”前有n−3个空格,依此类推,第n−1行“*”前有1个空格。定义图形金字塔的行数n,则在第i行中,前n−i列为空格,从第n−i+1列开始为2i−1个“*”。因此,可以由循环嵌套语句实现。任务2

打印图形金字塔

二.参考程序#include<stdio.h>intmain(){ intn,i,j; /*定义金字塔的高度、行数和列数*/ printf("请输入金字塔的高度:"); scanf("%d",&n); /*输入n的值*/ for(i=1;i<=n;i++) /*外循环,变量i为图形金字塔行*/ { for(j=0;j<n-i;j++) /*内循环,输出空格*/ printf(""); for(j=0;j<2*i-1;j++) /*内循环,输出“*”*/ printf("*"); printf("\n"); /*执行完每行后,回车换行*/ } return0;}任务2

打印图形金字塔

三.运行结果从键盘中输入8↙,程序运行结果如图所示。任务2

打印图形金字塔

任务实训一.实训目的(1)掌握for语句和循环嵌套结构的使用方法。(2)具备循环结构程序的基本分析和编写能力。任务2

打印图形金字塔

任务实训二.实训内容1.阅读程序(1)以下程序的运行结果是

。#include<stdio.h> intmain(){ inti,k=0; for(i=1;i<10;i+=2) /*每执行一次,i加2*/ k+=i+1; printf("%d\n",k); return0;}任务2

打印图形金字塔

任务实训二.实训内容1.阅读程序(2)以下程序的运行结果是

。#include<stdio.h>intmain(){ inti; for(i=0;i<3;i++) switch(i) { case1:printf("%d",i);break; case2:printf("%d",i);break; default:printf("%d",i);break; } return0;}任务2

打印图形金字塔

任务实训2.程序填空以下程序用于计算1−3+5−7+…−99+101的值。请将正确答案填在下面的横线上。#include<stdio.h>intmain(){ inti,s=0,f=1; for(i=1;i<=101;i+=2) {

;

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

任务2

打印图形金字塔

任务实训3.程序设计用

for

语句实现“百钱买百鸡”问题。请将实训过程填入表中。任务2

打印图形金字塔

程序代码遇到的问题及解决办法

任务3判断某整数是素数还是合数break语句一任务3

判断某整数是素数还是合数

在多分支结构中,使用break语句跳出switch语句,去执行switch语句下面的语句。实际上,还可以使用break语句跳出循环体,去执行循环体下面的语句。break语句的一般形式为break;

在循环结构中,break语句通常与if语句一起使用,以便在满足条件时跳出循环。break语句一任务3

判断某整数是素数还是合数

【例5-3-1】

计算满足条件的最大整数n,使得1+2+3+…+n<=10000。【问题分析】

本例题与例5-2-1类似,显然应该用循环结构来处理,但是不一样的是,本例题中的循环次数是不确定的。这里可以在循环体中计算累加的结果S,并用if语句判断S是否达到10000,如果达到就不再继续循环,n−1的值即为要求的数。任务3

判断某整数是素数还是合数

【例5-3-1】

计算满足条件的最大整数n,使得1+2+3+…+n<=10000。【参考程序】

#include<stdio.h>intmain(){ intn,S; /*定义变量*/ S=0; /*给S赋初值*/ for(n=1;;n++) /*循环,省略循环条件表示无限循环*/ { S+=n; /*求和,将结果放入S中*/ if(S>10000) /*当S>10000时跳出循环*/ break; } printf("最大整数n为%d,使得1+2+3+…+n<=10000\n",n-1); /*输出n-1的值*/ return0;}任务3

判断某整数是素数还是合数

【例5-3-1】

计算满足条件的最大整数n,使得1+2+3+…+n<=10000。【运行结果】

【程序说明】

本例题中由于for语句中省略了表达式2,因此,如果没有break语句,程序将无限循环下去。当n为141时,S的值为10011,if语句中的关系表达式S>10000为“真”,执行break语句,跳出for循环,输出n−1的值。continue语句二任务3

判断某整数是素数还是合数

程序运行时,有时并不希望终止整个循环操作,而只希望提前结束本次循环,接着执行下次循环,此时可以用continue语句,其一般形式为continue;其作用是结束本次循环,即跳过循环体中continue语句后面的语句,开始下次循环。二任务3

判断某整数是素数还是合数

【例5-3-2】

编程输出1~50的所有奇数。【问题分析】

编程输出1~50的所有奇数。continue语句任务3

判断某整数是素数还是合数

【例5-3-2】

编程输出1~50的所有奇数。【参考程序】#include<stdio.h>intmain(){ intn; /*定义变量*/ for(n=1;n<=50;n++) /*循环,当n>50时退出循环*/ { if(n%2==0) /*判断n是否为偶数*/ continue; /*当n为偶数时跳出本次循环*/ else /*当n为奇数时输出n的值*/ printf("%3d",n); } printf("\n"); /*输出回车符*/ return0;}任务3

判断某整数是素数还是合数

【例5-3-2】

编程输出1~50的所有奇数。【运行结果】】

程序运行结果如图。实施案例一.案例分析本任务的关键是如何判断素数。素数是指在一个大于1的自然数中,除了1和它自身外,不能被其他自然数整除的数,和合数相对。即如果m是素数,则它不能被2~m−1的任何一个数整除,又因为m不可能被大于m/2的数整除,所以取值区间可缩小为[2,m/2]。当期间有一个数能够整除m,则m是合数,使用break语句结束循环。任务3

判断某整数是素数还是合数

二.参考程序#inc

温馨提示

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

评论

0/150

提交评论