简单数组 程序设计导论. 2 学习目标 数组的概念、定义和初始化 数组的概念、定义和初始化 二维数组 二维数组 数组的排序问题 数组的排序问题 筛法求素数 筛法求素数.

Slides:



Advertisements
Similar presentations
质数和合数 中心小学 顾禹 人教版小学五年级数学下册 一、激趣导入 提示:密码是一个三位 数,它既是一个偶数, 又是 5 的倍数;最高位是 9 的最大因数;中间一位 是最小的质数。你能打 开密码锁吗?
Advertisements

1 、谁能说说什么是因数? 在整数范围内( 0 除外),如果甲数 能被乙数整除,我们就说甲数是乙数的 倍数,乙数是甲数的因数。 如: 12÷4=3 4 就是 12 的因数 2 、回顾一下,我们认识的自然数可以分 成几类? 3 、其实自然数还有一种新的分类方法, 你知道吗?这就是我们今天这节课的学.
因数与倍数 2 、 5 的倍数的特征
3 的倍数特征 抢三十
质数和合数 富县北教场小学 潘小娟 1 、什么叫因数? 2 、自然数分几类? 奇数和偶数. 3 、自然数还有一种新的分类方法, 就是按一个数的因数个数来分. 4 、写出 1—20 的因数。 前置性作业.
质数和合数 2 的因数( ) 6 的因数( ) 10 的因数 ( ) 12 的因数 ( ) 14 的因数 ( ) 11 的因数 ( ) 4 的因数( ) 9 的因数( ) 8 的因数( ) 7 的因数( ) 1 、 2 、 3 、 4 、 6 、 12 1 、 11 1 、 2 、 5 、 10.
本节课我们主要来学习素数和合 数,同学们要了解素数和合数的 定义,能够判断哪些是素数,哪 些是合数,知道 100 以内的素数。

3 的倍数的特征 的倍数有 : 。 5 的倍数有 : 。 既是 2 的倍数又是 5 的倍数有 : 。 12 , 18 , 20 , 48 , 60 , 72 , , 25 , 60 ,
因数与倍数 2 、 5 的倍数的特征 绿色圃中小学教育网 扶余市蔡家沟镇中心小学 雷可心.
2 和 5 的倍数的特征 运动热身 怎样找一个数的倍数? 从小到大写出 2 的倍数( 10 个): 写出 5 的倍数( 6 个) 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 , 20 5 , 10 , 15 , 20 , 25 , 30.
2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
数据结构的引入. 通讯录管理 社团机构管理 校园导航管理 通讯录管理 社团机构管理 校园导航管理.
因数与倍数 2 、 5 、 3 的倍数的特 征 新人教版五年级数学下册 执教者:佛山市高明区明城镇明城小学 谭道芬.
冀教版四年级数学上册 本节课我们主要来学习 2 、 3 、 5 的倍数特征,同学们要注意观察 和总结规律,掌握 2 、 3 、 5 的倍 数分别有什么特点,并且能够按 要求找出符合条件的数。
2 , 5 的倍数的特征. 我们可以先写出几个 5 的 倍数来看看。 对,先研究小范围的数, 再进行推广验证。
练一练: 在数轴上画出表示下列各数的点, 并指出这些点相互间的关系: -6 , 6 , -3 , 3 , -1.5, 1.5.
2 、 5 的倍数特征 集合 2 的倍数(要求) 在百数表上依次将 2 的倍数找出 并用红色的彩笔涂上颜色。
程序设计导论 ——第15讲 结构与结构数组.
程序设计导论 结构与结构数组.
§1 二阶与三阶行列式 ★二元线性方程组与二阶行列式 ★三阶行列式
二级指针与二维数组.
《高等数学》(理学) 常数项级数的概念 袁安锋
一维数组 乾坤以有亲可久; 君子以厚德载物。.
C语言程序设计.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
VB程序设计语言 主讲教师:王 杨.
EBNF 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
第5章 数组 Visual Basic程序设计.
管理信息结构SMI.
走进编程 程序的顺序结构(二).
辅导课程六.
元素替换法 ——行列式按行(列)展开(推论)
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第二章 Java语言基础.
第五章 习题课 电子信息与计算机科学系 曾庆尚.
第五章 数组 数组 一维数组 二维数组 主讲:李祥 时间:2015年10月.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
数列.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
第七章 数组.
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
第六章 数组.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第4章 Excel电子表格制作软件 4.4 函数(一).
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第九节 赋值运算符和赋值表达式.
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第二章 Java基本语法 讲师:复凡.
分数再认识三 真假带分数的练习课.
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第六章 Excel的应用 五、EXCEL的数据库功能 1、Excel的数据库及其结构 2、Excel下的数据排序 (1)Excel的字段名行
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
基本知识 数据类型、变量、常量、运算符.
找 因 数.
数据表示 第 2 讲.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
插入排序的正确性证明 以及各种改进方法.
考察点:switch\while\for System.in\Scanner char vs int
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
C语言基础学习 从外行到入门.
Presentation transcript:

简单数组 程序设计导论

2 学习目标 数组的概念、定义和初始化 数组的概念、定义和初始化 二维数组 二维数组 数组的排序问题 数组的排序问题 筛法求素数 筛法求素数

3 数组 一组类型相同的数据(变量) 一组类型相同的数据(变量) 方便对一组数据进行命名和访问 方便对一组数据进行命名和访问 数组名 + 下标 唯一确定数组中的一个元素 数组名 + 下标 唯一确定数组中的一个元素 通过数组名 + 下标可以访问数组中的任意元素 通过数组名 + 下标可以访问数组中的任意元素 应用: 应用: 对一组数求最值、平均值 对一组数求最值、平均值 对一组数据排序 对一组数据排序 …… ……

4 1.1 一维数组的定义 定义形式: 定义形式: 类型说明符数组名 [ 常量表达式 ] 例: 例: float sheep[10]; int a2001[1000]; 说明 说明 1. 数组名的第一个字符应为英文字母; 2. 用方括号将常量表达式括起; 3. 常量表达式定义了数组元素的个数; 4. 数组的下标从 0 开始,如果定义了 5 个元素,是从第 0 个元素到第 4 个元素 数组的下标从 0 开始,如果定义了 5 个元素,是从第 0 个元素到第 4 个元素 数组的下标从 0 开始,如果定义了 5 个元素,是从第 0 个元素到第 4 个元素 5. 常量表达式中不允许含有变量 常量表达式中不允许含有变量

5 例如: int a[5] 定义了 5 个数组元素如下 : a[0], a[1], a[2], a[3], a[4] 这是 5 个带下标的变量,这 5 个变量的类型是相同的

6 例如 int n; n = 5; n = 5; int a[n]; 不合法! 因为 n 是变量,不是常量 #define N 100 #define M 200 int a[ N ] ; long b[ N + M ] ; double g[ M + 6 ] ; 以上定义是合法的

7 1.2 数组初始化 声明的时候初始化 声明的时候初始化 使用 memset 函数 使用 memset 函数

8 直接声明时初始化例如 int a[5] = { 3, 5, 4, 1, 2 }; a[0] = 3; a[1] = 5; a[2] = 4; a[3] = 1; a[4] = 2;

9 1.2 数组元素的访问 访问一维数组中元素的形式: 访问一维数组中元素的形式: 数组名 [ 下标 ] 例如: 例如: a[0] = a[1] + a[2] ; a[0] = a[1] + a[2] ; 其中: 其中: 下标写在一个方括号中; 下标写在一个方括号中; 下标是整型表达式,如果为浮点型数据, C 截去小数部 分,自动取整。 下标是整型表达式,如果为浮点型数据, C 截去小数部 分,自动取整。 引用时下标不能超界,否则编译程序检查不出错误, 但执行时出现不可知结果。 引用时下标不能超界,否则编译程序检查不出错误, 但执行时出现不可知结果。

10 一维数组的访问 // List A of n integer elements has already been set int i; for (i=0;i<n;i++) printf(“%d “, A[i]); printf(“\n”);

11 程序举例:哪只羊最重? 中秋佳节,有贵客来到草原,主人要 从羊群中选一只肥羊宴请宾客,当然要选最 重者。 这样就要记录每只羊的重量,如果有 成千上万只羊,不可能用一般变量来记录。 可以用带有下标的变量,也就是这里要讲的 数组。 我们先看例子:用键盘输入 10 只羊的重量存放到 一个名为 sheep 的数组中

12

13 //************************************ //* 程序名: 5_1.cpp (数组示例) * //* 作 者: wuwh * //* 编制时间: 2002 年 9 月 20 日 * //* 主要功能:找出最重的羊 * //************************************ #include // 预编译命令 int main()// 主函数 { float sheep[10];// 数组,有 10 个浮点类型元素, // 用于存 10 只羊每一只的重量 float bigsheep=0.0;// 浮点类型变量,存放最肥羊的重量 int i=0, bigsheepNo=0;// 整型变量, i 用于计数循环, // bigsheepNo 用于记录最肥羊的号

14 memset ( sheep, 0, sizeof (sheep) );// 初始化数组元素为 0 memset ( sheep, 0, sizeof (sheep) );// 初始化数组元素为 0 for ( i=0; i<10; i=i+1 )// 计数循环 {// 循环,开始 printf(" 请输入羊的重量 sheep[%d]=", i);; // 提示用 scanf("%d", &sheep[i]);// 输入第 i 只羊的重量 if ( bigsheep < sheep[i] )// 如果第 i 只羊比当前最肥羊大 { bigsheep = sheep[i];// 让第 i 只羊为当前最肥羊 bigsheepNo = i;// 纪录第 i 只羊的编号 } } // 循环结束 // 输出最肥羊的重量 printf(" 最肥羊的重量为 %d\n", bigsheep); printf(" 最肥羊的重量为 %d\n", bigsheep); // 输出该羊的编号 printf(" 最肥羊的编号为 %d\n", bigsheepNo); printf(" 最肥羊的编号为 %d\n", bigsheepNo); return 0; return 0;}

15 使用 memset 函数 格式为 memset( 数组名, 初始化值, sizeof( 数组名 )) 举例: memset(sheep, 0, sizeof( sheep )); 含义是将名为 sheep 的数组中的全部元素均初 始化为 0 。更深一层是说让系统为 sheep[10] 所 分配的内存单元从 sheep[0] 为标志的地址单元 到该数组的全部地址单元都赋以 0 。调用此库 函数需要加入头文件 。

16  1 #include  1 #include int main() { int a[4];// 声明项 int i=0; for(i=0; i<4; i++) printf("%d\n", a[i]); return 0; }  2. 其他不变,改变声明项为 int a[4] = { 0, 1, 2, 3 }; 请自己上机做 7 个实验

17  3. 其他不变,改变声明项为 int a[4] = { 3, 8 };  4. 其他不变,改变声明项为 int a[4] = { 2, 4, 6, 8, 10 };  5. 其他不变,改变声明项为 int a[4] = { 2, 4, 6, d };  6. 其他不变,改变声明项为 int d; int d; int a[4] = { 2, 4, 6, d };  7. 其他不变,改变声明项为 int n=4; int a[n] = { 0, 1, 2, 3 };

18 练习 1. 给定一组整数,找到其中最小的整数,并 按照输入的逆序输出这组整数 1. 给定一组整数,找到其中最小的整数,并 按照输入的逆序输出这组整数 2. 用数组的方式来处理 Fibonacci 数列问题 2. 用数组的方式来处理 Fibonacci 数列问题

19 2 二维数组的概念及其定义 当一维数组的每个元素是一个一维数组时, 就构成了二维数组。二维数组与数学中的 矩阵概念相对应。 当一维数组的每个元素是一个一维数组时, 就构成了二维数组。二维数组与数学中的 矩阵概念相对应。 age[0] age[1] age[2] 一维数组二维数组 矩阵

二维数组的定义 二维数组的一般定义形式: 二维数组的一般定义形式: 类型标识符 数组名 [ 常量表达式 1 ] [ 常量表达式 2] 其中: 其中: 类型标识符:数组中每个元素的数据类型。可以 是 C 语言中所有的数据类型。 类型标识符:数组中每个元素的数据类型。可以 是 C 语言中所有的数据类型。 数组名:合法的标识符,数组名就是变量名。 数组名:合法的标识符,数组名就是变量名。 常量表达式 1 :又称行下标,指出二维数组中一 维数组元素的个数。 常量表达式 1 :又称行下标,指出二维数组中一 维数组元素的个数。 常量表达式 2 :又称行列标,表明每个一维数组 中的元素个数。 常量表达式 2 :又称行列标,表明每个一维数组 中的元素个数。

21 多维数组的定义 二维数组的每一个元素又是相同的类型的 一维数,就构成了三维数组, …… 依此类 推,就可构成四维或更多维的数组。 二维数组的每一个元素又是相同的类型的 一维数,就构成了三维数组, …… 依此类 推,就可构成四维或更多维的数组。 n 维数组的一般定义形式: n 维数组的一般定义形式: 类型标识符 数组名 [ 常量表达式 1] [ 常量表达式 2] …… [ 常量表达式 n] 其中:各参数的说明与二维数组相同。 其中:各参数的说明与二维数组相同。

22 三维数组的排列顺序 说明一个三维数组: 说明一个三维数组: int a[2][3][2]; 12 个元素在内存中排列顺 序如右图: 12 个元素在内存中排列顺 序如右图: a[0][0][0] a[0][0][1] a[0][1][0] a[0][1][1] a[0][2][0] a[0][2][1] a[1][0][0] a[1][0][1] a[1][1][0] a[1][1][1] a[1][2][0] a[1][2][1]

23 计算多维数组中元素位置的公式 一个 m×n 的二维数组 a ,其中 a[i][j] 在数组中 的位置为: 一个 m×n 的二维数组 a ,其中 a[i][j] 在数组中 的位置为: i ×n + j + 1 一个 m×n×u 的三维数组 a ,其中 a[i][j][k] 在数 组中的位置为: 一个 m×n×u 的三维数组 a ,其中 a[i][j][k] 在数 组中的位置为: i×n×u + j×n + k + 1

访问二维数组和多维数组 访问二维数组中元素的形式: 访问二维数组中元素的形式: 数组名 [ 下标 ][ 下标 ] 其中: 其中: 每一个下标写在一个方括号中; 每一个下标写在一个方括号中; 下标是整型表达式,如果为浮点型数据, C 截 去小数部分,自动取整。 下标是整型表达式,如果为浮点型数据, C 截 去小数部分,自动取整。 引用时下标不能超界,否则编译程序检查不出 错误,但执行时出现不可知结果。 引用时下标不能超界,否则编译程序检查不出 错误,但执行时出现不可知结果。

25 多维数组的遍历 遍历多维数组元素的最好算法就是利用嵌 套循环 遍历多维数组元素的最好算法就是利用嵌 套循环 一般的结构是: 一般的结构是: for( i = 0; i <  ; i++ ) for( j = 0; j <  ; j++ ) for( j = 0; j <  ; j++ ) for( k = 0; k <  ; k++ ) for( k = 0; k <  ; k++ )

26 二维数组和多维数组的初始化 二维数组和多维数组都可以初始化,与一 维数组初始化的差别是由于维数增多,初 始化时特别注意元素的排列顺序。 二维数组和多维数组都可以初始化,与一 维数组初始化的差别是由于维数增多,初 始化时特别注意元素的排列顺序。 例二维数组的初始化 例二维数组的初始化 int i[2][3]={{1,2,3},{4,5,6}}; 或写成 int i={ {1,2,3}, {4,5,6}}; {4,5,6}};或写成 int i[2][3]={1,2,3,4,5,6};

27 省略部分内容的二维数组初始化 初始化从第一个元素起连续的部分元素: 初始化从第一个元素起连续的部分元素: int i[2][3]={1,2,3,4}; 省略第一个维数(不能省略第二下标): 省略第一个维数(不能省略第二下标): int i[ ][3]={1,2,3,4,5,6};

28 三维数组的初始化 例: 例: int a[2][3][4]={ {{ 1, 2, 3, 4},{ 5, 6, 7, 8},{ 9, 10,11,12}} {{13,14,15,16},{17,18,19,20},{21,22,23,24}} }; };或 int a[2][3][4]={1,2,3,4,5,6,7,8,9,10,11,12,13, 14,15,16,17,18,19,20,21,22,23,24};

29 程序举例 有 n 个学生,每个学生学 m 门课,已知所 有学生的各门课的成绩,分别求每门课 的平均成绩和每个学生的平均成绩。设 各学生成绩如下: 有 n 个学生,每个学生学 m 门课,已知所 有学生的各门课的成绩,分别求每门课 的平均成绩和每个学生的平均成绩。设 各学生成绩如下:

30 解题思路 学生成绩是一张二维表,可按每一行为一 个学生的成绩,每一列是一门的成绩,存 储成绩表在二维数组中。 学生成绩是一张二维表,可按每一行为一 个学生的成绩,每一列是一门的成绩,存 储成绩表在二维数组中。 求每门课的平均成绩 求每门课的平均成绩 二维数组每列数据之和 / 学生人数 二维数组每列数据之和 / 学生人数 求每个学生的平均成时: 求每个学生的平均成时: 二维数组每行数据之和 / 课程数 二维数组每行数据之和 / 课程数

31 排序问题 将数组元素按照一定的顺序重新排列 将数组元素按照一定的顺序重新排列 例如:将几个数从大到小排序并输出 例如:将几个数从大到小排序并输出 a a 下标 下标 希望从大到小排成: a a 下标 下标

32 排序方法 选择排序 选择排序 插入排序 插入排序 冒泡排序 冒泡排序 …… ……

33 选择排序 从所有元素中选择一个最小元素放在 a[0] (即让最小元素 a[p] 与 a[0] 交换),作为第一 轮;第二轮是从 a[1] 开始到最后的各元素中 选择一个最小元素,放在 a[1] 中 … ;以下依 此类推。 n 个数要进行 (n-1) 轮。在第一轮中 要比较 (n-1) 次,第二轮中比较 (n-2) 次, … , 第 i 轮中比较 (n-i) 次。但在每一轮中只进行一 次数据交换 从所有元素中选择一个最小元素放在 a[0] (即让最小元素 a[p] 与 a[0] 交换),作为第一 轮;第二轮是从 a[1] 开始到最后的各元素中 选择一个最小元素,放在 a[1] 中 … ;以下依 此类推。 n 个数要进行 (n-1) 轮。在第一轮中 要比较 (n-1) 次,第二轮中比较 (n-2) 次, … , 第 i 轮中比较 (n-i) 次。但在每一轮中只进行一 次数据交换

冒泡算法图示

35

36

37 冒泡算法分析 从表中可以看出最小的一个数第一遍扫描就交换到 a[6] 中。 如果将 a[1] 视为水底, a[6] 视为水面:  最轻的 ( 最小的 ) 一个数 1 最先浮到水面,交换到 a[6];  次轻的 2 第二遍扫描交换到 a[5] ;  再轻的 3 第三遍扫描交换到 a[4] ; … 依此类推,有 6 个数,前 5 个数到位需 5 遍扫描,第 6 个最 重的数自然落在 a[1] 中。因此, 6 个数只需 5 遍扫描,即 j=n-1, n=6 。

38 再看在每遍扫描中,相邻两数组元素的比较次数。  当 j=1 时, i=1,2, …,n-j 。 n=6 时,比较 5 次之后 a[6] 中有一 个最小数到达,这时 a[6] 不必再参与比较了。  因此在第二遍搜索时, j=2, i=1,2, …,n-j ,即 i=1,2,3,4 。 比较 4 次之后次小的一个数到达了 a[5] 。这时 a[5] 不必再 参与比较了。  因此, j=3 时, i=1,2,3 ; j=4 时, i=1,2 ; j=5 时, i=1 。 理出上述规律后,程序就不难编了

39 冒泡排序算法设计 为了表述方便,定义以下 3 个变量: 为了表述方便,定义以下 3 个变量: n —— 待排序的数的个数,这里 n=6 n —— 待排序的数的个数,这里 n=6 j —— 扫描遍数, j=1,2, …,n-1 j —— 扫描遍数, j=1,2, …,n-1 i —— 第 j 遍扫描待比较元素的下标, i=1,2, …,n-j i —— 第 j 遍扫描待比较元素的下标, i=1,2, …,n-j

40 采用两重计数型循环,步骤如下 :  步骤 1 :将待排序的数据放入数组中;  步骤 2 :置 j 为 1 ;  步骤 3 : 让 i 从 1 到 n-j ,比较 a[i] 与 a[i+1] , 如果 a[i] >= a[i+1] ,位置不动; 如果 a[i] >= a[i+1] ,位置不动; 如果 a[i] < a[i+1] ,位置交换。 如果 a[i] < a[i+1] ,位置交换。  步骤 4 : 让 j = j+1 ;只要 j != n 返回步骤 3 ,当 j==n 时执行步骤 5  步骤 5 :输出排序结果

41 //************************************ //* 程 序 名: 5_4.cpp * //* 作 者: wuwh * //* 编制时间: 2002 年 9 月 22 日 * //* 主要功能:冒泡排序 * //************************************ #include // 预编译命令 int main()// 主函数 { int i=0, j=0, p=0, a[7];// 整型变量 memset( a, 0, sizeof(a) );// 整型数组初始化 for (i=1; i<=6; i++)// 键入 6 个数,放入 a 数组中 { printf( " 请输入待排序的数 a[%d]=", i);// 提示 scanf( "%d", &a[i]);// 用键盘输入整数赋给 a[i] } for ( j=1; j<=5; j++)// 冒泡排序,外层循环 for ( i=1; i<=6-j; i++ )// 内层循环 if ( a[i] < a[i+1] )// 如果 a[i] < a[i+1] { p = a[i];// 让 a[i] 与 a[i+1] 交换 p = a[i];// 让 a[i] 与 a[i+1] 交换 a[i] = a[i+1]; a[i] = a[i+1]; a[i+1] = p; a[i+1] = p;} for ( i=1; i<=6; i++)// 输出排序结果 printf( "%d\n", a[i]);// 输出 a[i] return 0; }

42 //************************************ //* 程 序 名: 5_4.cpp * //* 作 者: wuwh * //* 编制时间: 2002 年 9 月 22 日 * //* 主要功能:冒泡排序 * //************************************ #include // 预编译命令

43 int main() { int i = 0, j = 0, p = 0, a[ 7 ]; memset( a, 0, sizeof( a ) ); for ( i =1; i <=6; i++ ) { printf( " 请输入待排序的数 a[%d]=", i); printf( " 请输入待排序的数 a[%d]=", i); scanf( "%d", &a[i]); scanf( "%d", &a[i]);}

44 for ( j=1; j<=5; j++) // 外层循环 for ( i=1; i<=6-j; i++ ) // 内层循环 T if ( a[i] < a[i+1] ) F T if ( a[i] < a[i+1] ) F{ p = a[i]; p = a[i]; a[i] = a[i+1]; a[i] = a[i+1]; a[i+1] = p; a[i+1] = p;}

45 for ( j = 1; j <= 5; j++ )// 外层循 环 for ( i = 1; i <= 6-j; i++ )// 内层循环 for ( i = 1; i <= 6-j; i++ )// 内层循环 if ( a[ i ] < a[ i+1 ] ) // 让 a[i] 与 a[i+1] 交换 // 让 a[i] 与 a[i+1] 交换{ p = a[ i ]; p = a[ i ]; a[ i ] = a[ i+1 ]; a[ i ] = a[ i+1 ]; a[ i+1] = p; a[ i+1] = p;}

46 for ( i = 1; i <=6 ; i++) for ( i = 1; i <=6 ; i++) // 输出排序结果 printf( "%d\n", a[i]); }

47 筛法 例:使用筛法求 100 以内的所有素数。 思路  想象将 100 个数看作沙子和小石头子,让小石头子权 称素数;让沙子当作非素数。弄一个筛子,只要将 沙子筛走,剩下的就是素数了。  非素数一定是 2 、 3 、 4 …… 的倍数。  使用数组,让下标就是 100 以内的数,让数组元素的 值作为筛去与否的标志。比如筛去以后让元素值为 1 。

48 思路  想象将 100 个数看作沙子和小石头子,让小石头子权 称素数;让沙子当作非素数。弄一个筛子,只要将 沙子筛走,剩下的就是素数了。  非素数一定是 2 、 3 、 4 …… 的倍数。  使用数组,让下标就是 100 以内的数,让数组元素的 值作为筛去与否的标志。比如筛去以后让元素值为 1 。

49 方法的依据 1 至 100 这些自然数可以分为三类: 1 至 100 这些自然数可以分为三类: 单位数:仅有一个数 1 。 单位数:仅有一个数 1 。 素数:是这样一个数,它大于 1 ,且只有 1 和它自身这样两个正因数。 素数:是这样一个数,它大于 1 ,且只有 1 和它自身这样两个正因数。 合数:除了 1 和自身以外,还有其他正因数。 合数:除了 1 和自身以外,还有其他正因数。 1 不是素数,除 1 以外的自然数,当然只有素数与 合数。筛法实际上是筛去合数,留下素数。

50 效率的考虑 令 n 为合数(这里是 100 ), c 为 n 的最小正因数 令 n 为合数(这里是 100 ), c 为 n 的最小正因数 只要找到 c 就可以确认 n 为合数,将其筛去 只要找到 c 就可以确认 n 为合数,将其筛去 注意:要进行 “ 筛 ” 的 1 — 100 的数字是与数组 prime[101] 的下标相对应的,而每个数组元素的取 值只有 2 个:是 0 或 1 ,分别代表(标志)与下标相 对应的数字是素数或不是素数 注意:要进行 “ 筛 ” 的 1 — 100 的数字是与数组 prime[101] 的下标相对应的,而每个数组元素的取 值只有 2 个:是 0 或 1 ,分别代表(标志)与下标相 对应的数字是素数或不是素数

51 程序框图如下: 请同学来 分析左边 程序的结 构 从而了解 算法的设 计思路 为程序代 码的实现 创造条件 C 是合数, d 是正因数

52 该题目的筛法思路 第一块是一个计数型的循环语句,功能是将 prime 数组清零。 第一块是一个计数型的循环语句,功能是将 prime 数组清零。 prime[c] = 0;c = 2, 3, …,100 第二块是正因数 d 初始化为 d = 2 第二块是正因数 d 初始化为 d = 2 所有 d 的倍数将会被筛掉 所有 d 的倍数将会被筛掉 第三块是循环筛数。这里用了一个 do while 语句, 属于一种直到型循环,其一般形式为: 第三块是循环筛数。这里用了一个 do while 语句, 属于一种直到型循环,其一般形式为:do{循环体语句块} while ( 表达式 )