初始数组
回顾:计算平均数
#include<stdio.h>
int main()
{
int number;
int sum = 0;
int count = 0;
scanf("%d", &number);
while ( number != -1) {
sum += number;
count ++;
scanf("%d", &number);
}
printf("%f\n", 1.0*sum/count);
return 0;
}
改变:计算平均数,并输出所有大于平均数的数
>> 需要记录每次输入的数
如何记录很多个数
数组
int number[100];
scanf("%d", &number[i]);
修改:
#include<stdio.h>
int main()
{
int x;
int number[100];
//定义了一个叫number的新变量(数组),数组内每个单元都是一个int,数组大小是100(可以放100个int)
double sum = 0;
int cnt = 0;
scanf("%d", &x);
while ( x != -1) {
number[cnt] = x; //每读到一个x,会赋给number数组当中的某个单元
sum += x;
cnt ++;
scanf("%d", &x);
}
if(cnt>0) {
printf("%f\n", 1.0*sum/cnt);
int i;
//遍历整个数组,找出当中大于平均数的数
for (i=0; i<cnt; i++){
if(number[i]>sum/cnt){
printf("%d\n", number[i]);
}
}
}
return 0;
}
看看是怎么运行的
小结
这个数组存在安全隐患:
没有判断cnt是否会超过number可以使用的最大下标
定义数组
定义数组
<类型>变量名称[元素数量];
*类型是数组变量的名称
元素必须是整数
数组
是一种容器,特点是:
- 其中所有的元素具有相同的数据类型
- 一旦创建,不能改变大小
- 数组中的元素在内存中是连续依次排列的
eg. int a[0]
- 一个int数组
- 10个单元:a[0],a[1],a[2],…,a[9]
- 每个单元就是一个int类型的变量
- 可以出现在赋值的左边或右边:a[2]=a[1]+6;(在赋值左边的叫做左值)
数组的单元
数组的每个单元就是数组类型的一个变量
使用数组时放在[]中的数字叫做下标或索引,下标从0开始计数
有效的下标范围
编译器和运行环境都不会检查数组下标是否越界,无论是对数组单元做读还是写
一旦程序运行,越界的数组访问可能造成问题,导致程序崩溃(segmentation fault)
有效下标值:[0,数组的大小-1]
解决方案
①在读数过程中,做个技术,当越界后,就不能再读数了
②利用C99的特性:如果先让用户输入有多少数字要计算,可以用C99的新功能
例题:统计个数
输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,输入-1表示结束
#include <stdio.h>
int main()
{
int x;
int count[10];
int i;
for( i=0; i<10; i++){
count[i] = 0;
}
scanf("%d", &x);
while (x != -1){
if( x>=0 && x<=9){
count[x] ++;
}
scanf("%d", &x);
}
for ( i=0; i<10; i++){
printf("%d:%d\n", i, count[i]);
}
return 0;
}
#include <stdio.h>
int main()
{
const int number=10; //数组的大小
int x;
int count[number]; //定义数组
int i;
for( i=0; i<number; i++){ //初始化数组
count[i] = 0;
}
scanf("%d", &x);
while (x != -1){
if( x>=0 && x<=9){
count[x] ++; //数组参与运算
}
scanf("%d", &x);
}
for ( i=0; i<number; i++){ //遍历数组输出
printf("%d:%d\n", i, count[i]);
}
return 0;
}