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中的元素最小值及其下标

  1. 定义一个整型变量存放最小值下标,将其初始化为0 ,例如:int p=0;即从数组第零个元素开始判断。
  2. 通过循环,依次判断数组中的每一个元素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的斐波拉契数列

分析:

  1. 斐波拉契数列只要求从第三个数字开始都是前两个数字的和
  2. 第一个for循环使数组从第三个元素开始,变成自己和前两个元素的和
  3. 第二个循环再将改变过的数组依次输出,输出长度为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;
}

在这里插入图片描述

八、将一串数字序列的最后一个数字换到第一个位置并输出,再次循环如此过程,直到回到初始状态

分析:

  1. 第一个for循环用来录入键入的值
  2. 第二个主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个元素换一行

分析:

  1. 数组部分初始化
  2. for循环给剩下的元素赋值,注意循环起点
  3. 可定义一个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位小数)

分析:

  1. 第一个for循环输入值
  2. 第二个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整除的元素,输出删除后数组中的全部元素

分析:

  1. 长度50的数组初始化可以使用随机数生成,快一点
  2. 循环遍历是否可以被3整除,可以的话直接用循环实现后值向前覆盖,达到删除目的
  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整除的数字)
在这里插入图片描述

十四、总结

  1. C规定,数组的下标下界为0,因此数组元素下标的上界是该数组元素的个数减1。
    例如,有定义:int a[10]; 则数组元素的下标上界为9。
  2. 由于数组的下标下界为0,所以数组中下标和元素位置的对应关系是:第一个元素下标为0,第二个元素下标为1,第三个元素下标为2,依次类推,第n个元素下标为n-1。
  3. 数值型数组要对多个数组元素赋值时,使用循环语句,使数组元素的下标依次变化,从而为每个数组元素赋值。
    例如:
int a[10],i;
for(i=0;i<10;i++)  
	scanf("%d",&a[i]);

不能通过如下的方法对数组中的全部元素赋值。

int a[10],i; 
scanf("%d",&a[i]);
  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 定义一维数组的语法格式为: `数据类型 数组名[数组长度];` 例如,定义一个长度为5的整型数组并赋初值如下: ```c int arr[5] = {1, 2, 3, 4, 5}; // 声明一个长度为5的整型数组并赋初值 ``` 也可以逐个赋值: ```c int arr[5]; arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5; ``` 注意,数组下标从0开始,所以arr[0]表示数组的第一个元素,arr[4]表示数组的最后一个元素。 ### 回答2: C语言一维数组定义赋值可以通过以下方式完: 1. 定义数组:在C语言,我们首先需要使用关键字`int`(或其他数据类型)来声明数组元素的类型,然后指定数组的大小。例如,以下代码定义了一个包含5个整数的一维数组: ```c int array[5]; ``` 2. 赋值数组元素:初始化数组可以在定义时或之后进行。可以通过逐个赋值或使用循环来给数组元素赋值。以下是几种常见方式: a. 逐个赋值:使用索引(从0开始)逐个将值赋给数组元素。例如: ```c array[0] = 10; array[1] = 20; array[2] = 30; array[3] = 40; array[4] = 50; ``` b. 使用循环赋值:可以使用for循环来依次给数组元素赋值。例如: ```c int i; for (i = 0; i < 5; i++) { array[i] = (i + 1) * 10; } ``` c. 同时定义赋值:可以在定义数组时就指定数组元素的值。以下是一个示例: ```c int array[] = {10, 20, 30, 40, 50}; ``` 在以上示例,我们定义了一个整数类型的一维数组,长度为5,并分别赋值给了数组的元素。无论是逐个赋值还是使用循环赋值,都可以根据具体的需求和情况来选择合适的方法。 ### 回答3: 在C语言定义赋值一维数组需要以下步骤: 1. 首先确定数组的数据类型和大小: dataType arrayName[arraySize]; 这里,dataType是数组元素的数据类型,arrayName是数组的名称,arraySize是数组的大小或元素个数。 2. 对数组进行赋值: - 可以使用循环结构来逐个赋值数组元素,比如使用for循环: for (int i = 0; i < arraySize; i++) { arrayName[i] = value; } 这里,value是要赋给数组元素的值。 - 也可以在定义数组时直接赋初值,使用花括号将各个元素的值括起来,用逗号分隔: dataType arrayName[arraySize] = {value1, value2, ...}; 这里,value1, value2等是要赋给数组元素的值。 3. 如果不确定数组大小,可以使用动态内存分配函数malloc()来在运行时分配内存空间: dataType *arrayName; arrayName = (dataType *)malloc(arraySize * sizeof(dataType)); 这里,arrayName是指向数组首地址的指针,arraySize是数组大小,sizeof(dataType)是数据类型的字节数。 需要注意的是,C语言数组的下标从0开始,因此访问数组元素时,取值范围是0到arraySize-1。此外,数组的大小在定义后是固定的,无法更改。如果需要处理更多的数据,可能需要重新定义一个更大的数组或使用动态内存分配函数来调整数组大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值