C语言入门之第五天:简单的图形输出专题
在C语言的初期学习之中还有我们的考试题目之中,经常会出现一些题目要求你使用一部分字符或者字母来实现简易图形的输出,例如,矩形、等腰三角形、“X”形等。通常使用到循环结构、if结构,如果这部分掌握的不好的同学可以回顾前面学过的。
所以我们今天来探讨一下如何实现简易图形的输出。
一、矩形(矩形的输出是最简单的,通常只需要两个嵌套的循环结构就可以输出一个m*n的矩形)
#include<stdio.h>
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int i,j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("*"); //暂定使用*构成矩形
}
printf("\n"); //每输出结束一行记得输出换行符实现换行
}
}
二、三角形
以等腰直角三角形为例:
我们可以在草稿纸上画个图进行分析:等腰直角三角形可以认为是 rowrow的矩形沿对角线分割而成的一部分,所以我们可以先写一个输出rowrow的矩形的代码,然后对于每一行进行修改,代码实现如下:
#include <stdio.h>
int main() {
int i, j, rows;
printf("请输入三角形的行数:");
scanf("%d", &rows);
for (i = 0; i < rows; i++) {
// 打印空格,使星号右对齐
for (j = 0; j < rows - i-1; j++) {
printf(" ");
}
// 打印星号
for (j = 0; j < i+1; j++) {
printf("*");
}
// 换行
printf("\n");
}
return 0;
}
结合代码还有自己画的图(以下为例)我们来进行修改的逻辑分析:
****/*
***/**
**/***
*/****
*/****
对于第0行而言(结合字符串和数组知识,第一行就是第0行)前四个*都应该改为输出空格,所以此时5-0-1输出4个空格,而打印星号时,发现第i行应该输出i+1个星号,所以使用i+1。
三、X型图案
我们以OJ系统22级C语言期中考试题为例:请编程序实现:输入一个不大于13的正整数n和一个大写字母ch,输出以字母ch为中心,边长为n的X形图案。其中,若从上往下看,在X图案4条边上的字母都是依次递增的。
在此,认为大写字母’A’-'Z’按顺序构成了一个环形结构,即’Z’与’A’是相邻的。如果n>13,或n<=0,或输入字母不为大写字母,则输出“Input Data Error.”并结束程序。
写这道题之前,首先我们要知道X型图案如何输出,其次要根据数字转化字母。我们来一步一步实现。
首先先实现X型图案的输出:
观察题目示例得知,题目之中所说的边长是一个分支的长度,例如:X到U的长度就是4,所以这道题我们可以理解为是一个(2n-1)*(2n-1)的矩形,如何对角线给替换成不同的字符,我们先使用星号来实现输出。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n); // 从用户输入获取 n 的值
int i,j;
for(i=0;i<2*n-1;i++){ // 外部循环,控制行数
for(j=0;j<2*n-1;j++){ // 内部循环,控制列数
if(j==i || j==2*n-i-2) // 如果 j 等于 i 或者 j 等于 2n - i - 2,则打印星号,否则打印空格
printf("*"); // 注意,以上两个表达式分别为矩形的主对角线和副对角线,可以当作结论记一下
else
printf(" ");
}
printf("\n"); // 在每行结束时打印换行符
}
return 0;
}
以上,我们实现了X图案的输出
接下来我们来将字母的变换带入其中
#include <stdio.h>
int main() {
int n;
char ch;
printf("请输入一个不大于13的正整数n和一个大写字母ch(例如:4 X): ");
scanf("%d %c", &n, &ch);
// 检查输入是否有效
if (n > 13 || n <= 0 || (ch < 'A' || ch > 'Z')) {
printf("Input Data Error.\n");
return 1; // 退出程序
}
int i, j;
char currentChar = ch-n+1; //我们根据输入的中心字母将ch向前移(n-1)位来得到第一个要输出的字母
if (currentChar < 'A') {
currentChar = 'Z' - ('A' - currentChar - 1);
}//if循环保证currentChar在大写字母范围之内
for (i = 0; i < 2*n-1; i++) {
for (j = 0; j < 2*n-1; j++) {
if (j==i || j==2*n-i-2) {
printf("%c", currentChar);
} else {
printf(" ");
}
}
printf("\n");
// 更新字母,确保它在大写字母范围内循环
if (currentChar == 'Z') {
currentChar = 'A';
} else {
currentChar++;
}
}
return 0;
}
if (currentChar == 'Z') {
currentChar = 'A';
} else {
currentChar++;
}
}
return 0;
}
以上,就是对这道题的解。