这个题目看似简单,实则蕴含着编程思维训练的核心价值。作为计算机等级考试二级真题,它考察的不仅是基础语法掌握程度,更是对循环结构、数学思维和问题拆解能力的综合检验。在实际教学中,我发现很多初学者即使能写出代码,也往往说不清为什么要这样设计循环条件。
题目通常给出类似这样的描述:"编写程序输出指定行数的等腰三角形,例如输入3时输出如下图形:"
code复制 *
***
*****
python复制n = int(input())
for i in range(1, n+1):
print(' '*(n-i) + '*'*(2*i-1))
注意:Python中字符串乘法是快速生成重复字符的便捷方式,但要注意类型转换
python复制def print_triangle(rows):
max_width = 2 * rows - 1
for i in range(1, rows+1):
stars = '*' * (2*i - 1)
print(stars.center(max_width))
print_triangle(3)
| 特性 | 基础方案 | 进阶方案 |
|---|---|---|
| 代码简洁度 | ★★★★ | ★★★ |
| 可读性 | ★★★ | ★★★★ |
| 可扩展性 | ★★ | ★★★★ |
| 数学思维体现 | ★★★★ | ★★ |
对于n行三角形:
python复制# 错误示例1:range参数错误
for i in range(n): # 会少一行
...
# 错误示例2:未处理字符串拼接
print(' ' * n-i + '*' * 2i-1) # 语法错误
python复制spaces = n - i
stars = 2 * i - 1
line = ' ' * spaces + '*' * stars
print(line)
python复制print(f"行号:{i}, 空格数:{spaces}, 星号数:{stars}")
对于超大三角形(n>1000):
python复制import sys
sys.stdout.write(' '*(n-i) + '*'*(2*i-1) + '\n')
使用多线程处理每行生成(仅限n极大时):
python复制from concurrent.futures import ThreadPoolExecutor
def build_line(i, n):
return ' '*(n-i) + '*'*(2*i-1)
with ThreadPoolExecutor() as executor:
lines = list(executor.map(build_line, range(1,n+1), [n]*n))
print('\n'.join(lines))
在机房实际教学中,我发现先用纸笔画出变量关系图的学生,代码正确率提高40%。建议强制要求学生先完成以下表格:
| 行号 | 空格数计算 | 星号数计算 |
|---|---|---|
| 1 | 3-1=2 | 2×1-1=1 |
| 2 | 3-2=1 | 2×2-1=3 |
| 3 | 3-3=0 | 2×3-1=5 |
c复制#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
for(int i=1; i<=n; i++){
for(int j=1; j<=n-i; j++) printf(" ");
for(int j=1; j<=2*i-1; j++) printf("*");
printf("\n");
}
return 0;
}
java复制import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i=1; i<=n; i++){
System.out.println(" ".repeat(n-i) + "*".repeat(2*i-1));
}
}
}
| 特性 | Python | C | Java |
|---|---|---|---|
| 代码简洁度 | ★★★★ | ★★ | ★★★ |
| 执行效率 | ★★ | ★★★★ | ★★★ |
| 开发效率 | ★★★★ | ★★ | ★★★ |
| 适合场景 | 教学 | 嵌入式 | 企业级 |
参数校验:
python复制while True:
try:
n = int(input("请输入行数(1-50):"))
if 1<=n<=50: break
except ValueError:
pass
print("输入必须为1-50的整数")
单元测试:
python复制import unittest
class TestTriangle(unittest.TestCase):
def test_triangle3(self):
expected = " *\n ***\n*****\n"
self.assertEqual(build_triangle(3), expected)
性能测试:
python复制import timeit
timeit.timeit('build_triangle(100)', setup='from __main__ import build_triangle', number=1000)
在实际工程项目中,即使是简单的功能也要考虑:
这个看似简单的题目,如果深入挖掘可以扩展到软件工程的各个方面。我建议学生在完成基础版本后,尝试添加上述工程化特性,这对培养完整的开发思维很有帮助。