数组
引入
int number[100];
scanf(“%d”,&number[i]);
算出平均数,并把大于平均数的数输出来。因为要比较每个数与平均数的大小,而不能一一定义这些数,所以用到了数组:
int main()
{
int x;
double sum=0;
int cnt=0;
int number[100];//定义数组
scanf("%d",&x);
while(x!=-1){
number[cnt]=x;/*数组中的元素赋值把x放到number这个数组的cnt的位置上。*/
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个。
放入一段调试的代码:
//
{
int i;
printf("%d\t",cnt);
for(i=0;i<=cnt;i++){
printf("%d\t",number[i]);
}
printf("\n");
}
//
就可以看到变化,把第一个数放在0的位置上,依次类推。
定义数组
数组的单元
从0开始的数。
有效的下标范围
有时候数组越界会出错,有时候不会。一定要在:[0,数组的大小-1]。
数组的例子——统计个数
写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,
输入-1表示结束。
用count[x]来计算x出现的次数。
初始化数组需要遍历数组,所以需要写循环。
只要ASCII的值不越界,就可以做数组的下标。
讨论:
以下代码是大神纯爱枫若情的,用来说明“数组的单元在内存中是连续存放的”。
链接在这里
回答在第三页
#include <stdio.h>
int main(){
const int NUM=10;
int number[NUM];
int i;
for(i=0;i<NUM;i++){
printf("第%d个的内存索引:\t%d\n",i+1,&number[i]);
}
return 0;
}
运行结果:
数组运算
数组的集成初始化
直接用大括号给出数组的所有元素的初始值;
不需要给出数组的大小,编译器替你数数。
int a[]={2,4,6,7,1,3,5,9,11,13,23,14,32};
会输出:
2 4 6 7 1 3 5 9 11 13 23 14 32
如果是:
int a[13]={2};
则会输出:
2 0 0 0 0 0 0 0 0 0 0 0 0
不用上一节的遍历来初始化,可以直接:
int count[number]={0};
就可以达到遍历初始化的效果。
集成初始化时的定位
但是如果这里没给数组大小,因为涉及到的最大的是5,所以数组大小默认为6。
int a[]={[1]=2,4,[5]=6}
输出结果就是:
0 2 4 0 0 6
数组的大小
sizeof给出整个数组所占据的内容的大小,单位是字节。
数组的赋值
遍历数组
最后一个错误是指,离开循环的时候正好用数组无效的下标。
例子:
这里就是lenth传入数组大小数组作为函数参数时,往往必须再用另一个参数来传入数组的大小,原因是:
数组作为参数时:
不能在[]中给出数组的大小;
不能再利用sizeof来计算数组的元素个数!
不然函数无法做计算。
数组例子——素数
windows:搜索函数。
linux: man sqrt
素数例子
是把i也就是3放在了cnt也就是1的位置上,然后把cnt++,只想2的位置上。
输出素数表:
构造素数表
原理:
伪代码(从算法推进没有到代码但是接近代码):
prime数组里初始化所有都为1,判断是不是素数。
把素数的倍数都标记为非素数。
代码:
算法不一定和人的思考方式相同。
二维数组
二维或更多的数组。
第一个下标是行,第二个是列,同线性代数。
在C语言看来a[i,j]里的逗号是运算符,所以这个表达式相当于a[j]。
二维数组的初始化
列数不可以省略,行数可以省略。
二维数组的例子
1. 读入矩阵
2. 检查行
3. 检查列
4. 检查对角线
左边是正对角线,右边是反对角线。
讨论
老师问:能不能把检查行和检查列的代码合并?
放上赞的最多的眼泪的花火大神的代码:
代码在链接的第三页。
for(i=0;i<size && result==-1;i++)
{
numofO=numofX=0;
for(j=0;j<size;j++)
{
//检查行
if(board[i][j]==1)
numrowofX++;
else
numrowofO++;
//检查列
if(board[j][i]==1)
numcolofX++;
else
numcolofO++;
}
if(numrowofO==size || numcolofO==size)
result=0;
else ifnumrowofX==size || numcolofX==size)
result=1;
}
很简练。