第一课一维数组的定义
一维数组的定义方式
在C语言中使用数组必须先进行定义。
一维数组的定义方式为:
类型说明符 数组名 [常量表达式];
其中,类型说明符是任一种基本数据类型或构造数据类型,数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。
例如:int a[10]; /* 说明整型数组a,有10个元素 /float b[10], c[20]; / 说明实型数组b,有10个元素,实型数组c,有20个元素
/char ch[20]; / 说明字符数组ch,有20个元素 */对于数组类型说明应注意以下几点:
- 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
- 数组名的书写规则应符合标识符的书写规定。
- 数组名不能与其它变量名相同。例如:int a;float a[10];是错误的。
- 方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0], a[1], a[2], a[3], a[4]。
- 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如:#define FD 5// …int a[3+2],b[7+FD];是合法的。但是下述说明方式是错误的。int n=5;int a[n];
- 允许在同一个类型说明中,说明多个数组和多个变量。
例如:int a,b,c,d,k1[10],k2[20];
第二课一维数组的输入与输出
对数组的操作只能逐个引用单个元素,所以一维数组的输入输出等操作都是采用循环语句结合下标变化逐个元素进行 - 对批量数组一次性输入到一维数组中
法一:键盘读入
法二:直接赋值
2)C语言里提供两个函数给数组整体赋值
(1)memset函数
memset函数是给数组按字节进行赋值,一般用在char型与数组中,如果是int类型的数组,一般赋值为零和负一,使用前需要包含头文件#include
(2)fill函数
fill 函数是给数组按元素进行赋值,可以是整个数组,也可以是部分连续元素可以付任何值,使用前需要包含头文件#include
例题:fill(a,a+10,5)就是将a数组的前十个元素赋值为5
第三课一维数组的插入删除
编写一个程序在一维数组指定位置k处插入和删除一个数a。(k和a交互输入,数组大小和类型自定)
例如已知inta[10]={1,2,3,4,6,7,8,9,10},
b[10]={1,2,3,4,5,5,6,7,8,9},
k=4,在数组a中插入… 编写一个程序在一维数组指定位置k处插入和删除一个数a。(k和a交互输入,数组大小和类型自定)
例如已知 int a[10]={1,2,3,4,6,7,8,9,10},b[10]={1,2,3,4,5,5,6,7,8,9},k=4,在数组a中插入一个5,在数组b中删除一个5,然后输出操作后的a和b数组.
#include<stdio.h>
#define N 10
#define M 10void main() {
int a[N],b[N],i,j,k,x,na,nb;
na=N;
nb=M;
for ( i=0;i<N;i++ ) scanf("%d",&a[i]);
for ( i=0;i<N-1;i++ )
for ( j=i+1;j<N;j++ ) if ( a[i]>a[j] ) { k=a[i];a[i]=a[j];a[j]=k; }
for ( i=0;i<M;i++ ) scanf("%d",&b[i]);
for ( i=0;i<M-1;i++ )
for ( j=i+1;j<M;j++ )
if ( b[i]>b[j] ) { k=b[i];b[i]=b[j];b[j]=k; } scanf("%d%d",&k,&x);
for ( i=na;i>k ) a[i]=a[i-1]; //a数组k位置数据逐一后移一个元素 a[k]=x; na++;
for ( i=0,k=-1;i<nb;i++ ) if ( b[i]==x ) { k=i; break; } //查找b数组中的x if ( k>=0 ) { //找到
for ( i=k;i<nb;i++ ) a[i]=a[i+1]; //k位置元素逐一前移一个元素 nb–; }
for ( i=0;i<na;i++ ) printf("%d “,a[i]);
printf(”\n");
for ( i=0;i<nb;i++ ) printf("%d “,b[i]);
printf(”\n");}
第四课一维数组的查找统计
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2
#include<stdio.h>
#include<stdlib.h>
int getNum(int arr[], int size){
for (int i = 0; i < size-1; i++) {
for (int j = i+1; j < size; j++) {
if (arr[i] - arr[j]) {
return *(arr+i);
}
}
}
return 0;
}
第五课一维数组的元素排序
算法一:选择排序
算法二:冒泡排序
算法三:插入排序
排序就是按照某个关键词的大小或若干对象从小到大或从大到小进行重新排列,关键字是对象的某一个属性,它可以是任何基本数据类型甚至结构体等
第六课一维数组的应用举例
例题有学习对象,商品排序,素数大酬宾,约瑟夫问题。
第七课二维数组的定义和操作
一维数组的元素可以是任何基本数据类型,也可以是结构体,如果一维数组的每一个元素又是一个一维数组,则称这种速度为二维数组,用两个下标来确定目标。
1.二维数组的定义和初始化
定义二维数组的一般格式为:
类型标识符,数组名[常量表达式1],[常量表达式2]
2.二维数组的存储及元素引用
二维数组本质上是一维数组的每一个元素又是一个一维数组,而计算机内部存储一维数组采用的是连续存储单元,所以二维数组的存储方式是行优先的连续存储。
3.二维数组的输入输出
第八课二维数组应用举例
可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。编程如下:
#include int main(void){
int i,j,s=0,average,v[3],a[5][3];
printf(“input score “);
for(i=0;i<3;i++){
for(j=0;j<5;j++){ scanf(”%d”,&a[j][i]);
s=s+a[j][i]; } v[i]=s/5; s=0; }
average =(v[0]+v[1]+v[2])/3;
printf("math:%d c languag:%d dbase:%d ",v[0],v[1],v[2]);
printf("total:%d ", average );
return 0;
}
第九课数字方阵
附子坊镇就是一个行列数相等的二维数组,其中的每个元素都是数字。
解决数字方阵问题一般有两种方法
法一:解析法
解析法就是找出每一个方阵元素f[i][j]与i,j和数组规模n的通项公式,然后直接用两重循环给数组元素赋值相对比较容易,一般用在初始化等场合。
法二:模拟法
模拟法就是把数字方阵看成一个动态的填数过程,把n2个数依次填入速度中,每天好一个数就定位好下一个数的位置i和j。
第十课字符数组
如果数组中的每个元素都是一个字符,这样的速度称为字符数组,有时把一堆字符数组又称为字符串,定义字符数组的方法与定义其他类型数组的方法类似
感悟和总结:
定义数组要一一对应,掌握好定义,尤其在一一对应方面,定义的数组要与赋值数组一一对应,思路要清晰,不然很容易写出的程序混乱