为大家介绍一维数组的定初始化方法、一维数组中数据的输入和输出方法、一维数组有关的程序和算法、数组处理大量数据时的优越性
一、理解数组的概念利用数组存放数据有何特点
二、一维数组的定初始化方法
在 C 中,可以逐个初始化数组,也可以使用一个初始化语句,如下所示:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
如果省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
因此它与前一个实例中所创建的数组是完全相同的。
为数组中某个元素赋值的实例如下:
balance[4] = 50.0;
所有的数组都是以 0 作为它们第一个元素的索引,上述的语句把数组中第五个元素的值赋为 50.0
三、一维数组中数据的输入和输出方法
1. 在定义数组的同时对数组初始化。
#include "stdio.h"
void main() {
int a[4]= {0,1,2,3};
printf("\n%d %d %d %d\n",a[0],a[1],a[2],a[3]);
}
运行截图:
2. 不使用循环对单个数组元素赋值。
#include "stdio.h"
void main() {
int a[4];
a[0]=2;
a[1]=4;
a[2]=6;
a[3]=8;
printf("\n%d %d %d %d\n",a[0],a[1],a[2],a[3]);
}
运行截图:
3. 用循环结构,从键盘输入为每个数组元素赋值,输出各数组元素。
#include "stdio.h"
void main() {
int i,a[4];
for (i=0; i<4; i++)
scanf("%d",&a[i]);
printf("\n");
for (i=0; i<4; i++)
printf("%d ",a[i]);
printf("\n");
}
运行截图:
四、为一维数组a中的元素赋值,并按照逆序输出
通过对一维数组的输入输出来实现;逆序输出,可以通过输出时,在for语句中利用循环变量递减的方法来实现
#include "stdio.h"
void main(){
int i,a[10];
/* 定义循环变量i和一维数组a */
for (i=0;i<=9;i++)
scanf("%d",&a[i]);
for (i=0;i<=9;i++)
printf("%d ",a[i]);
/* 按照逆序输出 */
printf("\n");
}
运行截图:
五、输出一维数组a中的元素最小值及其下标
- 定义一个整型变量存放最小值下标,将其初始化为0 ,例如:int p=0;即从数组第零个元素开始判断。
- 通过循环,依次判断数组中的每一个元素a[i]是否小于a[p],如果是,则将p和a[p]的值作相应的改变。
void main() {
int i,m,p,a[10]= {9,8,7,6,1,3,5,18,2,4};
/* m为最小值,p为其下标 */
m=a[0];
p=0;
for (i=1;i<10;i++)
if(a[i]<m)
{
m=a[i];
p=i;
}
printf("%d,%d\n",a[p],p);
/* 输出一维数组a中最小值及其下标 */
}
运行截图:
六、创建一个长度为10的整型数组a,并初始化前8个元素,输入一个整数x,将x插入到a[3]位置(原有的数据往后“移动”)。要求改变数据元素值这部分功能由函数arraymove( )完成。
#include "stdio.h"
void arraymove(int *p,int x) //指针指定实参数组
{
int i;
for(i=8;i>=4;i--)
p[i]=p[i-1]; //原有的数据往后移动
p[3]=x; //a[3]空出来了
}
void main() {
int i,x;
int a[10]={1,2,3,5,6,7,8,9};
printf("请输入待插入x的值:");
scanf("%d",&x);
arraymove(a,x);
for(i=0;i<9;i++)
printf("%d ",a[i]);
}
运行截图:
七、输出长度为20的斐波拉契数列
分析:
- 斐波拉契数列只要求从第三个数字开始都是前两个数字的和
- 第一个for循环使数组从第三个元素开始,变成自己和前两个元素的和
- 第二个循环再将改变过的数组依次输出,输出长度为5个字符长,元素间有间隔
#include <stdio.h>
int main()
{
int a[20] = {0,1},i;
//用一维数组存储斐波拉契数列,只为前两个数字赋值
for(i=2; i<20 ;i++)
a[i] = a[i-1] + a[i-2];//实现特殊赋值
for(i=0 ;i<20; i++)
printf("%5d",a[i]);//全部输出
return 0;
}
八、将一串数字序列的最后一个数字换到第一个位置并输出,再次循环如此过程,直到回到初始状态
分析:
- 第一个for循环用来录入键入的值
- 第二个主for循环用来重复对数组元素换值,换值的过程注意对值的暂存保留,防止丢失,for循环里面分别对每次变换输出
#include <stdio.h>
int main()
{
int a[10],i,j,k,m; //数组存储数字串,k用于暂存调换的数字
for(i=0; i<10; i++)
scanf("%d",&a[i]); //键入全部数字
for(i=9; i>=0; i--) //10个数字,一共要调换位置10次
{
k = a[9]; //暂存调换的数字
for(j=8; j>=0; j--)
a[j+1] = a[j]; //数字迁移位置,实现调换
a[0] = k; //为空位a[0]补上k值
for(m=0; m<10; m++)
printf("%d ",a[m]); //全部输出
printf("\n");
}
return 0;
}
运行:
九、将十进制整数b转换成n进制
分析:
首先要知道将十进制怎么才能转换成其他的进制,首选方法还是与n相除取余,整数部分逆序输出,小数部分正序输出,题目是整数,直接取余放进一维数组后逆序输出即可。
#include <stdio.h>
int main()
{
int i=0,b,n,j,num[20];
//n表示将要转换成的进制,num[20]存储余数,自定义20长度,够用
scanf("%d",&n);
scanf("%d",&b); //接收要转换的整数b
do
{
num[i]=b%n;//整数b对n取余赋给数组
b=b/n;//更新b的值,b/n直接是整数部分
i++;
}
while (b!=0); //当b被n除尽,则退出循环
for(j=i-1;j>=0;j--)
printf("%d",num[j]); //全部逆序输出
return 0;
}
以八进制转换为例,运行演示:
十、输入一串数字,找出最大值和最小值所在的位置,并把两者对调,然后输出调整后的数字串,以长度10为例
分析:
仍然是对数组的循环遍历,可以先选定第一个数作为最大值和最小值,对每个数组元素和max,min比较,更新下标,一次遍历即可完成,最后将max和min的下标对换。
#include <stdio.h>
int main()
{
int a[10],max,min,i,tmp; //max,min最大值最小值下标,tmp用于对换
for (i=0; i<10; i++)
scanf("%d",&a[i]); //输入一串数字
max=min=0; //默认设置
for (i=1; i<10; i++)
{
if (a[i]<a[min])
{
min=i; //如果当前元素小于a[i],更新最小值下标
}
if (a[i]>a[max])
{
max=i; //如果当前元素大于a[i],更新最大值下标
}
}
tmp=a[min];
a[min]=a[max];
a[max]=tmp; //交换最大最小值
for (i=0; i<10; i++)
printf("%d ",a[i]); //全部输出
return 0;
}
以1,2,3,4,5,6,7,8,9,10为例演示:
十一、创建一个有18个整数的数组,先通过初始化为数组中的前8个元素赋初值,然后通过手工输入后10个元素的值,然后从最后一个元素开始逆序输出该数组元素,每5个元素换一行
分析:
- 数组部分初始化
- for循环给剩下的元素赋值,注意循环起点
- 可定义一个k,表示已输出的个数,满5的整数倍,输出换行
#include <stdio.h>
int main()
{
int a[18]={1,2,3,4,5,6,7,8},i,j=0; //只写八个数字,默认前八个赋值
for(i=8;i<18;i++)
scanf("%d",&a[i]); //循环赋值
for(i=17;i>=0;i--)
{
printf("%5d\t",a[i]); //放一个制表符\t整齐一点儿
j++; //j用于计数,换行输出
if(j%5==0)
printf("\n");
}
return 0;
}
运行:
十二、输入12个整数,按每行3个数输出这些整数,同行的3个数以1个空格分开,最后一行输出12个整数的平均值(结果只显示2位小数)
分析:
- 第一个for循环输入值
- 第二个for循环依次输出,输出留个空格,定义一个计数变量,在输出的同时对累加变量sum处理,最后直接得到平均值
#include <stdio.h>
#define N 12
//这里用到了一个宏定义,也可以不用
int main()
{
int i,a[N];
float av; //平均数一般不是整数,定义成浮点数
printf("*** 请输入12个数组元素:***\n");
for(i=0;i<N;i++)
scanf("%d",&a[i]); //依次赋值
for(i=0;i<N;i++)
{
printf("%d ",a[i]); //%d后面留一个空格
av+=a[i];
if((i+1)%3==0)
printf("\n"); //直接用i作为计数变量,被3整除则输出换行
}
av /= N;
printf("av=%.2f\n",av); // %.2f小数点后保留两位小数输出
return 0;
}
运行:
十三、创建一个长度为50的整型数组a,并初始化,数组元素的值小于100, 删除数组中所有能被3整除的元素,输出删除后数组中的全部元素
分析:
- 长度50的数组初始化可以使用随机数生成,快一点
- 循环遍历是否可以被3整除,可以的话直接用循环实现后值向前覆盖,达到删除目的
- 删除数组中某个元素时可以记个数量,用于最后循环输出数组
#include <stdio.h>
#include <stdlib.h>
//含有生成随机数函数的头文件
int main()
{
int a[50],i,m,j=0,k=0;
for(i=0;i<50;i++)
a[i] = rand()%100 + 1; //rand()%100表示0-100的随机数,+1则是1-100
for(i=0;i<50;i++)
{
if(a[i]%3==0) //判断是否可以整除
{
j++; //计数,后面计算数组长度
for(m=i;m<50-j;m++)
a[m]=a[m+1]; //从当前位置开始,后面向前覆盖
}
}
for(i=0;i<50-j;i++) //50-j就是数组长度
{
k++;
printf("%d ",a[i]);
if(k%5==0)
printf("\n");
//规整输出数组
}
return 0;
}
运行:(可以看一下没有可以能被3整除的数字)
十四、总结
- C规定,数组的下标下界为0,因此数组元素下标的上界是该数组元素的个数减1。
例如,有定义:int a[10]; 则数组元素的下标上界为9。 - 由于数组的下标下界为0,所以数组中下标和元素位置的对应关系是:第一个元素下标为0,第二个元素下标为1,第三个元素下标为2,依次类推,第n个元素下标为n-1。
- 数值型数组要对多个数组元素赋值时,使用循环语句,使数组元素的下标依次变化,从而为每个数组元素赋值。
例如:
int a[10],i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
不能通过如下的方法对数组中的全部元素赋值。
int a[10],i;
scanf("%d",&a[i]);