V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
loveis0
V2EX  ›  程序员

关于 C 语言的一个问题,希望懂的可以回答一下(初学者拜谢)

  •  
  •   loveis0 · 2015-09-10 20:30:51 +08:00 · 3887 次点击
    这是一个创建于 3389 天前的主题,其中的信息可能已经有所发展或是发生改变。
    int main (int argc, const char * argv[]) {
    // for (int c = 0; c < 5; c++) {
    // for (int n = 0; n < 3; n++) {
    // printf (" ");
    // }
    // }
    int count = 0;
    for (int i = 1; i <= 9; i++) {
    printf (" %c",count );
    for (int j = 1; j <= i; j++) {
    printf ("%c%i*%i=%i\t",count,j,i,i*j );
    }
    printf ("\n");
    count++;
    }
    return 0;
    }


    代码在上面,但是敲了半天实在是琢磨不出来。

    我想把 99 乘法表像以下这行代码这样实现出来,像一座山一样。

    int main (int argc, const char * argv[]) {
    // int count = 0;
    for (int i = 0; i < 7; i++) {
    for (int j=i; j < 7; j++) {
    printf (" ");
    }
    for (int n=0; n <= i*2; n++) {
    printf ("*");
    }
    printf ("\n");
    // count++;
    }
    return 0;
    }

    因为我是初学者,所以搞不太懂哪里没做对,麻烦懂的人,亲切回答一下。。。
    27 条回复    2015-09-12 12:52:02 +08:00
    zodiac1111
        1
    zodiac1111  
       2015-09-10 21:02:33 +08:00
    我也不懂,但是代码如果格式化一下,应该会有更多人愿意看看.
    vixvix
        2
    vixvix  
       2015-09-10 21:43:37 +08:00
    我试了试,能跑... 你出啥问题了?
    loveis0
        3
    loveis0  
    OP
       2015-09-10 22:10:21 +08:00
    @vixvix 不是能不能跑的问题,我上面说了呀,想要代码 1 类似于代码 2 那样,输出成一个形状。。。。一座山那样。。。。就需要把最前面的空格,依次递减。。但是就是不知道怎么继续做了。。。
    ho121
        4
    ho121  
       2015-09-10 22:19:04 +08:00 via Android
    为什么是%c
    CodeCaker
        5
    CodeCaker  
       2015-09-10 22:20:33 +08:00
    没具体看你的代码。你可以参考一下 printf ("%Ns", str );printf ("%-Ns", str );......这类格式。
    CRVV
        6
    CRVV  
       2015-09-10 22:23:52 +08:00   ❤️ 1
    zonyitoo
        7
    zonyitoo  
       2015-09-10 22:27:44 +08:00
    完全没懂你到底要实现什么
    sharpkingdom
        8
    sharpkingdom  
       2015-09-10 22:32:52 +08:00   ❤️ 1
    #include <stdio.h>
    int main (int argc, const char * argv[]) {

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


    你看上面代码的结果是不是你想要的。
    我是在线编译调试的, https://ganquan.info/g++-compiler/
    大家想编译的话可以使用上面的网址。
    Strikeactor
        9
    Strikeactor  
       2015-09-10 22:36:26 +08:00
    你要不试试从最后一排开始算,算出一排存一排,最后一起输出
    空格数累加,下层字符数减去上层字符数除二就是上层前面需要多加的空格
    sharpkingdom
        10
    sharpkingdom  
       2015-09-10 22:39:05 +08:00
    ```c
    #include <stdio.h>
    int main (int argc, const char * argv[]) {

    int count = 0;
    int i = 1;
    for (; i <= 9; i++) {
    int j = 1;
    int k = 0;
    for (;k<(9-i );k++){
    printf (" ");
    }
    for (; j <= i; j++) {
    printf ("%i%i*%i=%2i ",count,j,i,i*j );
    }
    printf ("\n");
    count++;
    }
    return 0;
    }
    ```

    上面这个版本貌似对齐了都。关键不在于什么空格依次递减,如何对齐我觉得是关键。
    kokutou
        11
    kokutou  
       2015-09-10 23:31:00 +08:00 via Android
    @CRVV 吊吊吊。。。真的是好无聊啊。。。。
    wezzard
        12
    wezzard  
       2015-09-10 23:34:44 +08:00
    想起一個笑話:「各位高手,我在網上找到一段 python 源代碼,格式已經丟失了,誰能幫我復原一下?」
    loveis0
        13
    loveis0  
    OP
       2015-09-10 23:40:10 +08:00
    @sharpkingdom 已感谢!!!就是要的是这样的效果。不过每个方程前面多了一个数字=。=我才看到,现在去研究下怎么实现的。。。谢谢高手!!!
    loveis0
        14
    loveis0  
    OP
       2015-09-10 23:43:01 +08:00
    @ho121 因为我是初学者不太懂,我以为空格这种符号要用%c ,因为%i 不是表示数字吗?
    @CodeCaker 你楼下的那位 @sharpkingdom 同志看懂了我的代码,你可以复制下他的看看,应该可以明白我的意思。。。
    @CRVV 我就是觉得有趣=。=谢谢
    @Strikeactor 作为一个初学者,你光这样说我也不太懂。。。。
    10iii
        15
    10iii  
       2015-09-10 23:45:53 +08:00   ❤️ 1
    int main (int argc, const char * argv[]) {

    int count = 0;
    for (int i = 1; i <= 9; i++) {
    for (int x = (9-count );x>0;x--) printf ("\t");
    for (int j = 1; j <= i; j++) {
    printf ("%i*%i=%i\t",j,i,i*j );
    }
    printf ("\n");
    count++;
    }
    return 0;
    }
    loveis0
        16
    loveis0  
    OP
       2015-09-10 23:45:55 +08:00
    @sharpkingdom 谢谢,为了我无聊的想法,您辛苦了。要是方便的话可以请您代码每行上加一些注释吗?当然如果不方便就不浪费时间了。只不过我是初学者,很想知道您每一步的具体思维是怎么想的。
    loveis0
        17
    loveis0  
    OP
       2015-09-10 23:52:33 +08:00
    @10iii 神了!!!就是这个!!完美!!!
    loveis0
        18
    loveis0  
    OP
       2015-09-10 23:55:16 +08:00
    @10iii 求注释每一步的思维方式可以吗 QAQ 。。。当然如果不方便请随意。。。
    10iii
        19
    10iii  
       2015-09-11 00:04:08 +08:00
    每行输出前面空上一些格子就好了,算算好空个字符就行了,我用了 tab 偷懒,结果是在有些环境中打印出来的结果可能不是金字塔形,取决于环境对于 tab 的定义是几个空格。
    loveis0
        20
    loveis0  
    OP
       2015-09-11 00:12:24 +08:00
    @10iii 恩好的我会好好研究下的。。。谢谢。。。
    Tedko
        21
    Tedko  
       2015-09-11 00:23:03 +08:00
    知道 ascii 麽= =。。 c 里面类型,如果你用 int 填%c 的话会当做 ascii 处理吧。。。
    http://www.jisuanke.com/course/2
    loveis0
        22
    loveis0  
    OP
       2015-09-11 00:25:42 +08:00
    @Tedko 嘿嘿,不太清楚。。。对电脑技术很感兴趣,可编程确实是才学没多久。。。
    Strikeactor
        23
    Strikeactor  
       2015-09-11 02:01:15 +08:00   ❤️ 1
    @loveis0 =_=逼我上图

    观察这样一个结构,你可以把它当成一个每层定长的矩形来看,每层由有颜色的部分和两边的空白组成
    由于尾部的空白不会影响前面的位置,不管它们,我们只需要让前面的空白把有颜色的部分挤到合适的位置(正中间)
    所以只需要一个循环,每次输出一条长度刚刚好的 空白+颜色
    第一次产生最底层,获得它的长度是 10 ,存起来,空白长度为 0 ,存起来
    第二次产生倒数第二层,获得它的长度是 8 , 10-8=2 ,因为首尾各有一个空白所以这一层的空白增量是 2 的一半 1 ,加上上层的空白长度 0 ,这一层的空白长度为 1
    第三次产生倒数第三层,获得它的长度是 6 , 8-6=2 ,因为首尾各有一个空白所以这一层的空白增量是 2 的一半 1 ,加上上层的空白长度 1 ,这一层的空白长度为 2
    。。。
    依次类推,空白数不断累加

    到最后把储存结果的变量 print 出来就是个金字塔了,空格会把字顶到合适的位置
    Tedko
        24
    Tedko  
       2015-09-11 03:28:35 +08:00
    @loveis0 https://en.wikipedia.org/wiki/ASCII
    看不懂英文百度百科也行
    gyao
        25
    gyao  
       2015-09-11 10:54:26 +08:00
    #include <stdio.h>

    int main (int argc, char *argv[]) {
    for (int i = 1; i <= 9; i++) {
    printf ("%.*s", 10 - i, "\t\t\t\t\t\t\t\t\t\t");
    for (int j = 1; j <= i; j++) {
    printf ("%d*%d=%d\t", j, i, i * j );
    }
    printf ("\n");
    }
    return 0;
    }
    loveis0
        26
    loveis0  
    OP
       2015-09-12 12:49:51 +08:00
    @Strikeactor 非常感谢前辈耐心打字并且告诉我实现的思路(ˉ﹃ ˉ),由于上课的原因抱歉拖到现在才来回复。辛苦前辈啦。♪٩(´ᵕ`๑)۶
    loveis0
        27
    loveis0  
    OP
       2015-09-12 12:52:02 +08:00
    @Tedko 虽然不是看不懂英文,可这样密密麻麻的英文还真是看不懂。。。。。=。=。。。


    @gyao 又一种思路 0.0 ,我去研究研究,谢谢前辈。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2608 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:10 · PVG 19:10 · LAX 03:10 · JFK 06:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.