【C语言】C语言复合类型经典题目(内容全,有深度)

导读:本篇文章讲解 【C语言】C语言复合类型经典题目(内容全,有深度),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

✨作者:@小孙的代码分享

✨专栏:《C语言入门》

✨送给各位的一句话:空杯心态 才能学到新知

✨希望大家看完这些题目有所收获,别忘了,点赞+评论!

【C语言】C语言复合类型经典题目(内容全,有深度)

 

目录

前言😄

菱形图案🔥

 植树节🔥

 有序序列插入一个整数🔥

 回型矩阵🔥

 蛇形矩阵🔥

结束语😄


前言😄

先来给大家汇报一下最近的刷题情况,C语言的题基本已经复习完了。在刷的题目中我发现有一些有意思,有质量的题目,我觉得有必要写一篇博客来巩固巩固,顺便也可以和大家分享一下我的学习成果,如果有那些题目我做的不够好有问题,还望大佬指正,如果大家觉得好,也记得留下点赞和收藏奥。

菱形图案🔥

想必大家学习循环的时候都学着打印一个三角形,等腰三角形,直角三角形,下面就给大家来展示一下,循环打印菱形的过程。

【C语言】C语言复合类型经典题目(内容全,有深度)像这样,我们要实现多行输入,来打印一个菱形。

【C语言】C语言复合类型经典题目(内容全,有深度)

 之前有了打印等腰三角形的基础,那么菱形也就是锦上添花,请看代码:

#include<stdio.h>
//菱形图案
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        //将菱形分成两部分 上部是n+1行打印 下部是n行打印
        for (int i = 0; i < n + 1; i++)
        {
            for (int j = 0; j < n - i; j++)
            {
                printf(" ");
            }
            for (int j = 0; j <= i; j++)
            {
                printf("* ");
            }
            printf("\n");
        }

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j <= i; j++)
            {
                printf(" ");
            }
            for (int j = 0; j < n - i; j++)
            {
                printf("* ");
            }
            printf("\n");
        }
    }

    return 0;
}

 植树节🔥

每年都有植树节,我们好像没有真正的去种过树,那我们既然学习了编程,就用编程语言来实现一下。学着用代码来打印树的图案。

看一下图解:

【C语言】C语言复合类型经典题目(内容全,有深度)

 树叶部分就是循环打印三角形,就直接给大家上代码:

//植树节
#include<stdio.h>

int main()
{
    int n = 0, i = 0, j = 0;
    while (scanf("%d", &n) != EOF)
    {
        //全部树叶输出
        for (i = 1; i <= 3 * n; i++)
        {
            for (j = 0; j < 3 * n - i; j++)
                printf(" ");
            if ((i - 1) % 3 == 0)
            {
                //第一个空隙行
                for (j = 0; j < i; j++)
                {
                    if (j % 3 == 0)
                        printf("* ");
                    else
                        printf("  ");
                }
                printf("\n");
            }
            else if ((i + 1) % 3 == 0)
            {
                //第二个空隙行
                for (j = 1; j <= i; j++)
                {
                    if ((j % 3 == 0) && (j != 0))
                        printf("  ");
                    else
                        printf("* ");
                }
                printf("\n");
            }
            else
            {
                for (j = 1; j <= i; j++)
                    printf("* ");
                printf("\n");
            }
        }
        //树枝
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < 3 * n - 1; j++)
            {
                printf(" ");
            }
            printf("* \n");
        }
    }
    return 0;
}

这道题目我做了好久,是慢慢试出来的,我发现我做题大多时候不能一次性做对,都是靠一步一步试错,找到正解。不知道大家是不是也是这个样子呢?

 有序序列插入一个整数🔥

不知道大家对排序这块是不是很熟悉,我是一提到排序就头疼,那么下面这个题就是把一个整数插入到一个有序的序列中,也可以就直接当成数组吧。

题目要求如下:第一行输入一个整数N(0≤N≤50)。
                         第二行输入N个升序排列的整数,输入用空格分隔的N个整数。
                         第三行输入想要进行插入的一个整数,保证插入新数后,序列仍然是升序。

 【C语言】C语言复合类型经典题目(内容全,有深度)

我的思路是,创建一个数组来存放需要排序的数据,将要插入的数据作为数组的最后一个元素 ,然后只需要对数组进行升序的一个排序就可以完成题目要求,废话不多说,直接上代码:

//有序序列插入一个整数
#include<stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int i = 0;
    int arr[50];
    for (i = 0; i < n; i++) {
        scanf("%d ", &arr[i]);
    }
    int x = 0; //要插入的数字
    scanf("%d", &x);
    arr[n] = x; //将其放在末尾
    for (i = n; i > 0; i--)
    {
        if (arr[i] < arr[i - 1]) //将比x大的数往后移
        {
            int tmp = arr[i];
            arr[i] = arr[i - 1];
            arr[i - 1] = tmp;
        }
    }
    for (i = 0; i < n + 1; i++)
        printf("%d ", arr[i]);
    return 0;
}

【C语言】C语言复合类型经典题目(内容全,有深度)

下面难度就要上来了,下面的几个题,难住我好久,特别想和大家分享!!!

 回型矩阵🔥

学习编程,就是为了解决实际问题,当然也可以用来做一些计算题,比如矩阵的计算,逆置矩阵;那么我们就来提升一下,做一个回型矩阵。

问题来了,回型矩阵是什么样子?

【C语言】C语言复合类型经典题目(内容全,有深度)

 差不多就是这个样子,那么他是如何实现打印回型矩阵的哪?我刚拿到题也是一头雾水,想了想其实也就是个二维数组,拿上面那个图为例,就是个四行四列的二维数组。只是存储的方式有点刁钻。

【C语言】C语言复合类型经典题目(内容全,有深度)

按照—>第1行—>第n列—>第n行—>第1列来进行循环。

       —>第2行—>第n-1列—>第n-1行—>第2列(以n=4为例)。

既然都讲到这块了,想必大家也可以理解了,就直接给出大家我的代码:

//回型矩阵
#include<stdio.h>
int main()
{
    int i, j, k, n;
    int p, q;
    int a[20][20];
    int count;
    scanf("%d", &n);
    count = 0;
    p = 0;
    q = n - 1;
    while (count < n * n)
    {
        for (i = p; i <= q; i++)
            a[p][i] = ++count;
        for (i = p + 1; i <= q; i++)
            a[i][q] = ++count;
        for (i = q - 1; i >= p; i--)
            a[q][i] = ++count;
        for (i = q - 1; i >= p + 1; i--)
            a[i][p] = ++count;
        ++p;
        --q;
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%d ", a[i][j]);
        printf("\n");
    }

    return 0;
}

 是不是豁然开朗,茅塞顿开呢,我当时想到这块的时候是这个样子滴!

 蛇形矩阵🔥

刚看完回型我们就来提升一下,看看蛇形矩阵,能不能来一波手撕蛇形矩阵呢?

蛇形矩阵:

【C语言】C语言复合类型经典题目(内容全,有深度)

我们可以看见,移动的方向只有两个:

  • 右上
  • 左下

所以,我用pos变量表示方向,其中1代表右上与右,-1代表左下与下.
i代表————-j代表
运动情况分为6种:

  1. 碰到上边界(即i等于1 且 j小于n): 列增加1,行不变——–往右移动一格
  2. 碰到左边界(即j等于1 且 i小于n): 行增加1,列不变——–往下移动一格
  3. 碰到右边界(即j等于n): 行增加1,列不变——–往下移动一格
  4. 碰到下边界(即i等于n): 列增加1,行不变——–往右移动一格(以上四种是在边界上面移动.只有向右 和 向下)
  5. 除去上面四种的边界情况,就是在边界中间的左下移动
  6. 除去上面四种的边界情况,就是在边界中间的右上移动(最后两种是在边界内移动 只有右上和左下)

 还是和往常一样需要一个二维数组,因为数组的下标是从0开始,为了方便我便创建一个array[n+1][n+1]大的二维数组,这样我就可以不用管索引0,直接从坐标(1,1)开始.
因为题目要求n的范围是[1,1000],所以我创建二维数组array[1001][1001] 

下面直接来代码,手撕蛇形数组:

#include <stdio.h>
int array[1001][1001] = { 0 };
int main(void)
{
    int n = 0;
    scanf("%d",&n);
    int i = 1, j = 1, k = 0,pos = 1; //pos代表方向移动   1代表右上   -1代表左下
    array[i][j] = 1;
    for (k = 2; k <= n*n; k++)
    {
        if (i == 1 && j <n && pos ==1) //碰到上边界,列增加1,行不变     此后行增,列减
        {
            array[i][++j] = k;
            pos = -1;                 //方向注意
        }
        else if(j==1 && i<n && pos == -1)//碰到左边界,行增加1,列不变     此后行减,列增
        {
            array[++i][j] = k;
            pos = 1;                     //方向注意                
        }
        else if (j == n && pos==1) //碰到左边界,行增加1,列不变     此后行增,列减
        {
            array[++i][j] = k;
            pos = -1;                     //方向注意
        }
        else if (i == n && pos ==-1) //碰到右边界,列增加1,行不变    此后行减,列增
        {
            array[i][++j] = k;
            pos = 1;
        }
        else if (pos == 1)         //除去上面的边界情况,就是中间移动过程
        {
            array[--i][++j] = k;
        }
        else if(pos == -1)
        {
            array[++i][--j] = k;
        }
    }
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
            printf("%d ",array[i][j]);
        printf("\n");
    }
    return 0;
}

结果如下

【C语言】C语言复合类型经典题目(内容全,有深度)

 当然如果大家还有更好的方法,也请在评论区或者私信,咱们互相学习一下。今天就先搞到这里,把这两个矩阵消化消化。

结束语😄

这篇博客的重点还是在这几个二维数组的题上面,不仅让我自己又复习了一遍,又把它们分享给大家,希望对大家的学习有所帮助。今天的分享就先到这里,如果感觉有用就留下点赞,博主会定期更新一些题目,大家一起学习。

【C语言】C语言复合类型经典题目(内容全,有深度)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/119580.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!