文章目录
- 1. 介绍
- 2. 案例分析
- 3. 漏斗型
- 4. 直角三角形
- 4.1 左上直角三角形
- 4.2 右上直角三角形
- 4.3 左下直角三角形
- 4.4 右下直角三角形
- 5. 等腰三角形
- 5.1 正等腰三角形
- 5.2 倒等腰三角形
- 6. 平行四边形
- 6.1 纵向左下平行四边形
- 6.2 纵向左上平行四边形
- 6.3 横向左上平行四边形
- 6.4 横向左下平行四边形
- 7. 菱形
1. 介绍
这个初学循环的时候,可能会被布置为作业。这里我们介绍的不是找规律,而是这一类问题的通解。
其实这个问题可以被抽象为高中的线性规划
,只不过我们这里需要离散化直线
和区域内的点。
2. 案例分析
我们以漏斗型星号为例来分析。
如图所示,我们把坐标系给放正,需要(
n
=
4
n = 4
n=4)输出星号的点就是上面标的那些。显然这些点必须为整点。
实际上需要输出星号的点就是
N = n − 1 { ( r − c ) ( r + c − 2 N ) ≥ 0 0 ≤ r ≤ 2 N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} (r-c)(r+c-2N) \ge 0 \\ 0 \le r \le 2N \\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧(r−c)(r+c−2N)≥00≤r≤2N0≤c≤2N
r
r
r是行号,从
0
0
0行开始。
c
c
c是列号,从
0
0
0行开始。
这里
n
n
n是漏斗中心到底部的距离加一,
即
N
=
n
−
1
N=n-1
N=n−1
r
c
r\quad c
rc都需要是整数值。
3. 漏斗型
-
形状
-
区域表达式
N = n − 1 { ( r − c ) ( r + c − 2 N ) ≥ 0 0 ≤ r ≤ 2 N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} (r-c)(r+c-2N) \ge 0 \\ 0 \le r \le 2N \\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧(r−c)(r+c−2N)≥00≤r≤2N0≤c≤2N -
代码
#include <stdio.h>
void loudou_stars(int n) {
int r ;
int c ;
int N = n - 1;
for ( r = 0; r <= 2 * N; r++ ) {
for ( c = 0; c <= 2 * N; c++ ) {
if ((r - c) * (r + c - 2 * N) >= 0) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main()
{
int n = 4;
loudou_stars( n );
return 0;
}
- 结果
4. 直角三角形
4.1 左上直角三角形
-
形式
-
区域表达式
N = n − 1 { r + c − N ≤ 0 0 ≤ r ≤ N 0 ≤ c ≤ N N = n -1\\ \begin{align*} \begin{cases} r +c - N\le 0 \\ 0 \le r \le N \\ 0 \le c \le N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧r+c−N≤00≤r≤N0≤c≤N -
代码
#include <stdio.h>
void lu_trianle(int n) {
int r;
int c;
int N = n - 1;
for ( r = 0; r <= N; r++) {
for ( c = 0; c <= N; c++) {
if ( r + c - N <= 0 ) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main()
{
lu_trianle(5);
return 0;
}
4.2 右上直角三角形
- 形式
- 区域表达式
N = n − 1 { r − c ≤ 0 0 ≤ r ≤ N 0 ≤ c ≤ N N = n-1\\ \begin{align*} \begin{cases} r - c \le 0 \\ 0 \le r \le N \\ 0 \le c \le N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧r−c≤00≤r≤N0≤c≤N - 代码
#include <stdio.h>
void ru_trianle(int n) {
int r;
int c;
int N = n - 1;
for ( r = 0; r <= N; r++) {
for ( c = 0; c <= N; c++) {
if ( r - c <= 0 ) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main()
{
ru_trianle(5);
return 0;
}
4.3 左下直角三角形
其实对右上的三角形代码符号变一下就可以了
-
形式
-
区域表达式
N = n − 1 { r − c ≥ 0 0 ≤ r ≤ N 0 ≤ c ≤ N N = n-1\\ \begin{align*} \begin{cases} r - c \ge 0 \\ 0 \le r \le N \\ 0 \le c \le N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧r−c≥00≤r≤N0≤c≤N -
代码
#include <stdio.h>
void lb_trianle(int n) {
int r;
int c;
int N = n - 1;
for ( r = 0; r <= N; r++) {
for ( c = 0; c <= N; c++) {
if ( r - c >= 0 ) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main()
{
lb_trianle(5);
return 0;
}
4.4 右下直角三角形
将左上三角形换个符号就可以得到
- 形状
- 区域表达式
N = n − 1 { r + c − N ≥ 0 0 ≤ r ≤ N 0 ≤ c ≤ N N = n -1\\ \begin{align*} \begin{cases} r +c - N \ge 0 \\ 0 \le r \le N \\ 0 \le c \le N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧r+c−N≥00≤r≤N0≤c≤N - 代码
#include <stdio.h>
void rb_trianle(int n) {
int r;
int c;
int N = n - 1;
for ( r = 0; r <= N; r++) {
for ( c = 0; c <= N; c++) {
if ( r + c - N >= 0 ) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main()
{
rb_trianle(5);
return 0;
}
5. 等腰三角形
5.1 正等腰三角形
- 形状
- 区域表达式
N = n − 1 { r + c − N ≥ 0 r − c + N ≥ 0 0 ≤ r ≤ N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} r+c-N \ge 0 \\ r-c+N \ge 0\\ 0 \le r \le N\\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧r+c−N≥0r−c+N≥00≤r≤N0≤c≤2N
- 代码
#include <stdio.h>
void iso_trangle(int n) {
int N = n - 1;
int r;
int c;
for (r = 0; r <= N; r++) {
for (c = 0; c <= 2 * N; c++) {
if ((r + c - N >= 0 ) && (r - c + N >= 0)) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main() {
iso_trangle(5);
return 0;
}
5.2 倒等腰三角形
-
形状
-
区域表达式
N = n − 1 { r − c ≤ 0 r + c − 2 N ≤ 0 0 ≤ r ≤ N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} r - c \le 0 \\ r + c - 2N \le 0\\ 0 \le r \le N\\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧r−c≤0r+c−2N≤00≤r≤N0≤c≤2N -
代码
#include <stdio.h>
void iso_trangle_rev(int n) {
int N = n - 1;
int r;
int c;
for (r = 0; r <= N; r++) {
for (c = 0; c <= 2 * N; c++) {
if ((r - c <= 0 ) && (r + c - 2 * N <= 0)) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main() {
iso_trangle_rev(5);
return 0;
}
6. 平行四边形
6.1 纵向左下平行四边形
- 形状
- 区域表达式
N = n − 1 { r + c − N ≥ 0 r + c − 2 N ≤ 0 0 ≤ r ≤ 2 N 0 ≤ c ≤ N N = n-1\\ \begin{align*} \begin{cases} r + c - N \ge 0\\ r + c - 2N \le 0 \\ 0 \le r \le 2N\\ 0 \le c \le N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧r+c−N≥0r+c−2N≤00≤r≤2N0≤c≤N - 代码
#include <stdio.h>
void lb_parall(int n) {
int N = n - 1;
int r;
int c;
for (r = 0; r <= 2 * N; r++) {
for (c = 0; c <= N; c++) {
if ((r + c - N >= 0) && (r + c - 2 * N <= 0)) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main()
{
lb_parall(5);
return 0;
}
6.2 纵向左上平行四边形
- 形状
- 区域表达式
N = n − 1 { r − c ≥ 0 r − c − N ≤ 0 0 ≤ r ≤ 2 N 0 ≤ c ≤ N N = n-1\\ \begin{align*} \begin{cases} r - c \ge 0\\ r - c - N \le 0 \\ 0 \le r \le 2N\\ 0 \le c \le N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧r−c≥0r−c−N≤00≤r≤2N0≤c≤N - 代码
#include <stdio.h>
void lu_parall(int n) {
int N = n - 1;
int r;
int c;
for (r = 0; r <= 2 * N; r++) {
for (c = 0; c <= N; c++) {
if ((r - c >= 0) && (r - c - N <= 0)) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main()
{
lu_parall(5);
return 0;
}
6.3 横向左上平行四边形
-
形状
-
区域表达式
N = n − 1 { r − c ≤ 0 r − c + N ≥ 0 0 ≤ r ≤ N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} r - c \le 0\\ r - c + N \ge 0 \\ 0 \le r \le N\\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧r−c≤0r−c+N≥00≤r≤N0≤c≤2N -
代码
#include <stdio.h>
void lu_parall_h(int n) {
int N = n - 1;
int r;
int c;
for (r = 0; r <= N; r++) {
for (c = 0; c <= 2 * N; c++) {
if ((r - c <= 0) && (r - c + N >= 0)) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main()
{
lu_parall_h(5);
return 0;
}
6.4 横向左下平行四边形
-
形状
-
区域表达式
N = n − 1 { r + c − N ≥ 0 r + c − 2 N ≤ 0 0 ≤ r ≤ N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} r + c - N \ge 0\\ r + c - 2N \le 0 \\ 0 \le r \le N\\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧r+c−N≥0r+c−2N≤00≤r≤N0≤c≤2N -
代码
#include <stdio.h>
void lb_parall_h(int n) {
int N = n - 1;
int r;
int c;
for (r = 0; r <= N; r++) {
for (c = 0; c <= 2 * N; c++) {
if ((r + c - N >= 0) && (r + c - 2 * N <= 0)) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main()
{
lb_parall_h(5);
return 0;
}
7. 菱形
-
形状
-
区域表达式
N = n − 1 { r + c − N ≥ 0 r + c − 3 N ≤ 0 r − c + N ≥ 0 r − c − N ≤ 0 0 ≤ r ≤ 2 N 0 ≤ c ≤ 2 N N = n-1\\ \begin{align*} \begin{cases} r + c - N \ge 0 \\ r + c - 3N \le 0 \\ r - c + N \ge 0 \\ r - c - N \le 0\\ 0 \le r \le 2N\\ 0 \le c \le 2N \end{cases} \\ \end{align*} N=n−1⎩ ⎨ ⎧r+c−N≥0r+c−3N≤0r−c+N≥0r−c−N≤00≤r≤2N0≤c≤2N -
代码
#include <stdio.h>
void rhom_stars(int n)
{
int N = n - 1;
int r;
int c;
for ( r = 0;r <= 2 * N; ++r) {
for ( c = 0; c <= 2 * N; ++c) {
if ( (r + c - N >= 0 && r + c - 3 * N <= 0) && (r - c + N >= 0 && r - c - N <= 0)) {
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
int main()
{
rhom_stars(3);
return 0;
}