输出字符菱形的一个巧思
- 题目描述
- 思路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注意事项:
- 格式说明符必须与变量类型匹配,否则输出结果可能不正确
printf()返回成功输出的字符数- 可以使用
%*动态指定宽度和精度 - 输出中文等宽字符时要注意编码问题(比如使用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的菱形,我们可以从以下几个步骤来思考:
分析菱形结构(分析输出目标)
- 菱形由5行组成
- 第1行:2个空格 + 1个星号
- 第2行:1个空格 + 3个星号
- 第3行:0个空格 + 5个星号(中心行)
- 第4行:1个空格 + 3个星号
- 第5行:2个空格 + 1个星号
确定输出策略
- 可以使用两层循环:外层控制行数,内层控制每行的空格和星号
- 先输出空格,再输出星号,最后换行(这意味着要计算每行对应的空格数与星号数)
- 菱形分为上半部分(第1-3行)和下半部分(第4-5行)
数学逻辑实现
- 设总行数 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;}注意事项:
abs()函数只能用于整数类型(int)- 如果要计算浮点数的绝对值,需要使用
fabs()函数(需要包含<math.h>头文件) - 使用前必须包含
<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:读取字符串(遇到空格、制表符或换行符停止)
注意事项:
- 变量前必须加
&取地址符(除了读取字符串到字符数组时可以不加) - 格式字符串中的普通字符(非格式说明符)需要与输入严格匹配
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 * *** ***** ******* ********* ******* ***** *** *注意事项:
- 程序要求输入奇数,如果输入偶数,程序不会报错但输出的菱形会不对称,为了防止这种情况,可以看看博主Java基础语法里的do-while循环里的示例2:至少执行一次的输入验证的例子
https://blog.csdn.net/BeiGuTing_code/article/details/163112335?spm=1001.2014.3001.5501 - 输入的值越大,输出的菱形越大