第5章 构造数据类型
VB语言数组专题讲解
(1) 如果在数组声明的时候,没有给出下标下界,则下界 由Option Base <n>语句控制,默认值为0。
例如:Dim b(2,4,3) Option Base 1
Dim a(2,0 to 4, 3)
精选ppt课件
5.2.1 静态数组及声明
10
Dim lArray( 0 To 3, 0 To 4) As Long 等价于: Dim lArray(3, 4) As Long
精选ppt课件
5
5.1.1数组与数组元素
4. 数组元素
如何确定100个学生和这个数据组中的各个成绩对应关系呢? 给数组中的数据编号,也就是顺序号,从而出现了数组中 的下标变量,所以数组元素也称为下标变量.数组元素表示 为: <数组名> (<下标表>) 例如:mark(1)、mark(99) 例如: c(2,3) 表示数组c中第2行第3列的那个元素 对于数组中下标的使用说明: (1)下标放在数组名后的括号内
选择法排序,将这些数按递增的顺序排列。(纠正课本错
误)
For i = 1 To 9
例如x(3.6)取整后为x(4)
精选ppt课件
5.1.1数组与数组元素
7
5. 数组的类型
Visual Basic中的数组,按不同的方式可分为以下几类: ❖ 按数组的大小(元素个数)是否可以改变来分为:
定长数组、动态(可变长)数组,也称为静态数组或 动 态数组。 ❖ 按元素的数据类型可分为:数值型数组、字符串数组、
声明Variant的变量或仅由括号括起的动态数组赋值。 <数组名>=Array(<数组元素值>)
(2)数组的下界由option base控制语句决定,上界由Array 函数括号内的参数个数决定,也可通过函数Ubound获得
数据结构第五章 数组与广义表
压缩存储方法:只需要存储下三角 (含对角线)上的元素。可节省一 半空间。
可以使用一维数组Sa[n(n+1)/2]作为n阶对称矩阵A的存 储结构,且约定以行序为主序存储各个元素,则在Sa[k]和矩
阵元素aij之间存在一一对应关系: (下标变换公式)
i(i+1)/2 + j 当i≥j k = j(j+1)/2 + i 当i<j
q = cpot[col];
T.data[q].i = M.data[p].j; T.data[q].j = M.data[p].i; T.data[q].e = M.data[p].e; ++cpot[col]; }
分析算法FastTransposeSMatrix的时间 复杂度:
for (col=1; col<=M.nu; ++col) … … for (t=1; t<=M.tu; ++t) … … for (col=2; col<=M.nu; ++col) … … for (p=1; p<=M.tu; ++p) … …
//对当前行中每一个非零元
处
brow=M.data[p].j;
理
if (brow < N.nu ) t = N.rpos[brow+1];
M
else { t = N.tu+1 }
的
for (q=N.rpos[brow]; q< t; ++q) { ccol = N.data[q].j; // 乘积元素在Q中列号
一、三元组顺序表
对于稀疏矩阵,非零元可以用三元组表示, 整个稀疏矩阵可以表示为所有非零元的三元组所 构成的线性表。例如:
数组
下标表达式如果是整型常量,则可直接明确的指定要 访问的是那一个数组元素。 下标表达式如果是变量,则可比较灵活的指定要访问 的是哪个数组元素。 在引用数组元素时要注意,如果用超出数组的合法下 标范围的表达式进行数据的访问,会导致越界访问 的错误。 C编译器不会检查下标的合法性。如果使用了错误的下 标,程序执行结果是不可知的,程序或者能运行, 但是运行结果可能很奇怪,也可能会中断程序的执 行。
【例】输入10个学生的成绩,要求输出所有高于平均 分的成绩。
#include<stdio.h> #define SIZE 10 void main() { int i; float a[SIZE], avg, sum=0; for(i=0;i<SIZE;i++) { scanf("%f",&a[i]); sum=sum+a[i]; } avg=sum/SIZE; printf("avg=%f\n",avg); for(i=0;i<SIZE;i++) if(a[i]>avg) printf("%.2f\t",a[i]); printf("\n"); }
【例5.2】数组定义方式
#include<stdio.h> #define SIZE 20 void main() { int n=5; int a1[5]; /*可以,整型常量*/ int a2[5*2+1]; /*可以,整型常量表达式*/ static double a3[sizeof(int)]; /*可以,sizeof表达式被认为是一个整型常量 */ char a4[SIZE]; /*可以,符号常量*/ int a5[-3]; /*不可以,数组大小必须大于0*/ int a6[0]; /*不可以,数组大小必须大于0*/ int a7[4.5]; /*不可以,数组大小必须是整数*/ int a8[(int)4.5]; /*可以,强制转换为整型*/ int a9[n]; /*C99 之前不可以*/ }
[工学]《C语言程序设计》第5章___数组、字符串、指针
5.2.2 一维数组的初始化
1、数组声明时初始化 在编译阶段进行的。这样将减少运行时间, 提高效率。 数组初始化的一般形式为: 类型符 数组名[常量表达式]={值,值…值}; 例如: int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0; a[1]=1;... a[9]=9;
…
a[9]
#include <stdio.h> 声明有10个元素 void main() 的一维数组a {int n,i; float s=0, ave, a[10]; a[0] a[1] … a[9] for(i=0;i<10;i++) a[i] { scanf("%f",&a[i]); a[i] s=s+a[i]; } ave=s/10; for(i=0;i<10;i++) a[i] a[i] if (a[i]>ave) printf("%f ",a[i]); }
说明: ① int a[10]={0,1,2,3,4};
给前5个元素赋 值,其余赋0值 不能给数组整体 赋值,改成{1} 静态存储类型, 初值为0 可以省略数组元 素个数。 初值的个数不能 超过元素个数
② int a[10]=1;
③ static int a[3]; ④ int a[ ]={1,2,3,4,5}; ⑤ int a[5]={1,2,3,4,5,1 };
代码: for(i=0; i<N-1; i<5; i++) { p=i; for(j=i+1; i<N; j<6; j++) if(a[j]<a[p]) p=j; t=a[i]; a[i]=a[p]; a[p]=t; } 5-5.c
软件工程 第5章--UML
UML的定义
UML定义有两个主要组成部分:语义和表示法。 语义用自然语言描述,表示法定义了UML的可 视化标准表示符号,这决定了UML是一种可视 化的建模语言。 在语义上,模型是元模型的实例。UML定义给 出了语法结构的精确定义。 使用UML时,要从不同的角度观察系统,为此 定义了概念“视图(View)‖。视图是对系统的模 型在某方面的投影,注重于系统的某个方面。
独立于过程
系统建模语言,独立于开发过程。
9
容易掌握使用 概念明确,建模表示法简洁明了,图形结 构清晰,容易掌握使用。 着重学习三个方面的主要内容: (1) UML的基本模型元素 (2) 组织模型元素的规则 (3) UML语言的公共机制 与程序设计语言的关系 用Java,C++ 等编程语言可实现一个系统。 一些CASE工具可以根据 UML所建立的系 统模型来产生Java、C++ 等代码框架。
31
UML事物 — 注释事物
11) Note(注释)
依附于一个元素或一组元素之上,对其进
行约束或解释的简单符号。没有语义影响。
See policy8-5-96.doc for details about these algorithms.
CashAccount presentValue()
32
15
UML定义 9 种图,表达UML中的 5 种视图,各 视图在静态和动态方面表示系统模型。
结构 视图 静态 方面
动态 方面
行为 视图 同左
实现 视图 构件图
环境 视图 部署图
同左
用例 视图 用例图
同左
类图 对象图
顺序图 同左 顺序图 合作图 (注重 合作图 状态图 进程、 状态图 活动图 线程) 活动图
C语言教案 第5章
int class;
char sex;
int age;
int score[MAX2];
}STUDENT;
声明新类型名STUDENT,它代表上面指定的一个结构体类型。这时可以使用STUDENT来定义变量。例如:
STUDENT stu;
归纳起来,声明一个新的类型名的方法是:
①先按定义变量的方法写出定义体(例如:inti;);
②将变量名换成新类型名(例如:将i换成COUNT);
③在定义结构体的最前面加typedef(例如:typedef int COUNT);
④最后用新类型名定义变量。
习惯上,常把用typedef声明的类型名用大写字母表示,以便与系统提供的标准类型标识符相区别。
说明:
①用typedef可以声明各种类型名,但不能用来定义变量。typedef可以声明数组类型、字符串类型。例如要定义一维数组:
2、熟练运用结构体类型实现对学生信息的查询。
3、用结构体数组存储一个班级的学生信息。
教法
案例教学法
学法
思考,讨论,练习和巩固
教具使用
投影仪演示或教学机房
学内容
教师活动
学生活动
备注
导入
新课
上次课介绍了如何定义结构体类型,再运用新定义的结构体类型定义结构体变量,以及结构体变量的初始化。当类似的数据较多时,就要考虑用数组来解决,这就是结构体数组。
可以使用上面定义的student结构体类型来定义变量。例如:
struct student
{
char num[6];
char name[11];
int class;
char sex;
int age;
C语言的数据类型介绍
C语言的数据类型介绍C语言的数据类型介绍C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。
下面店铺为大家带来C语言的数据类型介绍,希望大家喜欢!1.基本数据类型基本数据类型最主要的特点是,其值不可以再分解为其它类型。
也就是说,基本数据类型是自我说明的。
2.构造数据类型构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。
也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。
每个“成员”都是一个基本数据类型或又是一个构造类型。
在C语言中,构造类型有以下几种:2.1.数组类型2.2.结构类型2.3.联合类型3.指针类型指针是一种特殊的,同时又是具有重要作用的数据类型。
其值用来表示某个量在内存储器中的地址。
虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈。
4.空类型在调用函数值时,通常应向调用者返回一个函数值。
这个返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明,例如在例题中给出的max函数定义中,函数头为: int max(int a,int b);其中“int ”类型说明符即表示该函数的返回值为整型量。
又如在例题中,使用了库函数 sin,由于系统规定其函数返回值为双精度浮点型,因此在赋值语句s=sin (x);中,s 也必须是双精度浮点型,以便与sin函数的返回值一致。
所以在说明部分,把s说明为双精度浮点型。
但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”。
其类型说明符为void。
在第五章函数中还要详细介绍。
在本章中,我们先介绍基本数据类型中的整型、浮点型和字符型。
其余类型在以后各章中陆续介绍。
对于基本数据类型量,按其取值是否可改变又分为常量和变量两种。
在程序执行过程中,其值不发生改变的量称为常量,取值可变的量称为变量。
它们可与数据类型结合起来分类。
例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。
C语言 第5章 数组
北京科技大学
2014-10-10
5.2.4 一维数组应用举例
【例5-2】设计一个程序,将n个人某门课程的成绩输入计 算机后输出最高分和最低分。 思路:①首先将n个人的成绩输入到一个一维数组中。 ②求若干个数的最大值或最小值常采用打擂台的方法: 首先指定某数为最大值或最小值的擂主: 如:max=a[0], min=a[0] 将其他各数依次与擂主进行比较(循环嵌套分支),
2014-10-10
5.1概述(续)
2.数组与数组元素的概念
数组:一组相同类型的数据的集合,数组的名字就称为数 组名。 如定义:float a[10]; a是数组名。 下标变量(或数组元素):数组中的每个数据用下标进行 区分,这些变量称为下标变量或数组元素。 如:a[0]、a[1]…a[i]。 每个数组元素相当于一个简单变量,数组的类型也就是该 数组的数组元素的数据类型。 数组属于构造类型。构造类型的数据是由基本类型数据按 一定规则构成的。
91.5 34.5 67.5 72.0
84.0
score[0]
score[1]
score[2] score[3] score[4]
组如 范果 围引 会用 破的 坏数 其组 他元 变素 量超 的出 值数 。
5.2.3 一维数组的初始化
初始化:在定义数组时给数组元素赋初值。
1.在定义数组时,对全部数组元素赋初值 例如:int a[5]={0,1,2,3,4}; 此时可以省略数组长度,例如:int a[ ]={0,1,2,3,4}; 2.在定义数组时,对部分数组元素赋初值 例如:int a[5]={1,2,3};系统为其余元素赋 0 。 3.当初值的个数多于数组元素的个数时,编译出错 例如: int a[5]={0,1,2,3,4,5};
C++程序设计:第5章 数组
• 数组元素是组成数组的基本单元。数组元 素也是一种变量。
• 数组元素的一般形式为:
•
数组名[下标]
• 其中的下标只能为整型表达式或为字符型
表达式。
相当于a[5]
• 例如:a[5], a[i+j], a[i++], a[‘A’-60]
• 都是合法的数组元素。 元素也称下标变量。
• 设有:int b[5],a[5]={1,2,3,4,5}; • 如果想要将数组a赋值给数组b,则:
78 99
for (j=1; j<=n-1; j++) for (i=1; i<=n-j ; i++)
第五趟 比较1次 4到位
{ if (a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1];
将小的交换 到前面
a[i+1]=t; }
}
由于元素的序号从0开始,程序可以变动如下:
for (j=0; j<n-1; j++) for (i=0; i<n-1-j; i++) { if (a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } }
333 3
665 5 556 4 444 6 777 7 999 9
第一趟 比较5次
9到位
第二趟 比较4次
7到位
第三趟 比较3次
6到位
333 554 445 666 777 999
第四趟 比较2次 5到位
33
总结:
44 55 66
共有6个数
n
程序设计教程(用C++语言编程)陈家骏、郑涛编著-答案
5、 什么是表达式?其作用是什么?
答:表达式是由操作符、操作数以及圆括号所组成的运算式。在程序设计语言中,对数据操作的具体 实施是通过表达式来描述的。
6、 操作符的优先级和结合性分别是指的什么?
答:运算符的优先级和结合性决定表达式中各个运算符的运算次序。操作符的优先级规定了相邻的两 个操作符谁先运算:优先级高的先计算;如果相邻的两个操作符具有相同的优先级,则需根据操 作符的结合性来决定先计算谁,操作符的结合性通常分为左结合和右结合:左结合表示从左到右 计算,右结合表示从右到左计算。
3、CPU 能执行哪些指令? 答:CPU 所能执行的指令通常有: 算术指令:实现加、减、乘、除等运算。 比较指令:比较两个操作数的大小。 数据传输指令:实现 CPU 的寄存器、内存以及外设之间的数据传输。 执行流程控制指令:用于确定下一条指令的内存地址,包括转移、循环以及子程序调用/返回等指令。
4、什么是软件?软件是如何分类的? 答:计算机软件是计算机系统中的程序以及有关的文档。程序是对计算任务的处理对象(数据)与处 理规则(算法)的描述;文档是为了便于人理解程序所需的资料说明,供程序开发与维护使用。
extern, _book, Car, car_1, ca1r, 1car, friend, car1_Car, Car_Type, No.1, 123
答:合法的 C++标识符:_book, Car, car_1, ca1r, car1_Car, Car_Type
10、简述 C++程序的编译执行过程。在你的 C++开发环境中运行 1.3.2 节中给出的简单 C++程序。
8、 将下列公式表示成 C++的表达式:
(1) − b + b2 − 4ac (可利用 C++标准库中的求平方根的函数:sqrt(x)) 2a
严蔚敏版数据结构第五章
5
N维数组的数据类型定义
n_ARRAY = (D, R)
其中:
数据对象:D = {aj1,j2…jn| ji为数组元素的第i 维下标 ,aj1,j2…jn Elemset} 数据关系:R = { R1 ,R2,…. Rn } Ri = {<aj1,j2,…ji…jn , aj1,j2,…ji+1…jn >| aj1,j2,…ji…jn , aj1,j2,…ji+1…jn D } 基本操作:构造数组、销毁数组、读数组元素、写数组元素
6的每个元素占五个字节将其按列优先次序存储在起始地址为1000的内存单元中则元素a55的地址是南京理工大学2001一1315分12102二维数组m的元素是4个字符每个字符占一个存储单元组成的串行下标k的范围从0到4列下标j的范围从0到5m按行存储时元素m35的起始地址与m按列存储时元素m43的起始地址相同
10
二维数组
三维数组
行向量 下标 i 列向量 下标 j
页向量 下标 i 行向量 下标 j 列向量 下标 k
11
三维数组
– 各维元素个数为 m1, m2, m3 – 下标为 i1, i2, i3的数组元素的存储地址: – (按页/行/列存放)
LOC ( i1, i2, i3 ) = a + ( i1* m2 * m3 + i2* m3 + i3 ) * l 前i1页总 第i1页的 元素个数 前i2行总
前i行元素总数 第i行第j个元素前元素个数
24
若 i j,数组元素A[i][j]在数组B中的存 放位置为 n + (n-1) + (n-2) + + (n-i+1) + j-i = = (2*n-i+1) * i / 2 + j-i = = (2*n-i-1) * i / 2 + j 若i > j,数组元素A[i][j]在矩阵的下三角 部分,在数组 B 中没有存放。因此,找它 的对称元素A[j][i]。 A[j][i]在数组 B 的第 (2*n-j-1) * j / 2 + i 的位置中找到。
《软件工程》第5章 软件构造
5.5 软件代码审查
为保证代码开发的质量,在编码完成后,进行 代码审查或称Review。
审查内容: 1. 程序的版式 2. 文件结构 3. 命名规则 4. 表达式与基本语句
5.6 软件复用
软件复用就是将已有的软件成分用于构造新的 软件系统,以达到提高软件系统的开发质量与效率, 降低开发成本的目的。
在面向对象语言中,类功能支持这种层次机制。 除了根结点外,每个类都有它的基类(base class)。 除 了 叶结 点 外 , 每 个类 都 有它 的 派生 类 (derived class)。一个派生类可以从它的基类那里继承所有 的数据和操作,并扩充自己的特殊数据和操作。
3. 多态性
所谓多态,是指一个名字(或符号)具有 多种含义。即相同的操作的消息发送给不同的 对象时,每个对象将根据自己所属类中定义的 操作去执行,产生不同的结果。
5
第五章
软件构造
软件的详细设计,完成了软件的过程性的描述, 接下来进入程序编码阶段。
软件构造(Software Construction)指通过 编码、验证、单元测试、集成测试和排错的组合, 创建一个可以工作的、有意义的软件。在本章中, 我们将聚焦在该领域当中的程序设计语言、设计、 编码和复用这几个话题,其余的将在后续章节中讨 论。
类型的能力选取 。 6. 软件开发人员的知识水平以及心理因素。要特别注
意选择语言时,尽量避免受外界的影响,盲目追求 高、新的语言。
5.2 程序设计方法
5.2.1 结构化程序设计 结构程序设计的概念最早是由E.W.Dijkstra提出来的。
结构化程序设计方法 (Structured Program), 即SP法是结构化开发方法的重要组成部分。
5.3.1 源程序文件 符号的命名。尽量用与实际意义相同或接近的标识 符命名。 源程序中的注释 注释可分为序言性注释和解释性注释。错误的注释 宁可不要。 源程序的书写格式
第五章答案类、构造函数、拷贝构造函数、静态成员、友元
5.3 练习题解答1.什么是类?为什么说类是一种抽象数据类型的实现?答:类是C++语言中的一种数据类型。
这种数据类型是一种封装体,它既包含有数据结构,又包含有对这些数据所进行的若干操作。
类的获得是通过对于所要解决的问题中的客观实体的抽象,这种抽象不仅包含了它的属性,同时还有对这些属性的操作,即方法。
对实体的这种抽象可用一个标识符来表示,并可对它引用及操作,这种标识符称为类。
可见,类是抽象数据类型的一种实现。
2.类的定义格式如何?类的说明部分和实现部分各包含些什么?答:类的定义格式包含说明部分和定义部分。
类的说明部分主要有类头和类体两部分。
类头定义格式如下所示。
class<类名>其中,class是关键字,<类名>同标识符。
类体是由一对花括号括起来的若干成员,成员中包含数据成员和成员函数,右花括号后边有一个分号。
{〈数据成员说明〉〈成员函数说明〉};成员又分为不同的访问权限,有公有(puLlic)、私有(private)和保护(protected)3种。
类的实现部分是用来定义类中说明的成员函数(没有定义)在该部分定义。
如果类中所有成员函数都已在类体内定义了,则实现部分可以省略。
3.类的成员一般分为哪两部分?这两部分有何区别?答:类的成员一般分为数据成员和成员函数两个部分。
前一部分是用来表示状态的数据,后一部分是用来改变状态的方法(即函数)。
简单地讲,前部分是变量,后部分是函数,后部分的函数是用来对前部分的变量进行操作的。
4.从访问权限角度如何区分不同种类的成员?它们各自的特点是什么?答:从访问权限角度可以将类中成员分为三种:公有的,私有的和保护的。
公有成员可以被类体内外的程序所访问,它通常作为一个类体的对外接口。
私有成员只能对类体内的程序所访问,在类体外是不可见的。
它是类中的被隐藏部分。
保护成员对一般类而言视同私有成员,对派生类同公有成员。
它可以被其派生类中的程序访问。
5.作用域运算符的功能是什么?它的使用格式如何?答:作用域运算符::是C十十语言中的一种运算符,用来指明某个标识符的作用域,主要用于标识类中成员。
第1章 C语言概述(ZHP)
#include<stdio.h> /*头文件*/ void main() /*主函数*/ { int x , y , n; /*定义x,y,n为整型*/ x = 0; /*置x初值为0/ n = 100; /*x终值为100*/ while (x <= n) /*当x值小于100时执行循环*/ { y=x * x – 2 * x + 3; /* 计算y值*/ printf("x=%d,y=%d\n" , x , y); /* 打印一组x,y值*/ x++; /* x值增加1*/ } 28 }
20
1.2 程序设计方法
三种基本控制结构(续)
I A1 A2
…………
An
多分支选择结构
21
1.2 程序设计方法
三种基本控制结构(续)
示例:求6!
不成立
P
成立
当P成立时
定义变量
A
执行程序 块A
i=2,s=1
当 i<=6时 s=s*i
i=i+1
循环结构
输出s的值
22
1.2 程序设计方法
三种基本控制结构(续)
的各种语言,必须配备相应语言的“编译程序”,
或“解释程序”。通过“编译程序”或“解释程序”
使人们编写的程序能够最终得到执行的工作方式分
别称为程序的编译方式和解释方式。
30
1.3 程序的实现环境
操作系统、编辑程序、编译程序、连接程序
集成到一个程序中,形成集成的开发环境.
编辑程序
编译程序
连接程序
编辑
1.1 1.2 1.3 补充 计算机语言和计算机程序设计 程序设计方法 程序的实现环境 算法举例
SDL数据介绍
抽象数据类型
SDL中的所有数据基于抽象数据类型 抽象数据类型包括:数据类型元素的集合, 及作用于数据元素上的操作集合 数据类型元素:构成数据类型的所有数据项
例:构成Boolean类型的数据项包括字面值true和 false。
在SDL中可使用预定义数据类型和自定义数 据类型
§5.1 预定义数据类型
主要包括: 主要包括:
Boolean Character String、Charstring Integer、Natural、Real Array Duration、Time Pid
1、Boolean类型
value type Boolean literals true, false; operators
② 继承
继承某一数据类型的元素和操作,还可添加新的 元素和操作 关键字:inherits、adding 例:
newtype Int inherits Integer adding operators str: Int -> Charstring; endnewtype;
应用:
dcl var1 Int, var2 Charstring; var1 := 123; var2 := str ( var1 ); // var2=‘123’
operators
"<" ">" "<=" ">=" num chr ( Character, Character ) -> Boolean; ( Character, Character ) -> Boolean; ( Character, Character ) -> Boolean; ( Character, Character ) -> Boolean; ( Character ) -> Natural; ( Integer ) -> Character;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用数组作函数的参数。 例5.3 使用数组作函数的参数。
#include <stdio.h> #define SIZE 6 void main() { void modifyArray(int [] , int); void modifyElement(int); int a[SIZE] = { 1 , 2 , 3 , 4 , 5 , 6 }; int i; printf("数组元素的原始值为 数组元素的原始值为: printf("数组元素的原始值为:\n"); for( i = 0 ; i < SIZE ; i++) printf("%3d", a[i]); printf("\ printf("\n"); modifyArray(a , SIZE); /* 以地址传递方式传递数组 */
}
5.4 一维数组应用 排序 数据查找 数据统计分析
排序
排序的方法很多,主要有: 排序的方法很多,主要有: 冒泡法 选择法 比较交换法 希尔法 插入法 用冒泡法对10个整数按从小到大的顺序排列。 10个整数按从小到大的顺序排列 例5.4 用冒泡法对10个整数按从小到大的顺序排列。
冒泡法
排序过程: 比较第一个数与第二个数,若a[0]>a[1],则交换;然 后比较第二个数与第三个数,若a[1]>a[2],则交换;依次 类推,直至第n-1个数和第n个数比较为止。第一轮结束 时,结果最大的数被安置在最后一个位置上。 对前n-1个数进行第二轮排序,结果使次大的数被安置 在第n-1个元素位置 重复上述过程,共经过n-1趟冒泡排序后,排序结束 算法的整体思路是让大的数不断地往下沉,小的数不 断地往上冒,所以叫“冒泡排序法”
输入和输出
C语言规定,对数组的使用只能逐个引用数组 元素,不能一次引用整个数组。同样,对数 组的输入和输出也是依次对每个元素进行的。 例5.2 输入10个数,并将它们输出。
printf("please enter the data:\n"); for(i=0;i<10;i++) scanf("%d",&array[i]); printf("output the data:\n"); for(i=0;i<10;i++) printf("%d ",array[i]); printf("\n"); }
例5.7 折半查找
<stdio. #include <stdio.h> #define N 15 void main() { void bi_search(int [] , int , int ); a[100 100] 15; int a[100] , x , i , n = 15; printf("请输入数据 n"); 请输入数据: printf("请输入数据:\n"); for( i = 0 ; i < N ; i++) scanf( "%d" , &a[i] ); printf("输入要查找的数据 n"); printf("输入要查找的数据 x:\n"); scanf( "%d" , &x ); bi_search( a , n , x ); }
int linearSearch(int b [ ],int key, int n) /*定义查找函数 定义查找函数* /*定义查找函数*/ { int j; for( j = 0; j < n; j++) /*如果找到 如果找到* if( b[j] == key) /*如果找到*/ return(j); return(j); return(-1); return(}
引用
数组必须先定义,后使用。 只能逐个引用数组元素。 例如,定义数组 int a[3],数组元素为: a[0] a[1] a[2]
引用形式:
一维 数组名[下标 下标]; 下标 例如:a[2]=1; b[0][1]=5; a[i+j];(i,j为整型变量)
例5.1 使用数组编程,计算出前10项 fibonacci数列,要求一行打印5个数。 main() for(i=0;i<10;i++) { {if(i%5==0) int f[10]; int i; printf("\n"); f[0]=0; f[1]=1; printf("%4d",f[i]); for(i=2;i<10;i++) } f[i]=f[i-1]+f[i-2]; }
<stdio. #include <stdio.h> #define N 10 void main() { temp; int a[N] , i , j , temp; printf("请输入10个数 n"); 请输入10个数: printf("请输入10个数:\n"); for( i = 0 ; i < N ; i++) scanf("%d",&a[i]); scanf("%d",&a[i]); printf("\n"); printf("\n"); printf("原始数据为 n"); 原始数据为: printf("原始数据为:\n"); for( i = 0 ; i < N ; i++) printf("% ",a[i]); printf("%d ",a[i]);
printf("\ 排序后的数据为: n"); printf("\n排序后的数据为:\n"); for(i=0 i<N; for(i=0; i<N; i++) printf("%d",a[i]); printf("%d",a[i]); printf("\n"); printf("\n"); }
选择法:
初始化
顺序指定全部元素的初始值 int a[5]={1,2,3,4,5}; 指定部分元素的初始值 int a[5]={0,0,1};
以上语句只给数组a的前面三个元素赋了初始值,未赋初 值的元素的值在此默认为0;
初始化时不指定数组元素的个数
b[]={1 int b[]={1,2,3}; 若初值的个数小于数组元素的个数,则初始化时不 能省略数组元素的个数, 初值的个数不能大于数组元素的个数。
基本思想:将第一个元素与第二个到第n个 中最小者a[p]交换(如果a[p]<a[0]),这时n个 数中最小的数已调到最前面,这是第一轮的 处理结果。依次类推…
例5.5 选择法排序
{ for(i=0;i<9;i++)
{
p=i; for(j=i+1;j<10;j++) if(a[j]<a[p]) p=j; if(p!=i)
int a[5]
n a[0] a[1] a[2]
13 90
a[3] a[4]
32 -1
第一轮 21 13 13 13 13
21 21 21 21
90 90 32 32
32 32 90 -1
-1 -1 -1 90
第二轮 ......
i=1 i<=Nfor( i=1; i<=N-1;i++) { for(j=0 j<=N–i 1 for(j=0;j<=N i–1;j++) a[j+1 if( a[j] > a[j+1] ) { temp=a[j]; temp=a[j]; a[j]=a[j+1 a[j]=a[j+1]; a[j+1]=temp; a[j+1]=temp; } }
输入
输出
5.3 数组作函数的参数
数组名表示数组在内存中存放的起始地址( 数组名表示数组在内存中存放的起始地址(首地 ),即数组第一个元素的地址 即数组第一个元素的地址。 址),即数组第一个元素的地址。数组名作为函数 的参数传递的是数组的起始地址,属于“地址传递” 的参数传递的是数组的起始地址,属于“地址传递” 方式。因为传递了数组的起始地址, 方式。因为传递了数组的起始地址,所有被调函数 能够准确地知道该数组的存储位置,因此, 能够准确地知道该数组的存储位置,因此,被调用 函数在函数体中修改形参数组元素时就是在修改实 际的数组元素。 际的数组元素。
5.1 数组概述
构造数据类型之一 定义:数组是有序数据的集合 定义: 组成数组的数据称为数组的元素 数组的每个元素都属于同一个数据类型 每个数组要用一个统一的标识符标识
5.2 一维数组 定义 引用 初始化 输入和输出
定义
类型说明符 数组名[常量表达式]; 一维 二维 int a[5]; int a[3][4]; char c[20]; char c[2][3]; float x[10]; float x[2][3];
北京交通大学计算机学院 计算机程序设计基础课程组
教学目标
了解数组数据结构 熟悉数组定义, 熟悉数组定义,初始化和引用数组元素 掌握数组作为函数参数的作用 掌握基本排序方法 能够使用常用的字符处理函数 了解结构体数据结构
5.1 5.2 5.3 5.4 5.5 5.6 5.7
数组概述 一维数组 数组作函数的参数 一维数组应用 多维数组 字符数组与字符串 结构体
void bi_search(int a[],int n, int x) bot,find; { int mid, top, bot,find; top = 0; bot = n-1; find = 0; do { mid =( top + bot ) / 2; if( x == a[mid] ) printf("找到了 d,是 a[%d]",x,mid); 找到了% { printf("找到了%3d,是 a[%d]",x,mid); printf("\n"); printf("\n"); find = 1; } else if( x < a[mid] ) bot = mid - 1; else if( x > a[mid] ) top = mid + 1; } while( top <= bot && find == 0 ); if( find == 0 ) printf("% 没有找到.",x); printf("%3d 没有找到.",x); printf("\n"); printf("\n"); }