- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
输入理想的程序,输出快乐的人生
二维数组的初始化
按行赋初值: 例如: int a[2][3]={{1, 2, 3}, {4, 5, 6}};
123 456
int a[2][3]={{1}, {4, 5}}; 按数组元素存放顺序赋初值:
例如:
100 450
int a[2][3]={1, 2, 3, 4, 5, 6};
Rate 1.5 3.2 0.09 45.3987
0
1 下标
2
下标标明了元素在数
3
组中的位置 ,从0开始
输入理想的程序,输出快乐的人生
数组类型
输入理想的程序,输出快乐的人生
本章主要内容
输入理想的程序,输出快乐的人生
定义一维数组
数组和变量一样,必须先定义后使用; 数组大小定义好后,将不能改变;
datatype arrayName[size];
数据类型 数组名[行大小][列大小];
输入理想的程序,输出快乐的人生
二维数组的存储结构—思考该如何存?
二维数组元素在内存中的存放顺序: 先按行存放,再按列存放,即
➢ 先顺序存放第0行的元素 ➢ 再存放第1行的元素,…
int a[2][3];
a[0][0] a[0][1] a[0][2] a[0]
a[1] a[1][0] a[1][1] a[1][2]
类型说明符 int、char、float …
数组名 常量表达式: 数组大小
int num[50]; char list_of_initials[20]; double pressure_level[6];
#define LIMIT 20 ... int emp_codes[LIMIT];
数组大小最好用宏来定义,以适应未来可能的变化
应数组元素的下标
int a[10],i;
动态赋值方法:
输出方法:
输入第3个数组元素: scanf("%d",&a[2]);
输入整个数组元素:
for (i=0;i<10;i++) scanf("%d", &a[i] );
输出第1个数组元素: printf("%d", a[0]);
输出整个数组元素:
for (i=0;i<10;i++) printf("%d", a[i] );
int num[4][2];
4X2=8
错误的定义: int a[3,4], b(3,4); int c[ ][ ], d(3)(4);
为了便于理解,二维数组 一般理解为几行几列的矩阵
num[0][0] num[1][0] num[2][0] num[3][0]
num[0][1] num[1][1] num[2][1] num[3][1]
int a[3][4],i,j;
输入方法:
输入第i行第j列元素的值: scanf(“%d”, &a[i][ j]); 输入整个数组元素:
for (i=0; i<3; i++) for( j=0; j<4; j++) scanf(“%d”, &a[i][ j]);
输出方法:
输出第i行第j列元素的值: printf(“%d“, a[i][ j]); 输出整个数组元素:
【例2】用数组来求Fibonacci数列前20项
Fibonacci数列:
1,1,2,3,5,8, 13,21,34…
1
(n=1)
Fn = 1
(n=2)
Fn-2+Fn-1 (n≥3)
#include <stdio.h> #define N 20 int main() {
int i,f[N]={1,1}; for(i=2;i<N;i++)
为了方便的使用这些数据,C语言提供了一种构造数 据类型:数组。 一定要理解并用好数组!
输入理想的程序,输出快乐的人生
本章主要内容
输入理想的程序,输出快乐的人生
C 语言中的数组
• 数组是具有相同类型的数据的顺序集合 • 数组可以在内存中连续存储多个元素
Rate[0] Rate[1] 数组元素 Rate[2] Rate[3]
sum = sum + data[i] ; } printf( "Sum = %d\n", sum ); for( i=N-1; i>=0; i-- )
printf( " %d", data[i] ) ; printf("\n"); return 0; }
输入理想的程序,输出快乐的人生
一维数组示例
输入理想的程序,输出快乐的人生
定义一维数组
• C89:定义数组时不能使用变量定义数组的大小 ,即使在此之前变量已经赋值,只能使用整形 常量定义数组的大小
• C99:允许用变量定义数组的大小
int array(10); int n=5; float score[n]; int n; scanf("%d", &n); int data[n]; char str[ ]; float char[10];
•下列二维数组的定义都是错误的:
int a[][], b[3][], c[][2]; int arr[2][] = {{1,2,3}, {4,5,6}}; int b[2][3]={1, 2, 3, 4, 5, 6, 7, 8};
输入理想的程序,输出快乐的人生
二维数组值的输入和输出
一般二维数组的处理用二重循环来实现,用循环变量 的值控制数组元素的下标
一维数组的初始化
• 初始化:在定义数组时给数组元素赋初值
– 形式:数据类型 数组名称[数组长度]={数值列表}
• 在定义数组时,对全部数组元素赋初值:
– 例如:int a[5]={0,1,2,3,4};
• 此时也可省略数组长度
– 例如:int a[ ]={0,1,2,3,4}; //只写int a[];是错误的
int main()
不需要也不可能保留变量的历史值
{ int i;
float num, sum=0;
printf("input 10 numbers: \n");
for (i=1; i<=10; i++)
{ scanf("%f",&num);
sum +=num;
}
printf("average =%.2f \n", sum/10.);
输入理想的程序,输出快乐的人生
下标越界是大忌!
• int a[10]; scanf("%d",&a[10]); /*下标越界*/ – 编译程序不检查是否越界 – 下标越界,将访问数组以外的空间,可能带来严重后果
#include <stdio.h> int main() {
int a = 1, c = 2, b[5] = {0}, i; printf("%p, %p, %p\n", b, &c, &a); for (i=0; i<=8; i++)
return 0;
}
输入理想的程序,输出快乐人生
问题的提出
• 一个人n门课的成绩怎样存储和处理? • 一个班n门课的成绩怎样存储和处理? • 如何从键盘输入100个数然后按相反顺序输出? • 输入10个数,将高于平均值的数输出? • ......
这些数据的特点: 1.具有相同的数据类型 2.使用过程中需要保留原始数据
score
85
0
数组元素 数组名(首地址)
93 77 88 score[ 4 ]
1
下标
2
3
下标标明了元素在 数组中的位置 ,从0
开始
数组大小
输入理想的程序,输出快乐的人生
本章主要内容
输入理想的程序,输出快乐的人生
二维数组的定义—思考为何需要二维数组?
数据类型 数组名[常量表达式1] [常量表达式2];
b[0
0
]b[1
1
]
b[2
2
]b[3
3
]b[4
4
]
c
5
{
a
6
b[i] = i;
printf("%d ", b[i]);
i
79
}
b[8
8
]
printf("\nc=%d, a=%d, i=%d\n", c, a, i);
return 0;
}
输入理想的程序,输出快乐的人生
40
44
48
4c
50
54 运行程序或单 58 步执行观察变 5c 量变化情况可 60 以看到,变量 64 c和a的值因数 68 组越界而被悄 6c 悄破坏了
123
int a[2][3]={1, 2, 3};
000
省略行数(根据初值个数和列声明自动确定行数)
例如:
4行
int b[][3]={1, 2, 3, 4, 5, 6, 7, 8, 9,10};
int c[][3]={{1, 2}, {3}};
120 30 0
输入理想的程序,输出快乐的人生
二维数组的初始化
输入理想的程序,输出快乐的人生
一维数组在内存的存放
int score[5];
数组下标从0开始 数组元素在内存中按顺 序连续存放
数组名代表数组的首地 址,即score的值与 score[0]的地址值相同