今天听说同学去面试,其中有一道题是大一学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; }
输出效果如下: