✨作者:@小孙的代码分享
✨专栏:《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;
}
植树节🔥
每年都有植树节,我们好像没有真正的去种过树,那我们既然学习了编程,就用编程语言来实现一下。学着用代码来打印树的图案。
看一下图解:
树叶部分就是循环打印三角形,就直接给大家上代码:
//植树节
#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个整数。
第三行输入想要进行插入的一个整数,保证插入新数后,序列仍然是升序。
我的思路是,创建一个数组来存放需要排序的数据,将要插入的数据作为数组的最后一个元素 ,然后只需要对数组进行升序的一个排序就可以完成题目要求,废话不多说,直接上代码:
//有序序列插入一个整数
#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;
}
下面难度就要上来了,下面的几个题,难住我好久,特别想和大家分享!!!
回型矩阵🔥
学习编程,就是为了解决实际问题,当然也可以用来做一些计算题,比如矩阵的计算,逆置矩阵;那么我们就来提升一下,做一个回型矩阵。
问题来了,回型矩阵是什么样子?
差不多就是这个样子,那么他是如何实现打印回型矩阵的哪?我刚拿到题也是一头雾水,想了想其实也就是个二维数组,拿上面那个图为例,就是个四行四列的二维数组。只是存储的方式有点刁钻。
按照—>第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;
}
是不是豁然开朗,茅塞顿开呢,我当时想到这块的时候是这个样子滴!
蛇形矩阵🔥
刚看完回型我们就来提升一下,看看蛇形矩阵,能不能来一波手撕蛇形矩阵呢?
蛇形矩阵:
我们可以看见,移动的方向只有两个:
- 右上和右
- 左下和下
所以,我用pos变量表示方向,其中1代表右上与右,-1代表左下与下.
用i
代表行————-j
代表列
运动情况分为6种:
- 碰到上边界(即i等于1 且 j小于n): 列增加1,行不变——–往右移动一格
- 碰到左边界(即j等于1 且 i小于n): 行增加1,列不变——–往下移动一格
- 碰到右边界(即j等于n): 行增加1,列不变——–往下移动一格
- 碰到下边界(即i等于n): 列增加1,行不变——–往右移动一格(以上四种是在边界上面移动.只有向右 和 向下)
- 除去上面四种的边界情况,就是在边界中间的左下移动
- 除去上面四种的边界情况,就是在边界中间的右上移动(最后两种是在边界内移动 只有右上和左下)
还是和往常一样需要一个二维数组,因为数组的下标是从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;
}
结果如下:
当然如果大家还有更好的方法,也请在评论区或者私信,咱们互相学习一下。今天就先搞到这里,把这两个矩阵消化消化。
结束语😄
这篇博客的重点还是在这几个二维数组的题上面,不仅让我自己又复习了一遍,又把它们分享给大家,希望对大家的学习有所帮助。今天的分享就先到这里,如果感觉有用就留下点赞,博主会定期更新一些题目,大家一起学习。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/119580.html