WHCSRL 技术网

C语言入门(七)

1、初识数组
(1)、计算平均数,并输出所有大于平均数的数。

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int x;
  5. double sum;
  6. int cnt=0;
  7. int number[100];
  8. scanf("%%d",&x);
  9. while (x!=-1){
  10. number[cnt]=x;
  11. sum+=x;
  12. cnt++;
  13. scanf("%%d",&x);
  14. }
  15. if(cnt>0){
  16. int i;
  17. double average=sum/cnt;
  18. for(i=0;i<cnt;i++){
  19. if(number[i]>average){
  20. printf("%%d",number[i]);
  21. }
  22. }
  23. }
  24. 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;

不能拿一个数组变量赋给另一个数组变量。

要把一个数组的所有元素交给另一个数组,必须采用遍历:

  1. for ( i=0; i<length; i++ ){
  2. b[i] = a[i];
  3. }

(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,否则结束。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. const int maxNumber = 25;
  5. int isPrime[maxNumber];
  6. int i;
  7. int x;
  8. for ( i=0;i<maxNumber;i++){
  9. isPrime[i]=1;
  10. }
  11. for(x=2;x<maxNumber;x++){
  12. if(isPrime[x]){
  13. for (i=2;i*x<maxNumber;i++){
  14. isPrime[i*x]=0;
  15. }
  16. }
  17. }
  18. for(i=2;i<maxNumber;i++){
  19. if ( isPrime[i]){
  20. printf("%%d ",i);
  21. }
  22. }
  23. printf(" ");
  24. return 0;
  25. }

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)、遍历:前文是一维数组需要一重循环,这里则需要两重循环。

  1. for ( i=0; i<3; i++ ) {
  2. for ( j=0; j<5; j++) {
  3. a[i][j] = i*j;
  4. }
  5. }

a[i][j]是一个int,表示第i行、第j列上的单元;

a[i,j]是a[j],逗号的运算。

(3)、初始化

  1. int a[][5] = {
  2. {0,1,2,3,4},
  3. {2,3,4,5,6},
  4. };

列数必须给出,行数可以有编译器来数;

每行一个{},逗号分隔;

如果省略,表示补零,也可以定位;

(3)、读入矩阵

  1. for ( i=0; i<size; i++ ) {
  2. for ( j=0; j<size; j++ ) {
  3. scanf("%%d",&a[i][j];
  4. }
  5. }