C第十一讲.ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2页
本讲内容
➢ 一、3.4.4 循环嵌套 ➢ 二、程序举例
1. 常用的两种程序设计方法:穷举法和迭代法 2. 累加问题
➢ 三、项目任务(实验4及完整程序) ➢ 四、3.5 数据文件 (成绩的输入输出)
第3页
3.4.4 循环的嵌套
在循环体语句中又包含有另一个完整的循环结构 的形式,称为循环的嵌套。嵌套在循环体内的循 环体称为内循环,外面的循环称为外循环。如果 内循环体中又有嵌套的循环语句,则构成多重循 环。
C语言程序设计---------Programming in C
第3章 分支和循环的C程序设计(5)
运城学院公共计算机教学部 Public Computer Teaching Department
上讲内容回顾
3.3.3 for结构 3.3.4 break语句、 continue语句 标记变量法和循环变量终值法
printf("*"); printf("\n"); } }
第9页
【例3】图文表打印。打印九九乘法表。如下图:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16
……
第10页
算法分析: 1、列*行=积(点) 2、属于第几行,就有几列式子;(线,内循环) 3、乘法表共有9行;(面,外循环) 4、用i表示所在行,用j表示所在列。程序如下:
for(i=1;i<=3;i++) { for(j=1;j<=3;j++)
printf("*");
}
第8页
【例2】输出
* ** *** **** *****
行 列 的输出变化
i
j (1~i)wenku.baidu.com
1
1~1
#in2clude "1s~td2io.h" ma3in() 1~3 { int i,j;
fo4r(i=1;i1<~=54;i++) { 5for(j=11;~j<5=i ;j++)
void main()
{ int k,n,f;
for(n=2;n<100;n++) /*外循环,枚举法*/
{ f=1;
/*标记法,假设n为素数*/
for(k=2;k<=(int)sqrt(n);k++)
/*判断某数n是否为素数*/
if(n%k==0) {f=0; break;} /*n被k整除,则n不 是素数*/
4 357
分析:
求和
加数的规律:
(1)加数正负间隔,利用负负为正,每次在加数前乘-1。
(2)加数的分母以步长为2增加。
结果精度:
(3)假设所求结果精度为最后一个加数的值不小于10-6。 利用加数精度控制作为循环控制条件。
第26页
i(分母) temp(符号) sum(和)
temp*(1.0/i)(加数)
第23页
#include "stdio.h" void main() {int f1=1, f2=1, f3; int k;
printf(" %d\t%d\t ", f1,f2);
for(k=3;k<=30;k++) { f3=f1+f2;
printf(" %d\t ",f3); f1=f2; f2=f3; } }
程序代码
#include <stdio.h>
void main( ) {
int i,j; for(i=1;i<=9;i++) {
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16
/…*…行,外循环*/
for(j=1;j<=i;j++)
…
…
…
…
注:不满1个月的为小兔子,满1个月不满2个月的为中兔子,满3个月的为老兔子
第21页
斐波那契数列数学模型: 1 fn= fn-1 +fn-2
n=1,2 n≥3
f1--第一个数 f2--第二个数 f3--第三个数 f1=1; f2=1; f3=f1+f2;
以后只要改变f1,f2的值,即可求出下一个数.
(2)验证条件
判断某数x是否为无重复的 三位数,是则输出
第17页
#include "stdio.h"
void main()
/*a,b,c代表百位、十位、个位*/
{ int x,a,b,c,num=0;
for(x=100;x<=999;x++)
{ a=x/100;b=x/10%10;c=x%10;
if(a!=b&&a!=c&&b!=c)
for(i=1;i<=3;i++) { for(j=1;j<=3;j++)
printf("*"); printf("\n"); } }
*** ******
第7页
平面图形的输出:
平面图形由若干行组成,每行又由若干字符 组成.一般使用双重(双层)循环,一行一行输 出.
双层循环
外循环:控制行的变化.每 输完一行光标换行 内循环:控制每列字符的输出
循环语句之间的关系
第5页
双重 循环 嵌套 结构 执行 流程
外循环初始条件 假
外循环条件 真
内循环初始条件
内循环条件 真
内循环体
修改内循环变量
假
循环结束
修改外循 环变量
【例1】
外循环i
1
2
3
内循环j 输出
1
*
2
*
3
*
4
结束内循环
\n
1
*
2
*
3
*
4
结束内
\n
1
*
2
*
3
*
4
结束内
\n
#include "stdio.h" void main() { int i,j;
while 、do-while、for三种循环都可以互相嵌 套。
第4页
for(...)
{...
for(...)
外内 循循
{...
环环 }
...
}
for(....) {... } for(...) {...
}
嵌套循环
并列循环
for(....) {... for(...)
{... 错误 }
}
交叉循环
{ num++;
printf("%5d",x);
}
}
printf("\nnumber=%d",num);
}
第18页
思考
求100-999之间的水仙花数 百鸡百钱 鸡兔同笼,共有98个头,386只脚,编程求鸡、
兔各多少只? 用1元5角钱人民币兑换5分、2分和1分的硬币
(每一种都要有)共100枚,问共有几种兑换 方案?每种方案各换多少枚?
第32页
三、项目任务
完整程序:学生信息管理系统.c
功能:身份验证,出现主界面, ,并调用学生成绩 管理子系统,学生成绩管理子系统可以返回主界面
IdentityCheck():身份验证
menu();主界面
StudentMenu() :学生成绩管理子系统
void main( )
在2 《算盘书》0中提出了1对1兔子的繁殖0问题:如果1每对大兔
子3 成长后每月1能生1对小兔0子,而每对1小兔子在出2生后的第3
个4 月后开始,1每月再生1对1小兔子,假1定在不发生3死亡的情
况5 下,最初的21对兔子在一1年末能繁殖2成多少对兔5子(假定以
上6 兔子都是雌3雄成对)? 2
3
8
……
scanf("%d",&n); for(i=1;i<=n;i++)
i temp;
1
1!
{ temp = temp*i;
2 2! ( 1!*2)
sum = sum+temp;
3 3! ( 2!*3)
}
┇┇
printf("其和是%d\n",sum);
第25页
【例3-22】利用级数求∏的值:
1 1 1 1
成绩管理子系统可以返回主界面 函数: main () StudentMenu( )学生成绩管理子系统
第31页
三、项目任务
二、用户身份验证优化:实验4-1.c 功能: 身份验证,通过验证后出现主界面 函数: main () IdentityCheck()身份验证 menu()主界面
/*列,内循环*/
printf(“%d*%d=%-4d”,j,i,i*j);
printf(“\n”); /*换行*/
}
}
第12页
二、1.常用的两种程序设计方法
1)枚举法(穷举法) 2)迭代法
第13页
枚举法 Enumeration
所谓“枚举”(穷举)算法,按问题本身的性 质,一一列举出该问题所有可能的解,并在逐一 列举的过程中,检验每个可能解是否是问题的真 正解,若是,我们采纳这个解,否则抛弃它。对 于所列举的值,既不能遗漏也不能重复。这种算 法在密码破解中得到了广泛的应用.
sum = sum*4;
第27页
#include<stdio.h>
#include<math.h>
void main(void)
{
int i;
/* 定义整型循环变量 */
float sum=0.0;
/* 定义并初始化累加和 */
float temp=-1;
i = 1;
do
{ temp = -temp;
}
第28页
三、项目任务
一、软件界面人机交互的继续优化:实验4-1.c 二、用户身份验证优化:实验4-1.c 完整程序:学生信息管理系统.c
第29页
三、项目任务
某老个总人 ………
财务部经理 人事部经理 市场部经理
所有的…事…情…都…有…自…己. 去做
第30页
三、项目任务
一、软件界面人机交互的继续优化:实验4-1.c 功能: 显示主界面,并调用学生成绩管理子系统,学生
第20页
典型循环问题的算法_迭代法(必记算法)
【例3】裴波那契(Fibonacci)数列的第1、2项分别为 1、1,以后各项的值均是其前两项之和。求前30项菲 波那契数。
我们可以用图解方法来表示各个月的兔子对数。
问第几题个的月提出小:兔子对数 中兔子对数 老兔子对数 兔子对数
1 斐波那契(1Fibonacci)0是中世纪时0意大利的数1学家,他
if(f==1) printf("%5d",n);
/*是素数则输出*/
}
}
第16页
穷举法
【例2】用0--9这十个数字可以组成多少无重复 的三位数?
分析:
对于本问题,列出所有三位数的可能值,对每 个数进行测试判断,若它的三个数字互不相同,即 为所求,否则不是所求的数。
(1)确定范围
for(x=100;x<=999;x++)
f1=f2;f2=f3; f3=f1+f2;
初值:
f1=1; f2=1
递推
迭代公式: f3=f1+f2; f1=f2;f2=f3;
循环条件: k<=30
数列: 1 1 2 3 5 8 13 21 34 55 89 144 233
……
第22页
总结: 编程方法: “迭代法” (“递推法”或“辗转法”) 思想: 就是从初值出发,归纳出新值与旧值间的关系, 直到求出所需值为止。新值的求出依赖于旧值,不知 道旧值,无法推导出新值。数学上递推公式正是这一 类问题。 迭代法的三个条件: 初值、迭代公式和循环条件
/* 正负相间 */
sum = sum+temp*(1.0/i);
/* 不断累加 */
i = i+2;
/* 步长为2 */
}while( fabs(1.0/i)>=1e-6);
/* 循环条件 */
sum = sum*4;
/* 计算pi */
printf("sum=%f\n ",sum);
/* 输出pi */
递推
第24页
二、2.累加问题
【例1】求累乘积的和(1!+2!+3!+4!+5!+ …﹢n!)。
i(循环变量) temp(加数) sum(和)
int i, n,temp=1,sum=0;
int i,n,sum=0; scanf("%d",&n); for(i=1;i<=n;i++)
sum=sum+i; printf("其和是%d\n",sum);
总结:穷举法的要领:(1)确定范围; (2)验证条件
第19页
迭代法 Iteration
❖ 迭代是通过循环不断由旧 ❖ 如人口每年按2%增长,
值推导新值,并最后求解 现在人口有12亿,10年
的过程。
后人口有多少?
迭代法有三个要点:
⒈迭代初值(边界条件)。 ⒉迭代公式。 ⒊迭代次数(或条件)。
m=12 m= m*(1+2%) n=10
1 1 1 1
4 357
i=1,s=0; do
int i=1, temp=-1;
{
float sum=0.0;
s=s+i;
do
i++;
{ temp = -temp; /* 正负相间 */ } while(i<=100);
sum = sum+temp*(1.0/i); /* 不断累加 */
i = i+2; }while( fabs(1.0/i)>=1e-6); /* 循环条件 */
总结:穷举法的要领:(1)确定范围; (2)验证条件
第14页
典型循环问题的算法_穷举法(必记算法)
【例1】求1-100以内的所有素数。
(1)确定范围
for(n=2;n<100;n++)
(2)验证条件
判断某数n是否为素数,是 素数则输出
第15页
#include "stdio.h"
#include "math.h"
本讲内容
➢ 一、3.4.4 循环嵌套 ➢ 二、程序举例
1. 常用的两种程序设计方法:穷举法和迭代法 2. 累加问题
➢ 三、项目任务(实验4及完整程序) ➢ 四、3.5 数据文件 (成绩的输入输出)
第3页
3.4.4 循环的嵌套
在循环体语句中又包含有另一个完整的循环结构 的形式,称为循环的嵌套。嵌套在循环体内的循 环体称为内循环,外面的循环称为外循环。如果 内循环体中又有嵌套的循环语句,则构成多重循 环。
C语言程序设计---------Programming in C
第3章 分支和循环的C程序设计(5)
运城学院公共计算机教学部 Public Computer Teaching Department
上讲内容回顾
3.3.3 for结构 3.3.4 break语句、 continue语句 标记变量法和循环变量终值法
printf("*"); printf("\n"); } }
第9页
【例3】图文表打印。打印九九乘法表。如下图:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16
……
第10页
算法分析: 1、列*行=积(点) 2、属于第几行,就有几列式子;(线,内循环) 3、乘法表共有9行;(面,外循环) 4、用i表示所在行,用j表示所在列。程序如下:
for(i=1;i<=3;i++) { for(j=1;j<=3;j++)
printf("*");
}
第8页
【例2】输出
* ** *** **** *****
行 列 的输出变化
i
j (1~i)wenku.baidu.com
1
1~1
#in2clude "1s~td2io.h" ma3in() 1~3 { int i,j;
fo4r(i=1;i1<~=54;i++) { 5for(j=11;~j<5=i ;j++)
void main()
{ int k,n,f;
for(n=2;n<100;n++) /*外循环,枚举法*/
{ f=1;
/*标记法,假设n为素数*/
for(k=2;k<=(int)sqrt(n);k++)
/*判断某数n是否为素数*/
if(n%k==0) {f=0; break;} /*n被k整除,则n不 是素数*/
4 357
分析:
求和
加数的规律:
(1)加数正负间隔,利用负负为正,每次在加数前乘-1。
(2)加数的分母以步长为2增加。
结果精度:
(3)假设所求结果精度为最后一个加数的值不小于10-6。 利用加数精度控制作为循环控制条件。
第26页
i(分母) temp(符号) sum(和)
temp*(1.0/i)(加数)
第23页
#include "stdio.h" void main() {int f1=1, f2=1, f3; int k;
printf(" %d\t%d\t ", f1,f2);
for(k=3;k<=30;k++) { f3=f1+f2;
printf(" %d\t ",f3); f1=f2; f2=f3; } }
程序代码
#include <stdio.h>
void main( ) {
int i,j; for(i=1;i<=9;i++) {
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16
/…*…行,外循环*/
for(j=1;j<=i;j++)
…
…
…
…
注:不满1个月的为小兔子,满1个月不满2个月的为中兔子,满3个月的为老兔子
第21页
斐波那契数列数学模型: 1 fn= fn-1 +fn-2
n=1,2 n≥3
f1--第一个数 f2--第二个数 f3--第三个数 f1=1; f2=1; f3=f1+f2;
以后只要改变f1,f2的值,即可求出下一个数.
(2)验证条件
判断某数x是否为无重复的 三位数,是则输出
第17页
#include "stdio.h"
void main()
/*a,b,c代表百位、十位、个位*/
{ int x,a,b,c,num=0;
for(x=100;x<=999;x++)
{ a=x/100;b=x/10%10;c=x%10;
if(a!=b&&a!=c&&b!=c)
for(i=1;i<=3;i++) { for(j=1;j<=3;j++)
printf("*"); printf("\n"); } }
*** ******
第7页
平面图形的输出:
平面图形由若干行组成,每行又由若干字符 组成.一般使用双重(双层)循环,一行一行输 出.
双层循环
外循环:控制行的变化.每 输完一行光标换行 内循环:控制每列字符的输出
循环语句之间的关系
第5页
双重 循环 嵌套 结构 执行 流程
外循环初始条件 假
外循环条件 真
内循环初始条件
内循环条件 真
内循环体
修改内循环变量
假
循环结束
修改外循 环变量
【例1】
外循环i
1
2
3
内循环j 输出
1
*
2
*
3
*
4
结束内循环
\n
1
*
2
*
3
*
4
结束内
\n
1
*
2
*
3
*
4
结束内
\n
#include "stdio.h" void main() { int i,j;
while 、do-while、for三种循环都可以互相嵌 套。
第4页
for(...)
{...
for(...)
外内 循循
{...
环环 }
...
}
for(....) {... } for(...) {...
}
嵌套循环
并列循环
for(....) {... for(...)
{... 错误 }
}
交叉循环
{ num++;
printf("%5d",x);
}
}
printf("\nnumber=%d",num);
}
第18页
思考
求100-999之间的水仙花数 百鸡百钱 鸡兔同笼,共有98个头,386只脚,编程求鸡、
兔各多少只? 用1元5角钱人民币兑换5分、2分和1分的硬币
(每一种都要有)共100枚,问共有几种兑换 方案?每种方案各换多少枚?
第32页
三、项目任务
完整程序:学生信息管理系统.c
功能:身份验证,出现主界面, ,并调用学生成绩 管理子系统,学生成绩管理子系统可以返回主界面
IdentityCheck():身份验证
menu();主界面
StudentMenu() :学生成绩管理子系统
void main( )
在2 《算盘书》0中提出了1对1兔子的繁殖0问题:如果1每对大兔
子3 成长后每月1能生1对小兔0子,而每对1小兔子在出2生后的第3
个4 月后开始,1每月再生1对1小兔子,假1定在不发生3死亡的情
况5 下,最初的21对兔子在一1年末能繁殖2成多少对兔5子(假定以
上6 兔子都是雌3雄成对)? 2
3
8
……
scanf("%d",&n); for(i=1;i<=n;i++)
i temp;
1
1!
{ temp = temp*i;
2 2! ( 1!*2)
sum = sum+temp;
3 3! ( 2!*3)
}
┇┇
printf("其和是%d\n",sum);
第25页
【例3-22】利用级数求∏的值:
1 1 1 1
成绩管理子系统可以返回主界面 函数: main () StudentMenu( )学生成绩管理子系统
第31页
三、项目任务
二、用户身份验证优化:实验4-1.c 功能: 身份验证,通过验证后出现主界面 函数: main () IdentityCheck()身份验证 menu()主界面
/*列,内循环*/
printf(“%d*%d=%-4d”,j,i,i*j);
printf(“\n”); /*换行*/
}
}
第12页
二、1.常用的两种程序设计方法
1)枚举法(穷举法) 2)迭代法
第13页
枚举法 Enumeration
所谓“枚举”(穷举)算法,按问题本身的性 质,一一列举出该问题所有可能的解,并在逐一 列举的过程中,检验每个可能解是否是问题的真 正解,若是,我们采纳这个解,否则抛弃它。对 于所列举的值,既不能遗漏也不能重复。这种算 法在密码破解中得到了广泛的应用.
sum = sum*4;
第27页
#include<stdio.h>
#include<math.h>
void main(void)
{
int i;
/* 定义整型循环变量 */
float sum=0.0;
/* 定义并初始化累加和 */
float temp=-1;
i = 1;
do
{ temp = -temp;
}
第28页
三、项目任务
一、软件界面人机交互的继续优化:实验4-1.c 二、用户身份验证优化:实验4-1.c 完整程序:学生信息管理系统.c
第29页
三、项目任务
某老个总人 ………
财务部经理 人事部经理 市场部经理
所有的…事…情…都…有…自…己. 去做
第30页
三、项目任务
一、软件界面人机交互的继续优化:实验4-1.c 功能: 显示主界面,并调用学生成绩管理子系统,学生
第20页
典型循环问题的算法_迭代法(必记算法)
【例3】裴波那契(Fibonacci)数列的第1、2项分别为 1、1,以后各项的值均是其前两项之和。求前30项菲 波那契数。
我们可以用图解方法来表示各个月的兔子对数。
问第几题个的月提出小:兔子对数 中兔子对数 老兔子对数 兔子对数
1 斐波那契(1Fibonacci)0是中世纪时0意大利的数1学家,他
if(f==1) printf("%5d",n);
/*是素数则输出*/
}
}
第16页
穷举法
【例2】用0--9这十个数字可以组成多少无重复 的三位数?
分析:
对于本问题,列出所有三位数的可能值,对每 个数进行测试判断,若它的三个数字互不相同,即 为所求,否则不是所求的数。
(1)确定范围
for(x=100;x<=999;x++)
f1=f2;f2=f3; f3=f1+f2;
初值:
f1=1; f2=1
递推
迭代公式: f3=f1+f2; f1=f2;f2=f3;
循环条件: k<=30
数列: 1 1 2 3 5 8 13 21 34 55 89 144 233
……
第22页
总结: 编程方法: “迭代法” (“递推法”或“辗转法”) 思想: 就是从初值出发,归纳出新值与旧值间的关系, 直到求出所需值为止。新值的求出依赖于旧值,不知 道旧值,无法推导出新值。数学上递推公式正是这一 类问题。 迭代法的三个条件: 初值、迭代公式和循环条件
/* 正负相间 */
sum = sum+temp*(1.0/i);
/* 不断累加 */
i = i+2;
/* 步长为2 */
}while( fabs(1.0/i)>=1e-6);
/* 循环条件 */
sum = sum*4;
/* 计算pi */
printf("sum=%f\n ",sum);
/* 输出pi */
递推
第24页
二、2.累加问题
【例1】求累乘积的和(1!+2!+3!+4!+5!+ …﹢n!)。
i(循环变量) temp(加数) sum(和)
int i, n,temp=1,sum=0;
int i,n,sum=0; scanf("%d",&n); for(i=1;i<=n;i++)
sum=sum+i; printf("其和是%d\n",sum);
总结:穷举法的要领:(1)确定范围; (2)验证条件
第19页
迭代法 Iteration
❖ 迭代是通过循环不断由旧 ❖ 如人口每年按2%增长,
值推导新值,并最后求解 现在人口有12亿,10年
的过程。
后人口有多少?
迭代法有三个要点:
⒈迭代初值(边界条件)。 ⒉迭代公式。 ⒊迭代次数(或条件)。
m=12 m= m*(1+2%) n=10
1 1 1 1
4 357
i=1,s=0; do
int i=1, temp=-1;
{
float sum=0.0;
s=s+i;
do
i++;
{ temp = -temp; /* 正负相间 */ } while(i<=100);
sum = sum+temp*(1.0/i); /* 不断累加 */
i = i+2; }while( fabs(1.0/i)>=1e-6); /* 循环条件 */
总结:穷举法的要领:(1)确定范围; (2)验证条件
第14页
典型循环问题的算法_穷举法(必记算法)
【例1】求1-100以内的所有素数。
(1)确定范围
for(n=2;n<100;n++)
(2)验证条件
判断某数n是否为素数,是 素数则输出
第15页
#include "stdio.h"
#include "math.h"