使用SQL语句打印直角三角形五角星阵的N种方法

相信学习编程的,大多都做过下面或者类似下面的这样一道题:

打印如下图案:


★★
★★★
★★★★
★★★★★

不管使用什么高级编程语言,都能很轻松地使用二重循环完成对该图形的打印,例如想使用C#语言在控制台程序实现, 可以在程序主函数里面这样写:

1             for (int i = 1; i <= 5; i++)
2             {
3                 for (int j = 1; j <= i; j++)
4                 {
5                     Console.Write(‘★‘);
6                 }
7                 Console.WriteLine();
8             }
9             Console.ReadKey();

或者使用while二重循环:

 1             int i = 1;
 2             int j = 1;
 3             while (i <= 5)
 4             {
 5                 j = 1;
 6                 while (j < i)
 7                 {
 8                     Console.Write("★");
 9                     j += 1;
10                 }
11                 Console.WriteLine("★");
12                 i += 1;
13             }
14             Console.ReadKey();

但是大家有没有尝试用SQL语句写过呢?如果你按照上面方法的思路直接写或许会遇到一些问题。打开SQL Server Management Studio,登录进去后新建查询,在这里写SQL语句完成上面的题目。首先我按上面思路照着写了一个:

 1 declare @i int=1
 2 declare @j int=1
 3 while(@i<=5)
 4  begin
 5   set @j=1
 6   while(@j<@i)
 7    begin
 8     print‘★‘
 9     set @j+=1
10    end
11   print‘★‘
12   --print Char(10)
13   set @i+=1
14  end

在第12行,问题来了,C#Write()不换行,WriteLine()换行,能实现精确控制,但是SQL的“print”方法输出是默认换行的,如果我不加上print Char(10) (Char(10)代表换行键,也可以用Char(13)回车键代替,下同),那么执行结果便是只有一列,每行一个“★”,共有1+2+3+4+5=15行。如果我加上print Char(10),执行结果还是一列,只不过会按照第一行一个星,空两行,然后连续两行一个星,又空两行,然后又连续三行一个星这样的顺序排列下去。当然这样并没有达到我们原先题目的要求。要想达到题目要求,我们可以考虑定义一个字符串变量来存储“★”字符串,然后在循环的时候输出并累加一个“★”,如下所示:

1 declare @i int=1
2 declare @outstring nvarchar(5)=‘‘
3 while(@i<=5)
4  begin
5   set @outstring+=‘★‘
6   print @outstring
7   set @i+=1
8  end

这样就OK了。下面再介绍几种方式。

这种是添加完所有字符串(含换行符)再输出的:

 1 declare @i int=1
 2 declare @j int=1
 3 declare @outstring nvarchar(19)=‘‘
 4 while(@i<=5)
 5  begin
 6   set @j=1
 7   while(@j<=@i)
 8    begin
 9     set @outstring+=‘★‘
10     set @j+=1
11    end
12   set @outstring+=Char(10)
13   set @i+=1
14  end
15 print @outstring

这种是添加完所有字符串(没含换行符)再输出的:

 1 declare @i int=1
 2 declare @j int=1
 3 declare @outstring nvarchar(15)=‘‘
 4 while(@i<=5)
 5  begin
 6   set @j=1
 7   while(@j<=@i)
 8    begin
 9     set @outstring+=‘★‘
10     set @j+=1
11    end
12   set @i+=1
13  end
14 declare @index int=1
15 declare @start int=1
16 while(@index<=5)
17  begin
18  print substring(@outstring,@start,@index)
19  set @index+=1
20  set @start=@start+@index-1
21  end

这种方式用到了数据库的截取字符串函数。substring()的第三个参数指定子字符串的长度,在这里等于变量@index的值。

这种是已知星星个数,直接按样式输出:

 1 declare @i int=1
 2 declare @outstring nvarchar(15)=‘‘
 3 while(@i<=15)
 4  begin
 5   set @outstring+=‘★‘
 6   set @i+=1
 7  end
 8 declare @index int=1
 9 declare @start int=1
10 while(@index<=5)
11  begin
12  print substring(@outstring,@start,@index)
13  set @index+=1
14  set @start=@start+@index-1
15  end

这种是已知星星行数,直接按样式输出:

1  declare @i int=1
2  declare @outstring nvarchar(5)=‘‘
3  while(@i<=5)
4  begin
5   set @outstring+=‘★‘
6   print @outstring
7   set @i+=1
8  end

还有一种取巧的方式,大家应该注意到我定义@outstring时分配的大小是不一样的,有的是nvarchar(5),有的是nvarchar(15),还有的是nvarchar(19),实际上这是满足条件的最小值。当你设置的数字比这个数字大的时候,没事;当你设置的数字比这个数字小的时候,也不会报错,但是会显示不全。如果定义一个变量,在赋值的时候赋予了比长度更多的字符串,那么就会产生截断,但是不会报错,这是SQL的特性。本来这是我们应当注意的一个点,但我们也可以利用这个特性,写出“伪完成”的代码。例如将上面一段“添加完所有字符串(含换行符)再输出”的代码做如下改动:

 1 declare @i int=1
 2 declare @j int=1
 3 declare @outstring nvarchar(19)=‘‘
 4 while(@i<=10)--改变循环次数 5   begin
 6   set @j=1
 7   while(@j<=@i)
 8    begin
 9     set @outstring+=‘★‘
10     set @j+=1
11    end
12   set @outstring+=Char(10)
13   set @i+=1
14  end
15 print @outstring

本来while循环条件改成@i<=10,将会输出10行,但是由于只分配了19(15个“★”+4个换行键)个字符的长度,超出的部分就被截断,所以打印出来的效果还是能够符合题目的要求。如果改成分配26个字符的长度,就可以完整地输出六行,如果改成分配34个字符的长度,就可以完整地输出七行,以此类推,直到把所有(10行)全部输出为止。实际运用只需要一种方便且易扩展的就好了,像这种取巧的方式慎用,仅供娱乐。

用不同的方法解题可以锻炼思维,加深对知识本质的理解,希望大家能够从中获得启发,活学活用。

使用SQL语句打印直角三角形五角星阵的N种方法

时间: 2024-10-04 09:55:27

使用SQL语句打印直角三角形五角星阵的N种方法的相关文章

Ibatis,Mybatis利用log4j将SQL语句打印在控制台

在做一个项目Demo的时候,使用MyBatis+Spring,发现写好的SQL查询出来不对劲,但是也没报错, 所以想到用日志把SQL语句打出来.也参考了部分网友的代码,最后总结了一下,发现正常运行. 本人项目为Mybatis+SpringMVC,所有都已配置好,且正常运行. 此过程无需配置,直接在classPath目录创建log4j.properties,文件,并将下列代码粘贴进去即可,此代码部分参考网友. ### set log levels ### log4j.rootLogger = de

[BS-14] 打印NSArray和NSDictionary的3种方法

打印NSArray和NSDictionary的3种方法 NSArray *arr = @[@"奔驰",@"宝马",@"路虎",@"Tesla"]; //1.直接打印 NSLog(@"arr:%@",arr); //2.使用for...in遍历 for (NSString *str in arr) { NSLog(@"%@",str); } //3.使用枚举遍历 [arr enumerat

mybatis的Sql语句打印

我们在使用mybatis的时候,有时候,希望可以在eclipse的控制台下打印出来sql语句,但是有时候却不希望相关的语句打印.这个时候,需要我们进行一些配置.  在mybatis中,他通过调用一些接口,实现它的日志功能.mybatis在输出和打印日志的时候,会按照先调用容器自带的输出日志接口,如果没有再调用log4j的方式,进行日志的功能的实现.如果都没有,那么就不再提供日志功能,这个时候,它是不打印日志信息的. 那么,我们怎么配置使得控制台打印或者是不打印我们的sql语句呢? 在log4j的

如何将Hibernate生成的SQL语句打印到日志文件

背景:项目开发需要. 1 操作 只需要在log4j.properties中加入以下两行代码即可 #输出sql语句到日志 log4j.logger.org.hibernate.SQL=debug #将对应的参数占位符?换成传入的参数 log4j.logger.org.hibernate.type=trace 实验效果: 2017-09-05 16:51:26 [DubboServerHandler-thread-1] DEBUG org.hibernate.SQL (104) - select c

sql 语句 查询两个字段都相同的方法

这是替代方法 先使用着 select * from ofgroup where groupId in (select groupId from ofgroup where  uid ='".$_GET['value']."' and useraid='0') groupid定位死 就显示一个 与它对应的也是相同的 每个人的清况不一样 sql语句也大有区别

SQL语句的添加、删除、修改多种方法

SQL语句的添加.删除.修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是否有高手把更多灵活的使用方法贡献出来? 添加.删除.修改使用db.Execute(Sql)命令执行操作╔----------------╗☆ 数据记录筛选 ☆╚----------------╝注意:单双引号的用法可能有误(没有测式) Sql = "Select Distinct 字段名 From 数据表"Distinct函数,查询数据库存表内不重复的记录 Sql = "Select Count

C语言打印杨辉三角(2种方法)

杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来. 在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和.这就是我们用C语言写杨辉三角的关键之一.在高中的时候我们又知道,杨辉三角的任意一行都是的二项式系数,n为行数减1.也就是说任何一个数等于这个是高中的组合数.n代表行数减1,不代表列数减1.如:第五行的第三个数就为=6. 现在我们按第一种思路来写:先定义一个二维数组:a[N][N],略大于要打印的行数.再令两边的数为1,即当每行的第一个数和

SQL语句的添加、删除、修改多种方法 —— 基本操作

添加.删除.修改使用db.Execute(Sql)命令执行操作 ╔----------------╗ ☆ 数据记录筛选 ☆ ╚----------------╝ 注意:单双引号的用法可能有误(没有测试) Sql = "Select Distinct 字段名 From 数据表" Distinct函数,查询数据库存表内不重复的记录 Sql = "Select Count(*) From 数据表 where 字段名1>#18:0:0# and 字段名1< #19:00#

mysql 用sql 语句去掉某个字段重复值数据的方法

示例代码如下: create table tmp as select min(主键) as col1 from 去重表名 GROUP BY 去重字段; delete from 去重表名 where 主键 not in (select col1 from tmp); drop table tmp;