鱼C论坛

 找回密码
 立即注册
查看: 1339|回复: 6

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

[复制链接]
发表于 2022-4-9 12:44:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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");
  }

}

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

Clipboard - 2022-04-09 12.44.01.png





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

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

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

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

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

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

当然这些都是基于楼主问那两个代码的区别我才这样深挖了,单看的话我自己都要觉得有点上纲上线了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-9 12:58:53 From FishC Mobile | 显示全部楼层
两种算法不一样,如果效果相同的话都可以,具体效率你可以用time()函数测试一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-9 18:03:13 | 显示全部楼层
第一种j用到的地方也太多了点,一会用来计数空格,一会用来打印数字。单说这个程序没什么问题,但是习惯不太好,以后复杂程序这样搞可能会很难读,调试的时候也很麻烦。
第二种是通过ASCII码来打印数字,至少数字这块单拎出来了,安全性方面比较好。像第一种的j一旦出错,不光是格式会错,打印的数字内容也会错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你好,想请问:
1.)不是很明白你说的安全性
2.)第一种的 j 出错,全部错。那么第二种的 k 出错呢?不会错吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-9 21:07:06 | 显示全部楼层    本楼为最佳答案   
傻眼貓咪 发表于 2022-4-9 20:05
你好,想请问:
1.)不是很明白你说的安全性
2.)第一种的 j 出错,全部错。那么第二种的 k 出错呢?不 ...

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

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

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

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

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

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

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
傻眼貓咪 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-9 21:43:09 | 显示全部楼层
刚学习就关心运行速度了,感觉运行速度是一样的,都是一个for里套了三个for。或者一个for里套了两个for,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-4 17:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表