数组
一、思考题
1.要分配存放12个元素的整型数组,下列数组声明(下界若无,按默认规定)
哪些符合要求?
(1) n=12 (2) Dim a%( )
Dim a(1 To n) As Integer n=11
ReDim a(n)
(3) Dim a%[2,3] (4) Dim a(1,1,2) As Integer
(5) Dim a%(10) (6) Dim a!( )
ReDim a(1 To 12) ReDim a(3,2) As Integer
(7) Dim a%(2,3) 8) Dim a(1 to 3, 1 to 4) As Integer
2.已知下面的数组声明,写出它的数组名、数组类型、维数、各维的上、下界、数组的大小、并按行的顺序列出各元素。
Dim a(-1 to 2,3) As Single
3. 已声明了静态数组A(3, 4),能否在下面再用重定义动态数组A(4, 4)来重定义A数组的大小吗?
二、选择题
1.以下关于数组的说法,不正确的是______。
(A)静态数组在声明时大小必须固定(B)动态数组在声明时大小可以不确定
(C)默认情况下数组的下界为0 (D)运行时可改变动态数组或静态数组的大小
2.有关数组的说法,错误的是______。
(A)数组是一种特殊的数据类型(B)一个数组中可存放多种类型的数据
(C)数组是一组相同类型的变量的集合(D)
数组可以被声明为变体类型
3.如下数组声明语句,______正确。
(A)Dim a[3, 4] As Integer (B)Dim a(3, 4) As Integer
(C)Dim a(n, n) As Integer (D)Dim a(3 4) As Integer
4. 要分配存放如下方阵的数据,______数组声明语句能实现(不能浪费空间)。
(A)Dim a(9) As Single (B)Dim a(3, 3) As Single
(C)Dim a( 1 To 3 , 1 To 3) As Single(D)Dim a( -3 To -1 , 5 To 7) As Integer
5. 如下数组声明语句,则数组a包含元素的个数有______。
Dim a(3, -2 to 2,5)
(A)120 (B)75 (C)60 (D)13
6. 以下程序输出的结果是______。
Dim a
a = Array(1, 2, 3, 4, 5, 6, 7)
For i = Lbound (a) To Ubound (a)
a(i) = a(i) * a(i)
Next i
Print a(i)
(A)49 (B)0 (C)不确定(D)程序出错
7.下列数组声明语句中的数组a包含了______个数组元素
Dim a(4,-1 To 2, 3)
(A) 120 (B) 11 (C)60 ( D)80
8. 有如下程序段:
Type student
nl as Integer
name as String*13
End Type
Dim stu As student
该程序段定义了两个程序成分,它们分别是______
(A)数据类型和自定义类型变量(B)自定义类型和变量
(C)显示类型和变量(D)自定义类型和自定义类型变量
9.在窗体的通用声明段自定义了数据类型student,下列定义方式是正确的。
(A) Private Type student (B)Type student
No as Integer No as Integer
Name as String *8 Name as String *8
End Type End student
(C) Type student (D)Type student
No Integer No as Integer
Name String *8 Name as String *8
End Type End Type
10. 设数组a中有N个元素,并已按递增次序排列,下面______程序段可以使a数组的元素按递减次序排列。
(A) For i = 1 To N (B) For i = 1 To N / 2
a(N - i + 1) = a(i) a(i) = a(N - i + 1)
Next i Next i
(C)For i = 1 To N (D)For i = 1 To N / 2
t = a(i) t = a(i)
a(i) = a(N - i + 1) a(i) = a(N - i + 1)
a(N - i + 1) = t a(N - i + 1) = t
Next i Next i
三、填空题
1. 在VB中,若要设定每个数组默认的下界固定为1,其声明语句是_option base 1_____ 。
2. 程序中自动测试数组的下界用__Lbound____函数来实现,上界用_Ubound_____函数来实现。
3. 当数组首次被声明时,对所有数值型数组默认初值是_0_____;字符串数组默认初值是_空_____。
4. 当用ReDim语句要改变动态数组的大小时,数组元素的值会_丢失_____;用_Preserve_____关键字可保留数组元素原来的值。
5. 已知建立了5个元素的Command1控件数组,用_Index__参数可识别用户单击了某控件数组元素。
6. 在一个二维数组中,第一个下标指明了一个元素的_行_____;第二个下标指明了元素的_列_____。
7. 已知如下a(1 To 5)数组和i、j、k变量有了初值:
请写出下列各数组元素的值或会产生什么情况:
a(3)=_5__;a(i)=_3_; a(i+j)=_越界_____;
a(k-i)=______;a(a(i))=______; a(3+k\3)=______;
a(i*j)=______; a(0)=______;
8. 如下程序中随机产生6位学生的分数(分数范围1~100),存放在数组a中,以每2分一个"*"显示,如图1.5.14所示。
Private Sub Command1_Click()
Dim a%(1 To 6)
For i = 1 To 6
a(i) = _Int(Rnd*100+1)_
Print string(a(i)\2,_”*”);”A”& “(“& “)”
& “=” & a(i)_
Next i
End Sub
图1.5.14:随机分数运行界面
9.下面程序的功能是从键盘输入6个整数,找出最大数和最小数所在的位置,并把两者对调,然后输出调整后的6个数。
Private Sub Command1_Click()
Dim a(5) As Integer, max%,maxi%, min%,mini%, i%,t%
For i = 0 To 5
a(i) = _val(text1)__
Next i
min=a(0):mini=0
max=a(0):maxi=0
For i = 1 To 5
If _a(i) If _a(i)>max___ Then maxi=i Next i t=a(maxi) _a(maxi)=a(mini)_ a(mini) = t For i = 0 To 5 Print a(i); Next i End Sub 过程 一、思考题 1. 简述子过程与函数过程的共同点、不同处? 2. 什么是形参?什么是实参?什么是值引用?什么是地址引用?地址引用时,对应的实参有没有限制? 3.请比较函数过程和子过程调用的区别。 4.请说明局部变量与静态变量的区别。 5. 指出下面过程语句说明中的错误。 (1) Sub f1( n%) As Integer 子过程f1没有类型 (2) Function f1%(f1%) 函数过程名和形参同名 (3) Sub f1(ByVal n%()) 形参数组必须是传址 (4) Sub f1( x(i) as Integer) 形参不能指定大小, 6.已知有如下求两个平方数和的fsum子过程: Public Sub fSum(sum%, ByVal m%, ByVal n%) sum = a * a + b * b End Sub 在事件过程中有如下变量声明: Private Sub Command1_Click() Dim a%, b%, c! a = 10: b = 20 则指出如下过程调用语句错误所在: (1) fsum 3, 4, 5 (2) fsum c, a, b (3) fsum a + b, a, b (4) Call fsum(Sqr(c), sqr(a), Sqr(b)) (5) Call fsum c,a, b 7. 要使变量在某事件过程中保值,有哪几种变量声明的方法? 声明变量为全局(public),通用声明段或标准模块声明的模块级变量,局部过程声明的静态变量(static). 8. 为了使某变量在所有的窗体中都能使用,应在何处声明该变量? 在标准模块声明的全局变量 9. 在同一模块、不同过程中声明的相同变量名,两者是否表示同一个变量?有没有联系? 表示不同的变量,没有任何关系 二、选择题 1.下面的过程定义语句中,______是合法的。 (A)Function Sub1(Sub1) (B)Function Sub1(ByVal n) (C)Sub Sub1(Sub1) (D)Sub Sub1(n) As Integer 2.主过程通过参数传递将一个参数传递给子过程A,并返回一个结果,下列子过程定义中正确的是______。(A) Sub A (m+1, n+2) (B) Sub A( byval m!,byval n!) (C) Sub A (byval m!, n+2) (D) sub A (byval m!, n!) 3. 在Visual Basic中,下列关于变量的叙述正确的是______. (A)在窗体的Form_Load事件过程中声明的变量是全局变量 (B)局部变量的作用域为窗体内的全部过程 (C)在某个子过程中声明的变量不能与其他事件过程中声明的变量同名 (D)在调用过程时,所有局部变量被系统初始化为0或空字符串 4. 子过程与函数过程最根本的区别是______。 (A)前者可以使用Call或者直接使用过程名调用,后者不可以 (B)前者不可以有参数,后者可以有参数 (C)两种过程参数的传递方式不同 (D)前者无返回值,但后者有返回值 5. 假定有如下的Sub过程: Sub fun(x As Single,y As Single) t=x x=t\y y=t Mod y End Sub 在窗体上画一个命令按钮和两个文本框(其Name属性分别为Txtl和Txt2),然后编写如下事件过程:Private Sub Command1_Click() Dim a As Single,b As Single a=CInt(Txt1.Text) 'Cint函数表示转换成整型 b=CInt(Txtl.Text) Call fun(a,b) Print a,b End Sub 程序运行时在两个文本框中输入5, 6,单击命令按钮,输出结果为______ (A)5 6 (B) 0 5 (C) 1 4 (D) 1 2 6.若要编写一些Sub子过程,并能从多个窗体中访问这些过程,最好应将它们放在______中。 (A)标准模块(B)窗体(C)类模块(D)以上都不可以 三、填空题 1.在过程定义时,参数有值传递和地址传递,若形参是数组,不能使用Byval来修饰参数。 2.传地址方式是当过程被调用时,形参和实参共享存储单元。 3.有一个函数过程,其形参有两个:a为整型,b为一维整型数组,函数过程名为Myfun,函数返回值为逻辑型,请写出函数过程定义的首语句 Function Myfun (Byval a%,b%()) as boolean 。 4.Exit Function语句只能出现在__ Function ____的过程体。 5.在过程体,用_static__方式声明的局部变量,其值可以保留至下次过程被调用。 6.VB中的变量按其作用域分为全局变量、模块级变量和局部变量。 7.窗体中的模块级变量应在通用段声明,它作用于该窗体所有过程。 8.过程自己调用自己称为_递归____。 9.如下程序,运行的结果是144__,函数过程的功能是_将十进制数转换成八进制数__。 Public Function f(ByVal n%, ByVal r%) If n <> 0 Then f = f(n \ r, r) Print n Mod r; End If End Function Private Sub Command1_Click() Print f(100, 8) End Sub 10.如下程序,运行的结果是_3 5 7 4 5 __。 Public Sub Proc(a%()) Static i% Do a(i) = a(i) + a(i + 1) i = i + 1 Loop While i < 2 End Sub Private Sub Command1_Click() Dim m%, i%, x%(10) For i = 0 To 4: x(i) = i + 1: Next i For i = 1 To 2: Call Proc(x): Next i For i = 0 To 4: Print x(i);: Next i End Sub 11. 同标准函数Replace一样,MyReplace(S,OldS,NewS)函数过程用NewS子字符串替换在S字符串中出现的OldS子字符串,使程序完整。例如,当调用MyReplace("abcdefgabcdecd","cd","3")时函数的返回值为"ab3efgab3e3" 函数过程定义如下: Public Function MyReplace(s$, OldS$, NewS$) As String Dim i%, lenOldS% lenOldS = Len(OldS)' 取OldS字符子串长度 i = InStr(_s,OldS )' 在s字符串中找有否OldS字符子串 Do While i > 0 ' 找到用NewS 字符子串替换OldS字符子串s = mid(s,1,i-1) + NewS + Mid(s, i + lenOldS) i = InStr(s, OldS) ' 找下一个OldS字符子串 Loop MyReplace = _s___ ' 替换后的字符串赋值给函数过程名End Function 第五章数组练习题及答案 一、选择题 1、判断字符串a和b是否相等,应当使用() A、if(a==b) B、if(a=b) C、if(strcpy(a,b)) D、if(strcmp(a,b)) 2、以下正确的定义语句是() A、int a[1][4]={1,2,3,4,5}; B、float x[3][]={{1},{2},{3}}; C、long b[2][3]={{1},{1,2},{1,2,3}}; D、double y[][3]={0}; 3、以下各组选项中,均能正确定义二维实型数组a的选项是() A、float a[3][4]; float a[ ][4]; float a[3][ ]={{1},{0}}; B、float a(3,4); float a[3][4]; float a[ ][ ]={{0},{0}}; C、float a[3][4]; static float a[ ][4]={{0},{0}}; auto float a[ ][4]={{0},{0},{0}}; D、float a[3][4]; float a[3][ ]; float a[ ][4]; 4、下面程序的运行结果是() 1—5 DDCBA 6—10 BDABB 11—15 CCCBC 16—20 DDCBB 21—25 BBAAA 26—30 DBDDB #include "stdio.h" main() { char str[]="SSSWLIA",c; int k; for(k=2;(c=str[k]!='\0');k++) { switch(c) {case 'I':++k;break; case 'L':continue; default:putchar(c);continue; } putchar('*'); } } A、SSW* B、SW* C、SW*A D、SW 5、下面程序段是输出两个字符串中对应相等的字符。横线处应填入() char x[]="programming"; char y[]="Fortran"; int i=0; 一、指针数组及指向一维数组的指针(数组指针)讲解 1、数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 2、指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int *说明这是一个整型指针数组,它有n个指针类型的数组元素。这样赋值是错误的:p=a;只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; for(i=0;i<3;i++) p[i]=a[i]; 这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p [1]、p[2]所以要分别赋值。 这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。 还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。 比如要表示数组中i行j列一个元素: *(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j] 优先级:()>[]>* 例1、下列给定程序中,函数fun()的功能是:从N个字符串中找出最长的那个串,并将其地址作为函数值返回。 #include 在Win 32 中: 1. (1) 对数组名进行sizeof运算时,结果是整个数组占用空间的大小; (2) 但是数组作为函数参数时,对数组名进sizeof 运算,结果为4; (2) 对指针进行sizeof运算得到的值是编译器分配给指针(也就是一个地址)的内存空间,即为4。 2. (1) 对数组名作&运算,得到的还是数组第一个元素的地址; (2) 对指针取地址时得到的结果是指针所在的地址,也就是指向这个指针的指针,与指针的值不同。 BOOL mytest(char param[100]) { //参数数组名:paramBytes int paramBytes = sizeof(param); printf("paramBytes \t%d\n",paramBytes); //数组:mych1[] char mych1[] = "abcdefg123"; //若定义为mych1[100] int mych1Bytes = sizeof(mych1); printf("mych1Bytes \t%d\n",mych1Bytes);//输出:100 //数组:mych[200] char mych[200] = {0}; int myBytes = sizeof(mych); printf("myBytes \t%d\n",myBytes); printf("---addr \t%d\n",mych); printf("---addr \t%d\n",&mych); //指针:pch char* pch = "12345abc"; int pchBytes = sizeof(pch); printf("pchBytes \t%d\n",pchBytes); //pch = mych; printf("---addr \t%d\n",pch); printf("---addr \t%d\n",&pch); return TRUE; } 运行: 习题四参考答案 一、选择题 1.下面关于串的叙述中,哪一个是不正确的?(B ) A.串是字符的有限序列 B.空串是由空格构成的串 C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储 2.串的长度是指( A ) A. 串中包含的字符个数 B. 串中包含的不同字符个数 C. 串中除空格以外的字符个数 D. 串中包含的不同字母个数 3.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为( C )A.求子串B.联接C.模式匹配D.求串长 4.设主串的长度为n,模式串的长度为m,则串匹配的KMP算法时间复杂度是( C )。 A. O(m) B. O(n) C. O(n + m) D. O(n×m) 5. 串也是一种线性表,只不过( A )。 A. 数据元素均为字符 B. 数据元素是子串 C. 数据元素数据类型不受限制 D. 表长受到限制 6.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主进行存储,a11为第一元素, 其存储地址为1,每个元素占一个地址空间,则a85的地址为( B )。 A. 13 B. 33 C. 18 D. 40 7. 有一个二维数组A[1..6, 0..7] ,每个数组元素用相邻的6个字节存储,存储器按字节编址, 那么这个数组占用的存储空间大小是(D )个字节。 A. 48 B. 96 C. 252 D. 288 8.设有数组A[1..8,1..10],数组的每个元素占3字节,数组从内存首地址BA开始以列序 为主序顺序存放,则数组元素 A[5,8]的存储首地址为( B )。 A. BA+141 B. BA+180 C. BA+222 D. BA+225 9. 稀疏矩阵的三元组存储表示方法( B ) A. 实现转置操作很简单,只需将每个三元组中行下标和列下标交换即可 B. 矩阵的非零元素个数和位置在操作过程中变化不大时较有效 C. 是一种链式存储方法 D. 比十字链表更高效 10. 用十字链表表示一个稀疏矩阵,每个非零元素一般用一个含有( A )域的结点表示。 A.5 B.4 C. 3 D. 2 二、填空题 1. 一个串的任意连续字符组成的子序列称为串的子串,该串称为主串。2.串长度为0的串称为空串,只包含空格的串称为空格串。 3. 若两个串的长度相等且对应位置上的字符也相等,则称两个串相等。 4. 寻找子串在主串中的位置,称为模式匹配。其中,子串又称为模式串。 5. 模式串t="ababaab"的next[]数组值为-1001231,nextval[]数组值为-10-10-130。 6. 设数组A[1..5,1..6]的基地址为1000,每个元素占5个存储单元,若以行序为主序顺序 存储,则元素A[5,5]的存储地址为1140。 C语言(数组) 一、选择题 1. 设有程序: main() { int i,a[11]; printf("给数组赋值:\n"); for (i=0;i<=10;i++) scanf("%d",( )); ... ... printf("输出数组:\n"); for(i=0;i<=10;i++) printf("%d,",( )); } 则在程序中的两个园括号中分别应填入:C A) &a[i]和&a[i] B) a[i]和&a[i] C) &a[i]和a[i] D) a[i]和a[i] 2. 设已定义:int a[15]; 则数组a占用的内存单元数是( C ). A) 15 B) 16 C) 30 D) 32 3. 阅读程序: main() { int a[2]={0},i,j,k=2; for(i=0;i return r; } main() { int x,a[]={2,3,4,5,6,7,8,9}; x=f(a,3); printf("%d\n",x); } 以上程序的输出结果是( D ). A) 720 B) 6 C)24 D) 120 5. 以下定义语句中,错误的是( B ). A) int a[ ] = {6,7,8}; B) int n=5, a[n]; C) char a[ ]= "string"; D) char a[5 ]={'0','1','2','3','4'}; 6. 以下描述中正确的是( D ). A) 数组名后面的常量表达式用一对圆括弧括起来 B) 数组下标从1开始 C) 数组下标的数据类型可以是整型或实型 D) 数组名的规定与变量名相同 7. 若定义数组并初始化char a[10]={'0','1 ','2','3','4','5','6','7','8','9'};指出以下错误语句( AB ). A) scanf("%c",a[0]); B) scanf("%s",&a); C) printf("%c",a[3]); D) printf("%s",a); 8.若定义数组int a[10] ,其最后一个数组元素为( C ). A) a[0] B) a[1] C) a[9] D) a[10] 9. 若定义数组并初始化int a[10]={ 1,2,3,4},以下语句哪一个不成立( B )? A) a[8] 的值为0 B) a[1] 的值为1 C) a[3] 的值为4 D) a[9] 的值为0 10. 指出以下错误语句( A ). 第9章数组 第1课 知识点一 定义一维数组 格式: 类型名数组名[元素个数] 例1 定义一个包含4个整数的数组a int a[4]; 例2 定义一个包含3个双精度数的数组b double b[3]; 注意: C语言中数组的下界从0开始计数。 例如: a[4]的4个元素分别为a[0]、a[1]、a[2]、a[3] 知识点二 一维数组的初始化 用一对大括号将数组的初值括起来。 例1 int a[3]={1, 2, 3}; 此例中a[0]值为1、a[1]值为2、a[2]值为3 例2 int a[5]={0}; 此例中数组a的全部元素值均为0 例3 int a[3]={1, 2, 3, 4}; 此例中由于初值个数多于数组元素个数,所以非法。例4 int a[ ]={0, 0, 0, 0}; 此例中省略数组元素个数,初值为4个0 等价于int a[4]={0}; 注意: 数组名是一个常量值,不能对它赋值。 例如: int a[3]; a=5; 此语句非法,应改为a[0]=5; 知识点三 一维数组应用 例1 从键盘上输入10个整数,输出最大数和最小数。 #include数组练习题及答案
指针数组及指向一维数组的指针讲解
数组名和指针的区别(小结)
第4章 串与数组 习题参考答案
C语言练习3(数组)=参考答案
数组及指针 知识点总结