C程序设计第七章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数组及其相关概念
数组是一组有序的、类型相同的数据的集 合,这些数据被称为数组的元素。
数组下标
每个数组都有一个名字,我们称之为数组名。 为标识数组中的每个元素,我们需要对它们进行 编号,这种编号我们称之为数组元素的下标。
注意:C语言规定下标从0开始。
由于有了下标,元素在数组中的位置(或排列 顺序)就被唯一地确定下来。我们用数组名加上 下标就可以准确地访问数组中的某个元素了。 如:w[0]代表数组w中的第一个元素 w[9]代表数组w中的第十个元素 说明:数组元素在内存中是连续存储的。
例如:若有 int a[2*5][3*4], i=15; 则使用 a[3*3][0], a[1][i-5]都是合法的。
说明:数组名a代表的是数组a在内存中的首地址, 因此,可以用数组名a来代表数组元 素 a[0][0]的地址。
四、二维数组应用举例
例1:使用数组保存“九九表”,然后输出。
main() { int a99[10][10], i, j ; for(i=1; i <10; i++) for(j=1; j<=i; j++) a99[i][j]=i*j; for(i=1; i<10; i++) { for(j=1;j<=i; j++) printf(“%6d",a99[i][j]); printf(“\n”); } }
如: int a[2][3]={{5,6},{7,8}};
得到的数组为: 5 6 0 7 8 0
int a[2][3]={5,6,7,8};
得到的数组为: 5 6 7 8 0 0
⑵在对二维数组初始化时,如果对全部元素都赋初值, 或分行赋初值(每行至少一个数据),则可以省略第一 维数组长度。但是,第二维数组长度不允许省略。 如: a[][3]={1,2,3,4,5,6,7,8,9}; int
t=(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10)/10; if( w1 < t ) printf( "%d\n", w1 ); if( w2 < t ) printf( "%d\n", w2 ); if( w3 < t ) printf( "%d\n", w3 ); if( w4 < t ) printf( "% d\n", w4 ); if( w5 < t ) printf( "%d\n", w5 ); if( w6 < t ) printf( "%d\n", w6 ); if( w7 < t ) printf( "%d\n", w7 ); if( w8 < t ) printf( "%d\n", w8 ); if( w9 < t ) printf( "%d\n", w9 ); if( w10 < t ) printf( "%d\n", w10 ); }
例7.3:用冒泡法对10个数排序(由小到大)。 冒泡法的思路是:将相邻两个数比较,将小的 调到前头。
剩数 轮数
9 8 5 4 2 0
8 9 5 4 2 0
8 5 9 4 2 0
8 5 4 9 2 0
8 5 4 2 9 0
8 5 4 2 0 9
5 4
1 2
3
2 1
3
4 5
第一轮排序,比较了5次 ,获得第一次结果.
数组名代表数组的起始地址。
7.1 一维数组的定义和引用
一、一维数组的定义
定义一维数组的一般方式:
类型说明符 数组名[常量表达式]; 指明数组元素 的数据类型 指明数组所含 的元素个数
例如:int a[10]; /*定义的整型数组a含10个元素*/ float b[20]; /*定义的实型数组b含20个元素*/
ຫໍສະໝຸດ Baidu
例如:int a[2][3]={{1 , 2 , 3 } , { 4 , 5 , 6 }};
⑵省略掉内层的花括号 即按数组元素在内存中排列的顺序赋初值。
例如:int a[2][3]={1 , 2 , 3 , 4 , 5 , 6 };
说明:
⑴ 在对二维数组初始化时,也可以只对部分数组 元素初始化,未被初始化的数组元素将自动赋 0 。

数组元素的下标是从0开始的。
如:int a[2]; scanf(“%d,%d”,&a[1],&a[2]);
⑶ 数组元素的赋值是逐个元素进行的,不允 许把一个数组作为一个整体赋给另一个数组。 除了数组初始化外,也不允许用在花括号中列 表的方式对数组整体赋值。 例1: int a[5]={ 2 , 4 , 6 , 8 , 10 } , b[5] ; b[5]=a[5] ; 例2 :int a[5] ; a[5]={ 2 , 4 , 6 , 8 , 10 } ; ⑷ 数组名a代表的是数组a在内存中的首地址, 可以用数组名a来代表数组元素a[0]的地址。 scanf(“%d”,&a[0]); scanf(“%d”,a);
main() { int a[11], i , j , t ; printf(“Input 10 numbers : \n”); for(i=1 ; i<11 ; i++) scanf(“%d”,&a[i]); printf(“\n”); for(j=1 ; j<=9 ; j++) /* 控制9轮排序 */ for(i=1 ; i<=10-j ; i++) /* 每轮排序比较次数*/ if(a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } for(i=1 ; i<=10 ; i++) printf("%d",a[i]); }
char name[0]; float weight[10.3]; float array[-100];
二、一维数组的初始化
1 .定义时初始化 方法:将初值依此写在花括号{ }内。 如: int a[5]={ 2 , 4 , 6 , 8 , 10 }; 存储形式: 存储单元
说明:
⑴如果在定义一维数组时给出了全部元素的初值, 则数组的下标允许省略。此时编译系统将自动 根据初始化数据的个数来确定数组的长度。 如: int a[ ]={ 2 , 4 , 6 , 8 , 10 }; int a[ ]; ╳ ⑵初始化的数据个数允许少于数组的长度,但不 能多于数组的长度。当初始化的数据个数(至 少要有一个)少于数组的长度时,未初始化部 分将被编译系统自动用 0 赋值。 如:int a[5]={ 2 , 4 }; 相当于:a[0]=2, a[1]=4, a[2]=0, a[3]=0, a[4]=0 int a[5]={1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 }; ╳
int a[][4]={{1,2},{3,4,5,6},{7}};
int a[][10]={1,0};
系统按3行处理
float f[2][]={1.1,2.2};
三、二维数组的引用
与引用一维数组元素一样,是用下标法引 用二维数组元素的。 表示形式: 数组名[行下标][列下标]
其中,行下标和列下标是整型常量、整型 变量或整型表达式。其编号是从0开始的。
一、二维数组的定义
• 定义二维数组的一般方式:
类型说明符 数组名[常量表达式1][常量表达式2];
如: int a[3][4];
• 存储形式:
二维数组在内存中是按行的顺序存放的,即 先存放第一行的元素,再存放第二行的元素。
二维数组除了维数比一维数组多一维外, 说明: 其它性质与一维数组是全部类似的。
看看下面写法是否正确?
① int a[0][3];
用于定义数组长度的常量表达式的值必须 是大于0的正整数。
② int i=3 , j=4 ; int a[i][j] ; 定义数组元素的个数必须使用常量表达式, 而不能使用变量。
二、二维数组的初始化
这里主要介绍定义时初始化,其它方法初始 化和一维数组类似。定义时初始化有两种方法: ⑴分行初始化
2 .使用其它方法初始化
⑴利用赋值语句初始化 main() { char as[26],ch; for(ch='A';ch<='Z';ch++) as[ch-'A']=ch as[ch-'A']=ch; …... } ⑵利用输入语句初始化 main() { char as[26]; int i ; for(i=0; i<26; i++) scanf("%c",&as[i]) scanf("%c",&as[i]); …... }
用数组来解决问题: main() { int w[10]; /* 定义 1 个整型数组存放体重 */ int t, i; for( i=0; i<10; i++ ) scanf( "%d", &w[i] ); for( t=0, i=0; i<10; i++ ) t = t + w[i]; t = t/10; for( i=0; i<10; i++ ) if( w[i] < t )printf( "%d\n", w[i] ); }
等价于
四、一维数组应用举例
例1:从键盘上输入10个实型数存入数组,然 后按输入顺序的逆序输出这10个数。 main() { float a[10]; int i; for(i=0 ; i<10 ; i++) scanf(“%f”,&a[i]); for(i=9 ; i>=0 ; i--) printf(“%10.2f”,a[i]); }
} printf("\n");
} printf("\n array b:\n"); for(i=0;i<3;i++) { for(j=0;j<2;j++) printf("%6d",b[i][j]); printf("\n"); }
7.2 二维数组的定义和引用
先看一个例子: 某校近三年招收各专业毕业生情况如下:
计算机 电子 管理 数学 1999 90 40 80 30 2000 100 50 90 40 2001 95 45 100 50 要把这些数据组织起来,可以有两种选择:
⑴按从左到右从上到下的顺序存入一个一维数 组中。(查询困难) ⑵每年用一个一维数组,把这些数据分别存入 三个数组中。(统计数据困难)
三、一维数组的引用
数组元素类似于单个变量,可以自由地存取。 但是,它与一般变量相比,有以下特殊之处: ⑴ 数组元素是通过数组名加上该元素在数组中 的位置(即数组元素的下标)来访问的。 表示形式: 数组名[下标] 如: a[3]
其中,下标可以是整型常量、整型变量或整 型表达式。 如: int a[10] ; float i=3 ; a[i]=10 ;
例:矩阵的转置。 a=
1 2 3 4 5 6
转换成 b=
1 4 2 5 3 6
main() { int a[2][3]={{1,2,3},{4,5,6}}; int b[3][2], i,j; printf(" array a:\n"); for(i=0;i<=1;i++) { for(j=0;j<=2;j++)
例7.2:用数组来处理求斐波纳契数列: 1,1,2,3,5,8…的前20个数。 数学表示:f(0)=f(1)=1, f(n)=f(n-2)+f(n-1)
main() { int f[20]={1,1}; for(i=2 ; i<20 ; i++) /*f[2]是数组第3个元素*/ f[i]=f[i-2]+f[i-1]; for(i=0 ; i<20 ; i++) { printf(“%10d”,f[i]); if(i%2==0) printf(“\n”); /*每行打印2个数*/ } }
第七章 数

• • •
掌握一维数组、二维数组的定义、
初始化和引用。
掌握字符串和字符数组的概念及其
处理函数。
掌握用数组进行编程的技术。
先看一个例子:
例:给出10个儿童的体重,要求计算平均体重 并打印出低于平均体重的数值。 用变量来解决问题: main() { int w1, w2, w3, w4, w5, w6, w7, w8, w9, w10; int t; scanf( "%d%d%d%d%d%d%d%d%d%d",&w1, &w2, &w3, w4, &w5 , &w6, &w7, &w8, &w9, &w10);
说明:
⑴ 数组名的命名规则同变量名的命名规则一样;
⑵数组名后用方括号[ ],不能用()
⑶常量表达式必须是大于0的整型常量表达式,不 能包含变量。即C语言不允许对数组的大小作动 态定义,即定义数组时,数组的长度必须是确 定的,其大小不依赖程序运行过程中变量的值。 例如: int a(10); int n; int a[n]
相关文档
最新文档