[C程序设计]电子教案CH01概述
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
③ 从最后一位学生到第一位学生依次与输入成绩进行比较, 以下标0处的数组元素作为监视哨
• 考虑到本例的score数组下标0处并未存储任何数据元素, 我们可以以它作为监视哨,从而提高程序的效率
4.1.3 一维数组的应用
例4.1 算法分析
③ 从最后一位学生到第一位学生依次与输入成绩进行比较,
以下标0处的数组元素作为监视哨
• 先用键盘输入10位学生的 成 绩 , 分 别 存 放 到 score 数组的相应下标变量中, 并找出最高分,
• 然后再依次将10位学生的 成绩与最高分比较,输出 得分为最高分的学生的序 号,
• 最后输出获得最高分的学 生人数。
4.1.3 一维数组的应用
任务4.1 程序4_1.cpp
变量定义及数组元素输入
算法分析:
首先需解决学生成绩的存储问题
可以用10个变量,分别取名为score1,score2,……,score10来 存储10名学生的成绩, 但程序扩展性很差
使用一个包含10个元素的数组,将每位学生的成绩存储到相应 的数组元素中
4.1.1 一维数组的定义及初始化
1. 数组的声明 类型说明符 数组名[常量表达式];
int score[5] = {78, 89, 98}ቤተ መጻሕፍቲ ባይዱ (3)赋初值个数与数组长度
int score[2] = {78, 89,98}; int score[] = {78, 89, 98};
4.1.2 一维数组元素的引用
一维数组下标变量的格式 数组名[下标]
例如: int score[10]={0}, i=1; score[1]; score[i]; score[10];
第四章 数组和结构
❖ 一维数组 ❖ 字符数组 ❖ 结构 ❖ 结构数组和二维数组 ❖ 程序举例 ❖ 本章小结
4.1 一维数组
➢ 一维数组的定义和初始化 ➢ 一维数组元素的引用 ➢ 一维数组的应用
4.1 一维数组
任务4.1 半期考试结束了,教师想看看C语言这门课程的最高 分,以及有哪几位学生得到了这个最高分。试编程解决这个问 题,为简单起见,假设班上共有10人。
以确定是否交换) (4)如果a[j]>a[j+1](逆序),则交换之 (5)输出排序结果
4.1.3 一维数组的应用
例4.3 给定由6个成绩组成的序列{92,88,74,93,85,79}, 将其按从小到大的顺序排列。
算法分析: 算法的NS图
4.1.3 一维数组的应用
例4.3 给定由6个成绩组成的序列{92,88,74,93,85,79}, 将其按从小到大的顺序排列。
while(low <= high) // 只有待查找区间不为空,就循环
{
mid = (low + high) / 2; // 计算中间元素下标
if(score[mid] == x) // 中间元素与待查找元素相等,查找成功
break;
// 退出循环
else if(score[mid] > x) // 中间元素较大,查找前半区间
low
mid
high low
mid
high
5 13 17 42 46 55 70 94
5 13 17 42 46 55 70 94
low mid
highlow mid high 5 13 17 42 46 55 70 94
查找成功
high low 查找失败
4.1.3 一维数组的应用
例4.3 给定由6个成绩组成的序列{92,88,74,93,85,79}, 将其按从小到大的顺序排列。
score[0] = x;
// 在下标处设置监视哨
for(i = n; score[i] != x; i--);
// 计数循环,从后到前循环比较当前元素,循环体为空语句
if(i >= 1)
{
cout<<"查找成功,待查找成绩是第“
<<i<<" 位学生的成绩"<<endl;
}
else
{
cout<<"未查找到该成绩!"<<endl;
}
else
{ // 待查找区间为空,查找不成功
cout<<"未查找到该成绩!"<<endl;
}
4.1.3 一维数组的应用
例4.2折半查找
折半查找的查找效率要远高于顺序查找
折半查找需要存储数据的数组已经有序
x=55
x=12
5 13 17 42 46 55 70 94
5 13 17 42 46 55 70 94
核心程序段(以数组尾部为水面) for(i = 1; i < n; i++) { for(j = 1; j <= n - i; j++) { // 从前向后进行扫描 if(score[j] > score[j + 1]) { // 相邻元素逆序,则交换 score[0] = score[j]; score[j] = score[j + 1]; score[j + 1] = score[0]; } } }
n个数排序,至多只需进行 n-1遍排序
每遍扫描中,从第1个元素 开始,依次与相邻元素进 行比较,逆序则交换
4.1.3 一维数组的应用
例4.3 给定由6个成绩组成的序列{92,88,74,93,85,79}, 将其按从小到大的顺序排列。
算法分析: 为了表述方便,定义以下3个变量
(1)待排序的数的个数n(此处为6) (2)扫描遍数i(i=1,2,3,…n-1) (3)每遍扫描时待比较元素的下标j(j=1,2,3,…n-i) 算法步骤如下 (1)将待排序的数据放入数组中 (2)让i从1到n-1循环做步骤(3)(每遍扫描的循环) (3)让j从1到n-i做步骤(4)(依次比较两个相邻数组元素,
如果中间元素与待查找元素相等,则查找成功
如果中间元素较大,则待查找元素在前半区间,查找前半区间
如果中间元素较小,继续查找后半区间。
使用两个整型变量分别表示区间的上界和下界。
如果区间的上界小于下界,说明区间为空,查找失败。
比较后,要查找前半区间,只需修改区间的上界;要查找后半 区间,只需修改区间的下界。
这个算法会首先将最小元素交换到score[6]处,然后将次小元 素交换到score[5]处,以此类推,最后得到排好序的数组
4.1.3 一维数组的应用
例4.3 给定由6个成绩组成的序列{92,88,74,93,85,79}, 将其按从小到大的顺序排列。
4.1.3 一维数组的应用
例4.3 冒泡排序 算法分析
通过一遍扫描可将最小的 数交换到score[6],
再进行一遍扫描,次小的 数被交换到score[5]。
如 果 将 score[1] 视 为 水 底 , score[6] 视 为 水 面 , 则 最 大的数最先浮到水面,然 后次大的数也浮到水 面……
high = mid - 1; // 修改待查找区间上界
else
// 中间元素较小,查找后半区间
low = mid + 1;
// 修改待查找区间下界
}
if(low <= high)
{ // 待查找区间不为空,查找成功
cout<<"查找成功,待查找成绩是第“
<<mid<<" 位学生的成绩"<<endl;
• 可采用计数循环,依次将数组元素与输入的数进行比较, 如果相等则终止循环。如果元素比较完还未找到输入的数, 则输出0。
4.1.3 一维数组的应用
例4.1 算法分析
① 从第一位学生到最后一位学生依次与输入成绩进行比较
for(i = 1; i <= n; i++)// 计数循环,从前到后进行循环
{
if(score[i] == x) // 如果当前成绩等于待查找成绩
{
// 开始循环
cout<<"请输入第"<<i<<"位学生的成绩:";
cin>>score[i]; // 输入第i位学生的成绩
if(maxScore < score[i])
{ // 如果第i位学生的成绩高于原最高分
maxScore = score[i]; // 修改最高分
}
}
// 结束循环
4.1.3 一维数组的应用
① 类型说明符定义数组的基类型,即数组中各元素的类型。 ② 数组名的第一个字符最好为英文字母,其他要求与定义变量
名时相同。 ③ 常量表达式定义数组中可以放多少元素。必须是整型常量。 ④ 用方括号将常量表达式括起。 ⑤ 数组下标从0开始。如果定义了10个元素,是从第0个元素
到第9个元素。 ⑥ 常量表达式中不允许包含变量,但可以使用常变量。
break;
// 则退出循环
}
if(i <= n)
{
cout<<"查找成功,待查找成绩是第“
<<i<<" 位学生的成绩"<<endl;
}
else
{
cout<<"未查找到该成绩!"<<endl;
}
4.1.3 一维数组的应用
例4.1 算法分析
② 从最后一位学生到第一位学生依次与输入成绩进行比较
for(i = n; i >= 1; i--) // 计数循环,从前到后进行循环
算法分析:
• 冒泡排序法是一种交换排序方法,它的思路是:从序列的 一端开始,依次将相邻两个元素比较,当发现它们逆序 (即不合顺序)时就进行一次交换,本例需将较大的数调 到后面去,所以相邻元素中前者较大即为逆序。这样就像 水箱里的气泡一样,一个个地上浮到水面上,直到每个气 泡都到达它的平衡位置。
• 为实现这一算法,首先用一维数组score存储待排序的序列, 为了以后查找的方便,成绩从下标1处开始存放,下标0处 不存放数据。
注意:C语言不检查数组边界,程序可以在数组两边越界,写入 其他变量,甚至写入程序代码段。如果使用了负数下标或超 过数组长度的下标,C仍计算这个下标的位置,并使用它, 在运行和编译时也没有任何错误提示,程序继续运行,并访 问别的变量的存储空间或根本不存在的存储空间。
4.1.3 一维数组的应用
任务4.1算法分析
}
4.1.3 一维数组的应用
例4.2 有10位学生的成绩存放在数组score中,从键盘输入1个 数,使用折半查找法查找这个成绩是否在数组中,如果在, 输出其下标,如果不在,输出0。数组的下标i表示第i位学 生的成绩,数组的下标0处不存储成绩。
算法分析:
先找到中间元素,再根据中间元素与待查找元素的比较结果缩 小一半的待查找区间,从而提高查找的效率。
}
}
// 循环结束
4.1.3 一维数组的应用
例4.1 有10位学生的成绩存放在数组score中,从键盘输入1个 数,查找这个成绩是否在数组中,如果在,输出其下标, 如果不在,输出0。数组的下标i表示第i位学生的成绩,数 组的下标0处不存储成绩。
算法分析:
• 将第i位学生的成绩存放到下标i处,下标0处的数组元素就 不存放具体的成绩信息。这样,学生的序号和数组下标之 间的对应关系更自然
任务4.1 程序4_1.cpp
求最高分人数
for(i = 0; i < n; i++) // 计数循环
{
// 循环开始
if(score[i] == maxScore)
{ // 如果第i位学生的成绩等于最高分
maxStudent++;
// 得最高分的学生人数增1
cout<<i<<endl; // 输出该生序号
4.1.3 一维数组的应用
例4.2 有10位学生的成绩存放在数组score中,从键盘输入1个 数,使用折半查找法查找这个成绩是否在数组中,如果在, 输出其下标,如果不在,输出0。数组的下标i表示第i位学 生的成绩,数组的下标0处不存储成绩。
算法的NS图
4.1.3 一维数组的应用
例4.2折半查找 核心程序段
int score[10]; int n=10; int score[n]; const int n=10; int score[n];
4.1.1 一维数组的定义及初始化
2. 数组元素的初始化 (1)给全部数组元素赋初值
int score[3] = {78, 89, 98}; (2)给部分数组元素赋初值
const int n = 10; // 使用常变量定义学生人数
int score[n];
// 定义成绩数组,有n个整型元素
int maxScore = 0; // 最高分,并初始化为0
int maxStudent = 0; // 得到最高分的学生人数
int i;
// 循环变量
for(i = 0; i < n; i++) // 计数循环
{
if(score[i] == x) // 如果当前成绩等于待查找成绩
break;
// 则退出循环
}
if(i >= 1)
{
cout<<"查找成功,待查找成绩是第 “
<<i<<" 位学生的成绩"<<endl;
}
else
{
cout<<"未查找到该成绩!"<<endl;
}
4.1.3 一维数组的应用
例4.1 算法分析
• 考虑到本例的score数组下标0处并未存储任何数据元素, 我们可以以它作为监视哨,从而提高程序的效率
4.1.3 一维数组的应用
例4.1 算法分析
③ 从最后一位学生到第一位学生依次与输入成绩进行比较,
以下标0处的数组元素作为监视哨
• 先用键盘输入10位学生的 成 绩 , 分 别 存 放 到 score 数组的相应下标变量中, 并找出最高分,
• 然后再依次将10位学生的 成绩与最高分比较,输出 得分为最高分的学生的序 号,
• 最后输出获得最高分的学 生人数。
4.1.3 一维数组的应用
任务4.1 程序4_1.cpp
变量定义及数组元素输入
算法分析:
首先需解决学生成绩的存储问题
可以用10个变量,分别取名为score1,score2,……,score10来 存储10名学生的成绩, 但程序扩展性很差
使用一个包含10个元素的数组,将每位学生的成绩存储到相应 的数组元素中
4.1.1 一维数组的定义及初始化
1. 数组的声明 类型说明符 数组名[常量表达式];
int score[5] = {78, 89, 98}ቤተ መጻሕፍቲ ባይዱ (3)赋初值个数与数组长度
int score[2] = {78, 89,98}; int score[] = {78, 89, 98};
4.1.2 一维数组元素的引用
一维数组下标变量的格式 数组名[下标]
例如: int score[10]={0}, i=1; score[1]; score[i]; score[10];
第四章 数组和结构
❖ 一维数组 ❖ 字符数组 ❖ 结构 ❖ 结构数组和二维数组 ❖ 程序举例 ❖ 本章小结
4.1 一维数组
➢ 一维数组的定义和初始化 ➢ 一维数组元素的引用 ➢ 一维数组的应用
4.1 一维数组
任务4.1 半期考试结束了,教师想看看C语言这门课程的最高 分,以及有哪几位学生得到了这个最高分。试编程解决这个问 题,为简单起见,假设班上共有10人。
以确定是否交换) (4)如果a[j]>a[j+1](逆序),则交换之 (5)输出排序结果
4.1.3 一维数组的应用
例4.3 给定由6个成绩组成的序列{92,88,74,93,85,79}, 将其按从小到大的顺序排列。
算法分析: 算法的NS图
4.1.3 一维数组的应用
例4.3 给定由6个成绩组成的序列{92,88,74,93,85,79}, 将其按从小到大的顺序排列。
while(low <= high) // 只有待查找区间不为空,就循环
{
mid = (low + high) / 2; // 计算中间元素下标
if(score[mid] == x) // 中间元素与待查找元素相等,查找成功
break;
// 退出循环
else if(score[mid] > x) // 中间元素较大,查找前半区间
low
mid
high low
mid
high
5 13 17 42 46 55 70 94
5 13 17 42 46 55 70 94
low mid
highlow mid high 5 13 17 42 46 55 70 94
查找成功
high low 查找失败
4.1.3 一维数组的应用
例4.3 给定由6个成绩组成的序列{92,88,74,93,85,79}, 将其按从小到大的顺序排列。
score[0] = x;
// 在下标处设置监视哨
for(i = n; score[i] != x; i--);
// 计数循环,从后到前循环比较当前元素,循环体为空语句
if(i >= 1)
{
cout<<"查找成功,待查找成绩是第“
<<i<<" 位学生的成绩"<<endl;
}
else
{
cout<<"未查找到该成绩!"<<endl;
}
else
{ // 待查找区间为空,查找不成功
cout<<"未查找到该成绩!"<<endl;
}
4.1.3 一维数组的应用
例4.2折半查找
折半查找的查找效率要远高于顺序查找
折半查找需要存储数据的数组已经有序
x=55
x=12
5 13 17 42 46 55 70 94
5 13 17 42 46 55 70 94
核心程序段(以数组尾部为水面) for(i = 1; i < n; i++) { for(j = 1; j <= n - i; j++) { // 从前向后进行扫描 if(score[j] > score[j + 1]) { // 相邻元素逆序,则交换 score[0] = score[j]; score[j] = score[j + 1]; score[j + 1] = score[0]; } } }
n个数排序,至多只需进行 n-1遍排序
每遍扫描中,从第1个元素 开始,依次与相邻元素进 行比较,逆序则交换
4.1.3 一维数组的应用
例4.3 给定由6个成绩组成的序列{92,88,74,93,85,79}, 将其按从小到大的顺序排列。
算法分析: 为了表述方便,定义以下3个变量
(1)待排序的数的个数n(此处为6) (2)扫描遍数i(i=1,2,3,…n-1) (3)每遍扫描时待比较元素的下标j(j=1,2,3,…n-i) 算法步骤如下 (1)将待排序的数据放入数组中 (2)让i从1到n-1循环做步骤(3)(每遍扫描的循环) (3)让j从1到n-i做步骤(4)(依次比较两个相邻数组元素,
如果中间元素与待查找元素相等,则查找成功
如果中间元素较大,则待查找元素在前半区间,查找前半区间
如果中间元素较小,继续查找后半区间。
使用两个整型变量分别表示区间的上界和下界。
如果区间的上界小于下界,说明区间为空,查找失败。
比较后,要查找前半区间,只需修改区间的上界;要查找后半 区间,只需修改区间的下界。
这个算法会首先将最小元素交换到score[6]处,然后将次小元 素交换到score[5]处,以此类推,最后得到排好序的数组
4.1.3 一维数组的应用
例4.3 给定由6个成绩组成的序列{92,88,74,93,85,79}, 将其按从小到大的顺序排列。
4.1.3 一维数组的应用
例4.3 冒泡排序 算法分析
通过一遍扫描可将最小的 数交换到score[6],
再进行一遍扫描,次小的 数被交换到score[5]。
如 果 将 score[1] 视 为 水 底 , score[6] 视 为 水 面 , 则 最 大的数最先浮到水面,然 后次大的数也浮到水 面……
high = mid - 1; // 修改待查找区间上界
else
// 中间元素较小,查找后半区间
low = mid + 1;
// 修改待查找区间下界
}
if(low <= high)
{ // 待查找区间不为空,查找成功
cout<<"查找成功,待查找成绩是第“
<<mid<<" 位学生的成绩"<<endl;
• 可采用计数循环,依次将数组元素与输入的数进行比较, 如果相等则终止循环。如果元素比较完还未找到输入的数, 则输出0。
4.1.3 一维数组的应用
例4.1 算法分析
① 从第一位学生到最后一位学生依次与输入成绩进行比较
for(i = 1; i <= n; i++)// 计数循环,从前到后进行循环
{
if(score[i] == x) // 如果当前成绩等于待查找成绩
{
// 开始循环
cout<<"请输入第"<<i<<"位学生的成绩:";
cin>>score[i]; // 输入第i位学生的成绩
if(maxScore < score[i])
{ // 如果第i位学生的成绩高于原最高分
maxScore = score[i]; // 修改最高分
}
}
// 结束循环
4.1.3 一维数组的应用
① 类型说明符定义数组的基类型,即数组中各元素的类型。 ② 数组名的第一个字符最好为英文字母,其他要求与定义变量
名时相同。 ③ 常量表达式定义数组中可以放多少元素。必须是整型常量。 ④ 用方括号将常量表达式括起。 ⑤ 数组下标从0开始。如果定义了10个元素,是从第0个元素
到第9个元素。 ⑥ 常量表达式中不允许包含变量,但可以使用常变量。
break;
// 则退出循环
}
if(i <= n)
{
cout<<"查找成功,待查找成绩是第“
<<i<<" 位学生的成绩"<<endl;
}
else
{
cout<<"未查找到该成绩!"<<endl;
}
4.1.3 一维数组的应用
例4.1 算法分析
② 从最后一位学生到第一位学生依次与输入成绩进行比较
for(i = n; i >= 1; i--) // 计数循环,从前到后进行循环
算法分析:
• 冒泡排序法是一种交换排序方法,它的思路是:从序列的 一端开始,依次将相邻两个元素比较,当发现它们逆序 (即不合顺序)时就进行一次交换,本例需将较大的数调 到后面去,所以相邻元素中前者较大即为逆序。这样就像 水箱里的气泡一样,一个个地上浮到水面上,直到每个气 泡都到达它的平衡位置。
• 为实现这一算法,首先用一维数组score存储待排序的序列, 为了以后查找的方便,成绩从下标1处开始存放,下标0处 不存放数据。
注意:C语言不检查数组边界,程序可以在数组两边越界,写入 其他变量,甚至写入程序代码段。如果使用了负数下标或超 过数组长度的下标,C仍计算这个下标的位置,并使用它, 在运行和编译时也没有任何错误提示,程序继续运行,并访 问别的变量的存储空间或根本不存在的存储空间。
4.1.3 一维数组的应用
任务4.1算法分析
}
4.1.3 一维数组的应用
例4.2 有10位学生的成绩存放在数组score中,从键盘输入1个 数,使用折半查找法查找这个成绩是否在数组中,如果在, 输出其下标,如果不在,输出0。数组的下标i表示第i位学 生的成绩,数组的下标0处不存储成绩。
算法分析:
先找到中间元素,再根据中间元素与待查找元素的比较结果缩 小一半的待查找区间,从而提高查找的效率。
}
}
// 循环结束
4.1.3 一维数组的应用
例4.1 有10位学生的成绩存放在数组score中,从键盘输入1个 数,查找这个成绩是否在数组中,如果在,输出其下标, 如果不在,输出0。数组的下标i表示第i位学生的成绩,数 组的下标0处不存储成绩。
算法分析:
• 将第i位学生的成绩存放到下标i处,下标0处的数组元素就 不存放具体的成绩信息。这样,学生的序号和数组下标之 间的对应关系更自然
任务4.1 程序4_1.cpp
求最高分人数
for(i = 0; i < n; i++) // 计数循环
{
// 循环开始
if(score[i] == maxScore)
{ // 如果第i位学生的成绩等于最高分
maxStudent++;
// 得最高分的学生人数增1
cout<<i<<endl; // 输出该生序号
4.1.3 一维数组的应用
例4.2 有10位学生的成绩存放在数组score中,从键盘输入1个 数,使用折半查找法查找这个成绩是否在数组中,如果在, 输出其下标,如果不在,输出0。数组的下标i表示第i位学 生的成绩,数组的下标0处不存储成绩。
算法的NS图
4.1.3 一维数组的应用
例4.2折半查找 核心程序段
int score[10]; int n=10; int score[n]; const int n=10; int score[n];
4.1.1 一维数组的定义及初始化
2. 数组元素的初始化 (1)给全部数组元素赋初值
int score[3] = {78, 89, 98}; (2)给部分数组元素赋初值
const int n = 10; // 使用常变量定义学生人数
int score[n];
// 定义成绩数组,有n个整型元素
int maxScore = 0; // 最高分,并初始化为0
int maxStudent = 0; // 得到最高分的学生人数
int i;
// 循环变量
for(i = 0; i < n; i++) // 计数循环
{
if(score[i] == x) // 如果当前成绩等于待查找成绩
break;
// 则退出循环
}
if(i >= 1)
{
cout<<"查找成功,待查找成绩是第 “
<<i<<" 位学生的成绩"<<endl;
}
else
{
cout<<"未查找到该成绩!"<<endl;
}
4.1.3 一维数组的应用
例4.1 算法分析