zoukankan      html  css  js  c++  java
  • 输出复杂的菱形

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

      输出效果如下:

    输出效果

  • 相关阅读:
    LeetCode 1245. Tree Diameter
    LeetCode 1152. Analyze User Website Visit Pattern
    LeetCode 1223. Dice Roll Simulation
    LeetCode 912. Sort an Array
    LeetCode 993. Cousins in Binary Tree
    LeetCode 1047. Remove All Adjacent Duplicates In String
    LeetCode 390. Elimination Game
    LeetCode 1209. Remove All Adjacent Duplicates in String II
    LeetCode 797. All Paths From Source to Target
    LeetCode 1029. Two City Scheduling
  • 原文地址:https://www.cnblogs.com/xiangsoft/p/2484741.html
Copyright © 2011-2022 走看看