第9章数组
计算机二级c语言第九章 数组和指针习题与答案
第九章数组和指针1、有以下程序main(){ int a[]={2,4,6,8,10}, y=0, x, *p;p=&a[1];for(x= 1; x< 3; x++) y += p[x];printf("%d\n",y);}程序运行后的输出结果是A)10 B)11 C)14 D)152、有以下程序void sum(int a[]){ a[0] = a[-1]+a[1]; }main(){ int a[10]={1,2,3,4,5,6,7,8,9,10};sum(&a[2]);printf("%d\n", a[2]);}程序运行后的输出结果是A)6 B)7 C)5 D)83、有以下程序main(){int p[8]={11,12,13,14,15,16,17,18},i=0,j=0;while(i++< 7) if(p[i]%2) j+=p[i];printf("%d\n",j);}程序运行后的输出结果是A)42 B)45 C)56 D)604、设有定义语句 int x[6]={2,4,6,8,5,7},*p=x,i;要求依次输出x数组6个元素中的值,不能完成此操作的语句是A)for(i=0;i<6;i++) printf("%2d",*(p++));B)for(i=0;i<6;i++) printf("%2d",*(p+i));C)for(i=0;i<6;i++) printf("%2d",*p++);D)for(i=0;i<6;i++) printf("%2d",(*p)++);5、有以下程序#include < stdio.h >main(){ int a[]={1,2,3,4,5,6,7,8,9,10,11,12,},*p=a+5,*q=NULL; *q=*(p+5);printf("%d %d\n",*p,*q); }程序运行后的输出结果是A)运行后报错 B)6 6 C)6 11 D)5 106、有以下程序段int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;b=p[5];b中的值是A)5 B)6 C)8 D)97、已有定义:int i,a[10],*p;则合法的赋值语句是A)p=100; B)p=a[5]; C)p=a[2]+2; D)p=a+2;8、以下能正确定义一维数组的选项是A)int num []; B)#define N 100int num [N];C)int num[0..100]; D)int N=100;int num[N];9、有以下程序main(){ int p[7]={11,13,14,15,16,17,18},i=0,k=0;while(i< 7&&p[i]%2){k=k+p[i];i++;}printf("%d\n",k);}执行后输出结果是A)58 B)56 C)45 D)2410、有以下程序main(){ int x[8]={8,7,6,5,0,0},*s;s=x+3;printf("%d\n",s[2]);}执行后输出结果是A)随机值 B)0 C)5 D)611、若有定义:int aa[8];。
大学计算机基础 第9章 习题参考答案
习题九一、用适当内容填空1.计算机系统运行和操作的最小功能单位是指令,一台计算机中全部指令的集合称为指令系统。
2.计算机能够直接识别的程序设计语言是机器语言,其直接使用机器指令或二进制格式编写程序。
3.汇编语言是一种低级语言,它是面向过程的语言。
高级语言书写的源程序可以通过解释或编译方式来执行。
4.字符型是一种基本数据类型,一般程序设计语言中都采用8位二进制位来表示,其对应值的范围是0-255。
5.在程序中要处理200名学生一门课的成绩信息,应该定义数组类型变量;要处理200名学生的档案资料应该定义记录或结构类型变量。
6.在程序运行过程中值不可改变的量称为常量,可改变的量称为变量。
7.结构化程序设计的3种基本逻辑结构为顺序、分支或选择和重复或循环,合理使用这3种控制结构可以表现任何复杂的控制关系。
8.过程是功能独立或需要多次调用的程序段,它也可以称为函数或子程序。
9.一段程序代码需要多次反复执行,需要使用重复或循环结构来表达;根据判断条件结果决定是否执行一段程序,应该使用分支或选择结构表示。
10.循环也称为重复,其对应两种类型,分别为当型结构和直到型结构。
11.面向过程程序设计的核心是算法和数据结构;面向对象程序设计的核心是类和对象。
12.结构化程序设计应遵循自顶向下、逐步求精、模块化和限制使用goto语句原则。
13.采用结构化程序设计方法能够使程序易读、易理解、易维护和结构良好。
虽然这种方法具有许多优点,但它仍是一种面向过程的程序设计方法。
14.VB是一个可视化操作界面、面向对象的程序设计语言;在VB中可以直接创建Access 数据库。
15.在VB窗口中添加的对象都具有若干属性,在窗口设计阶段改变对象属性可以在①属性窗口中操作,在程序运行时改变属性应该在相关对象事件代码中操作。
16.类是一组数据及该组数据能够实现操作的封装体。
在类与对象的关系中,类是对对象的抽象,而对象是类的实例。
17.在面向对象方法中,信息隐藏是通过对象的封装性来实现的;同样的消息被不同的对象接收时可导致不同的行为,这是对象的多态性。
数据结构第9章 排序
数据结构第9章排序数据结构第9章排序第9章排名本章主要内容:1、插入类排序算法2、交换类排序算法3、选择类排序算法4、归并类排序算法5、基数类排序算法本章重点难点1、希尔排序2、快速排序3、堆排序4.合并排序9.1基本概念1.关键字可以标识数据元素的数据项。
如果一个数据项可以唯一地标识一个数据元素,那么它被称为主关键字;否则,它被称为次要关键字。
2.排序是把一组无序地数据元素按照关键字值递增(或递减)地重新排列。
如果排序依据的是主关键字,排序的结果将是唯一的。
3.排序算法的稳定性如果要排序的记录序列中多个数据元素的关键字值相同,且排序后这些数据元素的相对顺序保持不变,则称排序算法稳定,否则称为不稳定。
4.内部排序与外部排序根据在排序过程中待排序的所有数据元素是否全部被放置在内存中,可将排序方法分为内部排序和外部排序两大类。
内部排序是指在排序的整个过程中,待排序的所有数据元素全部被放置在内存中;外部排序是指由于待排序的数据元素个数太多,不能同时放置在内存,而需要将一部分数据元素放在内存中,另一部分放在外围设备上。
整个排序过程需要在内存和外存之间进行多次数据交换才能得到排序结果。
本章仅讨论常用的内部排序方法。
5.排序的基本方法内部排序主要有5种方法:插入、交换、选择、归并和基数。
6.排序算法的效率评估排序算法的效率主要有两点:第一,在一定数据量的情况下,算法执行所消耗的平均时间。
对于排序操作,时间主要用于关键字之间的比较和数据元素的移动。
因此,我们可以认为一个有效的排序算法应该是尽可能少的比较和数据元素移动;第二个是执行算法所需的辅助存储空间。
辅助存储空间是指在一定数据量的情况下,除了要排序的数据元素所占用的存储空间外,执行算法所需的存储空间。
理想的空间效率是,算法执行期间所需的辅助空间与要排序的数据量无关。
7.待排序记录序列的存储结构待排序记录序列可以用顺序存储结构和和链式存储结构表示。
在本章的讨论中(除基数排序外),我们将待排序的记录序列用顺序存储结构表示,即用一维数组实现。
全国计算机二级c语言学习指南课件与历年真题精讲精析 第9章
2、1个数组元素,实质上就是1个变量,它具有和相 同类型单个变量一样的属性,可以对它进行赋值和参 与各种运算。 3、一个数组不能整体引用,数组名中存放的是一个地 址常量,它代表整个数组的首地址。 例如:double x[8], *p, q; p=x; q=x;
不能将数组名赋给一个类型不同的普通变量
C语言规定,数组名代表数组的首地址,因此, 数组名实际上也是指针,但它是一个固定不变的 指针常量。
如:int a[5]; a是数组名,也是指针,它永远指向数组的首地址 ,即不能将新地址赋给该指针。但可以通过形如 a+k的形式(k是整数)来表达该数组其它元素的地 址。 如:for(k=0;k<5;k++) scanf(“%d”,a+k);
15 67 3 26 98
a[0]
a[1] a[2] a[3] a[4]
高地址
9.1.2 一维数组元素的引用 数组名[下标表达式] 如:double x[8]; 则x[0]、x[j]、x[i+k]均合法。 注意:i+k是下标表达式而不是两个下标。 说明:
1、“下标表达式”可以是任何非负整型数据,取值范
for(k=0;k<10;k++) printf(“%4d”, *(p+k));
for( k=0;k<10;k++) {printf(“%4d”,*p);p++;}
for( k=0;k<10;k++) printf(“%4d”,*p++);
for( ;p-a<10;p++) printf(“%4d”,*p);
围是0~(元素个数-1)。
C语言第9章结构体、共用体、枚举
结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类
《高等数学(下册)》 第9章
(1)结合律: (a) (a) ()a ; (2)分配律: ( )a a a ,(a b) a b . 这里 a ,b 为向量, , 为实数.
向量的加法运算以及向量的数乘运算统称为向量的线性运算.
9.1.2 向量的线性运算
设 a 0 ,与 a 同方向的单位向量记为 ea ,由数与向量乘积的定义有 a | a | ea ,
9.2.2 向量的坐标表示
3 4 2
解法一 按对角线法则,有
D 1 2 (2) 2 1 (3) (4) (2) 4 11 4 2 (2) (2) (4) 2 (3) 4 6 32 4 8 24 14.
解法二 按第一行展开,有
2 D 1
1 2 2
1
2
(4)
2 1 (4 4) 2 (4 3) (4) (8 6) 14 .
x 为数轴上点 P 的坐标.
9.1.3 二阶与三阶行列式
1.二阶行列式 由 4 个数排成 2 行 2 列(横排称行、竖排称列)的数表
a11 a12 a21 a22 , 表达式 a11a22 a12a21 称为该数表所确定的二阶行列式,并记作
a11 a12 . a21 a22
数 aij (i 1,2 ;j 1,2) 称为二阶行列式的元素,元素 aij 中的第一个下标 i 和第二个下 标 j 分别表示该元素所在的行数和列数.例如,元素 a21 在行列式中位于第二行、第一列.
9.1.3 二阶与三阶行列式
例1 计算二阶行列式 2 1 . 1 3
解 2 1 2 (3) 11 7 . 1 3
9.1.3 二阶与三阶行列式
2.三阶行列式 由 9 个数排成 3 行 3 列的数表
a11 a12 a13 a21 a22 a23 a31 a32 a33 ,
《高等数学》-各章知识点总结——第9章
《高等数学》-各章知识点总结——第9章第9章 多元函数微分学及其应用总结一、多元函数的极限与连续 1、n 维空间2R 为二元数组),(y x 的全体,称为二维空间。
3R 为三元数组),,(z y x 的全体,称为三维空间。
nR 为n元数组),,,(21nx x x 的全体,称为n 维空间。
n维空间中两点1212(,,,),(,,,)n n P x x x Q y y y 间的距离:2221122||()()()n n PQ y x y x y x =-+-++-邻域:设0P 是nR 的一个点,δ是某一正数,与点0P距离小于δ的点P 的全体称为点0P 的δ邻域,记为),(0δP U ,即00(,){R|||}nU P P PP δδ=∈<空心邻域: 0P 的δ邻域去掉中心点0P 就成为0P 的δ空心邻域,记为0(,)U P δ=0{0||}PPP δ<<。
内点与边界点:设E 为n 维空间中的点集,nP ∈R 是一个点。
如果存在点P 的某个邻域),(δP U ,使得EP U ⊂),(δ,则称点P 为集合E 的内点。
如果点P 的任何邻域内都既有属于E 的点又有不属于E 的点,则称P 为集合E 的边界点,E 的边界点的全体称为E的边界.聚点:设E 为n 维空间中的点集,nP ∈R 是一个点。
如果点P 的任何空心邻域内都包含E 中的无穷多个点,则称P 为集合E 的聚点。
开集与闭集: 若点集E 的点都是内点,则称E 是开集。
设点集nE ⊆R , 如果E 的补集nE-R是开集,则称E 为闭集。
区域与闭区域:设D 为开集,如果对于D 内任意两点,都可以用D 内的折线(其上的点都属于D )连接起来, 则称开集D 是连通的.连通的开集称为区域或开区域.开区域与其边界的并集称为闭区域.有界集与无界集: 对于点集E ,若存在0>M ,使得(,)E U O M ⊆,即E 中所有点到原点的距离都不超过M,则称点集E 为有界集,否则称为无界集.如果D 是区域而且有界,则称D 为有界区域. 有界闭区域的直径:设D 是nR 中的有界闭区域,则称1212,()max{||}P P Dd D PP ∈=为D 的直径。
数据结构.第9章.查找.4.哈希表
§9.3 哈希表
开放地址法
例:关键码集为 {47,7,29,11,16,92,22,8,3}, 设:哈希表表长为m=11; 哈希函数为Hash(key)=key mod 11; 拟用线性探测法处理冲突。建哈希表: 0 1
11 22
2
3
4
5
6
3
7
7
8
29
9
8
10
47 92 16
§9.3 哈希表
开放地址法
选用关键字的某几位组合成哈希地址。
选用原则应当是:各种符号在该位上出现的频率大致
相同。
适于关键字位数比哈希地址位数大,且可能出现的关 键字事先知道的情况。
§9.3 哈希表
数字分析法
例:有一组(例如80个)关键码,其样式如下: 讨论: 3 4 7 0 5 2 4 ① 第1、2位均是“3和4”,第3位也只有 3 4 9 1 4 8 7 3 4 8 2 6 9 6 “ 7、8、9”,因此,这几位不能用,余 3 4 8 5 2 7 0 下四位分布较均匀,可作为哈希地址选用。 3 4 8 6 3 0 5 ② 若哈希地址取两位(因元素仅80个), 3 4 9 8 0 5 8 则可取这四位中的任意两位组合成哈希地 3 4 7 9 6 7 1 址,也可以取其中两位与其它两位叠加求 3 4 7 3 9 1 9 和后,取低两位作哈希地址。 位号:① ② ③ ④ ⑤ ⑥ ⑦
拟用二次探测法处理冲突。建哈希表如下: Hi = ( H(K)+di ) mod m 其中di =12, -12, 22,-22,…, j2, -j2 ( j≤m/2)。
0 1
11 22
2
3
3
4
5
6
7
C语言第九章 数组总结
基本概念:数组 :一组具有相同名字、不同下标、个数固定的同类型变量的集合数组元素 :数组中的一个变量数组的类型 :数组元素的类型(基本类型包括:整型(int )浮点型(float )双精度浮点型(double )字符型(char )无值型(void ))数组的维数 :确定数组中各元素之间相对位置的下标个数(1.下标必须是正数常数或整形表达式 2.下标的取值从0开始,最大下标值为数组元素个数减一 3.下标不要越界)例如:int a[6];int 是类型,a[6]是一维数组说明符 为a 开辟a[0] a[1]a[2]a[3]a[4]a[5] 六个连续的存储单元。
一维数组的初始化:1.数组不初始化,其元素值为随机值 2.所赋初值少于定义个数系统为后面元素自动补零 3.当全部数组元素赋初值时,可不指定数组长度例如:int a[5]={1,2,3,4,5} 等价于a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;应用:例如:定义一个数组,使a[0]到a[7]的值为0~7,然后输出。
#include <stdio.h>main(){int i,a[8]; /*一维数组的定义*/for(i=0;i<=7;i++)a[i]=i; /*一维数组的初始化*/for(i=0;i<=7;i++)printf("%d ",a[i]); /*一维数组的引用*/}例如:读十个正数存入数组,找到其中最大值和最小值。
思路:1.用for 循环出入10个正数 2.处理:(a)先令max=x[0] (b)依次用x[i]和max 比较(循环)若max<x[i],令max=x[i] 3.输出:max#include <stdio.h>#define SIZE 10main(){ int x[SIZE],i,max;printf("Enter 10 integers:\n");for(i=0;i<SIZE;i++) scanf("%d",&x[i]);max=x[0];for(i=1;i<SIZE;i++)if(max<x[i])max=x[i];}二维数组的定义方式:数据类型 数组名[常量表达式][常量表达式] (按行序先)例如:int a[3][4]用for 出入10个正数(有一个m*n 的二维数组a ,其中i 行j 列元素a[i][j]在数组中的位置计算公式是:i*n+j+1)可把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组例如:把 a[3][4] 看作是一个一维数组,有3个组元素:a[0]、a[1]、a[2],每个组元素中又包含 4 个元素的一维数组。
c语言第9章_指针及其应用(1)课后复习重点[1]教程
指针变量在使用前
必须赋值!
swap(pointer_1,pointer_2);
printf("a=%d,b=%d\n", *pointer_1,*pointer_2); return 0; } 2018/11/2
运行结果:
a:10 *pa:10
...
printf("&pa:%x(hex)\n",&pa);
return 0; }
&a:f86(hex)
pa:f86(hex) &pa:f8a(hex)
16
2018/11/2
例:输入两个数,并使其从大到小输出
int main()
{
int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b);
24
例:交换两个数—形参和实参都为指针变量
void swap(int *p1, int *p2) { int *p; int x,*p=&x; *p=*p1; *p1=*p2; *p2=*p; } int main() { int a=7,b=11; int *pointer_1=&a,*pointer_2=&b;
2018/11/2
9
例: void main( ) { int i=10; 危险! int *p; *p=i; printf("%d",*p); } 例: void main( ) { int i=10,k; int *p; p=&k; *p=i; printf("%d",*p); } 2018/11/2
数据结构 第9章 查找4-哈希表
7、随机数法 Hash(key) = random ( key ) (random为伪随机函数)
适用于:关键字长度不等的情况。造表和查找都很方便。
小结:构造哈希函数的原则:
① ② ③ ④ ⑤ 执行速度(即计算哈希函数所需时间); 关键字的长度; 哈希表的大小; 关键字的分布情况; 查找频率。
三、冲突处理方法
14 H(14)=14%7=0
6个元素用7个 地址应该足够!
1
2
23 9
3
4
39 25 11
5
6
H(25)=25%7=4 H(11)=11%7=4
有冲突!
在哈希查找方法中,冲突是不可能避免的,只能 尽可能减少。
所以,哈希方法必须解决以下两个问题:
1)构造好的哈希函数
(a)所选函数尽可能简单,以便提高转换速度; (b)所选函数对关键码计算出的地址,应在哈希地址集中 大致均匀分布,以减少空间浪费。
讨论:如何进行散列查找?
根据存储时用到的散列函数H(k)表达式,迅即可查到结果! 例如,查找key=9,则访问H(9)=9号地址,若内容为9则成功; 若查不到,应当设法返回一个特殊值,例如空指针或空记录。
缺点:空间效率低!
若干术语
哈希方法 (杂凑法)
选取某个函数,依该函数按关键字计算元素的存储位置, 并按此存放;查找时,由同一个函数对给定值k计算地址, 将k与地址单元中元素关键码进行比较,确定查找是否成 功。
3. 乘余取整法
4. 数字分析法
5. 平方取中法
常用的哈希函数构造方法有:
6. 折叠法
7. 随机数法
1、直接定址法
(a、b为常数) 优点:以关键码key的某个线性函数值为哈希地址, 不会产生冲突. 缺点:要占用连续地址空间,空间效率低。
第9章习题及答案
第九章 习题及解答9-5 设文件A 按连续文件构造,并由四个逻辑记录组成 (每个逻辑记录的大小与磁盘块大小相等,均为512B) 。
若第一个逻辑记录存放在第100号磁盘块上,试画出此连续文件的结构。
答:连续文件的结构如下图:9-6 设文件B 按串联文件构造,并由四个逻辑记录组成 (其大小与磁盘块大小相等,均为512B)。
这四个逻辑记录分别存放在第100、157、66、67号磁盘块上,回答如下问题。
(1) 画出此串联文件文件的结构,(2) 若要读文件B 第1560字节处的信息,问要访问哪一个磁盘块? 为什么? (3) 读文件B 第1560字节处的信息需要进行多少次I/O 操作? 为什么? (1) 答:此串联文件结构如下图所示。
(2) 答:1560/512=3余24,因此文件第1560逻辑字节在r 3逻辑块上,该逻辑块被分配在67号磁盘块上。
(3) 答:要访问67号磁盘块,需要先找到文件目录,然后依次访问100、157和66号磁盘块,最后读取67号磁盘块。
因此若文件已打开 (文件目录信息已在内存中) 需要4次I/O 操作,文件未打开需要5次I/O 操作。
文件目录文件目录 r 1磁盘块号9-16什么是“重名”问题? 二级文件目录结构如何解决这一问题?答:重名是指不同用户对不同文件起了相同的名字。
在二级文件目录结构中,每个用户建立用户文件目录,系统建立主目录,登记所有用户目录的信息,用目录名加文件名唯一标识每个文件解决重名问题。
9-18 假设两个用户共享一个文件系统,用户甲要用到文件a、b、c、e,用户乙要用到文件a、d、e、f。
已知:用户甲的文件a与用户乙的文件a实际上不是同一文件;用户甲的文件c与用户乙的文件f实际上是同一文件;甲、乙两用户的文件e是同一文件。
试拟定一个文件组织方案,使得甲、乙两用户能共享该文件系统而不致造成混乱。
答:如下图所示。
用户甲的主目录名为jia,有四个文件,文件名为a、b、c、e。
数据结构-C语言描述(第二版)(耿国华)章 (9)
第9章 内部排序
我们知道, 在进行直接插入排序时, 若待排序记录序 列已经有序时, 直接插入排序的时间复杂度可以提高到 O(n)。 可以设想, 若待排序记录序列基本有序时, 即序 列中具有特性 r[i].key<Max{ r[j].key},(1≤j<i) 的记录较少时, 直接插入排序的效率会大大提高。 希尔排 序正是从这一点出r[0];
/*将待插入记录插入到已排序的序列
}
第9章 内部排序
【算法9.1 直接插入排序】 该算法的要点是:① 使用监视哨r[0]临时保存待插入 的记录; ② 从后往前查找应插入的位置;③ 查找与移动在同一 循环中完成。 直接插入排序算法分析: 从空间角度来看,它只需要一个辅助空间r[0]。从时间 耗费角度来看, 主要时间耗费在关键字比较和移动元素上。 对于一趟插入排序,算法中的while循环的次数主要取决 于待插记录与前i-1个记录的关键字的关系上。
· 向量结构:将待排序的记录存放在一组地址连续的存 储单元中。 由于在这种存储方式中,记录之间的次序关系由其存 储位置来决定,所以排序过程中一定要移动记录才行。
第9章 内部排序
· 链表结构:采用链表结构时,记录之间逻辑上的相 邻性是靠指针来维持的,这样在排序时,就不用移动记录元素, 而只需要修改指针。 这种排序方式被称为链表排序。
第9章 内部排序 第9章 内部排序
9.1 9.2 插入类排序 9.3 交换类排序法 9.4 选择类排序法 9.5 9.6 分配类排序 9.7 各种排序方法的综合比较
第9章 内部排序 9.1 排序的基本概念
1. 排序
有n个记录的序列{R1,R2,…,Rn},其相应关键字的序列 是{K1,K2,…,Kn},相应的下标序列为1,2,…,n。通过排序, 要求找出当前下标序列1,2,…, n的一种排列p1,p2, …,pn, 使得相应关键字满足如下的非递减(或非递增)关系,即: Kp1≤Kp2≤…≤Kpn , 这 样 就 得 到 一 个 按 关 键 字 有 序 的 记 录 序 列 {Rp1,Rp2,…,Rpn}。
char9 数组
9.1.2 一维数组的引用 除了给指针变量赋地址值外,还可以给指针变量赋 NULL值。 例如:p=NULL; NULL是在stdio.h头文件中的预定义符。NULL的代码 值为0,当p=NULL时,称p为空指针。因为NULL的代码 值是0,所以上面语句等价于: p=’\0’; 或 p=0; 这时,指针p并不是指向地址为0的存储单元,而是具 有一个确定的值——“空”。企图通过一个空指针去访问 一个存储单元时,将会得到一个出错信息。
•编写程序,通过函数给数组输入若干大于等于5的整数,用0作为输入结束标志, 调用函数输出该数组中的元素。
#include <stdio.h> #define N 20 void aout(int *,int); int ain(int *); main() { int a[N], i; i = ain(a); aout(a, i); }
9.2 一维数组和指针
9.2.1 一维数组和数组元素的地址 一维数组在主存中占连续的存储空间,数组名 代表的是数组的首地址。可定义一个指针变量, 通过赋值或赋初值的形式,把数组名或数组的第 一个元素的地址赋值该指针变量,该指针变量就 指向了该数组。值得注意的是,这个指针变量中 的地址值不可改变,也就是说,不可以给数组名 重新赋值,因而数组名也可以认为是一个地址常 量。
在以下语句中,由于进入循环前指针变量pa指 向的是数组a的首地址,则pa++使得pa依次指了a 数组中的每一个元素: for(pa=a, i=0; i<5; i++) pa++; 同样也可以写成: for(pa=a, i=0; i<5; i++) { scanf(“%d”, pa); pa++;} 或 for(pa=a, i=0; i<5; i++) scanf(“%d”, pa++); 或 for(pa=a; pa-a<5; pa++) scanf(“%d”, pa);
9章二维数组
多维数组的定义
•在数组定义时,多维数组的维数从左到右第一个[] 称第一维,第二个[]称第二维,依此类推。多维数组 元素的顺序仍由下标决定。下标的变化是先变最右 边的,再依次变化左边的下标。 •三维数组b的12个元素是:
b[0][0][0] b[0][1][0] b[1][0][0] b[1][1][0]
也可以只对部分元素赋值而省略第一维的长度, 但应分行赋初值。
第一维的大小为多少 ?
4.如果对全部元素赋初值, 则定义数组对第一维的长度可以不指定, 但对第二维长度不缺省。
int
int
a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
Enter 10 integers: 3 5 2 8 1 After sorted: 1 2 3 5 8
二维数组
若一个一维数组,它的每一个元素是(类型相同的)一维 数组时,便构成二维数组。 数组的类型相同:是指数组大小、元素类型相同。 数组的维数:是指数组的下标个数,一维数组元素只 有一个下标,二维数组元素有两个下标。 二维数组的定义 1.定义形式: 存储类别 类型标识符 数组名[行数][列数]; 例:float b[5][3]; 定义了一个5×3的数组b,即数组为5行3列,可存放15 个实型数据。
类型说明符 数组名[常量表达式1][常量表达2]......[常量表达式N] 多维数组在内存中的排列顺序为: 第一维的下标变化最慢, 最右边的下标变化最快。
•根据二维数组的定义,我们可以类推出多维数组的定义。 static int b[2][2][3]; /*定义了一个3维的静态整型数组*/ float c[2][3][2][2]; /*定义了一个4维浮点型数组*/
数据结构第九章--查找-习题及答案
第九章查找一、选择题1。
若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( )。
A. (n—1)/2 B. n/2 C。
(n+1)/2 D。
n2. 下面关于二分查找的叙述正确的是( )A。
表必须有序,表可以顺序方式存储,也可以链表方式存储 C. 表必须有序,而且只能从小到大排列B。
表必须有序且表中数据必须是整型,实型或字符型 D. 表必须有序,且表只能以顺序方式存储3. 用二分(对半)查找表的元素的速度比用顺序法( )A.必然快 B. 必然慢 C. 相等 D. 不能确定4. 具有12个关键字的有序表,折半查找的平均查找长度( )A. 3。
1 B。
4 C. 2。
5 D. 55.当采用分块查找时,数据的组织方式为 ( )A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块C。
数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同6。
二叉查找树的查找效率与二叉树的( (1))有关, 在((2))时其查找效率最低(1): A。
高度 B。
结点的多少 C. 树型 D. 结点的位置(2): A。
结点太多 B. 完全二叉树 C。
呈单枝树 D. 结点太复杂。
7. 对大小均为n的有序表和无序表分别进行顺序查找,在等概率查找的情况下,对于查找失败,它们的平均查找长度是((1)) ,对于查找成功,他们的平均查找长度是((2))供选择的答案:A。
相同的 B。
不同的9.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是()A.(100,80, 90, 60, 120,110,130) B。
(100,120,110,130,80, 60, 90) C。
(100,60, 80, 90, 120,110,130) D。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 用简单选择法对10个数排序
排序过程: (1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数 交换—第一趟选择排序,结果最小的数被安置在第一个元素位置上 (2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录, 将它与第二个数交换—第二趟选择排序 (3)重复上述过程,共经过n-1趟排序后,排序结束
如 int a[5]={6,2,3}; int a[]={1,2,3,4,5,6}; 等价于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0; 编译系统根据初值个数确定数组大小 如int a[3]={6,2,3,5,1};(×)所赋多于数组元素
★程序举例
#include <stdio.h> 例 读10个整数存入数组,找出其中最大值和最小值 #define SIZE 10 main() { int x[SIZE],i,max; printf("Enter 10 integers:\n"); 步骤: for(i=0;i<SIZE;i++) 1. 输入:for循环输入10个整数 scanf("%d",&x[i]); 2. 处理: max=x[0]; (a) 先令max=x[0] for(i=1;i<SIZE;i++) (b) 依次用x[i]和max比较(循环) if(max<x[i]) 若max<x[i],令max=x[i] max=x[i]; 3. 输出:max printf("Maximum value is %d\n",max); }
例
i=1 初始: [ 49 13
38 j
65 j
97 j
ห้องสมุดไป่ตู้76 j
13 49 j
27 ] j
i=2 一趟: 13
[38 65 27 j
97 j 97 [97 49 49 49
76 j 76 76 [76 65 65
49 38 ] 27 j 49 49 97 [97 76 j 38 ] 65 ] 65 ] 76 ] [97 ]
§9.2一维数组与指针 一维数组与指针 9.2.1一维数组和数组元素的地址 1.数组名可看作一个指针变量,其中的地址值 为数组第一个元素的地址;但特殊的是不能给这 个指针变量重新赋值. 如:int a[10]; 则a++, a=&x都是非法的 2. 因a是指针,则可以用数组名加一个整数来表 示数组元素的地址。 a[k]的地址&a[k]可以用 a+k表示;
指向数组的指针补充: 指向数组的指针补充:
★指向数组元素的指针变量
例 int array[10]; int *p; p=&array[0]; // p=array; array[ 或 int *p=&array[0]; 9] 或 int *p=array; 整型指针p array[0] array[1] array[2] array[3] ...
F1=1 (n=1) F2=1 (n=2) Fn=F(n-1)+F(n-2) (n=3)
0 1 2 3 4 5
1 1 2 3 5 ……...
f[0] f[1] f[2] f[3] f[4] f[5]
19
f[19]
f[19]
#define N 6 数组定义:必须用常量表达式 main() { int a[N],b[‘B’-60],c[]={1,2,3,4,5,6},i; for(i=0;i<N;i++) scanf(“%d%d”,&a[i],&b[i]); for(i=0;i<N;i++) printf(“%d ”,a[i]); printf(“\n”); 数组元素引用 for(i=0;i<N;i++) printf(“%d ”,b[i]); printf(“\n”); for(i=0;i<N;i++) c[i]=a[i]+b[N-i-1]; for(i=0;i<N;i++) printf(“%d ”,c[i]); }
第九章 数组
构造数据类型之一 数组: 数组:包含一组同一类型的变量 数组元素:具有相同名字(即数组名), ),不同 数组元素:具有相同名字(即数组名),不同 的下标
§9.1 一维数组
★一维数组的定义: 表达式的值为整 数组中每个元素含又一个下标的数组 型 常量 ★定义方式: 类型名 数组名[常量表达式];
9.2.2 通过数组的首地址引用数组元素 int a[10]; 则a是数组元素的首地址,那么a+k和&a[k] 都表示第k个元 素的地址 因 “*”可引用地址所在的存储单元 那么a[k]=*(&a[k])=*(a+k); a[k]=*(&a[k])=*(a+k); 9.2.3 通过指针引用一维数组元素 int a[10],*p; p=a; /*则p 指向a数组的首地址*/ p+k 就表示a[k]的地址&a[k] 则 a[k]=*(&a[k])=*(p+k) 9.2.4带下标的指针变量引用 9.2.4带下标的指针变量引用 a[k]=p[k] 迄今为止,数组元素a[i]的表示方法有: a[i]的表示方法有 迄今为止,数组元素a[i]的表示方法有: a+i) p+i) (1)a[i] (2)*(a+i) (3)*(p+i) (4)p[i]
例 用数组求Fibonacci数列前20个数 #include <stdio.h> main() { int i; int f[20]={1,1}; for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1]; for(i=0;i<20;i++) { if(i%5==0) printf("\n"); printf("%12d",f[i]); } printf(“\n”); }
a[0] a[1] a[2] a[3] a[4] a[5]
编译时分配连续内存 内存字节数=数组维数* sizeof(元素数据类型)
例 int i=15; ★一维数组元素的引用 int data[i];(×)不能用变量定义数组维数) 引用形式: 数组名[下标表达式]
(注意:表达式的值必须为整数) 例: double x[8] ;
&array[0]
p
数组名是表示数组首地址的地址常量
如 int i, *p; p=1000; (×) i=p; (×) ★指针变量赋值数组地址运算
l l l l l p=&a; (将变量a地址赋值给p) p=array; (将数组array首地址赋值给p) p=&array[i]; (将数组元素地址赋值给p) p1=p2; (指针变量p2值赋值给p1) 不能把一个整数赋值给p,也不能把p的值整型变量
例
49 38 38 49 65 76 97 97 13 76 13 97 27 97 27 30 97 30 初 始 关 键 字
38 49 65 13 76 27 76 13 76 30 27 30 76 97 第 一 趟
38 49 65 13 65 27 13 65 30 27 65 30 76 第 二 趟
那么scanf函数可以这样来给数组元素赋值 函数可以这样来给数组元素赋值 那么 for(k=0;k<10;k++) scanf(“%d”,a+k);
3.用指向数组首地址的指针表示数组元素地址 3.用指向数组首地址的指针表示数组元素地址 int *p,a[10]; p=a;或 p=&a[0]则使 指向a数组的首地址,那么p+k 则使p p=a;或 p=&a[0]则使p指向a数组的首地址,那么p+k 就可以表示&a[k] 就可以表示&a[k] 例: int *p,a[10]; p=a; for(k=0;k<10;k++) for(k=0;k<10;k++) p++; 那么也可以这样给数组元素赋值 for(p=a,k=0;k<10;k++) scanf(“%d”,p++);
x[2] x[i] x[i+k]都是对数组元素的引用 注意( 注意 1)一个数组元素实际上是一个变量名,代表内存 中一个存储单元,一个数组占有一串连续的存 储单元 (2)只能逐个引用数组元素,不能一次引用整个数组 (3)数组名存放的是数组的首地址,是常量 例 例 int data[5]; int a[10]; data[0]=1; printf(“%d”,a); (×) 必须 for(j=0;j<10;j++) data[5]=10; //C语言对数组不作越界检查,使用时要 注意 printf(“%d\t”,a[j]); ( )
38 49 13 13 49 27 49 30 27 49 30 65 第 三 趟
38 13 13 38 27 27 38 30 30 38 49
13 27 30 38
13 27 30
13 27
第 四 趟 五 趟
第 六 趟
第 七 趟
第
n=8
#include <stdio.h> main() { int a[n] 输入n 个数给a[1] 到a[10],i,j,t; printf("Input 10 numbers:\n"); for j=1 to n-1 for(i=0;i<10;i++) scanf("%d",&a[i]); for i=1 to n-j printf("\n"); a[i]>a[i+1] 真 假 for(j=0;j<9;j++) a[i] a[i+1]for(i=0;i<9-j;i++) if(a[i]>a[i+1]) 输出a[1] 到 a[n] {t=a[i]; a[i]=a[i+1]; a[i+1]=t;} printf("The sorted numbers:\n"); for(i=0;i<10;i++) printf("%d ",a[i]); }