首页 > 其他分享 >用C语言实现输入一个奇数n,输出一个由*构成的n阶实心菱形

用C语言实现输入一个奇数n,输出一个由*构成的n阶实心菱形

时间:2024-08-07 20:27:45浏览次数:22  
标签:奇数 ++ 打印 C语言 空格 printf 033 图形 实心

样图示例:

一.基本思路

该问题的主要难点时是如何使用循环通过人为输入的指定长度来确定空格和星号的输出,我的想法是将图形以中间最长的一条线分为上下部分,然后分别用不同的变量来表示空格和星号的输出,最后通过c语言来实现对图形颜色和闪烁的控制。

二.具体实现

1.上半部分

首先我们先实现上半部分图形的打印

- - - *
- - * * *
- * * * * *
* * * * * * *

首先我们先要有规律的打印出空格,我在上图中用下划线代替了空格,用变量 i 和变量 j 来分别表示输出的行数和列数,用变量 n 来表示图形的阶数,首先空格的个数由上往下依次是3,2,1,0,而空格的行数 i 从上往下依次是0,1,2,3,由此可知 i<n/2+1(因为想要输出第四行因此加一),空格的列数 j 由上往下则是3,2,1,0,因此由观察可得j<n/2-i。由此上半部分空格输出的代码实现为:

for(i=0;i<n/2+1;i++)
{ 
  for(j=0;j<n/2-i;j++)
    {
      printf("_ ");
    }
 printf("\n\n");
} 

为了图形美观于是我加入了两个换行符,而打印出的结果应该为:

- - -
- -
-

接下来着手打印星号,由第一个图可知由上往下星号的数量分别为1,3,5,7,与打印空格的逻辑一样只不过这里 j 的范围由观察可得j<2*i+1,由此可的代码如下:

for(i=0;i<n/2;i++)
{ 
  for(j=0;j<n/2-i;j++)
    {
      printf(" _");
    }
  for(j=0;j<2*i+1:j++)
    {
      printf(" *");
    }
  printf("\n\n");
}

其打印出来的效果应该该如下:

- - - *
- - * * *
- * * * * *
* * * * * * *

2.下半部分

然后我们开始下半部分的图形输出,还是先打印空格设空格由上至下依次为1,2,3,行数 i 依旧为i<n/2,列数 j 为1,2.,3,由观察可得j<i+1,由此可得代码如下:

​
for(i=0;i<n/2+1;i++)
{
  for(j=0;j<n/2-i;j++)
    {
      printf(" _");
    }
  for(j=0;j<2*i+1;j++)
    {
      printf(" *");
    }
  printf("\n\n");
}
for(i=0;i<n/2;i++)
{
   for(j=0;j<i+1;j++)
   {
     printf(" _");
   }
  printf("\n\n");
}

​

其输出的结果应该为:

- - - *
- - * * *
- * * * * *
* * * * * * *
-
- -
- - -

由图像可知星号由上至下依次为5,3,1,行数 i 的范围不变,j 的范围变为j<n-2-2*i,由此完整的代码应该为:


for(i=0;i<n/2;i++)
{
   for(j=0;j<i+1;j++)
   {
      printf(" _");
   }
   for(j=0;j<n-2-2*i)
   {
      printf(" *"):
   }
 printf("\n\n");
}

可的到的图形输出为:

- - - *
- - * * *
- * * * * *
* * * * * * *
- * * * * *
- - * * *
- - - *

3.对图形颜色和闪烁的控制

若要实现对图形我们就要使用到printf的设置属性的功能:

设置文本颜色(30~37)重置文本所有属性:\033[0m
黑色:\033[30m设置粗体:\033[1m
红色:\033[31m

设置斜体:\033[3m

绿色:\033[32m设置下划线:\033[4m
黄色:\033[33m设置闪烁\033[5m
蓝色:\033[34m设置反显:\033[7m

洋红:\033[35m

青色:\033[36m
白色:\033[37m

由此完整代码应该如下:

#include <stdio.h>
int main()
{
	int n ;
	scanf_s("%d", &n);
	int i, j;
	printf("\033[5m\033[36m");
	for (i = 0; i < n / 2 + 1; i++)
	{
		for (j = 0; j < n / 2 - i; j++)
		{
			printf("  "); 
		}
		for (j = 0; j < 2 * i + 1; j++)
		{
			printf(" *");
		}
		printf("\n\n");
	
	}
	for (i = 0; i < n / 2; i++)
	{
		for (j = 0; j < i + 1; j++)
		{
			printf("  ");
		}
		for (j = 0; j < n - 2 - 2 * i; j++)
		{
			printf(" *");
		}
		printf("\n\n");
	}
	printf("\033[0m");
	return 0;
}

注意在使用颜色控制和设置文本属性的时候最后一定要重置所用文本属性。

这就是我所分享的内容如有错误敬请指出

标签:奇数,++,打印,C语言,空格,printf,033,图形,实心
From: https://blog.csdn.net/syfds/article/details/140968812

相关文章

  • 字符串左旋(c语言)
    1.字符串左旋//实现一个函数,可以左旋字符串的k个字符例如:ABCD左旋字符串的1个字符BCDA     ABCD左旋字符串的2个字符CDAB2.第一步我们先输入k(scanf),将第一位进行储存,然后其他位先前走一位,然后将第一位放在最后,然后进行打印。方法一#include<stdio.h>voidtest......
  • C语言实现猜数字小游戏
    游戏要求:1.电脑自动生成1-100的随机数2.玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了还是小了的反馈,直到猜对游戏结束1.随机数的生产C语言提供了一个函数叫rand,这个函数可以生产随机数,函数的原型如下所示:rand函数会返回一个伪随机数,这个随机数的大小是在0-32767(......
  • C语言随机数的生成
    目录前言一、 随机数⽣成1.rand2.srand 3.time4.设置随机数的范围 总结前言我们在前面已经学到了分支和循环结果,掌握了前面的知识,我们已经可以写一点有趣的代码了一、 随机数⽣成要想完成猜数字游戏,⾸先得产⽣随机数,那怎么产⽣随机数呢?1.randC语⾔提供了⼀......
  • C语言 操作符详解
    目录一、操作符的分类二、二进制和进制转换 2.1二进制转十进制 2.2二进制转八进制 2.3二进制转十六进制 三、原码、反码、补码四、移位操作符4.1左移操作符​编辑 4.2右移操作符五、位操作符按位与:&按位或:|按位异或:^按位取反:~六、逗号表达式七、操作......
  • 《重生到现代之从零开始的C语言生活》—— 调试
    前言:调试是几乎每一个计算机行业的人员必备的技能,那么让我们来学习一下吧bugbug这个词好像出现在生活的很多地方,一般指在电脑系统中或程序中,隐藏着一些未被发现的缺陷和问题,简称程序漏洞调试(debug)我们发现bug后,下一步就是找到问题并修复问题,找问题的过程就是调试调试一......
  • 《重生到现代之从零开始的C语言生活》——函数递归
    递归啥是递归啊递归是解决问的一种方式,简单来说,就是函数自己调用自己递归解决问题把复杂的大问题转化为一个一个与原文题相似的小问题。递归的思想就是把大事化小在递归中,递就是递推,归就是回归递归中的限制条件递归必须存在限制条件,当满足这个条件时,递归不在继续每次......
  • 超详细明了的C语言函数递归,望周知。(包含求n的阶乘顺序打印⼀个整数的每⼀位求第n个斐
    1.递归是什么?递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢?递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。写⼀个史上最简单的C语⾔递归代码#include<stdio.h>intmain(){printf......
  • 排序算法 归并排序 MergeSort -- C语言实现
    归并排序归并排序(Mergesort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(DivideandConquer)的一个非常典型的应用。作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法);自下......
  • C语言——一维二维数组详解
    文章目录数组数组的概念一维数组的创建和初始化数组创建数组的初始化数组的类型一维数组的使用数组下标数组元素的打印数组的输入sizeof计算数组元素个数一维数组在内存中的存储二维数组的创建二维数组的概念二维数组的创建二维数组的初始化不完全初始化完全初始化按......
  • C语言的分支和循环(下)
    前言一、while循环1.if和while的对比2.while语句的执行流程3. while循环的实践 二、for循环1.语法形式2. for循环的执行流程3.for循环的实践4.练习 三、do-while 1.语法形式:2. dowhile循环的执⾏流程 3.dowhile循环的实例 4.练习总结前言......