超详细且附实例的一维数组(C语言)
数组:方便数据的管理和使用,便于完成大量的数据的处理,简化程序设计
1、一维数组
1.1、一维数组
1.1.1、一维数组的定义和引用
一批相同类型的变量使用同一个数组变量名,用下标来相互区分。
- 由数组名和下标唯一地确定每个数组元素。
- 每个元素都属于同一类型。
- 表述简洁,可读性高。
- 便于使用循环结构。
// i 从0到9,输出a[0]~a[9]
for(i = 0;i < n;i++)
printf("%d",a[i]);
1、定义
类型名 数组名[数组长度]
类型名:数组元素的类型
数组名:数组(变量)的名称,标识符
数组长度:常量表达式,给定数组的大小
int a[10];//定义一个含有10个整型元素的数组a
char c[200];//定义一个含有200个字符元素的数组C
double arr[5];//定义一个含有5个实型的数组arr
2、引用
(1)、先定义,后使用
(2)、只能引用单个的==数组元素,不能一次引用整个数组
下标:整型表达式
取值范围:[0,数组长度-1]
例如:
int a[10];10个元素:a[0],a[1]...a[9]
//下标不能越界,不能使用a[10]
数组元素的使用方法与同类型的变量相同,例如:
//从键盘读入一个整数,存入a[i]
scanf("%d",&a[i]);
//下标为index的元素与下标为k的元素互换内容
temp = a[index];
a[index] = a[k];
a[k] = temp;
//输出a[i]的值
printf("%d\n",a[i]);
3、区分数组的定义和数组元素的引用
(1)、定义数组
类型名 数组名[数组长度]
int a[10];//定义数组时,数组长度必须为常量
(2)、引用数组元素
数组名[下标]
a[0] = a[9] = 0;
a[k] = temp;
4、数组和循环:使用循环批量处理数组元素。数组下标作为循环变量,通过循环,逐个处理数组元素。
// i 从0到9,输出a[0]~a[9]
for(i = 0;i < 10;i++)
printf("%d",a[i]);
// i 从0到9,输出a[0]~a[9]
for(i = 0;i < 10;i++)
printf("%d",a[i]);
例1.1:逆序输出
n个整数的逆序输出。输入n(n <=10)和n个整数,逆序输出这n个整数。
思路分析:
(1)、读入n;
(2)、循环进行n次,依次将n个整数存入a[0],a[1]...a[n -1];
(3)、循环进行n次,依次输出a[n-1]...a[1],a[0];
#include<stdio.h>
int main(void)
{
int n;
int a[9];
printf("请输入整数的个数:\n");
scanf("%d",&n);
printf("请输入%d个整数:\n",n);//依次将n个整数存入a[0],a[1]...a[n -1];
for(int i = 0;i < n;i++)
scanf("%d",&a[i]);
printf("请逆序输出这几个数:\n");//依次输出a[n-1]...a[1],a[0];
for(int i = n-1;i >= 0;i--)
printf("%d ",a[i]);
printf("\n");
return 0;
}
1.1.2、一维数组初始化
(1)、可以定义数组时,对数组元素赋初值。
类型名 数组名[数组长度] = {初值表}
例如:
int a[10] = {1,2,3,4,5,6,7,8,9,10};
//定义数组a有10个int类型的元素,并为这些元素赋初值;
a[0]=1;...a[9]=10
(2)、部分元素初始化:一般数组如果没有初始化,所有元素为随机值;但如果对部分元素初始化,没有初始值的元素自动赋值为0
int fib[20]= {0,1};
fib[0]=0;
fib[1]=1;//其余的元素都为0
如果对全部元素赋值可以省略数组的长度
int a[10]={0,1,2,3,4,5,6,7,8,9};
可写成:int a[]={0,1,2,3,4,5,6,7,8,9};//建议不要省略数组的长度
例1.2:fibonacci数列的前n项:输入一个正整数n(1<n<=50),输出fibonacci数列的前n项:1,1,2,3,5…
思路分析:
(1)、先输入整数的个数;
scanf("%d",&n);
(2)、使用一个循环完成计算数组的后一项;
for(int i = 2;i <=n;i++)
{
a[i] = a[i-1] + a[i-2];
}
(3)、使用循环输出数组元素;
for(int i = 0;i < n;i++)
{
printf("%d\n",a[i]);
}
#include<stdio.h>
#define N 50
int main(void)
{
int n;
int a[N]={1,1};
printf("请输入整数的个数:\n");
scanf("%d",&n);
for(int i = 2;i <=n;i++)
{
a[i] = a[i-1] + a[i-2];
}
printf("请输出这个数列的前n项:\n");
for(int i = 0;i < n;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
例1.3、数组元素的查找:已知数组a中有如下元素:1,45,18,7,22,11,33,15,27,19;输入一个x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出"Not Found”
思路分析:
(1)、对n个数依次循环进行查找;
for()
{
if(a[i]==x)
}
(2)、if(i < n)则找到,否则没有找到。
#include<stdio.h>
#define N 10
int main()
{
int i,x;
int a[N]={1,45,18,7,22,11,33,15,27,19};
printf("请输入要查找的数字:\n");
scanf("%d",&x);
for(i=0;i<N;i++)
{
if(a[i]==x)//若找到,提前循环
break;
}
if(i<N)//若循环提前结束,说明找到x,输出下标;
printf("%d\n",i);
else
printf("Not Found");
return 0;
}
例1.4:在有序序列里面插入新元素:已知如下有序序列,有9个元素:1,2,4,7,8,11,16,21,35 输入一个数,该数插入到数组的适当位置,是的数组仍保持升序序列,输出插入新元素之后的数组。
思路分析:
(1)、从后往前开始遍历,遇到比自己大的元素就往后移一位;
for(i = N-1;i >= 0;i--)
{
if(a[i] > n)
a[i+1] = a[i];
else
break;
}
(2)、将插入的元素赋值给a[i+1];
a[i+1] = n;
#include<stdio.h>
#define N 20
int main()
{
int n,i;
int a[N]={1,2,4,7,8,11,16,21,35};
printf("请输入要插入的整数:\n");
scanf("%d",&n);
for( i = N-1;i >= 0;i--) //从后往前遍历,遇到大的往后移一位
{
if(a[i]>n)
a[i+1]=a[i];
else
break;
}
a[i+1]=n; //将插入的元素赋给a[i+1]
printf("插入后按升序输出 :\n");
for(i = 0;i <=N;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
例1.5:交换最小值:输入n,再输入n个数
(1)、求最小值
(2)、求最小值及其所对应的下标
(3)、将最小值与第一个数交换,输出交换后的n个数
(1)、求最小值
思路分析:
a[0]为临时最小值
min = a[0];
for(i = 0;i < n;i++)
{
if(a[i] < a[0])
min = a[i];
}
#include<stdio.h>
#define N 20
int main()
{
int n,i;
int min;
int a[N];
printf("请输入整数的个数:\n");
scanf("%d",&n); //输入整数的个数
printf("请分别输入这几个整数 :\n");
for(i = 0;i < n;i++)
scanf("%d",&a[i]); //输入的元素依次存入数组
min = a[0]; //a[0]为临时最小值
for(i = 0;i < n;i++)
{
if(a[i] < min)
min = a[i];
}
printf("最小值为:\n");
printf("%d\n",min);
return 0;
}
(2)、求最小值及其所对应的下标
#include<stdio.h>
#define N 20
int main()
{
int n,i;
int index; //记录下标
int min;
int a[N];
printf("请输入整数的个数:\n");
scanf("%d",&n); //输入整数的个数
printf("请分别输入这几个整数 :\n");
for(i = 0;i < n;i++)
scanf("%d",&a[i]); //输入的元素依次存入数组
min = a[0]; //a[0]为临时最小值
for(i = 0;i < n;i++)
{
if(a[i] < min)
min = a[i];
index = i; //下标赋为i
}
printf("最小值为:\n");
printf("%d\n",min);
printf("最小值的下标为:\n");
printf("%d\n",index);
return 0;
}
(3)、将最小值与第一个数交换,输出交换后的n个数
思路分析:
交换的操作:
t = a[0];
a[0] = min;
min = t;
#include<stdio.h>
#define N 20
int main()
{
int n,i;
int t;
int min;
int a[N];
printf("请输入整数的个数:\n");
scanf("%d",&n); //输入整数的个数
printf("请分别输入这几个整数 :\n");
for(i = 0;i < n;i++)
scanf("%d",&a[i]); //输入的元素依次存入数组
for(i = 0;i < n;i++)
{
min = a[0]; //初始化在for循环内
if(a[i] < min)
min = a[i];
}
t = a[0]; //进行交换操作
a[0] = min;
min = t;
printf("最小值与第一个数交换后输出n个数:\n");
for(i = 0;i < n;i++)
printf("%d\n",a[i]);
return 0;
}
例1.6:排序:输入n(n<10),再输入n个数,将它们从小到大的顺序输出。
思路分析:
比较交换排序的实现:
for(i = 0;i < n -1;i++) //交换排序
{//a[i]与其后元素比较,若a[j]<a[i].则交换
for(j = i+1;j < n;j++)
if(a[i] >a[j])
{
index = a[i];
a[i] = a[j];
a[j] = index;
}
}
#include<stdio.h>
#define N 20
int main()
{
int n,i,j;
int index;
int min;
int a[N];
printf("请输入整数的个数:\n");
scanf("%d",&n); //输入整数的个数
printf("请分别输入这几个整数 :\n");
for(i = 0;i < n;i++)
scanf("%d",&a[i]); //输入的元素依次存入数组
for(i = 0;i < n -1;i++) //交换排序
{//a[i]与其后元素比较,若a[j]<a[i].则交换
for(j = i+1;j < n;j++)
if(a[i] >a[j])
{
index = a[i];
a[i] = a[j];
a[j] = index;
}
}
printf("排序后输出n个数:\n");
for(i = 0;i < n;i++)
printf("%d\n",a[i]);
return 0;
}