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\t",i);
    }
}
printf("\n");
	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];
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值