C语言数组详解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数组必须先定义,然后使用。 数组元素的表示形式为: 数组名[下标] C语言规定只能逐个引用数组元素而不能一次
引用整个数组。 a[0]=a[5]+a[7]-a[2*3] 可以是整型常量 或整型表达式
全部初始化 想让一个数组全 int a[10]={0,1,2,3,4,5,6,7,8,9}; 部元素为0? 部分初始化 想输出一个数 a[0]=0; a[1]=1; int a[10]={0,1,2,3}; 组呢? 使用输入函数scanf初始化 a[2]=2; a[3]=3; int a[10]; a[0]=0; a[1]=1;a[2]=2; a[3]=3; 使用表达式赋值
a[4]=4; a[5]=5; int a[10]={0,1,2,3}; for(int i=0;i<10;i++) a[4]=0; a[5]=0;a[6]=0; a[7]=0; a[6]=6; a[7]=7; a[4]=a[3]+2; a[8]=0; scanf("%d",&a[i]); a[9]=0; a[8]=8; a[9]=9;
#include <stdio.h> void main() { float grade[10]; /*定义一个实型数组存放10个成绩 */ float average; int i; for (i=0;i<10;i++) /*输入10个数据*/ scanf("%f",&grade[i]); for(i=1,average=0;i<10;i++) /*求平均值*/ average=average+grade[i]; 从上面两个例子的比较中,我们可以看到 average=average/10; 用数组解决这类问题:程序简洁、思路 for (i=0;i<10;i++) /*打印低于平均成绩的同学成就*/ 清楚明了。这就是数组带给我们的好处。 if (grade[i]<average) printf(“grade=[%d]=%f\n”,i+1,grade[i]); }
1.整理课堂笔记 ,试着完成思考题 2.完成习题六中有关一维数组的内容 3. 复习本次课的内容,预习课本
§7.2、 §7.3
教学内容 教学目标
二维数值型数组、字符型数组
二维数组的定义、引用、初始化、应用 应知 掌握字符型数组的定义、引用、初始化及字符串和字 符串结束标志(采用与整型数组对照的方法讲解) 掌握二维数组的引用方法 应会
一维数组的定义、初始化、引用、输入、输 出概念、操作必须掌握
数组中的所有元素,数据类型都一致 数组名字代表数组的首地址,是一个常量 数组元素具有和相同单个变量一样的属性,
凡允许使用单个变量的地方均可以使用数组元 素
采用数组编程时通常需要循环语句,此时要 注意循环三要素的确定
通过物理分析,考虑数组元素的下标,总结 普遍规律,然后转换为程序语句
中文名 数组 引用 元素 地址 排序 字符 字符串 下标
Leabharlann Baidu型
基本类型 浮点型 字符型 数组类型 数 据 类 型 构造类型
单精度型 双精度型
结构体类型 共用体类型 枚举型
指针类型 空类型
这些数据称为 数组元素 就是一组具有固定数目的、有序的、类型相同的 数据的集合。根据数组下标的多少,数组可以分为 一维数组和多维数组。
i(1~N-1) i(0~N-2) 5 9 8
a[0]a[1]
a[1]a[2]
a[N-2]a[N-1] a[4]a[5] a[N-3]a[N-2] a[3]a[4]
5 8 8 4 5 8 4 2
9 5 4
4 2 8 9 假设有N个 2 0 2 数呢? 0 8 9 0
0 9 9
内层循环(三要素) 5 1、循环变量j(0~N-i-1) 4 0 1 1 2、循环体(比较a[j]和a[j+1] 0 5 1 4 4 是否a[j]>a[j+1],满足就交 换) 5 0 5 5 3、循环增量:j++
a[N]={1,2,3,4,5,10,9,8,7,6}
{ int a[N]={10,9,8,7,6,5,4,3,2,1}; a[N]={1,2,3,4,5,6,7,8,9,10}
for(i=0;i<N-1;i++) for(j=0;j<N-i;j++) if(a[j]>a[j+1]) { for(i=0;i<N;i++) printf("\n"); }
教学 内容
数组的基本知识、数组的查找排序等知识 (重点讲解编程思路) 一维数组的常规操作、定义、引用、初始化 一维数组在实际问题解决中的应用 使用一维数组解决简单问题
教学目标
应知
应会 能够分析具体问题,从而用数组解决,掌握 冒泡排序的思路和实现 难点 数组的概念理解 冒泡法排序
英文词汇 array reference element address sort character string subscript
排序前的状态 第一次: i:0~N-2 第二次: 第三次: 第四次:
4 4 1 1 1 1
2 2 2 2 2
6 6 6 6 4 4
9 9 9 9
1 1 4 4 6 4
96 69
j:i+1~N-1
#include <stdio.h> #define N 5 void main() { int a[N],i=0,j,t,min ; printf("input array a:\n"); for(i=0;i<N;i++) { printf("第%d个数为:",i);scanf("%d",&a[i]); } for(i=0;i<N-1;i++) { min=i; for(j=i+1;j<N;j++) if(a[j]<a[min]) min=j; if(min!=j) { t=a[i]; a[i]=a[min];a[min]=t; } for(i=0;i<N;i++) printf("%4d",a[i]);
数组的查找
常用的查找方法有顺序查找和二分查找 需要考虑的是数组元素的平行移动问题
数组元素的插入和删除
数组的排序
将一个无序的数据序列按照某种顺序重载排 列。 冒泡排序、插入排序、选择排序、快速排序、 归并排序 Bubble Sort
第一次从所有n个元素中找出最小的元素,并 将其与序列中的第一个元素进行交换,此时第 一个元素作为新序列中的第一个元素,不再参 与后续排序。 第二次则从第二个元素开始的n-1个元素中找 出最小元素,将其与序列中的第二个元素进行 交换。 以此类推,直到第n次,待排序序列中只剩下 一个元素。
5 4
1
0
8
9
8 总比较次 8 9 数为 9
N * ( N 1) 2
for i=0 to N-2
for j=0 to N-i-1 T t=a[j] a[j]=a[j+1] a[j+1]=t Output a[0] to a[N-1] a[j]>a[j+1] F
#include <stdio.h> #define N 10 void main() int i,j,t;
算法的优化 t=a[j];a[j]=a[j+1];a[j+1]=t; } 问题
printf("%4d",a[i]);
教学内容 教学目标
二维数值型数组、字符型数组
二维数组的定义、引用、初始化、应用 应知 掌握字符型数组的定义、引用、初始化及字符串和字 符串结束标志(采用与整型数组对照的方法讲解) 掌握二维数组的引用方法 应会
教学内容 循环结构程序实训 教学目标 循环、循环嵌套的实际训练 循环结构中的常用算法——穷举 应知 法、递推法 有关对于整数的相关研究——素 数,最大公约数和最小公倍数
应会 分析实际问题,策划流程图, 将之转换为循环语句实现 辗转相除法
难点
例子:计算10个同学的成绩:计算平均成绩、输出低于平 均成绩的同学成绩。
有关字符串的常用程序、算法:统计字符串中各种字 符的个数,大、小写字母转换,字符串复制、连接等
二维数组的行列下标 字符串结束标志的使用
难点
第i次 1 2
比较元素次数 N-1 5 N-2 4 a[0]a[1]
比较内容 a[1]a[2] … …
基本思想:(从小到大排序)将相邻两个数比较, N-i 3 a[0]a[1] a[1]a[2] 3 i a[N-i-1]a[N-i] a[2]a[3] 1 N-1 5 将小的调到前面。 a[0]a[1] 8 9 外层循环变量
1 0
1 1 2 3 5
1 1
2 3 5 8 13
5
6 7
f 1 f 1
n 1 n2 n3
f n f n1 f n2
例7.2:用数组来处理求Fibonacci数列的前20个数。 f[20] f[0]=1,f[1]=1 i i<20 f[i]=f[i-2]+f[i-1] 输出f[0]到f[20]
有关字符串的常用程序、算法:统计字符串中各种字 符的个数,大、小写字母转换,字符串复制、连接等
二维数组的行列下标 字符串结束标志的使用
#include <stdio.h> void main() 数据类型相 { float grade1,grade2,grade3, …grade10; /*定义10个变 同的若干个 量*/ 数 float average; scanf(“%f”,&grade1); /*输入10个数据*/ scanf(“%f”,&grade2); … scanf(“%f”,&grade10); average=(grade1+grade2+…+grade10)/10; /*求平均值 */ /*打印低于平均成绩的同学成绩*/ if (grade1<average) printf(“%f\n”,grade1); if (grade2<average) printf(“%f\n”,grade2); … if (grade10<average) printf(“%f\n”,grade10); }
}
数组的起始下标、最后一个元素的下标 定义数组时不指定长度(动态数组) 对数值型数组进行整体操作 数组用方括号 用scanf语句时,数组元素前应加&
语句错误,不了解数组定义时与数组元素 使用时的区别:scanf(“%d”,a[10]); 在一个for语句中同时完成输入、输出数 据,但没有使用复合语句。
例如:一个班级有30个学生,可以用g1,g2,…,g30 车厢号10 … 代表学生的成绩,其中g是数组名,下标代表学生 车厢号2 的序号。由于在C语言中无法表示下标,所以就引 车名 入了[ ] 表示下标。 车厢号1 g[1]:第1个学生的成绩 g[i]:第i个学生的成绩等等
类型说明符 int 任一种基 本数据类 型或构造 数据类型。
对全部数组元素赋初值时,数组 长度可以省略
(斐伯那契级数):这是斐伯那契提出的有趣问题:一对新生小兔,一个月后 长成中兔,从第三个月开始长成大兔并每个月生一对小兔。按此规律,一年 后共有多少对兔子。
第n个月 1 大兔对数 中兔对数 小兔对数 兔子总对数
2
3 4
0 0
1 1 2 3 5
0 1
0 1 1 2 3
3. 方括号中常量表达式表示数组元素 的个数。如int a[5]: 数组a有5个元 素,其下标从0开始,分别为 a[0],a[1],a[2],a[3],a[4]。 如果出现数
组越界, 编译系统 4.允许在同一个类型说明中说明多个数 没有提示 组和多个变量。 的。
例如:
int a,b,c,d,k1[10],k2[20];
数组名[常量表达式] a[10] 用户自定义的数组 名字,其定名规则 与变量名定名规则 一样,都需遵循标 识符定名规则
[]——下标运 算符 单目运算符 优先级(1) 左结合 不能用( )
表示元素 的个数, 即数组长 度。
注意: 1.数组名不能与其它变量名相同 void main() {
int a;
float a[10]; ……
}
#define FD 5 {
2. 不能在方括号中用变量来表示元素的个 数,但可以是符号常数或常量表达式。
void main()
……
int a[3+2],b[7+FD]; int n; ……
}
scanf("%d",&n);/*表示维 数的只能是常量*/ int a[n];