• 输出复杂的菱形


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

      输出效果如下:

    输出效果

  • 相关阅读:
    array.prototype.slice.call(arguments)
    axios 的坑
    Cannot read property 'range' of null
    IDEA导入Eclipse的JavaEE项目详细步骤链接
    使用 yarn 安装时,报错node_modules ode sass:Command failed.
    axios post请求非json传参设置
    vue-cli 3.x跨域配置
    idea错误: 找不到或无法加载主类
    Git 上传新项目
    Windows下生成SSH密钥
  • 原文地址:https://www.cnblogs.com/xiangsoft/p/2484741.html
Copyright © 2020-2023  润新知