提示:本文仅是对个人学习经历的一个记录
前言:
作为一个小白,关于我的学习经历,我想在此做一个记录。
本文关于C语言数组部分知识。
PS:目前作者在学数组部分的内容,所以代码是基数组部分知识编写的。
1、数组
int a 类型、变量名(标识符)、值、内存地址
int a[ ] 数组中每个元素没有变量名,只有数组名
使用数组必须先定义。
1.1、数据类型
关于中括号的解释:
int a[10];
定义的时候表示数组中元素的总个数:10个,这10个数都是相同的数据类型(int 型)
下标法表示数组中的某个元素,从0开始计数
1.2、数组如何遍历
通过下标法访问数组中的每个元素,结合循环控制语句来遍历数组。数组中地址是连续的。
#include<stdio.h> int main() //终端输入 'cd..' 表示退回上层文件夹 { int a[10]; //这边的10表示大小,在内存中开辟10个空间 int i; /*stupid a[0] = 100; a[1] = 110; a[2] = 119; a[3] = 120; */ for(i=0;i<10;i++){ //给数组元素赋值 a[i] = i+100; } puts("数组初始化完毕!"); for(i=0;i<10;i++){ //遍历数组 //输出地址和数据 printf("address: %p ;data: %d \n",&a[i],a[i]); } puts("done!"); return 0; }
结果:
1.3、初始化数组
1.3.1、全部赋值
1.3.2、部分赋值
1.3.3、 初始化成0
1.3.4、补充
#include<stdio.h> int main() //终端输入 'cd..' 表示退回上层文件夹 { //int a[10] = {1,2,3,4,5,6,7,8,9,10}; //全部赋值 //int a[10] = {1,2,3,4,5}; //部分赋值 //int a[10] = {0}; //初始化成0 int a[] = {1,2,3,4}; //见怪不怪,数据个数确定时,\ 可以不指定数组长度 int i; int size; //sizeof是一个关键字,不是函数; //可以计算括号中对应数据的内存空间大小 size = sizeof(a)/sizeof(a[0]); //整个数组a的大小/a[0](其中一\ 个元素的大小)=数组的位数 printf("数组a的位数有 %d 位\n",size); for(i=0;i<size;i++){ //输出地址和数据 printf("address: %p | data: %d \n",&a[i],a[i]); } return 0; }
结果:
2、案例实操
2.1、数组初始化及逆序输出
题1、对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。
#include <stdio.h> int main() { int i; int arr[10]; for(i=0;i<10;i++){ //初始化 arr[i] = i; } puts("当前数组是:"); for(i=0;i<10;i++){ printf("%d ",arr[i]); } putchar('\n'); //回车 puts("逆序输出是:"); for(i=9;i>=0;i--){ printf("%d ",arr[i]); } return 0; }
结果:
2.2、斐波那契数列
#include <stdio.h> int main() { int i; int array[25]; int arraysize; array[0] = 0; array[1] = 1; arraysize = sizeof(array)/sizeof(array[0]); for(i=2;i<arraysize;i++){ array[i] = array[i-1]+array[i-2]; } puts("斐波那契数列:"); for(i=0;i<arraysize;i++){ printf("%d ",array[i]); } puts("\ndone"); return 0; }
结果:
2.3、冒泡排序法
冒泡排序是交换排序中一种简单的排序方法。
基本思想:对所有相邻的元素进行比较,最终对所有元素进行正序或者逆序排列。
#include <stdio.h> int main() { int i; int j; int tmp; int array[] = {451,65,48,1,3,75}; int arraylen = sizeof(array)/sizeof(array[0]); puts("原始数据:"); for(i=0;i<arraylen;i++){ printf("%d ",array[i]); } putchar('\n'); //冒泡排序 for(i=0;i<arraylen-1;i++){ for(j=0;j<arraylen-1-i;j++){ if( array[j]<array[j+1]){ tmp = array[j]; array[j] = array[j+1]; array[j+1] = tmp; } } } puts("冒泡排序法输出(从大到小):"); for(i=0;i<arraylen;i++){ printf("%d ",array[i]); } puts("\ndone"); return 0; }
结果:
2.4、简单选择排序法
简单选择排序是一种直观的排序算法,在未排序的序列中,选出最大的元素和序列的首位元素交换,接下来在剩下的未排序序列中再选出最大元素与序列的第二位元素交换,依次类推,最后形成从大到小的已排序序列。
#include <stdio.h> int main() { int i; int j; int tmp; int array[] = {451,65,48,1,3,75}; int arraylen = sizeof(array)/sizeof(array[0]); //简单选择排序 for(i=0;i<arraylen-1;i++){ for(j=i+1;j<arraylen;j++){ if( array[i]<array[j]){ tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } } puts("简单选择排序法输出(从大到小):"); for(i=0;i<arraylen;i++){ printf("%d ",array[i]); } puts("\ndone"); return 0; }
结果:
3、二维数组
3.1、什么时候用二维数组
3.2、怎么定义一个二维数组
3.3、二维数组的初始化
3.3.1、 按行列初始化
3.3.2、没明确行列,类似一维数组
3.3.3、部分赋初值
1、
2、
3、也可以只对某几行元素赋初值int a[3][4]={{1},{5,6}};
4、赋值时可以不写行,但是一定要写列
3.4、二维数组的遍历
#include <stdio.h> int main() //二维数组的遍历 { int arr[2] = {1,2}; int arry[2][3] = {{222,333,444},{555,666,777}}; int arry2[2][3] = {0}; int arry3[][3] = {0,1,2,3}; //一维长度可以省略,二维不行 int i,j; for(i=0;i<2;i++){ for(j=0;j<3;j++){ //printf("(%d,%d) | %d\n",i,j,arry[i][j]); printf("%d |add: %p \n",arry3[i][j],&arry3[i][j]); } putchar('\n'); } printf("%d \n",arry[1][1]); return 0; }
结果:
3.5、案例分析
题1、有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
#include <stdio.h> int main() //求矩阵中最大值,并输出行列 { int i; int j; int h,l; int arry[3][4] = {{12,15,56,462}, {481,6,16,1}, {21,45,45,45}}; int max; max = arry[0][0]; for(i=0;i<3;i++){ //遍历输出列表 for(j=0;j<4;j++){ printf("%d\t",arry[i][j]); //'\t'制表符 } putchar('\n'); } for(i=0;i<3;i++){ //寻找最大值 for(j=0;j<4;j++){ if( max<arry[i][j]){ max = arry[i][j]; h = i+1; l = j+1; } } } printf("max: %d |行号: %d |列号: %d\n",max,h,l); return 0; }
结果:
总结:
以上就是今天要讲的内容,本文仅仅简单介绍了C语言数组部分知识。
如有错漏,望批评指正。让我们共同进步吧!!