C语言第八章课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【例8.7】计算最高分
8.4排序和查找
排序(Sorting)算法 – 交换法排序 – 选择法排序
交换法排序
2019/5/12
38/49
交换法排序
2019/5/12
39/49
【例8.8】交换法从高到低排序
交换法排序
for (i=0; i<n-1; i++) {
for (j=i+1; j<n; j++) {
00 00 00 00
3500
④当对二维数组的全部元素或部分赋初值时,定义数 组时第一维的长度可省略,但第二维的长度必须给出 ,系统会根据数据的总个数分配存储空间。如: int a[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int a[ ][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int a[ ][4]={{1,2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}}; int a[ ][4]={{0,0, 4},{0},{0, 10}};
例:以下不能正确定义二维数组的语句是

A) int a[2][2]={{1},{2}}; B) int a[ ][2]={1,2,3,4} ;
C) int a[2][2]={{1},2,3}; D) int a[2][ ]={{1,2},{3,4}};
二维数组实例
【例8.4】从键盘输入某年某月(包括闰年),编程输出该年 的该月拥有的天数 闰年的判断条件 (1)能被4整除,但不能被100整除 (2)能把400整除
例如: float a[2][3],b[5][10]; // OK float a[2,3],b[5,10]; //ERROR
二维数组的初始化
【例】以下程序的运行结果是什么? int main() {
int a[][3]={{1,2,3},{4,5},{6},{0}}; printf("%d,%d,%d\n",a[1][1],a[2][1],a[3][1]); return 0; }
int a[5] = { 12, 34, 56 ,78 ,9 }; int a[5] = { 0 }; int a[] = { 11, 22, 33, 44, 55 };
8.1一维数组的定义和初始化
数组的引用
数组名 [下标] 数组下标(index)都是从0开始,使用a[0]、a[1]、
a[2]、……、a[9]这样的形式访问每个元素。 不能直接将数组名作为访问对象,对数组赋值也必
解决方法 • 方法1:逐个元素赋值
b[0]=a[0]; b[1]=a[1]; b[2]=a[2]; b[3]=a[3];
• 方法2:通过循环赋值 int i; for (i=0;i<4;i++) { b[i] = a[i]; }
9/49
8.1一维数组的定义和初始化
【例8.2】编程实现显示用户输入的月份(不包括闰 年的月份)拥有的天数
数组a[10]的10个数组元素分别为:a[0]、a[1]、 a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]。
注意: 不存在a[10]数组元素。
④ 数组大小必须是值为正的常量,不能为变量
–一旦定义,不能改变大小
数组大小最好用宏来定义,以适应未来可能的变化
#define SIZE 10 int a[SIZE];
123
450
结果:5, 0, 0
600
000
【例】若int a[ ][3]={1, 2, 3, 4, 5, 6, 7}, 则a数组的第一维大小是多少?
123 4 56 700
数组的数据类型和存储类型
根据数组的数据类型,为每一元素安排相同长度的存储单元 根据数组的存储类型,将其安排在内存的动态存储区、静态
if (score[j] > score[i])
"交换成绩score[j]和score[i]"
} }
如何实现两数交换?
temp = score[j]; score[j] = score[i]; score[i] = temp;
【例8.5】计算平均分
例8.5 从键盘输入某班同学某门课的成绩(已 知每班人数最多不超过40人,具体人数由键盘 输入),编程计算其平均分。
【例8.5】计算平均分
计数控制的循环
【例8.6】计算平均分
例8.6从键盘输入某班同学某门课的成绩(已知 每班人数最多不超过40人,当输入成绩为负值 时表示输入结束,编程计算其平均分,并输出 实际输入的学生人数。
int a[10];
a[0]
基类型
下标从0开始
a[1]

定义一个有10个int型元素的数组 a[7]
– 系统在内存分配连续的10个int空间给此数组
直接对a的访问,就是访问此数组的首地址 a[8]
a[9]
说 明:
① 数据类型是数组的数据类型,也就是每一个数组元 素的类型,可以是C中任何一种数据类型。(如 int,char,float或double或构造类型) ② 数组名是标识符,遵循标识符的命名规则。除了作 为数组的标识外,同时还代表该数组存储空间的首地址 ,也就是第一个数组元素的地址,数组名本身还是一个 地址量。
【例8.6】计算平均分
当输入负值时,表示输入结束
标记控制的循环——负值作为输入结束标记
【例8.6】计算平均分
当输入负值时,表示输入结束
标记控制的循环——负值作为输入结束标记
【例8.6】计算平均分
例8.7从键盘输入某班同学某门课的成绩(已知每 班人数最多不超过40人,当输入成绩为负值时表 示输入结束,试编程计算并打印最高分数。
行 92 91 90 86 74
70 65 80 91 76
实际上这是一个关于成绩的矩阵问题。
二维数组的定义
一维数组可解决数列等问题,而矩阵的问题由于出现了 行和列两个因素,需要用两个下标来描述,一个记录行的 变化,另一个记录列的变化。描述该情况的数组,称为二 维数组。如上列矩阵可将其转化为如下的二维数组:
a[0][2] a[1][0] a[1][1] a[1]Biblioteka Baidu2]
需知道数组每行列数才能从起始地址开始正确读出数组元素
注意:在使用数组元素时,数组下标值应在已定 义的数组大小的范围内。与一维数组一样,注意 不要出现下标越界的错误。
如: int a[3][4];
a[3][4]=2;
①按行为二维数组赋初值。如:
须是对每一个元素逐个赋值。 下标既可是常量,也可是整型表达式,允许快速随
机访问,如a[i]
–可以像使用普通变量一样使用它们
如何使两个数组的值相等?
main() {
int a[4] = {1,2,3,4}, b[4]; b = a; }
原因: 数组名表示数组的首地址, 其值不可改变!
2019/5/12
34/49
【例8.7】计算最高分
假设其中的一个学生成绩为最高 maxScore = score[0];
对所有学生成绩进行比较,即 for (i=1; i<n; i++) { 若score[i] > maxScore 则修改maxScore值为score[i] }
打印最高分maxScore
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
②按数组元素的存储顺序赋初值。如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
③给部分元素赋初值。
Ⅰ).只对各行第一列元素赋初值,如: int a[3][4]={{1},{3},{5}};
int m; scanf("%d",&m); int a[m]; //错误,非法
⑤ 一个声明语句可以同时声明多个类型相同的变 量和数组,各变量和数组之间要用逗号分开。
例如:char a[3],b[4],x,y;
8.1一维数组的定义和初始化
数组定义后的初值仍然是随机数 一般需要我们来初始化
Ⅱ).对各行中的某一元素赋初值。如: int a[3][4]={{1},{0,3},{0,0,5}};
1000
3000 1000 5000 01 30 0 0
Ⅲi)n.只t 对a[3某][几4]=行{{的1}部,{3分,5元}};素赋初//第值三。行如不:赋初031 值050 500 00
int a[3][4]={{1},{0},{3,5}};
【例8.7】计算最高分
#include <stdio.h> #define N 40 int ReadScore(int score[]); int FindMax(int score[], int n); int main() {
int score[N], max, n;
n = ReadScore(score);
存储区或寄存器区 用sizeof(a)来获得数组a所占字节数
short
二维数组的存储结构
存放顺序:按行存放
先顺序存放第0行元素,再存放第1行元素
short int a[2][3];
a[0][0] a[0][1]
a[0][0] a[0][1] a[0][2] a[0]
a[1] a[1][0] a[1][1] a[1][2]
97 87 92 78 83
92 91 90 86 74 70 65 80 91 76
int score[3][5]
8.2 二维数组的定义和初始化
定义的一般形式为: 数据类型 数组名[常量表达式1][常量表达式2];
其中,常量表达式1表示数组的行数(第一维) , 常量表达式2表示数组的列数(第二维) 。
本章学习内容
对数组名特殊含义的理解 数组类型,数组的定义和初始化 向函数传递一维数组和二维数组 排序、查找、求最大最小值等常用算法
为什么使用数组(Array)?
【例8.1】要读入10人的成绩,然后求平均成绩
需定义10个不同名整型变量,需要使用多个scanf()
int score1,score2,…score10; scanf("%d",&score1); scanf("%d",&score2); ......
printf("Total students are %d\n", n); max = FindMax(score, n);
printf("The highest score is %d\n", max);
return 0; }
max(i=0)
计算最大值算法
max(i=2)
max(i=3)
2019/5/12
一维数组在内存中所占用的 总字节数 = 数据类型长度×数组长度
例如: int a[10]; //占用40个字节 double b[10]; //占用80个字节
③ 常量表达式 表示该数组中的元素的个数,它规定了数组 的大小,只能为正整数。数组的下标范围为“0”到“常量表 达式-1”,即最小下标为0,最大下标为“常量表达式-1”。
3
4c
b[4]
4
50
b[5]
5
54
b[6]
6
58
b[7]
7
5c
b[8]
8
60
b[9]
9
64
c
120
68
a
111
6c
运行程序或单步执行观察变量变化情况可以看到,
变量c和a的值因数组越界而被悄悄破坏了
2019/5/12
12/49
二维数组问题的提出
3个学生每人有5门课程成绩:
列 97 87 92 78 83
8.3向函数传递一维数组
传递整个数组给另一个函数,可 将数组的首地址作为参数传过去 – (1)用数组名作函数参数 – (2)只复制一个地址自然比复制
全部数据效率高
– (3)由于首地址相同,故实参数
组与形参数组占用同一段内存
– (4)在该函数内,不仅可以读这
个数组的元素,还可以修改它们
简单变量和数组作函数参数的区别
8.1一维数组的定义和初始化
下标越界是大忌! –编译程序不检查是否越界 –下标越界,将访问数组以外的空间 –那里的数据是未知的,不受我们掌控,可能带
来严重后果
2019/5/12
11/49
【例8.3】当下标值小于0或超过数组长度时
会出现什么情况?
b[0]
0
40
b[1]
1
44
b[2]
2
48
b[3]
而用数组,可共用一个scanf()并利用循环语句读取
int score[10],i; for (i=0; i<10; i++) {
scanf("%d",&score[i]); }
保存大量 同类型的 相关数据
8.1一维数组的定义和初始化
一维数组的定义
数组首地址
存储类型 数据类型 数组名 [整数1] [整数2] …… [整数n];
相关文档
最新文档