C语言围绕数组算法的习题解题

2020-12-05  本文已影响0人  MXTeamXY

好久没写随笔了,最近在学习C语言,第一次学习C语言给我的总体感觉就是运行快、代码少。但作为计算机通用的C语言设计理念就是你想怎么写就怎么写,只要错的不是非常离谱编译都不会显示警告,所以会出现精度数据丢失的情况,危险性较高,但C语言总体还是非常不错的,不多说了,上题上码!
(1)用一维数组计算斐波那契数列的前20项;斐波那契数列为1 1 2 3 5 8 13 21等,可归纳公式为:F(1)=1,F(2)=1,F(3)=F(1)+F(2)
代码如下:

#include <stdio.h>
main()
{
    //初始 
    int Fibonacci[N]={1,1},temp,i;
    //从索引号2开始执行循环 
    for(i=2;i<N;i++)
    {
              //数组当前下标数据=数组索引号0+索引号1数据的和 
        Fibonacci[i]=Fibonacci[i-2]+Fibonacci[i-1];
    }
    //输出 
    for(i=0;i<N;i++)
    {
        printf("%d\n",Fibonacci[i]);
    }   
}

这个还是蛮简单的,继续下一题吧。
(2)将一个数组中的元素进行逆序存放,比如原有数据为1、2、3、4、5,在逆序存放为5、4、3、2、1。
这道题需要用到简单的冒泡排序算法,详细注释。

冒泡排序逻辑图
解题代码如下:

    //初始定义数组num容量9个元素大小、中间变量t
    int num[9]={1,2,3,4,5,6,7,8,9},t;
    
    //输出排序前的数组 
    printf("当前数组顺序为:\n"); 
    for(int i=0;i<9;i++)
    {
                //循环9次从num数组索引0开始到索引8依序打印
        printf("%2d",num[i]);
    }
    
    //执行循环第一次从1开始对比 
    for(int i=1;i<9;i++)
    {
        for(int j=8;j>=i;j--)
        {
            //如果数组索引号0<索引号1那么交换顺序
            //想从小到大则判断> 
            if(num[i-1]<num[i])
            {
                //实现数据交换 
                //将当前数组元素下标数据交给中间变量存储 
                t=num[j];
                //将前一个数组元素交给当前数组元素下标 
                num[j]=num[j-1];
                //将中间变量数据交给前一个数组元素
                num[j-1]=t;
            }
        }
    }
    
    //输出排序后的数组 
    printf("排序后数组顺序为:\n");
    for(int i=0;i<9;i++)
    {
        printf("%2d",num[i]);
    }

(3)在一个升序数组插入一个数,使数组仍然保持升序排列。
代码如下:

main()
{
    //初始变量 
    int s,s1,temp1,i1;
    
    printf("请输入该升序数组的长度大小(1-20):\n");
    scanf("%d",&s);
    
    //扑捉用户输入错误 
    while(s<0||s>20)
    {
        printf("您输入的数组长度有问题,请重新输入:\n");
        scanf("%d",&s); 
    }
    
    //初始数组 
    int num[s];
    //初始遍历数组数据 
    for(int i=0;i<s;i++)
    {
        scanf("%d",&num[i]);
    }
    
    //升序算法 如需要注释参考上一道题 
    for(int i=1;i<s;i++)
    {
        for(int j=s-1;j>=i;j--)
        {
            if(num[j-1]>num[j])
            {
                temp1=num[j];
                num[j]=num[j-1];
                num[j-1]=temp1;
            }
        }
    }
    
    //输出升序的数组数据 
    printf("当前数组数据为:\n");
    for(int i=0;i<s;i++)
    {
        printf("%4d",num[i]);       
    }
    
    //输入数据 
    printf("\n请输入需要插入的数据:\n");
    scanf("%d",&s1);
    
    //插入数据后数组大小需要+1 
    s=s+1;
    
    
    //本次for循环为了取得要插入的数组下标位置标记 
    for(i1=0;i1<s;i1++)
    {
        if(s1>num[i1])
        {
            //如果输入的数大于数组下标当前的数据则什么都不执行 
            ;
        }
        else{
            //如果输入的数小于数组下标当前的数据则标记当前下标然后退出循环 
            break;
        }
    }
    
    
    //本次for循环是为了将原来数组内容往后移动实现插入后升序数组排序 
    for(int j=s-1;j>i1;j--)
    {
        num[j]=num[j-1];
    }
    //插入数据到数组标记i1处 
    num[i1]=s1;
    
    //输出插入后的数组数据 
    printf("插入数据:%d,后数组数据为:\n",s1);
    for(int i=0;i<s;i++)
    {
        printf("%3d",num[i]);   
    }
}

这道题也需要用到冒泡排序算法,只要明白了冒泡排序 这道题不难的哦。
(4)合并两个降序数组,使合并后的数组依然保持降序排列
解题代码如下:


{
    int size1,size2,temp1,temp2,temp3;
    printf("请输入第一个降序数组的长度大小(1-20):\n");
    scanf("%d",&size1);
    
    //扑捉用户输入第一个数组大小错误 
    while(size1<0||size1>20)
    {
        printf("您输入的数组长度有问题,请重新输入:\n");
        scanf("%d",&size1); 
    }
    
    int shuzu1[size1];
    
    printf("请分别输入第一个降序数组的数据:\n");
    
    //初始化遍历数组1 
    for(int i=0;i<size1;i++)
    {
        scanf("%d",&shuzu1[i]);
    }
    
    
    
    
    //第二个数组 
    printf("请输入第二个降序数组的长度大小(1-20):\n");
    scanf("%d",&size2);
    
    //扑捉用户输入第二个数组大小错误 
    while(size1<0||size1>20)
    {
        printf("您输入的数组长度有问题,请重新输入:\n");
        scanf("%d",&size2); 
    }
    
    int shuzu2[size2];
    
    //初始化遍历数组2 
    printf("请分别输入第二个降序数组的数据:\n");
    
    //初始化遍历数组 
    for(int i=0;i<size2;i++)
    {
        scanf("%d",&shuzu2[i]);
    }
    
    //实现第一个数组的降序算法 
    for(int i=1;i<size1;i++)
    {
        for(int j=size1-1;j>=i;j--)
        {
            if(shuzu1[j-1]<shuzu1[j])
            {
                temp1=shuzu1[j-1];
                shuzu1[j-1]=shuzu1[j];
                shuzu1[j]=temp1;
            }
        }
    }
    //输出第一个降序数组 
    printf("第一个数组数据降序顺序为:\n");
    for(int i=0;i<size1;i++)
    {
        printf("%3d",shuzu1[i]);    
    }
    
    //实现第二个数组的降序算法 
    for(int i=1;i<size2;i++)
    {
        for(int j=size2-1;j>=i;j--)
        {
            if(shuzu2[j-1]<shuzu2[j])
            {
                temp2=shuzu2[j-1];
                shuzu2[j-1]=shuzu2[j];
                shuzu2[j]=temp2;
            }
        }
    }
    //输出第二个降序数组 
    printf("\n第二个数组数据降序顺序为:\n");
    for(int i=0;i<size2;i++)
    {
        printf("%3d",shuzu2[i]);    
    }
    
    //合并数组 
    int shuzuhb[size1+size2],ijia=0,isum;
    
    //合并第一个数组;
    for(int i=0;i<size1;i++)
    {
        shuzuhb[ijia]=shuzu1[i];
        ijia++;
    } 
    
    // 合并第二个数组;
    for(int i=0;i<size2;i++)
    {
        shuzuhb[ijia]=shuzu2[i];
        ijia++;
    }
    
    //实现两个数组合并后降序排序算法 
    isum=size1+size2;
    for(int i=1;i<isum;i++)
    {
        for(int j=isum-1;j>=i;j--)
        {
            if(shuzuhb[j-1]<shuzuhb[j])
            {
                temp3=shuzuhb[j-1];
                shuzuhb[j-1]=shuzuhb[j];
                shuzuhb[j]=temp3;
            }
        }
    }
    //输出合并后数组降序排列数据 
    printf("\n两个数组合并后的顺序为:\n");
    for(int i=0;i<isum;i++)
    {
        printf("%3d",shuzuhb[i]);   
    }
}

(5)从键盘输入一篇英文学术文章的标题,要求不多于40个字符,分别统计求出其中大写字母、小写字母、数字和其他字符的个数。
解题代码如下:

main()
{
    //初始化数组长度s,小写a,大写b,数字c1,其他d; 
    int s,a=0,b=0,c1=0,d=0;
    
    //输入数组长度 
    printf("请输入文章标题字符长度(1-40):\n");
    scanf("%d",&s);
    
    //捕捉用户行为错误 
    while(s<0||s>40)
    {
        printf("输入有误,请重新输入:\n");
        printf("请输入文章标题字符长度(1-40):\n");
        scanf("%d",&s);
    }
    
    //定义char数组c 长度s 
    char c[s];
    //遍历数组 
    for(int i=0;i<s;i++)
    {
        scanf("%c",&c[i]);
    }
    
    //该for循环用于分别判断大小写、其他、数字 
    for(int j=0;j<s;j++)
    {
        if(c[j]>='a'&&c[j]<='z')
        {
            a++;
        }else if(c[j]>='A'&&c[j]<='Z'){
            b++;
        }else if(c[j]>='0'&&c[j]<='9'){
            c1++;
        }else{
            d++;
        }
    }
    
    //输出 
    printf("\n数组:\n");
    for(int i=0;i<s;i++)
    {
        printf("%c",c[i]);
    }
    printf("其中小写字母:%d个\t大写字母:%d个\t数字:%d个\t其他字符:%d个\n",a,b,c1,d);    
 }

是不是很简单,继续吧。
(6)有一句英文的加密电文,加密规律是:A->Z、B->Y、C->X&&a->z、b->y、c->x即第1个字母变成第26个字母,第N个字母变成第(26-N+1)个字母,非字母字符不变,请编译出加密电文破译电文数据。
解题代码如下:

main()
{
    //初始定义char类型数组长度30元素 
    char jc[30];
    printf("请输入加密电文:\n");
    //取得键盘输入的char数组数据 
    gets(jc);
    printf("\n加密电文数据:\n");
    //输出加密电文 
    puts(jc);
    
    //循环遍历char数组30次,从索引号0开始判断 
    for(int k=0;k<30;k++)
    {
        if(jc[k]>='A'&&jc[k]<='Z')
        {
            switch(jc[k])
            {
                case 'A':jc[k]='Z';break;
                case 'B':jc[k]='Y';break;
                case 'C':jc[k]='X';break;
                case 'D':jc[k]='W';break;
                case 'E':jc[k]='V';break;
                case 'F':jc[k]='U';break;
                case 'G':jc[k]='S';break;
                case 'H':jc[k]='R';break;
                case 'I':jc[k]='Q';break;
                case 'J':jc[k]='P';break;
                case 'K':jc[k]='O';break;
                case 'L':jc[k]='N';break;
                case 'M':jc[k]='M';break;
                case 'N':jc[k]='L';break;
                case 'O':jc[k]='K';break;
                case 'P':jc[k]='J';break;
                case 'Q':jc[k]='I';break;
                case 'R':jc[k]='H';break;
                case 'S':jc[k]='G';break;
                case 'U':jc[k]='F';break;
                case 'V':jc[k]='E';break;
                case 'W':jc[k]='D';break;
                case 'X':jc[k]='C';break;
                case 'Y':jc[k]='B';break;
                case 'Z':jc[k]='A';break;
            }
        }
        else if(jc[k]>='a'&&jc[k]<='z')
        {
            switch(jc[k])
            {
                case 'a':jc[k]='z';break;
                case 'b':jc[k]='y';break;
                case 'c':jc[k]='x';break;
                case 'd':jc[k]='w';break;
                case 'e':jc[k]='v';break;
                case 'f':jc[k]='u';break;
                case 'g':jc[k]='s';break;
                case 'h':jc[k]='r';break;
                case 'i':jc[k]='q';break;
                case 'j':jc[k]='p';break;
                case 'k':jc[k]='o';break;
                case 'l':jc[k]='n';break;
                case 'm':jc[k]='m';break;
                case 'n':jc[k]='l';break;
                case 'o':jc[k]='k';break;
                case 'p':jc[k]='j';break;
                case 'q':jc[k]='i';break;
                case 'r':jc[k]='h';break;
                case 's':jc[k]='g';break;
                case 'u':jc[k]='f';break;
                case 'v':jc[k]='e';break;
                case 'w':jc[k]='d';break;
                case 'x':jc[k]='c';break;
                case 'y':jc[k]='b';break;
                case 'z':jc[k]='a';break;
            }
        }
    }
    
    //输出破译电文 
    printf("\n破译电文数据:\n");
    puts(jc);
    
}

这个有很多种解题方法就不一一展示了,这个方法代码较多但比较通俗易懂。
(7)求一个3x3矩阵主对角线元素之和
矩阵主对角线例:
1 2 3
4 5 6
7 8 9
斜线元素1 5 9 连起来则是主对角线

解题代码如下:

main()
 {
    //初始定义 
    int juzhen[3][3],isum=0;
    //输入数据 
    printf("请输入3*3的矩阵数据:\n");
    //i行j列 
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            scanf("%d",&juzhen[i][j]);
        }
    }
    //输出3*3矩阵数组 以及对角线总和 
    printf("\n当前矩阵数据为:\n");
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            //第1行第0列时换行 
            if(j==0&&i==1)
            {
                printf("\n");
            }
            //第2行第0列时换行 
            if(j==0&&i==2)
            {
                printf("\n");
            }
            //输出i行j列数据 
            printf("%-3d",juzhen[i][j]);
        }
        isum=isum+juzhen[i][i]; 
    }
    printf("\n矩阵主对角线元素之和为:%d\n",isum);
  }

这些题都是C语言数组算法应用基础题,分享共勉共同进步,暂时先写到这里啦,困了。
ヾ( ̄ ̄)ByeBye

上一篇下一篇

猜你喜欢

热点阅读