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

文章目录

  • 一、一维数组基本知识
  • 二、一维数组经典例题讲解
    • 1.攻擂法求最值
    • 2.一维数组的逆置
    • 3.循环左/右移动
    • 4.查找数组元素(折半查找法)
    • 5.利用数组实现十进制转二进制/八进制/十六进制
      • 十进制转二进制:
      • 十进制转八进制:
      • 十进制转十六进制:
    • 6.求斐波那契数列
    • 7.冒泡排序法(数组实现)
  • 三、二维数组基本知识
  • 四、二维数组经典例题
    • 1.二维数组循环遍历
    • 2.输出数组上/下三角元素
    • 3.二维数组的转置(行列互换)
    • 4.杨辉三角
    • 5.利用数组求平均值(去掉最高和最低分)
      • 方法一:冒泡排序法
      • 第二种:攻擂求最值
    • 6.删除数组中指定下标的元素(2种)
    • 7.键盘获取数值 输出个位是奇数,十位数是偶数的所有数
    • 8.键盘获取数值 按照个位数一定顺序排序
    • 9.计算6位同学五门课程每人平均分

一、一维数组基本知识

基本格式:

数据类型  数组名[常量表达式];  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;    //如若小于中间的数值,那末下一次循环最大值则直接为平均数下一位数值,平均数也将会折半
        if (num > a[m]) i=m+1;    //如若大于中间的数值,那末下一次循环最小值则直接为平均数上一位数值
        if (num == a[m]) 		//直到相等则直接跳出,并改变k的值作为标记
        {        					
            k=1;
            break;
        }
    }
    if (k==1) printf("您所查找数值的下角标为:%d\n",m);
    else printf("Not Found\n");
    return 0;
}

运行结果:

5.利用数组实现十进制转二进制/八进制/十六进制

十进制转二进制:

//十进制转二进制

#include <stdio.h>
int main()
{
    int a[50]; //用于保存余数,长度自定义,够用就行
    int i=0,n;
    printf("请输入需要转化为二进制的十进制数:\n");
    scanf("%d",&n);
    while (n!=0)
    {
        a[i] = n%2;     //将余数保存在数组内
        n=n/2;          //除去相应进制数
        i++;            //增量加1
    }
    for (i-=1;i>=0;i--)    //注意输出时初值为i--,因为上述循环结束时多加了一个1且无法更改
    {
        printf("%d",a[i]);
    }
    
}

运行结果:

十进制转八进制:

//十进制转八进制
#include <stdio.h>
int main()
{
    int a[50]; //用于保存余数,长度自定义,够用就行
    int i=0,n;
    printf("请输入需要转化为八进制的十进制数:\n");
    scanf("%d",&n);
    while (n!=0)
    {
        a[i] = n%8;       //将余数保存在数组内
        n=n/8;            //除去相应进制数
        i++;              //增量加1
    }
    for (i-=1;i>=0;i--)    //注意输出时初值为i--,因为上述循环结束时多加了一个1且无法更改
    {
        printf("%d",a[i]);
    }
    
}

运行结果:

十进制转十六进制:

//十进制转十六进制
#include <stdio.h>
int main()
{
    int a[50]; //用于保存余数,长度自定义,够用就行
    int i=0,n;
    printf("请输入需要转化为十六进制的十进制数:\n");
    scanf("%d",&n);
    while (n!=0)
    {
        a[i] = n%16;       //将余数保存在数组内
        n=n/16;            //除去相应进制数
        i++;               //增量加1
    }
    for (i-=1;i>=0;i--)      //注意输出时初值为i--,因为上述循环结束时多加了一个1且无法更改
    {
        //printf("%d",a[i]);   //这样显得人家考官跟傻一样
         if (a[i]>=0&&a[i]<=9) printf("%d",a[i]);
         else printf("%C",a[i]+55);    //为了保证输出为16进制格式,需要用ASCII进行输出字符,注意为%c     
         //傻的居然连printf都忘啦,菜狗
    }
    
}

运行结果:

6.求斐波那契数列

斐波那契数列:从第三项开始,每一项都等于前两项之和

#include <stdio.h>
int main()
{
    int a[50];
    int i,n;
    printf("请输入斐波那契的终止项数:\n");
    scanf("%d",&n);
    for (i=0;i<n;i++)      //i从0开始
    { 
        if (i==0 || i==1) a[i]=1;           //两种可能,就用if else呗
        else a[i]=a[i-2]+a[i-1];            //找规律罢了,定义数组时常量表达式必须是整形常量(表达式也可以),不可以是实型
        printf("%d\t",a[i]);
    }
    return 0;
}

运行结果:

7.冒泡排序法(数组实现)

冒泡排序:经典且重要

#include <stdio.h>
int main()
{
    int a[10]={9,13,6,87,45,67,9,-7,63,76};
    int i,j,t;
    for (i=0;i<9;i++)   //保证循环次数为数组个数减一,因为这个是数组第一个元素和其他元素的比对次数
    {
        for (j=0;j<9-i;j++)   //要求和i的范围保持一致,j<9-i是不对已经挑选出来的极值进行比较(利用次数约定)
        {
            if (a[j] > a[j+1])     //此为升序,想要降序将 > 改为 < 即可
            {
                t=a[j]; a[j]=a[j+1]; a[j+1]=t;   //利用第三方变量,实现交换值的作用
            }
        }
    }
    for (i=0;i<10;i++)       //需要单独利用for循环进行输出,如果用上面进行输出的话,位数将缺少1
    {
        printf("%d\t",a[i]);
    }
}

运行结果:

三、二维数组基本知识

基本格式:

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

数组个数:

eg.int a[3][4] 数组个数为3*4=12

注意事项:

  • 二维数组是按行存储
  • 行在前 列在后
  • 引用元素时,行列的下标都从0开始
  • 初始化时可以省略行下标,不可省略列下标
  • 问数组一维大小指的是行,二维大小指的是列
  • 其他注意事项同上面一维数组

四、二维数组经典例题

1.二维数组循环遍历

#include <stdio.h>
int main()
{
    int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};   //可针对每行单独进行赋值
    int i,j;
    for (i=0;i<3;i++)
    {
        for (j=0;j<3;j++)
        {
            printf("%d\t",a[i][j]);    //利用for循环遍历并输出
        }
        printf("\n");
    }
}

运行结果:

2.输出数组上/下三角元素

#include <stdio.h>
int main()
{
    int a[3][3]={1,2,3,4,5,6,7,8,9};
    int i,j;
    printf("数组方阵如下:\n");
    printf("***********************\n"); 
    for (i=0;i<3;i++)
    {
        for (j=0;j<3;j++)
        {
            printf("%d\t",a[i][j]);    //利用for循环,循环遍历输出
        }
    printf("\n");
    }
    printf("***********************\n");
    printf("\n");
    printf("\n");
    printf("数组方阵下三角如下:\n");
    printf("***********************\n");
    for (i=0;i<3;i++)
    {
        for (j=0;j<=i;j++)      //利用i为约束,内部实现动态次数循环
        {
            printf("%d\t",a[i][j]);
        }
    printf("\n");
    }
    printf("***********************\n");
    printf("\n");
    printf("\n");
    printf("数组方阵上三角如下:\n");
    printf("***********************\n");
    for (i=0;i<3;i++)
    {
        for (j=i;j<3;j++)     //内层变量等于外层变量,可规定内部初值   //很巧妙,新思路,学到了
        {
            if (i==0) printf("%d\t",a[i][j]);    
            else if (i==1) 
            {
                printf("\t%d",a[i][j]);
            }
            else if (i==2) 
            {
                printf("\t\t%d",a[i][j]);
            }
        }
    printf("\n");
    }
    printf("***********************\n");
    printf("\n");
    return 0;
}

运行结果:

3.二维数组的转置(行列互换)

//三行两列转为两行三列
#include <stdio.h>
int main()
{
    int a[2][3]={1,2,3,4,5,6},b[3][2];
    int i,j;
    for (i=0;i<2;i++)
    {
        for (j=0;j<3;j++)
        {
            b[j][i]=a[i][j];    //根据找规律而得
        }
    }
    for (i=0;i<3;i++)
    {
        for (j=0;j<2;j++)
        {
            printf("%d\t",b[i][j]);    //输出循环体
        }
        printf("\n");
    }
    return 0;
}

运行结果:

4.杨辉三角

此代码实现的是阶梯版杨辉三角,适合初学者观看,但编程思想都相同

//此代码实现的是输出杨辉三角前10行
#include <stdio.h>
int main()
{
    int a[10][10];
    int i,j;
    for (i=0;i<10;i++)
    {
        for (j=0;j<=i;j++)
        {
            if (j==0 || i==j) a[i][j]=1;      //无规律则直接赋值
            else a[i][j] = a[i-1][j]+a[i-1][j-1];      //有规律直接找规律赋值
            printf("%d\t",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

运行结果:

5.利用数组求平均值(去掉最高和最低分)

方法一:冒泡排序法

//第一种思路,利用冒泡排序先对数组进行排序,然后再求去掉最大最小值的平均数
#include <stdio.h>
int main()
{
    int a[10];
    int c,i,j,n,t;
    float sum=0.0;
    printf("请输入10个数值\n");   
    for (i=0;i<10;i++)
    {
        scanf("%d",&a[i]);     //利用循环对数组赋值
    }
    for (i=0;i<9;i++)
    {
        for (j=0;j<9-i;j++)
        {
            if (a[j]>a[j+1])
            {
                t=a[j]; a[j]=a[j+1]; a[j+1]=t;  //利用冒泡排序对数组排序
            }
        }
    }
    for (i=1;i<9;i++)
    {
        sum+=a[i];                                     //去掉最大最小值循环求和
    }
    printf("去掉最高以最低分后的平均数为%0.2f",sum/8.0);
    return 0;
}

第二种:攻擂求最值

//第二种思路,先求出用户输入数据的总和,然后再利用攻擂法求出最大最小值,再求去掉最大最小值的平均数
#include <stdio.h>
int main()
{
    int a[10];
    int i,max,min;
    float sum,avg;
    printf("请输入任意十个数字:\n");
    for (i=0;i<10;i++)
    {                        
        scanf("%d",&a[i]);        //利用循环对数组赋值
        sum += a[i];
    }
    max=min=a[0];               //将首元素设为最大值和最小值
    for (i=0;i<10;i++)
    {
        if (a[i]>max) max=a[i];          //利用攻擂法求出最大值最小值
        if (a[i]<min) min=a[i];
    }
    avg=(sum-max-min)/8.0;
    printf("平均数为:%0.2f",avg);
    return 0;
}

运行结果:

6.删除数组中指定下标的元素(2种)

/*第一种方法
//删除实质是覆盖
#include <stdio.h>
int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    int i,n;
    printf("请输入想要删除数的下标:\n");
    scanf("%d",&n);
    for (i=0;i<10;i++)
    {
        if (i>=n) a[i]=a[i+1];    //将用户所输入下标所在的数值用后一个数值进行覆盖
    }
    for (i=0;i<9;i++)
    {
        printf("%3d",a[i]);       //输出时不输出最后一个数值,以达到删除的目的
    }
}
*/

//第二种办法
#include <stdio.h>
int main()
{
    int a[5];
    int i,n;
    printf("请输入5个数值数值:\n");
    for (i=0;i<5;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("请输入想要删除数的下标:\n");
    scanf("%d",&n);
    for (i=n;i<4;i++)      //和上述思想一样,只是表达方式不同
    {
        a[i]=a[i+1];
    }
    for (i=0;i<4;i++)
    {
        printf("%3d",a[i]);
    }
}

运行结果:

7.键盘获取数值 输出个位是奇数,十位数是偶数的所有数

//键盘输入10个数,输出个位数是奇数或者十位数是偶数的所有数
#include <stdio.h>
int main()
{
    int a[10];
    int i,j;
    printf("请输入10个正整数:\n");
    for (i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
        if (a[i]%10%2==1 || a[i]/10%10%2==0) printf("%d\t",a[i]);   //遍历时利用约束条件进行输出
    }
    return 0;
}

运行结果:

8.键盘获取数值 按照个位数一定顺序排序

#include <stdio.h>
int main()
{
    int a[10];
    int i,j,t;
    printf("请输入十个两位正整数:\n");
    for (i=0;i<10;i++)
    {
        scanf("%d",&a[i]);
    }
    for (i=0;i<9;i++)
    {
        for (j=0;j<9-i;j++)
        {
            if (a[j]%10>a[j+1]%10)    //利用冒泡排序,并改变if条件即可实现
        {
            t=a[j]; a[j]=a[j+1]; a[j+1]=t;      //若不熟悉多去看冒泡排序
        }
        }
    }
    for (i=0;i<10;i++)
    {
        printf("%d\t",a[i]);
    }
    return 0;
}

运行结果:

9.计算6位同学五门课程每人平均分

#include <stdio.h>
int main()
{
    float a[6][5];
    int i,j;
    float sum;
    for (i=0;i<6;i++)
    {
        sum=0.0;    //保证在外循环内,保证每次刷新用于累加成绩
        printf("请输入第%d位学生的五门成绩:\n",i+1);
        for (j=0;j<5;j++)
        {
            scanf("%f",&a[i][j]);    //定义二维数组循环输入并计算平均值输出
            sum+=a[i][j];
        }
        printf("该学生的平均数为:%0.2f\n",sum/5.0);   //结果保留俩位小数
        //除5.0不要忘记
    }
    return 0;
}

运行结果:

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年12月8日
下一篇 2023年12月8日

相关推荐