pascal用for循环结构语句编程并输出下图: 1 333 55555 7777777 55555 333 1

2024-12-04 01:52:43
推荐回答(3个)
回答1:

思路:利用二重循环。

尽管通过一些附加的判断,也能完成本题,但似乎数学的意味少了。

对于本题来说,巧妙利用pascal中的数学函数,可以优化一下代码,就是下面的版本。


  1. min(x,y)表示x,y中较小的那个数;

  2. 有7行,最外层就用 i 从1 循环到 7 ;

  3. 每行都是输出奇数,1~4行还好判断,输出(2i-1)个(2i-1)就行了;

  4. 5~7行稍微麻烦点,通过分析,需要输出 2*min(i,8-i)-1 个 2*min(i,8-i)-1 ,代进去看看:

    第6行,i=6,min(i,8-i)的结果是2,因此2*min(i,8-i)-1 的结果是3,即输出3个3,正好符合(这个部分我想了很久)。

  5. 至于每行开头空格的个数,其实用一个 abs(4-i) 就可以了。(绝对值函数)



优化版:

uses math;         //调用数学库;

var i,j:integer;

begin

 for i:=1 to 7 do

 begin

  for j:=1 to abs(4-i) do write(' ');         //输出空格;

  for j:=1 to 2*min(i,8-i)-1 do

   write(2*min(i,8-i)-1);

  writeln;

 end;

end.


输出:


回答2:

1、这种问题弱到爆。能用就结贴,人的基本素质。
2、另外那位搞“优化”的哥们,提点小小建议:您的代码只是长度短了一点点,效率没有提高,反而下降。您知道Abs和Min函数编译展开后多长么?照这个道理我直接用Write输出字符岂不是更短,一行代码就行了。此外如果针对7这个数本身的特性来写程序,是不是太那个了,如果我最大输出的是9呢?或者是字符'Q'呢?
program Rhombus;
const
MAX = 7; {这个数可以改,1~9之间的奇数都行}
var
i, j, step: Integer;
begin
i := 1;
step := 2;
while i > 0 do
begin
for j := 1 to (MAX - i) div 2 do Write(#32);
for j := 1 to i do Write(i);
Writeln;
if i >= MAX then step := -step;
Inc(i, step);
end;
Readln;
end.

回答3:

哈哈,上学时常弄这个。
program XX;
var
m, n: Integer;
begin
for m := 1 to 7 do
begin
if m mod 2 <> 0 then for n := 1 to m do write(n);
writeln;
end;
for m := 5 downto 1 do
begin
if m mod 2 <> 0 then for n := 1 to m do write(n);
writeln;
end;
end.

现编的,没调试,自己试试吧(我这知道你的题意是否是分行?我加了writeln。如果不是分行就去掉它)