C语言一/二维数组经典例题及解析

C语言一/二维数组经典例题解析
这篇博客详细介绍了C语言中一维和二维数组的基本知识,并通过实例讲解了包括攻擂法求最值、数组逆置、循环移动、折半查找、进制转换、斐波那契数列、冒泡排序等经典算法。同时,还探讨了二维数组的遍历、转置、杨辉三角及数组求平均值等问题,是学习C语言数组操作的好资料。

一、一维数组基本知识

基本格式:

数据类型  数组名[常量表达式];  eg.int a[5];  

格式要求:

常量表达式必须是整形常量(表达式)或字符常量(表达式),但不可为实型或变量也不可以为空。

注意事项:

  • 数组元素个数等于数组长度
  • 元素引用时从0开始
  • 赋值后面跟的是大括号
  • 数组不可整体赋值
  • 引用数组元素时,数组下标可以是变量
  • a[0]叫做该数组的首元素,a[n]叫做尾元素
  • 初始化时直接赋值可以使常量表达式为空
  • 赋值位数不可多余规定位数,但是可以少(未赋值默认为0)

二、一维数组经典例题讲解

1.攻擂法求最值

#include <stdio.h>
int main()
{
   
   
    int a[5],i,x=0;
    int max=a[0];    //首先定义a[0]为最大值
    for (i=0;i<5;i++)
    {
   
   
        printf("请输入第%d个值:\n",i+1);
        scanf("%d",&a[i]);
        if (a[i]>max)    /*利用循环依次和定义的最大值进行比较*/
        {
   
   				//若求最小值,将>改为<即可
            max=a[i];    //若大于则该值取代原先最大值,并且将新的最大值的下角标赋值给x
            x=i;
        }
    }
    printf("最大值为:%d\n",max);
    
    printf("最大值下角标为:%d\n",x);
}

运行结果:
在这里插入图片描述

2.一维数组的逆置

#include <stdio.h>
int main()
{
   
   
    int a[5]={
   
   1,2,3,4,5};
    int i,j,t;
    for (i=0,j=4;i<j;i++,j--)      //核心代码,作用为依次交换中间值两边的数值达到逆置的作用
    {
   
   
        t=a[i];a[i]=a[j];a[j]=t;     //利用第三变量实现指定数值的交换
    }
    printf("该数组的逆置为:\n");
    for (i=0;i<5;i++)            //输出语句
    {
   
   
        printf("%d",a[i]);
    }
}

运行结果:
在这里插入图片描述

3.循环左/右移动

循环右移:若该数组元素为1,2,3,4,5 经过循环右移后数组元素将会变成 5,1,2,3,4

#include <stdio.h>
int main()
{
   
   
    int a[5]={
   
   1,2,3,4,5};
    int i,k;
    k = a[4];      //因为最右值将会被覆盖,所以先赋值给第三方变量进行保存
    for (i=3;i>=0;i--)
    {
   
   
        a[i+1]=a[i];    //将所有值都向右移动一位
    }
    a[0] = k;          //再将刚才保存的数组尾元素赋值给首元素从而完成右移
    for (i=0;i<5;i++)
    {
   
                              
        printf("%d",a[i]);       //输出语句
    }
}

运行结果:
在这里插入图片描述

循环左移:若该数组元素为1,2,3,4,5 经过循环右移后数组元素将会变成 2,3,4,5,1

//向右移动 若该数组元素为1,2,3,4,5 经过循环右移后数组元素将会变成 2,3,4,5,1
#include <stdio.h>
int main()
{
   
   
    int a[5]={
   
   1,2,3,4,5};
    int i,k;
    k = a[0];         //因为最左值将会被覆盖,所以先赋值给第三方变量进行保存
    for (i=1;i<5;i++)
    {
   
   
        a[i-1]=a[i];     //将所有值都向左移动一位,需要注意覆盖方向
    } 
    a[4] = k;             //再将刚才保存的数组尾元素赋值给尾元素从而完成左移
    for (i=0;i<5;i++)
    {
   
   
        printf("%d",a[i]);
    }
}

运行结果:
在这里插入图片描述

4.查找数组元素(折半查找法)

前提:原数组条件元素必须是有序的(升序降序都可以),局限性特别大,但思想可以借鉴

//前提:原数组条件元素必须是有序的(升序降序都可以)
//局限性特别大,但思想可以借鉴
#include <stdio.h>
int main()
{
   
   
    int a[10]={
   
   1,2,3,4,5,6,7,8,9,10};
    int i=0,j=9,m,k=0,num;
    printf("请输入您想要查找的数值:\n");
    scanf("%d",&num);
    while (i<=j)
    {
   
   
        m=(i+j)/2;
        if (num < a[m]) j=m-1;    
以下是根据参考内容整理的几道C语言数组例题: ### 数组定义与元素访问例题 1. 以下数组定义正确的是( ) A. int x[2][2]={1,2,3,4}; B. float x[2] ={1,2,4,6,8,10}; C. int m[3]={1,2,3,4,5,6}; D. 以上都不正确 答案选A。分析:选项B中定义的数组长度为2,但初始化列表有6个元素,超出数组长度;选项C中定义的数组长度为3,但初始化列表有6个元素,超出数组长度。 2. 数组定义为 int a[3][2]={1,2,3,4,5,6},值为 6 的数组元素是( ) A. a[3][2] B. a[2][1] C. a[1][2] D. a[2][3] 答案选B。在C语言中,二维数组下标从0开始,a[3][2]表示3行2列的数组,元素排列为:a[0][0]=1, a[0][1]=2, a[1][0]=3, a[1][1]=4, a[2][0]=5, a[2][1]=6。 ### 数组排序例题 请使用冒泡排序算法个包含5个整数的数组进行排序,并输出排序后的数组。 ```c #include <stdio.h> int main() { int arr[5] = {5, 3, 8, 4, 2}; int i, j, temp; // 冒泡排序 for (i = 0; i < 4; i++) { for (j = 0; j < 4 - i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } // 输出排序后的数组 for (i = 0; i < 5; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` ### 数组综合应用例题 这个程序输入了20个数存放在数组中,并且输出其中最大者与最小者、20个数的及它们的平均值。请填空。 ```c #include <stdio.h> #define N 20 int main() { int a[N], i; int max, min, sum = 0; float avg; for (i = 0; i < N; i++) { scanf("%d", &a[i]); } max = min = a[0]; for (i = 0; i < N; i++) { if (a[i] > max) { max = a[i]; } if (a[i] < min) { min = a[i]; } sum += a[i]; } avg = (float)sum / N; printf("最大值: %d\n", max); printf("最小值: %d\n", min); printf(": %d\n", sum); printf("平均值: %.2f\n", avg); return 0; } ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦同学学学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值