第六章数组

合集下载

C++程序设计 第六章 数组

C++程序设计  第六章 数组

C++程序设计第6章数组单个变量只能存放一个数据值。

当程序中要处理一组相同类型、彼此相关的一组数据时,单个变量就不适合了,就需要一种特殊的数据结构来处理,这就是数组。

数组(array)是一种派生类型。

一个数组能同时存放多个数据值,并能对每个数据进行访问。

本章将介绍一维数组、二维数组和字符数组的定义及使用。

6.1 一维数组一个数组(array)是由相同类型的一组变量组成的一个有序集合。

数组中的每个变量称为一个元素(element),所有元素共用一个变量名,就是数组的名字。

数组中的每个元素都有一个序号,称为下标(index)。

访问一个元素就可以用数组名加下标来实现。

数组必须先定义后使用。

6.1.1 一维数组的定义一维数组就是具有一个下标的数组。

定义一个数组有3个要素:类型、名称与大小。

语法格式为:<数据类型> <数组名> [<常量表达式>]其中,<数据类型>确定了该数组的元素的类型,可以是一种基本数据类型,也可以是已定义的某种数据类型。

<数组名>是一个标识符,作为数组变量的名字。

方括号中的<常量表达式>必须是一个正整型数据,其值为元素的个数,即数组的大小或长度。

注意这里的方括号[]表示数组,而不是表示可缺省内容。

例如,下面定义了三个不同类型的数组:int a[5]; //定义了一个int数组afloat b[20]; //定义了一个float数组bdouble c[5]; //定义了一个double数组c对于上面数组a,元素类型为int,a是数组名,方括号中的10表示数组的长度,即该数组包含了5个元素,分别是a[0]、a[1]、a[2]、a[3]、a[4]。

如果一个数组有n个元素,那么数组中元素的下标从0开始到n-1。

具有相同类型的数组可以在一条说明语句中定义。

例如:int a1[5], a2[4]; //同时定义两个整型数组具有相同类型的单个变量和数组也可以在一条语句中定义。

C++课件第六章数组

C++课件第六章数组

解决方法
在使用数组之前,应该为其所有元素 分配初始值。可以使用循环来遍历数 组并为每个元素赋值。同时,也可以 考虑使用标准库中的容器类,如 std:vector或std:array,它们可以自 动管理元素的初始化和销毁。
数组下标从0开始还是从1开始
总结词
详细描述
在C中,数组的下标从0开始而不是从 1开始。
C++课件第六章 数 组
目录
CONTENTS
• 数组的概述 • 数组的声明与初始化 • 数组的操作 • 数组的应用 • 数组的常见错误与注意事项 • 练习题与答案
01
数组的概述
数组的概述
• 请输入您的内容
02
数组的声明与初始 化
一维数组的声明与初始化
总结词
一维数组是具有线性结构的数组,可以通过指定数组大小来 声明和初始化。
插入排序
将数组分为已排序和未排序两部分,初始时已排序部分包含一个元素,之后从未排序部分 取出元素,并在已排序部分找到合适的插入位置插入,并保持已排序部分一直有序。重复 此过程,直到未排序部分元素为空。
数组在查找算法中的应用
线性查找
从数组的第一个元素开始,逐个比较,直到找到目标元素或遍历完整个数组。
详细描述
在C中,一维数组的声明需要指定数组的大小,例如int array[10]表示一个包含10个整数的数组。可以通过指定初始 值来初始化数组,例如int array[5] = {1, 2, 3, 4, 5}。如果没 有指定初始值,数组将自动被初始化为0或空值。
二维数组的声明与初始化
总结词
二维数组是具有矩阵结构的数组,可以通过指定行数和列数来声明和初始化。
详细描述
在C中,二维数组的声明需要指定行数和列数,例如int array[3][4]表示一个包含3行4列的二维数组。可以通过指 定初始值来初始化二维数组,例如int array[2][3] = {{1, 2, 3}, {4, 5, 6}}。如果没有指定初始值,数组将自动被初 始化为0或空值。

第6章 数组

第6章 数组

第六章数组学习和解题要点1.要学习和掌握C语言的数组问题,首先必须形成这么一个观念,当用数组定义语句:[存储类型] 数据类型数组名[长度];定义一个数组时,表明请求计算机在内存开辟一个大的空间,该空间的名字即为数组名,同时数组名也是该空间在内存的起始地址。

空间的大小由“长度”决定,因此“长度”必须是正整常数明确确定。

即使是N,该N也必须在前面的#define N中明确指明是多少。

该空间可放“长度”个同一类型的数据。

放什么样的数据由数据类型指定。

如:int a[10]; 表明内存地址为a 放10个整数,每个小空间为a[0],a[1],……,a[9]a↘2. 有的想用下面的方法定义任意大小的数组:int n;scanf(“%d”,&n);int a[n];认为从键盘输入一多少大整数给n,则就定义多少大的数组。

这也是错误的。

因为C语言规定,执行语句以后,就不能再出现定义语句。

这种根据程序的需要随时申请空间的称为“动态数据结构”,要用以后的结构类型和指针来解决。

3.可在定义数组的同时,马上就赋初值。

也可由初值的个数决定数组的大小。

如:int a[]={1,2,3,4,5,6,7,8,9,10};4.对数值型的数组操作,只能一个元素一个元素的使用,每一的元素的使用都可以看成一个变量的使用,称之为带下标的变量,而决不允许用数组名。

如 a[i] 当i为多少时即为那一个元素。

在程序中要时时注意现在是对那一个元素操作,如在教材中的“冒泡排序法”和“选择排序法”的程序中要注意现在下标是那一个元素。

注意:定义中的int a[10] 表示共10个元素,而程序中的a[10]表示带下标的变量。

5.二维数组的定义与一维一样,必须有二个正整常数明确确定,我们可以看成多少行和多少列个元素,如果在定义数组的同时赋初值,则第一维的长度可以省略。

无论如何,第二维的长度决不能缺省。

6.对数值型的二维数组,也只能一个元素一个元素的使用,这时一定要二个下标,表示那一行那一列的元素。

第6章 数组

第6章 数组
结束
一维数组的引用 数组的引用通常是对数组元素的引用。 一维数组元素的表示形式为: 数组名(下标 下标) 数组名 下标 说明: (1)下标可以是整型常量或整型表达式。 (2)引用数组元素时,下标值应在数组声 明的范围之内。否则将会出错。 (3)一般通过循环语句及InputBox函数给 数组输入数据。数组的输出一般用Print 方法、标签或文本框实现。
结束
Public Sub Command1_Click() Dim score! (5) , aver!, i% aver = 0 For i = 1 To 5 score(i) = InputBox("请输入第 & i & "个学生的成绩 请输入第" 个学生的成绩") 请输入第 个学生的成绩 Label4.Caption = Label4.Caption & score(i) & Space(5) aver = aver + score(i) Next i aver = aver / 5 Label5.Caption = Label5.Caption & aver & Space(5) For i = 1 To 5 If score(i) > aver Then Label6.Caption = Label6.Caption & score(i) & Space(5) End If Next i End Sub
结束
再将A(1)分别与A(3)、…、A(10)比较,并 且依次作出同样的处理。最后,10个数中 的最小者放入了A(1)中。 第2轮:将A(2)分别与A(3)、…、A(10)比 较,并依次作出同第1轮一样的处理。最后, 第1轮余下的9个数中的最小者放入A(2)中, 亦即A(2)是10个数中的第二小的数。 照此方法,继续进行第3轮… …

C语言 第六章 数组

C语言 第六章 数组
2.
6
6.1 排序问题
3. 初始化
类型名 数组名[数组长度]={初值表}; 初值表中依次放着数组元素的初值。例如: int a[10]={1,2,3,4,5,6,7,8,9,10}; 静态存储的数组如果没有初始化,系统自动给所有的数组元素赋0。 即 static int b[5]; 等价于 static int b[5]={0,0,0,0,0}; 初始化也可以只针对部分元素,如 static int b[5]={1,2,3}; 只对数组b的前3个元素赋初值,其余元素的初值为0。又如 int f[20]={0,1}; 对数组f的前两个元素赋初值,其余元素的值 不确定。
18
6.2 矩阵中最大值的位置
4. 使用二维数组编程
例7:定义一个3*2的二维数组a,数组元素的值由下式给 出,按矩阵的形式输出a。a[i][j]=i+j(0≤i ≤2, 0≤j ≤1), 见文件p131ex7-6.cpp
i
j
第1次 第2次 第3次 第4次 第5次
第6次
0 0 1 1 2
2
0 1 0 1 0
9
6.1 排序问题
4. 使用一维数组编程
例4:输入一个正整数n(1<n≤10), 再输入n个整数,将它们存入 数组a中。 ① 输出最小值和它所对应的下标。 ② 将最小值与第一个数交换,输 出交换后的n个数。 数组的长度在定义时必须确定, 如果无法确定需要处理的数据 数量,至少也要估计其上限, 并将该上限值作为数组长度。 因为n ≤10,数组长度就取上 限10。此外,如果用变量 index记录最小值对应的下标, 则最小值就是a[index]。 见p124ex7-4.cpp
8
6.1 排序问题
4. 使用一维数组编程

第6章 数组

第6章 数组
9
数组的声明- 6.2 数组的声明-二维数组
• 二维数组即下标个数为 的数组,其声明形式为: 二维数组即下标个数为 的数组, 声明形式为 即下标个数为2的数组 •
数组名[常量表达式 常量表达式2]; 常量表达式1][常量表达式 数据类型 数组名 常量表达式 常量表达式 例如,如果要存储60名学生 门课程的成绩, 名学生3门课程的成绩 例如,如果要存储 名学生 门课程的成绩,就可 以声明一个二维数组: 以声明一个二维数组: float score[60][3]; 或 const int row = 60, col = 3; float score[row][col]; 二维数组可以看做一个二维表(如图6-2所示 所示), 二维数组可以看做一个二维表(如图 所示), 因此,通常将数组中的第1个下标 即常量表达式1) 个下标( 因此,通常将数组中的第 个下标(即常量表达式 ) 称为行下标 行下标, 个下标( 称为行下标,第2个下标(即常量表达式 )称为列 个下标 即常量表达式2)称为列 下标。如score[row][col]中,row为行下标,col为 下标。 中 为行下标, 为 为行下标 列下标。 列下标。
比如,要存储60名学生 门课程的成绩, 名学生3门课程的成绩 比如,要存储 名学生 门课程的成绩,也可以 采用如下形式的一维数组: 采用如下形式的一维数组: float score[180]; 该一维数组长度为180,所以可以用来存储60名 该一维数组长度为 ,所以可以用来存储 名 学生*3门课程 门课程=180份成绩信息。 份成绩信息。 学生 门课程 份成绩信息
存储和分析的情况, 存储和分析的情况,而仅使用先前所学习的基本数 据类型来解决这类问题会非常烦琐。 据类型来解决这类问题会非常烦琐。 比如要对一个班中50名学生的成绩求平均值,就需 比如要对一个班中 名学生的成绩求平均值, 名学生的成绩求平均值 要定义50个变量 个变量score1, score2, …, score50来保存这 要定义 个变量 来保存这 50名学生的成绩,然后再通过计算 名学生的成绩, 名学生的成绩 (score1+score2+…+score50)/50得到平均成绩。如 得到平均成绩。 … 得到平均成绩 果求10000名儿童的平均体重,这种方法的编程工 名儿童的平均体重, 果求 名儿童的平均体重 作量就会非常大。 作量就会非常大。

C语言课件第6章 数组

C语言课件第6章 数组

6.2.3 一维数组元素的初始化
一维数组初始化格式为: 数据类型 数组名[常量表达式]={初值表}; (1)在定义时对数组元素赋初值。 例如:int a[5]={1,2,3,4,5}; (2)“初值表”中的初值个数,可以少于元素个数,即允许只给 部分元素赋初值。例如:int a[5]={1,2,3}; (3)如果对数组的全部元素赋以初值,定义时可以不指定数组长 度(系统根据初值个数自动确定)。 int a[5]={1,2,3,4,5};可以写成: int a[ ]={1,2,3,4,5}; (4)如果想使一个数组中全部元素值为0,可以写成: int a[5]={0,0,0,0,0}; 或写成:int a[5]={0};
3.程序代码 #include "stdio.h" void main() /*定义50个浮点型变量分别保存每位同学的成绩*/ { float score1,score2,……,score50,average; scanf("%f",&score1); /*从键盘输入成绩*/ scanf("%f",&score2); …… scanf("%f",&score50); printf("pass-fail numbers:\n"); if(score1< 60) /*输出成绩不及格学生的学号*/ printf("1"); if(score2<60) printf("2"); …… if(score50<60) printf("50"); }
score[0] score[1] score[2] score[3] score[4] score[5] …… score[49]

第六章 数组.

第六章 数组.

sc(i, j) = InputBox("输入sc(" &i & "," & j & ") 的值") Next j Next I
3、数组在内存中存放的顺序 数组在内存中存放时,首先变化的是最后一维的 下标,然后变化倒数第二维的下标…(按行存放)。 例如,数组A(4,3)在内存中的分配如下:
A(0,0) A(1,0)
其表示形式: A(1),A(6) X(1,1), X1(1,6), X(2,6)
Y(0,0,0), Y(1,2,5)
6.2 一维数组
一、 一维数组的声明 (无隐式声明)
形式:
Dim 数组名([<下界>to]<上界>)[As <数据类型>] 或: Dim 数组名[<数据类型符>]([<下界>to]<上界>) ‘ 声明了a数组有6个元素 数组元数的数据类型
二、 访问整个数组
对于数组中的各个元素,我们可以用数组名称 (索引值)进行访问。然而,是无法只用数组名称就 对所有的元素进行计算。
例如:要把数组中的各元素值都加上1 这是错误的! Dim X(4)
X=X+1 For I=0 to 4 x(i)=x(i) +1 这是正确的!
Next
无法对数组中的所有元素同时进行运算处理。 但是,可以一次“读取”整个数组本身。
6.4 数据排序与查找
数据交换
将A和B两个变量中的数值交换
A=B B=A Temp=A
A=B
B=Temp
一、选择排序
算法思想:
1)对有n个数的序列(存放在数组a(n)中),从中选 出最小(升序)或最大(降序)的数,与第1个数交 换位置;

第6章数组(一维数组)

第6章数组(一维数组)

9
31
1
for ( i=0; i<n-1; i++ ) for (( j=0; j<n-1-i; j++ ) for j=0; j<n-1; j++ ) 相邻两数比较, ) if ( a[j]>a[j+1] 前小后大 a[j]a[j+1]
• • • • • 其他不变,改变声明项为:int 其他不变,改变声明项为:int 其他不变,改变声明项为:int 其他不变,改变声明项为:int 其他不变,改变声明项为: int n; a[n]={0,1,2,3}; a[4]={0,1,2,3}; a[4]={2,8}; a[4]={2,4,6,8,10}; a[4]={2,4,6,d};
注意: 不能写成 b=a;
•例:(P159)
16
[例] N盏灯排成一排,从1到N按顺序依次编号。有N 个人也从1到N依次编号。第一个人(1号)将灯全部 关闭。第二个人(2号)将凡是2和2的倍数的灯打开。 第三个人将凡是3和3的倍数的灯做相反处理(该灯如 为打开的,将它关闭;如为关闭的,将它打开)。以 后的人都和3号一样,将凡是与自己相同的灯和是自 己编号倍数的灯做相反处理。请问:当第N个人操作 之后,哪几盏灯是点亮的。
17
#include <stdio.h> #define N 10 void main(void) { int lamp[N+1]; int i,j,k; for(i=1;i<=N;i++) /*将灯全部关闭*/ lamp[i]=0; for(i=2;i<=N;i=i+2) /*将凡是2和2的倍数的灯打开*/ lamp[i]=1; for(j=3;j<=N;j++) /*将3和3的倍数的灯做相反处理*/ for(i=j;i<=N;i=i+j) for(i=1,k=j;k<=N;k=i*j,i++) lamp[i]=!lamp[i]; for(i=1;i<=N;i++) if(lamp[i]) printf("%2d", i); }

C语言 — 第六章 数组(大学使用教程)

C语言 — 第六章 数组(大学使用教程)
21
数组常用的循环形式
法一 int i,a[100]; for(i=0;i<100;i++) a[i]=i; 法二 int i,a[100]; for(i=0;i<=99;i++) a[i]=i;
C程序中常用的是第一种方法。 程序中常用的是第一种方法。 此法中,循环变量的终值是“小于”而非“等于” 此法中,循环变量的终值是“小于”而非“等于” 数组长度!否则将导致“越界”的发生。 数组长度!否则将导致“越界”的发生。


• 数组是一组有序的同类型数据 。 • 数据称为数组的元素。 数据称为数组的元素。
6
数组的用处
保存大量同类型的相关数据 – 如矩阵运算,表格数据等 如矩阵运算,
数组的特点
快速地随机访问 一旦定义, 一旦定义,不能改变大小
7
§6.1 数组的定义与初始化
数组的定义 : 数组在使用前要进行定义: 名称、类型、维数、 数组在使用前要进行定义 名称、类型、维数、大小 定义格式: 定义格式: 类型标识符 数组名[常量表达式1][常量表达式2]…… 数组名[常量表达式1][常量表达式2] 1][常量表达式2]
如有数组 int a[5]; 其中数据为:2、4、23、6、78 其中数据为: 、 、 、 、 则存放情况如下: 则存放情况如下:
12
数组在内存 中的首地址
2000 2002
2的低位字节 的低位字节 2的高位字节 的高位字节 4的低位字节 的低位字节 4的高位字节 的高位字节
a[0] a[1] a[2] a[3] a[4]
即a=2000
2004 2006 2008
int a[5]={ 2,4, 23,6,78 };

C++课件第6章 数组

C++课件第6章 数组
第6章 数 组
学习目标




掌握数组的定义与使用方法,学会利用数组 编写程序。 掌握数组元素的初始化方法。 掌握字符数组处理字符串的技巧。 熟悉字符串处理函数的功能及使用方法。 掌握数组作为函数参数的使用方法。
6 数组

在需要处理一批具有相同类型而且又有密切关联的数 据时,数组是一个非常有用的可构造的数据类型(派生 数据类型) 。 派生数据类型:由已有的基本数据类型(char, float, double, …)或已构造的数据类型构造出的新类型。

由这种形式我们可以了解更高维的数组。一个三维数 组实际上可以看作是元素为二维数组的数组,依此类 推。
6.2.2 二维数组的初始化

二维数组的初始化:
1. 分行给二维数组赋初值。 int a[2][3]={{1,2,3},{4,5,6}};
1 2 3 4 5 6
1 2 3 4 5 6 2. 按数组的排列顺序对各数组元素赋初值。 int b[2][3]={1,2,3,4,5,6}; 1 0 0 0 5 0 0 0 3. 可以对部分元素赋初值。 9 0 0 0 1 0 0 0 int c[3][4]={{1},{5},{9}}; 5 6 0 0 0 9 7 0 int d[3][4]={{1},{5,6},{0,9,7}}; 1 2 3 4 5 6 4. 在对全部数组元素赋初值时,数组第一维的长度可以不指定。 0 0 3 0 0 0 0 0 int e[ ][3]={1,2,3,4,5,6}; 0 10 0 0 int f[ ][4]={{0,0,3},{0},{0,10}};
3.
4.
#include <iostream.h> void main(void) { int s[10]={ -56, -23, 0, 8, 10, 12, 26, 38, 65, 98 }; int low, high, binary, x; cout<<"input x="; cin>>x; low=0; high=9; binary=(low+high)/2; //确定折半位置 while ( x!=s[binary] && low<=high ){ if (x<s[binary]) high=binary-1; //在前半区间查找 else low=binary+1; //在后半区间查找 binary=(low+high)/2; } if (low<=high) cout<<"查找成功! 是数组中的第"<<binary<<"个元素。"<<endl; else cout<<"查找失败!"<<endl; }

c语言教学第6章 数组

c语言教学第6章  数组

§ 6.1 基本概念
整形、实型、字符型都属于基本类型。 其存储特点是:每个变量单独存储,亦称简单变 量。 如:char X=„a‟; int y1=0,y2; y2=X-1; 各变量之间独立存放,没有任何联系。
数组
数组是一种构造的数据类型,在计算机中分配连续 的内存空间。 数组:按序排列的具有相同类型的变量的集合。 用一符号名(数组名)来表示这一数组; 用数组名跟下标来唯一确定数组中的元素;
四、二维数组的初始化 (按行存放) 1、按存放顺序赋值 如:int x[2][3]={1,2,3,4,5,6}; 2、按行赋值 如:int x[2][3]={ {1,2,3},{4,5,6} }; 3、部分赋值 如:static int x[2][3]={1,2,4}; static int x[2][3]={ {1,2,},{4} }; 4、省略第一维长度 如: static int x[][3]={1,2,3,4,5,6,7};
课后 练习:分别定义一个一维数组和一个二维数组并 初始化,找出一维数组和二维数组中的最大元素和最小 元素以及对应的下标。
§6.4
字符数组
定义形式: char 数组名[exp]
一 、字符数组的定义 如:char c[5]; 在C语言中没有专门的字符串 c[0]=„h‟; c[1]=„a‟ 变量,而是将字符串存入字符数 c[2]=„p‟; c[3]=„p‟; 组来处理。 c[4]=„y‟; 即用一个一维数组来存放一 还可以这样定义: 个字符串,每个元素存放一个字 int c[5]; 符。
c[0]=„h‟; c[2]=„p‟; c[4]=„y‟; c[1]=„a‟ c[3]=„p‟;
二、字符数组的初始化
1、按单个元素赋值
static char c[10]={„s‟,„t‟,„o‟,„r‟,„e‟};

全国信息学奥赛高中组入门基础讲解第六章数组(教学设计+源代码)

全国信息学奥赛高中组入门基础讲解第六章数组(教学设计+源代码)
其次,在课堂提问环节,我发现部分学生对于数组的相关概念理解不够深入,难以运用数组解决实际问题。针对这一点,我计划在未来的教学中,通过更多实际案例的分析,帮助学生将数组知识与实际应用相结合,提高他们的问题解决能力。
此外,在教学过程中,我注重了师生互动,鼓励学生积极参与讨论和提问。但反思后发现,课堂上的互动更多地集中在学生回答问题环节,而在学生自主学习和探究环节,互动相对较少。为了提高学生的自主学习能力,我计划在未来的教学中,增加小组合作环节,引导学生相互讨论、交流,培养他们的团队合作精神。
7. 作业布置(2分钟)
教师布置与数组相关的编程作业,要求学生在课后完成。作业难度要适中,旨在检验学生对课堂知识的掌握程度。
整个教学过程设计注重师生互动,充分调动学生的积极性、主动性和创造性。教学环节紧凑,突出重难点,注重实际应用,使学生在轻松愉快的氛围中掌握数组知识。
拓展与延伸
1. 提供与本节课内容相关的拓展阅读材料:
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
这些题型涵盖了数组的基本概念、声明与初始化、访问与引用、遍历、操作和排序等方面的知识点,能够帮助学生巩固和加深对数组的理解和掌握。通过解决这些实际问题,学生能够更好地将数组知识应用于编程实践。
2. 学生的学习兴趣、能力和学习风格:针对数组这一章节,学生可能对编程实践和问题解决具有较强的兴趣。在学习能力方面,学生应该具备一定的编程实践能力和逻辑思维能力。在学习风格上,学生可能更倾向于通过实践和案例分析来学习,因此需要提供丰富的编程实例和实际问题。

第6章 数组矩阵和集合

第6章 数组矩阵和集合

13
4.稀疏矩阵的压缩存储 4.稀疏矩阵的压缩存储
2 0 0 A= 0 12 0 0 0 0 0 0 6 0 0 0 4 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 5
只存储非零元素 三元组(row,col, 三元组(row,col,value) 例如对于非零元素2 其三元组表示为( 例如对于非零元素2,其三元组表示为(0,0,2)
i × (i + 1) + j i≥ j 2 k= j × ( j + 1) +i i < j 2
11
2.三角矩阵
当一个方阵的主对角线以上或以下的所有 元素皆为零时,该矩阵称为三角矩阵; 元素皆为零时,该矩阵称为三角矩阵;三角矩 阵有上三角矩阵和下三角矩阵, 阵有上三角矩阵和下三角矩阵,图是两种特殊 矩阵的形式。 矩阵的形式。
12
3.对角矩阵的压缩存储 3.对角矩阵的压缩存储: 对角矩阵的压缩存储:
对角矩阵是指除了主对角线上和直接在对角线上下的对角线上的元 素外,其他所有元素皆为零的矩阵。 素外,其他所有元素皆为零的矩阵。
B[0,0] B[0,1] B[1,0] B[1,1] B[1,2] B= B[2,1] B[2,2] B[2,3] ⋱ ⋱ B[n - 1, n - 2] B[n - 1, n - 1]
8
矩阵在科学与工程计算中有着广泛的应用, 矩阵在科学与工程计算中有着广泛的应用,但在数 据结构中我们研究的不是矩阵本身, 据结构中我们研究的不是矩阵本身,而是如何在计算机 中高效地存储矩阵、实现矩阵的基本运算。 中高效地存储矩阵、实现矩阵的基本运算。在高级语言 编程中,通常用二维数组来表示矩阵。 编程中,通常用二维数组来表示矩阵。这样利用上面的 地址计算公式可以快速访问矩阵中的每一个元素。但实 地址计算公式可以快速访问矩阵中的每一个元素。 际应用中会遇到一些特殊矩阵。 际应用中会遇到一些特殊矩阵。 所谓特殊矩阵是指矩阵中值相同的元素或者零元素 的分布有一定的规律。 的分布有一定的规律。通过分析特殊矩阵中非零元素的 分布规律,只存储其中的必要的、有效的信息, 分布规律,只存储其中的必要的、有效的信息,为了节 省存储空间,可以对这些矩阵进行压缩存储。 省存储空间,可以对这些矩阵进行压缩存储。所谓压缩 就是为多个值相同的元素只分配给一个存储空间。 就是为多个值相同的元素只分配给一个存储空间。由于 特殊矩阵中非零元素的分布有明显的规律, 特殊矩阵中非零元素的分布有明显的规律,因此我们可 将其压缩存储到一个一维数组中, 将其压缩存储到一个一维数组中,并找到每个非零元素 在一维数组中的对应关系。常见的特殊矩阵有: 在一维数组中的对应关系。常见的特殊矩阵有:对称矩 9 三角矩阵和三对角矩阵。 阵、三角矩阵和三对角矩阵。

C语言程序设计课件第06章数组、指针与字符串.ppt

C语言程序设计课件第06章数组、指针与字符串.ppt
pa+i)就是a[i]. –a[i], *(pa+i), *(a+i), pa[i]都是等效的。 –不能写 a++,因为a是数组首地址(是常量)。
17
指针数组
指 数组的元素是指针类型 针 例:Point *pa[2];
由pa[0],pa[1]两个指针组成
*i_pointer 3i
2000
9
指针变量的初始化
指 语法形式 存储类型 数据类型 *指针名=初始地址; 例:int a , *pa=&a;
针 注意事项
➢用变量地址作为初值时,该变量必须在指针初始化 之前已说明过,且变量类型应与指针类型一致。
➢可以用一个已赋初值的指针去初始化另一个指针变 量。
组 ➢ 数组下标从零开始。 ➢ 下标必须是整形表达式。 ➢ 数组元素可以在定义时直接给出初始值列表。 ➢ 数组元素作函数参数同简单变量作函数参数。 ➢ 数组名作函数参数传递的是地址值。 ➢ 二维数组在内存中按行存放。
4
对象数组
数 声明:
类名 数组名[元素个数];
组 访问方法:
数组名[下标].成员名
与!=的关系运算。

– 指向不同数据类型的指针,以及指针与一
般整数变量之间的关系运算是无意义的。
– 指针可以和零之间进行等于或不等于的关
系运算。例如:p==0或p!=0
16
指向数组元素的指针
指 声明与赋值
例:int a[10], *pa;
针 pa=&a[0]; 或 pa=a;
通过指针引用数组元素
C++语言程序设计
第六章 数组、指针与字符串
本章主要内容
数组 指针 动态存储分配 深拷贝与浅拷贝 字符串

C语言程序设计知识点—第6章 数组

C语言程序设计知识点—第6章 数组
[练习]以下能正确定义一维数组的选项是( ) A.int a[5]={0,1,2,3,4,5}; B.char a[]={0,1,2,3,4,5} C.char a={„A‟,‟B‟,‟C‟}; D.int a[5]=”0123”; 答案:B
[练习]以下叙述中错误的是( ) A.对于 double 类型数组,不可以直接用数组名对数组进行整体输入或输出 B.数组名代表的是数组所占存储区的首地址,其值不可改变 C.当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出”下标越界”
[练习]以下程序的输出结果是( )
main()
{
int a[3][3]={{1,2,9},{3,4,8},{5,6,7}},i,s=0;
for (i=0;i<3;i++)
s+=a[i][j]+a[i][3-i-1];
printf(“%d\n”,s);
}
答案:30
[练习]有以下程序:
#include <stdio.h>
puts 函数完全可以由 printf 函数取代。 当需要按一定格式输出时,通常使用 printf
~ 10 ~
C 语言程序设计知识点
主讲教师:杨剑
函数。 字符串示例
#include <stdio.h> void main() {
char line[30]; int i,count = 0; printf("\n 请输入一行字符:\n "); gets(line); i=0; while(line[i] != '\0') { if(line[i] == ' ') count++; i++;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二维数组
3
2、使用数组的说明 (1)数组名的书写规则应符合标识符的书写规定; (2)在C语言中,数组元素的下标起始值是0; 【例】int a[5]包含的数组元素为a[0]、a[1]、a[2]、a[3]、a[4]; 【例】int b[2][2]包含的数组元素为:
b[0][0]、b[0][1]、b[1][0]、b[1][1];
}
9
现在用数组改写“从键盘顺序输入3个整数,然后按逆序将它们
输出”程序。
#include<stdio.h> main( ) { int i ,a[3]; for(i=0;i<=2;i++) scanf("%d",&a[i]);
for(i=2;i>=0;i--)
printf("%d\n",a[i]); }
7
初值表,数组的长度由赋给数组元素的初值个数决定,对于二维 数组只能第一个下标运算符为空,同时也必须附带初值表,未定 义维的长度由初值个数来决定; 【例】int s[ ][3]; int s[ ][3]={ 3,5,7,11,13,15 };
使用数组的优势:
【例】从键盘顺序输入3个整数,逆序输出。
{ int a[7];
int i,j,t; printf("input 6 numbers :\n"); for (i=1; i<7; i++) /*对数组进行初始化*/ scanf("%d",&a[i]);
29
for(j=1;j<6;j++) for(i=1;i<=6-j; i++)
if (a[i]>a[i+1])
float array[sizeof(double)];
(7)数组名是地址常量,代表整个数组存储空间的首地址,数组
名的值与第一个元素的地址是相同的; 【例】定义一个数组,并输出它的地址。
6
运行结果:
Vc环境不能用这函数 可以用函数system(“cls”) 代替
(8)在数组说明中仅给出一对空括号时,数组的说明必须附带
10
6.2.2 数组的引用 数组是以下标变量的形式加以引用的,有下标法和指针法两种
引用形式。
1、引用形式 数组名[下标1][下标2]…
数组必须先定义,后使用。C语言规定只能逐个引用数组元素而
不能一次引用整个数组。 【例】int a[3]; printf(“%d\n”,a)
错误
【例】for(i=0;i<=2;i++)
22
【例】int y[3][2]={ {0, 1},{2, 3},{4, 5} };
int y[3][2]={0, 1, 2, 3, 4, 5}; (3)C语言允许在数组定义时不指定维的长度,由初值表中初值 的个数来间接决定长度。 【例】float s[ ]={1.1, 2.2, 3.3, 4.4}; 【例】int a[ ][2]={1, 2, 3, 4, 5, 6};
printf(“Input year,month,day:\n”);
scanf(“%d%d%d”,&year,&month,&day); if(year%4==0&&year%100!=0||year%400==0) leap=1;
else leap=0;
for(i=1;i<month;i++) day=day+mdtab[leap][i]; printf(“days=%d\n”,day); }
按序在内存中存储第一行的各个元素,再按序存储第二行的各个 元素;下图表示对a[3][4]数组存放的顺序:
15
6.3.2 数组的初始化
数据类型 数组名[整数表达式1][整数表达式2]…
={ 常数表列 };
【例】 int x[5]={0,1,2,3,4} 【例】 int y[3][2]={ {0, 1}, {2, 3}, {4, 5} };
31
#include<stdio.h> main( ) { int i,j,k,temp; int a[7]={0,9,8,3,1,2,4}; for(i=1;i<=5;i++) { k=i; for(j=i+1;j<=6;j++) { if(a[k]>a[j]) k=j;} temp=a[i];a[i]=a[k];a[k]=temp; } for(i=1;i<=6;i++) /*选择排序后输出结果*/ printf(“%d”,a[i]); }
量能使用的运算同类型的数组元素也能使用。
【例】 a[1]=a[0]*a[2]-a[3]/a[4];
12
6.3 数组的存储结构和初始化
数组作为同名、同类型元素的有序集合,被顺序存放在一块连续 的内存中。数组被定义后,编译系统根据数组的类型和数组所包含 的元素个数为它分配一段连续的内存单元。数组第一个元素的存储 地址就是整个数组的存储首地址,该地址放在数组名中。 6.3.1 数组的存储结构 1、一维数组的存储结构
27
5轮,才能使6个数按大小顺序排列。如果有n个数,则要进行n-1轮 比较。在第1轮比较中要进行n-1次两两比较,在第j轮比较中要进行 n-j次两两比较。据此画出流程图(见下图)。
28
根据流程图写出程序,定义数组长度为7,本例中对a[0]不用,只 用a[1]到a[6],以符合人们的习惯。 #include <stdio.h> main( )
for( i=0; i<=9;i++ )
a[i]=i; for(i=9;i>=0;i--)
printf("%d ",a[i]);
}
18
【例】使用数组,编写程序完成从键盘顺序输入30个整数,交换 a[0]和a[29]、a[1]和a[28]等,然后将它们输出的功能。
19
20
二维数组赋初值ቤተ መጻሕፍቲ ባይዱ方法:
4
(3)【例】a[3][4]包含的数组元素有多少个?
可以把a看作是一个一维数组,它有3个元素:a[0]、a[1]、 a
[2],每个元素又是一个包含4个元素的一维数组,见图1。可以把a
[0]、a[1]、a[2]看作是3个一维数组的名字。
图1
(4)数组名不能与程序中的其他变量同名;
5
(5)下标运算符中不允许使用变量定义数组长度; 【例】int n;n=5;int e[n];
32
用变量k来记录 最小数的下标 比较过程中,不断更新k,使 得k永远保持是最小数的下标
【例】已知数组a中共有n个已排序的整数(从小到大),现从键盘
输入一个数x,用折半查找法找出数组a中是否有此数,如果有的话, 打印出此数在数组中的位臵,否则打印找不到的信息。 折半查找法的基本思想:假设已有排好序的5个整数,设查找数据范 围的下限为k=1,上限为h=5,求中点m=(k+h)/2,用x与中点元 素a[m]作比较,若x等于a[m],即找到,停止查找;否则,若x大于 a[m],替换下限为k=m+1,到上半段继续查找;若x小于a[m],替换上
}
21
使用注意事项:
(1)对数组赋初值时,若初值表中常数个数小于数组元素的个 数,这表示仅对数组中排列靠前的元素赋初值; 【例】int z[5]={10, 20, 30}; (2)使用一维数组赋初值的方法对多维数组赋初值,编译系统 将自动按二维数组的存储结构顺序依次为各元素赋初值;下面的语 句语法等价:
printf("%d\n",a[i]);
正确
11
2、使用说明
(1)引用下标变量时,给出的下标个数必须与所定义的数组维
数一致,而且每一个下标表达式的值不得超界;
【例】有数组定义:int a[4][3];则a[2][3]和a[1][2][3]的引用都
是错误的。 (2)数组元素本身相当于同类型的简单变量,凡是基本类型变
23
【例】编写程序,由键盘输入代表年、月、日的三个整数,转换 并输出该日期为该年的第几天。 算法分析:由于每年每月的天数是固定的,只有闰年和平年略有 差别。其差别仅仅在于2月份的天数不同。采用二维数组存放闰年 和平年的天数数据。键盘输入年、月、日数据,然后判断是否为闰 年,再累加相应月份和日期数据,便得到所输日期为该年的第几天。
8
没有使用数组的做法:
#include <stdio.h>
main( )
{ int a, b, c, temp;
scanf(“%d, %d, %d”, &a, &b, &c); putchar(„\n‟); temp=a, a=c, c=temp; printf(“%d, %d, %d”, a, b, c);
25
6.4 数组应用举例
【例】用冒泡法对6个数排序(由小到大,由数组存储6个数)。 冒泡法的思路是:将相邻两个数比较,将小的调到前头,进行第一 轮的操作,见下图。
26
然后再对第一个数至倒数第二个数进行两两比较和相应的交换第
二轮操作,见下图;
如此进行下去,在第一轮中要进行两个数之间的比较共5次,在第 二轮中比4次,依次类推,第5轮比1次。可以推知,对6个数要比较
【例】阅读下列程序,分析运行结果。
#include<stdio.h>
main( ) { int a[3][3],i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++) scanf(“%d”,&a[i][j]);
for(i=0;i<3;i++)
相关文档
最新文档