C++编程数据组织1-数组.ppt

上传人:wuy****n92 文档编号:66796248 上传时间:2022-12-21 格式:PPT 页数:83 大小:300.50KB
返回 下载 相关 举报
C++编程数据组织1-数组.ppt_第1页
第1页 / 共83页
C++编程数据组织1-数组.ppt_第2页
第2页 / 共83页
点击查看更多>>
资源描述

《C++编程数据组织1-数组.ppt》由会员分享,可在线阅读,更多相关《C++编程数据组织1-数组.ppt(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 6 数据数据的的组织组织与处理与处理(一)(一)数组数组1递推的解题思路递推的解题思路数组的概念、定义和初始化数组的概念、定义和初始化字符数组、字符串字符数组、字符串字符数组、字符串字符数组、字符串处理处理处理处理筛法的解题思路筛法的解题思路数组元素的查找(线性查找与二分查找)数组元素的查找(线性查找与二分查找)数组排序的思路(冒泡排序法)数组排序的思路(冒泡排序法)多维数组(多维数组(维以上)维以上)学 习 目 标2【任务任务任务任务 一一一一】A A、B B、C C、D D、E E 五人合伙夜间捕鱼,凌晨时五人合伙夜间捕鱼,凌晨时五人合伙夜间捕鱼,凌晨时五人合伙夜间捕鱼,凌晨时都疲惫不堪

2、,各自在湖边的树丛中找地方睡着了。都疲惫不堪,各自在湖边的树丛中找地方睡着了。都疲惫不堪,各自在湖边的树丛中找地方睡着了。都疲惫不堪,各自在湖边的树丛中找地方睡着了。日上三竿,日上三竿,日上三竿,日上三竿,A A第一个醒来,他将鱼平分作五份,第一个醒来,他将鱼平分作五份,第一个醒来,他将鱼平分作五份,第一个醒来,他将鱼平分作五份,把多余的一条扔回湖中,拿自己的一份回家去了。把多余的一条扔回湖中,拿自己的一份回家去了。把多余的一条扔回湖中,拿自己的一份回家去了。把多余的一条扔回湖中,拿自己的一份回家去了。B B第二个醒来,也将鱼平分为五份,扔掉多余的一第二个醒来,也将鱼平分为五份,扔掉多余的一第

3、二个醒来,也将鱼平分为五份,扔掉多余的一第二个醒来,也将鱼平分为五份,扔掉多余的一条,只拿走自己的一份。接着条,只拿走自己的一份。接着条,只拿走自己的一份。接着条,只拿走自己的一份。接着 C C、D D、E E 依次醒来,依次醒来,依次醒来,依次醒来,也都按同样的办法分鱼。也都按同样的办法分鱼。也都按同样的办法分鱼。也都按同样的办法分鱼。问五人至少合伙捕到多少条鱼?每个人醒来后问五人至少合伙捕到多少条鱼?每个人醒来后问五人至少合伙捕到多少条鱼?每个人醒来后问五人至少合伙捕到多少条鱼?每个人醒来后看到的鱼数是多少条?看到的鱼数是多少条?看到的鱼数是多少条?看到的鱼数是多少条?3为了解决上面这种类

4、型的问题,需要学为了解决上面这种类型的问题,需要学习和运用习和运用“递推递推”的思想,以及如何使的思想,以及如何使用用“数组数组”这种数据组织的形式来实现这种数据组织的形式来实现递推的过程。递推的过程。下面先来介绍下面先来介绍“递推递推”的算法思想。的算法思想。4 递推是计算机数值计算中的一个重要算法,递推是计算机数值计算中的一个重要算法,可以将复杂的运算化为若干重复的简单运算,可以将复杂的运算化为若干重复的简单运算,以便以便充分发挥计算机长于重复处理的特点充分发挥计算机长于重复处理的特点。通常,使用循环结构来实现重复处理。解通常,使用循环结构来实现重复处理。解决此类问题的关键是:分析简单情况

5、,归纳总决此类问题的关键是:分析简单情况,归纳总结出前后项的关系(通项公式)。结出前后项的关系(通项公式)。递递 推推5【任务任务 A A】求自然数求自然数n n的阶乘。的阶乘。任务分析:任务分析:令令fact(n)fact(n)表示表示n n的阶乘,依据后项与前项的关系,的阶乘,依据后项与前项的关系,可以写出下面的可以写出下面的“递推递推”公式:公式:fact(1)=1 -fact(1)=1 -起始条件(边界条件)起始条件(边界条件)fact(n)=n*fact(n-1)-fact(n)=n*fact(n-1)-通项公式通项公式算法实现:算法实现:根据前后项的关系,显然,用循环结构来实现这种

6、递推根据前后项的关系,显然,用循环结构来实现这种递推关系是非常自然的。请看下面的代码实现。关系是非常自然的。请看下面的代码实现。6#include using namespace std;int main()int N;cout please input N(N N;int fact;for(int n=1;n=N;n+)if(n=1)fact=1;elsefact=n*fact;/fact_n=n*fact_n_1cout fact(N )=fact endl;return 0;7【任务任务 B】王小二自夸刀功不错,有人放一张饼在王小二自夸刀功不错,有人放一张饼在砧板上,问他:砧板上,问他:

7、“饼不许离开砧板,如果切饼不许离开砧板,如果切刀,你最多能将饼分成多少块?刀,你最多能将饼分成多少块?”刀刀刀刀刀刀刀刀8在编程之前要找到规律在编程之前要找到规律分析:分析:令令q(n)q(n)表示切表示切n n刀能分成的块数。从前面的图中可刀能分成的块数。从前面的图中可以找出下列关系:以找出下列关系:q(1)=1+1=2q(1)=1+1=2 q(2)=1+1+2=4 q(2)=1+1+2=4 q(3)=1+1+2+3=7 q(3)=1+1+2+3=7 q(4)=1+1+2+3+4=11 q(4)=1+1+2+3+4=11由于要求最多的块数,所以每刀都是让每两条线都由于要求最多的块数,所以每刀

8、都是让每两条线都有交点。用归纳法不难得到:有交点。用归纳法不难得到:q(0)=1 q(0)=1 -初始条件(边界条件)初始条件(边界条件)q(n)=q(n-1)+n -q(n)=q(n-1)+n -通项公式通项公式9#include using namespace std;int main()int q;for(int n=0;n=100;n+)if(n=0)q=1;elseq=n+q;/q_n=n+q_n_1cout q(100)=q endl;return 0;1011数组是计算机语言提供的组织多个数据的一种重要方式:提供了多个同类型的数据(值)在内存中连续存放的工具提供了对无限量内存单元

9、进行高效“命名”的途径提供了在程序运行过程中动态改变“变量名称”的手段是一些重要算法思想的实现基础数组12类型说明符类型说明符类型说明符类型说明符 数组名数组名数组名数组名 常量表达式常量表达式常量表达式常量表达式 ;TYPE array_nameconst_expr;TYPE array_nameconst_expr;例:例:例:例:float sheep_weight10;float sheep_weight10;int _a20011000;int _a20011000;char student_name20;char student_name20;说明说明1.1.数组变量的名称,必须符

10、合语言对变数组变量的名称,必须符合语言对变数组变量的名称,必须符合语言对变数组变量的名称,必须符合语言对变量命名的要求;量命名的要求;量命名的要求;量命名的要求;2.2.用用用用方括号方括号方括号方括号将将将将常量表达式常量表达式常量表达式常量表达式括起;括起;括起;括起;3.3.常量表达式定义了数组元素的个数;常量表达式定义了数组元素的个数;常量表达式定义了数组元素的个数;常量表达式定义了数组元素的个数;数组的定义13注意:在使用注意:在使用VC+6.0VC+6.0进行编程时,数组元进行编程时,数组元素的数目,要使用常量表达式,其中不素的数目,要使用常量表达式,其中不能包含变量能包含变量例如

11、例如int n;n=5;int an;不合法!不合法!因为因为 n 是变量,不是常量是变量,不是常量VC+6.0:error C2057:expected constant expression14数组中每个元素所在的内存单元,可以通过“数组名位置下标”来访问(赋值、读取)。数组元素的位置下标从 0 开始计数。例如,int a5;定义了一个含有5个整数的数组,各元素的“变量名称”分别为:a0,a1,a2,a3,a4是5个带下标的变量,它们的类型是相同的。该数组的效果与下面的变量定义相同:int a0,a1,a2,a3,a4;数组中元素的“名称”15数组元素的位置关系与内存地址 a a0 a1

12、a2 a3 a4说明:说明:vva0a0a0a0元素的内存地址,即元素的内存地址,即元素的内存地址,即元素的内存地址,即&(a0)&(a0)&(a0)&(a0),也被称为,也被称为,也被称为,也被称为“数数数数组的地址(元素首地址)组的地址(元素首地址)组的地址(元素首地址)组的地址(元素首地址)”。vv数组名与下标一起使用时,是一个变量,表示下数组名与下标一起使用时,是一个变量,表示下数组名与下标一起使用时,是一个变量,表示下数组名与下标一起使用时,是一个变量,表示下标值指定位置的元素。标值指定位置的元素。标值指定位置的元素。标值指定位置的元素。vv数组名单独使用时,表示数组首地址,是一个指

13、数组名单独使用时,表示数组首地址,是一个指数组名单独使用时,表示数组首地址,是一个指数组名单独使用时,表示数组首地址,是一个指针常量(也称常量指针)。针常量(也称常量指针)。针常量(也称常量指针)。针常量(也称常量指针)。vvsizeof(a)=sizeof(a0)*numbersizeof(a)=sizeof(a0)*numbersizeof(a)=sizeof(a0)*numbersizeof(a)=sizeof(a0)*number16所有类型均可以用下面的格式来初始化数组(变量):所有类型均可以用下面的格式来初始化数组(变量):vtype_name array_nameN=v1,v2,

14、.,vN;type_name array_nameN=v1,v2,.,vN;其中,其中,v1,v2v1,v2等表示常量表达式。等表示常量表达式。例如:例如:int a5=3,5,4,1,2;char b5=c,h,i,n,a;如果是由字符(char)组成的数组,则还可以使用:vcharchar array_nameN=array_nameN=各种字符各种字符;例如:例如:charchar a5=china;a5=china;其初始化其初始化结果结果为:为:a0=c;a1=h;a4=a;数组变量的初始化17#include#include using namespace std;using na

15、mespace std;int main()int main()/在定义时设定值,被称为在定义时设定值,被称为“变量初始化变量初始化”char Achar A1010=B,e,i,J,i,=B,e,i,J,i,n,g;n,g;/一共只给出了一共只给出了7 7个字符个字符for(int i=0;ifor(int i=0;i1010;i+);i+)cout Ai cout Ai int(Ai)int(Ai)endl;endl;/强制类型转换,将字符值转换成整数值,即其强制类型转换,将字符值转换成整数值,即其ASCIIASCII码码 /语法格式:语法格式:dst_type(src_value)dst

16、_type(src_value)return 0;return 0;/char_test.cpp/char_test.cpp阅读示例代码阅读示例代码1,注意总结,注意总结1819#include#include using namespace std;using namespace std;int main()int main()/在定义时设定值,被称为在定义时设定值,被称为“变量初始化变量初始化”char Achar A1010=BeiJing;=BeiJing;/一共只给出了一共只给出了7 7个字符个字符for(int i=0;ifor(int i=0;i1010;i+);i+)cout

17、Ai cout Ai int(Ai)int(Ai)endl;endl;/强制类型转换,将字符值转换成整数值,即其强制类型转换,将字符值转换成整数值,即其ASCIIASCII码码 /语法格式:语法格式:dst_type(src_value)dst_type(src_value)return 0;return 0;/char_test_2.cpp/char_test_2.cpp阅读示例代码阅读示例代码2,注意总结,注意总结2021#include#include using namespace std;using namespace std;int main()int main()/在定义时设定值

18、,被称为在定义时设定值,被称为“变量初始化变量初始化”char A=BeiJing;char A=BeiJing;/一共给出了一共给出了7 7个字符个字符 int B=1,2,3,4,5;int B=1,2,3,4,5;/一共给出了一共给出了5 5个整数个整数 for(int i=0;i for(int i=0;i1010;i+);i+)cout Ai cout Ai int(Ai)int(Ai);cout Bi endl;cout Bi endl;return 0;return 0;/char_test_3.cpp/char_test_3.cpp阅读示例代码阅读示例代码3,注意总结,注意总结

19、2223#include#include using namespace std;using namespace std;int main()/int main()/在定义时设定值,被称为在定义时设定值,被称为“变量初始化变量初始化”char charA1=BeiJing;A1=BeiJing;/一共给出了一共给出了7 7个字符个字符 intintB1=1,2,3,4,5;/B1=1,2,3,4,5;/一共给出了一共给出了5 5个整数个整数 cout sizeof(A1)sizeof(A1)endl;cout sizeof(A1)sizeof(A1)endl;cout sizeof(B1)si

20、zeof(B1)endl;cout sizeof(B1)sizeof(B1)endl;char charA210=BeiJing;A210=BeiJing;/一共给出了一共给出了7 7个字符个字符 intintB210=1,2,3,4,5;B210=1,2,3,4,5;/一共给出了一共给出了5 5个整数个整数 cout sizeof(A2)sizeof(A2)endl;cout sizeof(A2)sizeof(A2)endl;cout sizeof(B2)sizeof(B2)endl;cout sizeof(B2)sizeof(B2)endl;return 0;return 0;/char_

21、test_4.cpp/char_test_4.cpp阅读示例代码阅读示例代码4,猜猜输出,猜猜输出24B eiJ in g 0A125总结说明1.数组变量在“初始化”时(即至少提供了一个初始值),如果提供的初始值数目少于数组元素的个数,则依下标大小顺序,从下标为0的元素开始,逐一设定初始值,缺少初始值的数组元素,将被编译器自动设置成0。以字符串常量方式对字符数组进行“初始化”时,也同样遵循遵循上述规则。2.如果初始化时不设定数组大小(元素数目),则编译器自动根据初始值的数目来设定数组的大小。如果是字符数组,则编译器设定的数组大小是:“字符串常量长度+1”,即不遵循不遵循上述规则!26数组变量的

22、赋值2728这是一个伪命题!这是一个伪命题!数组变量的赋值29所有所有类型的数组变量类型的数组变量均不可以均不可以直接直接赋值赋值数组变量的赋值30int a5;int a5;char b5;char b5;a=1,2,3,4,5;a=1,2,3,4,5;b=CHINA;b=CHINA;数组变量的赋值31v单独一个一个进行赋值单独一个一个进行赋值int a5;int a5;a0=1;a3=23;a0=1;a3=23;v使用使用forfor语句,连续赋值语句,连续赋值char a5;char a5;for(int i=0;i5;i+)for(int i=0;i5;i+)ai=A+i;ai=A+i

23、;数组中各元素的赋值32vv使用一些特殊的库函数使用一些特殊的库函数()使用()使用memsetmemset函数,格式为函数,格式为memset(memset(起始地址起始地址,初始值初始值,空间大小空间大小);举例:举例:memset(sheep,0,sizeof(sheep);memset(sheep,0,sizeof(sheep);将名为将名为 sheep sheep 的数组中的全部元素均初始化为的数组中的全部元素均初始化为 0 0。调用此库函数需要加入头文件调用此库函数需要加入头文件 。()使用字符串处理函数,例如:()使用字符串处理函数,例如:strcpy(strcpy(字符数组名,

24、字符串常量或变量字符数组名,字符串常量或变量););举例:举例:char school_name20;char school_name20;strcpy(school_name,Tsinghua);strcpy(school_name,Tsinghua);数组中各元素的赋值33#includeincludeincludeincludeusing namespace std;using namespace std;using namespace std;using namespace std;int main()int main()int main()int main()char hchar h

25、 =123456;123456;h h =abcdef;abcdef;coutcout h h endl;endl;return 0;return 0;程序会出什么问题?程序会出什么问题?Line 6:error:ISO C+forbids assignment of arrays34#includeincludeincludeinclude using namespace std;using namespace std;using namespace std;using namespace std;int main()int main()int main()int main()char hc

26、har h =123456;123456;h h =“abcef”;“abcef”;coutcout h h endl;endl;return 0;return 0;strcpy(h,abcdef);35v通过通过cincin操作,对字符数组变量进行操作,对字符数组变量进行“赋值赋值”数组中各元素的赋值#includeincludeusing namespace std;using namespace std;int main()int main()char h char h =123456789;123456789;cincin h;/h;/设设设设键入键入键入键入的是的是的是的是 abcd

27、efabcdef cout cout h h endl;/endl;/则则则则程序程序程序程序输出输出输出输出 abcdefabcdef return 0;return 0;如果键入如果键入如果键入如果键入的是的是的是的是 则则则则程序会输出什么?程序会输出什么?程序会输出什么?程序会输出什么?36v如果是字符数组(变量),则cout会将数组的所有元素一齐输出出来,字符之间无空格。v如果是其他类型的元素组成的数组(变量),则cout只会输出该数组变量的地址,也即数组第一个元素所在内存单元的地址。vcout是如何根据数据类型来决定输出方式的呢?这个问题,将在下学期面向对象程序设计中予以解答。数组

28、变量的“cout 输出”37#includeusing namespace std;int main()char h =tsinghua;h0=a;h1=b;h2=4;h3=7;h4=c;cout h endl;cout h endl;int a=1,2,3,4,5;int a=1,2,3,4,5;a0=79;a1=88;a0=79;a1=88;a2=34;a3=64;a2=34;a3=64;a4=99;a4=99;cout a endl;cout a endl;cout&(a0)=&(a0)cout&(a0)=&(a0)endl;endl;return 0;38上述结果说明:数组上述结果说明

29、:数组a的第一个元素的地址,与的第一个元素的地址,与a的值相等。的值相等。即即 cout a;与与 cout&(a0);等效。等效。39字符数组(字符串)的应用示例“老张开车去东北,撞了!老张开车去东北,撞了!肇事司机耍流氓,跑了!肇事司机耍流氓,跑了!”目击者对交警说:肇事汽车的号码为4位完全平方数,且数字从左到右一个比一个大。请帮交警算出肇事车的号码。40#include#include#include#include#include#include#include#includeusing namespace using namespace using namespace using n

30、amespace std;std;std;std;void void void void find_itfind_itfind_itfind_it()()()()/./././.int main()int main()int main()int main()find_itfind_itfind_itfind_it(););););return 0;return 0;return 0;return 0;41思路思路I:令令 n 为车号为车号 n为为 4 位数位数 n=i*i,i=32,33,99(31*31=961)对对 i 进行枚举,得不同的进行枚举,得不同的 n,对每个对每个 n n,检查,

31、检查 n n的各位,的各位,从高位到低位从高位到低位,是否一个比一个是否一个比一个大大?即,即,低位的数值最大。低位的数值最大。n n n n3 3 3 3 n n2 2 2 2 n n1 1 1 1 n n0 0 0 0 n n3 3 3 3 n n2 2 2 2 n n1 1 1 1 n n0 0 0 0 42void void void void find_itfind_itfind_itfind_it()()()()for(int i=for(int i=for(int i=for(int i=32323232;i;i;i;i100100100100;i+);i+);i+);i+)in

32、t n=i*i;int n=i*i;int n=i*i;int n=i*i;if(n/1000)(n/100%10)&if(n/1000)(n/100%10)&if(n/1000)(n/100%10)&if(n/1000)(n/100%10)&(n/100%10)(n/10%10)&(n/100%10)(n/10%10)&(n/100%10)(n/10%10)&(n/100%10)(n/10%10)&(n/10%10)(n%10)(n/10%10)(n%10)(n/10%10)(n%10)(n/10%10)(n%10)cout cout cout cout 肇事汽车号码为肇事汽车号码为肇事汽车

33、号码为肇事汽车号码为 n endl;n endl;n endl;n endl;四位数的千位数字四位数的千位数字四位数的千位数字四位数的千位数字 n3=n/1000n3=n/1000n3=n/1000n3=n/1000百位数字百位数字百位数字百位数字 n2=n/100%10n2=n/100%10n2=n/100%10n2=n/100%10十位数字十位数字十位数字十位数字 n1=n/10%10n1=n/10%10n1=n/10%10n1=n/10%10个位数字个位数字个位数字个位数字 n0=n%10n0=n%10n0=n%10n0=n%1043现在,车号升级啦!变成了现在,车号升级啦!变成了五五位

34、!位!闯祸的车号居然还是一个完全平方数闯祸的车号居然还是一个完全平方数!依然还是从高位到低位一个比一个依然还是从高位到低位一个比一个大大!(越来越大)(越来越大)这时,程序该怎么编(或修改)呢?这时,程序该怎么编(或修改)呢?四位数的千位数字四位数的千位数字四位数的千位数字四位数的千位数字 n3=n/1000n3=n/1000n3=n/1000n3=n/1000百位数字百位数字百位数字百位数字 n2=n/100%10n2=n/100%10n2=n/100%10n2=n/100%10十位数字十位数字十位数字十位数字 n1=n/10%10n1=n/10%10n1=n/10%10n1=n/10%10

35、个位数字个位数字个位数字个位数字 n0=n%10n0=n%10n0=n%10n0=n%1044思路思路II(还是以四位数的车号为例说明)(还是以四位数的车号为例说明):令令令令 n n 为车号为车号为车号为车号 n n为为为为 4 4 位数,位数,位数,位数,n=i*in=i*i i=i=3232,33,33,9999(31*31=961)(31*31=961)枚举枚举枚举枚举 i i 到到到到 n,n,查查查查 n n 从高位到低位从高位到低位从高位到低位从高位到低位,是否一个比一个小是否一个比一个小是否一个比一个小是否一个比一个小 将将将将 n n n n 分解为分解为分解为分解为 4 4

36、 4 4 个数字字符个数字字符个数字字符个数字字符:char*itoa(int value,char*string,int radix)char*itoa(int value,char*string,int radix)value:value:待转换整数待转换整数待转换整数待转换整数string:string:存放转换结果的字符串指针存放转换结果的字符串指针存放转换结果的字符串指针存放转换结果的字符串指针radix:2-16radix:2-16进制整数进制整数进制整数进制整数45 n=i*i i 3 3 n 1 0 8 9 itoa(n,buf,10);buf 1 0 8 9 0 0 1 2

37、3 446#include#includeusing namespace std;int main()char buf5;/定义数组定义数组 int i=0,n=0;/定义整数变量定义整数变量47for(i=32;i100;i+)for(i=32;i100;i+)/计数循环计数循环计数循环计数循环 n=i*i;n=i*i;/构造构造构造构造4 4位数位数位数位数n n itoa(n,buf,10);itoa(n,buf,10);/把把把把10 10 进制数进制数进制数进制数 n n 转换为字符串放入转换为字符串放入转换为字符串放入转换为字符串放入 buf buf 数组数组数组数组 if(buf

38、0buf1)&if(buf0buf1)&/如果如果如果如果bufbuf中的中的中的中的 (buf1buf2)&(buf1buf2)&/字符串从左至右字符串从左至右字符串从左至右字符串从左至右 (buf2buf3)(buf2buf3)/一个比一个小一个比一个小一个比一个小一个比一个小cout cout 肇事汽车号码为肇事汽车号码为肇事汽车号码为肇事汽车号码为 /则输出则输出则输出则输出 n endl;n endl;/_if_/_if_ /_for_ /_for_ return 0;return 0;能把程序改得更简洁清晰吗?能把程序改得更简洁清晰吗?能把程序改得更简洁清晰吗?能把程序改得更简洁清

39、晰吗?48for(i=32;i100;i+)for(i=32;i100;i+)n=i*i;n=i*i;itoa(n,buf,10);itoa(n,buf,10);int j;int j;int j;int j;for(j=0;j 3;j+)for(j=0;j 3;j+)for(j=0;j 3;j+)for(j=0;j=bufj+1)break;if(bufj=bufj+1)break;if(bufj=bufj+1)break;if(bufj=bufj+1)break;/若若若若n n n n符合要求,则符合要求,则符合要求,则符合要求,则FORFORFORFOR循环会全部执行完!循环会全部执行

40、完!循环会全部执行完!循环会全部执行完!if(j=3)if(j=3)if(j=3)if(j=3)cout cout 肇事汽车号码为肇事汽车号码为肇事汽车号码为肇事汽车号码为 n endl;n endl;/_for_ /_for_ return 0;return 0;修改后的程序,是不是更简洁清晰了?修改后的程序,是不是更简洁清晰了?修改后的程序,是不是更简洁清晰了?修改后的程序,是不是更简洁清晰了?49for(i=32;i100;i+)for(i=32;i100;i+)n=i*i;n=i*i;itoa(n,buf,10);itoa(n,buf,10);int j;int j;int j;int

41、 j;for(j=0;j 3;j+)for(j=0;j 3;j+)for(j=0;j 3;j+)for(j=0;j=bufj+1)break;if(bufj=bufj+1)break;if(bufj=bufj+1)break;if(bufj=bufj+1)break;/若若若若n n n n符合要求,则符合要求,则符合要求,则符合要求,则FORFORFORFOR循环会全部执行完!循环会全部执行完!循环会全部执行完!循环会全部执行完!if(j=3)if(j=3)if(j=3)if(j=3)cout cout 肇事汽车号码为肇事汽车号码为肇事汽车号码为肇事汽车号码为 n endl;n endl;/

42、_for_ /_for_ return 0;return 0;想一想:想一想:想一想:想一想:如何把程序改成能解决五位数如何把程序改成能解决五位数如何把程序改成能解决五位数如何把程序改成能解决五位数(或更多)(或更多)(或更多)(或更多)的车号呢?的车号呢?的车号呢?的车号呢?50for(i=32;i100;i+)for(i=32;i100;i+)n=i*i;n=i*i;itoa(n,buf,10);itoa(n,buf,10);int j;int j;int j;int j;for(j=0;j 3;j+)for(j=0;j 3;j+)for(j=0;j 3;j+)for(j=0;j=bufj

43、+1)break;if(bufj=bufj+1)break;if(bufj=bufj+1)break;if(bufj=bufj+1)break;/若若若若n n n n符合要求,则符合要求,则符合要求,则符合要求,则FORFORFORFOR循环会全部执行完!循环会全部执行完!循环会全部执行完!循环会全部执行完!if(j=3)if(j=3)if(j=3)if(j=3)cout cout 肇事汽车号码为肇事汽车号码为肇事汽车号码为肇事汽车号码为 n endl;n =1;i-)fishi+1%4!=0 true fales break;fishi=1+fishi+1*5/4;do while(i=1

44、)定义数组并初始化定义数组并初始化输出计算结果输出计算结果57上上上上图的说明:图的说明:图的说明:图的说明:该图可分为三部分该图可分为三部分(1)是说明部分:包含定义数组是说明部分:包含定义数组 fish6,并初始化为,并初始化为 1 和定义循环控制变量和定义循环控制变量 i,并初始化为,并初始化为 0。(2)是是 do.while 直到型循环,其循环体又含两块:直到型循环,其循环体又含两块:(2.1)是枚举过程中的是枚举过程中的 fish5 的初值设置,一开始的初值设置,一开始 fish5=1+5;以后每次增以后每次增 5。(2.2)是一个是一个 for 循环,循环,i的初值为的初值为 4

45、,终值为,终值为 1,步,步长为长为-1,该循环的循环体是一个分支语句,如果,该循环的循环体是一个分支语句,如果 fishi+1不能被不能被 4 整除,则跳出整除,则跳出 for 循环(使用循环(使用 break 语句语句;)否则,从)否则,从 fishi+1 算出算出fishi。58当当 break 语句让程序退出循环时,意味着某人语句让程序退出循环时,意味着某人看到的鱼数不是整数,当然不是所求,必须令看到的鱼数不是整数,当然不是所求,必须令fish 5 加加 5 后再试,即重新进入直到型循环后再试,即重新进入直到型循环 do while 的的循环体。循环体。当正常退出当正常退出 for 循

46、环时,一定是控制变量循环时,一定是控制变量 i 从从初值初值 4,一步一步执行到终值,一步一步执行到终值 1,每一步的鱼数均为,每一步的鱼数均为整数,最后整数,最后 i=0,表示计算完毕,且也达到了退出,表示计算完毕,且也达到了退出直到型循环的条件。直到型循环的条件。(3)输出计算结果输出计算结果59#include using namespace std;int main()int fish6=1,1,1,1,1,1;/记录每人醒来后看到的鱼数记录每人醒来后看到的鱼数 int i=0;do fish5=fish5+5;/让让E看到的鱼数增看到的鱼数增5。for(i=4;i=1;i-)if(f

47、ishi+1%4!=0)break;/跳出跳出for循环循环elsefishi=fishi+1*5/4+1;/计算第计算第i人看到的鱼数人看到的鱼数 while(i=1);/当当 i=1 继续做继续做do循环循环 /输出计算结果输出计算结果 for(i=1;i=5;i+)cout fishi endl;return 0;60/*/*/*/*程程程程 序序序序 名:名:名:名:9_9_.cpp.cpp(五人合伙捕鱼)(五人合伙捕鱼)(五人合伙捕鱼)(五人合伙捕鱼)*/*/*作作作作 者:者:者:者:wuwh *wuwh */*/*编制时间:编制时间:编制时间:编制时间:20022002年年年年1

48、010月月月月2 2日日日日 */*/*主要功能:递推算法的实现主要功能:递推算法的实现主要功能:递推算法的实现主要功能:递推算法的实现 */*/*#include#include /预编译命令预编译命令预编译命令预编译命令using namespace std;using namespace std;int main()int main()/主函数主函数主函数主函数 int fish6=1,1,1,1,1,1;int fish6=1,1,1,1,1,1;/整型数组,记录每人整型数组,记录每人整型数组,记录每人整型数组,记录每人 /醒来后看到的鱼数醒来后看到的鱼数醒来后看到的鱼数醒来后看到的鱼

49、数 int i=0;int i=0;61do fish5=fish5+5;for(i=4;i=1;i=i-1)if(fishi+1%4!=0)break;/跳出跳出for循环循环 else fishi=fishi+1*5/4+1;while(i=1);62 初始化初始化初始化初始化E=1 E=E+5E=1 E=E+5 break break yes yes 递递递递 E E%4!=0 E E%4!=0 D=(E*5/4)+1 no D=(E*5/4)+1 no推推推推 yes yes D D%4!=0 D D%4!=0 方方方方 C=(D*5/4)+1 noC=(D*5/4)+1 no yes

50、 yes向向向向 C C%4!=0 C C%4!=0 B=B=(C*5/4)+1 no(C*5/4)+1 no yes yes B B%4!=0 B B%4!=0 A=A=(B*5/4)+1 no(B*5/4)+1 no A A 6331212496199615961276输出结果输出结果64#include using namespace std;int main()int fisher6;/五个人看到的五个人看到的鱼鱼数数 for(int num=6;num+=5)/对对各种可能性各种可能性进进行枚行枚举举 int n;for(n=5;n=1;n-)/对对五个人看到的五个人看到的鱼鱼数数进

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁