数组
- 格式:doc
- 大小:77.50 KB
- 文档页数:11
第六章一、数组的概念数组是共享一个名字的一组具有相同类型的连续存放的变量的集合数组是一组有序数据的集合数组中各数据的排列是有一定规律的,下标代表数据在数组中的符号所有的数组元素具有统一的数据类型数组名是数组的首地址,每个元素是连续存放的数组元素是由数组名和下标唯一确定二、一维数组①怎样定义一维数组一维数组的定义方式为类型标识符数组名[常量表达式]其中类型标识符:任一种基本数据类型或者是构造数据类型数组名:自己定义的数组标识符,遵从标识符命名规则常量表达式表示数组的长度,也是元素的个数注意:(1)数组名不能和变量名相同(2)定义的时候要指定数组中的元素个数常量表达式可以包括常量和符号常量比如int[3+5]是合法的但是不可以包括变量int a[n]是不合法的C不允许对于数组的大小进行动态定义不过如果在被调用的函数中(不包括main)中定义数组其长度可以是变量或者非常量的表达式比如Void func(int n){ int a[2*n] //合法的n的值从实参中传来调用func函数时形参n从实参中得到值这种情况叫做“可变长数组”,允许在每次调用func时有不同的n不过每次使用的时候数组的长度是固定的(3)数组的大小不可以是浮点常量(4)定义数组的时候不能没有数组长度int a[] 非法②一维数组元素的引用数组元素是组成数组的基本单元 数组元素也是一种变量 引用的格式数组名[数组下标]其中数组下标只可以是整型常量或者整型表达式 如果是小数的话c 编译的时候会自动取整数组在定义之后数组名代表数组的首地址其中的元素按照下标依次存放而且下标从0开始!数组定义之后系统将给其分配一定的内存单元其所占内存单元的大小和数组元素的类型和数组的长度有关数组所占内存单元字节数=数组大小*sizeof (数组元素类型)其中Int 2字节(TC 中)编译器不同可能不同 Char 1 Short 1 Long 4 Float 4 Double 8比如要引用a[2] 就会先计算2000+2*2=2004 然后再从2004中取出内容占用的字节数为: 10 * sizeof(int) = 10 * 2 = 20内存地址2000 200220042018a……第1个元素 ……第2个元素 第3个元素第10个元素注意事项(1)只可以逐个引用数组的元素,不能一次性引用整个数组(所以常用循环)(2)数组引用要注意越界问题C语言对于数组不作越界检查,但是下标超范围会死机或者程序错误(3)一般对于数组长度会采用宏定义define③一维数组的初始化如果对于一维数组不赋初值,则为随机数对于数组元素的赋值,叫做数组的初始化不赋值不叫初始化数据类型符数组变量名[常量表达式]={表达式1…表达式n}(1)在定义数组时对全部数组元素赋予初值Inta[5]={1,2,3,4,5};数组的元素要放在花括号里边,元素之间用逗号隔开花括号里边的数据叫做“初始化列表”(2)也可以只给数组中的一部分元素赋值Inta[5]={1,2,3};则只给前三个赋值,后边两个自动为0(3)如果想让一个数组中的元素全部都为0,可以写Int a[5]={0,0,0,0,0}; 或者Int a[5]={0};//未赋值的部分自动为0(4)在对全部数组元素赋初值的时候由于元素的个数确定可以不用指定数组的长度Int a[]={1,2,3,4,5};虽然是没有指定长度不过系统会自动默认是5不过不可以int a[];所以如果要定义的长度比赋值的长度长,就要写下标注意:表达式的个数不能超过数组变量的大小如果定义数值型数组的时候未被初始化列表指定初始化的都是0如果定义字符型数组的时候未被初始化列表指定初始化的都是’\0’如果定义指针型数组的时候未被初始化列表指定初始化的都是NULL空指针C语言除了在定义数组变量时可以对数组整体赋值之外无法再全体赋值所以Char a[3]A=,‘1’,’2’,’3’-A*+=,‘1’’2’3’-;A*3+=,‘1’’2’’3’-; 都是错的所以数组定义后只能用赋值语句一一赋值Char str[80];Str*0+=’b’ str*1+=’y’ str*2+=’e’ str*3+=’\0’ //数组str赋值为一字符串bye一般一维数组的赋值使用循环语句④一维数组程序举例冒泡法折半查找法斐波那契数列请见第二章书上出现的算法三、二维数组①怎样定义二维数组类型符数组名[常量表达式][常量表达式];二维数组可以看作特殊的一维数组 它的元素又是一维数组a[0] a[0][0] a[0][1] a[0][2] a[1] a[1][0] a[1][1] a[1][2] a[2] a[2][0] a[2][1] a[2][2]数组元素的存放顺序已行序优先最右下标变化最快 二维数组的a[0]a[1] 不可以当成数组元素变量使用 对于a[0]是数组名 是a[0][0] a[0][1] a[0][2]的地址 二维数组的存贮空间 是先按照行序再列的比如float a[3][4] 一共有12个元素由于是float 类型每个元素占四个字节所以一共是48个字节 存储顺序a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23②怎样引用二维数组数组名[下标][下标]对于int a[4][5]以及a[4][5]有什么差别前者定义了4行五列的二维数组最多引用到a34而a45 说明引用到了第五行和第六列则至少应该为int a[5][6]③二维数组的初始化数据类型数组变量名[行常量表达式][列常量表达式]= {{第0行初值表},{第1行初值表},…{最后1行初值表}}(1) 分行给二维数组赋初值Int a[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};(2) 可以把所有数据都放在一个花括号内,按照数组元素排列顺序依次赋值Int a[3][4]={1,2,3,4,5,6,7,8,9,0,1,2};014523(3)可以对于部分元素赋初值Int a[3][4]={{3},{4},{5}};也可以只对某几行赋值(4)定义的时候第一维长度可以省略第二维不能省略Int a[][4]={{0,0,3},{},{1,2}}④二维数组程序举例对二维数组的每个元素进行操作要用二重循环外层循环控制行下标的变化,内层循环控制列下标变化输出二维数组两条对角线元素值的和Sum1+=a[i][i] //主对角线Sun2+=a[i][2-i] //副对角线矩阵左下半三角元素中的值置为0For(i=0;i<n;i++)For(j=0;j<=I;j++)A[i][j]=0;对二维数组元素的操作,实际上就是先找出对应元素的行下标与列下标,然后进行操作。
第6讲数组数组是具有相同类型的一组数据。
数组按照数组名、数据元素的类型和维数来进行描述。
当访问数组中的数据时,可以通过下标来指明。
数组具有以下属性。
(1)数组可以是一维、多维或交错的。
(2)数值数组元素的默认值设置为0或空。
(3)数组的索引从0开始:具有n个元素的数组的索引是0~n-1。
(4)数组元素可以是任何类型,包括数组类型。
一、一维数组1.数组的声明数据类型[] 数组名如:int[] myArray;数组的大小不是其类型的一部分,声明一个数组时,不用管数组长度如何。
2.数组对象的创建声明数组并不实际创建它们。
在C#中,使用new关键字创建数组的对象。
数组名=new 数据类型[数组大小表达式];如:myArray=new int[5];此数组包含myArray[0]~myArray[4]new运算符用于创建数组并将数组元素初始化它们的默认值。
此例初始化为0。
如:String[] myStringArray=new string[6]此数组包含myStringArray[0]~myStringArray[5],数组元素初始化为空。
3.一维数组的初始化数据类型[] 数组名=new 数据类型[] {初值表};例:int[] myArray = new int[]{1,3,5,7,9};或int[] myArray;myArray = new int[]{1,3,5,7,9};或int[] myArray= {1,3,5,7,9};4.一维数组元素的访问数组名[下标](1)用foreach遍历数组:int[] myArray= {1,3,5,7,9};foreach (int i in myArray){Console.WriteLine(i);}(2)用for语句遍历数组int[] myArray= {1,3,5,7,9};for (int i = 0; i < 5; i++){Console.WriteLine(myArray[i]);}或int[] myArray= {1,3,5,7,9};for (int i = 0; i < myArray .Length ; i++){Console.WriteLine(myArray[i]);}冒泡排序:int[] arr = new int[] { 10, 8, 3, 15, 26, 11, 30 };for (int j = 1; j < arr.Length; j++){for (int i = 0; i < arr.Length - j; i++){if (arr[i] < arr[i + 1]){int temp = arr[i];arr[i] = arr[i + 1];arr[i + 1] = temp;}}}for (int i = 0; i < arr.Length; i++){Console.Write(arr[i] + " ");}二、值类型和引用类型值类型在栈(Stack)上分配,而引用类型在堆(Heap)上分配。
什么是数组?数组(Array)是一种数据结构,用于存储一系列相同类型的元素。
数组提供了一种按照索引顺序访问和操作元素的方式。
每个元素在数组中都有一个唯一的位置,称为索引,可以通过索引来访问和修改数组中的元素。
数组可以存储任何类型的数据,如整数、浮点数、字符、字符串等。
数组在内存中是连续分配的一块存储空间,每个元素占据一定大小的内存。
通过索引,我们可以直接访问数组中的特定元素,而不需要遍历整个数组。
数组的主要特点如下:1. 长度固定:一旦数组被创建,它的长度是固定的,无法动态改变。
在大多数编程语言中,数组的长度需要在创建时指定。
2. 连续存储:数组中的元素在内存中是连续存储的,这使得通过索引可以快速访问和修改元素。
3. 同一类型:数组中的所有元素必须是相同的类型。
这是因为数组在内存中需要分配连续的空间,每个元素占据相同的大小。
4. 零基索引:数组的索引从0开始,即第一个元素的索引是0,第二个元素的索引是1,以此类推。
这种索引方式称为零基索引。
创建数组的语法因编程语言而异,以下是一些常见的示例:在C语言中,创建一个包含5个整数的数组的示例:```int arr[5]; // 创建一个包含5个整数的数组```在Java语言中,创建一个包含5个整数的数组的示例:```int[] arr = new int[5]; // 创建一个包含5个整数的数组```在Python语言中,创建一个包含5个整数的列表(类似于数组)的示例:```arr = [0] * 5 # 创建一个包含5个整数的列表```通过索引,我们可以访问和修改数组中的元素。
例如,在上述的示例中,我们可以使用索引来访问和修改数组中的元素,如`arr[0]`表示数组的第一个元素,`arr[2]`表示数组的第三个元素。
数组还支持一些常见的操作,如遍历数组、在数组中查找元素、对数组进行排序等。
这些操作可以根据具体的编程语言和需求来实现。
使用数组时需要注意一些潜在的问题,如数组越界(访问超出数组长度的位置)、内存溢出(数组长度过大导致内存不足)等。
数组名词解释数组是计算机编程语言中最令人困惑的一类基本概念,它引入了一种索引数据结构,使得开发者可以将多个数据项放入一个数组中,它可以用来存储一组相关数据,以实现更具复杂性的数据处理。
在编程开发中,数组也被称为多维数组或对象数组。
数组(Array)是一个由一组有序的、具有相同类型的变量或对象组成的结构。
数组可以是一维数组(单行),也可以是多维数组(多行)。
在多维数组中,每一行都有相同的数据类型,每一个单元格可以存储一个具体的值。
数组可以用来存储数据,也可以按索引顺序对数据进行检索,并根据需要对存储的内容进行排序和处理。
数组具有高效的存取能力,并且它允许快速检索一组数据。
它最初是由程序员们使用来存储和维护一个索引的数据结构。
数组具有高可伸缩性,它可以容纳任意数量的变量,并且可以仅仅使用很少的内存。
在比特数上,数组的访问速度比哈希表要快。
数组还可以用于实现动态数据结构。
动态数据结构指的是数据结构,它可以按照需要自动重新排列,如添加或删除一个变量。
比如,一个多维数组可以根据需要按照行和列重新排列,而无需整个对象重新创建,从而更有效地利用计算机资源。
另一个重要功能是数组可以用于实现流算法,尤其是在计算数据集合的统计数据,如最大值、最小值、平均值、中位数、极差和标准差等。
流算法是一种特殊的算法,它可以在以有限的空间和时间内遍历整个数据集合,并计算出所有数据的统计值。
数组的最后一个重要的功能就是它可以用来实现排序算法。
排序算法是一种用来排序数据的算法,可以用数组存储原始数据,然后使用快速排序、冒泡排序或其他排序算法来排列它们,以便更容易检索和使用。
总之,数组是一种强大的数据结构,可以帮助计算机程序员更快地完成任务,有效地利用计算机资源,和更快地检索并处理数据。
它可以帮助程序员更好地组织和管理信息,并实现各种复杂的数据操作。
有了数组,程序员可以减少编程难度,提高程序的可移植性和可读性,更加有效地完成任务。
一、选择题1. 设有定义:char s[12]="harmonious";,则printf("%d", strlen(s));的输出结果是A. 9B. 10C. 11D. 122. 错误的说明语句是____。
A) char word[ ]={ 'T', 'u', 'r','b', 'o', '\0' };B) char word[ ]={ "Turbo\0" };C) char word[ ]="Turbo\0";D) char word[ ]='Turbo\0";3. 已知:chars[5], c; int b;则调用函数scanf的正确语句是______。
A) scanf( "%s%c", s, C);B) scanf( "%d%c", &b, &C);C) scanf( "%d%c", b, &C);D) scanf( "%s%c", s, &C);4. 合法的数组说明语句是____。
A) int[ ]="string";B) int a[5]={ 0, l, 2, 3, 4, 5 };C) char a="string";D) char a[ ]={ 0, l, 2, 3, 4, 5 };5. 在下述对C语言字符数组的描述中错误的是____。
A) 字符数组可以存放字符串B) 字符数组中的字符串可以进行整体输入/输出C) 可以在赋值语句中通过赋值运算符"="对字符数组整体赋值D)字符数组的下标从0开始6. 调用str1en( "abcd\0ef\0g" )的返回值为____。
A) 4 B) 5 C) 8 D) 97. 已知:char str1[10], str2[10]={ "books" };则在程序中能够将字符串"book"赋给数组str1的正确语句是____。
A) str1={ "books" };B) strcpy( str1, str2 );C) str1=str2;D) strcpy( str2, str1 );8. 已知:char str1[20]="abcde", str2[20]="xyz"; 则执行语句;printf( "%d", str1en( strcpy( str1, str2 ) ) );输出结果是____。
A) 9 B) 3 C) 5 D) 89. 下面字符串的说明错误的是____。
A) char str[7]="FORTRAN";B) char str[ ]="FORTRAN";C) char *str="FORTRAN";D) char str[ ]={'F','O','R',T,'R','A','N','\0'};10. 已知:int i, x[3][3]={ l, 2, 3, 4, 5, 6, 7, 8, 9 };则下面语句的输出结果是____。
for( i=0; i<3; i++ )printf( "%d", x[i][2-i] );A) 159 B) 147 C) 357 D) 36911. 已知:char str[ ]="ab\n\012\\\"";则执行语句:printf( "%d", str1en(str) );的结果是____。
A) 3 B) 4 C) 6 D) 12C) a[4-2][0] D) a[0][4]13. 以下能对外部的二维数组a进行正确初始化的语句是____。
A) int a[2][ ]={ { l, 0, l }, { 5, 2, 3 } };B) int a[ ][3]={ { l, 2, 3 }, { 4, 5, 6 } };C) int a[2][4]={ { l, 2, 3 }, { 4, 5 }, { 6 } };D) int a[ ][3]={ { l, 0, 1, { },{ 1, 1 } };14. 以下不能对二维数组a进行正确初始化的语句是____。
A) int a[2][3]={ 0 };B) int a[ ][3]={ { l, 2 }, { 0 } };C) int a[2][3]={ { l, 2 }, { 3, 4 }, { 5, 6 } };D) int a[ ][3]={ l, 2, 3, 4, 5, 6 };15. 下面程序的运行结果是____。
char c[5]={ 'a', 'b', \0', 'c', \0' };printf( "%s", c );A) 'a"b' B) ab C) abc D) 都有错16. 在下面的程序段中,每行前面的数字表示行号,则下面程序____。
1 main( )2 {3 int a[3];4 int i;5 for(i=0; i<3; i++) scanf("%d", &a[i]);6 for(i=1; i<3; i++) a[0]=a[0]+a[i];7 printf( "%d\n", a );8 }A) 没有错误B) 第5行有错误C) 第6行有错误D) 第7行有错误运行程序, 输入:Fortran Language17. 下面程序输出两个字符串中对应位置相同的字符。
请选择填空。
#include<stdio.h>char x[ ]="programming";char y[ ]="Fortran";main( ){ int i=0;while( x[i]!='\0'&&y[i]!='0' )if( x[i]==y[i] )printf( "%c", _______ );else i++;}A) x[i++] B) y[++i] C) x[i] D) y[i]18. 下面程序的功能是将字符串s中所有的字符"c"删除。
请选择填空。
#include<stdio.h>main( ){ char s[80]; int i, j;gets(s);for( i=j=0; s[i]!='\0'; i++ )if(s[i]!='c')puts(s);}A) s[j++]=s[i] B) s[++j]=s[i]C) s[j]=s[i]; j++ D) s[j]=s[i]二、读程序写结果1. main( ){static int[3][3] ={1,2,3,4,5,6,7,8,9},x,s1=0,s2=0;for(x=0;x<=2;x++)s1 = s1 -a[x][x];for(x=0;x<3;x++)s2= s2+a[x][2-x];printf(“s1=%d,s2=%d”,s1,s2);}2.main(){int a[6]={1,2,3,4,5,6},k;for(k=5;k>=0;k--)if(a[k]%2!=0)printf(“%d ”,a[k]);}3. main( ){ int i, j, k, n[3];for( i=0; i<3; i++)n[i]=0; k=2;for( i=0; i<k; i++ )for( j=0; j<k; j++ )n[j]=n[i]+1;printf( "%d\n", n[1] );}4. 阅读程序,写出执行结果。
#include<stdio.h>main( ){ char str[30];scanf( "%s", str );printf( "%s", str );}运行程序,输入:Fortran Language5. 阅读程序,写出执行结果。
#include "stdio.h"main( ){ char str[30]; gets( str );printf( "%s\n", str );}三完善程序题1.将一个二维数组行和列元素互换,存到另一个二维数组中.int a[2][3]={1,2,3},{4,5,6}};int b[3][2],i,j;for(i=0;i<=1;i++)for(j=0;j<=2;j++)b[j][i]=___________;for(i=0;i<=2;i++){for(i=0;i<=2;i++)printf("%d ",b[i][j]);printf("\n");}}2. 用起泡法对10个数排序(由大到小)main(){int a[10],i,j,t;for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<=8;i++)for(j=0;j<=8-i;j++)if(______){t = a[j];a[j]=a[j+1];a[j+1]=t;}for(j=0;j<=9;j++)printf("%d",a[j]);}3.有一个3*4的矩阵,求出其中值最大的那个元素的值,以及其所在的行号和列号。
main( ){int i,j,row = 0,colum = 0,max;int a[3][4] = {{1,2,3,4},{9,8,7,6},{-10,3,5,7}};max = a[0][0];for(int i=0;i<=2;i++)for(j=0;j<=3;j++)if(a[i][j]>max){________;row= i;colume = j;}printf("max=%d,row=%d,colum=%d\n",max.row+1,colum+1);}4.输出字符串中的数字字符#include "stdio.h"char a[80];int i = 0;gots(a);while(a[i]!='\0'){if(______)putchar(a[i]);i++;}}5. 输出Fibonacci数列的前30项。