nullnull第8章 数组本章学习内容本章学习内容 对数组名特殊含义的理解
数组类型,数组的定义和初始化
向函数传递一维数组和二维数组
排序、查找、求最大最小值等常用算法 为什么使用数组(Array)?为什么使用数组(Array)?【例8.1】要读入10人的成绩,然后求平均成绩
需定义10个不同名整型变量,需要使用多个scanf()
int score1,score2,…score10;
scanf("%d",&score1);
scanf("%d",&score2);
......
而用数组,可共用一个scanf()并利用循环语句读取
int score[10],i;
for (i=0; i<10; i++)
{
scanf("%d",&score[i]);
}保存大量同类型的相关数据8.1一维数组的定义和初始化8.1一维数组的定义和初始化 一维数组的定义
存储类型 数据类型 数组名 [整数1] [整数2] …… [整数n];…int a[10];
定义一个有10个int型元素的数组
系统在内存分配连续的10个int空间给此数组
直接对a的访问,就是访问此数组的首地址基类型下标从0开始8.1一维数组的定义和初始化8.1一维数组的定义和初始化…int a[10];
数组大小必须是值为正的常量,不能为变量
一旦定义,不能改变大小
数组大小最好用宏来定义,以适应未来可能的变化
#define SIZE 10
int a[SIZE]; 一维数组的定义
存储类型 数据类型 数组名 [整数1] [整数2] …… [整数n];8.1一维数组的定义和初始化8.1一维数组的定义和初始化数组定义后的初值仍然是随机数
一般需要我们来初始化
int a[5] = { 12, 34, 56 ,78 ,9 };
int a[5] = { 0 };
int a[] = { 11, 22, 33, 44, 55 };
8.1一维数组的定义和初始化8.1一维数组的定义和初始化数组的引用
数组名 [下标]
数组下标(index)都是从0开始
使用a[0]、a[1]、a[2]、……、a[9]这样的形式访问每个元素
下标既可是常量,也可是整型
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达式,允许快速随机访问,如a[i]
可以像使用普通变量一样使用它们如何使两个数组的值相等?如何使两个数组的值相等?main()
{
int a[4] = {1,2,3,4}, b[4];
b = a;
}解决方法
方法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];
}原因:
数组名表示数组的首地址,其值不可改变!8.1一维数组的定义和初始化8.1一维数组的定义和初始化【例8.2】编程实现显示用户输入的月份(不包括闰年的月份)拥有的天数 8.1一维数组的定义和初始化8.1一维数组的定义和初始化下标越界是大忌!
编译程序不检查是否越界
下标越界,将访问数组以外的空间
那里的数据是未知的,不受我们掌控,可能带来严重后果
【例8.3】当下标值小于0或超过数组长度时
会出现什么情况?【例8.3】当下标值小于0或超过数组长度时
会出现什么情况?运行程序或单步执行观察变量变化情况可以看到,变量c和a的值因数组越界而被悄悄破坏了12345612078910118.2二维数组的定义和初始化8.2二维数组的定义和初始化一维数组
用一个下标确定各元素在数组中的顺序
可用排列成一行的元素组来表示
如 int a[5];
二维数组
用两个下标确定各元素在数组中的顺序
可用排列成i行,j列的元素组来表示
如 int b[2][3];
n维数组
用n个下标来确定各元素在数组中的顺序
如 int c[3][2][4];
n≥3时,维数组无法在平面上表示其各元素的位置二维数组的初始化【例】以下程序的运行结果是什么?
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;
}1 2 3
4 5 0
6 0 0
0 0 0结果:5, 0, 0【例】若int a[ ][3]={1, 2, 3, 4, 5, 6, 7},
则a数组的第一维大小是多少? 1 2 3
4 5 6
7 0 0二维数组的初始化数组的数据类型和存储类型数组的数据类型和存储类型根据数组的数据类型,为每一元素安排相同长度的存储单元
根据数组的存储类型,将其安排在内存的动态存储区、静态存储区或寄存器区
用sizeof(a)来获得数组a所占字节数nullshort int a[2][3];a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]存放顺序:按行存放
先顺序存放第0行元素,再存放第1行元素需知道数组每行列数才能从起始地址开始正确读出数组元素二维数组的存储结构二维数组实例二维数组实例 【例8.4】从键盘输入某年某月(包括闰年),编程输出该年的该月拥有的天数8.3向函数传递一维数组 8.3向函数传递一维数组传递整个数组给另一个函数,可将数组的首地址作为参数传过去
用数组名作函数参数
只复制一个地址自然比复制全部数据效率高
由于首地址相同,故实参数组与形参数组占用同一段内存
在该函数内,不仅可以读这个数组的元素,还可以修改它们 简单变量和数组作函数参数的区别 简单变量和数组作函数参数的区别【例8.5】计算平均分 【例8.5】计算平均分 计数控制的循环
【例8.5】计算平均分 【例8.5】计算平均分 计数控制的循环
【例8.6】计算平均分
当输入负值时,表示输入结束 【例8.6】计算平均分
当输入负值时,表示输入结束 标记控制的循环——负值作为输入结束标记【例8.6】计算平均分
当输入负值时,表示输入结束 【例8.6】计算平均分
当输入负值时,表示输入结束 标记控制的循环——负值作为输入结束标记【例8.7】计算最高分【例8.7】计算最高分#include
#define N 40
int ReadScore(int score[]);
int FindMax(int score[], int n);
int main()
{
int score[N], max, n;
n = ReadScore(score);
printf("Total students are %d\n", n);
max = FindMax(score, n);
printf("The highest score is %d\n", max);
return 0;
}nullmax(i=0)max(i=2)max(i=3)计算最大值算法【例8.7】计算最高分假设其中的一个学生成绩为最高
maxScore = score[0];
对所有学生成绩进行比较,即
for (i=1; i maxScore
则修改maxScore值为score[i]
}
打印最高分maxScore【例8.7】计算最高分【例8.7】计算最高分【例8.7】计算最高分8.4排序和查找8.4排序和查找排序(Sorting)算法
交换法排序
选择法排序交换法排序交换法排序交换法排序交换法排序【例8.8】交换法从高到低排序【例8.8】交换法从高到低排序交换法排序
for (i=0; i score[i])
"交换成绩score[j]和score[i]"
}
}如何实现两数交换?如何实现两数交换?temp = score[j];
score[j] = score[i];
score[i] = temp; 705070【例8.8】交换法从高到低排序【例8.8】交换法从高到低排序void DataSort(int score[], int n) /*交换法排序*/
{
int i, j, temp;
for (i=0; i score[i]) /*从高到低*/
{
temp = score[j];
score[j] = score[i];
score[i] = temp;
}
}
}
}选择法排序选择法排序k=1k=2k=0k=1选择法排序选择法排序k=3k=4k=3k=4选择法排序选择法排序选择法排序
for (i=0; i score[k])
记录此轮比较中最高分的元素下标 k = j;
}
若k中记录的最大数不在位置i,则
"交换成绩score[k]和score[i]",
"交换学号num[k]和num[i]";
}nullvoid DataSort(int score[], long num[], int n) /*选择法*/
{
int i, j, k, temp1;
long temp2;
for (i=0; i score[k])
{
k = j; /*记录最大数下标位置*/
}
}
if (k != i) /*若最大数不在下标位置i*/
{
temp1 = score[k];
score[k] = score[i];
score[i] = temp1;
temp2 = num[k];
num[k] = num[i];
num[i] = temp2;
}
}
}【例8.8】成绩从高到低顺序【例8.8】成绩从高到低顺序8.4排序和查找8.4排序和查找查找(Searching)算法
顺序查找
折半查找【例8.10】顺序查找学号【例8.10】顺序查找学号int LinSearch(long num[], long x, int n)
{
int i;
for (i=0; i num[mid])
{
low = mid + 1;
}
else if (x < num[mid])
{
high = mid - 1;
}
else
{
return (mid);
}
}
return(-1);
}若未按学号排序,
则如何修改程序?nullvoid DataSort(int score[], long num[], int n) /*选择法*/
{
int i, j, k, temp1;
long temp2;
for (i=0; i
本文档为【c语言数组】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。