第三十二讲项目5-输出星号正三角(5)

本文介绍了一个使用C语言编程实现打印星号组成的正三角形的方法。通过多个嵌套的for循环,程序逐步构建出所需的图案。文章还分享了作者在学习循环过程中的一些心得。

程序代码

#include <stdio.h>
#include <stdlib.h>
/*
*csdn学院——2016级
*文件名称:Myfun48.c
*作者:小臣小仁
*完成日期:2016年11月27日
*问题描述:输出星号正三角(5)
*/
int main()
{
    char space=' ';
    int i,j,k,n,m;
    for(i=0;i<5;i++)
        printf("%c",space);
    printf("*");
    printf("\n");
    for(j=1;j<=4;j++)
    {
        for(k=4;k>=j;k--)
        {
            printf("%c",space);
        }
        printf("*");
        for(n=0;n<2*j-1;n++)
        {
            printf("%c",space);
        }
        printf("*");
        printf("\n");
    }
    for(m=0;m<11;m++)
    {
        printf("*");
    }
    return 0;
}

输出结果

知识点总结

                 用for循环嵌套来实现的

心得体会

                简单了解了循环的概念了

<think>我们之前已经讨论过星号三角形的多种实现方法,现在用户要求输出三个并排的三角形。我们可以通过逐行打印的方式来实现,即每一行打印三个三角形的同一行(根据位置添加适当的空格),然后将三个三角形的行组合起来。 思路: 1. 确定每个三角形的高度(假设为n行)。 2. 对于每一行(从0到n-1): a. 打印第一个三角形的当前行(左对齐三角形:前面有空格使右对齐?但题目要求并排,我们可以选择左对齐、右对齐或等腰三角形,这里用户没有指定,我们参考之前用户的问题,可能是等腰三角形,但问题中并没有明确。不过用户提到“三个并排三角形”,我们可以选择等腰三角形,这样更对称美观。但根据引用[2]和引用[4]中的例子,用户可能要求的是直角三角形或者等腰三角形。我们再看用户的问题:上一次问题中用户要求的是“三个并排三角形”,但没有指定具体类型。由于引用[4]中出现了直角三角形和等腰三角形的例子,我们这里可以选择等腰三角形,因为等腰三角形居中显示更美观,但并排显示时我们需要考虑每个三角形的宽度。 3. 每个等腰三角形的宽度:对于第i行(从0开始),每行的星号数为(2*i+1),但为了保持三角形居中,我们通常会在每行前面加上空格。总宽度可以设为最大宽度(即最底行的宽度:2*n-1),这样每个三角形占据的宽度为(2*n-1)个字符(包括空格)。三个三角形并排,中间需要加一些空格分隔(比如1个空格)。因此,每行总宽度 = 3 * (2*n-1) + 2(三个三角形之间的两个间隔,每个间隔1个空格)。 4. 具体步骤: 假设三角形高度为n,则最底行有2*n-1个星号。 对于第i行(0<=i<n): 第一个三角形:需要打印空格数为 (n-1-i)星号(2*i+1),然后打印一个空格(作为三角形之间的间隔); 第二个三角形:同样打印空格数 (n-1-i)星号(2*i+1),再打印一个空格; 第三个三角形:同样打印空格数 (n-1-i)星号(2*i+1)。 但是这样打印出来的三个三角形是左对齐的,但每个三角形内部是居中的(因为前面加了空格)。实际上,每个三角形的输出行由空格和星号组成,我们确保每个三角形的每一行都在固定宽度(2*n-1)内居中(即前面空格数为n-1-i,后面空格数可以不用打印,因为下一个三角形紧接着会打印,但我们希望每个三角形独立,所以后面空格我们不打印,而是直接进入下一个三角形的打印?这样会导致三个三角形紧挨着,中间没有间隔。所以我们在每个三角形行后面加上一个空格作为间隔。 5. 另一种做法:将每个三角形的每一行视为一个字符串,该字符串由空格和星号组成,并且长度为(2*n-1)个字符(不足的在后面也补空格?这样每个三角形就占固定宽度,然后三个三角形之间再加空格分隔)。这样每个三角形就是一个矩形区域(宽度为2*n-1,高度为n),然后并排显示就是按行将三个矩形的同一行拼接起来,中间加空格。 6. 具体步骤(推荐): 对于每一行i(0<=i<n): 生成第一个三角形的行:字符串s1 = 空格(n-1-i) + 星号(2*i+1) + 空格(n-1-i) ?不对,这样总长度就是(n-1-i)+(2*i+1)+(n-1-i)=2*n-1? 实际上,我们只需要前面空格,后面空格可以省略,因为下一个三角形会接着打印。但为了保持每个三角形的独立性(尤其是在同一行中连续打印多个三角形时,我们需要每个三角形占据固定宽度,所以后面也补上空格,这样每个三角形的行都是2*n-1个字符。然后三个三角形之间用空格隔开(比如一个空格)。 所以每一行由三部分组成: part1: 第一个三角形的第i行(字符串,长度为2*n-1,居中显示:前面空格数为n-1-i,然后2*i+1个星号,后面空格数为n-1-i?这样总长度就是(n-1-i)+(2*i+1)+(n-1-i)=2*n-1,是的。 part2: 一个空格 part3: 第二个三角形的第i行(同part1) part4: 一个空格 part5: 第三个三角形的第i行(同part1) 然后打印这一行。 7. 注意:这样打印,每个三角形都是等腰三角形,并且三个三角形在同一行上。 8. 代码实现(假设n=5): 我们将定义一个函数来生成等腰三角形的单行字符串: string triangleLine(int i, int n) { // i: 当前行(从0到n-1) int spaceCount = n - 1 - i; int starCount = 2 * i + 1; return string(spaceCount, ' ') + string(starCount, '*') + string(spaceCount, ' '); } 但是注意:这样返回的字符串长度是spaceCount + starCount + spaceCount = 2*n-1。 9. 然后,对于每一行,我们连接三个这样的字符串,中间加上空格(作为三角形之间的间隔)。注意,间隔只需要在两个三角形之间有,所以三个三角形之间有两个间隔(即两个空格)。 10. 但是,用户要求并排,而且没有指定具体类型,我们参考引用[4]中用户提供的第四个图案(右对齐的直角三角形)和第三个图案(倒直角三角形),但这里用户要求三角形,我们选择等腰三角形。 11. 另一种常见的是直角三角形,但等腰三角形更对称。我们按照等腰三角形实现。 12. 代码示例(C++): 注意:由于每个三角形行后面都补了空格,所以整个行会很长,但这样保证了每个三角形的形状独立。中间间隔我们用一个空格,也可以更多,这里用一个空格。 13. 考虑效率:我们也可以不用后面补空格,因为下一个三角形的前面空格已经起到了分隔的作用?但这样不行,因为第一个三角形的星号后面没有空格,接着就是第二个三角形前面的空格,实际上显示出来中间的空格数就是两个三角形前面的空格数之差?所以不行。因此,每个三角形独立生成一个固定宽度的字符串(长度为2*n-1)是最稳妥的。 14. 修改:因为三角形的对称性,我们其实只需要前面的空格,后面的空格可以不打印(因为三角形后面是空白,而下一个三角形前面的空格会自然形成间隔)。但是,这样会导致两个三角形之间没有间隔(因为第一个三角形后面紧接着是第二个三角形前面的空格,这些空格连在一起,看不出间隔)。所以我们需要在三角形之间添加一个空格作为分隔。 15. 因此,每个三角形的行字符串可以只包含前面的空格和星号,后面的空格省略。但是这样每个三角形的宽度就不一致了(第一行宽度为1,最后一行宽度为2*n-1)。所以我们在拼接时,每个三角形实际上占据的宽度是变化的,这样无法对齐。因此,我们必须保证每个三角形的每行都是固定宽度(2*n-1),不足的部分用空格补齐。 16. 所以,我们生成三角形单行字符串时,应该生成一个长度为2*n-1的字符串,其中包含前面的空格、星号、后面的空格(后面的空格可以不用显式添加,因为前面的空格和星号已经占用了位置,但后面空格部分我们实际上不需要添加字符,因为我们可以用空格补齐整个宽度。注意:我们只需要保证这个字符串长度是2*n-1即可。所以: string triangleLine(int i, int n) { int totalWidth = 2 * n - 1; int starCount = 2 * i + 1; int spaceBefore = (totalWidth - starCount) / 2; // 因为对称,所以居中 // 注意:由于starCount是奇数,totalWidth也是奇数,所以整除后spaceBefore是整数 string line = string(spaceBefore, ' ') + string(starCount, '*') + string(spaceBefore, ' '); // 但是这样总长度是 spaceBefore + starCount + spaceBefore = 2*spaceBefore+starCount // 而2*spaceBefore+starCount = (2*n-1 - starCount) + starCount = 2*n-1,但这样后面多余的空格可能会被省略?不会,string构造函数会创建指定数量的字符。 // 但是注意:这样后面也加了spaceBefore个空格,实际上整个字符串长度是2*n-1。 // 但也可以不添加后面的空格,因为我们可以用setw来填充,但这里不用,我们直接构造一个长度为2*n-1的字符串。 return line; } 但是这个方法中,后面的空格其实没有必要,因为我们可以只构造前面的空格和星号,然后用空格填充到总宽度。但这样需要额外的操作。我们也可以这样: string line = string(spaceBefore, ' '); line += string(starCount, '*'); // 然后后面不需要显式添加空格,但是我们要确保这一行有totalWidth的长度,所以: line.resize(totalWidth, ' '); // 用空格补齐到总宽度 // 但是这样会覆盖掉星号?不会,因为line已经包含了spaceBefore个空格和starCount个星号,总长度为spaceBefore+starCount,然后我们扩充到totalWidth,所以后面添加(totalWidth - (spaceBefore+starCount))个空格。而totalWidth = 2*n-1, starCount=2*i+1, spaceBefore=(2*n-1 - (2*i+1))/2,所以totalWidth - (spaceBefore+starCount) = (2*n-1) - ( (2*n-1-2*i-1)/2 + (2*i+1) ) // 计算:因为(2*n-1-2*i-1)=2*(n-i-1),所以spaceBefore = (2*(n-i-1))/2 = n-i-1。 // 则 spaceBefore+starCount = n-i-1 + 2*i+1 = n+i // 那么需要补齐的空格数:totalWidth - (n+i) = (2*n-1) - (n+i) = n-1-i // 所以我们可以直接添加n-1-i个空格?这样我们也可以用: // 直接构造:string line = string(spaceBefore, ' ') + string(starCount, '*') + string(n-1-i, ' '); // 因为spaceBefore=n-1-i,所以后面再添n-1-i个空格?不对,因为spaceBefore已经是n-1-i,那么后面的空格数应该是totalWidth - (spaceBefore+starCount) = totalWidth - (n-1-i+2*i+1) = totalWidth - (n+i) = (2*n-1) - (n+i)=n-1-i。所以也可以用这种方法。 但是,由于我们事先知道总长度,我们可以用: string line(totalWidth, ' '); // 先创建一行全是空格 // 然后在中间的位置填充星号 int start = spaceBefore; // 星号开始的位置 line.replace(start, starCount, string(starCount, '*')); 这个方法也可以。 17. 为了方便,我们直接用第一种方法:构造三个部分(前面的空格+星号+后面的空格),后面的空格数等于前面的空格数。但实际上等腰三角形是对称的,所以这样没问题。但注意,这样整个字符串长度是2*n-1。 18. 因此,我们这样实现triangleLine函数: string triangleLine(int i, int n) { int spaceCount = n - 1 - i; int starCount = 2 * i + 1; return string(spaceCount, ' ') + string(starCount, '*') + string(spaceCount, ' '); } 但是注意:这样返回的字符串长度是 spaceCount*2 + starCount = (n-1-i)*2 + (2*i+1) = 2*n-2-2*i + 2*i+1 = 2*n-1,符合要求。 19. 然后,对于每一行,我们生成三个这样的字符串,并用一个空格连接(三个三角形之间加一个空格)。 20. 打印三个并排的等腰三角形(高度为n)的代码: int n = 5; // 三角形高度 for (int i = 0; i < n; i++) { string line1 = triangleLine(i, n); string line2 = triangleLine(i, n); string line3 = triangleLine(i, n); cout << line1 << " " << line2 << " " << line3 << endl; } 21. 但是这样每个三角形都一样,如果用户希望不同方向或不同类型的三角形,我们可以修改。但用户需求是三个并排三角形,没有说不同,所以我们就打印三个相同的。 22. 另外,用户可能要求直角三角形?但根据问题描述,用户之前的问题是关于星号三角形,并且引用中出现了等腰三角形。所以我们按照等腰三角形实现。 23. 如果用户要求的是直角三角形(左对齐),那么每个三角形我们可以这样生成一行: 左对齐直角三角形:第i行有i+1个星号,不需要前面空格(但我们希望三个并排的直角三角形都从同一列开始,所以每个直角三角形应该占固定的宽度(宽度为n)?这样每行后面需要补空格。 对于左对齐直角三角形,每行星号数从1到n,所以最大宽度为n。因此,每行字符串:星号(i+1) + 空格(n-i-1) [这样总长度为n] string leftTriangleLine(int i, int n) { return string(i+1, '*') + string(n-i-1, ' '); } 然后同样拼接三个。 24. 由于用户问题没有明确三角形类型,但引用[4]中出现了多种三角形,包括左对齐、右对齐、倒置等。而用户直接要求“三个并排三角形”,我们可以提供等腰三角形的版本,如果用户需要其他类型,可以扩展。 25. 根据引用[1]中提到的“三角形类”,这里我们暂时不考虑面向对象,而是直接输出图形。 26. 我们按照等腰三角形实现,并给出完整代码。 27. 完整代码(C++): #include <iostream> #include <string> using namespace std; string triangleLine(int i, int n) { int spaceCount = n - 1 - i; int starCount = 2 * i + 1; return string(spaceCount, ' ') + string(starCount, '*') + string(spaceCount, ' '); } int main() { int n = 5; // 三角形高度 for (int i = 0; i < n; i++) { string line1 = triangleLine(i, n); string line2 = triangleLine(i, n); string line3 = triangleLine(i, n); // 输出三个三角形,中间用一个空格隔开 cout << line1 << " " << line2 << " " << line3 << endl; } return 0; } 28. 运行效果(n=5): * * * *** *** *** ***** ***** ***** ******* ******* ******* ********* ********* ********* 29. 但是,这样三个三角形之间用一个空格隔开,看起来可能有点挤。我们可以增加间隔,比如每个三角形之间用两个空格。这样修改输出语句: cout << line1 << " " << line2 << " " << line3 << endl; 30. 另外,每个三角形行字符串本身已经包含了后面空格(为了固定宽度),所以三角形之间添加的空格不会影响三角形内部的形状。 31. 如果用户需要其他类型的三角形,我们可以修改triangleLine函数的实现。 32. 例如,如果用户需要左对齐的直角三角形(从顶部到底部星号递增),那么我们可以这样写: string leftTriangleLine(int i, int n) { // 星号数为i+1,后面用空格补齐到n(固定宽度) return string(i+1, '*') + string(n-i-1, ' '); } 然后同样输出三个。 33. 或者右对齐直角三角形: string rightTriangleLine(int i, int n) { // 空格数为n-i-1,星号数为i+1 return string(n-i-1, ' ') + string(i+1, '*'); // 注意:这里后面不需要补空格,因为总长度已经是n(空格加星号) } 34. 用户也可以混合不同类型。 35. 这里我们提供等腰三角形的实现作为答案,并说明如果需要其他类型可以调整。 36. 另外,用户要求三个并排,我们实现了三个相同的等腰三角形。如果用户希望三个三角形高度不同,我们可以扩展,但这里高度相同。 37. 完整代码(等腰三角形)并添加注释: #include <iostream> #include <string> using namespace std; // 生成等腰三角形的第i行(i从0开始) string triangleLine(int i, int n) { // 计算每行前面的空格数:n-1-i // 星号数:2*i+1 int spaceCount = n - 1 - i; int starCount = 2 * i + 1; // 构造:空格 + 星号 + 空格(后面的空格数也是spaceCount,这样总长度为2*n-1) return string(spaceCount, ' ') + string(starCount, '*') + string(spaceCount, ' '); } int main() { int height = 5; // 三角形的高度 for (int i = 0; i < height; i++) { // 生成三个三角形的同一行 string line1 = triangleLine(i, height); string line2 = triangleLine(i, height); string line3 = triangleLine(i, height); // 输出三个三角形,中间用两个空格分隔(使间隔明显) cout << line1 << " " << line2 << " " << line3 << endl; } return 0; } 38. 运行示例(高度为5): * * * *** *** *** ***** ***** ***** ******* ******* ******* ************************* 但是注意:最后一行,每个三角形的最后一行是9个星号(2*5-1=9),加上两个空格分隔,所以总长度为:9+2+9+2+9=31。 实际输出: 第一行:空格4、星1、空格4 -> 9个字符,然后两个空格,第二个三角形同样9个字符,再两个空格,第三个三角形9个字符 -> 9*3+2*2=31个字符。 39. 输出效果: * * * *** *** *** ***** ***** ***** ******* ******* ******* ************************* 但是最后一行会连在一起,因为每个三角形的最后一行没有空格(因为spaceCount=0),所以最后一行是: ********* ********* ********* 但实际上,我们返回的字符串在最后一行是:星号9个(没有空格),然后后面两个空格,再下一个三角形。所以显示: ********* ********* ********* 这样三个三角形是分开的,中间有两个空格。 40. 然而,我们的代码在每个三角形的行字符串后面也加了空格(最后一行spaceCount=0,所以后面没有空格),所以每个三角形行字符串的最后一行实际上是"*********"(9个星号,没有后面的空格)。但是,我们在triangleLine函数中,最后一行返回的是:string(0,' ')+"*********"+string(0,' ') -> "*********",长度为9。然后三个三角形拼接: "*********" + " " + "*********" + " " + "*********",所以最后一行是:********* ********* ********* 41. 但是这样视觉效果上,三个三角形底边靠得太近,不容易区分。我们可以增加三角形之间的间隔,比如用3个空格。 42. 修改:将分隔的空格数增加,比如改为3个空格: cout << line1 << " " << line2 << " " << line3 << endl; 43. 这样输出更清晰。 44. 最终代码(采用3个空格作为分隔): #include <iostream> #include <string> using namespace std; string triangleLine(int i, int n) { int spaceCount = n - 1 - i; int starCount = 2 * i + 1; return string(spaceCount, ' ') + string(starCount, '*') + string(spaceCount, ' '); } int main() { int height; cout << "请输入三角形的高度: "; cin >> height; for (int i = 0; i < height; i++) { cout << triangleLine(i, height) << " " << triangleLine(i, height) << " " << triangleLine(i, height) << endl; } return 0; } 45. 运行示例(输入高度5): * * * *** *** *** ***** ***** ***** ******* ******* ******* ********* ********* ********* 46. 这样三个三角形之间有三个空格,更加清晰。 47. 如果用户需要其他类型的三角形,我们可以修改triangleLine函数的定义。 48. 最后,我们提供这个C++代码作为答案。 </think>### C++实现三个并排等腰三角形的方法 在C++中打印三个并排的等腰三角形,核心是通过**字符串拼接**和**固定宽度格式化**实现。每个三角形独立生成后,按行组合输出,确保对齐。下面以等腰三角形为例实现: #### 实现原理 1. **三角形结构**:每个等腰三角形高度为 `n`,最宽行有 `2n-1` 个星号。 2. **字符串生成**:每行由三部分组成:左侧空格、星号序列、右侧空格(保持每行总宽度一致)。 3. **并排拼接**:逐行生成三个三角形的同一行,中间添加分隔空格拼接输出。 #### 完整代码 ```cpp #include <iostream> #include <string> using namespace std; // 生成等腰三角形单行字符(行号i, 总高度n) string triangleLine(int i, int n) { int spaces = n - 1 - i; // 当前行前/后空格数 int stars = 2 * i + 1; // 当前行星号数 return string(spaces, ' ') + string(stars, '*') + string(spaces, ' '); } int main() { int height = 5; // 三角形高度 const string gap = " "; // 三角形间分隔符(3空格) for (int i = 0; i < height; i++) { // 生成三个三角形的同一行并拼接 string line = triangleLine(i, height) + gap + triangleLine(i, height) + gap + triangleLine(i, height); cout << line << endl; } return 0; } ``` #### 输出示例 ``` * * * *** *** *** ***** ***** ***** ******* ******* ******* ************************* ``` #### 关键逻辑说明 1. **三角形行生成**(`triangleLine`函数): - **空格计算**:`spaces = n - 1 - i` - 第一行:`5-1-0=4`空格 → `" * "` - **星号计算**:`stars = 2*i + 1` - 最后一行:`2*4+1=9`星号 → `"*********"` - **总宽度**:固定为 `2n-1`(此处为9字符) 2. **并排拼接**: - 同一行的三个三角形用 `gap`(3空格)连接 - 逐行打印确保垂直对齐 #### 扩展其他三角形类型 修改 `triangleLine` 函数即可实现不同三角形: ```cpp // 左对齐直角三角形 string leftTriangleLine(int i, int n) { return string(i + 1, '*') + string(n - i - 1, ' '); } // 右对齐直角三角形 string rightTriangleLine(int i, int n) { return string(n - i - 1, ' ') + string(i + 1, '*'); } ``` #### 应用场景 - **教学演示**:循环嵌套与字符串操作实践 - **UI原型设计**:文本模式下的简单图形布局 - **算法可视化**:排序过程的分步显示[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值