第四章 数组
合集下载
数据结构第四章 数组
4.2
数组的存储结构
通常采用顺序存储结构 顺序存储结构 以二维数组Amn为例
行优先 a00 a01 … a0(n-1) a10 a11 … a1(n-1) … a(m-1)0 a(m-1)1 … a (m-1)(n-1) 列优先
Loc(aij)=Loc(a00)+(i×n+j)×k
a00 a10 … a (m-1)0 a01 a11 … a (m-1) 1 … a0(n-1) a1(n-1) … a (m-1)(n-1)
0 0 -3 0 0 15 12 0 0 0 18 0 9 0 0 24 0 0 0 0 0 0 0 -7 0 0 14 0 0 0
(以转置运算为例) 以转置运算为例)
0 0 0 0 0 0
M
转置后
0 12 9 0 0 0
0 0 0 0 0 0
–3 0 0 0 14 0
0 0 15 0 18 0 24 0 0 0 0 -7 0 0 0 0 0 0
思路:反复扫描a.data中的列序,从小到大依次进行转置。 思路:反复扫描a.data中的列序,从小到大依次进行转置。 a.data中的列序
col
三 元 组 表 a.data (0, 1, 12) ③ 1 (0, 2, 9 ) ⑤ 0 (2, 0, -3) ① (2, 4, 14) (3, 2, 24) 1 (4, 1, 18) 0 (5, 0, 15) (5, 3, -7)
其中,sb[n(n+1)/2]中存放着常数 中存放着常数。 其中,sb[n(n+1)/2]中存放着常数。
三、稀疏矩阵的压缩存储
稀疏矩阵:设矩阵A中有s个非零元素, 稀疏矩阵:设矩阵A中有s个非零元素,若 远远小于矩阵元素的总数( s远远小于矩阵元素的总数(即s≦m×n), 则称A为稀疏矩阵。 则称A为稀疏矩阵。
数组
C语言程序设计
20/60
【例4.4】
编写程序,将一个二维数组中行和列元素互换, 存到另一个二维数组中。设数组
1 a= 2 5 9 6 8
1 2 b= 5 6 9 8
C语言程序设计
21/60
main() { int a[2][3]={{1,5,9},{2,6,8}}; int b[3][2],i,j; printf("Array a:\n"); /* 输入原来数组的数据 */ for(i=0;i<2;i++) { for(j=0;j<3;j++) { printf("%4d",a[i][j]); b[j][i]=a[i][j]; /* 将两个数组元素相互交换 */ } printf("\n"); }
10/60
冒泡法排序
例如:int a[5]={4,7,3,9,1};则对数组 的排序过程如图所示。
第一次遍历 4 7 3 9 1 4 7 3 9 1 4 3 7 9 1 4 3 7 9 1 4 3 7 1 9 第二次遍历 4 3 7 1 3 4 7 1 3 4 7 1 3 4 1 7 第三次遍历 3 4 1 3 4 1 3 1 4 第四次遍历 3 1 1 3
18/60
2.二维数组元素的输入和输出
二维数组元素同以前学习过的普通变量一样,可 以通过格式输入和输出函数来进行输入和输出。 例如: scanf("%d,%d",&a[0][1],&a[2][1]);
/*从键盘上输入值赋给了数组元素a[0][1]和a[2][1]*/
printf("%d,%d",a[0][0],a[2][2-1]); /*输出数组元素a[0][0]和a[2][1]*/
DS第四章 数组
起始位置,亦称为基地址。
1
2
i 1
k i 1
练习1:
数组A[0..5,0..6],每个元素占5个字节,首地 址为1000,按列优先存储,则A[5,5]的存储地 址是 ( )。 分析: 因为是按列优先,所以在A[5,5] 前已经 存储了0~4列共5列,每列有6个元素,所以共 5×6=30个元素。在第5列上, A[5,5]之前有 5个元素,则A[5,5]之前共有30+5=35个元素, 所以其地址为: 1000+35*5=1175
矩阵中元素已经按行和按列排好序,要求查找的时间复杂度为 O(m+n),因此不能采用常规的二层循环的查找。 方法:从B的右上角元素开始比较,每次比较有3种可能的结果: 1) B[i,j]=x ,查找成功; 2) B[i,j]>x,则向j小的方向(即向左)继续查找(减少一列); 3) B[i,j]<x,则向i大的方向(即向下)继续查找(减少一行); 这样:每次比较可以使得搜索范围减少一行或一列,最多经过 m+n次比较就可以找到。 若下标超出范围,则查找失败。
(i 1) * (2n i 2) (n p 1) 2 p 1
i 1
个元素,而在第i行上aij之前有j-i个元素,它是所 在行的第(j-i+1)个元素,所以,它是数组a的第 (i-1)*(2n-i+2)/2+(j-i+1)个元素。 注意到B的 下标从0开始:
因此aij和B[k]之间的对应关系为:
i (i 1) j 1 2 k j ( j 1) i 1 2
当i j j
= LOC(B[0])+K*L=LOC(B[0])+[I*(I-1)/2+J-1]*L
数据结构第4章数组和串
1
● 教学目的:理解抽象数据类型数组的概念, 掌握数组的不同存储结构的实现及应用,了 解广义表的相关概念,掌握串的逻辑结构、 存储结构及其基本运算。
● 教学重点:数作在不同 存储结构上的实现。 ● 教学难点:带状矩阵的压缩存储;稀疏矩 阵的三元组表实现及其转置算法,堆结构的 串操作实现;串的模式匹配算法。
矩阵的压缩存储
printf("Array a:\n"); k=0; for(i=0;i<N;i++)//输出矩阵A { for(j=0;j<N;j++) if(i<j)printf("%5d",sa[M-1]); else printf("%5d",sa[i*(i+1)/2+j]); printf("\n"); } printf("Array b:\n"); k=0; for(i=0;i<N;i++)//输出矩阵B { for(j=0;j<N;j++) if(i>j)printf("%5d",sb[M-1]); else printf("%5d",sb[j*(j+1)/2+i]); printf("\n"); }}
矩阵的压缩存储
由此可见,要唯一表示一个稀疏矩阵,在存储三 元组表的同时还需存储该矩阵总的行数、列数及非 零元个数。 练习:写出图4-9(a)所示稀疏矩阵的三元组表。
三元组表(也是线性表)的存储方式主要有两种: 顺序存储和链式存储,从而可引出稀疏矩阵的两种 压缩存储方法:三元组顺序表和十字链表。 3、三元组顺序表
矩阵的压缩存储
● 教学目的:理解抽象数据类型数组的概念, 掌握数组的不同存储结构的实现及应用,了 解广义表的相关概念,掌握串的逻辑结构、 存储结构及其基本运算。
● 教学重点:数作在不同 存储结构上的实现。 ● 教学难点:带状矩阵的压缩存储;稀疏矩 阵的三元组表实现及其转置算法,堆结构的 串操作实现;串的模式匹配算法。
矩阵的压缩存储
printf("Array a:\n"); k=0; for(i=0;i<N;i++)//输出矩阵A { for(j=0;j<N;j++) if(i<j)printf("%5d",sa[M-1]); else printf("%5d",sa[i*(i+1)/2+j]); printf("\n"); } printf("Array b:\n"); k=0; for(i=0;i<N;i++)//输出矩阵B { for(j=0;j<N;j++) if(i>j)printf("%5d",sb[M-1]); else printf("%5d",sb[j*(j+1)/2+i]); printf("\n"); }}
矩阵的压缩存储
由此可见,要唯一表示一个稀疏矩阵,在存储三 元组表的同时还需存储该矩阵总的行数、列数及非 零元个数。 练习:写出图4-9(a)所示稀疏矩阵的三元组表。
三元组表(也是线性表)的存储方式主要有两种: 顺序存储和链式存储,从而可引出稀疏矩阵的两种 压缩存储方法:三元组顺序表和十字链表。 3、三元组顺序表
矩阵的压缩存储
《C语言程序设计课件》第四章-数组
提示:程序在读入数时将其存储在一个数组中, 然后通过数组反向开始一个接一个地显示出数组 元素。
#include <stdio.h> #define N 10 int main(void)
{ int a[N], i; printf("Enter %d numbers: ", N);
for (i = 0; i < N; i++)
for(i=0;i<1;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }
a[0]
20
a[1]
02
a[2]
44
a[3]
55
a[4]
88
a[5]
99
for(i=0;i<5;i++) if (a[i]>a[i+1]) { ……}
for(i=0;i<4;i++) if (a[i]>a[i+1]) { ……}
4.2 一维数组
一维数组主要用来存储一组类型相同并且数量一定 的数据。其中,每个数据称为数组的一个元素。
4.2.1 一维数组定义 一维数组的定义形式如下: 类型名 数组名[常量表达式]; int x[100]; char string[10]; double data[10];
常量表达式给出了数组的长度,在C语 言中定义数组时必须确定数组的长度。
600
xxx[[[654]]]
700
xxx[[[765]]]
800
xxx[[[876]]]
900
xxx[[[987]]]
#include <stdio.h> #define N 10 int main(void)
{ int a[N], i; printf("Enter %d numbers: ", N);
for (i = 0; i < N; i++)
for(i=0;i<1;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }
a[0]
20
a[1]
02
a[2]
44
a[3]
55
a[4]
88
a[5]
99
for(i=0;i<5;i++) if (a[i]>a[i+1]) { ……}
for(i=0;i<4;i++) if (a[i]>a[i+1]) { ……}
4.2 一维数组
一维数组主要用来存储一组类型相同并且数量一定 的数据。其中,每个数据称为数组的一个元素。
4.2.1 一维数组定义 一维数组的定义形式如下: 类型名 数组名[常量表达式]; int x[100]; char string[10]; double data[10];
常量表达式给出了数组的长度,在C语 言中定义数组时必须确定数组的长度。
600
xxx[[[654]]]
700
xxx[[[765]]]
800
xxx[[[876]]]
900
xxx[[[987]]]
第04章 数组
高 级 语 言 程 序 设 计 与 应 用 教 程
第4章
数
组
第 四 章
数 组
1
高 级 语 言 程 序 设 计 与 应 用 教 程
第4章:数 组
学习的意义
到目前为止,我们已经讨论了C语言中的基本数据类型, 如果用基本数据类型来定义某些变量,那么这些变量在内存 中将占用各自的内存单元,变量之间的制约关系无法体现, 不能表现出这些变量之间的关联性,看不出它们之间有任何 构造数据类型之一 有没有更好的方法来 的联系,我们把这些变量称之为‚离散变量‛,对它们的访 数组:把具有相同类型的若干变量按有序的形式 问只能通过变量名逐一进行 。 解决呢? 组织起来的集合,用数组名标识。 有!就是用数组来编程。 下面来思考一个问题:如何编程来实现对100个数进行排序呢? 数组元素:数组中的变量。用数组名和下标确定, 具有相同的名字,但有不同的下标。 解题思路: 太复杂了! 定义100个整型变量来 晕!!! 分别存放这100个整数,然 后再对这些变量的值进行比 较、交换等操作 。
//超出了数组的大小
(3) 只能给元素逐个赋值,不能给数组整体赋值。 例 int a[5] = {1, 1, 1, 1, 1}; 不能简化为: int a[10] = 1; ×
第 四 章
数 组
14
高 级 语 言 程 序 设 计 与 应 用 教 程
初始化赋值说明:
(4) 如果表达式的个数小于数组的大小,则未指定值的 数组元素被赋值为0;
4
高 级 语 言 程 序 设 计 与 应 用 教 程
第 四 章
4. 类型名int说明a数组中的10个数组元素都是整型,在每个 数组元素中只能存放整型数据。数组的类型实际上是指数 组元素的取值类型。对于同一个数组,其所有元素的数据 类型都是相同的。 5. 数组定义后, C语言的编译系统将给其分配一定大小的内 再例如: 存单元,其所占内存单元的大小与数组元素的类型和数组 float f[20]; //定义了有20个数据元素的float型数组f 的长度有关。上例中,系统为a数组在内存中开辟一段连 char str1[10], str2[20]; //定义了有10个和20个数据元素的char型 续的存储单元,如图所示。在图中标明了每个存储单元的 数组str1和str2 名字,可以用该名字直接引用每个存储单元。a数组在内 存中一共分配了10个int型的存储单元,而每个int型数据 占用4个字节(VC6.0),所以,a数组一共占用了40个字 节的连续存储单元。
第4章
数
组
第 四 章
数 组
1
高 级 语 言 程 序 设 计 与 应 用 教 程
第4章:数 组
学习的意义
到目前为止,我们已经讨论了C语言中的基本数据类型, 如果用基本数据类型来定义某些变量,那么这些变量在内存 中将占用各自的内存单元,变量之间的制约关系无法体现, 不能表现出这些变量之间的关联性,看不出它们之间有任何 构造数据类型之一 有没有更好的方法来 的联系,我们把这些变量称之为‚离散变量‛,对它们的访 数组:把具有相同类型的若干变量按有序的形式 问只能通过变量名逐一进行 。 解决呢? 组织起来的集合,用数组名标识。 有!就是用数组来编程。 下面来思考一个问题:如何编程来实现对100个数进行排序呢? 数组元素:数组中的变量。用数组名和下标确定, 具有相同的名字,但有不同的下标。 解题思路: 太复杂了! 定义100个整型变量来 晕!!! 分别存放这100个整数,然 后再对这些变量的值进行比 较、交换等操作 。
//超出了数组的大小
(3) 只能给元素逐个赋值,不能给数组整体赋值。 例 int a[5] = {1, 1, 1, 1, 1}; 不能简化为: int a[10] = 1; ×
第 四 章
数 组
14
高 级 语 言 程 序 设 计 与 应 用 教 程
初始化赋值说明:
(4) 如果表达式的个数小于数组的大小,则未指定值的 数组元素被赋值为0;
4
高 级 语 言 程 序 设 计 与 应 用 教 程
第 四 章
4. 类型名int说明a数组中的10个数组元素都是整型,在每个 数组元素中只能存放整型数据。数组的类型实际上是指数 组元素的取值类型。对于同一个数组,其所有元素的数据 类型都是相同的。 5. 数组定义后, C语言的编译系统将给其分配一定大小的内 再例如: 存单元,其所占内存单元的大小与数组元素的类型和数组 float f[20]; //定义了有20个数据元素的float型数组f 的长度有关。上例中,系统为a数组在内存中开辟一段连 char str1[10], str2[20]; //定义了有10个和20个数据元素的char型 续的存储单元,如图所示。在图中标明了每个存储单元的 数组str1和str2 名字,可以用该名字直接引用每个存储单元。a数组在内 存中一共分配了10个int型的存储单元,而每个int型数据 占用4个字节(VC6.0),所以,a数组一共占用了40个字 节的连续存储单元。
第4章:数组和字符串
【真题练习】设有以下代码: String s l="123"; String s2="123"; String s3=new String("123"); 则表达式s1==s2和s1==s3的值分别是( A.true,true B.false,false C.true,false D.false,true )
4.1.1一维数组
2. 创建一维数组
创建一维数组就是为数组分配存储空间,需指定数组长度。 数组创建后,数组名就标识用于存储数组元素的存储空间(引用)。 创建一维数组的3种方法:
(1) 先声明后创建
数组元素类型 数组名[]; 数组名 = new 数组元素类型[元素个数] ; 如:int intArray []; intArray = new int[5];4.2.3 字符串基本操作
字符串比较的注意事项:
表达式 str1.equals(str2)与表达式 str1==str2 的差异 在于:
• 前者表示所引用的两个字符串的内容是否相同, • 后者表示str1 与 str2是否引用同一个对象。 【实战编程技巧:如何避免潜在的空指针异常】
练习题
4.1 数组
4.2 字符串
4.1 数组
数组是将一组相同类型的数据顺序存储,组成的一 种复合数据类型。 数组的特点:
数组中的所有元素的数据类型相同。 数组中的元素连续顺序存储。 数组中每个元素按存储顺序对应一个下标,下标从0开始顺序编号 ,引用数组元素通过数组名和它的下标确定。 数组有一维数组和多维数组之分,数组元素的下标个数确定数组的 维数。
练习题
【真题练习】设有数组a和b的定义如下: int[]a={1,2,3}; int[]b={4,5,6} …… 执行以下代码“a=b;”,除了完成赋值操作之外,引起 系统额外要做的工作是_________。
4.1.1一维数组
2. 创建一维数组
创建一维数组就是为数组分配存储空间,需指定数组长度。 数组创建后,数组名就标识用于存储数组元素的存储空间(引用)。 创建一维数组的3种方法:
(1) 先声明后创建
数组元素类型 数组名[]; 数组名 = new 数组元素类型[元素个数] ; 如:int intArray []; intArray = new int[5];4.2.3 字符串基本操作
字符串比较的注意事项:
表达式 str1.equals(str2)与表达式 str1==str2 的差异 在于:
• 前者表示所引用的两个字符串的内容是否相同, • 后者表示str1 与 str2是否引用同一个对象。 【实战编程技巧:如何避免潜在的空指针异常】
练习题
4.1 数组
4.2 字符串
4.1 数组
数组是将一组相同类型的数据顺序存储,组成的一 种复合数据类型。 数组的特点:
数组中的所有元素的数据类型相同。 数组中的元素连续顺序存储。 数组中每个元素按存储顺序对应一个下标,下标从0开始顺序编号 ,引用数组元素通过数组名和它的下标确定。 数组有一维数组和多维数组之分,数组元素的下标个数确定数组的 维数。
练习题
【真题练习】设有数组a和b的定义如下: int[]a={1,2,3}; int[]b={4,5,6} …… 执行以下代码“a=b;”,除了完成赋值操作之外,引起 系统额外要做的工作是_________。
《c++程序设计》第4章 数组
; (2)字符数组1必须足够大,以便容纳被复制的字符串; (3)字符串2后的'\0'也一起复制到字符数组1中; (4)在赋值运算符“=”没有重载之前,不能用赋值语句将一个字符串常量或字符数组
赋给另一个字符数组,只能用字符串复制函数来处理。例如下面操作是非法的: str2="C++ program"; str1=str2;
4.1 数组的定义与使用
4.1.1 一维数组的定义和使用
1.一维数组的定义与初始化赋值 (1)一维数组的定义
定义格式为:
〔存储类型〕 <类型> <数组名>[<常量表达式>]; 例:int a[10];
表示定义一个名为a的整型数组,有10个元素,分别为a[0]、a[1]、 a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9] 。
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};
二维数组的初始化赋值
② 给数组的部分元素赋初值 给数组的部分元素赋初值的方法与给数组的所有元素赋初值的方法 类似。
3.字符串连接函数strcat()
格式:strcat(<字符数组1>,<字符串2>) 功能:将字符串2连接到字符数组1中的字符串后,其结果存放在字符数组1中。 例如:
char str1[30]="I am a "; char str2[]="student."; strcat(str1,str2); 则字符数组1的内容为"I am a student."。 说明: (1)字符数组1必须是字符数组名,字符串2可以是字符数组名,也可以是字符串常量; (2)字符数组1必须足够大,以便容纳连接后的新字符串; (3)连接时字符串1之后的'\0'取消,只在新字符串最后保留一个'\0'。
赋给另一个字符数组,只能用字符串复制函数来处理。例如下面操作是非法的: str2="C++ program"; str1=str2;
4.1 数组的定义与使用
4.1.1 一维数组的定义和使用
1.一维数组的定义与初始化赋值 (1)一维数组的定义
定义格式为:
〔存储类型〕 <类型> <数组名>[<常量表达式>]; 例:int a[10];
表示定义一个名为a的整型数组,有10个元素,分别为a[0]、a[1]、 a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9] 。
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};
二维数组的初始化赋值
② 给数组的部分元素赋初值 给数组的部分元素赋初值的方法与给数组的所有元素赋初值的方法 类似。
3.字符串连接函数strcat()
格式:strcat(<字符数组1>,<字符串2>) 功能:将字符串2连接到字符数组1中的字符串后,其结果存放在字符数组1中。 例如:
char str1[30]="I am a "; char str2[]="student."; strcat(str1,str2); 则字符数组1的内容为"I am a student."。 说明: (1)字符数组1必须是字符数组名,字符串2可以是字符数组名,也可以是字符串常量; (2)字符数组1必须足够大,以便容纳连接后的新字符串; (3)连接时字符串1之后的'\0'取消,只在新字符串最后保留一个'\0'。
C51-数组
int a[10]; int i,j,t; printf(″input 10 numbers :\n″); for (i=0;i<10;i++) scanf("%d",&a[i]); printf("\n");
for(j=0;j<5;j++)
for(i=0;i<5-j;i++)
if (a[i]>a[i+1])
2、一维数组元素引用的程序实例
以下程序运行后的输出结果是( )。
#include <stdio.h>
void main()
{
int a[5]={1,2,3,4,5},b[5]={0,2,1,3,0},i,s=0;
for(i=0;i<5;i++) s=s+a[b[i]] ;
printf("%d\n", s); }
第四章 数组
第四章 数组
本讲主要任务: 一维数组、二维数组;字符数组。
掌握要求: 掌握以上基本的编程流程、应用以及嵌套应 用。
考试题:一般出现在程序填空题、阅读程序以 及程序编程题中。(核心考试点)
问题:给一组数排序,这组 数该 如何存放呢
111 1 1
1
1
1
111 1
1
1
881 2 8 8
9
4
算法思想: ① 确定要插入数的位置, ② 然后将比这个数大的所有数后移一个位置, ③ 在空出的位置上将该数插入。
#include <stdio.h> void main() { int i, p; int a[11]={1,3,6,7,9,12,14,18,19,20};
for(j=0;j<5;j++)
for(i=0;i<5-j;i++)
if (a[i]>a[i+1])
2、一维数组元素引用的程序实例
以下程序运行后的输出结果是( )。
#include <stdio.h>
void main()
{
int a[5]={1,2,3,4,5},b[5]={0,2,1,3,0},i,s=0;
for(i=0;i<5;i++) s=s+a[b[i]] ;
printf("%d\n", s); }
第四章 数组
第四章 数组
本讲主要任务: 一维数组、二维数组;字符数组。
掌握要求: 掌握以上基本的编程流程、应用以及嵌套应 用。
考试题:一般出现在程序填空题、阅读程序以 及程序编程题中。(核心考试点)
问题:给一组数排序,这组 数该 如何存放呢
111 1 1
1
1
1
111 1
1
1
881 2 8 8
9
4
算法思想: ① 确定要插入数的位置, ② 然后将比这个数大的所有数后移一个位置, ③ 在空出的位置上将该数插入。
#include <stdio.h> void main() { int i, p; int a[11]={1,3,6,7,9,12,14,18,19,20};
第四章_数组
22
4.2
多维数组
下列程序段实现对数组 int s[3][5]的动态赋值: 4.2.3 二维数组元素的引用 for(i=0; i<=2; i++) /* 行标i从0开始变化到2*/ 二维数组的元素也称为双下标变量,其表示的形式为: for(j=0; j<=4; j++) /* 列标j从0开始变化到4*/ 数组名 ][ 列下标 ] scanf( “%d”[ , 行下标 &s[i][j]) ; /*二维数组元素如同普通 其中下标应为整型常量或整型表达式,其取值范围从 整型变量操作*/ 0开始,分别到行数 -1和列数-1。 例如: a[3][4] 通过前面的学习,对数组也可以这样理解:单个变量描述 了空间中‚点‛的概念,一维数组是对单个变量的扩展,它描 表示a数组中行标为3,列标为4的元素。 述了空间中‚线‛的概念,而二维数组又对一维数组做了扩展, 如果要引用数组中的全部元素,只要利用循环语句即 描述了空间中‚平面‛的概念。人们可以模仿二维数组的使用 可实现,这是对数组中元素进行操作的基本算法。对于一 方法来实现多维数组等各种数据容器。例如,可用如下方法定 维数组,只需用单重循环就可完成;而对于二维数组则需 义三维数组: int a[2][3][4]; 要使用两重循环来完成,外循环控制行标变化,内循环控 多维数组元素在内存中的排列顺序为:第一维的下标变化 制列标变化。 最慢,最右边的下标变化最快。
20
s[0][3]
s[1][1] s[1][2]
……
4.2
多维数组
4.2.2 二维数组的初始化 二维数组初始化也是在类型说明时给各下标变量赋以初值。 二维数组可按行分段赋值,也可按行连续赋值。 例如对数组int s[3][5]: (1)按行分段赋值可写为: int s[3][5]={{80,75,92,61,65},{71,59,63,70,85},{87,90,76, 77,85}}; (2)按行连续赋值可写为: int s[3][5]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77, 85}; 这两种赋初值的结果是完全相同的。
4.2
多维数组
下列程序段实现对数组 int s[3][5]的动态赋值: 4.2.3 二维数组元素的引用 for(i=0; i<=2; i++) /* 行标i从0开始变化到2*/ 二维数组的元素也称为双下标变量,其表示的形式为: for(j=0; j<=4; j++) /* 列标j从0开始变化到4*/ 数组名 ][ 列下标 ] scanf( “%d”[ , 行下标 &s[i][j]) ; /*二维数组元素如同普通 其中下标应为整型常量或整型表达式,其取值范围从 整型变量操作*/ 0开始,分别到行数 -1和列数-1。 例如: a[3][4] 通过前面的学习,对数组也可以这样理解:单个变量描述 了空间中‚点‛的概念,一维数组是对单个变量的扩展,它描 表示a数组中行标为3,列标为4的元素。 述了空间中‚线‛的概念,而二维数组又对一维数组做了扩展, 如果要引用数组中的全部元素,只要利用循环语句即 描述了空间中‚平面‛的概念。人们可以模仿二维数组的使用 可实现,这是对数组中元素进行操作的基本算法。对于一 方法来实现多维数组等各种数据容器。例如,可用如下方法定 维数组,只需用单重循环就可完成;而对于二维数组则需 义三维数组: int a[2][3][4]; 要使用两重循环来完成,外循环控制行标变化,内循环控 多维数组元素在内存中的排列顺序为:第一维的下标变化 制列标变化。 最慢,最右边的下标变化最快。
20
s[0][3]
s[1][1] s[1][2]
……
4.2
多维数组
4.2.2 二维数组的初始化 二维数组初始化也是在类型说明时给各下标变量赋以初值。 二维数组可按行分段赋值,也可按行连续赋值。 例如对数组int s[3][5]: (1)按行分段赋值可写为: int s[3][5]={{80,75,92,61,65},{71,59,63,70,85},{87,90,76, 77,85}}; (2)按行连续赋值可写为: int s[3][5]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77, 85}; 这两种赋初值的结果是完全相同的。
PHP第4章数组的使用
2.搜索数组中指定值对应的键
可以使用array_search()函数在数组中搜索给 定的值,如果成功则返回相应的键名。其基本 语法如下: mixed array_search ( mixed $needle , array $haystack [, bool $strict ] ) array_search()函数的功能是在数组haystack 中搜索needle。如果找到则返回相应的键名, 否则返回 FALSE。如果第3个参数strict的值 为TRUE,则array_search()函数还会检查 needle的类型是否和haystack4.1.1 4.1.2 4.1.3
数组的概念 定义一维数组 定义多维数组
4.1.1 数组的概念
数组是在内存中保存一组数据的数据结构,它具有如下特 性:
和变量一样,每个数组都有一个唯一标识它的名称。 同一数组的数组元素应具有相同的数据类型。 每个数组元素都有键(key)和值(value)两个属性, 键用于定义和标识数组元素,键可以整数或字符串;值当 然就是数组元素对应的值。因此,数组元素就是一个“键 /值对”。 一个数组可以有一个或多个键,键的数量也称为数组的 维度。拥有一个键的数组就是一维数组,拥有2个键的数 组就是二维数组,以此类推。
4.1.3 定义多维数组
可以将多维数组视为数组的嵌套,,即多维数 组的元素值也是一个数组,只是维度比其父数 组小一。二维数组的元素值是一维数组,3维数 组的元素值是二维数组,以此类推。可以使用 array()函数来定义多维数组,其基本语法结 构如下: array ( [key => ] array([key => ] value ) , …… ) 其中value还可以嵌套array()函数来定义数组 。
Python程序设计无logo版教学课件第4章数组
4
一维数组定义是一条完整的C语言语句,每条定 义语句结束后,用分号“;”结束。 当需要定义多个同类型数组时,用逗号 “,”进 行连续定义。 例如
int a[10],b[10]; //定义整型数组a和b,分别可放10个元素 float c[20],d[20]; //定义整型数组c和d,分别可放20个元素 double e[30],f[30]; //定义整型数组e和f,分别可放30个元素
14
4.1.5典型例题
【例4-1】计算平均值。给定10个学生考试成绩,计
算平均值并保留小数点后2位。
为了能输入10个学生成绩,须10个变量存储这些学生成绩;
其次,将这些10个成绩依次累加求和并计算平均值。
#include <stdio.h> int main(){ int i; double a[10]; double sum=0.0;//定义变量并初始化 printf("Please insert 10 scores:\n"); for(i=0;i<10;i++)//循环遍历输入10个数据 scanf("%lf",&a[i]); for(i=0;i<10;i++)//循环遍历累加10个数据
sum+=a[i]; printf("The average is:%.2lf",sum/10);//求平均分
15 return 0; }
【例4-2】给定一个长度为N位的整数(N<=100), 请逆序输出。
分析:虽然采用循环和取余方法可以实现int类型整数的 逆序输出但按例题要求,由于整数最大长度为100位,其 数据类型范围肯定超出了int整型的数据类型范围。因此 ,本题采用整型数组解决该问题。
一维数组定义是一条完整的C语言语句,每条定 义语句结束后,用分号“;”结束。 当需要定义多个同类型数组时,用逗号 “,”进 行连续定义。 例如
int a[10],b[10]; //定义整型数组a和b,分别可放10个元素 float c[20],d[20]; //定义整型数组c和d,分别可放20个元素 double e[30],f[30]; //定义整型数组e和f,分别可放30个元素
14
4.1.5典型例题
【例4-1】计算平均值。给定10个学生考试成绩,计
算平均值并保留小数点后2位。
为了能输入10个学生成绩,须10个变量存储这些学生成绩;
其次,将这些10个成绩依次累加求和并计算平均值。
#include <stdio.h> int main(){ int i; double a[10]; double sum=0.0;//定义变量并初始化 printf("Please insert 10 scores:\n"); for(i=0;i<10;i++)//循环遍历输入10个数据 scanf("%lf",&a[i]); for(i=0;i<10;i++)//循环遍历累加10个数据
sum+=a[i]; printf("The average is:%.2lf",sum/10);//求平均分
15 return 0; }
【例4-2】给定一个长度为N位的整数(N<=100), 请逆序输出。
分析:虽然采用循环和取余方法可以实现int类型整数的 逆序输出但按例题要求,由于整数最大长度为100位,其 数据类型范围肯定超出了int整型的数据类型范围。因此 ,本题采用整型数组解决该问题。
第四章 数组
例如,对上例中定义的数组b来说,b[0]是 数组中的第一个元素,b[1]是数组中的第二 个元素,…,b[9]是数组中的最后一个元素, 而不包含b[10]。
4.1一维数组
数组元素在内存中是顺序存储的。对于 一维数组,就是简单地按下标顺序存储。 例如,对上面定义的整型数组a,在内存 中的存放顺序如图4-1所示:
4.1 一维数组
3 数组的赋值
1) 用“=”赋值 与数组的初始化不同,在给数组元素进行赋值
时,若必要须在逐数一组赋之值间。进行赋值,也只能一个 例如一:个对元于素下地述赋的值数组。初始化: 其等例样价如大的:小ii赋nn将 的tt值上 数aa形[[述 组式33]]数b如;=,{下组1可:,a2的以,3值利};赋用给下另面一的个循同环
的存储单元。 根据数组的维数,分为一维数组、二维数组
和多维数组,常用的是一维和二维数组。
4.1一维数组
1.一维数组的定义格式为: 类型 数组名[常量表达式]; 其中,类型是数组类型,即数组中各元素的数据
类型,可以是整型、浮点型、字符型等基本类型。
数组名是一个标识符,代表着数组元素在内存中 的起始地址,它的命名规则与变量名的命名一样。
→对a于[1二][维0]数→a组[1,][可1]以→把a[它1]看[2成]→是a由[1多][3个] 一 →维a数[2组][构0]成→的a[。2]例[1如]→上a例[2:][i2n]t →a[a2[]2[]3[]3;] 就 可以看成是由两个形如int a[3];的一维数 组构成的。
4.2 二维数组
常量表达式又称下标表达式,表示一维数组中元 素的个数,即数组长度(也称为数组大小),用 一对
方括号“[ ]”括起来。方括号“[ ]”的个数代表数 组
4.1一维数组
4.1一维数组
数组元素在内存中是顺序存储的。对于 一维数组,就是简单地按下标顺序存储。 例如,对上面定义的整型数组a,在内存 中的存放顺序如图4-1所示:
4.1 一维数组
3 数组的赋值
1) 用“=”赋值 与数组的初始化不同,在给数组元素进行赋值
时,若必要须在逐数一组赋之值间。进行赋值,也只能一个 例如一:个对元于素下地述赋的值数组。初始化: 其等例样价如大的:小ii赋nn将 的tt值上 数aa形[[述 组式33]]数b如;=,{下组1可:,a2的以,3值利};赋用给下另面一的个循同环
的存储单元。 根据数组的维数,分为一维数组、二维数组
和多维数组,常用的是一维和二维数组。
4.1一维数组
1.一维数组的定义格式为: 类型 数组名[常量表达式]; 其中,类型是数组类型,即数组中各元素的数据
类型,可以是整型、浮点型、字符型等基本类型。
数组名是一个标识符,代表着数组元素在内存中 的起始地址,它的命名规则与变量名的命名一样。
→对a于[1二][维0]数→a组[1,][可1]以→把a[它1]看[2成]→是a由[1多][3个] 一 →维a数[2组][构0]成→的a[。2]例[1如]→上a例[2:][i2n]t →a[a2[]2[]3[]3;] 就 可以看成是由两个形如int a[3];的一维数 组构成的。
4.2 二维数组
常量表达式又称下标表达式,表示一维数组中元 素的个数,即数组长度(也称为数组大小),用 一对
方括号“[ ]”括起来。方括号“[ ]”的个数代表数 组
4.1一维数组
C语言讲义第04章-数组
第四章
数组
《C语言程序设计》
主要内容
• • • • • 数组的概念 一维数组 多维数组 字符数组 小结
4.1
• •
数组的概念
4.1.1 数组的一般概念: 数组是有序数据的集合,数组中的每一个数据都具有 相同的数据类型。每个数组都用一个统一的标识符来 标识,称为数组名。数组中的每一个数据称为数组元 素,数组元素由数组名和下标(数组元素在数组中的 序号)唯一确定。数组元素也可称为下标变量。
4.3 多维数组
• 实现在一维存储器中存放二维数组,可有两种方式: 一种是按行优先存储,另一种是按列优先存储。 • 在C语言中,二维数组是按行存储的。 • 上面的二维数组的存储情况如图所示 :
4.3 多维数组
• 多维数组的定义:
类型说明符 数组名[常量表达式1][常量表达式2] …
• 多维数组在内存中的存放顺序为:按第一维的下标变 化最慢,最后一维的下标变化最快的规则存储
•
注意:
两个字符串比较大小时,只能用strcmp函数,而不能用条件 语句。
4.4 字符数组
6. 测字符串长度函数strlen(strlen为STRing LENgth 的缩写)
1. “下标”可以是非负的整型常量或其值为非负整型数据 的表达式,取值范围是0~(元素个数 - 1)。 2. 一个数组元素,实质上就是一个变量,它具有和相同类 型单个变量一样的属性,可以对它进行赋值和参与各种 运算 3. 在C语言中,数组不能作为一个整体参加数据运算,只 能对单个的元素进行处理
4.2
4.2
一维数组
– 对全部数组元素赋初值。例如:
float fscore [10] = { 85 , 76.5 , 92 , 65 , 82.5 , 76 , 58 , 46 , 69 , 83 } ;
数组
《C语言程序设计》
主要内容
• • • • • 数组的概念 一维数组 多维数组 字符数组 小结
4.1
• •
数组的概念
4.1.1 数组的一般概念: 数组是有序数据的集合,数组中的每一个数据都具有 相同的数据类型。每个数组都用一个统一的标识符来 标识,称为数组名。数组中的每一个数据称为数组元 素,数组元素由数组名和下标(数组元素在数组中的 序号)唯一确定。数组元素也可称为下标变量。
4.3 多维数组
• 实现在一维存储器中存放二维数组,可有两种方式: 一种是按行优先存储,另一种是按列优先存储。 • 在C语言中,二维数组是按行存储的。 • 上面的二维数组的存储情况如图所示 :
4.3 多维数组
• 多维数组的定义:
类型说明符 数组名[常量表达式1][常量表达式2] …
• 多维数组在内存中的存放顺序为:按第一维的下标变 化最慢,最后一维的下标变化最快的规则存储
•
注意:
两个字符串比较大小时,只能用strcmp函数,而不能用条件 语句。
4.4 字符数组
6. 测字符串长度函数strlen(strlen为STRing LENgth 的缩写)
1. “下标”可以是非负的整型常量或其值为非负整型数据 的表达式,取值范围是0~(元素个数 - 1)。 2. 一个数组元素,实质上就是一个变量,它具有和相同类 型单个变量一样的属性,可以对它进行赋值和参与各种 运算 3. 在C语言中,数组不能作为一个整体参加数据运算,只 能对单个的元素进行处理
4.2
4.2
一维数组
– 对全部数组元素赋初值。例如:
float fscore [10] = { 85 , 76.5 , 92 , 65 , 82.5 , 76 , 58 , 46 , 69 , 83 } ;
数据结构课件 第四章 串和数组
else {
s->str=(char*)malloc((len+1)*sizeof(char));
//分配空间
if (!s->str) return ERROR;
s->str[0..len]=string_constant[0..len];
//对应的字符赋值
s->length=len;
//赋予字符串长度
串的抽象数据类型定义
functions:
// 有13种之多
StrAssign(&T, chars) // 串赋值,生成值为chars的串T
StrCompare(S,T)
// 串比较,若S>T,返回值大于0…
StrLength(S)
// 求串长,即返回S的元素个数
Concat(&T, S1, S2) // 串连接,用T返回S1+S2的新串
type unsigned char String[MAX_STRING];
第二种是在程序执行过程中,利用标准函数malloc和free动态
地分配或释放存储字符串的存储单元,并以一个特殊的字符作为字符串
的结束标志,它的好处在于:可以根据具体情况,灵活地申请适当数目
的存储空间,从而提高存储资源的利用率。类型定义如下所示:
(4)串连接 int Concat(STRING *s1,STRING s2) { STRING s; StringAssign(&s,s1->str); //将s1原来的内容保留在s中 len=Length(s1)+Length(s2); //计算s1和s2的长度之和 free(s1->str); //释放s1原来占据的空间 s1->str=(char*)malloc((len+1)*sizeof(char)); //重新为s1分配空间
北京师范大学数据结构教学资料 第4章——数组、串与广义表
精选ppt
25
设矩阵 A 中有 s 个非零元素。令 e = s/(m*n), 称 e 为矩阵的稀疏因子。
有人认为 e≤0.05 时称之为稀疏矩阵。 在存储稀疏矩阵时,为节省存储空间,应只
存储非零元素。但由于非零元素的分布一般 没有规律,故在存储非零元素时,必须记下 它所在的行和列的位置 ( i, j )。 每一个三元组 (i, j, aij) 唯一确定了矩阵A的一 个非零元素。因此,稀疏矩阵可由表示非零 元的一系列三元组及其行列数唯一确定。
精选ppt
26
稀疏矩阵的定义
const int drows = 6, dcols = 7, dterms = 9;
template<class E>
struct Triple {
//三元组
int row, col;
//非零元素行号/列号
E value;
//非零元素的值
void operator = (Triple<E>& R) //赋值
a1 1
a2 1 an1 1
a1 2
a2 2 an1 2
aaan12n1nn111
下 三 角 矩 阵
01 2 3 4 5 6 7 8
n(n+1)/2-1
B a00 a10 a11 a20 a21 a22 a30 a31 a32 …… an-1n-1
若 i j, 数组元素A[i][j]在数组B中的存放位置 为 1 + 2 + + i + j = (i + 1)* i / 2 + j
前i行(0~i-1)元素总数 第i行第j个元素前元素个数
精选ppt
18
4:数组
0 0 12 9 0 0 0 0 3 0 0 0 M 0 0 24 0 0 18 0 0 15 0 0 7 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 67 0 0
col num[col] cpot[col]
i(i-1) Loc(aij)=Loc(a11)+[( +(j-1)]*l 2
对角矩阵 a11 a12 0 …………… . 0
a21 a22 a23 0 …………… 0 a32 a33 a34 0 ………
……………………………
0 0
0
0
按行序为主序:
0 … an-1,n-2 an-1,n-1 an-1,n
?
3 4 5 6 7
6
4
-7
6
3
14
解决思路:只要做到 将矩阵行、列维数互换 将每个三元组中的i和j相互调换 重排三元组次序,使mb中元素以N的行(M的列)为主序
方法一:按M的列序转置 即按mb中三元组次序依次在ma中找到相应的三元组进行转置。 为找到M中每一列所有非零元素,需对其三元组表ma从第一行 起扫描一遍。由于ma中以M行序为主序,所以由此得到的恰是mb 中应有的顺序
i 0 1 ma 2 3 4 5 6 7 6 1 1 3 3 4 5 6 j 7 2 3 1 6 3 2 1 v 8 12 9 -3 14 24 18 15
0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 67 0 0
0 12 9 N 0 0 0 0
算法描述:
算法分析:T(n)=O(M的列数n非零元个数t) 若 t 与mn同数量级,则T (n) O(m n 2 )
col num[col] cpot[col]
i(i-1) Loc(aij)=Loc(a11)+[( +(j-1)]*l 2
对角矩阵 a11 a12 0 …………… . 0
a21 a22 a23 0 …………… 0 a32 a33 a34 0 ………
……………………………
0 0
0
0
按行序为主序:
0 … an-1,n-2 an-1,n-1 an-1,n
?
3 4 5 6 7
6
4
-7
6
3
14
解决思路:只要做到 将矩阵行、列维数互换 将每个三元组中的i和j相互调换 重排三元组次序,使mb中元素以N的行(M的列)为主序
方法一:按M的列序转置 即按mb中三元组次序依次在ma中找到相应的三元组进行转置。 为找到M中每一列所有非零元素,需对其三元组表ma从第一行 起扫描一遍。由于ma中以M行序为主序,所以由此得到的恰是mb 中应有的顺序
i 0 1 ma 2 3 4 5 6 7 6 1 1 3 3 4 5 6 j 7 2 3 1 6 3 2 1 v 8 12 9 -3 14 24 18 15
0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 67 0 0
0 12 9 N 0 0 0 0
算法描述:
算法分析:T(n)=O(M的列数n非零元个数t) 若 t 与mn同数量级,则T (n) O(m n 2 )
第4章 数组向量和数组
4.用函数生成等差元素的向量 格式: 向量名=linspace(初值,终值,个数) 例2, 生成向量(10,15,20,25,30)。 >> a= linspace(10,30,5) a= 10 15 20 25 30
4.1.2 向量的基本运算 1. 向量与数的四则运算 四则运算符:+ ,-, * , / ,\ 格式: 向量 运算符 数值 设向量A=(ai)m ,u是常量, 则 A 运算符 u=(ai 运算符 u) 例4-3 >> vec1=80:-9:10 vec1 = 80 71 62 53 44 35 26 17 >> vec1+101 ans = 181 172 163 154 145 136 127 118
2、生成向量的转置 格式:向量’ 例4-1,由列向量a1(15,21,27,93,101)生成行向量b。 >> a1=[15;21;27; 93; 101] a1 = 15 21 27 93 101 >> b=a1' b= 15 21 27 93 101
3.等差元素的行向量生成 格式: 向量名=初值:步长:终值 说明:步长为1时,可省略. 例4-2, 生成行向量(10,15,20,25,…,80)。 >> vec1=10:5:80 vec1 = Columns 1 through 8 10 15 20 25 30 35 40 45 Columns 9 through 15 50 55 60 65 70 75 80
3. 向量与向量之间的乘运算 格式:向量1*向量2 说明:向量1与向量2具有相同长度,且一个是列向量,另一个是 行向量. 设行向量A=(ai)m ,行向量B=(bi)‘m 。则 A*B=C m 其中, C abFra biblioteki 1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<stdio.h> void main(void) { int a[5]={1,2,3,4,5}; printf("%d, %d, %d\n",a[0],a[1],a[2]); printf("%d, %d, %d,%d\n",a,&a[0],&a[1],&a[2]); }
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
4
第4章 数组
4.2
4.2.1、一维数组的定义
一维数组
合法标识符
语法:
type ArrayName[size];
说明:1. 定义一个含size个type类型元素的数组。 int a[10]; /*定义的整型数组a含10个元素*/ 2. size必须是大于0的整型常量表达式。 3. C语言不允许对数组的大小作动态定义。 4. 编译时分配连续内存: 字节数=size* sizeof(type) char name[0]; float weight[10.3]; float array[-100];
第4章 数组 // Program: EG04-01.C // Description: 输入10 个整数,要求逆序打印其中的自然数。 #include <stdio.h> // 包含标准I/O库函数的说明 void main( void ) // 主函数说明 { short num[10], i ; // 局部变量说明 printf("请输入10个整数:"); for(i=0; i<10; i++) scanf("%d,",&num[i]); // 显示输入提示 // 顺序输入10个数据
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
9
第4章 数组 d. C语言对数组不作越界检查,使用时要 注意 例 int data[5]; data[5]=10; e.数组名a代表的是数组a在内存中的首地址,也即 数组元素a[0]的地址。 scanf(“%d”,&a[0]); 等价于
安徽大学电子信息工程学院--《C语言程序设计》
第4章 数组
4.1 顺序数据处理
/* Program: input a,b,c, and sort them. #include <stdio.h> void main( void ) { float a, b, c, t; */
printf("Input a,b,c:"); scanf("%f,%f,%f", &a, &b, &c); if( a>b ) t=a, a=b, b=t; if( a>c ) 如何对输入的10个整数排序? t=a, a=c, c=t; if( b>c ) t=b, b=c, c=t; printf("%5.2f,%5.2f,%5.2f\n", a, b, c);
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
3
第4章 数组 数组是一组有序的数据的集合--数组中的元素类型相 同,并由数组名和下标唯一地确定。 说明:1. 数组名代表数组的起始地址,是地址常量。 2. 数组元素在内存中是连续存储的。 3. 引用数组元素:数组名[下标],下标从0开始。 short num[10]={ 12 , -23 , 5,0,45 , -81 , 72,56,90,28 }; 存储单元 存储形式:
第4章 数组
【想一想】
(1)如果要逆序访问所有数组元素,上述程序应如 何修改?若要顺序访问所有数组元素呢?
1)逆序访问所有数组元素:,如何修改? for(i=9; i>=0; i--) if(num[i]>0) //去掉该语句即可! printf("%d,", num[i]); 2)要顺序访问所有数组元素呢? for(i=9; i>=0; i--) if(num[i]>0) printf("%d,", num[i]); 改成: for(i=0; i<=9; i++) printf("%d,", num[i]);
printf("逆序打印其中的自然数:"); for(i=9; i>=0; i--) if(num[i]>0) printf("%d,", num[i]); }
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
// 显示输出提示 //逆序访问各数组元素 //打印正数
14
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
15
第4章 数组
【想一想】
((2)图4-6 是数组 num接受输入后的内存存储示意图,你 能指出各个数组元素吗? 需要提醒的是:负数存放的 是十六进制的补码。
(3)程序运行结束后,C 语言提示的“Press any key to continue”怎么和打印的结果跑到一行上了?怎样才能另起一 行?
执行for循环后,加 printf(“\n,")!
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
16
第4章 数组
2. 寻找最大值、最小值和它们的位置 【例4-3】 用C语言编程输入10个整数存入数组 num,找出其中的最大数和它所在的位置。
分析:根据题意,必须先定义一个能存放输入的 10 个整 数的数组 num、计数器 i,利用循环,让计数器 i从 0 递增 到9,依次输入 10 个整数存到 num[i]中。当然,还要定义 一个存放最大数的变量 Max、一个存放最大数所在位置的 变量 MaxPos。对于查找极值的问题,初值的选取是非常 重要的,不能随便定,如果选 0 作为最小值,就无法发现 输入数据中比 0 更小的负数。查找极值的算法通常选取数 组的起始元素和起始位置作为初值。然后利用计数器 i 从 1到 9,依次用 num[i]和 Max 比较,若 Max<num[i],令 Max=num[i]。最后将 Max、MaxPos 打印出来。
}
安徽大学电子信息工程学院--《C语言程序设计》
第4章 数组
★数组概念的引入: 在 C 语言中,除了整型、实型和字符型等基本数 据类型之外,还可以将基本数据类型按照一定的规则 组合起来构成较为复杂的数据类型,称为构造数据类 型,又称导出数据类型,主要包括数组、结构体、共 用体等。 数组中顺序存放了一批相同数据类型的数据,这 些数据不仅数据类型相同,而且在计算机内存里连续 存放,地址编号最低的存储单元存放数组的起始元素, 地址编号最高的存储单元存放数组的最后一个元素。 通过数组名标识和序号(C 语言称为下标)可以引用 这些数组元素。
分析:根据题意,需要定义一个能存放 10 个整数的数组 num 和用于控制下标变化的计数器 i,利用循环,让计数 器 i递增,依次输入各个初值,然后再利用计数器 i 递减 逆序访问每个数组元素,最后打印其中的非零正数。
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
13
a5 f e d
}
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
12
第4章 数组
4.2.4、一维数组应用举例
1. 顺序或逆序访问数组元素
【例4-1】 用C语言编程输入10个整数,要求逆序打印其中 的自然数,例如,输入12,-23,5,0,45,-81,72,56, 90,28,程序输出的结果为28,90,56,72,45,5,12。
存储单元
存储形式: 说明: 数组如果不初始化,其元素值为随机数 可以只初始化部分数组元素,余者自动赋0值。
int a[5]={ 2 , 4 }; int a[5]={ 2 , 4, 0, 0, 0 };
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
6
第4章 数组 说明: 当全部数组元素赋初值时,可不指定数组长度 int a[]={1,2,3,4,5,6}; 编译系统根据初值个数确定数组维数 全局数组或static数组元素自动初始化成0值 static int a[5];static int a[5]={ 0 , 0, 0, 0, 0 };
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
int n=5; int a[n]
5
第4章 数组
4.2.2、一维数组的初始化
语法:
定义时赋初值
type ArrayName[size]={value-list}; int a[5]={ 2 , 4 , 6 , 8 , 10 }; int a[3]={6,2,3,5,1}; ()
、 str[1]、 ……str[25]中
(3)利用输入语句初始化 char str[26]; int i ; for(i=0; i<26; i++) scanf("%c",&str[i]); …...
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
8
第4章 数组
4.2.3. 一维数组的引用:
a. 数组必须先定义,后使用 b. 只能逐个引用数组元素,不能一次引用整个数组 例 int a[10]; printf(“%d”,a); () ()
必须 for(j=0;j<10;j++) printf(“%d\t”,a[j]);
c. 数组元素表示形式: 数组名[下标] 数组元素的下标:0~size-1。
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
4
第4章 数组
4.2
4.2.1、一维数组的定义
一维数组
合法标识符
语法:
type ArrayName[size];
说明:1. 定义一个含size个type类型元素的数组。 int a[10]; /*定义的整型数组a含10个元素*/ 2. size必须是大于0的整型常量表达式。 3. C语言不允许对数组的大小作动态定义。 4. 编译时分配连续内存: 字节数=size* sizeof(type) char name[0]; float weight[10.3]; float array[-100];
第4章 数组 // Program: EG04-01.C // Description: 输入10 个整数,要求逆序打印其中的自然数。 #include <stdio.h> // 包含标准I/O库函数的说明 void main( void ) // 主函数说明 { short num[10], i ; // 局部变量说明 printf("请输入10个整数:"); for(i=0; i<10; i++) scanf("%d,",&num[i]); // 显示输入提示 // 顺序输入10个数据
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
9
第4章 数组 d. C语言对数组不作越界检查,使用时要 注意 例 int data[5]; data[5]=10; e.数组名a代表的是数组a在内存中的首地址,也即 数组元素a[0]的地址。 scanf(“%d”,&a[0]); 等价于
安徽大学电子信息工程学院--《C语言程序设计》
第4章 数组
4.1 顺序数据处理
/* Program: input a,b,c, and sort them. #include <stdio.h> void main( void ) { float a, b, c, t; */
printf("Input a,b,c:"); scanf("%f,%f,%f", &a, &b, &c); if( a>b ) t=a, a=b, b=t; if( a>c ) 如何对输入的10个整数排序? t=a, a=c, c=t; if( b>c ) t=b, b=c, c=t; printf("%5.2f,%5.2f,%5.2f\n", a, b, c);
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
3
第4章 数组 数组是一组有序的数据的集合--数组中的元素类型相 同,并由数组名和下标唯一地确定。 说明:1. 数组名代表数组的起始地址,是地址常量。 2. 数组元素在内存中是连续存储的。 3. 引用数组元素:数组名[下标],下标从0开始。 short num[10]={ 12 , -23 , 5,0,45 , -81 , 72,56,90,28 }; 存储单元 存储形式:
第4章 数组
【想一想】
(1)如果要逆序访问所有数组元素,上述程序应如 何修改?若要顺序访问所有数组元素呢?
1)逆序访问所有数组元素:,如何修改? for(i=9; i>=0; i--) if(num[i]>0) //去掉该语句即可! printf("%d,", num[i]); 2)要顺序访问所有数组元素呢? for(i=9; i>=0; i--) if(num[i]>0) printf("%d,", num[i]); 改成: for(i=0; i<=9; i++) printf("%d,", num[i]);
printf("逆序打印其中的自然数:"); for(i=9; i>=0; i--) if(num[i]>0) printf("%d,", num[i]); }
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
// 显示输出提示 //逆序访问各数组元素 //打印正数
14
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
15
第4章 数组
【想一想】
((2)图4-6 是数组 num接受输入后的内存存储示意图,你 能指出各个数组元素吗? 需要提醒的是:负数存放的 是十六进制的补码。
(3)程序运行结束后,C 语言提示的“Press any key to continue”怎么和打印的结果跑到一行上了?怎样才能另起一 行?
执行for循环后,加 printf(“\n,")!
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
16
第4章 数组
2. 寻找最大值、最小值和它们的位置 【例4-3】 用C语言编程输入10个整数存入数组 num,找出其中的最大数和它所在的位置。
分析:根据题意,必须先定义一个能存放输入的 10 个整 数的数组 num、计数器 i,利用循环,让计数器 i从 0 递增 到9,依次输入 10 个整数存到 num[i]中。当然,还要定义 一个存放最大数的变量 Max、一个存放最大数所在位置的 变量 MaxPos。对于查找极值的问题,初值的选取是非常 重要的,不能随便定,如果选 0 作为最小值,就无法发现 输入数据中比 0 更小的负数。查找极值的算法通常选取数 组的起始元素和起始位置作为初值。然后利用计数器 i 从 1到 9,依次用 num[i]和 Max 比较,若 Max<num[i],令 Max=num[i]。最后将 Max、MaxPos 打印出来。
}
安徽大学电子信息工程学院--《C语言程序设计》
第4章 数组
★数组概念的引入: 在 C 语言中,除了整型、实型和字符型等基本数 据类型之外,还可以将基本数据类型按照一定的规则 组合起来构成较为复杂的数据类型,称为构造数据类 型,又称导出数据类型,主要包括数组、结构体、共 用体等。 数组中顺序存放了一批相同数据类型的数据,这 些数据不仅数据类型相同,而且在计算机内存里连续 存放,地址编号最低的存储单元存放数组的起始元素, 地址编号最高的存储单元存放数组的最后一个元素。 通过数组名标识和序号(C 语言称为下标)可以引用 这些数组元素。
分析:根据题意,需要定义一个能存放 10 个整数的数组 num 和用于控制下标变化的计数器 i,利用循环,让计数 器 i递增,依次输入各个初值,然后再利用计数器 i 递减 逆序访问每个数组元素,最后打印其中的非零正数。
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
13
a5 f e d
}
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
12
第4章 数组
4.2.4、一维数组应用举例
1. 顺序或逆序访问数组元素
【例4-1】 用C语言编程输入10个整数,要求逆序打印其中 的自然数,例如,输入12,-23,5,0,45,-81,72,56, 90,28,程序输出的结果为28,90,56,72,45,5,12。
存储单元
存储形式: 说明: 数组如果不初始化,其元素值为随机数 可以只初始化部分数组元素,余者自动赋0值。
int a[5]={ 2 , 4 }; int a[5]={ 2 , 4, 0, 0, 0 };
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
6
第4章 数组 说明: 当全部数组元素赋初值时,可不指定数组长度 int a[]={1,2,3,4,5,6}; 编译系统根据初值个数确定数组维数 全局数组或static数组元素自动初始化成0值 static int a[5];static int a[5]={ 0 , 0, 0, 0, 0 };
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
int n=5; int a[n]
5
第4章 数组
4.2.2、一维数组的初始化
语法:
定义时赋初值
type ArrayName[size]={value-list}; int a[5]={ 2 , 4 , 6 , 8 , 10 }; int a[3]={6,2,3,5,1}; ()
、 str[1]、 ……str[25]中
(3)利用输入语句初始化 char str[26]; int i ; for(i=0; i<26; i++) scanf("%c",&str[i]); …...
安徽大学电子信息工程学院 --《C语言程序设计》 2015-5-20
8
第4章 数组
4.2.3. 一维数组的引用:
a. 数组必须先定义,后使用 b. 只能逐个引用数组元素,不能一次引用整个数组 例 int a[10]; printf(“%d”,a); () ()
必须 for(j=0;j<10;j++) printf(“%d\t”,a[j]);
c. 数组元素表示形式: 数组名[下标] 数组元素的下标:0~size-1。