草庐IT

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

秦同学学学 2023-07-15 原文

文章目录

一、一维数组基本知识

基本格式:

数据类型  数组名[常量表达式];  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;
}

运行结果:

有关C语言一/二维数组经典例题及解析的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  6. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  7. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  8. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  9. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  10. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

随机推荐