7.1-1 初试数组
• 如何写一个程序计算用户输入的数字的平均数?
int x;
double sum = 0;
int cnt = 0;
scanf("%d", &x);
while ( x!= -1 ){
sum += x;
cnt ++;
scanf("%d", &x);
}
if ( cnt >0 ) {
printf("%f\n", sum/cnt);
}
• 不需要记录输入的每一个数
• 如何写一个程序计算用户输入的数字的平均数,并输出所有大于平均数的数?
• 必须先记录每一个输入的数字,计算平均数之后,再检查记录下来的每一个数字,与平均数⽐比较,决定是否输出
如何记录很多数?
• int num1,num2,num3…..?
数组
• int number[100];
• scanf(“%d”, &number[i]);
7.1-2 数组的定义和使用
定义数组
• <类型> 变量名称[元素数量];
• int grades[100];
• double weight[20];
• 元素数量必须是整数
• C99之前:元素数量必须是编译时刻确定的字面量
数组
• 是一种容器(放东西的东西),特点是:
• 其中所有的元素具有相同的数据类型;
• 一旦创建,不能改变大小
• *(数组中的元素在内存中是连续依次排列的)
int a[10]
• ⼀一个int的数组
• 10个单元:a[0],a[1],…,a[9]
• 每个单元就是⼀一个int类型的变量
• 可以出现在赋值的左边或右边:
• a[2] = a[1]+6;
• *在赋值左边的叫做左值
数组的单元
• 数组的每个单元就是数组类型的一个变量
• 使用数组时放在[]中的数字叫做下标或索引,下标从0开始计数:
• grades[0]
• grades[99]
• average[5]
有效的下标范围
• 编译器和运行环境都不会检查数组下标是否越界,无论是对数组单元做读还是写
• 一旦程序运行,越界的数组访问可能造成问题,导致程序崩溃
• segmentation fault!
• 但是也可能运气好,没造成严重的后果
• 所以这是程序员的责任来保证程序只使用有效的下标值:[0,数组的大小-1]
int x;
double sum = 0;
int cnt = 0;
int number[100];
scanf("%d", &x);
while ( x!= -1 ) {
number[cnt] = x;
cnt ++;
scanf("%d", &x);
}
if ( cnt > 0 ) {
int i;
double average = sum / cnt;
for ( i=0; i<cnt; i++ ) {
if ( i=0; i<cnt; i++) {
printf("%d ", number[i]);
}
}
}
• 这个程序是危险的,因为输入的数据可能超过100个
计算平均数
int x;
double sum = 0;
int cnt;
printf("请输入数字的数量: ");
scanf("%d", &cnt);
if ( cnt>0 ) {
int number[cnt];
scanf("%d", &x);
while ( x!= -1) {
number[cnt] = x;
sum += x;
cnt ++;
scanf("%d", &x)
}
}
• 如果先让用户输入有多少数字要计算,可以用C99的新功能来实现
长度为0的数组?
• int a[0];
• 可以存在,但是无用
7.1-3 数组的例子:投票统计
• 写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,输入-1表示结束
思考题:
1、字符可以做下标吗?
数组的下标必须是整数,那么字符可以做下标吗?比如:
int a[255]; a['A'] = 1;
这样的代码可行吗?为什么?
2、*容器*
根据你对其他编程语言的认识,比如C++、Java、Python、PHP、JavaScript等,谈谈你对容器的认识:你觉得容器是什么?其他语言对容器的支持能做到什么程度?
一个容器包含了完整的运行时环境:除了应用程序本身之外,这个应用所需的全部依赖、类库、其他二进制文件、配置文件等,都统一被打入了一个称为容器镜像的包中。通过将应用程序本身,和其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。
3、*数组的单元在内存中是连续存放的*
数组单元在内存中是连续存放的,你能否设计一个程序来证明这一点?如果你写的程序对初学者是会起到错误的示范作用的(比如越界什么的),务请说明。