BudingZY 发表于 2022-4-9 12:44:29

两段不同代码输出数字三角形有什么区别?【编程初学者】

本帖最后由 BudingZY 于 2022-4-9 12:45 编辑

#include <stdio.h>
int main(){

      int i,j;
      
      for(i=1;i<10;i++){
               
                for(j=9;j>i;j--){
                        printf(" ");
                }
                for(j=1;j<=i;j++){
                        printf("%d",j);
                }
                for(j=i-1;j>=1;j--){
                        printf("%d",j);
                }
                printf("\n");
      }

}


#include <stdio.h>
int main(){

int i,j,k;
for(i=1;i<=9;i++){
          for(j=9;j>i;j--){
                  printf(" ");
          }
          for(k=1;k<=(2*i+1)/2;k++){
                  printf("%c",48+k);
          }
          for(k=(2*i+1)/2;k>1;k--){
            printf("%c",48+k-1);
          }
          printf("\n");
}

}

这两段代码都是输出数字三角形,第一段是我自己写的,第二段是网上找的,从输出来看都差不多,那么实际上有什么区别的呢?求大佬解答,是运行速度有区别吗。







zzxhh628 发表于 2022-4-9 12:58:53

两种算法不一样,如果效果相同的话都可以,具体效率你可以用time()函数测试一下。

风车呼呼呼 发表于 2022-4-9 18:03:13

第一种j用到的地方也太多了点,一会用来计数空格,一会用来打印数字。单说这个程序没什么问题,但是习惯不太好,以后复杂程序这样搞可能会很难读,调试的时候也很麻烦。
第二种是通过ASCII码来打印数字,至少数字这块单拎出来了,安全性方面比较好。像第一种的j一旦出错,不光是格式会错,打印的数字内容也会错。

傻眼貓咪 发表于 2022-4-9 20:05:44

风车呼呼呼 发表于 2022-4-9 18:03
第一种j用到的地方也太多了点,一会用来计数空格,一会用来打印数字。单说这个程序没什么问题,但是习惯不 ...

你好,想请问:
1.)不是很明白你说的安全性
2.)第一种的 j 出错,全部错。那么第二种的 k 出错呢?不会错吗?

傻眼貓咪 发表于 2022-4-9 20:12:34

风车呼呼呼 发表于 2022-4-9 18:03
第一种j用到的地方也太多了点,一会用来计数空格,一会用来打印数字。单说这个程序没什么问题,但是习惯不 ...

如果是这样呢?
#include <stdio.h>

int main()
{
    for(int i = 1; i <= 9; i++){
      for(int j = 9; j > i; j--) printf(" ");
      for(int j = 1; j < i << 1; j++){
            if(j <= i) printf("%d", j);
            else printf("%d", (i << 1) - j);
      }
      printf("\n");
    }
    return 0;
}

风车呼呼呼 发表于 2022-4-9 21:07:06

傻眼貓咪 发表于 2022-4-9 20:05
你好,想请问:
1.)不是很明白你说的安全性
2.)第一种的 j 出错,全部错。那么第二种的 k 出错呢?不 ...

代码本身都能完成目标,只是要对比两种算法的话,那就是那样。
设计思路其实都是一样的,就是实现上面的略微差别。

第二种并不是说不会错,而是个人认为的习惯上的好坏。
就打印三角这一题来说,报错了或者输出内容有问题了,不管是哪一种,要找出是哪里的问题都不算难。
但如果带入大型项目里就不一样了。

试想一下,一个积木模型中有一块积木,这块积木一旦抽出整体就会散架。
看上去这块积木担当了多部分的支撑点,好像很简洁。
实际上除非是程序员想要实现的就是这样的功能,否则如果是这一点出错了,在复杂项目里就会报出很多错误,调试起来就很困难。

程序讲究要功能模块化,往小了定义变量也是一样的。
这题中的j既管了打印格式,也管着数字内容。
就逻辑思路上来说,格式上哪行有几个空格,与第n个位置上的数字是多少完全没有任何关系
所以代码实现上尽量也不要扯到一起。
模块区分清晰也便于以后读代码省力。

关于安全性的话,假设是一个大型项目,其中一个参数不必要的涉及到了多个重要模块,这个参数要是被骇客非法修改了,那原本只是表层一个数值显示错误,结果因为牵涉太广说不定系统都要崩溃。

{:10_327:}当然这些都是基于楼主问那两个代码的区别我才这样深挖了,{:10_245:}单看的话我自己都要觉得有点上纲上线了

桃花飞舞 发表于 2022-4-9 21:43:09

刚学习就关心运行速度了,感觉运行速度是一样的,都是一个for里套了三个for。或者一个for里套了两个for,
页: [1]
查看完整版本: 两段不同代码输出数字三角形有什么区别?【编程初学者】