07 C语言数组
1、初试数组
#include<stdio.h>
int main(int argc,char const *argv[]){
double sum;
int a[100];
int i = 0;
int cnt = 0;
scanf("%d",&i);
while(i != -1){
sum += i;
a[cnt++] = i;
scanf("%d",&i);
}
if(cnt > 0){
double average = sum / cnt;
printf("average is %lf\n",average);
for(i = 0;i < cnt;i++){
if(a[i] > average){
printf("%d\n",a[i]);
}
}
}
return 0;
}
2、数组的定义和使用
数组是一种容器,特点为:
1、所有元素的数据类型都相等
2、一旦创建不可以改变大小
3、下标从0开始
4、越界访问会有很大问题
3、数组例子-统计个数
#include<stdio.h>
int main(int argc,char const *argv[]){
const int number = 10;
int i,j;
int a[number];
scanf("%d",&i);
for(j = 0;j < number;j++){
a[j] = 0;
}
while(i!=-1){
if(a[i] >= 0 && a[i] <= 9){
a[i]++;
}
scanf("%d",&i);
}
for(j = 0;j < number;j++){
if(a[j] > 0){
printf("%d有%d个\n",j,a[j]);
}
}
return 0;
}
思路:
1、定义数组大小
2、初始化数组
3、数组参与运算
4、遍历输出数组
4、数组运算
数组的初始化
1、直接用大括号,[]里面的值不用填写。
2、如果给定了数组大小,后面大括号没有足够的值,则自动填充0;a[100] = {0}可以自动完成初始化。
3、sizeof(a)/sizeof(a[0])获得数组的大小。
4、数组本身不可以赋值,将数组复制只能遍历逐个复制。
5、遍历数组:从0开始,<数组长度,并且遍历完后i是越界下标不可以再使用。
6、数组作为参数传值的时候,必须传递长度,sizeof无法在另一个函数里使用。
5、数组例子:质数
优化思路:
1、减少对比次数 -> sqar(i),排除偶数
2、构造质数表
#include<stdio.h>
#include<math.h>
int isPrime(int x);
int main(int argc,char const *argv[]){
int maxNumber,i = 0,j = 0;
scanf("%d",&maxNumber);
// maxNumber = 25;
int prime[maxNumber];
for(i = 0;i < maxNumber;i++){
prime[i] = 1;
}
for(i = 2;i < maxNumber;i++){
if(isPrime(i)){
for(j = 2;(j * i) < maxNumber;j++){
prime[j * i] = 0;
}
}
}
for(i = 2;i < maxNumber;i++){
if(prime[i] == 1){
printf("%d\n",i);
}
}
return 0;
}
int isPrime(int x){
int i,ret = 1;
if(x == 1){
ret = 0;
}else{
for(i = 2;i < sqrt(x);i++){
if(x % i == 0){
ret = 0;
break;
}
}
}
return ret;
}
思路,构建一个数组,然后数组下标对应的值就是下标是否就是质数。
如果下标是质数,则将质数所有的倍数都标记为否。
6、二维数组
列数必须给定,行数可以让编译器来数。