C语言入门-数组
- 2019 年 10 月 3 日
- 筆記
今天十月一日,上午看阅兵激情澎湃,但是下午还是要继续写C语言,前面的这块很简单
int number[100]; scanf("%d" , &number[i]);
一、定义数组
- <类型> 变量名称[元素数量]
- 元素数量必须是整数
数组特点
- 所有的元素具有相同的数据类型
- 一旦创建,就不能改变大小
- (数组中的元素在内存中是连续以此排序的)
二、数组例子
写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,输入-1表示结束
通常用到数组都是下面的步骤:
#include <stdio.h> int main(void) { // 数组的大小 const int number = 10; int x; // 定义数组 int count[number]; int i; // 初始化数组 for (i = 0; i < number; i++) { count[i] = 0; } scanf("%d" , &x); while( x != -1){ if(x >= 0 && x <= 9){ // 数组参与运算 count[x] ++; } scanf("%d" , &x); } // 遍历数组输出 for (i = 0; i < number; i++) { printf("%d:%dn", i , count[i]); } return 0; }
三、数组运算
数组的集成初始化
int a[] = {2,4,6,7,1,3,5,9,11,13,23,14,32};
集成初始化时定位
int a[10] = {[0] = 2 , [2] = 3,6}; int i; for (i = 0; i < 10; ++i) { printf("%dt", a[i]); } // 2 0 3 6 0 0 0 0 0 0
- 用[n]在初始化数据中给出定位
- 没有定位的数据接在前面的位置后面
- 其他位置的值补零
- 也可以不给出数组大小,让编译器算
- 特别适合初始数据稀疏的数组
数组大小
- sizeof给出整个数组所占据的内容的大小,单位是字节
sizeof(a)/sizeof(a[0]);
- sizeof(a[0])给出数组中单个元素的大小,于是相除就得到了数组的单元个数
- 这样的代码,一旦修改数组中的初始的数据,不需要修改遍历的代码
数组的赋值
- 数组变量本身不能被赋值
- 要把一个数组的所有元素交给另一个数组,必须采用遍历
四、数组中查找元素
数组作为函数参数时,往往必须再用另一个参数来传入数组的大小
数组作为函数的参数时:
- 不能在[]中给出数组的大小
- 不能再利用sizeof来计算数组的元素个数
#include <stdio.h> int main(void) { int a[] = {2,4,6,7,1,3,5,9,11,13,23,14,32,}; int x; int loc; printf("请输入一个数字:n"); scanf("%d" , &x); loc = search(x, a, sizeof(a)/sizeof(a[0])); if (loc != -1) { printf("%d在第%d个位置上n", x , loc); }else{ printf("%d不存在n", x); } return 0; } int search(int key , int a[] , int length) { int ret = -1; int i; for (i = 0; i < length; i++) { if (a[i] == key) { ret = i; break; } } return ret; }
五、素数
判断是否能被已知的且<x的素数整除
#include <stdio.h> int main(void) { const int number = 10; int prime[10] = {2}; int count = 1; int i = 3; while(count < number){ if (isPrime(i,prime,count)) { prime[count++] = i; } // 进行调试 { printf("i=%d tcnt=%dt", i , count ); int i; for (i = 0; i < number; i++) { printf("%dt", prime[i]); } printf("n"); } i++; } for ( i = 0; i < number; i++) { printf("%d", prime[i]); if ( (i+1)%5) { printf("t"); }else{ printf("n"); } } return 0; } int isPrime(int x, int knownPrimes[], int numberofKnowPrimes) { int ret = 1; int i; for (i = 0; i <numberofKnowPrimes ; i++) { if ( x % knownPrimes[i] == 0) { ret = 0; break; } } return ret; }
六、二维数组
int a[3][5] // 通常可以理解为a是一个3行5列的矩阵
二维数组的遍历
for(i = 0; i<3; i++){ for(j = 0; j<5; j++){ a[i][j] = i * j; } } // a[i][j]是一个int,表示第i行第j列上的单元
二维数组的初始化
int a[][5] = { {0,1,2,3,4,}, {2,3,4,5,6,}, };
- 列数是必须给出的,行数可以有编译器来定
- 每行一个{},逗号分隔
- 最后的逗号可以存在
- 如果省略,表示补零