preloader image
C语言中一维数组的定义,初始化,遍历循环赋值、按要求插入、删除、换位,十进制转换成n进制

C语言中一维数组的定义,初始化,遍历循环赋值、按要求插入、删除、换位,十进制转换成n进制

为大家介绍一维数组的定初始化方法、一维数组中数据的输入和输出方法、一维数组有关的程序和算法、数组处理大量数据时的优越性

一、理解数组的概念利用数组存放数据有何特点

二、一维数组的定初始化方法

在 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=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

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

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

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

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]

{

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

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

#define N 12

//这里用到了一个宏定义,也可以不用

int main()

{

int i,a[N];

float av; //平均数一般不是整数,定义成浮点数

printf("*** 请输入12个数组元素:***\n");

for(i=0;i

scanf("%d",&a[i]); //依次赋值

for(i=0;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

#include

//含有生成随机数函数的头文件

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]);

Copyright © 2088 下一次世界杯_世界杯巴 - xbpifu.com All Rights Reserved.
友情链接