C语言入门(七)
1、初识数组
(1)、计算平均数,并输出所有大于平均数的数。
- #include<stdio.h>
- int main()
- {
- int x;
- double sum;
- int cnt=0;
- int number[100];
- scanf("%%d",&x);
- while (x!=-1){
- number[cnt]=x;
- sum+=x;
- cnt++;
- scanf("%%d",&x);
- }
- if(cnt>0){
- int i;
- double average=sum/cnt;
- for(i=0;i<cnt;i++){
- if(number[i]>average){
- printf("%%d",number[i]);
- }
- }
- }
- return 0;
(2)、定义:
定义数组:int number[100];
对数组中的元素赋值:number[cnt]=x;
使用数组中的元素:number[i]>average;
遍历数组:printf("%%d",number[i]);
(3)、上述程序存在安全隐患,是什么?
定义的数组大小是100,而在程序中没有判断cnt会不会超过100。
2、数组的使用
(1)、定义数组:
A、<类型>变量名称[元素数量];
int grades[100];
double weight[20];
B、元素数量必须是整数;
C、C99之前:元素数量必须是编译时刻确定的字面量;
(2)、数组是一种容器,特点是:
其中所有的元素具有相同的类型;
一旦创建不能改变大小;
数组中的元素在内存中是连续依次排列的。
例:int a[10];
这是一个int类型的数组;
有十个单元:a[0],a[1],a[2],...,a[9];
每一个单元就是一个int类型的变量;
可以出现在赋值的左边或者右边,a[2]=a[1]+6,这句话的意思是把第一个单元的值读出来加6再赋值给第二个单元的值;
在赋值左边的叫做左值,在右边的叫做右值;
(3)、数组的单元
使用数组的时候放在[]中的数字叫做下标或者索引,下标从0开始计数,范围是[0,下标-1]。数组越界:输出的数量>=n,可能跟会报错 segmentation fault。
3、数组的例子
统计个数:写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,输入-1表示结束。
2、数组运算
(1)、集成初始化
int a[个数] = {按顺序对应初始化的值,用逗号隔开,如果这些数字不够前面的个数,则剩下的初始化为 0};
int count [number] = {0}; 这样可以快速地初始化每一个值为0。
可以通过定位来初始化对应的值:
int a[10] = { [0]=2,[2]=3,6,}; 对应 2 0 3 6 0 0 0 0 0 0。
int a[] = {[0]=2,[2]=3,6,[5]=4}; 对应 2 0 3 6 0 4。
(2)、数组的大小
sizeof给出整个数组所占据的内容的大小,单位是字节:sizeof(a)/sizeof(a[0]);
除数是数组中单个元素的大小,被除数是数组的大小。
(3)、数组的赋值
int a[] = {2,4,6,7}; int b[] = a;
不能拿一个数组变量赋给另一个数组变量。
要把一个数组的所有元素交给另一个数组,必须采用遍历:
- for ( i=0; i<length; i++ ){
- b[i] = a[i];
- }
(4)、遍历数组:通常使用for循环,让循环变量i从0到<数组的长度,这样循环体内最大的i正好是数组最大的有效下标。
常见错误:循环结束条件是<=数组长度,或;
离开循环后,继续使用i的值来做数组元素的下标。
(5)、数组作为函数参数时,往往必须再用另一个参数来传入数组的大小;
数组作为函数的参数时:
不能在[]中给出数组的大小;
不能再利用sizeof来计算数组的元素个数!
(6)、数组例子:素数
A、构造素数表
想法:
a、令x为2;
b、将2x、3x、4x直至ax<n的数标记为非素数;
c、令x为下一个没有被标记为非素数的数,重复2;直到所有的数都已经尝试完毕。
伪代码:
a、开辟prime[n],初始化其所有元素为1,prime[x]为1表示x是素数;
b、令x=2;
c、如果x是素数,则对于(i=2;x*i<n;i++)令prime[i*x] = 0;
d、令x++,如果x<n,重复3,否则结束。
- #include <stdio.h>
- int main()
- {
- const int maxNumber = 25;
- int isPrime[maxNumber];
- int i;
- int x;
- for ( i=0;i<maxNumber;i++){
- isPrime[i]=1;
- }
-
- for(x=2;x<maxNumber;x++){
-
- if(isPrime[x]){
- for (i=2;i*x<maxNumber;i++){
- isPrime[i*x]=0;
- }
- }
- }
- for(i=2;i<maxNumber;i++){
- if ( isPrime[i]){
- printf("%%d ",i);
- }
- }
- printf("
");
- return 0;
- }
3、二维数组
(1)、定义:int a[3][5]; 通常理解为a是一个3行5列的矩阵。
a[0][0] | a[0][1] | a[0][2] | a[0][3] | a[0][4] |
a[1][0] | a[1][1] | a[1][2] | a[1][3] | a[1][4] |
a[2][0] | a[2][1] | a[2][2] | a[2][3] | a[2][4] |
(2)、遍历:前文是一维数组需要一重循环,这里则需要两重循环。
- for ( i=0; i<3; i++ ) {
- for ( j=0; j<5; j++) {
- a[i][j] = i*j;
- }
- }
a[i][j]是一个int,表示第i行、第j列上的单元;
a[i,j]是a[j],逗号的运算。
(3)、初始化
- int a[][5] = {
- {0,1,2,3,4},
- {2,3,4,5,6},
- };
列数必须给出,行数可以有编译器来数;
每行一个{},逗号分隔;
如果省略,表示补零,也可以定位;
(3)、读入矩阵
- for ( i=0; i<size; i++ ) {
- for ( j=0; j<size; j++ ) {
- scanf("%%d",&a[i][j];
- }
- }