C语言学习-翁凯(第八章笔记)
第八章
8.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]);
int x;
double sum=0;
int cnt=0;
int number[100];
scanf("%d",&x);
while(x!=-1){
number[cnt]=x;
/*
int i;
for(i=0;i<=cnt;i++){
printf("%d ",number[i]);
}
printf("\n");
*/
sum+=x;
cnt++;
scanf("%d",&x);
}
if(cnt>0){
printf("%f\n",sum/cnt);
int i;
for(i=0;i<cnt;i++){
if(number[i]>sum/cnt){
printf("%d\n",number[i]);
}
}
}
return 0;
(这个程序存在安全隐患,是什么?)
(数组定义为100,但是未讨论cnt是否大于100)
8.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;
/*
int i;
for(i=0;i<=cnt;i++){
printf("%d ",number[i]);
}
printf("\n");
*/
sum+=x;
cnt++;
scanf("%d",&x);
}
if(cnt>0){
printf("%f\n",sum/cnt);
int i;
for(i=0;i<cnt;i++){
if(number[i]>sum/cnt){