输出复杂的菱形

今天听说同学去面试,其中有一道题是大一学C语言中的一道例题。

题目很简单,就是在命令提示符中输出一个任意高(奇数)的*号菱形(如下所示)。

//     *
//    ***
//   *****
//  *******
// *********
//***********
// *********
//  *******
//   *****
//    ***
//     *

但是在面试的时候HR让同学把实心菱形换成中间镂空的菱形(如下所示)。

//     *
//    * *
//   *   *
//  *     *
// *       *
//*         *
// *       *
//  *     *
//   *   *
//    * *
//     *

  

估计当时同学心里太紧张了,于是就没有想出来。

在回到住的地方的时候在QQ上问我这道题。

我大致想了下,就给出了如下的算法:

1.首先要考虑到WIN下的命令行一行为40个字符,因此考虑到输出图形的美观性,因此高度应该控制在40以内。

2.然后考虑图形在命令行中是如何输出的。(第一部分空格 -> *号 -> 第二部分空格-> *号 -> 换行符)

知道了上述的算法之后就可以考虑其中细节性的问题了:

1.图形在计算的时候分为几部分(2部分:上半部分、下半部分)

2.上半部分的第一部分的空格的计算方法(空格数=(高度+1)/2-当前行数)

3.上半部分的第二部分的空格的计算方法(空格数=(当前行数-1)*2-1)

4.下半部分的第一部分的空格的计算方法(空格数=(当前行数-(高度+1)/2))

5.下半部分的第二部分的空格的计算方法(空格数=((高度+1)/2-1)*2-1,每次再递减2)

之后就是敲击代码的工作了。

#include <iostream>

using namespace std;

int main(void){
	int lineNum;	//行数
	int firstSpaceNum;	//空格数
	int secondSpaceNum;
	int totalLineNum;
	
	cout << "请输入所要创建菱形的高(奇数):";
	cin >> totalLineNum;
	
	int maxSecondSpace = ((totalLineNum + 1) / 2 - 1) * 2 - 1; //菱形中的最大空格数
	
	if (1 == totalLineNum % 2 && totalLineNum < 40){
		for(lineNum = 1; lineNum <= totalLineNum; ++lineNum){
		
			//上半部分
			if(lineNum <= (totalLineNum + 1) / 2){
				//第一部分空格
				for(firstSpaceNum = 1; firstSpaceNum <= (totalLineNum + 1) / 2 - lineNum; ++firstSpaceNum){
					cout << " ";
				}
				//第一部分星号
				cout << "*";
		
				//第二部分空格
				if (lineNum > 1){
					for(secondSpaceNum = 1; secondSpaceNum <= (lineNum - 1) * 2 - 1; ++secondSpaceNum){
						cout << " ";
					}
					cout << "*";
				}
		
				cout << endl;
			} else {
				//下半部分
				if(totalLineNum != lineNum){
					//第一部分空格
					for(firstSpaceNum = 1; firstSpaceNum <= lineNum - ((totalLineNum + 1) / 2); ++firstSpaceNum){
						cout << " ";
					}
					cout << "*";
					
					//第二部分空格
					for(secondSpaceNum = 1, maxSecondSpace -= 2; secondSpaceNum <= maxSecondSpace; ++secondSpaceNum, maxSecondSpace - 2){
						cout << " ";
					}
					cout << "*";
				} else {
					//最后一行第一部分空格
					for(firstSpaceNum = 1; firstSpaceNum <= lineNum - ((totalLineNum + 1) / 2); ++firstSpaceNum){
						cout << " ";
					}
					cout << "*";
				}
			
				cout << endl;	
			}
		}
	} else {
		cout << "输入数值有误,程序自动退出...";
		return -1;
	}

	return 0;
}

  输出效果如下:

输出效果

原文地址:https://www.cnblogs.com/xiangsoft/p/2484741.html