一.打印菱形
目标效果:
观察图像,将图像拆分为上下两半,分别用循环实现各自的打印
再观察一行中的元素,分为空格和*字符
实际代码的编写中,只要打印*左边的空格即可
#include <stdio.h>
#include <string.h>
void print_space(int i )
{
int j = 0;
for (j = 0; j < i; j++)
{
printf(" ");
}
}
int main()
{
char arr[] = "*************"; 初始化最中间的字符,将其放入数组
int len = strlen(arr);
int i = 0;
//打印上半部分
for (i = 6; i >= 0; i--)
{
print_space(i); //打印空格
printf("%s\n", arr + 2*i); //利用指针偏移找到数组中相对应的字符串
}
//打印下半部分
for (i = 1; i < 7; i++)
{
print_space(i);
printf("%s\n", arr + 2*i);
}
return 0;
}
这么写其实有点把循环给限制死了,如果菱形不是这么大,就要将循环中的条件全部换了。
最好是将要打印的行数也作为循环条件,这样可以适用于多种大小的菱形的打印。
#include <stdio.h>
int main()
{
int line = 0;
int i = 0;
scanf("%d", &line);//7
//打印上半部分
for (i = 0; i < line; i++)
{
//打印一行
//打印空格
int j = 0;
for (j = 0; j < line - 1 - i; j++)
{
printf(" ");
}
//打印*
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
//打印下半部分
for (i = 0; i < line - 1; i++)
{
//打印一行
int j = 0;
for (j = 0; j <= i; j++)
{
printf(" ");
}
for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
二.打印x形状图案
要求:多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
目标效果
#include <stdio.h>
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
int i = 0;
int j = 0;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(i == j) //打印左斜杠
printf("*");
else if(i+j == n-1)//因为行和列是从0开始的
printf("*"); //打印右斜杠
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
涉及多组输入,将scanf函数放入while的判断条件中
其中EOF意为 End Of FIle 在编译器中其实是一个宏定义常量
实际值为 -1
且输入 ctrl z 可以达到EOF的效果。也就是说,只有手动输入ctrl z 这个while循环才会结束
而scanf函数的返回值其实是它读取到的数据的个数。这里输入了一个数n,那它就返回 1
注意,是输入的数据的个数,而不是这个数据本身有多大。
这里使用了嵌套循环,外层循环实现行数的控制,内层循环实现每一行的打印的控制
难点在于内层循环中的代码实现。因为内层循环是遍历了一整行的所有数,观察图像中,每一行有两个*,其余都是空格。这时就可以用if语句来分别实现各自的打印。
三.带空格打印直角三角形
要求:多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。
目标效果:
#include <stdio.h>
int main()
{
int n = 0;
while(scanf("%d", &n) != EOF)
{
int i = 0;
//行数控制
for(i=0; i<n; i++)
{
//空格
int j = 0;
for(j=0; j<n-1-i; j++)
{
printf(" ");
}
//*
for(j=0; j<=i; j++)
{
printf("* ");
}
printf("\n");
}
}
return 0;
}
这题比较简单,只要观察行号和列号以及要打印的内容的数量,找到它们之间的关系,构造出循环即可。