输出字符菱形的一个巧思
2026/8/2 5:59:13 网站建设 项目流程

输出字符菱形的一个巧思

  • 题目描述
    • 思路1(直接固定输出)
      • 基础语法(C语言前置语句,输出语句)
        • 1. 头文件
        • 2. 主函数定义
        • 3. 输出语句
        • 4. 返回值
        • 5. 代码格式
      • 思路1代码实现
    • 思路2(可推广的循环输出)
      • 基础语法(条件判断和循环,绝对值)
      • 思路2代码实现
    • 思路2的推广
      • 基础语法(输入语句)
      • 思路2推广的代码实现

题目描述

*构造一个对角线长5 55个字符,倾斜放置的菱形。

输入格式

没有输入要求。

输出格式

如样例所示。用*构成的菱形。

输入输出样例 #1

输入 #1

输出 #1

* *** ***** *** *

思路拆解

思路1(直接固定输出)

直接使用printf()输出每一行,但是要特别注意别忘写换行!好处是简单,但要求输出更大菱形时则倍显乏力,于是便诞生出思路2。作为作者第一个C语言笔记,我们不得不先回顾一下基础语法[doge]。(不想看,可先跳过)

基础语法(C语言前置语句,输出语句)

```c#include<stdio.h>intmain(){printf("Hello, World! \n");return0;}

这段简单的C语言程序包含了以下几个基础语法要点:

1. 头文件
#include<stdio.h>
  • #include是预处理指令,用于包含头文件
  • <stdio.h>是标准输入输出头文件,包含了printf()scanf()等函数的声明
  • 使用尖括号<>表示从系统目录中查找头文件
    <stdio.h>为什么叫标准输入输出头文件,英语比较好的小朋友应知道:
    std = standard 标准
    i = input 输入
    o = output 输出
    .h = header 头文件(header file)
2. 主函数定义
intmain(){// 函数体}
  • int表示函数的返回类型为整数
  • main是程序的入口函数,每个C程序必须有且只有一个main函数
  • ()内可以放置参数,这里为空表示不接受参数
  • {}花括号包裹函数体,包含要执行的语句
3. 输出语句
printf("Hello, World! \n");
  • printf()是标准输出函数,用于向屏幕输出文本
  • 双引号" "内的内容是字符串字面量
  • \n是转义字符,表示换行(newline)
  • 语句以分号;结尾,这是C语言的语法要求(一定不能忘了!)
    更多的输出语法:

printf()函数的功能远不止输出简单的字符串,它支持丰富的格式化输出功能:

1. 格式化输出基础

intage=25;floatscore=89.5;chargrade='A';charname[]="张三";printf("年龄:%d岁\n",age);// 输出整数printf("分数:%.1f分\n",score);// 输出浮点数,保留1位小数printf("等级:%c\n",grade);// 输出字符printf("姓名:%s\n",name);// 输出字符串

2. 常用格式说明符

  • %d%i:十进制整数
  • %f:浮点数(默认6位小数)
  • %.2f:浮点数,保留2位小数
  • %c:单个字符
  • %s:字符串

3. 宽度和精度控制

intnum=123;floatpi=3.14159;printf("%5d\n",num);// 输出宽度为5,右对齐: " 123"printf("%-5d\n",num);// 输出宽度为5,左对齐: "123 "printf("%05d\n",num);// 输出宽度为5,用0填充:"00123"printf("%.2f\n",pi);// 保留2位小数: "3.14"printf("%8.3f\n",pi);// 宽度8,保留3位小数:" 3.142"

4. 转义字符
除了\n(换行),printf()还支持其他转义字符,比如\t:水平制表符(Tab)

5. 输出多个值

inta=10,b=20;floatx=3.14,y=2.71;printf("a=%d, b=%d\n",a,b);// 输出:a=10, b=20printf("x=%.2f, y=%.2f, 和=%.2f\n",x,y,x+y);// 输出:x=3.14, y=2.71, 和=5.85

注意事项:

  1. 格式说明符必须与变量类型匹配,否则输出结果可能不正确
  2. printf()返回成功输出的字符数
  3. 可以使用%*动态指定宽度和精度
  4. 输出中文等宽字符时要注意编码问题(比如使用CLion来进行C语言编程时,运行程序中文出现乱码时,需加上system(“chcp 65001”);语句,同时要加头文件#include <stdlib.h>)
4. 返回值
return0;
  • return语句用于从函数返回值
  • 0表示程序正常退出,非0值通常表示错误代码
  • main函数中,返回值会传递给操作系统
  • 当然你也可以不加
5. 代码格式
  • 使用缩进(通常是4个空格或1个制表符)提高代码可读性
  • 适当的空行分隔不同逻辑部分(不然你受不了一坨屎山代码)
  • 注释使用//(单行)或/* */(多行)

思路1代码实现

#include<stdio.h>intmain(){printf("%s\n"," *");printf("%s\n"," ***");printf("%s\n","*****");printf("%s\n"," ***");printf("%s"," *");return0;}

输出

* *** ***** *** *

思路2(可推广的循环输出)

先从特殊情况考虑

要输出一个对角线长度为5的菱形,我们可以从以下几个步骤来思考:

  1. 分析菱形结构(分析输出目标)

    • 菱形由5行组成
    • 第1行:2个空格 + 1个星号
    • 第2行:1个空格 + 3个星号
    • 第3行:0个空格 + 5个星号(中心行)
    • 第4行:1个空格 + 3个星号
    • 第5行:2个空格 + 1个星号
  2. 确定输出策略

    • 可以使用两层循环:外层控制行数,内层控制每行的空格和星号
    • 先输出空格,再输出星号,最后换行(这意味着要计算每行对应的空格数与星号数)
    • 菱形分为上半部分(第1-3行)和下半部分(第4-5行)
  3. 数学逻辑实现

    • 设总行数 n = 5
    • 对于第 i 行(从1开始计数):
      • 空格数 = |n/2 + 1 - i| (取绝对值)
      • 星号数 = n - 2 × 空格数

基础语法(条件判断和循环,绝对值)

C语言的条件判断和循环语法与Java一致,这里以及后面不再赘述,详见博主的Java基础语法https://blog.csdn.net/BeiGuTing_code/article/details/163112335?spm=1001.2014.3001.5501
这里只讲C语言的abs()函数:

abs()函数是C语言标准库中的一个数学函数,用于计算整数的绝对值。

函数原型:

#include<stdlib.h>// 需要包含此头文件intabs(intn);

参数说明:

  • n:要计算绝对值的整数

返回值:

  • 返回参数n的绝对值(非负整数)

使用示例:

#include<stdio.h>#include<stdlib.h>// 包含 abs() 函数intmain(){inta=-5;intb=10;printf("abs(%d) = %d\n",a,abs(a));// 输出: abs(-5) = 5printf("abs(%d) = %d\n",b,abs(b));// 输出: abs(10) = 10printf("abs(%d) = %d\n",a-b,abs(a-b));// 输出: abs(-15) = 15return0;}

注意事项:

  1. abs()函数只能用于整数类型(int
  2. 如果要计算浮点数的绝对值,需要使用fabs()函数(需要包含<math.h>头文件)
  3. 使用前必须包含<stdlib.h>头文件

思路2代码实现

#include<stdio.h>#include<stdlib.h>intmain(){intn=5;// 菱形对角线长度for(inti=1;i<=n;i++){// 计算当前行的空格数intspaces=abs(n/2+1-i);// 输出空格for(intj=1;j<=spaces;j++){printf(" ");}// 输出星号intstars=n-2*spaces;for(intj=1;j<=stars;j++){printf("*");}// 换行printf("\n");}}

输出

* *** ***** *** *

思路2的推广

我们不满足于只能构造一个对角线长 5 个字符,倾斜放置的*菱形,而是想要根据用户输入得到一个对应*菱形。
特别说明,这里的菱形指的是:根据用户输入的正整数 n(n 为奇数),输出一个由星号(*)构成、对角线长度为 n 的字符菱形。
比如:

* * * *** *** *** * ***** ***** *** ******* * ***** *** *

基础语法(输入语句)

在C语言中,最常用的输入函数是scanf(),它用于从标准输入(通常是键盘)读取数据。

函数原型:

#include<stdio.h>// 需要包含此头文件intscanf(constchar*format,...);

基本用法:

intnum;scanf("%d",&num);// 读取一个整数到变量 num 中

参数说明:

  • format:格式控制字符串,指定要读取的数据类型和格式
  • ...:可变参数列表,对应要存储数据的变量地址

常用格式说明符:

  • %d:读取十进制整数
  • %f:读取浮点数(float)
  • %lf:读取双精度浮点数(double)
  • %c:读取单个字符
  • %s:读取字符串(遇到空格、制表符或换行符停止)

注意事项:

  1. 变量前必须加&取地址符(除了读取字符串到字符数组时可以不加)
  2. 格式字符串中的普通字符(非格式说明符)需要与输入严格匹配
  3. scanf()读取字符串时不会检查数组边界,存在缓冲区溢出风险

使用示例(基本信息输入输出):

#include<stdio.h>intmain(){intage;floatheight;charname[50];printf("请输入您的年龄:");scanf("%d",&age);printf("请输入您的身高(米):");scanf("%f",&height);printf("请输入您的姓名:");scanf("%s",name);// 注意:这里不需要 &,因为 name 是数组名printf("\n--- 输入信息 ---\n");printf("姓名:%s\n",name);printf("年龄:%d 岁\n",age);printf("身高:%.2f 米\n",height);return0;}

输入多个值(有限多个):

inta,b,c;// 输入三个整数,用空格或换行分隔scanf("%d %d %d",&a,&b,&c);

思路2推广的代码实现

在思路2的推广中,我们可以使用scanf()让用户输入菱形的大小:

#include<stdio.h>#include<stdlib.h>intmain(){intn;printf("请输入菱形的对角线长度(奇数):");// 提示语scanf("%d",&n);// 输入for(inti=1;i<=n;i++){// 计算当前行的空格数intspaces=abs(n/2+1-i);// 输出空格for(intj=1;j<=spaces;j++){printf(" ");}// 输出星号intstars=n-2*spaces;for(intj=1;j<=stars;j++){printf("*");}// 换行printf("\n");}}

输入输出示例

示例1:输入 3

请输入菱形的对角线长度(奇数):3 * *** *

示例2:输入 5

请输入菱形的对角线长度(奇数):5 * *** ***** *** *

示例3:输入 7

请输入菱形的对角线长度(奇数):7 * *** ***** ******* ***** *** *

示例4:输入 9

请输入菱形的对角线长度(奇数):9 * *** ***** ******* ********* ******* ***** *** *

注意事项:

  1. 程序要求输入奇数,如果输入偶数,程序不会报错但输出的菱形会不对称,为了防止这种情况,可以看看博主Java基础语法里的do-while循环里的示例2:至少执行一次的输入验证的例子
    https://blog.csdn.net/BeiGuTing_code/article/details/163112335?spm=1001.2014.3001.5501
  2. 输入的值越大,输出的菱形越大

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询